首页
统计
留言
友链
壁纸
Search
1
Notion网页端汉化、主题修改
708 阅读
2
SnapicPlus主题添加视频功能以及使用外链详解、图片加载缓慢问题解决
551 阅读
3
Gravatar镜像源地址大全
538 阅读
4
typecho主题中文搜索404问题解决
508 阅读
5
Notion客户端中文安装
440 阅读
Web前端
ES6
Vue.js
Node.js
JavaScript
其他前端扩展
后端探索
数据库
服务器
小程序
手机端
奇技淫巧
成功之母
时光随笔
登录
Search
标签搜索
SQL
typecho
SqlServer
MySql
jQuery
JavaScript
npm
Gravatar
镜像
google
Java
包管理工具
前端
JS
node
数据库
Notion
BEGIN...END
EXECUTE
404
天祈
累计撰写
66
篇文章
累计收到
14
条评论
首页
栏目
Web前端
ES6
Vue.js
Node.js
JavaScript
其他前端扩展
后端探索
数据库
服务器
小程序
手机端
奇技淫巧
成功之母
时光随笔
页面
统计
留言
友链
壁纸
搜索到
66
篇与
的结果
2022-09-12
MYSQL5.7安装步骤
卸载MYSQL以及残留{alert type="success"}{timeline}{timeline-item color="#19be6b"}删除MYSQL隐藏文件:C盘的 ProgramData 下会有一个 MySQL 文件夹,这个文件夹要删除{/timeline-item}{timeline-item color="#ed4014"}删除注册表:Windows运行框中输入 regedit , 打开注册表编辑窗口,逐级打开找到如下项 :HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQLHKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQLHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL{/timeline-item}{timeline-item color="#ed4014"}删除服务项:运行框中运行 CMD 打开 Windows 命令行窗口,执行如下命令 : sc delete MySQL服务名 (比如 mysql57, 可以在本机服务列表中查看具体名称){/timeline-item}{/timeline}{/alert}镜像站{alert type="info"}清华大学镜像站阿里云镜像站网易镜像{/alert}使用清华镜像包安装Mysql5.7安装包下载{alert type="success"}下载64位MSI安装文件之后,点击安装。安装时选择安装的位置。{/alert}环境变量配置{alert type="info"}在系统变量中Path中添加Mysql安装目录,一定要添加到bin目录级如果Path值过长无法保存,可修改原Path变量名为Path1,新建Path变量,添加%Path1%{/alert}MySQL服务的安装与初次登录{alert type="success"}1.以管理员启动命令窗2.进入到MYSQL安装目录(bin级)3.执行命令mysqld -install -- 输出 Service successfully installed mysqld --initialize -- 没有输出,重新回到光标4.两条命令执行完毕以后,在MySQL的安装目录下会出现一个data文件夹,在data文件夹中有一个以.err结尾的文件,文件中存储了数据库的临时密码。也可以使用记事本的查找功能查找关键词password。记住此密码!!!5.执行命令 net start mysql ,启动MySQL服务6.初次登录:mysql -u root -p7.修改密码alter user 'root'@'localhost' identified by '123456'8.使用quit命令退出MySQL9.在MYSQL安装目录下新建my.ini文件[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf810.以管理员身份启动命令行,重启MySQL服务net stop mysql net start mysql11.登录MySQL,使用命令 status 查看字符集。由于配置了环境变量,直接使用普通命令行即可登录MySQL{/alert}
2022年09月12日
223 阅读
0 评论
0 点赞
2022-09-02
JavaScript基础回顾
{alert type="success"}Document对象{callout color="#68ef4d"}HTMLCollection 是 HTML 元素的集合,NodeList 是一个文档节点的集合。{/callout}document.activeElement:返回当前获取焦点元素document.activeElement;document.addEventListener():向文档添加句柄document.addEventListener('click', function () { ... });document.createAttribute():创建一个属性节点let attr = document.createAttribute('data-value'); attr.value = 'true'; document.getElementById("p").setAttributeNode(attr);document.createComment():创建注释节点let common = document.createComment('ddd'); document.getElementById('content').appendChild(common);document.createElement():创建元素节点let p = document.createElement('p'); p.innerText = 2 ;document.createTextNode():创建文本节点let p = document.createElement('p'); let text = document.createTextNode('文本'); p.appendChild(text);document.images:返回对文档中所有 Image 对象引用document.images; // HTMLCollectiondocument.querySelector():返回文档中匹配指定的CSS选择器的第一元素document.querySelector(".pp"); // 第一个节点document.querySelectorAll():返回文档中匹配的CSS选择器的所有元素节点列表document.querySelector(".pp"); //所有节点document.write():向文档写HTML表达式或JavaScript代码document.write("<h1>Hello World!</h1><p>Have a nice day!</p>");Dom元素对象{callout color="#74f53d"}document.addEventListener(event, function, useCapture)函数中,useCapture指定事件是否 在捕获或冒泡阶段执行,默认false 关闭冒泡。{/callout}element.addEventListener():向指定元素添加事件句柄 document.getElementById("a").addEventListener('click',function(){ ... })element.removeEventListener(): 移除添加的句柄事件element.appendChild():为元素添加一个新的子元素 let ele = document.getElementById('div'); let newEle = document.createElement('p'); let attr = document.createAttribute('name'); attr.value = 'age'; newEle.setAttribute('data-value', 'true'); newEle.setAttributeNode(attr); ele.appendChild(newEle);element.attributes:返回一个元素的属性数组let newEle = document.createElement('p'); let attr = document.createAttribute('name'); attr.value = 'age'; newEle.setAttribute('data-value', 'true'); newEle.setAttributeNode(attr); console.log(newEle.attributes); element.children:返回元素的子元素的集合(HTMLCollection)// HTMLCollection集合转为数组格式 Array.from(document.getElemntById("div").children); [...document.getElemntById("div").children];element.classList:返回元素的类名,作为 DOMTokenList 对象(DOMTokenList)[...document.getElemntById("div").classList];document.getElemntById("div").classList.add("class"); //增加类document.getElemntById("div").classList.contains("class"); // 是否存在指定类document.getElemntById("div").classList.remove("cla1",,); // 移除指定类 多个类以逗号分开document.getElemntById("div").classList.toggle("cla1",true/false); // 在元素中切换类名element.className:设置或返回元素的class属性document.getElemntById("div").className.cinludes("cls");element.cloneNode():克隆某个元素(同JQ中clone()函数)document.getElemntById("div").cloneNode(); // 复制Domelement.contentEditable:设置或返回元素的内容是否可编辑(contenteditable属性)let p = document.getElementById('p'); p.contentEditable = true; // 设置可编辑属性为true console.log(p.getAttribute('contenteditable')); // 输出可编辑属性为true p.setAttribute('contenteditable', false); //关闭可编辑属性 let att = document.createAttribute('contenteditable'); // 创建可编辑属性 att.value = true; p.setAttributeNode(att); // 重新设置可编辑为true let text = document.createTextNode('1234'); // 创建文本节点 p.appendChild(text); //文本节点内容追加于原文本之后 let common = document.createComment('注解内容'); p.appendChild(common); let span = document.createElement('span'); //创建span标签 span.innerHTML = '<strong>世界 你好!</strong>'; p.appendChild(span); p.removeAttribute('contenteditable');element.firstChild:返回元素的第一个子节点document.getElementsByClassName("pp").firstChild;element.hasAttribute():如果元素中存在指定的属性返回 true,否则返回falsedocument.getElementsByClassName("pp").hasAttribute("name");element.hasFocus():返回布尔值,检测文档或元素是否获取焦点document.getElementsById("div").hasFocus();element.lastChild:返回最后一个子节点document.getElementsByClassName("pp").lastChild();element.nodeName:返回元素的标记名(大写)document.getElemntById("div").nodeNmae; // DIVelement.removeAttribute():从元素中删除指定的属性document.getElementById("div").removeAttribute("name");DOM 事件鼠标事件{callout color="#68ef4d"}函数方法中存在event事件变量,包含鼠标点击信息{/callout}oncontextmenu :在用户点击鼠标右键打开上下文菜单时触发onmousedown :鼠标按钮被按下onmouseup : 鼠标按键被松开onmouseover :鼠标移到某元素之上(支持冒泡)onmouseout : 鼠标从某元素移开(支持冒泡)onmouseenter : 当鼠标指针移动到元素上时触发(不支持冒泡)onmouseleave : 当鼠标指针移出元素时触发(不支持冒泡)onmousemove : 鼠标移动触发onwheel:该事件在鼠标滚轮在元素上下滚动时触发键盘事件onkeypress:某个键盘按键被按下并松开onkeydown:某个键盘按键被按下(监听事件使用)onkeyup:某个键盘按键被松开表单事件onfocus:聚焦时间(不支持冒泡)onblur:失焦事件(不支持冒泡)onfocusin:元素即将获取焦点时触发(支持冒泡)onfocusout:元素即将失去焦点时触发(支持冒泡) // #form form表单 // 1. 不支持冒泡 document.getElementById('form').onfocus = function () { console.log('不冒泡'); }; // 2. 不支持冒泡 document.getElementById('form').addEventListener('focus', function () { console.log('不支持冒泡2'); }); // 3. 支持冒泡 document.getElementById('form').addEventListener('focusin', function () { console.log('支持冒泡2'); }); // 4. 支持冒泡 document.getElementById('form').addEventListener( 'focus', function () { console.log('支持冒泡3'); }, true );oninput: 元素获取用户输入时触发onselect:用户选择文本(input,textarea)剪贴板事件oncopy:该事件在用户拷贝元素内容时触发oncut:该事件在用户剪切元素内容时触发onpaste:该事件在用户粘贴元素内容时触发事件属性bubbles :返回布尔值 事件是否起泡类型target : 触发事件的元素type : 当前对象事件名称事件方法event.stopPropagation():阻止事件冒泡event.preventDefault(): 阻止默认事件Console对象console.group():在控制台创建一个信息分组。以 console.group() 开始,console.groupEnd() 结束cosnole.trace(): 显示当前执行的代码在堆栈中的调用路径console.table(tabledata,tablecolumns): 输出表格信息.第一个参数必须,数组或对象格式var site1 = { name : "Runoob", site : "www.runoob.com" } var site2 = { name : "Google", site : "www.google.com" } var site3 = { name : "Taobao", site : "www.taobao.com" } console.table([site1, site2, site3]);console.time(): 计时器,开始计时间,与 timeEnd() 联合使用,用于算出一个操作所花费的准确时间console.time('Runoob'); for (i = 0; i < 100000; i++) { // 代码部分 } console.timeEnd('Runoob');JavaScript 闭包{callout color="#6cf4b4"}自调用函数会自调用立即执行闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。{/callout}let add = (function () { let co = 1; console.log(1); return function () { return (co += 1); }; })();{music id="16483438" color="#4efd63" /}{/alert}
2022年09月02日
155 阅读
0 评论
1 点赞
2022-08-30
ES6基础回顾
{callout color="#27d3b6"}ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现{/callout}{alert type="info"}解构赋值{callout color="#4572f7"}等号的右边必须是数组、对象、Set、Map等可遍历的数据结构(具备Iterator接口){/callout}数组的解构赋值let [a, b, c] = new Set([1, 2]); let [a, b,c] = [1, 2]; // a = 1 b = 2 c = undefined let [a, b, c = 8] = new Set([1, 2]); // a = 1 b = 2 c = 8 对象的结构赋值{callout color="#eabe80"}解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象.对象的解构赋值的内部机制是先找到同名属性,然后再赋值给对应的变量。真正被赋值的是后者,而不是前者.{/callout}let { a = 0, b, c = 4, d: v ,e} = { a: 1, b: 2, d: 5 }; // a = 1 b = 2 c = 4 v = 5 e = undefined字符串的扩展{callout color="#b4c43b"}ES6加强了对Unicode的支持,并且扩展了字符串对象 JavaScript允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点 但是,这种表示法只限于码点在\uOOOO-\uFFFF之间的字符。超出这个范围的字符,必须用2个双字节的形式表达\uD842\uDFB7 示例双字节异体字,此文字unicode码是20BB7,如果使用\u20BB7,JavaScript 会理解成\u20BB+7。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟一个7{/callout}codePointAt()[示例双字节异体字]这个字UniCode码为20BB7,如果使用charCodeAt()函数,可获取十进制Unicode码,但是此函数只能获取到第一个字节的十进制Unicode码55362,即十六进制D842;如果存在第二个UniCode码想获取需要使用charCodAt(1),成功则返回十进制Unicode码,否则返回NaN.codePointAt函数返回完整的十进制Unicode码,可通过toString(16)转换为16进制Unicode码'\uD842\uDFB7' === '\u{20BB7}' // true 大括号表示法与四字节的UTF-16编码是等价的。codePointAt方法是测试一个字符是由2个字节还是4个字节组成的最简单方法。// 判断是否四字节 function is32Bit(v) { return v.codePointAt(0) > 0XFFFF; } // Unicode转码解码函数 $.extend({ encodeUnicode: function (v) { var ascii = ''; for (var i = 0; i < v.length; i++) { var code = Number(v[i].charCodeAt(0)); if (code > 47) { var charAscii = code.toString(16); charAscii = new String('0000').substring(charAscii.length, 4) + charAscii; ascii += '\\u' + charAscii; } else { ascii += v[i]; } } return ascii; }, //解码 Unicode-->字符 decodeUnicode: function (v) { debugger; var r = v.match(/\u[0-9a-fA-F]{4}/g); if (r == null) { return v; } for (var i = 0; i < r.length; i++) { v = v.replace(r[i], unescape(r[i].replace('\\u', '%u'))); } return v; }, });String.fromCodePoint(){callout color="#89e6b1"}ES5提供了String.fromCharCode方法,用于从码点返回对应字符,但是这个方法不能识别32位的UTF-16字符(Unicode编号大于OxFFFF)。{/callout}at(){callout color="#f7c073"}ES5对字符串对象提供了charAt方法,返回字符串给定位置的字符。该方法不能识别码点大于OxFFFF的字符。{/callout}标签模板{callout color="#63d6f2"}模板字符串紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能。{/callout}其他方法inclues() : 返回布尔值,表示是否找到了参数字符串。startsWith() : 返回布尔值,表示参数字符串是否在源字符串的头部。endsWith() : 返回布尔值,表示参数字符串是否在源字符串的尾部。padStart() : 用于头部补全padEnd() : 用于尾部补全数值扩展进制转换0X1E.toString(8); // 36 --> 十六进制转换为八进制 let sum = 455; sum.toString(16) // 1C7 --> 十进制转换为十六进制Number.isFinite():判断值是否为有限Number.isFinite(0); // true Number.isFinite(NaN); // false Number.isFinite(true); // false Number.isFinite(Infinity); // false Number.isFinite(-Infinity); // falseNumber.isNaN():判断是否NaNNumber.isNaN(true); // false Number.isNaN(Number('1')); // true Number.isNaN(Number('E')); // falseNumber.parseInt()、Number.parseFloat()与全局方法使用一致Number.islnteger():判断一个数是否是整数Number.isInteger(true); // false Number.isInteger(25.0); // true Number.isInteger("25"); // falseNumber.isSafelnteger()JavaScript能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围就无法精确表示。Number.isSafeInteger(Math.pow(2,52)); // true Number.isSafeInteger(Math.pow(2,53)); // falseMath对象扩展函数Math.trunc():去除一个数的小数部分,返回整数部分Math.trunc(23.89); // 23Math.sign():判断-个数到底是正数、负数,还是零参数为正数,返回+l;参数为负数,返回-1参数为0,返回0参数为-0,返回-0其他值,返回NaNMath.sign(0); // 0 Math.sign('2'); // 1 Math.sign('E'); // NaNMath.fround():返回一个数的单精度浮点数形式Math.fround(1.337); // 1.3370000123977661指数运算符(**)2**3; // 8 即2的3次方函数的扩展函数默认值与解构赋值配合function SubEvent({ name = '', age: year = 12,color = 'blue' },attribute = true) { // 得到 name='test' ; year=18 ; color='blue'; attribute=true ....... } SubEvent({ name: 'test', age: 18 });rest参数function SubEvent(...params) { console.log(params); // [{ name: 'test', age: 18 }] } SubEvent({ name: 'test', age: 18 });箭头函数{callout color="#4def68"}函数体内的this对象就是定义时所在的对象,而不是使用时所在的对象箭头函数不可以当作构造函数。也就是说,不可以使用new命令,否则会抛出一个错误且不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替{/callout}let parm = () => 4; let parm2 = () => ({ a: 1, b: 2 }); let parm3 = () => { return Math.trunc(23.78); }; [1, 2, 3].map((res) => res * 2); [1, 2, 3].filter((res) => res > 2);数组的扩展扩展运算待(...){callout color="#4def68"}将一个数组转为用逗号分隔的参数序列{/callout}let params = [2, 3, 4]; console.log(...params); function EsEvent([a, b, c]) { //解构赋值 console.log(a, b, c); // 2 3 4 } function EsEvent2(...parm) { // rest参数 console.log(parm); // [2,3,4] } EsEvent(...params); EsEvent2(...params);// 数组合并 let a = [2, 3]; console.log([0, 1, ...a]); // [0,1,2,3] // 对象合并 let b = { c: 3, d: 4 }; console.log({ a: 1, b: 2, ...b }); // {a:1,b:2,c:3,d:4} // 伪数组转换为数组 [...document.querySelectorAll('._value')]; // HTMLCollection集合转换为数组 [...new Set([...a, 4, 5, ...[2, 4]])]; // Set转为数组格式 去重 [2,3,4,5]// 函数返回值(数组) function GetParams() { let a = [2, 3, 4]; return [...a]; } const [aa, bb, cc = 9] = GetParams(); console.log(aa, bb, cc); // 2 3 4 // 函数返回值(对象) function GetParams2() { let as = { m: 1, n: 2 }; return { ...as }; } const { m, n = 3 } = GetParams2(); console.log(m, n); // 1 2Array.from():将两类对象转为真正的数组{callout color="#68ef4d"}类似数组的对象和可遍历(iterable)对象(包括ES6新增的数据结构Set和Map){/callout}Array.from(new Set([1,2,3])); 效果等同于 [...new Set[1,2,3]];Array.of():将一组值转换为数组。Array.of(3, 11, 8); // [3,11,8]Array.Prototype.find():找出第一个符合条件的数组成员[2,3,4,5].find((value,index)=>{return index>1}) // 4 [2,3,4,5].filter((value,index)=>{return index>1}) // [4,5]数组的空位Array(3); // length属性为3 [ , , ]对象的扩展Object.keys()、Object.values()、Object.entries()let aa = { a: 1, b: 2 }; let bb="c"; // Object.keys() Object.keys(aa); // ['a','b'] // Object.values() Object.values(aa); // [1,2] // Object.entries()方法 Object.entries(aa).forEach(([key, value]) => { console.log(key, value); }); //变量名做属性 { ["d"+"d"]:4, foo:false, [bb]:3, }Object.is():比较两个值是否相等(严格相等)Object.is(fasle,false); // true Object.is('2',2); //fasleObject.assign():将源对象(source)的所有可枚举属性复制到目标对象{callout color="#a2fd81"}Object.assign方法实行的是浅复制,而不是深复制。也就是说,如果源对象某个属性的值是对象,那么目标对象复制得到的是这个对象的引用。{/callout}let a1={a:1,b:{c:1}}; let a2=Object.assign({},a1); a1.b.d=2; console.log(a2); // {a:1.b:{c:1,d:2}} // 克隆对象 let vs = { a: 1, b: 2 }; Object.assign(Object.create(Object.getPrototypeOf(vs)), vs);属性的可枚举性{callout color="#f0ad4e"}对象的每一个属性都具有一个描述对象(Descriptor),用于控制该属性的行为.一旦把属性的 configurable 设置为 false,就不能再把它变回可配置了。此时,再调用 Object.defineProperty()方法修改除 writable 之外的特性,都会导致错误。{/callout}let os = { a: 1, b: 2 }; Object.getOwnPropertyDescriptor(os, 'a'); // 描述对象 { // 可配置 configurable: true, // 可枚举 enumerable: true, // 值 value: 1, // 可写 writable: true } Object.getOwnPropertyDescriptors(os);// 获取所有属性的描述对象 { "a": { "value": 1, "writable": true, "enumerable": true, "configurable": true }, "b": { "value": 2, "writable": true, "enumerable": true, "configurable": true } }属性的遍历for...in循环:遍历对象自身和继承的可枚举属性(不包含Symbol属性)Object.keys(): 遍历对象自身的所有可枚举属性(不包含Symbol属性)Reflect.OwnKeys(): 遍历对象自身的所有属性,不管是否可枚举和属性名是SymbolObject.getOwnPropertyNames():遍历对象自身所有(不包含Symbol属性)属性,不管是否可以枚举Object.getOwnPropertySymbols():遍历对象自身的所有Symbol属性__proto__属性{callout color="#6dee9a"}__proto__属性(前后各两个下画线)用来读取或设置当前对象的prototype对象。{/callout}Object.prototype.attrs=123; let os = new Object(); os.__proto__ == Object.getPrototypeOf(os); // true Object.is(os.__proto__,Object.getPrototypeOf(os)); // trueObject.setPrototypeOf(){callout color="#f0ad4e"}Object.setPrototypeOf方法的作用与proto相同,用来设置一个对象的prototype对象,返回参数对象本身。它是ES6正式推荐的设置原型对象的方法。{/callout}Object.getPrototypeOf()let os = { a: 1, b: 2 }; Object.getPrototypeOf(os);Object.keys()、Object.values()、Object.entries()let os = { a: 1, b: 2 }; Object.keys(os); // ['a','b'] Object.values(os); // [1,2] Object.entries(os); // [ ['a',1],['b',2]] Object.entries(os).forEach(([key, value]) => { console.log(key, value); });对象的扩展运算待let { a, b, ...z } = { a: 1, b: 2, c: 3, d: 4 }; // a=1 b=2 z={ c: 3, d: 4} let c = { c: 5, ...z }; // { c: 3, d: 4 } let d = { ...c, ...z }; // { c: 3, d: 4 }传导运算符let os = { a: 1, b: {c:3,d:4} }; os?.a; // 1 os?.['a']; // 1 Set Map{callout color="#f0ad4e"}遍历方法:map.keys();map.values();map.entries();forEach();{/callout}Set{callout color="#f0ad4e"}成员唯一,属于伪数组{/callout}add(param):添加元素clear():清空Setdelete(): 清除某个元素has(): 判断是否存在元素size属性:元素个数ler set = new Set([1,2,3,3]); //set.size = 3 Array.from(new Set([1,2,3,3])); length=3 等同于 [...new Set([1,2,3,3])]; // length = 3 Maplet map = new Map(); map.set('a',1); map.get('a'); // 1 ReflectReflect.has(): 判断对象内是否存在指定属性let os = { a: 1, b: 2 }; Reflect.has(os, 'a'); 'a' in osReflect.deleteProperty(): 删除对象某一属性let os = { a: 1, b: 2 }; Reflect.deleteProperty(os, 'a'); delete os.a;Reflect.getPrototypeOf(): 获取对象原型let os = { a: 1, b: 2 }; Reflect.getPrototypeOf(os); // 读取对象的__proto__属性Reflect.setPrototypeOf(): 设置原型let os = { a: 1, b: 2 }; Reflect.setPrototypeOf(os, null);Reflect.defineProperty(): 与Object.defineProperty作用相同let os = { a: 1, b: 2 }; Object.defineProperty(os, 'a', { value: 3, // 值 enumerable: true, // 可枚举性 writable: true, // 可写性 configurable: false, // 可配置性 });Reflect.getOwnPrope时yDescriptor(): 获取对象的可描述对象与Object.getOwnPrope时yDescriptor()一致let os = { a: 1, b: 2 }; Reflect.getOwnPropertyDescriptor(os, 'a'); { "value": 1, "writable": true, "enumerable": true, "configurable": true }Reflect.isExtensible():对象是否可扩展 与Object.isExtensible()一致Object.isExtensible(os); // trueReflect.ownKeys(): 遍历对象的自身所有属性,不管是否可枚举和是否Symbol属性Promiselet data = new Promise((resolve, reject) => { $.ajax({ url: 'https://jsonplaceholder.typicode.com/todos/1', dataType: 'json', async: false, success(res) { resolve(res); }, }); }) .then((result) => { return new Promise((resolve, reject) => { $.ajax({ url: 'https://jsonplaceholder.typicode.com/todos/1', dataType: 'json', async: false, success(res) { resolve({ result, res }); }, }); }); }) .catch((error) => { console.log(error); }); let data2 = Promise.resolve({ a: 1, b: 2 });async函数{callout color="#4def6d"}async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。{/callout}async function GetData() { let res1 = await data; let res2 = await data2; return { res1, res2 }; } GetData().then((res) => { console.log(res); });{/alert}
2022年08月30日
166 阅读
0 评论
1 点赞
2022-08-25
NodeJS基础记录
基础备忘{alert type="info"}Node提供两个全局变量,都以两个下划线开头。__filename:指向当前运行的脚本文件名。__dirname:指向当前运行的脚本所在的目录。{/alert}
2022年08月25日
197 阅读
0 评论
0 点赞
2022-08-13
package.json文件
scripts字段{callout color="#f0ad4e"}scripts指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start时,所要执行的命令。{/callout}{alert type="info"}下面的设置指定了npm run preinstall、npm run postinstall、npm run start、npm run test时,所要执行的命令。"scripts": { "preinstall": "echo here it comes!", "postinstall": "echo there it goes!", "start": "node index.js", "test": "tap test/*.js" }{/alert}dependencies字段,devDependencies字段{callout color="#91d9fd"}dependencies字段指定了项目运行所依赖的模块,devDependencies指定项目开发所需要的模块。它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。{/callout}{alert type="success"}{ "devDependencies": { "browserify": "~13.0.0", "karma-browserify": "~5.0.1" } }{/alert}{alert type="error"}对应的版本可以加上各种限定,主要有以下几种:指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。波浪号(tilde)+指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号。插入号(caret)+指定版本:比如ˆ1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为0,则插入号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。latest:安装最新版本。{/alert}{alert type="success"}package.json文件可以手工编写,也可以使用npm init命令自动生成。$ npm init $ npm init -y有了package.json文件,直接使用npm install命令,就会在当前目录中安装所需要的模块。$ npm install如果一个模块不在package.json文件之中,可以单独安装这个模块,并使用相应的参数,将其写入package.json文件之中。# 安装到生产环境(dependencies节点) $ npm install express --save $ npm install express -S # 安装到开发环境(devDependencies) $ npm install express --save-dev $ npm install express -D{/alert}bin字段{alert type="info"}bin项用来指定各个内部命令对应的可执行文件的位置。"bin": { "someTool": "./bin/someTool.js" }上面代码指定,someTool 命令对应的可执行文件为 bin 子目录下的 someTool.js。Npm会寻找这个文件,在node_modules/.bin/目录下建立符号链接。在上面的例子中,someTool.js会建立符号链接node_modules/.bin/someTool。由于node_modules/.bin/目录会在运行时加入系统的PATH变量,因此在运行npm时,就可以不带路径,直接通过命令来调用这些脚本。 因此,像下面这样的写法可以采用简写。scripts: { start: './node_modules/bin/someTool.js build' } // 简写为 scripts: { start: 'someTool build' } 所有node_modules/.bin/目录下的命令,都可以用npm run [命令]的格式运行。在命令行下,键入npm run,然后按tab键,就会显示所有可以使用的命令。{/alert}main字段{alert type="info"}main字段指定了加载的入口文件,require('moduleName')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js。{/alert}config 字段{alert type="success"}config字段用于添加命令行的环境变量。{ "name" : "foo", "config" : { "port" : "8080" }, "scripts" : { "start" : "node server.js" } }然后,在server.js脚本就可以引用config字段的值。http .createServer(...) .listen(process.env.npm_package_config_port){/alert}
2022年08月13日
225 阅读
0 评论
0 点赞
2022-08-13
CommonJS规范
{alert type="info"}文章内容来自于阮一峰老师博客,其他详情请拜读原文。{/alert}概述{alert type="info"}每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。如果想在多个文件分享变量,必须定义为global对象的属性。global.warning = true;所有代码都运行在模块作用域,不会污染全局作用域。模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。模块加载的顺序,按照其在代码中出现的顺序。{/alert}module对象{callout color="#f0ad4e"} 如果在命令行下调用某个模块,比如node something.js,那么module.parent就是null。 如果是在脚本之中调用,比如require('./something.js'),那么module.parent就是调用它的模块。利用这一点,可以判断当前模块是否为入口脚本。{/callout}{alert type="success"}if (!module.parent) { // ran with `node something.js` app.listen(8088, function() { console.log('app listening on port 8088'); }) } else { // used with `require('/.something.js')` module.exports = app; }{/alert}{alert type="warning"}每个模块内部,都有一个module对象,代表当前模块。它有以下属性。module.id 模块的识别符,通常是带有绝对路径的模块文件名。module.filename 模块的文件名,带有绝对路径。module.loaded 返回一个布尔值,表示模块是否已经完成加载。module.parent 返回一个对象,表示调用该模块的模块。module.children 返回一个数组,表示该模块要用到的其他模块。module.exports 表示模块对外输出的值。{/alert}module.exports属性{callout color="#b070ff"}module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。如果一个模块的对外接口,就是一个单一的值,不能使用exports输出,只能使用module.exports输出。{/callout}require命令{alert type="info"}require命令用于加载文件,后缀名默认为.js。根据参数的不同格式,require命令去不同路径寻找模块文件。如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require('example-module/path/to/file'),则将先找到example-module的位置,然后再以它为参数,找到后续路径。如果指定的模块文件没有发现,Node会尝试为文件名添加.js、.json、.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。如果想得到require命令加载的确切文件名,使用require.resolve()方法。{/alert}模块的缓存{alert type="info"}第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的module.exports属性。所有缓存的模块保存在require.cache之中,如果想删除模块的缓存,可以像下面这样写。{/alert}{alert type="info"}// 删除指定模块的缓存 delete require.cache[moduleName]; // 删除所有模块的缓存 Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; }){/alert}模块的加载机制{alert type="success"}CommonJS模块的加载机制是,输入的是被输出的值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。{/alert}CommonJS与ES6区别CommonJS模块输出的是一个值的复制 ES6模块输出的是值的引用CommonJS模块是运行时加载,ES6模块是编译时输出接口// CommonJS module.exports = { foo:"hello", bar:"world" } // 等同于 exports.default = { foo:"hello", bar:"world" } exports.foo = 'hello'// ES6 export default { foo:"hello", bar:"world" } export let foo = 'heool'
2022年08月13日
182 阅读
0 评论
0 点赞
2022-08-13
前端Babel转码使用Browserify打包
{alert type="success"}1. 安装模块npm install babel-cli babel-preset-env browserify -D 2. 新建配置.babelrc转码规则{ "presets": ["env"] }3. package.json中添加转码打包脚本{callout color="#39c6aa"}&& : 相继执行(指令串顺序执行)& : 同时执行(指令串同时执行){/callout} ....... "scripts": { "build": " babel src/js -d dist/js && npx browserify dist/js/app.js -o lib/main.js" },4. 引入文件编译文件运行{callout color="#ddc4a1"}css、js文件置于根目录下不能访问到{/callout} <script type="module" src="./lib/main.js"></script>{/alert}
2022年08月13日
133 阅读
0 评论
0 点赞
2022-08-02
typecho网站迁移注意事项
修改config.inc.php文件{callout color="#f0ad4e"} 在宝塔控制面板新建网站(同时勾选新建数据库,数据库名可以与旧的不一样)之后,将旧的网站文件全部复制到网站目录下,然后将数据库SQL还原。{/callout}{alert type="info"}## 数据库类型使用 Pdo_Mysql ; view 指数据库前缀 默认typcho_ $db = new Typecho_Db('Pdo_Mysql', 'view'); ## 修改为新建的数据库名,注意数据库权限密码 'database' => 'lover', {/alert}PHP版本{alert type="info"}PHP版本注意和原网站版本保持一致。80以上版本好像会出错,70版本也会报Database Query Error,我常用的74版本即可{/alert}MySql版本和数据库权限{alert type="info"}MySql版本太高也会出错,最好和原网站版本保持一致,否则数据库还原也会有问题。一般使用5.7版本即可。数据库权限使用宝塔管理较为方便。{/alert}修改网站地址{alert type="info"}迁移网站之后,因为数据库是复制过去的,网站的地址还是原网站域名地址访问,导致所有的css、js文件都是通过原网站域名访问的,这就会出问题导致页面渲染出错。在勉强可以登录typecho管理后台之后,修改设置-->基本-->站点地址。{/alert}强制https{alert type="info"}添加证书之后,https访问但是所请求的css、js文件都是http协议导致加载文件失败,界面渲染不完整。这时候可以在config.inc.php中添加以下配置使请求静态文件使用https协议## 强制Https define('__TYPECHO_SECURE__', true);网站路径网站路径禁用中文,这是有血的教训的/web_config/php.config文件中PHP的安装位置修改迁移网站时有可能两台服务器之间,宝塔安装的位置不同导致下载的PHP在不同的路径下,这时候就必须修改为宝塔下正确的路径; 如果没有使用宝塔管理,参照原来的网站找到PHP的位置,然后修改路径即可<?xml version="1.0" ?> <handlers> <remove name="php_52"/> <remove name="php_53"/> <remove name="php_54"/> <remove name="php_55"/> <remove name="php_56"/> <remove name="php_70"/> <remove name="php_71"/> <remove name="php_72"/> <remove name="php_73"/> <remove name="php_74"/> <remove name="php_75"/> <remove name="php_00"/> <remove name="php_80"/> <remove name="php_81"/> <remove name="php_82"/> <add name="php_70" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="D:\SAKURA\BT\BtSoft\php\70\php-cgi.exe" resourceType="File" requireAccess="Script"/> </handlers> {/alert}
2022年08月02日
179 阅读
0 评论
1 点赞
2022-08-01
彩色文字跳动输出特效
前言{alert type="success"} 冲浪的时候,看见一位仁兄泽楠云的彩色文字跳动输出函数,玩起来很有意思,为了方便调用,班门弄斧做了一些小的修改,所以做此记录。作者原文章链接在下文。{/alert}效果{alert type="success"}{/alert}代码{alert type="success"}原生函数/** * @ Param _this : JS对象 * @ Param freeze : 出现之后不再闪动消失的部分 * @ Param con : 一直保持闪动的正文 */ function ContTransition(_this, freeze = '', con = '') { if (!(freeze && con)) return false; let content = [con].map(function (v) { return v + ''; }),a = 2,g = 1,s = 5,d = 75, b = ['rgb(110,64,170)','rgb(150,61,179)','rgb(191,60,175)','rgb(228,65,157)','rgb(254,75,131)','rgb(255,94,99)','rgb(255,120,71)','rgb(251,150,51)','rgb(226,183,47)','rgb(198,214,60)','rgb(175,240,91)','rgb(127,246,88)','rgb(82,246,103)','rgb(48,239,130)','rgb(29,223,163)','rgb(26,199,194)','rgb(35,171,216)','rgb(54,140,225)','rgb(76,110,219)','rgb(96,84,200)', ], c = {text: '',prefixP: -s,skillI: 0,skillP: 0,direction: 'forward',delay: a,step: g, }; (function auto() { let t = content[c.skillI]; c.step ? c.step-- : ((c.step = g), c.prefixP < freeze.length ? (c.prefixP >= 0 && (c.text += freeze[c.prefixP]), c.prefixP++) : 'forward' === c.direction ? c.skillP < t.length ? ((c.text += t[c.skillP]), c.skillP++) : c.delay ? c.delay-- : ((c.direction = 'backward'), (c.delay = a)) : c.skillP > 0 ? ((c.text = c.text.slice(0, -1)), c.skillP--) : ((c.skillI = (c.skillI + 1) % content.length), (c.direction = 'forward'))), (_this.textContent = c.text), _this.appendChild( (function (iv) { for ( var n = document.createDocumentFragment(), i = 0; iv > i; i++ ) { var l = document.createElement('span'); (l.textContent = String.fromCharCode(94 * Math.random() + 33)), (l.style.color = b[Math.floor(Math.random() * b.length)]), n.appendChild(l); } return n; })( c.prefixP < freeze.length ? Math.min(s, s + c.prefixP) : Math.min(s, t.length - c.skillP) ) ), setTimeout(auto, d); })(); }JQ扩展方法/** * @ Param freeze : 出现之后不再闪动消失的部分 * @ Param con : 一直保持闪动的正文 */ $.fn.ContTransition = function (freeze = '', con = '') { if (!(freeze && con)) return false; _this = this[0]; let content = [con].map(function (v) { return v + ''; }),a = 2,g = 1,s = 5,d = 75, b = ['rgb(110,64,170)','rgb(150,61,179)','rgb(191,60,175)','rgb(228,65,157)','rgb(254,75,131)','rgb(255,94,99)','rgb(255,120,71)','rgb(251,150,51)','rgb(226,183,47)','rgb(198,214,60)','rgb(175,240,91)','rgb(127,246,88)','rgb(82,246,103)','rgb(48,239,130)','rgb(29,223,163)','rgb(26,199,194)','rgb(35,171,216)','rgb(54,140,225)','rgb(76,110,219)','rgb(96,84,200)', ], c = {text: '',prefixP: -s,skillI: 0,skillP: 0,direction: 'forward',delay: a,step: g, }; (function auto() { let t = content[c.skillI]; c.step ? c.step-- : ((c.step = g), c.prefixP < freeze.length ? (c.prefixP >= 0 && (c.text += freeze[c.prefixP]), c.prefixP++) : 'forward' === c.direction ? c.skillP < t.length ? ((c.text += t[c.skillP]), c.skillP++) : c.delay ? c.delay-- : ((c.direction = 'backward'), (c.delay = a)) : c.skillP > 0 ? ((c.text = c.text.slice(0, -1)), c.skillP--) : ((c.skillI = (c.skillI + 1) % content.length), (c.direction = 'forward'))), (_this.textContent = c.text), _this.appendChild( (function (iv) { for ( var n = document.createDocumentFragment(), i = 0; iv > i; i++ ) { var l = document.createElement('span'); (l.textContent = String.fromCharCode(94 * Math.random() + 33)), (l.style.color = b[Math.floor(Math.random() * b.length)]), n.appendChild(l); } return n; })( c.prefixP < freeze.length ? Math.min(s, s + c.prefixP) : Math.min(s, t.length - c.skillP) ) ), setTimeout(auto, d); })(); };{/alert}参考链接{alert type="info"}原文链接 : https://iizny.com/1084/{/alert}
2022年08月01日
195 阅读
0 评论
1 点赞
2022-07-29
IP地址查询API接口
{callout color="#99f3ff"} 国内的IP请求建议使用国内API服务接口,国外的IP使用国外API服务,若是使用国内服务请求国外IP响应内容会有偏差,响应内容与国外API相比甚至不在同一个州,准确性不高(可能由于国内屏蔽国外部分IP缘故导致)。{/callout}聚合数据{alert type="info"}官方地址 : https://www.juhe.cn/docs/api/id/1 {/alert}{alert type="success"}聚合数据IP获取API接口免费30次/天,返回数据结果基本和百度IP查询结果一致。返回JSON数据示例如下:{ "resultcode":"200", "reason":"查询成功", "result":{ "Country":"中国", "Province":"上海", "City":"上海", "District":"", "Isp":"电信" }, "error_code":0 }{/alert}IPInfo{alert type="info"}官网首页 : https://ipinfo.io/官网文档 : https://ipinfo.io/developersGitHub文档 : https://github.com/ipinfo/{/alert}{alert type="success"}具有50万次/月的免费额度,查询信息返回JSON为英文格式。与微软、npm、cisco、vmware合作,可信度很高。付费状态下响应数据的字段会更丰富,免费额度的JSON响应示例如下:{ "ip": "66.87.125.72", "hostname": "ip-66-87-125-72.spfdma.spcsdns.net", "city": "Springfield", "region": "Massachusetts", "country": "US", "loc": "42.1015,-72.5898", "org": "AS10507 Sprint Personal Communications Systems", "postal": "01101", "timezone": "America/New_York" }收费的响应示例如下:{ "input": "201.197.56.230", "data": { "ip": "201.197.56.230", "hostname": "www230.asd.tj.cn", "city": "Tianjin", "region": "Tianjin", "country": "CN", "loc": "39.1422,117.1767", "org": "AS4837 CHINA UNICOM China169 Backbone", "timezone": "Asia/Shanghai", "asn": { "asn": "AS4837", "name": "CHINA UNICOM China169 Backbone", "domain": "chinaunicom.cn", "route": "221.196.0.0/15", "type": "isp" }, "company": { "name": "China Unicom Tianjin Province Network", "domain": "chinaunicom.cn", "type": "isp" }, "privacy": { "vpn": false, "proxy": false, "tor": false, "relay": false, "hosting": false, "service": "" }, "abuse": { "address": "No.21,Financial Street, Beijing,100033, P.R.China", "country": "CN", "email": "hqs-ipabuse@chinaunicom.cn", "name": "ChinaUnicom Hostmaster", "network": "221.196.0.0-221.198.255.255", "phone": "+86-10-66259764" }, "domains": { "total": 0, "domains": [] } } }{/alert}阿里云市场{alert type="info"}云市场 : 第三方IPAPI{/alert}{alert type="success"}云市场中第三方API商家较多,大多数具有免费的少量请求额度,其接口均与阿里云控制台结合使用,有一定保障,因为是第三方服务,风险和服务需要自行斟酌。某一第三方JSON返回示例如下:{ "code": 100, "message": "success", "ip": "110.188.234.66", "result": { "en_short": "CN", //英文简称 "en_name": "China", //归属国家英文名称 "nation": "中国", //归属国家 "province": "四川省", //归属省份 "city": "绵阳市", //归属城市 "district": "涪城区", //归属县区 "adcode": 510703, //归属地编码 "lat": 31.45498, //纬度 "lng": 104.75708 //经度 } }{/alert}{callout color="#ffecd1"}部分国外IP被封禁强制和谐了,导致是查询不到的。可以使用https://ipinfo.io/.{/callout}
2022年07月29日
148 阅读
0 评论
1 点赞
兰因
2022年07月14日
150 阅读
0 评论
1 点赞
2022-07-14
{alert type="success"}以憧憬做梁栋希望为瓦砾 信仰和坚定为支柱 以期待和梦想构筑黛瓦白墙 白云漫于蓝天 飞鸟从中穿过 传来悠扬的声音 空气中弥漫着清新的香味 万物有灵 温润的天气里 阳光煦和 蒸腾的水汽在暖阳的照耀下霓虹若隐若现 百花丛中 有一佳人 明目善睐 温和驯良 此生心中唯一人 久久的垫着脚尖 注视着远方 望穿秋水 在稍远的地方 小桥流水 径密林深 潮湿 神秘而深邃 这是我前半生心中的梦 从一个若隐若现的轮廓 随着我对这个的认知 慢慢的补充填补 从蒙昧以来 听说过太多的悲欢离合 所以我不想 不想遭遇这样的不幸 渴望遇到对的 爱的 相爱的 正确的人 终其一生 寻而不得 是我曾经最怕的事情 我只是一个平凡的人 这样纯粹美好的东西可能是我不配拥有的 但是我奢望 期待 希望自己会有万千人中幸运的那一个 会找到 会遇见 一直在有意识的积累自己 希望当遇到对的人的时候能紧紧的把我而不错过 希望能一觅即中 然后紧紧的拥她入怀 再也不放手 这时候 我担心的是自己遇不到 而不是遇到了把握不住 因为我知道 若是能邀天之幸 我宁愿粉身碎骨万死不辞 但凡有一丝的可能 我都会虔诚的苦苦寻觅 不会放弃 在这红尘中 苦苦的等待 等待心动的感觉 等待命中注定的那个她 没有一双慧眼 但却能在千万人中一眼看到她 心如止水 作磐石般默默的长久等待 有憧憬 有期待 等待也是一件甜蜜的事情 终于 我等到了 我遇到了 我欣喜若狂 觉得自己是最幸运的人 我们会是最幸福的 珍惜和她在一起的每一天 每一天 都是无比喜悦的 心中有着开心的事情 有说不完的话 有着说不完的话题 我们会是长长久久在一起的 相融以沫 在没有遇到你之前 就已经为你准备了好多的东西 想在漫长的岁月中 一点点的都给你 不只是东西 也是很久以前满满的憧憬和期待 最纯粹的感情 漫长而醇厚 是很多纯洁和天真 是很多的祈愿和等待 梦中的样子照进了现实 被满满的幸福和温暖包围 惊喜 久久的难以置信 感谢上苍给我的幸运 给予一个平凡的人 每一天 心中都有阳光 都有期望 珍惜每一天 呵护 宠溺 包容 深爱 地久天长 兰因早悟 所愿得偿{/alert}
2022-06-28
互联网备案须知事项及有关规定
什么是网站备案?{callout color="#eee5d8"}网站备案是指根据国家法律法规需要网站的开办者向国家有关部门申请的备案具体分为ICP备案和公安备案。{/callout}ICP备案{alert type="info"} 《互联网信息服务管理办法》指出,互联网信息服务分为经营性和非经营性两类。 国家对经营性互联网信息服务实行许可制度;对非经营性互联网信息服务实行备案制度。未取得许可或者未履行备案手续的,不得从事互联网信息服务。《非经营性互联网信息服务备案管理办法》第五条规定指出,在中华人民共和国境内提供非经营性互联网信息服务,应当依法履行备案手续。未经国家机关单位许可备案,不得在中华人民共和国境内从事非经营性互联网信息服务。备案地址 : https://beian.miit.gov.cn{/alert}公安备案{callout color="#e6d0b3"}《计算机信息网络国际联网安全保护管理办法》第十二条规定:互联单位、接入单位、使用计算机信息网络国际联网的法人和其他组织(包括跨省、自治区、直辖市联网的单位和所属的分支机构),应当自网络正式联通之日起30日内,到所在地的省、自治区、直辖市人民政府公安机关指定的受理机关办理备案手续。目前,公安机关实行网上备案制度。备案地址 : www.beian.gov.cn {/callout}哪些单位需要办理公安备案手续?{alert type="success"}根据相关法律法规规定,凡是接入互联网的单位:包括互联网接入服务单位(ISP)、互联网数据中心(IDC)、互联网信息服务单位(ICP)和国际联网使用单位,都需要到公安机关办理备案手续。{/alert}{alert type="info"}《计算机信息网络国际联网安全保护管理办法》(公安部令第33号) 第十一条:用户在接入单位办理入网手续时,应当填写用户备案表。备案表由公安部监制。第十二条:互联单位、接入单位、使用计算机信息网络国际联网的法人和其他组织(包括跨省、自治区、直辖市联网的单位和所属的分支机构),应当自网络正式连通之日起三十日内,到所在地的省、自治区、直辖市人民政府公安机关指定的受理机关办理备案手续。前款所列单位应当负责将接入本网络的接入单位和用户情况报当地公安机关备案,并及时报告本网络中接入单位和用户的变更情况。第十四条:涉及国家事务、经济建设、国防建设、尖端科学技术等重要领域的单位办理备案手续时,应当出具其行政主管部门的审批证明。前款所列单位的计算机信息网络与国际联网,应当采取相应的安全保护措施。{/alert}不履行备案职责有什么法律后果{alert type="error"}《非经营性互联网信息服务备案管理办法》(信息产业部令第33号)第二十二条:违反本办法第五条的规定,未履行备案手续提供非经营性互联网信息服务的,由住所所在地省通信管理局责令限期改正,并处1万元罚款;拒不改正的,关闭网站。超出备案的项目提供服务的,由住所所在地省通信管理局责令限期改正,并处5千元以上1万元以下罚款;拒不改正的,关闭网站并注销备案。《计算机信息网络国际联网安全保护管理办法》(公安部令第33号)第二十三条:违反本办法第十一条、第十二条规定,不履行备案职责的,由公安机关给予警告或者停机整顿不超过六个月的处罚。{/alert}{alert type="warning"}网站备案是国家规定也是打击不良互联网信息传播维护互联网秩序的重要举措网站所有者应当依据法律法规及时对网站进行备案让网站在合法合规的情况下运营{/alert}{callout color="#e70431"}内容信息来自公安部网安局, 文章原链接 https://mp.weixin.qq.com/s/Fv9GyUA5TtjMzXZFmx2nGQ{/callout}
2022年06月28日
202 阅读
0 评论
0 点赞
2022-06-28
6. SQLServer : 字符串函数
ASCII{callout color="#f5d9b2"} 返回字符表达式中最左侧的字符的 ASCII 代码值。由于ASCII码码位包含128位数字、字母、特殊符号,因此如果传入参数为汉字等码位超过128的字符时结果会与预期不一致。UNICODE函数前128位与ASCII一致,此时可以使用 UNICODE 函数。{/callout}{alert type="info"}-- character_expression : char 或 varchar 类型的表达式。 ASCII ( character_expression ) character_expression : char 或 varchar 类型的表达式。返回值 : int {/alert}CHAR{callout color="#c1f452"}返回具有指定整数代码的单字节字符,由当前数据库默认排序规则的字符集和编码定义。{/callout}{alert type="success"}CHAR ( integer_expression ) integer_expression : 0 到 255 之间的整数。 对于此输入范围外的整数表达式或不表示完整字符的整数表达式,CHAR 返回 NULL 值。 字符超出了返回类型的长度时,CHAR 也会返回 NULL 值。注解 : 使用 CHAR 可将控制字符插入字符字符串中。 此表显示了一些常用的控制字符。控制字符值选项卡char(9)换行char(10)回车char(13)空格char(32){/alert}CHARINDEX{callout color="#f5a432"}函数会在第二个字符表达式中搜索一个字符表达式,这将返回第一个表达式(如果发现存在)的开始位置。索引初始值为1,不存在查询时返回0。{/callout}{alert type="warning"}CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] ) expressionToFind : 一个字符表达式,其中包含要查找的序列。 expressionToFind 限制为 8000 个字符 。expressionToSearch : 要搜索的字符表达式。start_location : 表示搜索开始位置的 integer 或 bigint 表达式 。 如果 start_location 未指定、具有负数值或 0,搜索将从 expressionToSearch 的开头开始 。返回类型 : 如果 expressionToSearch 具有一个 nvarchar(max)、varbinary(max) 或 varchar(max) 数据类型,则为 bigint;否则为 int 。{/alert}CONCAT{callout color="#84af0e"}此函数以端到端的方式返回从串联或联接的两个或更多字符串值生成的字符串。{/callout}{alert type="info"}CONCAT ( string_value1, string_value2 [, string_valueN ] ) string_value : 要与其他值串联的字符串值。 CONCAT 函数需要至少两个 string_value 自变量,并且不得超过 254 个 string_value 自变量。返回类型 : 长度和类型取决于输入的字符串值。{/alert}CONCAT_WS{callout color="#ff9705"}版本最低要求2017此函数以端到端的方式返回从串联或联接的两个或更多字符串值生成的字符串。 它会用第一个函数参数中指定的分隔符分隔连接的字符串值。{/callout}{alert type="success"}CONCAT_WS ( separator, argument1, argument2 [, argumentN]... )分隔符:任何字符类型的表达式(char、ncharnvarchar 或 varchar)。argument1、argument2、argumentN:任何类型的表达式。 CONCAT_WS 函数需要至少两个自变量,并且不得超过 254 个自变量。{/alert}DIFFERENCE{callout color="#8c98f2"}该函数返回一个整数值,用于度量两个不同字符表达式的 SOUNDEX() 值之间的差异。 DIFFERENCE 比较两个不同的 SOUNDEX 值,并返回一个整数值。 该值用于度量 SOUNDEX 值匹配的程度,范围为 0 到 4。 值为 0 表示 SOUNDEX 值之间的相似性较弱或不相似;4 表示与 SOUNDEX 值非常相似,甚至完全相同。DIFFERENCE 和 SOUNDEX 具有排序规则敏感度。{/callout}{alert type="info"}DIFFERENCE ( character_expression , character_expression ) character_expression : 字符数据的字母数字表达式。 character_expression 可以是常量、变量或列。返回类型 : int {/alert}FORMAT{callout color="#d642ff"}2008版本不能使用,最低2012版本返回以指定的格式和可选的区域性格式化的值。 使用 FORMAT 函数将日期/时间和数字值格式化为识别区域设置的字符串。 对于一般的数据类型转换,请使用 CAST 或 CONVERT。{/callout}{alert type="success"}FORMAT( value, format [, culture ] ) value : 支持格式化的数据类型的表达式。format : format 参数必须包含一个有效的 .NET Framework 格式字符串,要么作为标准格式字符串(例如,“C”或“D”),要么作为日期值和数值的自定义字符模式(例如,“MMMM DD, yyyy (dddd)”) 。 不支持组合格式。返回类型 : nvarchar 或 Null{/alert}示例一 :{alert type="info"}--简单 FORMAT 示例 DECLARE @d DATE = '11/22/2020'; SELECT FORMAT( @d, 'd', 'en-US' ) 'US English' ,FORMAT( @d, 'd', 'en-gb' ) 'Great Britain English' ,FORMAT( @d, 'd', 'de-de' ) 'German' ,FORMAT( @d, 'd', 'zh-cn' ) 'Simplified Chinese (PRC)'; SELECT FORMAT( @d, 'D', 'en-US' ) 'US English' ,FORMAT( @d, 'D', 'en-gb' ) 'Great Britain English' ,FORMAT( @d, 'D', 'de-de' ) 'German' ,FORMAT( @d, 'D', 'zh-cn' ) 'Chinese (Simplified PRC)'; --结果如下 US English Great Britain English German Simplified Chinese (PRC) ---------- --------------------- ---------- ------------------------ 11/22/2020 22/11/2020 22.11.2020 2020/11/22 US English Great Britain English German Chinese (Simplified PRC) --------------------------- ---------------------- -------------------------- --------------------------------------- Sunday, November 22, 2020 22 November 2020 Sonntag, 22. November 2020 2020年11月22日 {/alert}示例二 : 使用自定义格式字符串执行 FORMAT{callout color="#f0ad4e"}有关这些格式和其他自定义格式的详细信息,请参阅自定义数字格式字符串。{/callout}{alert type="info"}DECLARE @d DATE = GETDATE(); SELECT FORMAT( @d, 'dd/MM/yyyy', 'en-US' ) AS 'Date' , FORMAT(123456789,'###-##-####') AS 'Custom Number'; ----结果如下 Date Custom Number ---------- ------------- 22/11/2020 123-45-6789 {/alert}示例三 : 用于数值类型的 FORMAT{callout color="#f0ad4e"}有关这些格式和其他数字格式的详细信息,请参阅标准数字格式字符串。{/callout}{alert type="info"}SELECT TOP(5) CurrencyRateID, EndOfDayRate ,FORMAT(EndOfDayRate, 'N', 'en-us') AS 'Number Format' ,FORMAT(EndOfDayRate, 'G', 'en-us') AS 'General Format' ,FORMAT(EndOfDayRate, 'C', 'en-us') AS 'Currency Format' FROM Sales.CurrencyRate ORDER BY CurrencyRateID; {/alert}示例四 : 时间数据类型{alert type="success"}SELECT FORMAT(cast('07:35' as time), N'hh\.mm'); --> returns 07.35 SELECT FORMAT(cast('07:35' as time), N'hh\:mm'); --> returns 07:35 SELECT FORMAT(SYSDATETIME(), N'hh:mm tt'); -- returns 03:46 PM SELECT FORMAT(SYSDATETIME(), N'hh:mm t'); -- returns 03:46 P select FORMAT(CAST('2018-01-01 01:00' AS datetime2), N'hh:mm tt') -- returns 01:00 AM select FORMAT(CAST('2018-01-01 01:00' AS datetime2), N'hh:mm t') -- returns 01:00 A select FORMAT(CAST('2018-01-01 14:00' AS datetime2), N'HH:mm') -- returns 14:00 {/alert}LEN{alert type="info"}-- 返回指定字符串表达式的字符数,其中不包含尾随空格 select LEN("1234"); -- 4{/alert}LEFT{callout color="#4def58"}返回字符串中从左边开始指定个数的字符。{/callout}{alert type="info"}SELECT LEFT('abcdefg',2); {/alert}LOWER、UPPER{callout color="#78ef4d"}将大写字符数据转换为小写字符数据后返回字符表达式。{/callout}{alert type="info"}SELECT LOWER('ABC'); -- abc SELECT UPPER('abc'); -- ABC{/alert}LTRIM、RTRIM{callout color="#f0ad4e"}删除字符串开头(结尾)的空格字符char(32)或其他指定字符。{/callout}{alert type="info"}LTRIM ( character_expression , [ characters ] ) RTRIM ( character_expression , [ characters ] )character_expression : 字符或二进制数据的表达式characters : SQL Server 2022 (16.x) 预览版及更高版本{/alert}REPLACE{callout color="#68ef4d"}用另一个字符串值替换所有出现的指定字符串值{/callout}{alert type="success"}-- 语法 REPLACE( string_expression , string_pattern , string_replacement ) -- 示例 SELECT REPLACE('123123','3','7'); -- 127127{/alert}REPLICATE{callout color="#f0ad4e"}重复指定次数的字符串值{/callout}{alert type="success"}-- 语法 REPLICATE ( string_expression , integer_expression ) -- 示例 SELECT REPLICATE(){/alert}REVERSE{callout color="#f0ad4e"}返回字符串值的反向顺序{/callout}{alert type="info"}select REVERSE('123'); -- 321{/alert}RIGHT{callout color="#4defc7"}返回具有指定字符数的字符串的右边部分{/callout}{alert type="success"}SELECT RIGHT('1234',2); -- 34{/alert}STR{callout color="#4dcfef"}返回从数字数据转换而来的字符数据。字符数据右对齐,具有指定的长度和小数精度{/callout}{alert type="success"}select str('12',3); -- len(str('12',3)) = 3{/alert}SUTFF{callout color="#f0ad4e"}STUFF函数将一个字符串插入到另一个字符串中。它在开始位置删除第一个字符串中指定长度的字符,然后在开始位置将第二个字符串插入第一个字符串中。{/callout}{alert type="info"}-- 语法 STUFF ( character_expression , start , length , replaceWith_expression ) -- 示例 SELECT STUFF('abcdef', 6, 0, 'ijklmn'); -- abcdeijklmnf SELECT STUFF('abcdef', 1, 0, 'ijklmn'); -- abcdeijklmnf SELECT STUFF('abcdef', 2, 3, 'ijklmn'); -- aijklmnefcharacter_expression : 第一个字符串start : 第一个字符串位置(SQL中第一个索引为1)length : 删除的字符个数第二个字符串,将插入在start之前{/alert}SUBSTRING{alert type="info"}select SUBSTRING('1234',2,2); -- 23{/alert}UNICODE{callout color="#f0ad4e"}为输入表达式的第一个字符返回Unicode标准定义的整数值{/callout}{alert type="info"}select UNICODE('A'); -- 65{/alert}
2022年06月28日
217 阅读
0 评论
1 点赞
2022-06-25
5. SQLServer : 数据类型转换
CAST语法 : CAST ( expression AS data_type [ ( length ) ] ) {card-default label="示例" width="100%"}USE AdventureWorks2012; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CAST(ListPrice AS int) LIKE '33%'; GO {/card-default}CONVERT语法 : CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) {card-default label="示例" width="100%"}USE AdventureWorks2012; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CONVERT(int, ListPrice) LIKE '33%'; {/card-default} 不带世纪数位 (yy) (1) 带世纪数位 (yyyy) Standard 输入/输出 (3) - 0 或 100 (1,2) datetime 和 smalldatetime 的默认值 mon dd yyyy hh:miAM(或 PM) 1 101 美国 1 = mm/dd/yy 101 = mm/dd/yyyy 2 102 ANSI 2 = yy.mm.dd 102 = yyyy.mm.dd 3 103 英国/法国 3 = dd/mm/yy 103 = dd/mm/yyyy 4 104 德语 4 = dd.mm.yy 104 = dd.mm.yyyy 5 105 意大利语 5 = dd-mm-yy 105 = dd-mm-yyyy 6 106(1) - 6 = dd mon yy 106 = dd mon yyyy 7 107(1) - 7 = Mon dd, yy 107 = Mon dd, yyyy 8 或 24 108 - hh:mi:ss - 9 或 109 (1,2) 默认格式 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM) 10 110 USA 10 = mm-dd-yy 110 = mm-dd-yyyy 11 111 日本 11 = yy/mm/dd 111 = yyyy/mm/dd 12 112 ISO 12 = yymmdd 112 = yyyymmdd - 13 或 113 (1,2) 欧洲默认格式 + 毫秒 dd mon yyyy hh:mi:ss:mmm(24 小时制) 14 114 - hh:mi:ss:mmm(24 小时制) - 20 或 120 (2) ODBC 规范 yyyy-mm-dd hh:mi:ss(24 小时制) - 21、25 或 121 (2) time、date、datetime2 和 datetimeoffset 的 ODBC 规范(带毫秒)默认值 yyyy-mm-dd hh:mi:ss.mmm(24 小时制) 22 - 美国 mm/dd/yy hh:mi:ss AM(或 PM) - 23 ISO8601 yyyy-mm-dd - 126 (4) ISO8601 yyyy-mm-ddThh:mi:ss.mmm(无空格) 注意: 毫秒 (mmm) 值为 0 时,不会显示毫秒小数部分的值。 例如,值“2012-11-07T18:26:20.000”显示为“2012-11-07T18:26:20”。 - 127(6, 7) 带时区 Z 的 ISO8601。 yyyy-MM-ddThh:mm:ss.fffZ(不带空格) 注意: 毫秒 (mmm) 值为 0 时,不会显示毫秒小数值。 例如,值“2012-11-07T18:26:20.000”显示为“2012-11-07T18:26:20”。 - 130 (1,2) 回历 (5) dd mon yyyy hh:mi:ss:mmmAM 在此样式中,mon 表示完整月份名称的多标记回历 unicode 表示形式。 该值在 SSMS 的默认 US 安装中不会正确呈现。 - 131 (2) 回历 (5) dd/mm/yyyy hh:mi:ss:mmmAM
2022年06月25日
173 阅读
0 评论
0 点赞
2022-06-25
4. SQLServer : 日期时间部分
返回系统日期和时间值的函数精度较高的系统日期和时间函数SYSDATETIME{alert type="info"}语法 : SYSDATETIME()返回值 : 返回包含计算机的日期和时间的 datetime2(7) 值,SQL Server 的实例在该计算机上运行。 返回值不包括时区偏移量。返回值类型 : datetime2(7){/alert}SYSDATETIMEOFFSET{alert type="info"}语法 : SYSDATETIMEOFFSET ()返回值 : 返回包含计算机的日期和时间的 datetimeoffset(7) 值,SQL Server 的实例在该计算机上运行。 返回值包括时区偏移量。返回值类型 : datetimeoffset(7){/alert}SYSUTCDATETIME{alert type="info"}语法 : SYSDATETIME()返回值 : 返回包含计算机的日期和时间的 datetime2(7) 值,SQL Server 的实例正在该计算机上运行。 该函数返回日期和时间作为 UTC 时间(协调世界时)。返回值类型 : datetime2(7){/alert}精度较高低系统日期和时间函数CURRENT_TIMESTAMP{alert type="success"}语法 : CURRENT_TIMESTAMP返回值 : 返回包含计算机的日期和时间的 datetime 值,SQL Server 的实例在该计算机上运行。 返回值不包括时区偏移量。返回值数据类型 : datetime{/alert}GETDATE{alert type="success"}语法 : GETDATE()返回值 : 返回包含计算机的日期和时间的 datetime 值,SQL Server 的实例在该计算机上运行。 返回值不包括时区偏移量。返回值数据类型 : datetime{/alert}GETUTCDATE{alert type="success"}语法 : GETUTCDATE()返回值 : 返回包含计算机的日期和时间的 datetime 值,SQL Server 的实例在该计算机上运行。 该函数返回日期和时间作为 UTC 时间(协调世界时)。返回值数据类型 : datetime{/alert}返回日期和时间部分的函数DATENAME : 返回表示指定 date 的指定 datepart 的字符串{alert type="warning"}语法 : DATENAME ( datepart , date ) 返回值类型: nvarchar{/alert} datepart 缩写形式 year yy, yyyy quarter qq, q month mm, m dayofyear dy, y day dd, d week wk, ww weekday dw, w hour hh minute mi, n second ss, s millisecond ms microsecond mcs nanosecond ns TZoffset tz ISO_WEEK ISOWK, ISOWW DATEPART : 返回表示指定 date 的指定 datepart 的整数{alert type="error"}语法 : DATEPART ( datepart , date )返回值类型 : int {/alert}DAY : 返回表示指定 date 的“日”部分的整数{alert type="info"}语法 : DAY ( date )返回值类型 : int{/alert}MONTH : 返回表示指定 date 的“月”部分的整数{alert type="info"}语法 : MONTH ( date )返回值类型 : int{/alert}YEAR : 返回表示指定 date 的“年”部分的整数{alert type="info"}语法 : YEAR ( date )返回值类型 : int{/alert}从相应部分返回日期和时间值的函数DATEFROMPARTS : 此函数返回映射到指定年、月、日值的 date 值{callout color="#a0f49a"}此函数可在 SQL Server 2012 (11.x) 及更高版本的服务器上执行远程处理。 它不能无法在版本低于 SQL Server 2012 (11.x) 的服务器上执行远程处理。{/callout}{alert type="info"}语法 : DATEFROMPARTS ( year, month, day )返回值类型 : date {/alert}DATETIME2FROMPARTS : 对指定日期和时间参数返回 datetime2 值{callout color="#f0ad4e"}此函数可以在 SQL Server 2012 (11.x) 服务器以及更高版本上远程执行。 但在 SQL Server 2012 (11.x) 之下的服务器版本中无法远程执行。{/callout}{alert type="info"}语法 : DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision ) 返回值类型 : datetime2 {/alert}DATETIMEFROMPARTS : 对指定日期和时间参数返回 datetime 值{callout color="#94e87d"}此函数可以在 SQL Server 2012 (11.x) 服务器以及更高版本上远程执行。 但在 SQL Server 2012 (11.x) 之下的服务器版本中无法远程执行。{/callout}{alert type="info"}语法 : DATETIMEFROMPARTS ( year, month, day, hour, minute, seconds, milliseconds ) 返回值类型 : datetime{/alert}TIMEFROMPARTS : 对指定的时间返回 time 值{alert type="info"}语法 : TIMEFROMPARTS ( hour, minute, seconds, fractions, precision ) 返回值类型 : time {/alert}
2022年06月25日
155 阅读
0 评论
1 点赞
2022-06-13
3. FOR XML (SQL Server) : SELECT 查询将结果作为行集返回
环境要求{alert type="info"} MicroSoft SqlServer 文档 所有版本 SQL Server版本均支持此语法 {/alert}基本初识{alert type="success"}在 FOR XML 子句中,有 RAW、AUTO、EXPLICIT、PATH 四种模式。RAW 模式: RAW 模式在 SELECT 语句返回的行集中为每个行生成一 <个行> 元素。 可以通过编写嵌套 FOR XML 查询来生成 XML 层次结构。AUTO 模式: AUTO 模式将基于指定 SELECT 语句的方式来使用试探性方法在 XML 结果中生成嵌套。 您对生成的 XML 的形状具有最低限度的控制能力。 除了 AUTO 模式的试探性方法生成的 XML 形状之外,还可以编写 FOR XML 查询来生成 XML 层次结构。EXPLICIT模式: EXPLICIT 模式允许对 XML 的形状进行更多控制。 您可以随意混合属性和元素来确定 XML 的形状。PATH模式: PATH 模式与嵌套 FOR XML 查询功能一起以较简单的方式提供了 EXPLICIT 模式的灵活性。{/alert}测试数据库:{card-default label="创建数据库表" width="100%"}CREATE TABLE [dbo].[userTable]( [id] [nvarchar](50) NULL, [encode] [nvarchar](50) NULL, [name] [nvarchar](50) NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[userTable] ADD CONSTRAINT [DF_user_id] DEFAULT (newid()) FOR [id] GO {/card-default} {card-default label="插入测试数据" width="100%"}INSERT [dbo].[userTable] ([id], [encode], [name]) VALUES (N'1A074FE5-BAB3-4B71-932D-393387E94B5F', N'001', N'张三') GO INSERT [dbo].[userTable] ([id], [encode], [name]) VALUES (N'F75F5FA1-D8A1-4076-B840-99941DB9038F', N'002', N'李四') GO INSERT [dbo].[userTable] ([id], [encode], [name]) VALUES (N'FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4', N'003', N'王五') GO INSERT [dbo].[userTable] ([id],[encode], [name]) VALUES (N'79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A', N'004',null) {/card-default}{card-default label="测试表视图" width=""}idencodename1A074FE5-BAB3-4B71-932D-393387E94B5F001张三F75F5FA1-D8A1-4076-B840-99941DB9038F002李四FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4003王五79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A004NULL{/card-default}使用示例:{callout color="#bff990"}将查询结果作为行集返回,即只有一个查询行,此行只有一个查询列。多个指令可使用 逗号 分割开。{/callout}RAW模式示例一 : 基本使用{card-default label="SQL语句" width="100%"}select * from userTable for xml raw ;{/card-default}{card-default label="执行结果" width="100%"}<!--普通使用--> <row id="1A074FE5-BAB3-4B71-932D-393387E94B5F" encode="001" name="张三" /> <row id="F75F5FA1-D8A1-4076-B840-99941DB9038F" encode="002" name="李四" /> <row id="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" encode="003" name="王五" /> <row id="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" encode="004" />{/card-default}示例二 : ELEMENTS 指令{card-default label="SQL语句" width="100%"}select * from userTable for xml raw,ELEMENTS ;{/card-default} {card-default label="执行结果" width="100%"}<!--ELEMENTS指令:检索以元素为中心的 XML--> <row> <id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> </row> <row> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> </row> <row> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> </row> <row> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode> </row>{/card-default}示例三 : XSINIL 添加指令 ELEMENTS{card-default label="SQL语句" width="100%"}select * from userTable for xml raw,ELEMENTS XSINIL ;{/card-default}{card-default label="执行结果" width="100%"}<!--XSINIL 添加指令 ELEMENTS:对为 Null 值的数据生成XML--> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode> <name xsi:nil="true" /> </row>{/card-default}示例四 : XMLDATA 指令{card-default label="SQL语句" width="100%"}select * from userTable for xml raw,XMLDATA ;{/card-default}{card-default label="执行结果" width="100%"}<!-- 返回描述文档结构的 XML-DATA 架构 --> <Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="row" content="empty" model="closed"> <AttributeType name="id" dt:type="string" /> <AttributeType name="encode" dt:type="string" /> <AttributeType name="name" dt:type="string" /> <attribute type="id" /> <attribute type="encode" /> <attribute type="name" /> </ElementType> </Schema> <row xmlns="x-schema:#Schema1" id="1A074FE5-BAB3-4B71-932D-393387E94B5F" encode="001" name="张三" /> <row xmlns="x-schema:#Schema1" id="F75F5FA1-D8A1-4076-B840-99941DB9038F" encode="002" name="李四" /> <row xmlns="x-schema:#Schema1" id="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" encode="003" name="王五" /> <row xmlns="x-schema:#Schema1" id="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" encode="004" />{/card-default}其他{alert type="info"}FOR XML RAW ('xx'): 重命名 <行> 元素。ROOT 指令: 为 FOR XML 生成的 XML 指定根元素。比如:ROOT('MyRoot');XMLSCHEMA 指令: 返回 XSD 架构 。比如:可以使用 XMLSCHEMA ('urn:example.com') 格式指定命名空间 。BINARY BASE64 指令: 返回在 varbinary(max)、binary 类型列中存储的 以 base64 编码格式返回二进制数据。{/alert}AUTO 模式示例一:{card-default label="SQL语句" width="100%"}select * from userTable x for xml AUTO;{/card-default}{card-default label="执行结果" width="100%"}<!-- 可以为表设置别名 同时结合上述指令 --> <userTable id="1A074FE5-BAB3-4B71-932D-393387E94B5F" encode="001" name="张三" /> <userTable id="F75F5FA1-D8A1-4076-B840-99941DB9038F" encode="002" name="李四" /> <userTable id="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" encode="003" name="王五" /> <userTable id="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" encode="004" />{/card-default}示例二:{callout color="#f0ad4e"} 先指定 OrderHeader 表中的列,再指定 Cust 表中的列, 因此,将创建第一个 元素,然后将 子元素添加到其中。{/callout}{card-default label="SQL语句" width="100%"}elect OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status, Cust.CustomerID, Cust.CustomerType from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader where Cust.CustomerID = OrderHeader.CustomerID for xml auto; {/card-default}{card-default label="执行结果" width="100%"}<!-- 可结合 ELEMENTS 等其他指令--> <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5"> <Cust CustomerID="1" CustomerType="S" /> </OrderHeader> ...{/card-default}PATH 模式示例一{card-default label="SQL语句" width="100%"}select * from userTable for xml PATH {/card-default}{card-default label="执行结果" width="100%"}<row> <id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> </row> <row> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> </row> <row> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> </row> <row> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode> </row>{/card-default}示例二{card-default label="SQL语句" width="100%"}select * from userTable for xml PATH('') ;{/card-default}{card-default label="执行结果" width="100%"}<id>1A074FE5-BAB3-4B71-932D-393387E94B5F</id> <encode>001</encode> <name>张三</name> <id>F75F5FA1-D8A1-4076-B840-99941DB9038F</id> <encode>002</encode> <name>李四</name> <id>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</id> <encode>003</encode> <name>王五</name> <id>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</id> <encode>004</encode>{/card-default}示例三{callout color="#58d336"}如果列名称以符号 (@) 开头,并且不包含斜杠标记 (/),则会创建具有相应列值的元素的属性 row在对应的语句中,可根据不同模式对表名、列名进行别名的设置而得到相应得到XML结构{/callout}{card-default label="SQL语句" width="100%"}select id as '@part',encode as '@code',name from userTable for xml PATH{/card-default}{card-default label="执行结果" width="100%"}<row part="1A074FE5-BAB3-4B71-932D-393387E94B5F" code="001"> <name>张三</name> </row> <row part="F75F5FA1-D8A1-4076-B840-99941DB9038F" code="002"> <name>李四</name> </row> <row part="FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4" code="003"> <name>王五</name> </row> <row part="79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A" code="004" />{/card-default}示例四{callout color="#f4d19f"}如果列名不以符号 () @ 开头,但包含斜杠标记 (/) ,则列名表示 XML 层次结构。 {/callout}{card-default label="SQL语句" width="100%"}select ID as 'ID1/ID2',ENCODE,NAME from userTable for xml PATH{/card-default}{card-default label="执行结果" width="100%"}<row> <ID1> <ID2>1A074FE5-BAB3-4B71-932D-393387E94B5F</ID2> </ID1> <ENCODE>001</ENCODE> <NAME>张三</NAME> </row> <row> <ID1> <ID2>F75F5FA1-D8A1-4076-B840-99941DB9038F</ID2> </ID1> <ENCODE>002</ENCODE> <NAME>李四</NAME> </row> <row> <ID1> <ID2>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4</ID2> </ID1> <ENCODE>003</ENCODE> <NAME>王五</NAME> </row> <row> <ID1> <ID2>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A</ID2> </ID1> <ENCODE>004</ENCODE> </row>{/card-default}示例五{callout color="#f2eade"}如果指定的列名是通配符 (*) ,则插入该列的内容就好像没有指定列名一样。 如果此列不是xml 类型的列,则此列的内容将作为文本节点插入.{/callout}{card-default label="SQL语句" width="100%"}select ID as '*',ENCODE,NAME from userTable for xml PATH {/card-default}{card-default label="执行结果" width="100%"}<row>1A074FE5-BAB3-4B71-932D-393387E94B5F<ENCODE>001</ENCODE><NAME>张三</NAME></row> <row>F75F5FA1-D8A1-4076-B840-99941DB9038F<ENCODE>002</ENCODE><NAME>李四</NAME></row> <row>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4<ENCODE>003</ENCODE><NAME>王五</NAME></row> <row>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A<ENCODE>004</ENCODE></row>{/card-default}示例六{callout color="#c4c0ba"}如果列名是某个 XPath 节点测试,将如下表所示映射该列的内容。 如果列名是某个 XPath 节点测试,则该列的内容将映射到相应的节点。 如果该列的 SQL 类型是 xml,将返回一个错误。{/callout}列名行为text()对于名为 text() 的列,该列中的字符串值将被添加为文本节点。comment()对于名为 comment() 的列,该列中的字符串值将被添加为 XML 注释。node()对于节点名称 () 的列,结果与列名称是通配符 () * 时的结果相同。处理指令(名称)如果列名为处理指令,该列中的字符串值将被添加为此处理指令目标名称的 PI 值。{card-default label="SQL语句" width="100%"}select ID as 'text()',ENCODE as 'comment()',NAME as 'node()' from userTable for xml PATH {/card-default}{card-default label="执行结果" width="100%"}<row>1A074FE5-BAB3-4B71-932D-393387E94B5F<!--001-->张三</row> <row>F75F5FA1-D8A1-4076-B840-99941DB9038F<!--002-->李四</row> <row>FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4<!--003-->王五</row> <row>79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A<!--004--></row>{/card-default}示例七{card-default label="SQL语句" width="100%"}select ','+ID from userTable for xml PATH(''){/card-default}{card-default label="执行结果" width="100%"},1A074FE5-BAB3-4B71-932D-393387E94B5F,F75F5FA1-D8A1-4076-B840-99941DB9038F,FF611E9B-2D28-4C53-A4DE-FE67A16D4FD4,79BB7B1A-CAC9-4D2E-A0CE-56C91F8FF76A{/card-default}EXPLICIT 模式{callout color="#37ae9b"}具体可参阅微软官方文档{/callout}
2022年06月13日
221 阅读
0 评论
1 点赞
2022-05-25
前端基础回顾再整理
HTML{alert type="info"}<!--描述 HTML 文档的元数据:每三十秒刷新界面--> <meta http-equiv="refresh" content="2" /><!--网站图标--> <link rel="shortcut icon" href="图片地址" type="image/x-icon" /><!--规定页面上所有链接的默认 URL 和默认目标 置于头部之内--> <base href="..." target="_blank">/*media属性:对两种不同媒介类型使用不同样式表*/ <style type="text/css" media="print"> <style type="text/css" media="screen and (max-height:700px)"> /*应用样式到元素的父元素及其子元素。*/ <style type="text/css" scoped>{card-list}{card-list-item}MDN参考文档{/card-list-item}{card-list-item}Media Types文档参照{/card-list-item}{/card-list}img、、 图像映射<img src="planets.gif" width="145" height="126" alt="Planets" usemap="#planetmap"> <map name="planetmap"> <area shape="rect" coords="0,0,82,126" href="sun.htm" alt="Sun"> <area shape="circle" coords="90,58,3" href="mercur.htm" alt="Mercury"> <area shape="circle" coords="124,58,8" href="venus.htm" alt="Venus"> </map>属性表述属性表述border显示框线bgcolor表格背景cellspacing单元格之间的距离cellpadding单元格内容与其边框之间的空白<!--type: a A i I 1 --> <ol start="50" type="I" > <li>Coffee</li> <li>Tea</li> <li>Milk</li> </ol>iframe<iframe loading="lazy" src="demo_iframe.htm" width="200" height="200" frameborder="0" scrolling="auto"> </iframe>{/alert}HTML5{callout color="#70c8ff"}HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定。HTML5的设计目的是为了在移动设备上支持多媒体。{/callout} {alert type="info"}<!--画布 --> <canvas id="myCanvas" width="200" height="100"></canvas>canvas基本了解表单属性required : 必填placeholder : 提示autofocus : 自动聚焦autocomplete : 自动填充 on/offformaction : 表单提交的URL地址.覆盖form的action属性 与type="submit"配合使用formenctype : 提交到服务器的数据编码 与type="submit"配合使用 “ multipart/form-data ”全局属性hidden : 隐藏contenteditable : 元素是否可编辑accesskey : 配合Alt实现快捷访问超链接{/alert}CSS/CSS3引入和@import引入差别{card-list}{card-list-item}1.本质的差别:link 属于 XHTML 标签,而 @import 完全是 CSS 提供的一种方式。{/card-list-item}{card-list-item}2.加载顺序的差别: 当一个页面被加载的时候(就是被浏览者浏览的时候) ,link 引用的 CSS 会同时被加载,而 @import 引用的 CSS 会等到页面全部被下载完再被加载。所以有时候浏览 @import 加载 CSS 的页面时开始会没有样式(就是闪烁),网速慢的时候还挺明显。{/card-list-item}{card-list-item}3.兼容性的差别: @import 是 CSS2.1 提出的,所以老的浏览器不支持,@import 只有在 IE5 以上的才能识别,而 link 标签无此问题。{/card-list-item}{card-list-item}4.使用 dom(document o bject model文档对象模型 )控制样式时的差别:当使用 javascript 控制 dom 去改变样式的时候,只能使用 link 标签,因为@import 不是 dom 可以控制的。{/card-list-item}{/card-list}文本{alert type="success"}对齐方式 : text-aligncenter : 居中right : 居右justify : 两端对齐文本修饰 : text-decoration: text-decoration-line text-decoration-color text-decoration-styleoverline : 上划线 red dotted/wavyline-through : 管穿线 red dotted/wavyunderline : 下划线 red dotted/wavy文本转换 : text-transformuppercase : 大写lowercase : 小写capitalize : 首字母大写段落中的文本换行 : white-spacenormal : 默认。空白会被浏览器忽略。nowrap : 文本不会换行,文本会在在同一行上继续,直到遇到 br 标签为止。inherit : 规定应该从父元素继承 white-space 属性的值。pre : 空白会被浏览器保留。其行为方式类似 HTML 中的 标签。pre-wrap : 保留空白符序列,但是正常地进行换行。pre-line : 合并空白符序列,但是保留换行符。单词、汉字间隔 : word-spacing字母、汉字 : letter-spacing文本方向 : direction : rtl设置元素的垂直对齐 : vertical-align 值 描述 baseline 默认。元素放置在父元素的基线上。 sub 垂直对齐文本的下标。 super 垂直对齐文本的上标 top 把元素的顶端与行中最高元素的顶端对齐 text-top 把元素的顶端与父元素字体的顶端对齐 middle 把此元素放置在父元素的中部。 bottom 使元素及其后代元素的底部与整行的底部对齐。 text-bottom 把元素的底端与父元素字体的底端对齐。 length 将元素升高或降低指定的高度,可以是负数。 % 使用 "line-height" 属性的百分比值来排列此元素。允许使用负值。 inherit 规定应该从父元素继承 vertical-align 属性的值。 边框合并 : border-collapse:collapse;隐藏元素 : visibility:hidden控制内容溢出元素框时显示的方式 : overflowvisible : 默认值。内容不会被修剪,会呈现在元素框之外。hidden : 内容会被修剪,并且其余内容是不可见的。scroll : 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。auto : 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。inherit : 规定应该从父元素继承 overflow 属性的值。文本溢出显示 : text-overflowellipsis : 显示省略符号 ... 来代表被修剪的文本clip : 剪切文本string : 使用给定的字符串来代表被修剪的文本允许长的内容可以自动换行 : word-wrap:break-word ;元素的总高度和宽度包含内边距和边框 : box-sizing: border-box;box-shadow: h-shadow/水平阴影位置 v-shadow/垂直阴影位置 blur/模糊距离 spread/阴影大小 color/颜色 inset;{callout color="#f4ddbe"}标注内容{/callout}mediatype : all/全部 ; print/打印机,screen/用于电脑屏幕,平板,智能手机等,speech/用于屏幕阅读器not: not是用来排除掉某些特定的设备的,比如 @media not print(非打印设备)。only: 用来定某种特别的媒体类型。all: 所有设备,这个应该经常看到。and :and 操作符用于将多个媒体查询规则组合成单条媒体查询,{/alert}多媒体查询{alert type="info"}1. 在中使用/* 多媒体查询语法 */ @media not|only mediatype and (mediafeature and|or|not mediafeature) { CSS 代码...; } /* 代码一 */ @media screen and (max-width: 600px) { div.example { display: none; } } /* 代码二 */ @media screen and (max-width: 699px) and (min-width: 520px) { ul li a { padding-left: 30px; background: url(email-icon.png) left center no-repeat; } ul li a:before { content: "Email: "; font-style: italic; color: #666666; } } /* 代码三 */ @media screen and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) { ul li a { padding-left: 30px; background: url(email-icon.png) left center no-repeat; } }2. 在中使用<!-- 多媒体查询语法 --> <link rel="stylesheet" media="mediatype and|not|only (expressions)" href="print.css"> <!-- 代码 --> <link rel="stylesheet" media="screen and (min-width:300px)" href="print.css">3. 在@import中使用/* 多媒体查询语法 */ @import url('landscape.css') screen and (orientation:landscape); /* 代码 */ @import url('landscape.css') only screen and (min-width:400px);{/alert}JavaScript标签{alert type="warning"}可以为代码块设置标签,使用break跳出指定代码框cars=["BMW","Volvo","Saab","Ford"]; list: { document.write(cars[0] + "<br>"); document.write(cars[1] + "<br>"); document.write(cars[2] + "<br>"); break list; document.write(cars[3] + "<br>"); document.write(cars[4] + "<br>"); document.write(cars[5] + "<br>"); }{/alert}this{alert type="info"} all() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身。 两者的区别在于第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。{/alert}JavaScript 静态方法{alert type="success"}class Runoob { constructor(name) { this.name = name; } static hello() { return "Hello!!"; } } let noob = new Runoob("菜鸟教程"); // 可以在类中调用 'hello()' 方法 document.getElementById("demo").innerHTML = Runoob.hello(); // 不能通过实例化后的对象调用静态方法 // document.getElementById("demo").innerHTML = noob.hello(); // 以上代码会报错{/alert}JQuery
2022年05月25日
191 阅读
0 评论
0 点赞
2022-05-06
Windows 的包管理工具:Chocolatey的安装及基本使用
网址导航:Chocolatey社区Chocolatey包检索下载资源慢解决方案Chocolatey的安装{card-default label="PowerShell方式安装:" width="100%"}{timeline}{timeline-item color="#19be6b"}1.以管理员方式运行PowerShell:{/timeline-item}{timeline-item color="#ed4014"}2.运行命令:Get-ExecutionPolicy. 如果返回Restricted,则运行Set-ExecutionPolicy AllSigned或Set-ExecutionPolicy Bypass -Scope Process{/timeline-item}{timeline-item color="#7FFFAA"}3.现在运行以下命令:Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')){/timeline-item}{/timeline}{/card-default} {card-default label="cmd方式安装:" width="100%"}{timeline}{timeline-item color="#19be6b"}1.以管理员方式运行cmd.exe:{/timeline-item}{timeline-item color="#7FFFAA"}2.执行以下命令:@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "[System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"{/timeline-item}{/timeline}{/card-default}常用命令操作:{card-default label="查询" width="100%"}升级Chocolatey: choco upgrade chocolatey显示choco安装的应用: choco list --local-only/choco list -lo显示计算机安装的所有应用及版本: choco list -li显示帮助文档: choco list -laichoco list --page=0 --page-size=25查看安装的指定应用的信息: choco info chocolatey查看那些应用需要更新: choco outdated查看 源下载 地址:choco source list {/card-default}{card-default label="安装" width="100%"}choco install=cinst查看已安装应用信息:choco info检查要安装的程序是否是想要的:choco search scripts安装多个软件,同意一切行为:choco install --yes bandizip firefox potplayer teamviewer googlechromechoco install scripts =cinst scriptschoco install ruby --version 2.1.5 -my 安装指定版本{/card-default}{card-default label="升级" width="100%"}choco upgrade --yes Bandizip 升级指定choco upgrade --yes all 升级所有cup scripts = choco upgrade scripts{/card-default}Chocolatey GUI安装:{alert type="info"}安装: choco install chocolateygui升级: choco upgrade chocolateygui卸载: choco uninstall chocolateygui安装Beta版: choco upgrade chocolateygui --pre --source="'https://myget.org/f/chocolateygui'"{/alert}{callout color="#affb8e"}存疑问题可参阅官方文档{/callout}{music id="28987655" color="#56e6a8" autoplay="autoplay"/}
2022年05月06日
168 阅读
0 评论
1 点赞
2022-05-05
Select2:基于 jQuery 的选择框替代品
{callout color="#e6ddd1"}Select2 是一个基于 jQuery 的选择框替代品。它支持搜索、远程数据集和结果分页。{/callout}文档导航:Select2-官方网Select2-中文网Select2-GitHubJSONPlaceholder测试案例: <script> $(function () { $('select').select2({ theme: 'classic', // 占位符 placeholder: '这是我的占位符', // 显示清除选择 allowClear: true, // 开启多选 multiple: false, // 动态创建选项 tags: false, // 远程数据源 ajax: { url: 'http://jsonplaceholder.typicode.com/posts', dataType: 'json', // 搜索参数 data: function (params) { var query = { search: params.term, type: 'public', }; // 查询参数将是 ?search=[term]&type=public return query; }, cache: true, processResults: function (data) { // results结果对象数组中必须含有id和text属性 let datas = $.map(data, function (value) { value.text = value.title; return value; }); return { results: datas, }; }, }, // 自定义下拉结果呈现方式-可为html或者JQ templateResult: templateResult, //自定义选择项在输入框中的呈现方式-可为html或者JQ templateSelection: templateSelection, }); }); function templateSelection(state) { console.log(state); return state.text; } function templateResult(state) { return state.text; } </script>注意事项:为select赋值操作时,需在界面渲染完成相关元素被绑定之后操作。普通select赋值不生效,可链式触发change事件赋值。select.js引入需要在JQ引入之后,当发现错误时可尝试切换JQ版本。若是需要对已经绑定过的同一个select控件切换数据源,可以在再次重新绑定源之前先remove掉上一次绑定的option.
2022年05月05日
131 阅读
0 评论
1 点赞
2022-04-20
2. 分组聚合函数:ROW_NUMBER() OVER (PARTITION BY Column ORDER BY COLUMN
{alert type="success"}分组聚合函数可以对数据分组并排序以按分组增加一个自动递增的列以得到理想的数据。SQLServer版本至少2005版语法:ROW_NUMBER() OVER (PARTITION BY Column1 ORDER BY COLUMN2)Column1: 分组列Column2:排序列演示:1.创建如下表Table_1结构并插入数据:idkysl1kysl22D0357A3-8CCF-442A-B0C1-35DFE2A881CBaa1AB022164-0C61-4321-8E36-3A5A3E35EA4Ecc3314C03C5-D79C-4EA0-82CD-25337935E0A0bb2BD9C0338-8933-4423-81DB-A0AEE05D03F0aa240718F52-F815-4C61-968E-2BAEE248CA81cc416088343-FB69-4917-9677-DAEA3ABB8A09bb57EE903A5-2CF9-4BB5-8B66-33E6AEFEF3FDaa30AF9501D-C4A9-4CC0-B753-CABDDB90B783cc5822DAA22-786C-4B67-827E-A5BB10B60845bb42.执行SQL:select *,ROW_NUMBER() OVER (PARTITION BY kysl ORDER BY KYSL2 )ws from [Table_1] 结果如下:idkysl1kysl2n2D0357A3-8CCF-442A-B0C1-35DFE2A881CBaa11BD9C0338-8933-4423-81DB-A0AEE05D03F0aa227EE903A5-2CF9-4BB5-8B66-33E6AEFEF3FDaa33314C03C5-D79C-4EA0-82CD-25337935E0A0bb21822DAA22-786C-4B67-827E-A5BB10B60845bb4216088343-FB69-4917-9677-DAEA3ABB8A09bb53AB022164-0C61-4321-8E36-3A5A3E35EA4Ecc3140718F52-F815-4C61-968E-2BAEE248CA81cc420AF9501D-C4A9-4CC0-B753-CABDDB90B783cc53{/alert}
2022年04月20日
244 阅读
0 评论
2 点赞
1
2
3
4