2020-11-30

吃通js正则表达式

体验正则表达式的魅力:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // 获取字符串中所有的数值  let str = 'cyy2020cyy2xxx';  //不使用正则的情况  let nums = [...str].filter(item => !Number.isNaN(parseInt(item))).join('');  console.log(nums);  // 使用正则的情况  let num2 = str.match(/\d/g).join('');  console.log(num2); </script></body></html>

 

字面量创建正则表达式:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = 'cyy2020cyy2xxx';  console.log(/cyy/.test(str));  //不能直接使用变量  let word = 'cyy';  console.log(/word/.test(str));  //使用这种方式,使用变量  console.log(eval(`/${word}/`).test(str)); </script></body></html>

 

使用对象创建正则表达式:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <div>这里是cyy用来检测正则的测试文本~~~</div> <script>  // let str = 'cyy2020cyy2xxx';  // //第二个参数是模式  // let reg = new RegExp('cyy', 'g');  // console.log(reg.test(str));  // //使用变量  // let word = 'cyy';  // let reg2 = new RegExp(word, 'g');  // console.log(reg2.test(str));  //demo  let text = prompt('请输入要检测的文本,支持正则');  let reg = new RegExp(text, 'g');  let div = document.querySelector('div');  div.innerHTML = div.innerHTML.replace(reg, search => {   return `<span >${search}</span>`;  }); </script></body></html>

 

选择符的使用:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = 'cyy000';  // |代表选择符,符号左边的表达式或者右边的表达式是否满足  // 左边匹配的是cyy,而不是一个y  console.log(/cyy|x/.test(str));  let tel = '010-8888888';  console.log(/^(010|020)\-\d{7,8}$/.test(tel)); </script></body></html>

 

原子表与原子组中的选择符:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // 原子表  let str = '1122334455';  let reg = /[1234567]/;  console.log(str.match(reg));  //原子组  let str2 = '1122334455';  let reg2 = /(11|44)/g;  console.log(str2.match(reg2)); </script></body></html>

 

 

转义需要好好理解:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // .代表除换行符外的所有字符  // let price = 33.47;  // console.log(/\d+\.\d+/.test(price));  //对象创建的正则需要双重转义  // let price = 33.47;  // let reg = new RegExp('\d+\.\d+');  // console.log(reg);  // console.log(reg.test(price));  let price = 33.47;  let reg = new RegExp('\\d+\\.\\d+');  console.log(reg);  console.log(reg.test(price)); </script></body></html>

 

字符边界约束:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <input type="text" name='user'> <span style='color:red;'></span> <script>  document.querySelector('[name=user]').addEventListener('keyup', function () {   console.log(this.value);   let flag = this.value.match(/^[a-z]{3,5}$/);   document.querySelector('span').innerHTML = flag ? '成功' : '失败';  }); </script></body></html>

 

数值与空白元字符:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // let str = '20201111';  // console.log(str.match(/\d/));  // // 模式符g 全局匹配  // console.log(str.match(/\d/g));  //获取电话号码  // let tel = "'姓名: 'cyy', 电话: 010-1111111; 姓名: 'cyy2', 电话: 030-99999999";  // console.log(tel.match(/\d{3}-\d{7,8}/g));  //获取中文 [^]表示方括号里面的都不要  let tel = "'姓名: 'cyy', 电话: 010-1111111; 姓名: 'cyy2', 电话: 030-99999999";  console.log(tel.match(/[^':,-\da-z\s;]+/g));  //\d 数字 \D 非数字  // let tel = "'姓名: 'cyy', 电话: 010-1111111; 姓名: 'cyy2', 电话: 030-99999999";  // console.log(tel.match(/\D+/g));  // \s匹配空白,包括空格和换行符  // let str = ' 11\n';  // console.log(str.match(/\s/g));  // \S匹配非空白,包括空格和换行符  let str = ' 11\n';  console.log(str.match(/\S+/g)); </script></body></html>

 

w与W元字符:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // \w 字母数字下划线  // let str = 'cyy123_-@@';  // console.log(str.match(/\w+/));  // let email = '965794175@qq.com';  // console.log(email.match(/^\w+@\w+\.\w+$/));  // 5-10为字母数字下划线,并且是字母开头  let user = prompt('请输入用户名');  console.log(user.match(/^[a-z]\w{4,9}$/)); </script></body></html>

 

点元字符的使用:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // . 除空白符之外的所有字符  // let str = 'cswj+4!j@;;';  // console.log(str.match(/.+/)); //这里的+是贪婪模式  // .需要转义  // let str = 'https://www.baidu.com';  // console.log(str.match(/^https?:\/\/\w+\.\w+\.\w+$/));   // .需要转义  // let str = `  // www.baidu.com  // www.taobao.com  // `;  // console.log(str.match(/.+/));  // // s模式符:忽略换行符  // console.log(str.match(/.+/s));   let tel = '010 - 12345678';  console.log(tel.match(/\d{3} - \d{8}/));  console.log(tel.match(/\d{3}\s-\s\d{8}/)); </script></body></html>

 

如何精巧的匹配所有字符:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = `  <span>   cyy @@@   hahahah  </span>  `;  console.log(str.match(/[\w\W]+/));  console.log(str.match(/[\d\D]+/)); </script></body></html>

 

i与g模式修饰符:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = 'cyyCyy';  console.log(str.match(/c/i));  console.log(str.match(/c/g));  console.log(str.match(/c/gi));  console.log(str.replace(/c/gi, '@')); </script></body></html>

 

m多行匹配修正符实例:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = `  #1 js,200元 #  #2 html,104元 #  #3 css # cyy  `;  let lessons = str.match(/^\s*#\d+\s+.+\s+#$/gm).map(item => {   item = item.replace(/^\s*#\d+\s*/, '').replace(/\s+#/, '');   [name, price] = item.split(',');   return { name, price };  });  console.log(lessons); </script></body></html>

 

 

汉字与字符属性:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // u修饰符:正确处理四个字符的 UTF-16 编码  //每个字符都有属性,如L属性表示是字母,P 表示标点符号,需要结合 u 模式才有效。  //其他属性简写可以访问 https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt 网站查看。  // let str = 'cyy2020.永远最棒棒~';  // console.log(str.match(/\p{L}/gu));//字母  // console.log(str.match(/\p{N}/gu));//数字  // console.log(str.match(/\p{P}/gu));//标点符号  //找中文  //字符也有unicode文字系统属性 Script=文字系统,下面是使用 \p{sc=Han} 获取中文字符 han为中文系统  //其他语言请查看  // console.log(str.match(/\p{sc=Han}/gu));  let str = '𝒳𝒴';  console.log(str.match(/[𝒳𝒴]/));//单独匹配时乱码  console.log(str.match(/[𝒳𝒴]/u));//正确识别宽字节 </script></body></html>

 

lastIndex属性的作用:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = 'cyy is a girl';  // console.log(str.match(/\w/));  // console.log(str.match(/\w/g)); //没有组信息  //非全局模式下lastIndex不会向后走  // let reg = /\w/;  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  //全局模式下lastIndex会向后走  let reg = /\w/g;  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  while (res = reg.exec(str)) {   console.log(res);  } </script></body></html>

 

有效率的y模式:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // y粘连模式,必须连续  // let str = 'yycyyccc';  // let reg = /yy/g;  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // let reg = /yy/y;  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  let str = 'cyy的qq群是:1111111,2222222,3333333,cyy的年龄是:18';  let reg = /(\d+),?/y;  reg.lastIndex = 9;  // console.log(reg.exec(str));  // console.log(reg.exec(str));  // console.log(reg.exec(str));  let qq = [];  while (res = reg.exec(str)) {   qq.push(res[1]);  }  console.log(qq); </script></body></html>

 

原子表基本上使用:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // let str = '123456';  // console.log(str.match(/[246]/g));  // let str = '2020-11-28';  // let str2 = '2020/11/28';  // console.log(str.match(/^\d{4}[-\/]\d{2}[-\/]\d{2}$/g));  // console.log(str2.match(/^\d{4}[-\/]\d{2}[-\/]\d{2}$/g));  //分隔符必须一致  let str = '2020-11/28';  let str2 = '2020/11/28';  console.log(str.match(/^\d{4}([-\/])\d{2}\1\d{2}$/g));  console.log(str2.match(/^\d{4}([-\/])\d{2}\1\d{2}$/g)); </script></body></html>

 

区间匹配:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <input type="text" name='user'> <script>  // let str = '1234';  // console.log(str.match(/[0-9]+/g));  // let str = 'abcd1234';  // console.log(str.match(/[a-z]+/g));  let input = document.querySelector('[name=user]');  input.addEventListener('keyup', function () {   console.log(this.value.match(/[a-z]\w{3,5}/));  }) </script></body></html>

 

排除匹配:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // let str = '1234';  // console.log(str.match(/[12]/g));  // console.log(str.match(/[^12]/g));  let str = 'cyy是小仙女呀';  console.log(str.match(/[^\w]+/g));  console.log(str.match(/\p{sc=Han}+/gu)); </script></body></html>

 

原子表字符不解析:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = '(cyy.)';  // ()在这里代表原子组  // console.log(str.match(/()/g));  // ()在这里代表普通括号  // console.log(str.match(/[()]/g));  // .在这里表示除空白符外的所有字符  console.log(str.match(/.+/g));  // .在这里表示.符号本身  console.log(str.match(/[.+]/g)); </script></body></html>

 

使用原子表匹配所有内容:

 

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = `  cyy1  cyy2  `;  console.log(str.match(/.+/));//无法匹配换行符  console.log(str.match(/.+/s));//可以匹配换行符  console.log(str.match(/[\s\S]+/));  console.log(str.match(/[\d\D]+/));  console.log(str.match(/[\w\W]+/)); </script></body></html>

 

正则操作DOM:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <p>p</p> <h1>h1</h1> <h3>h3</h3> <script>  let reg = /<(h[1-6])>[\s\S]*<\/\1>/gi;  document.body.innerHTML = document.body.innerHTML.replace(reg, ''); </script></body></html>

 

认识原子组:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = `<h1>h1</h1>   <h2>h2</h2>`;  let reg = /<(h[1-6])>[\s\S]*<\/\1>/gi;  console.log(str.match(reg)); </script></body></html>

 

邮箱验证中原子组的使用:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <input type="email" name="email" value="965794175@qq.com.cn"> <script>  let reg = /[\w-]+@([\w-]+\.)+(com|cn|cc|net|org)/gi;  let email = document.querySelector('[name=email]').value;  console.log(email.match(reg)); </script></body></html>

 

原子组引用完成替换操作:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = `  <h1>h1</h1>  <div>div</div>  <h3>h3</h3>`;  //把h1-h6替换成p  let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi;  console.log(str.match(reg));  console.log(str.replace(reg, `<p>$2</p>`));  let res = str.replace(reg, (p0, p1, p2) => {   // console.log(p0, p1, p2);   return `<p>${p2}</p>`;  });  console.log(res); </script></body></html>

 

嵌套分组与不记录组:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = `  https://www.baidu.com  http://www.baidu.com  https://baidu.com  `;  //获取域名  // ? 表示可有可无  // 圆括号里 ?: 表示不记录组  let reg = /https?:\/\/((?:\w+\.)?\w+\.(?:com|cn|net|org|cc))/gi;  // console.log(reg.exec(str));  let urls = [];  while (res = reg.exec(str)) {   // console.log(res);   urls.push(res[1]);//0是原数组,1是第一个分组  }  console.log(urls); </script></body></html>

 

多种重复匹配基本使用:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // let str = 'cyy';  // + 1个或者多个,贪婪匹配  // console.log(str.match(/cy+/));  // let str = 'c';  // * 0个或者多个,贪婪匹配  // console.log(str.match(/cy*/));  // let str = 'cy';  // // ? 0个或者1个,贪婪匹配  // console.log(str.match(/cy?/));  let str = 'cyy';  // {} 表示范围,贪婪匹配  console.log(str.match(/cy{2,5}/)); </script></body></html>

 

重复匹配对原子组的影响与电话号正则:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // let str = 'cyyyyycycycy';  // console.log(str.match(/(cy)+/g));  let tel = '010-1234567';  console.log(tel.match(/^0\d{2,3}-\d{7,8}$/g)); </script></body></html>

 

网站用户名验证 :

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <input type="text" name='username'> <script>  document.querySelector('[name=username]').addEventListener('keyup', (e) => {   let value = e.target.value;   //用户名3-8位,字母数字下划线,字母开头   console.log(value.match(/^[a-z][\w-]{2,7}$/i));  }) </script></body></html>

 

批量使用正则完成密码验证:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <input type="text" name='pwd'> <script>  document.querySelector('[name=pwd]').addEventListener('keyup', (e) => {   let value = e.target.value;   //密码是数字或者字母5-10位,并且必须包含大写字母和数字   let regs = [    /^[a-z0-9]{5,10}$/i,    /[A-Z]/,    /\d/   ];   let res = regs.every(reg => reg.test(value));   console.log(res);  }); </script></body></html>

 

禁止贪婪:

 

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = 'cyyyyyy';  // console.log(str.match(/cy+/));//默认贪婪  // console.log(str.match(/cy+?/));//禁止贪婪  // console.log(str.match(/cy*/));//默认贪婪  // console.log(str.match(/cy*?/));//禁止贪婪  // console.log(str.match(/cy{2,6}/));//默认贪婪  // console.log(str.match(/cy{2,6}?/));//禁止贪婪  // console.log(str.match(/cy{2,}/));//默认贪婪  // console.log(str.match(/cy{2,}?/));//禁止贪婪  console.log(str.match(/cy?/));//默认贪婪  console.log(str.match(/cy??/));//禁止贪婪 </script></body></html>

 

标签替换的禁止贪婪使用:

 

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>  <span>cyy1</span>  <span>cyy2</span>  <span>cyy3</span> </main> <script>  //把span换成h4,标红,前缀加上小可爱-  const main = document.querySelector('main');  // ?禁止贪婪  let reg = /<span>([\s\S]+?)<\/span>/ig;  main.innerHTML = main.innerHTML.replace(reg, (res, h1) => {   return `<h4 style="color:red;">小可爱-${h1}</h4>`;  }); </script></body></html>

 

 

使用matchAll完成全局匹配:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <h1>cyy1</h1> <h2>cyy2</h2> <h3>cyy3</h3> <script>  let reg = /<(h[1-6])>([\s\S]+?)<\/\1>/ig;  console.log(document.body.innerHTML.match(reg));  console.log(document.body.innerHTML.matchAll(reg));  let res = document.body.innerHTML.matchAll(reg);  let arr = [];  for (const iterator of res) {   console.dir(iterator);   arr.push(iterator[2]);  }  console.table(arr); </script></body></html>

 

 

 

为低端浏览器定义原型方法matchAll

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <h1>cyy1</h1> <h2>cyy2</h2> <h3>cyy3</h3> <script>  String.prototype.matchAll = function (reg) {   let res = this.match(reg);   // console.log(res);   if (res) {    let str = this.replace(res[0], '^'.repeat(res[0].length));    let match = str.matchAll(reg) || [];    return [res, ...match];   }  }  let body = document.body.innerHTML;  let res = body.matchAll(/<(h[1-6])>([\s\S]+?)<\/\1>/ig);  console.log(res); </script></body></html>

 

使用exec完成全局匹配:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <h1>cyy1</h1> <h2>cyy2</h2> <h3>cyy3</h3> <script>  // let str = 'cyyccyy';  // let reg = /y/gi;//必须加上g修饰符,lastIndex才会发生改变  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // console.log(reg.exec(str));  // console.log(reg.lastIndex);  // let arr = [];  // while (res = reg.exec(str)) {  //  arr.push(res);  // }  // console.log(arr);  let arr = [];  function search(str, reg) {   while (res = reg.exec(str)) {    arr.push(res);   }   return arr;  }  search(document.body.innerHTML, /<(h[1-6])>[\s\S]+?<\/\1>/gi);  console.log(arr); </script></body></html>

 

字符串正则方法search与match

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // search 字符串的搜索  // let str = 'yyccyy';  // console.log(str.search('c'));  // console.log(str.search(/c/g));  // match 字符串的匹配  // let str = 'yyccyy';  // console.log(str.match('c'));  // console.log(str.match(/c/g));  let str = `  https://www.baidu.com  http://www.taobao.com.cn  https://google.cn  `;  let reg = /https?:\/\/(\w+\.)?(\w+\.)+(com|cn|net|org|cc)/gi;  console.log(str.match(reg)); </script></body></html>

 

字符串正则方法matchAll与split

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // search 字符串的搜索  // let str = 'yyccyy';  // console.log(str.search('c'));  // console.log(str.search(/c/g));  // match 字符串的匹配  // let str = 'yyccyy';  // console.log(str.match('c'));  // console.log(str.match(/c/g));  // let str = `  // https://www.baidu.com  //  // https://google.cn  // `;  // let reg = /https?:\/\/(\w+\.)?(\w+\.)+(com|cn|net|org|cc)/gi;  // console.log(str.match(reg));  // let reg = /https?:\/\/(?:\w+\.)?(?:\w+\.)+(?:com|cn|net|org|cc)/gi;  // let res = str.matchAll(reg);  // for (const iterator of res) {  //  console.log(iterator);  // }  let str = '2020-11-30';  let str2 = '2020/11/30';  console.log(str.split(/[-\/]/));  console.log(str2.split(/[-\/]/)); </script></body></html>

 

$符在正则替换中的使用:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // let str = '2020/11/30';  // console.log(str.replace(/[\/]/, '-'));  // console.log(str.replace(/[\/]/g, '-'));  // let str = '(010)99999999 (020)8888888';  // let reg = /\((\d{3,4})\)(\d{7,8})/g;  // console.log(str.match(reg));  // console.log(str.replace(reg, "$1-$2"));  let str = '=cyy=';  // $& 匹配到的内容 $` 匹配内容的左边 $' 匹配内容的右边  console.log(str.replace(/cyy/, "$`可爱$&可爱$'")); </script></body></html>

 

 

$&使用

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>cyy喜欢吃炒年糕,cyy也喜欢吃汤年糕</main> <script>  const main = document.querySelector('main');  main.innerHTML = main.innerHTML.replace(/年糕/g, "<a href='http://www.baidu.com'>$&</a>") </script></body></html>

 

 

原子组在替换中的使用技巧:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>  <a href="http://www.baidu.com" style='color:pink'>baidu</a>  <a id='link' href="http://baidu.com">baidu</a>  <a href="http://google.com">baidu</a>  <h4>http://www.baidu.com</h4> </main> <script>  const main = document.querySelector('main');  let reg = /(<a.*href=['"])(http)(:\/\/)(www\.)?(baidu)/gi;  main.innerHTML = main.innerHTML.replace(reg, (v, ...args) => {   console.log(args);   args[1] += 's';   args[3] = args[3] || 'www.';   return args.splice(0, 5).join('');  }); </script></body></html>

 

原子组别名:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let str = `  <h1>h1</h1>  <span>span</span>  <h4>h4</h4>  `;  // let reg = /<(h[1-6])>(.*?)<\/\1>/gi;  // console.log(str.replace(reg, "<div>$2</div>"));  //起别名  let reg = /<(h[1-6])>(?<con>.*?)<\/\1>/gi;  console.log(str.replace(reg, "<div>$<con></div>")); </script></body></html>

 

使用原子组别名优化正则:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>  <a href="https://www.baidu.com">baidu</a>  <a href="https://www.taobao.com">taobao</a>  <a href="https://www.google.com">google</a> </main> <script>  // [{link:,title:}]  const main = document.querySelector('main');  // let reg = /<a.*?href=(['"])(?<link>.*?)\1>(?<title>.*?)<\/a>/i;  // console.log(main.innerHTML.match(reg));  let reg = /<a.*?href=(['"])(?<link>.*?)\1>(?<title>.*?)<\/a>/gi;  let arr = [];  for (const iterator of main.innerHTML.matchAll(reg)) {   console.log(iterator['groups']);   arr.push(iterator['groups']);  }  console.table(arr); </script></body></html>

 

 

正则方法test

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <input type="text" name='email'> <script>  const mail = document.querySelector('[name=email]');  mail.addEventListener('keyup', (e) => {   let value = e.target.value;   let res = /^[\w-]+@[\w+\.]+(com|cn|org|cc)$/i.test(value);   console.log(res);  }) </script></body></html>

 

正则方法exec

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>  cyy非常可爱,cyy到底有多可爱?baidu.com </main> <script>  const mail = document.querySelector('main').innerHTML;  let reg = /cyy/gi;  // console.log(mail.match(reg));  // console.log(reg.exec(mail));  // console.log(reg.lastIndex);  // console.log(reg.exec(mail));  // console.log(reg.lastIndex);  // console.log(reg.exec(mail));  // console.log(reg.lastIndex);  let count = 0;  while (res = reg.exec(mail)) {   count++;  }  console.log(count); </script></body></html>

 

?=  断言匹配:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>  cyy非常可爱,cyy可爱就可爱在…… </main> <script>  const main = document.querySelector('main');  let reg = /cyy(?=可爱)/gi;  main.innerHTML = main.innerHTML.replace(reg, '<a href="https://www.baidu.com">$&</a>'); </script></body></html>

 

 

使用断言规范价格:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // 给所有金钱补上 .00 格式  let lessons = `  js,200元,300次  html,300.00元,105次  css,140元,260次  `;  let reg = /(\d+)(\.00)?(?=元)/gi;  let res = lessons.replace(reg, (v, ...args) => {   console.log(args);   args[1] = args[1] || '.00';   return args.splice(0, 2).join('');  });  console.table(res); </script></body></html>

 

?<= 断言匹配

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>  <a href="https://www.baidu.com">baidu</a>  <a href="https://www.google.com">google</a> </main> <script>  // let str = 'cyy123ccc098';  // let reg = /(?<=cyy)\d+/gi;  // console.log(str.match(reg));  const main = document.querySelector('main');  const reg = /(?<=href=(["'])).+(?=\1)/gi;  // console.log(main.innerHTML.match(reg));  main.innerHTML = main.innerHTML.replace(reg, 'http://www.taobao.com'); </script></body></html>

 

使用断言模糊电话号:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  let users = `  cyy1电话:12345678911  cyy2电话:99999678911  `;  let reg = /(?<=\d{7})\d{4}/gi;  users = users.replace(reg, '*'.repeat(4));  console.log(users); </script></body></html>

 

 

?!断言匹配:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // ?= 后面是什么  // ?! 后面不是什么  let str = 'cyy2020ccc';  let reg = /[a-z]+(?!\d)/gi; // 错误  let reg = /[a-z]+(?!\d)$/gi; // 正确  console.log(str.match(reg)); </script></body></html>

 

断言限制用户名关键词:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <input type="text" name='user'> <script>  //要求注册名中不能包含cyy  let input = document.querySelector('[name=user]');  input.addEventListener('keyup', function () {   // let reg = /^(?!.*cyy.*).*/gi;   let reg = /^(?!.*cyy.*)[a-z]{5,6}$/gi;   console.log(this.value.match(reg));  }) </script></body></html>

 

?<!断言匹配:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <script>  // ?<! 限制前面不是什么  let str = 'cyy999ccc';  let reg = /^(?<!\d+)[a-z]+/gi;  console.log(str.match(reg)); </script></body></html>

 

使用断言排除法统一数据:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <main>  <a href="https://www.baidu.com/1.jpg">1.jpg</a>  <a href="https://oss.baidu.com/2.jpg">2.jpg</a>  <a href="https://cdn.baidu.com/3.jpg">3.jpg</a>  <a href="https://baidu.com/4.jpg">4.jpg</a> </main> <script>  // ?<! 限制前面不是什么  const main = document.querySelector('main');  //过滤oss  let reg = /https:\/\/([a-z]+)?(?<!oss)\..+?(?=\/)/gi;  main.innerHTML = main.innerHTML.replace(reg, (v) => {   return 'https://oss.baidu.com';  }); </script></body></html>

 









原文转载:http://www.shaoqun.com/a/494416.html

环球华网:https://www.ikjzd.com/w/1063

wish:https://www.ikjzd.com/w/105

square:https://www.ikjzd.com/w/2106


体验正则表达式的魅力:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"
立刻网:立刻网
tineye:tineye
【泰国旅游安全吗】--泰国旅游安全情况:【泰国旅游安全吗】--泰国旅游安全情况
2018年末,亚马逊,ebay,wish,速卖通你应该选择谁(2):2018年末,亚马逊,ebay,wish,速卖通你应该选择谁(2)
日本北海道的最佳旅游时间是什么时候?:日本北海道的最佳旅游时间是什么时候?

JS实现鼠标移入DIV随机变换颜色

今天分享一个在 JavaScript中,实现一个鼠标移入可以随机变换颜色,本质就是js的随机数运用。

代码如下:

<!DOCTYPE html><html>	<head>		<meta charset="utf-8">		<title></title>		<style>			/* 这里定义一下div(块元素)已下span 标签的宽.高.边框线以及边框线的颜色*/			span{				display: block;				width: 80px;				height: 80px;				border: 1px solid #000000;				float: left;			}		</style>	</head>	<body>		<div>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>			<span></span><span></span><span></span><span></span><span></span><span></span>		</div>		<script type="text/javascript">			var a=document.getElementsByTagName("span");			/* 获取一下span标签 */				for(var i=0;i<=a.length;i++){					a[i].onmouseover=function(){						/* 循环出每一个方块,加入鼠标移入 */						this.style.backgroundColor="#"+Math.floor(Math.random()*16777215).toString(16);						/* 颜色随机颜色 */					}				}		</script>	</body></html>

  

效果如下:

 









原文转载:http://www.shaoqun.com/a/494410.html

法瑞儿:https://www.ikjzd.com/w/412

折扣网站:https://www.ikjzd.com/w/74

agora:https://www.ikjzd.com/w/2176


今天分享一个在JavaScript中,实现一个鼠标移入可以随机变换颜色,本质就是js的随机数运用。代码如下:<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> <style> /*这里定义一下div(块元素
深兰科技:深兰科技
primc:primc
2020四川光雾山红叶节将于10月20日开幕 :2020四川光雾山红叶节将于10月20日开幕
清远玄真漂流惊险刺激吗?:清远玄真漂流惊险刺激吗?
去泰国旅游注意事项有哪些?:去泰国旅游注意事项有哪些?

MyBatis学习04

7、使用注解开发

 

面向接口编程

  • 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好

  • 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。

  • 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

 

关于接口的理解

  • 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。

  • 接口的本身反映了系统设计人员对系统的抽象理解。

  • 接口应有两类:

    • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);

    • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);

  • 一个个体有可能有多个抽象面。抽象体与抽象面是有区别的。

 

三个面向区别

  • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 .

  • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 .

  • 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构

     

利用注解开发

  • mybatis最初配置信息是基于

  • sql 类型主要分成 :

    • @select ()

    • @update ()

    • @Insert ()

    • @delete ()

注意:利用注解开发就不需要mapper.

 

1、在接口中添加注解

//查询全部用户
@Select("select id,name,pwd password from user")
public List<User> getAllUser();

2、在mybatis的核心配置文件中注入

<!--使用class绑定接口-->
<mappers>
  <mapper class="com.chen.mapper.UserMapper"/>
</mappers>

3、测试

@Test
public void GetAllUser() {
  SqlSession session = MybatisUtils.getSession();
  //本质上利用了jvm的动态代理机制
  UserMapper mapper = session.getMapper(UserMapper.class);

  List<User> users = mapper.getAllUser();
  for (User user : users){
      System.out.println(user);
}

  session.close();
}

 

注解增删改

改造MybatisUtils工具类的getSession( ) 方法,重载实现。

  //获取SqlSession连接
 public static SqlSession getSession(){
     return getSession(true); //事务自动提交
}

 public static SqlSession getSession(boolean flag){
     return sqlSessionFactory.openSession(flag);
}

【注意】确保实体类和数据库字段对应

 

查询:

1、编写接口方法注解

//根据id查询用户
@Select("select * from user where id = #{id}")
User selectUserById(@Param("id") int id);

2、测试

@Test
public void SelectUserById() {
  SqlSession session = MybatisUtils.getSession();
  UserMapper mapper = session.getMapper(UserMapper.class);

  User user = mapper.selectUserById(1);
  System.out.println(user);

  session.close();
}

 

新增:

1、编写接口方法注解

//添加一个用户
@Insert("insert into user (id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(User user);

2、测试

@Test
public void AddUser() {
  SqlSession session = MybatisUtils.getSession();
  UserMapper mapper = session.getMapper(UserMapper.class);

  User user = new User(6, "小明", "123456");
  mapper.addUser(user);

  session.close();
}

修改:

1、编写接口方法注解

//修改一个用户
@Update("update user set name=#{name},pwd=#{pwd} where id = #{id}")
int updateUser(User user);

2、测试

@Test
public void UpdateUser() {
  SqlSession session = MybatisUtils.getSession();
  UserMapper mapper = session.getMapper(UserMapper.class);

  User user = new User(6, "小明", "654321");
  mapper.updateUser(user);

  session.close();
}

删除:

1、编写接口方法注解

//根据id删除用
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id")int id);

2、测试

@Test
public void DeleteUser() {
  SqlSession session = MybatisUtils.getSession();
  UserMapper mapper = session.getMapper(UserMapper.class);

  mapper.deleteUser(6);
 
  session.close();
}

【注意点:增删改一定记得对事务的处理】

 

关于@Param

@Param注解用于给方法参数起一个名字。以下是总结的使用原则:

  • 在方法只接受一个参数的情况下,可以不使用@Param。

  • 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。

  • 如果参数是 JavaBean , 则不能使用@Param。

  • 不使用@Param注解时,参数只能有一个,并且是Javabean。

     

#与$的区别

  • #{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符【推荐使用】

    INSERT INTO user (name) VALUES (#{name});
    INSERT INTO user (name) VALUES (?);
  • ${} 的作用是直接进行字符串替换

    INSERT INTO user (name) VALUES ('${name}');
    INSERT INTO user (name) VALUES ('kuangshen');

使用注解和配置文件协同开发,才是MyBatis的最佳实践

 

 

 

 

 









原文转载:http://www.shaoqun.com/a/494408.html

黄远:https://www.ikjzd.com/w/1785

c88:https://www.ikjzd.com/w/1017

google correlate:https://www.ikjzd.com/w/1887


7、使用注解开发面向接口编程根本原因:解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想
急速:急速
f2c:f2c
跨境电商快速发展,国际物流迎来机遇!:跨境电商快速发展,国际物流迎来机遇!
柬埔寨游记柬埔寨旅游攻略 - :柬埔寨游记柬埔寨旅游攻略 -
什么时候去香港旅游是淡季?:什么时候去香港旅游是淡季?

热刺新人罗顿英超第一次首发出彩 切尔西名将:没什么能够吓到他_比赛

原标题:热刺新人罗顿英超第一次首发出彩 切尔西名将:没什么能够吓到他

英国媒体Hitc报道,切尔西名宿,昔日英超神射手哈塞尔巴因克对热刺新人中卫罗顿提出了表扬。第一次在英超首发的罗顿,在对阵切尔西的比赛中交出了合格的答卷。哈塞尔巴因克说,"罗顿表现令人印象深刻,没有什么能够吓到他。"

Hitc报道报道截屏

由于托比在对阵曼城比赛中受伤,穆里尼奥在这场比赛中被迫要对中卫人选进行更换。最终,穆里尼奥选择了新人罗顿,而没有选择桑切斯。热刺跟队记者给出的理由是:"罗顿在对阵曼城时替补出场,10几分钟的时间,并没有让热刺防线质量下降,而且在这一周的训练表现让教练组很是肯定。"罗顿在对阵切尔西上阵前,只在英超踢了12分钟的比赛,虽然是威尔士代表队成员,但他此前参加的最高级别联赛是英冠联赛。

本场比赛,罗顿搭档戴尔作为热刺首发中卫组合,全场比赛罗顿传球准确率是83.3%,58次触球,解围4次,拦截2次以及1次封堵。虽然比赛中一头一尾出现了两次失误,但是瑕不掩瑜,罗顿的整体表现依然是得到了穆里尼奥的肯定。穆里尼奥在赛后接受采访时说:"罗顿在持球时只犯了一个错误,可戴尔犯了好多错。他有两次失误,但我会和他详细地分析比赛,他是一个非常聪明的家伙,渴望学习渴望进步。"

罗顿的表现也征服了对手的拥趸,切尔西名宿、昔日英超神射手哈塞尔巴因克就表扬他说:"他看起来就像是一个非常靠谱的热刺中后卫人选,没有什么能够下吓到他,必要的时候,他就会出现在需要的位置上。"哈塞尔巴因克认为,罗顿的表现让他印象非常深刻。

目前,热刺的7场魔鬼赛程打完了两场,击败了曼城战平了切尔西,积分榜上依然把持着榜首的位置。下周末,热刺将在联赛中迎来北伦敦德比,主场迎战阿森纳,如无意外,罗顿依然是会出现在首发中后卫的位置上。而花了热刺4200万引进的桑切斯,几个赛季之后依然是毛躁且常犯错,只能暂时先在欧联杯找出场机会了。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/373634.html

敦煌网:https://www.ikjzd.com/w/189

ask me:https://www.ikjzd.com/w/2459

敦煌网站:https://www.ikjzd.com/w/189


原标题:热刺新人罗顿英超第一次首发出彩切尔西名将:没什么能够吓到他英国媒体Hitc报道,切尔西名宿,昔日英超神射手哈塞尔巴因克对热刺新人中卫罗顿提出了表扬。第一次在英超首发的罗顿,在对阵切尔西的比赛中交出了合格的答卷。哈塞尔巴因克说,"罗顿表现令人印象深刻,没有什么能够吓到他。"Hitc报道报道截屏由于托比在对阵曼城比赛中受伤,穆里尼奥在这场比赛中被迫要对中卫人选进行更换。最终,穆里尼奥选择了新人
卖家网:卖家网
ensogo:ensogo
跨境卖家必懂的跨境电商物流相关小知识:跨境卖家必懂的跨境电商物流相关小知识
桂林"闹"新春 各大景区景点活动丰富:桂林"闹"新春 各大景区景点活动丰富
厦门6月份天气预报,2019厦门六月份穿什么:厦门6月份天气预报,2019厦门六月份穿什么

重磅!该机场拆板人员大面积感染新冠!CA货班或将全部取消!12月恐有大延误...

重磅!该机场拆板人员大面积感染新冠!CA货班或将全部取消!12月恐有大延误...

海派一波,空派一波

铁路一波,现在连卡车也…

什么时候才能物流通常呀

据了解,由于美国疫情再次爆发,美国洛杉矶机场LAX当地拆板人员大面积感染新冠疫情

有消息称:中国国际航空公司 CA 预取消2月初10架次航班,恢复时间目前待定。

预计MU(中国东方航空公司)会跟进。


朋友圈截图

美国三大空运货物港LAX、ORD、JFK:LAX已经瘫痪倒下,ORD堵塞但还是可以操作,现在JFK还能有余地,当然这些都是基于BUP服务正常的情况。

但目前从各方渠道了解来看,当前的情况非常糟糕。

货站人力严重不足,美西机场和港口货物堆积严重,瘫痪已有一段时间,有航司已堆积达1000多个PMC没有足够的人力操作,最多积压甚至超过20多天,转运更是停接。

根据目前情况来看,形势比较严重,CA LAX所有货物已经停止操作,已进仓货物做好退仓准备,已出港货物做好退运准备。

除此之外,还有以下三点值得注意:

1、CZ MU所有货物等代理/航司告知航班正常计划再进行操作;

2、所有 LAX ME包机货物不确认运价不允许送仓,尺寸有重大出入货物直接拉下退回货主;

3、外航,例 OZ KE CI等航司的美线货物,请再三确认航班以及运价后方可操作;

朋友圈截图

从目前各渠道所了解,情况非常不容乐观,货站人力严重不足,美西机场和港口货物堆积严重,瘫痪已有一段时间,有些卖家的紧急货物更是被迫选择飞到美东再转卡车寄送。

不少货代表示:"12月份运费肯定会涨,海运和空运的时效将会更加不确定,舱位也会更加紧张,非常无奈..."

对此,也有货代吐槽道:"空运的飞机是飞过去了,但是货卸不来;海运的船是开过去了,但是没车架,加上提柜派送当地宵禁等一系列操作下来,最终导致国内缺箱了。"

值得大家注意的是,年终旺季的货运量正在暴涨,航空面临停航,而海运码头同样也面临劳动力不足塞港的问题,国外卡车也难以预约,12月份海派也可能会顶不住压力,出现大面积延误和爆舱的情况。

随着疫情全球蔓延,破坏了全球物流,不少国家对中国的依赖越来越大强烈。

中国在全球出口中所占的份额目前正在逐渐上升,现在甚至超过了中美贸易战于2018年爆发之前的水平。

不少人认为,最近达成的区域全面经济合作伙伴关系是亚洲15个国家和地区之间的自由贸易协议,大洋洲将进一步提高中国在全球贸易中的地位。

中国在出口市场上占有较高份额的产品数量正在逐渐的大量增加。

根据国际贸易中心提供的3800种产品的数据中显示,发现了2019年的320种产品在中国的出口市场中所占份额超过50%。

自2016年起,美国总统唐纳德·特朗普(Donald Trump)上台,然后贸易战开始,中国占有较高份额的产品数量就停止增长,但去年数量再次增加。


2019年,中国制造的小型计算机的出口占整个出口市场的66%,价值956亿美元。



由于冠状病毒和全球范围内的定单,对这些产品的需求激增,大流行因此刺激了中国出口的增长。当计算中国在主要经济体中的出口份额时,这一趋势就很明显。

2月份,中国的出口占经济合作与发展组织成员国加中国出口总值的14%。人数稳步增长;3月为17%,4月为24%,因为北京遏制了大流行,而其他国家则在挣扎。

自4月以来,这一比率继续超过20%,超过了2015年创下的历史年度峰值19%。

欧洲和美国在2020年间的消费反弹也成为了中国商品背后的顺风,最新统计数据表明,中美贸易战开始之前,该国的出口已经超过了水平。


明天就是12月1号了,无论如何,货代、外贸们稳住呀~

 
来源:小马看跨境电商

文章来源:https://www.ikjzd.com/home/135324

启明星软件:https://www.ikjzd.com/w/1436

tradeindia:https://www.ikjzd.com/w/2305

首信易:https://www.ikjzd.com/w/1841

海维:https://www.ikjzd.com/w/1891

costco:https://www.ikjzd.com/w/1680

重磅!该机场拆板人员大面积感染新冠!CA货班或将全部取消!12月恐有大延误...

想自己的名字见于各大主流媒体吗?想主编带队旅行住五星级酒店吃海鲜自助公司报销吗?想上班一改死气沉沉氛围欢声笑语嬉笑怒骂皆成文章吗?想升职加薪当上总经理出任CEO迎娶白富美走向人生巅峰吗?……那就来雨果网吧。我们现在需要采编、广告销售和客服三类人员。作为一

AgileConfig-轻量级配置中心 1.1.0 发布,支持应用间配置继承

AgileConfig轻量级配置中心自第一个版本发布不知不觉已经半年了。在并未进行什么推广的情况下收到了250个star,对我有很大的鼓舞,并且也有不少同学试用,并且给出了宝贵的意见,非常感谢他们。其中有一些意见非常好,但是一直没有开发。主要是一来下半年比较忙(懒),二来我不想把AgileConfig搞的过于复杂。但其中有个需求被很多同学提及过,就是希望能支持应用间的继承(关联),类似Apollo的公共namespace的概念。比如微服务应用之间有不少公共配置项,可以配置在一个应用内,然后其他应用继承它,这样每个应用就不用重复的配置公共配置。我思考了一下,这个配置确实是个非常有用的功能,于是花了点时间实现了它。
Github地址:https://github.com/kklldog/AgileConfig 求star 。
下面的示例简单演示下如何使用AgileConfig读取配置并且使用继承功能

使用docker启动一个AgileConfig实例

sudo docker run --name agile_config -e adminConsole=true -e db:provider=sqlserver -e db:conn="Persist Security Info = False; User ID =dev; Password =dev@123,; Initial Catalog =agile_config_test; Server =." -p 5000:5000 kklldog/agile_config:latest

使用docker命令运行一个AgileConfig实例,这是最简单的方法。当然你也可以拉源码下来编译发布使用IIS来运行它。
配置环境变量:
adminConsole=true 开启控制台功能
db:provider=sqlserver 数据库为SqlServer
db:conn="Persist Security Info = False; User ID =dev; Password =dev@123,; Initial Catalog =agile_config_test; Server =." 配置数据库连接
-p 5000:5000 容器的5000口映射本地的5000口

配置AgileConfig

第一次运行需要配置管理密码

密码配置完成后重新登录进系统,开始配置节点
D66God.png
在设计的时候节点跟控制台是分开的,但是为了部署简单最后节点跟控制台被实现在一起了。所以采用单节点部署的时候,该实例既是节点又是控制台,所以也需要把本节点的地址加入到节点列表里,以便控制台能管理到。

添加应用

AgileConfig的初始化完成了,现在我们开始添加应用。
添加"公共应用"
D66oTJ.png
添加应用名称,应用id,勾选"可被继承"。点击确定完成公共的创建。系统只支持一层的继承,可被继承的应用不能再继承其它应用。
创建完成后为公共应用添加配置项
D66jOO.png
为公共应用添加一个配置项:键为public_key_01 值为0001 。

添加"私有应用"
D6cKts.png
添加一个私有应用,不要选"可被继承"。点击继承应用栏的加号会弹出可以被的继承应用列表,选择"公共应用"。点击"确定"完成创建。

为私有应用创建配置项
D6c091.png
为私有应用添加一个配置项:键为private_key_01 值为0002 。

注意:把所有的配置都上线,否则客户端读不到配置。

客户端读取配置

创建Asp.net Core WebApi项目

我们创建一个WebApi项目做为客户端来演示如何读取配置
D6giE4.png

使用nuget引用AgileConfig.Client

Install-Package AgileConfig.Client -Version 1.1.0

集成AgileConfig.Client

使用nuget安装成功后,切换到Program.cs开始集成AgileConfigClient。

 public static IHostBuilder CreateHostBuilder(string[] args) =>   Host.CreateDefaultBuilder(args)   .ConfigureAppConfiguration((ctx,cfg)=> {    var appId = "private_01";    var secret = "1";    var nodes = "http://localhost:5000";    //new一个client实例    var configClient = new ConfigClient(appId, secret, nodes);    //使用AddAgileConfig配置一个新的IConfigurationSource    cfg.AddAgileConfig(configClient);   })    .ConfigureWebHostDefaults(webBuilder =>    {     webBuilder.UseStartup<Startup>();    });

使用IHostBuilder的ConfigureAppConfiguration把我们的ConfigClient注入进去。这里我们的ConfigClient配置的是私有应用的id:private_01 。

读取配置

前期工作都完成了,现在我们可以开始编写读取配置的代码了。
新建一个ReadConfigController:

 [ApiController] [Route("[controller]")] public class ReadConfigController : ControllerBase {  private readonly IConfiguration _IConfiguration;  public ReadConfigController(IConfiguration configuration)  {   _IConfiguration = configuration;  }  [HttpGet]  public String Get()  {   var publicConfig = _IConfiguration["public_key_01"];   var privateConfig = _IConfiguration["private_key_01"];   return $"publicConfig:{publicConfig} , privateConfig:{privateConfig}";  } }

通过构造函数注入IConfiguration,然后通过它直接读取公共配置,私有配置,并且直接把字符串返回回去。

注意修改一下客户端程序的启动端口,默认5000跟上面的AgileConfig实例占用的端口冲突。

运行一下

运行客户端项目,然后在浏览器里输 src="https://s3.ax1x.com/2020/11/29/D6WrPH.png" alt="D6WrPH.png" loading="lazy">
可以看到我们的公共配置跟私有配置都准确的读取到了。

总结

通过以上一个简单的示例,演示了如何使用AgileConfig读取配置以及如何在应用间继承配置。以上示例并未展示所有内容,使用继承的时候需要注意一下几点:

  1. 当私有应用的配置跟被继承应用重复时,私有应用的配置会覆盖被继承应用的配置
  2. 如果一个应用被标记为"可被继承"后,这个应用自己不能继续继承其它应用
  3. 一个私有应用可以继承多个"可被继承"的应用,如果多个继承的应用间出现重复的配置,那么将按照继承的顺序,后面的应用会覆盖前面的应用。

如果喜欢这个项目的,请给我star吧。谢谢。
Github地址:https://github.com/kklldog/AgileConfig

关注我的公众号一起玩转技术









原文转载:http://www.shaoqun.com/a/494359.html

noon:https://www.ikjzd.com/w/259

亚马逊礼品卡:https://www.ikjzd.com/w/1090.html

韩蓬:https://www.ikjzd.com/w/1635


AgileConfig轻量级配置中心自第一个版本发布不知不觉已经半年了。在并未进行什么推广的情况下收到了250个star,对我有很大的鼓舞,并且也有不少同学试用,并且给出了宝贵的意见,非常感谢他们。其中有一些意见非常好,但是一直没有开发。主要是一来下半年比较忙(懒),二来我不想把AgileConfig搞的过于复杂。但其中有个需求被很多同学提及过,就是希望能支持应用间的继承(关联),类似Apollo
oklink:oklink
net-a-porter:net-a-porter
稻城亚丁丹巴新都桥7日游参考行程 :稻城亚丁丹巴新都桥7日游参考行程
常见的亚马逊listing被封问题以及解决办法解析!:常见的亚马逊listing被封问题以及解决办法解析!
中国道教四大名山,寻仙问道_道教四大名山在哪 :中国道教四大名山,寻仙问道_道教四大名山在哪

记录idea自定义快捷键习惯

ALT + /

idea 改成

eclipse 快捷键设置后需要设置一下操作
在这里插入图片描述
settings ->kemymap 搜索completion,修改basic 快捷键为alt+/ ;cyclic expand word 去掉快捷键,怎么设置右键add 或者remove

在这里插入图片描述

全局替换

搜索 replace in path 修改为ctrl +shift+L

在这里插入图片描述

格式化代码

原来的格式化代码快捷键应该是Ctrl+alt+L
同样搜索Reformat code 修改为ctrl+shidt+f在这里插入图片描述









原文转载:http://www.shaoqun.com/a/494352.html

usps国际快递查询:https://www.ikjzd.com/w/513

rfq:https://www.ikjzd.com/w/251

联动优势:https://www.ikjzd.com/w/1921


ALT+/idea改成eclipse快捷键设置后需要设置一下操作settings->kemymap搜索completion,修改basic快捷键为alt+/;cyclicexpandword去掉快捷键,怎么设置右键add或者remove全局替换搜索replaceinpath修改为ctrl+shift+L格式化代码原来的格式化代码快捷键应该是Ctrl+alt+L同样搜索Reformatcode
卖家精灵:卖家精灵
retriever:retriever
广州正佳极地海洋世界停车方便吗?正佳广场海洋馆停车收费吗?:广州正佳极地海洋世界停车方便吗?正佳广场海洋馆停车收费吗?
深圳东部华侨城黑森林酒店怎么样?:深圳东部华侨城黑森林酒店怎么样?
清远三八节女士免费景点?三八节清远去哪里玩免费?:清远三八节女士免费景点?三八节清远去哪里玩免费?

现代简约别墅装修设计,为你带来悠闲舒适的生活

理想中的生活大概就是

在人不多的城市

或是乡间山林

住一独栋小屋

过着清闲的日子

别墅装修设计为你

打造一个"简单"的家

逃离繁忙的日常

如山间清流

充满着宁静的优雅气韵

玄关似狭长的栈道

壁龛的设计实用之余也独具设计感

墙面的挂画增加了空间的变化

走进家门的瞬间就充满趣味

暖灰色与冷灰色的搭配使用

家具与装饰物合理精致的组合

凸显安静优雅的气质

清晨满屋的光影

夜晚摇曳的星光

尤为温馨安稳

让食物变得浪漫的

除了他本身还有就餐的环境

使用纯净的色调进行搭配

无论是家具的造型还是空间的布局

都给人耳目一新的惊喜

独具现代的质感与气息

犹如蓝天白云的用色

让空间更为清爽干净

白色与浅灰色为主的主卧

发散着温暖的光晕

简单的线条切割

优雅而又时尚

下过雨的傍晚

坐在露天的阳台

空气中满满的青草气

风在耳边喃喃的讲着话

美好的生活

如此简单

原文转载:http://home.shaoqun.com/a/73794.html

邮乐网:https://www.ikjzd.com/w/1776

敦煌网站:https://www.ikjzd.com/w/189

米谷:https://www.ikjzd.com/w/1788


理想中的生活大概就是在人不多的城市或是乡间山林住一独栋小屋过着清闲的日子别墅装修设计为你打造一个"简单"的家逃离繁忙的日常如山间清流充满着宁静的优雅气韵玄关似狭长的栈道壁龛的设计实用之余也独具设计感墙面的挂画增加了空间的变化走进家门的瞬间就充满趣味暖灰色与冷灰色的搭配使用家具与装饰物合理精致的组合凸显安静优雅的气质清晨满屋的光影夜晚摇曳的星光尤为温馨安稳让食物变得浪漫的除了他本身还有就餐的环境使用
淘粉吧首页:淘粉吧首页
腾邦:腾邦
防侵权预警132:扩鞋器在美国市场有外观专利情况:防侵权预警132:扩鞋器在美国市场有外观专利情况
Facebook"送测广告"必须了解的10个要领:Facebook"送测广告"必须了解的10个要领
江西有哪些特色小吃?:江西有哪些特色小吃?

《除暴》票房高歌猛进破3.93亿 新旧时代治安对比唤醒大众忧患意识

原标题:《除暴》票房高歌猛进破3.93亿 新旧时代治安对比唤醒大众忧患意识

"致敬所有为了现在安稳生活做出努力的警察!"由王千源、吴彦祖领衔主演,春夏、卫诗雅主演的年度唯一警匪电影《除暴》自上映以来,收获广大观众关注与讨论,目前累计票房突破3.93亿,观影总人次突破1060万。电影中的年代细节与伏笔也成为众多观众关注的焦点,影片编剧洪亮绘制了一组"暗藏玄机"版海报,五张简笔画各自对应电影中的重要意象,数学题、日期、弧线、圆形、窗格到底背后有什么深意?

影片自上映以来,除了王千源吴彦祖演技爆发、题材稀缺且大胆、场景考究等被观众一致称赞外,上世纪九十年代打黑除恶的艰辛过程,公安干警咬死不放的精神,也感动了许多人。有网友留言:"庆幸生于和平年代"、"看完电影,回家问了长辈有关90年代的混乱治安,原来电影里演的都是真实的"、"感谢那些为了我们平安成长而无私奉献的警察!"

细节还原考究获观众二刷

精彩伏笔设计引讨论热潮

电影《除暴》作为2020年度唯一警匪电影,不仅保留了经典的正邪殊死较量、燃爽的警匪对决,还前所未见地展现了90年代内地暴力事件。在这个时代背景下,有太多需要注重的还原意象,剧组为此花费了大量的精力准备。例如张隼抢劫的友谊商店中,就有一个"熊猫盼盼"的旋转立像,而"熊猫盼盼"正是1990年北京亚运会吉祥物,紧贴时代背景。警察局的门牌上写着"巡逻警察大队",就是现在巡特警的前身。即使是这些一闪而过的镜头,都做到细致入微极度还原,为观众呈现最真实的90年代内地情况。

影片在上映后,凭借稀缺题材、高完成度的警匪类型片、全员演技派与考究的服化道,口碑票房一路走高。众多观众也开始对影片中的精彩设计有所讨论:"张隼的衣服上居然印着'为人民服务',太讽刺了"、"张隼妈妈开的店叫洗心浴池,是想让儿子洗心革面么?"、"钟诚生病的时候床头放着一个苹果,张隼也爱吃苹果,有没有可能张隼探望过钟诚?"一系列线索伏笔可见剧组的用心程度,巧妙之处成为影片彩蛋,吸引很多观众"二刷"甚至"三刷"。 在影片编剧洪亮绘制的"暗藏玄机"版海报中,寥寥几笔勾勒出影片中的重要意象,看似简单的数学题、打叉的重要日期、两条弧线构成的轮廓、细看各不相同的六个圆形和线条、三个高低不齐的窗格到底分别代表了影片中的哪些细节?简笔画背后又包含着编剧哪些巧妙设计?吸引许多观众积极互动解谜。

人民警察负重前行换取岁月静好

经历混乱年代方知如今和平不易

"哪有什么岁月静好,只不过是有人替你负重前行!"这句引人深思的话在《除暴》上映后,让许多人有了更多的感悟。曾经的提心吊胆如今已被平安幸福取代,那时的小心翼翼现在已变成了安心无忧,影片中深刻展现出的90年代社会治安乱象,引无数观众开始回忆印象中的成长环境:"那时的货车司机危险系数非常高,因为会经常路遇抢劫"、"家里长辈以前经历过飞车党抢包,现在身上还留有伤疤"、"那时的一线警察是以牺牲为代价在维护治安"。残暴、嚣张、目无法纪的年代,是许多年轻人父母辈历经的时代阵痛,但如今,我们回家路上始终亮着的治安亭、日益发达的刑侦技术、强盛国力的安全保障带来了这个和平的时代。现在的幸福背后是一代代人民警察的奉献和热血,是他们曾为之奋斗并梦寐以求的生活,电影《除暴》向无数曾与黑恶势力斗争的人民警察献上最深切的致敬!

电影《除暴》由英皇(北京)影视文化传媒有限公司、英皇影业有限公司、正夫君泽影视传媒有限公司、天津联瑞影业有限公司、正夫影业有限公司出品,广东昇格传媒股份有限公司、珠江影业传媒股份有限公司、北京国影纵横电影发行有限公司、沃栢嘉文化传播(上海)有限公司、北京桦语影业有限公司联合出品。刘浩良导演、编剧,韩三平监制,梁琳担任制片人,王千源、吴彦祖领衔主演,春夏、卫诗雅、大力、于笑、胡子程、李晓川、洪浚嘉、纪焕博、庞雨浓、答有为主演,全国院线热映中。

责任编辑:任芯仪(EN063)返回搜狐,查看更多

责任编辑:

原文转载:http://yl.shaoqun.com/a/209032.html

c79:https://www.ikjzd.com/w/1016

白色清关:https://www.ikjzd.com/w/1410

急速:https://www.ikjzd.com/w/1861


原标题:《除暴》票房高歌猛进破3.93亿新旧时代治安对比唤醒大众忧患意识"致敬所有为了现在安稳生活做出努力的警察!"由王千源、吴彦祖领衔主演,春夏、卫诗雅主演的年度唯一警匪电影《除暴》自上映以来,收获广大观众关注与讨论,目前累计票房突破3.93亿,观影总人次突破1060万。电影中的年代细节与伏笔也成为众多观众关注的焦点,影片编剧洪亮绘制了一组"暗藏玄机"版海报,五张简笔画各自对应电影中的重要意象,
美菜:美菜
环球市场:环球市场
分享:亚马逊卖家每日工作安排!:分享:亚马逊卖家每日工作安排!
八乡山大峡谷漂流在哪里?梅州八乡山大峡谷漂流地址?:八乡山大峡谷漂流在哪里?梅州八乡山大峡谷漂流地址?
深圳南澳岛好玩吗?:深圳南澳岛好玩吗?

Amazon SPN神奇之处,80%的老司机都还不知道!

旺季来了,最近美工等各个资源都十分紧缺,Yuki突然想到之前尝试过的Amazon SPN,这次重新摸索发现又便利了许多,重点是打破了以前的认知,并非亚马逊推荐的就只有一个"贵"字!那么Yuki今天就和大家一起来看看Amazon SPN到底是什么?

Amazon SPN:

Amazon SPN是Amazon Solution Provider Network的缩写,SPN汇集的第三方服务商公司可帮助卖家在多个商城解决物流、翻译、推广、认证等问题,为卖家提供优质服务,为卖家在运营过程中遇到的各种问题提供解决方案,拓展卖家的全球业务

官网:

https://sellercentral.amazon.com/gspn?&ref_=xx_gspn_servs_hp#/browse?localeSelection=zh_CN

其实亚马逊官方有一套相对严格的标准,能通过审核成为官方合作伙伴的服务商也是挺厉害的,据某某通的朋友说他们也是提交了很多资质,才成为提供方。感兴趣的服务商可以在后台了解一下审核标准,申请SPN合作服务商。Yuki今天就卖家角度讲讲这个SPN值不值得用?

下面就是亚马逊SPN现在涉猎到的服务,相对也是比较全面,亚马逊周边除了刷单应有尽有。其实对于我们亚马逊上面临的从开店到运营遇到的所有问题,几乎都可以在这解决

现在Amazon SPN上有"账户管理、会计、广告优化、上架产品、图文版商品描述、亚马逊物流预处理、图片拍摄、国际退货、国际配送、仓储、税费、培训、翻译等"服务。相比之前全面很多,这里Yuki觉得最值得大家用的,莫过于最能体现本土文化的图片拍摄和listing编写?

如何使用SPN?

可能很多人和Yuki一样第一次使用的时候前怕狼后怕虎,所以Yuki就以找A+拍摄为例,再带大家走一边这个流程。

第一步:后台搜索"SPN"或者直接进入网站首页,选择"您的位置?"、"你想在哪里销售商品?"和"您的哪些服务需要帮助",都可实事求是按自己需要选择。Yuki就选择"图文版商品描述=A+"

第二步:选择高性价比的本土服务商。左侧提供商位置大家可以自己选择,比如我想要美国直接点击美国本地的,就可以看到评论和订单量最多的这家提供方"Seller Drive"。

注意:小心谨慎的卖家也可以在Google上搜索一下,看有没有恶评之类的,如果没有,就可以放心地跟着Yuki一起去沟通一下。

第三步:预约沟通。点进"Seller Drive",就可以看到其服务的详细内容介绍,在价格各方面都觉得可以的情况下就可以点击"联系提供商"。

如下图,然后简填一下自己的需求,提交即可!上面虽说是2个工作日,其实几个小时就可以得到回复,相对比较快捷方便。

▼ 第四步:提交请求后,后台就可以跟踪看到进度。类似于淘宝订单,亚马逊做担保人,我们交易结束后也可以相互评论。

相互拿到联系方式后,就可以自由沟通,"Seller Drive"建议用whats app和SKYPE。关于给佣金,就可以自行商量,有的可能提前需要一半押金,有的可以完成后给全款。

整个操作过程相对比较简单、快速,沟通起来和我们国内服务商差不多,且有的专业度可能还高于国内。有朋友就说了可能英文沟通是障碍,这个完全不是问题,有大一些公司他们支持多国语言(包含中文)。但是注意不要盲目的追求中文,结果选到了中国的服务商就有点背道而驰了,毕竟我们的初衷是为了要一个Made in USA的listing。

Yuki说:

Yuki觉得Amazon SPN这个平台好的一点是,给我们中国中小卖家提供了一个和外部合作的机会。有些大公司直接就是请外国团队拍摄和写lisitng,中小卖家苦于资金和实力有限,一直没有机会,然而在Amazon SPN完全可以淘到性价比较高的资源,所以Yuki还是建议大家适当迈出一步,可能就会多一种选择。

本文未经允许,不得转载!

(来源:Yuki跨境私语) 


原文转载:http://fashion.shaoqun.com/a/292230.html

FEN:https://www.ikjzd.com/w/2668

c88是什么:https://www.ikjzd.com/w/1017

55海淘:https://www.ikjzd.com/w/1723


旺季来了,最近美工等各个资源都十分紧缺,Yuki突然想到之前尝试过的AmazonSPN,这次重新摸索发现又便利了许多,重点是打破了以前的认知,并非亚马逊推荐的就只有一个"贵"字!那么Yuki今天就和大家一起来看看AmazonSPN到底是什么? AmazonSPN: AmazonSPN是AmazonSolutionProviderNetwork的缩写,SPN汇集的第三方服务商公司可帮助卖家在多个商
e票联:e票联
krazy:krazy
从广州花都到沙扒湾大概要多少时间?:从广州花都到沙扒湾大概要多少时间?
METI备案是什么?如何用PSE做METI备案:METI备案是什么?如何用PSE做METI备案
深圳欢乐谷平安夜门票多少钱?2020平安夜深圳欢乐谷门票怎:深圳欢乐谷平安夜门票多少钱?2020平安夜深圳欢乐谷门票怎