1、大于2个单词则采用缩写规则，否则不用缩写。2、缩写的规则采用国际惯用方法：元音字母剔除法，首字母除外。使用单词的头一个或几个字母。组合单词使用如下规则：3、使用变量名中每个有典型意义的单词。如Count of Failure写成FailCnt。4、去掉无用的单词后缀 ing, ed等。如Paging Request写成PagReq。例如：ft=foot,jpn=japan,bld=build，您可以尝试读一下，发音几乎不变，辅音字母是发音的关键。依据此规则，则字母应该缩写如下：project_no=prjct_noapproval_status=apprvl_statuscontract_code=cntrct_codedepartment=department(无需缩写)常见编程命名缩写 通用 缩写 翻译 控件 缩写 翻译 address addr 地址 calendar cdr 日历 application app 应用程序 messageDialog msgdlg 消息框 asynchronization asyn 异步 drawer drw 抽屉 average avg 平均数 buttonGroup btngrp 按钮分组 bitmap bmp 位图 checkBox chk 复选框 buffer buf 缓冲区 container cntr 容器 character char 字符 button btn 按钮 color clr 颜色 comboBox cmb 下拉框 command cmd 命令 lable lbl 标签 delete del 删除 progressBar prg 进度条 destination dest/dst 目的地 pageIndicator pgindic Tab分页控件 decrease dec 减少 radioButton rdo 单选框 device dev 设备 rangeSlider rngsld 滑块 different diff 不同的 scrollView svw 视图滚动 directory dir 目录 scrollBar vsb(垂直)/hsb(水平) 滚动条 document doc 文档 slider sld 滑动器 dynamic dyna 动态的 spinBox spn 旋转框 environment env 环境 splitView spltvw 分割视图 error err 错误 stackView stackvw 堆栈视图 execute exec 执行 statusBar statbr 状态条 group grp 组 swipeView swpvw 滑动控件 image img 图像 switch sw 开关 information info 信息 tabBar tbbr tab栏 initialize init 初始化 textField txtfld 文本输入框 library lib 库 toolBar tlbr 工具栏 maximum max 最大值 toolTip tltp 提示框 minimum min 最小值 toolButton tlbtn 工具按钮 message msg 消息 treeView trvw 树形视图 number num 数字，数，数量 layout lyt 布局 object obj 对象 mainMenu mmnu 菜单栏 parameter Param 参数(形参) groupBox gbx 组合框 package pkg 打包 pictureBox pic 图片框 position pos 位置 listView lvw 列表视图 previous pre 前一个 window win(wnd) 窗口 process/Procedure proc 进程/过程 form frm 表单 pointer ptr 指针 textBox txt 文本框 password pwd 密码 linkLabel llbl 超链接标签框 public pub 公共的 dialog dlg 对话框 reference ref 引用 scrollIndicator scrlindic 滚动指示器 source src 源 string str 字符串 summation sum 和 synchronization sync 同步 system sys 系统 table tbl 表格 temporary tmp 临时 text txt 文本 variable var 变量 addition add 加法/添加 argument arg 实参 array arr 数组 calculate calc 计算 configuration config 配置 column col 列 control ctrl 控制 hexadecimal hex 十六进制 original orig 原件 return rtn 返回 repeat rpt 重复 signal sig 信号 status stat 状态 stack stk 栈区 standard std 标准 trigger trig 触发 background bg 背景 escape esc 退出 user usr 用户 list lst 列表 server srv 服务 manager mgr 管理者 insert ins 插入 point pt 点 function func 函数 back bk 返回 break brk 间断 data dat 日期 edit edt 编辑 flag flg 标志 grid grd 网格 increment inc 增量 length len 长度 oracle ora 甲骨文数据库 panorama pano 全景 print prn 打印 program prg 程序 statistic stat 统计 administrator adm 管理员 database db 数据库 change chg 改变 click clk 点击 compare cmp 比较 coordinates coord 坐标 copy cpy 复制 current cur 当前的 dictionary dict 字典 display disp 显示 driver drv 驱动 extend ex/ext 扩展 frame frm 框架/帧 index idx / ndx 索引 horizontal horz 水平 instance ins 实例 increase inc 增加 link lnk 链接 middle mid 中间 multiply mul 乘 resource res 资源 select sel 选择 test tst 测试 vertical vert 垂直
主要内容Markdown是什么？谁创造了它？为什么要使用它？怎么使用？谁在用？尝试一下正文1. Markdown是什么？Markdown是一种轻量级标记语言，它以纯文本形式(易读、易写、易更改)编写文档，并最终以HTML格式发布。 Markdown也可以理解为将以MARKDOWN语法编写的语言转换成HTML内容的工具。2. 谁创造了它？它由Aaron Swartz和John Gruber共同设计，Aaron Swartz就是那位于去年（2013年1月11日）自杀,有着开挂一般人生经历的程序员。维基百科对他的介绍是：软件工程师、作家、政治组织者、互联网活动家、维基百科人。 他有着足以让你跪拜的人生经历：14岁参与RSS 1.0规格标准的制订。2004年入读斯坦福，之后退学。2005年创建Infogami，之后与Reddit合并成为其合伙人。2010年创立求进会（Demand Progress），积极参与禁止网络盗版法案（SOPA）活动，最终该提案被撤回。2011年7月19日，因被控从MIT和JSTOR下载480万篇学术论文并以免费形式上传于网络被捕。2013年1月自杀身亡。天才都有早逝的归途。3. 为什么要使用它？它是易读（看起来舒服）、易写（语法简单）、易更改纯文本。处处体现着极简主义的影子。兼容HTML，可以转换为HTML格式发布。跨平台使用。越来越多的网站支持Markdown。更方便清晰地组织你的电子邮件。（Markdown-here, Airmail）摆脱Word（我不是认真的）。4. 怎么使用？如果不算扩展，Markdown的语法绝对简单到让你爱不释手。Markdown语法主要分为如下几大部分：标题，段落，区块引用，代码区块，强调，列表，分割线，链接，图片，反斜杠 \，符号'`'。4.1 标题两种形式： 1）使用=和-标记一级和二级标题。一级标题 ========= 二级标题 ---------效果：一级标题二级标题2）使用#，可表示1-6级标题。# 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题效果：一级标题二级标题三级标题四级标题五级标题六级标题4.2 段落段落的前后要有空行，所谓的空行是指没有文字内容。若想在段内强制换行的方式是使用两个以上空格加上回车（引用中换行省略回车）。4.3 区块引用在段落的每行或者只在第一行使用符号>,还可使用多个嵌套引用，如：> 区块引用 >> 嵌套引用效果：区块引用嵌套引用4.4 代码区块代码区块的建立是在每行加上4个空格或者一个制表符（如同写代码一样）。如 普通段落：void main() {printf("Hello, Markdown."); } 代码区块：void main() { printf("Hello, Markdown."); } 注意:需要和普通段落之间存在空行。4.5 强调在强调内容两侧分别加上*或者_，如：*斜体*，_斜体_ **粗体**，__粗体__效果：斜体，_斜体_ 粗体，__粗体__4.6 列表使用·、+、或-标记无序列表，如：-（+*） 第一项-（+*） 第二项- （+*）第三项注意：标记后面最少有一个_空格_或_制表符_。若不在引用区块中，必须和前方段落之间存在空行。效果：第一项第二项第三项有序列表的标记方式是将上述的符号换成数字,并辅以.，如：1 . 第一项 2 . 第二项 3 . 第三项效果：第一项第二项第三项4.7 分割线分割线最常使用就是三个或以上*，还可以使用-和_。4.8 链接链接可以由两种形式生成：行内式和参考式。 行内式：[younghz的Markdown库](https:://github.com/younghz/Markdown "Markdown")。效果：younghz的Markdown库。参考式：[younghz的Markdown库1][1] [younghz的Markdown库2][2] [1]:https:://github.com/younghz/Markdown "Markdown" [2]:https:://github.com/younghz/Markdown "Markdown"效果：younghz的Markdown库1 younghz的Markdown库2注意：上述的[1]:https:://github.com/younghz/Markdown "Markdown"不出现在区块中。4.9 图片添加图片的形式和链接相似，只需在链接的基础上前方加一个！。4.10 反斜杠\相当于反转义作用。使符号成为普通符号。4.11 符号 `起到标记作用。如：`ctrl+a`效果：ctrl+a5. 谁在用？Markdown的使用者：GitHub简书Stack OverflowApolloMoodleReddit等等6. 尝试一下Chrome下的插件诸如stackedit与markdown-here等非常方便，也不用担心平台受限。在线的dillinger.io评价也不错Windowns下的MarkdownPad也用过，不过免费版的体验不是很好。Mac下的Mou是国人贡献的，口碑很好。Linux下的ReText不错。当然，最终境界永远都是笔下是语法，心中格式化 :)。注意：不同的Markdown解释器或工具对相应语法（扩展语法）的解释效果不尽相同，具体可参见工具的使用说明。虽然有人想出面搞一个所谓的标准化的Markdown，[没想到还惹怒了健在的创始人John Gruber](http://blog.codinghorror.com/standard-markdown-is-now-common-markdown/)。以上基本是所有traditonal markdown的语法。其它：列表的使用(非traditonal markdown)：用|表示表格纵向边界，表头和表内容用-隔开，并可用:进行对齐设置，两边都有:则表示居中，若不加:则默认左对齐。代码库链接MarkDownhttps://github.com/younghz/MarkdownMarkDownCopyhttps://github.com/younghz/Markdown关于其它扩展语法可参见具体工具的使用说明。
{ "extends": "stylelint-config-standard", "plugins": [ "stylelint-order" ], "rules": { "string-quotes": "single", "order/order": [ "declarations", "custom-properties", "dollar-variables", "rules", "at-rules" ], "order/properties-order": [ "position", "z-index", "top", "bottom", "left", "right", "float", "clear", "columns", "columns-width", "columns-count", "column-rule", "column-rule-width", "column-rule-style", "column-rule-color", "column-fill", "column-span", "column-gap", "display", "grid", "grid-template-rows", "grid-template-columns", "grid-template-areas", "grid-auto-rows", "grid-auto-columns", "grid-auto-flow", "grid-column-gap", "grid-row-gap", "grid-template", "grid-template-rows", "grid-template-columns", "grid-template-areas", "grid-gap", "grid-row-gap", "grid-column-gap", "grid-area", "grid-row-start", "grid-row-end", "grid-column-start", "grid-column-end", "grid-column", "grid-column-start", "grid-column-end", "grid-row", "grid-row-start", "grid-row-end", "flex", "flex-grow", "flex-shrink", "flex-basis", "flex-flow", "flex-direction", "flex-wrap", "justify-content", "align-content", "align-items", "align-self", "order", "table-layout", "empty-cells", "caption-side", "border-collapse", "border-spacing", "list-style", "list-style-type", "list-style-position", "list-style-image", "ruby-align", "ruby-merge", "ruby-position", "box-sizing", "width", "min-width", "max-width", "height", "min-height", "max-height", "padding", "padding-top", "padding-right", "padding-bottom", "padding-left", "margin", "margin-top", "margin-right", "margin-bottom", "margin-left", "border", "border-width", "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", "border-style", "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", "border-color", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "border-image", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat", "border-top", "border-top-width", "border-top-style", "border-top-color", "border-top", "border-right-width", "border-right-style", "border-right-color", "border-bottom", "border-bottom-width", "border-bottom-style", "border-bottom-color", "border-left", "border-left-width", "border-left-style", "border-left-color", "border-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius", "border-top-left-radius", "outline", "outline-width", "outline-color", "outline-style", "outline-offset", "overflow", "overflow-x", "overflow-y", "resize", "visibility", "font", "font-style", "font-variant", "font-weight", "font-stretch", "font-size", "font-family", "font-synthesis", "font-size-adjust", "font-kerning", "line-height", "text-align", "text-align-last", "vertical-align", "text-overflow", "text-justify", "text-transform", "text-indent", "text-emphasis", "text-emphasis-style", "text-emphasis-color", "text-emphasis-position", "text-decoration", "text-decoration-color", "text-decoration-style", "text-decoration-line", "text-underline-position", "text-shadow", "white-space", "overflow-wrap", "word-wrap", "word-break", "line-break", "hyphens", "letter-spacing", "word-spacing", "quotes", "tab-size", "orphans", "writing-mode", "text-combine-upright", "unicode-bidi", "text-orientation", "direction", "text-rendering", "font-feature-settings", "font-language-override", "image-rendering", "image-orientation", "image-resolution", "shape-image-threshold", "shape-outside", "shape-margin", "color", "background", "background-image", "background-position", "background-size", "background-repeat", "background-origin", "background-clip", "background-attachment", "background-color", "background-blend-mode", "isolation", "clip-path", "mask", "mask-image", "mask-mode", "mask-position", "mask-size", "mask-repeat", "mask-origin", "mask-clip", "mask-composite", "mask-type", "filter", "box-shadow", "opacity", "transform-style", "transform", "transform-box", "transform-origin", "perspective", "perspective-origin", "backface-visibility", "transition", "transition-property", "transition-duration", "transition-timing-function", "transition-delay", "animation", "animation-name", "animation-duration", "animation-timing-function", "animation-delay", "animation-iteration-count", "animation-direction", "animation-fill-mode", "animation-play-state", "scroll-behavior", "scroll-snap-type", "scroll-snap-destination", "scroll-snap-coordinate", "cursor", "touch-action", "caret-color", "ime-mode", "object-fit", "object-position", "content", "counter-reset", "counter-increment", "will-change", "pointer-events", "all", "page-break-before", "page-break-after", "page-break-inside", "widows" ], "no-empty-source": null, "property-no-vendor-prefix": [ false, { "ignoreProperties": [ "background-clip" ] } ], "number-leading-zero": "never", "number-no-trailing-zeros": true, "length-zero-no-unit": true, "value-list-comma-space-after": "always", "declaration-colon-space-after": "always", "value-list-max-empty-lines": 0, "shorthand-property-no-redundant-values": true, "declaration-block-no-duplicate-properties": false, "declaration-block-no-redundant-longhand-properties": true, "declaration-block-semicolon-newline-after": "always", "block-closing-brace-newline-after": "always", "media-feature-colon-space-after": "always", "media-feature-range-operator-space-after": "always", "at-rule-name-space-after": "always", "indentation": 2, "no-eol-whitespace": true, "string-no-newline": null } }
1.改 Mysql 配置文件 my.cnf(默认位置/etc/my.cnf)[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' 2.改已有的 database、table 和 column 字符集msql> ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; msql> ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; msql> ALTER TABLE table_name modify column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 其中的 database_name、table_name、column_name 要替换成你对应的数据库名、表名、列名。VARCHAR 的长度值也是。3.重启 Mysql 并检查更改后的字符集设置service mysql restart 查看字符集设置: msql> SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'; +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ rows in set (0.00 sec)
环境变量配置http-client.env.json{ "development": { "host": "dev.mcake.admin", "id-value": 12345, "port": 80, "username": "", "password": "", "my-var": "my-dev-value" }, "production": { "host": "example.com", "id-value": 6789, "username": "", "password": "", "my-var": "my-prod-value" } }列子### 用户登录 POST http://{{host}}/admin/login Content-Type: application/x-www-form-urlencoded;charset=UTF-8 username=luobing.yin&password=mcake123 > {%client.global.set("token", response.headers.valueOf('Set-Cookie').match(/token=(.*?);/)[1]);client.log(client.global.get('token'));%} # ### 配送地图api GET http://{{host}}:{{port}} /api /area /search /?cityId=110 ?type=2 Referer: http://dev.mcake.admin/admin.html Accept: */* Cookie: token={{token}}; page-rows=10 X-Requested-With: XMLHttpRequest ### 配送地图api GET http://{{host}}:{{port}} /api /Region /search ?spm=m-46-74-77 Referer: http://dev.mcake.admin/admin.html Accept: */* Cookie: token={{token}}; page-rows=10 X-Requested-With: XMLHttpRequest level=1&pid=0
.eslintrc{ // 环境定义了预定义的全局变量。 "env": { //环境定义了预定义的全局变量。更多在官网查看 "browser": true, "node": true, "commonjs": true, "amd": true, "es6": true, "mocha": true }, // JavaScript 语言选项 "parserOptions": { // ECMAScript 版本 "ecmaVersion": 6, "sourceType": "module", //设置为 "script" (默认) 或 "module"（如果你的代码是 ECMAScript 模块)。 //想使用的额外的语言特性: "ecmaFeatures": { // 允许在全局作用域下使用 return 语句 "globalReturn": true, // impliedStric "impliedStrict": true, // 启用 JSX "jsx": true, "modules": true } }, //-----让eslint支持 JSX start "plugins": [ ], "extends": [ ], //-----让eslint支持 JSX end /** * "off" 或 0 - 关闭规则 * "warn" 或 1 - 开启规则，使用警告级别的错误：warn (不会导致程序退出), * "error" 或 2 - 开启规则，使用错误级别的错误：error (当被触发的时候，程序会退出) */ "rules": { //////////////// // 可能的错误 // //////////////// // 禁止条件表达式中出现赋值操作符 "no-cond-assign": 2, // 禁用 console "no-console": 0, // 禁止在条件中使用常量表达式 // if (false) { // doSomethingUnfinished(); // } //cuowu "no-constant-condition": 2, // 禁止在正则表达式中使用控制字符 ：new RegExp("\x1f") "no-control-regex": 2, // 数组和对象键值对最后一个逗号， never参数：不能带末尾的逗号, always参数：必须带末尾的逗号， // always-multiline：多行模式必须带逗号，单行模式不能带逗号 "comma-dangle": [ 1, "never" ], // 禁用 debugger "no-debugger": 2, // 禁止 function 定义中出现重名参数 "no-dupe-args": 2, // 禁止对象字面量中出现重复的 key "no-dupe-keys": 2, // 禁止重复的 case 标签 "no-duplicate-case": 2, // 禁止空语句块 "no-empty": 2, // 禁止在正则表达式中使用空字符集 (/^abc[]/) "no-empty-character-class": 2, // 禁止对 catch 子句的参数重新赋值 "no-ex-assign": 2, // 禁止不必要的布尔转换 "no-extra-boolean-cast": 2, // 禁止不必要的括号 //(a * b) + c;//报错 "no-extra-parens": 0, // 禁止不必要的分号 "no-extra-semi": 2, // 禁止对 function 声明重新赋值 "no-func-assign": 2, // 禁止在嵌套的块中出现 function 或 var 声明 "no-inner-declarations": [ 2, "functions" ], // 禁止 RegExp 构造函数中无效的正则表达式字符串 "no-invalid-regexp": 2, // 禁止在字符串和注释之外不规则的空白 "no-irregular-whitespace": 2, // 禁止在 in 表达式中出现否定的左操作数 "no-negated-in-lhs": 2, // 禁止把全局对象 (Math 和 JSON) 作为函数调用 错误：var math = Math(); "no-obj-calls": 2, // 禁止直接使用 Object.prototypes 的内置属性 "no-prototype-builtins": 0, // 禁止正则表达式字面量中出现多个空格 "no-regex-spaces": 2, // 禁用稀疏数组 "no-sparse-arrays": 2, // 禁止出现令人困惑的多行表达式 "no-unexpected-multiline": 2, // 禁止在return、throw、continue 和 break语句之后出现不可达代码 "no-unreachable": 2, // 要求使用 isNaN() 检查 NaN "use-isnan": 2, // 强制使用有效的 JSDoc 注释 "valid-jsdoc": 0, // 强制 typeof 表达式与有效的字符串进行比较 // typeof foo === "undefimed" 错误 "valid-typeof": 2, ////////////// // 最佳实践 // ////////////// // 定义对象的set存取器属性时，强制定义get "accessor-pairs": 2, // 强制数组方法的回调函数中有 return 语句 "array-callback-return": 0, // 强制把变量的使用限制在其定义的作用域范围内 "block-scoped-var": 0, // 限制圈复杂度，也就是类似if else能连续接多少个 "complexity": [ 2, 9 ], // 要求 return 语句要么总是指定返回的值，要么不指定 "consistent-return": 0, // 强制所有控制语句使用一致的括号风格 "curly": [ 2, "all" ], // switch 语句强制 default 分支，也可添加 // no default 注释取消此次警告 "default-case": 2, // 强制object.key 中 . 的位置，参数: // property，'.'号应与属性在同一行 // object, '.' 号应与对象名在同一行 "dot-location": [ 2, "property" ], // 强制使用.号取属性 // 参数： allowKeywords：true 使用保留字做属性名时，只能使用.方式取属性 // false 使用保留字做属性名时, 只能使用[]方式取属性 e.g [2, {"allowKeywords": false}] // allowPattern: 当属性名匹配提供的正则表达式时，允许使用[]方式取值,否则只能用.号取值 e.g [2, {"allowPattern": "^[a-z]+(_[a-z]+)+$"}] "dot-notation": [ 2, { "allowKeywords": false } ], // 使用 === 替代 == allow-null允许null和undefined== "eqeqeq": [ 2, "allow-null" ], // 要求 for-in 循环中有一个 if 语句 "guard-for-in": 2, // 禁用 alert、confirm 和 prompt "no-alert": 0, // 禁用 arguments.caller 或 arguments.callee "no-caller": 2, // 不允许在 case 子句中使用词法声明 "no-case-declarations": 2, // 禁止除法操作符显式的出现在正则表达式开始的位置 "no-div-regex": 2, // 禁止 if 语句中有 return 之后有 else "no-else-return": 0, // 禁止出现空函数.如果一个函数包含了一条注释，它将不会被认为有问题。 "no-empty-function": 2, // 禁止使用空解构模式no-empty-pattern "no-empty-pattern": 2, // 禁止在没有类型检查操作符的情况下与 null 进行比较 "no-eq-null": 1, // 禁用 eval() "no-eval": 2, // 禁止扩展原生类型 "no-extend-native": 2, // 禁止不必要的 .bind() 调用 "no-extra-bind": 2, // 禁用不必要的标签 "no-extra-label:": 0, // 禁止 case 语句落空 "no-fallthrough": 2, // 禁止数字字面量中使用前导和末尾小数点 "no-floating-decimal": 2, // 禁止使用短符号进行类型转换(!!fOO) "no-implicit-coercion": 0, // 禁止在全局范围内使用 var 和命名的 function 声明 "no-implicit-globals": 1, // 禁止使用类似 eval() 的方法 "no-implied-eval": 2, // 禁止 this 关键字出现在类和类对象之外 "no-invalid-this": 0, // 禁用 __iterator__ 属性 "no-iterator": 2, // 禁用标签语句 "no-labels": 2, // 禁用不必要的嵌套块 "no-lone-blocks": 2, // 禁止在循环中出现 function 声明和表达式 "no-loop-func": 1, // 禁用魔术数字(3.14什么的用常量代替) "no-magic-numbers": [ 1, { "ignore": [ 0, -1, 1 ] } ], // 禁止使用多个空格 "no-multi-spaces": 2, // 禁止使用多行字符串，在 JavaScript 中，可以在新行之前使用斜线创建多行字符串 "no-multi-str": 2, // 禁止对原生对象赋值 "no-native-reassign": 2, // 禁止在非赋值或条件语句中使用 new 操作符 "no-new": 2, // 禁止对 Function 对象使用 new 操作符 "no-new-func": 0, // 禁止对 String，Number 和 Boolean 使用 new 操作符 "no-new-wrappers": 2, // 禁用八进制字面量 "no-octal": 2, // 禁止在字符串中使用八进制转义序列 "no-octal-escape": 2, // 不允许对 function 的参数进行重新赋值 "no-param-reassign": 0, // 禁用 __proto__ 属性 "no-proto": 2, // 禁止使用 var 多次声明同一变量 "no-redeclare": 2, // 禁用指定的通过 require 加载的模块 "no-return-assign": 0, // 禁止使用 javascript: url "no-script-url": 0, // 禁止自我赋值 "no-self-assign": 2, // 禁止自身比较 "no-self-compare": 2, // 禁用逗号操作符 "no-sequences": 2, // 禁止抛出非异常字面量 "no-throw-literal": 2, // 禁用一成不变的循环条件 "no-unmodified-loop-condition": 2, // 禁止出现未使用过的表达式 "no-unused-expressions": 0, // 禁用未使用过的标签 "no-unused-labels": 2, // 禁止不必要的 .call() 和 .apply() "no-useless-call": 2, // 禁止不必要的字符串字面量或模板字面量的连接 "no-useless-concat": 2, // 禁用不必要的转义字符 "no-useless-escape": 0, // 禁用 void 操作符 "no-void": 0, // 禁止在注释中使用特定的警告术语 "no-warning-comments": 0, // 禁用 with 语句 "no-with": 2, // 强制在parseInt()使用基数参数 "radix": 2, // 要求所有的 var 声明出现在它们所在的作用域顶部 "vars-on-top": 0, // 要求 IIFE 使用括号括起来 "wrap-iife": [ 2, "any" ], // 要求或禁止 “Yoda” 条件 "yoda": [ 2, "never" ], // 要求或禁止使用严格模式指令 "strict": 0, ////////////// // 变量声明 // ////////////// // 要求或禁止 var 声明中的初始化(初值) "init-declarations": 0, // 不允许 catch 子句的参数与外层作用域中的变量同名 "no-catch-shadow": 0, // 禁止删除变量 "no-delete-var": 2, // 不允许标签与变量同名 "no-label-var": 2, // 禁用特定的全局变量 "no-restricted-globals": 0, // 禁止 var 声明 与外层作用域的变量同名 "no-shadow": 0, // 禁止覆盖受限制的标识符 "no-shadow-restricted-names": 2, // 禁用未声明的变量，除非它们在 /*global */ 注释中被提到 "no-undef": 2, // 禁止将变量初始化为 undefined "no-undef-init": 2, // 禁止将 undefined 作为标识符 "no-undefined": 0, // 禁止出现未使用过的变量 "no-unused-vars": [ 2, { "vars": "all", "args": "none" } ], // 不允许在变量定义之前使用它们 "no-use-before-define": 0, ////////////////////////// // Node.js and CommonJS // ////////////////////////// // require return statements after callbacks "callback-return": 0, // 要求 require() 出现在顶层模块作用域中 "global-require": 1, // 要求回调函数中有容错处理 "handle-callback-err": [ 2, "^(err|error)$" ], // 禁止混合常规 var 声明和 require 调用 "no-mixed-requires": 0, // 禁止调用 require 时使用 new 操作符 "no-new-require": 2, // 禁止对 __dirname 和 __filename进行字符串连接 "no-path-concat": 0, // 禁用 process.env "no-process-env": 0, // 禁用 process.exit() "no-process-exit": 0, // 禁用同步方法 "no-sync": 0, ////////////// // 风格指南 // ////////////// // 指定数组的元素之间要以空格隔开(, 后面)， never参数：[ 之前和 ] 之后不能带空格，always参数：[ 之前和 ] 之后必须带空格 "array-bracket-spacing": [ 2, "never" ], // 禁止或强制在单行代码块中使用空格(禁用) "block-spacing": [ 1, "never" ], //强制使用一致的缩进 第二个参数为 "tab" 时，会使用tab， // if while function 后面的{必须与if在同一行，java风格。 "brace-style": [ 2, "1tbs", { "allowSingleLine": true } ], // 双峰驼命名格式 "camelcase": 2, // 控制逗号前后的空格 "comma-spacing": [ 2, { "before": false, "after": true } ], // 控制逗号在行尾出现还是在行首出现 (默认行尾) // http://eslint.org/docs/rules/comma-style "comma-style": [ 2, "last" ], //"SwitchCase" (默认：0) 强制 switch 语句中的 case 子句的缩进水平 // 以方括号取对象属性时，[ 后面和 ] 前面是否需要空格, 可选参数 never, always "computed-property-spacing": [ 2, "never" ], // 用于指统一在回调函数中指向this的变量名，箭头函数中的this已经可以指向外层调用者，应该没卵用了 // e.g [0,"that"] 指定只能 var that = this. that不能指向其他任何值，this也不能赋值给that以外的其他值 "consistent-this": [ 1, "that" ], // 强制使用命名的 function 表达式 "func-names": 0, // 文件末尾强制换行 "eol-last": 2, "indent": [ 2, 4, { "SwitchCase": 1 } ], // 强制在对象字面量的属性中键和值之间使用一致的间距 "key-spacing": [ 2, { "beforeColon": false, "afterColon": true } ], // 强制使用一致的换行风格 "linebreak-style": [ 1, "unix" ], // 要求在注释周围有空行 ( 要求在块级注释之前有一空行) "lines-around-comment": [ 1, { "beforeBlockComment": true } ], // 强制一致地使用函数声明或函数表达式，方法定义风格，参数： // declaration: 强制使用方法声明的方式，function f(){} e.g [2, "declaration"] // expression：强制使用方法表达式的方式，var f = function() {} e.g [2, "expression"] // allowArrowFunctions: declaration风格中允许箭头函数。 e.g [2, "declaration", { "allowArrowFunctions": true }] "func-style": 0, // 强制回调函数最大嵌套深度 5层 "max-nested-callbacks": [ 1, 5 ], // 禁止使用指定的标识符 "id-blacklist": 0, // 强制标识符的最新和最大长度 "id-length": 0, // 要求标识符匹配一个指定的正则表达式 "id-match": 0, // 强制在 JSX 属性中一致地使用双引号或单引号 "jsx-quotes": 0, // 强制在关键字前后使用一致的空格 (前后腰需要) "keyword-spacing": 2, // 强制一行的最大长度 "max-len": [ 1, 200 ], // 强制最大行数 "max-lines": 0, // 强制 function 定义中最多允许的参数数量 "max-params": [ 1, 7 ], // 强制 function 块最多允许的的语句数量 "max-statements": [ 1, 200 ], // 强制每一行中所允许的最大语句数量 "max-statements-per-line": 0, // 要求构造函数首字母大写 （要求调用 new 操作符时有首字母大小的函数，允许调用首字母大写的函数时没有 new 操作符。） "new-cap": [ 2, { "newIsCap": true, "capIsNew": false } ], // 要求调用无参构造函数时有圆括号 "new-parens": 2, // 要求或禁止 var 声明语句后有一行空行 "newline-after-var": 0, // 禁止使用 Array 构造函数 "no-array-constructor": 2, // 禁用按位运算符 "no-bitwise": 0, // 要求 return 语句之前有一空行 "newline-before-return": 0, // 要求方法链中每个调用都有一个换行符 "newline-per-chained-call": 1, // 禁用 continue 语句 "no-continue": 0, // 禁止在代码行后使用内联注释 "no-inline-comments": 0, // 禁止 if 作为唯一的语句出现在 else 语句中 "no-lonely-if": 0, // 禁止混合使用不同的操作符 "no-mixed-operators": 0, // 不允许空格和 tab 混合缩进 "no-mixed-spaces-and-tabs": 2, // 不允许多个空行 "no-multiple-empty-lines": [ 2, { "max": 2 } ], // 不允许否定的表达式 "no-negated-condition": 0, // 不允许使用嵌套的三元表达式 "no-nested-ternary": 0, // 禁止使用 Object 的构造函数 "no-new-object": 2, // 禁止使用一元操作符 ++ 和 -- "no-plusplus": 0, // 禁止使用特定的语法 "no-restricted-syntax": 0, // 禁止 function 标识符和括号之间出现空格 "no-spaced-func": 2, // 不允许使用三元操作符 "no-ternary": 0, // 禁用行尾空格 "no-trailing-spaces": 2, // 禁止标识符中有悬空下划线_bar "no-underscore-dangle": 0, // 禁止可以在有更简单的可替代的表达式时使用三元操作符 "no-unneeded-ternary": 2, // 禁止属性前有空白 "no-whitespace-before-property": 0, // 强制花括号内换行符的一致性 "object-curly-newline": 0, // 强制在花括号中使用一致的空格 "object-curly-spacing": 0, // 强制将对象的属性放在不同的行上 "object-property-newline": 0, // 强制函数中的变量要么一起声明要么分开声明 "one-var": [ 2, { "initialized": "never" } ], // 要求或禁止在 var 声明周围换行 "one-var-declaration-per-line": 0, // 要求或禁止在可能的情况下要求使用简化的赋值操作符 "operator-assignment": 0, // 强制操作符使用一致的换行符 "operator-linebreak": [ 2, "after", { "overrides": { "?": "before", ":": "before" } } ], // 要求或禁止块内填充 "padded-blocks": 0, // 要求对象字面量属性名称用引号括起来 "quote-props": 0, // 强制使用一致的反勾号、双引号或单引号 "quotes": [ 2, "single", "avoid-escape" ], // 要求使用 JSDoc 注释 "require-jsdoc": 1, // 要求或禁止使用分号而不是 ASI（这个才是控制行尾部分号的，） "semi": [ 2, "always" ], // 强制分号之前和之后使用一致的空格 "semi-spacing": 0, // 要求同一个声明块中的变量按顺序排列 "sort-vars": 0, // 强制在块之前使用一致的空格 "space-before-blocks": [ 2, "always" ], // 强制在 function的左括号之前使用一致的空格 "space-before-function-paren": [ 0, "always" ], // 强制在圆括号内使用一致的空格 "space-in-parens": [ 2, "never" ], // 要求操作符周围有空格 "space-infix-ops": 2, // 强制在一元操作符前后使用一致的空格 "space-unary-ops": [ 2, { "words": true, "nonwords": false } ], // 强制在注释中 // 或 /* 使用一致的空格 "spaced-comment": [ 2, "always", { "markers": [ "global", "globals", "eslint", "eslint-disable", "*package", "!" ] } ], // 要求或禁止 Unicode BOM "unicode-bom": 0, // 要求正则表达式被括号括起来 "wrap-regex": 0, ////////////// // ES6.相关 // ////////////// // 要求箭头函数体使用大括号 "arrow-body-style": 2, // 要求箭头函数的参数使用圆括号 "arrow-parens": 2, "arrow-spacing": [ 2, { "before": true, "after": true } ], // 强制在子类构造函数中用super()调用父类构造函数，TypeScrip的编译器也会提示 "constructor-super": 0, // 强制 generator 函数中 * 号周围使用一致的空格 "generator-star-spacing": [ 2, { "before": true, "after": true } ], // 禁止修改类声明的变量 "no-class-assign": 2, // 不允许箭头功能，在那里他们可以混淆的比较 "no-confusing-arrow": 0, // 禁止修改 const 声明的变量 "no-const-assign": 2, // 禁止类成员中出现重复的名称 "no-dupe-class-members": 2, // 不允许复制模块的进口 "no-duplicate-imports": 0, // 禁止 Symbol 的构造函数 "no-new-symbol": 2, // 允许指定模块加载时的进口 "no-restricted-imports": 0, // 禁止在构造函数中，在调用 super() 之前使用 this 或 super "no-this-before-super": 2, // 禁止不必要的计算性能键对象的文字 "no-useless-computed-key": 0, // 要求使用 let 或 const 而不是 var "no-var": 0, // 要求或禁止对象字面量中方法和属性使用简写语法 "object-shorthand": 0, // 要求使用箭头函数作为回调 "prefer-arrow-callback": 0, // 要求使用 const 声明那些声明后不再被修改的变量 "prefer-const": 0, // 要求在合适的地方使用 Reflect 方法 "prefer-reflect": 0, // 要求使用扩展运算符而非 .apply() "prefer-spread": 0, // 要求使用模板字面量而非字符串连接 "prefer-template": 0, // Suggest using the rest parameters instead of arguments "prefer-rest-params": 0, // 要求generator 函数内有 yield "require-yield": 0, // enforce spacing between rest and spread operators and their expressions "rest-spread-spacing": 0, // 强制模块内的 import 排序 "sort-imports": 0, // 要求或禁止模板字符串中的嵌入表达式周围空格的使用 "template-curly-spacing": 1, // 强制在 yield* 表达式中 * 周围使用空格 "yield-star-spacing": 2 } }
js error log report(function () { // 统计域名 && 1px base64 image data var analyticsDomain = (location.protocol || '') + '//acc.zhangmen.com'; var base64Iamge = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="; // 设置用户标示 var accId; var __accId = (+new Date) + '' + Math.random(); if (window.localStorage) { accId = localStorage.getItem('__accId__') || __accId; (accId == __accId) && localStorage.setItem('__accId__', accId); } else { accId = (document.cookie.match(/__accId__=([^;]*);?/) || [])[1] || __accId; accId == __accId && (document.cookie = "__accId__=" + escape(accId) + ";expires=" + (new Date('2580/01/01')).toGMTString()); } // 构造统计方法 var __acc__ = window.__acc__ = function (obj) { if (typeof obj !== 'object') return; var logerMessage; try { obj.accId = obj.accId || accId; // 追加访问标示 logerMessage = JSON.stringify(obj); } catch (e) { logerMessage = '{"accId": "' + accId + '", "action": "' + obj.action + '", "message": "' + obj.message + '", "ua": "' + navigator.userAgent + '", "error": "Parse JSON Error"}'; } var accUrl = analyticsDomain + '/acc?logInfo=' + encodeURIComponent(logerMessage); var imgDom = new Image; imgDom.src = accUrl; setTimeout(function () { imgDom.src = base64Iamge; // 放弃图片加载，防止出现请求无返回数据的情况 }, 500); }; // 默认错误统计，只监控 js 执行报错，只能用于 web 环境错误收集 var lastErrorInfos = {}; window.onerror = function (msg, url, line, col, error) { var nowDate = +new Date; var errorSign = msg + (url || '') + (line || '') + (col || ''); if (lastErrorInfos[errorSign]) return; // 增加报错限制，相同错误只提示一遍 __acc__({ action: 'window.onerror', message: { message: msg, url: url, line: line, col: col, error: error }, time: nowDate, project: location.host, path: location.pathname, url: location.href.replace(location.origin, ''), ua: navigator.userAgent }); lastErrorInfos[errorSign] = nowDate; return true; // 阻止控制台显示错误 }; })();
js 埋点统计数据/* * 埋点数据: { timestamp, actionName, actionValue, function1, function2, function3, * platform, * source, * userId, * userMobile, * userName } */ ;(function () { var dataPool = []; // 需上传数据池 var configOption = {}; // 配置信息 var uploadDataLimit = 20; // 条数限制 var uploadTimeLimit = 1 * 60 * 1000; // 时间限制 var uploadInited = false; var ua = navigator.userAgent; var dev = location.host !== "chat.zmlearn.com"; var uploadPath = '//log' + (dev && '-test' || '') + '.zmlearn.com/api/pcAnalytics'; window.zmClientAcc = zmClientAcc; window.uploadServer = uploadServer; window.initZmClientAcc = initZmClientAcc; // 绑定点击事件，记录点击操作 window.addEventListener('click', function (event) { var target = event.target; var actionName = target && target.getAttribute('data-accAction') || '点击事件'; var functions = target && target.getAttribute('data-accFunctions'); var clickId = target && target.getAttribute('data-clickId'); while (target && !functions) { target = target.parentElement; functions = target && target.getAttribute('data-accFunctions'); clickId = target && target.getAttribute('data-clickId'); } try { functions = eval("(" + functions + ")"); functions && zmClientAcc(actionName, functions, '', clickId); } catch(e) {} }, true); // 缓存有历史数据，获取并提交 try { var localData = localStorage.getItem('zmAccData'); var tempData = (JSON.parse(tempData) || {}).datas; if (tempData && tempData.length) { dataPool = tempData; uploadServer(); } } catch(e) {} // 记录埋点信息，暂存内存或本地或上传 /* * actionName 事件类型 * functions 功能点 * event_type 0表示统计事件次数，1表示统计事件时长 * actionValue event_type为0时，每点击1次，记录1次；event_type为1时，记录时长，按秒计算 * event_id 事件id * tracker_type 1表示设备信息，2表示事件信息 * eventPara 用来统计自定义分析维度 */ function zmClientAcc(actionName, functions, actionValue, event_id, event_type) { var newItem = { timestamp: +new Date, actionName: actionName || '点击次数', actionValue: actionValue || 1, event_id: event_id || '', tracker_type: 2, event_type: event_type || 0, eventPara: '', userAgent: ua, requestPath: location.href }; forEach(functions || [], function(fun, index) { newItem['function' + (index + 1)] = fun; }); dataPool.push(newItem); checkForUpload(); window.debugZmClientAcc && console.log(actionName, functions, dataPool, newItem); } // 用户相关信息完整，根据阈值上传服务器，否则记录本地 function checkForUpload() { var dataPoolLength = dataPool.length; var timeNow = +new Date; uploadServer.lastUploadTime = uploadServer.lastUploadTime || (timeNow + uploadTimeLimit); var hitLimit = dataPoolLength > uploadDataLimit || (timeNow - uploadServer.lastUploadTime) > uploadTimeLimit; if (uploadInited && hitLimit) { uploadServer(); } else { tryKeepLocal(dataPoolLength); } } // 记录上传数据，清空临时数据池，更新本地缓存，上传数据 function uploadServer() { uploadServer.lastUploadTime = +new Date; var uploadData = dataPool; dataPool = []; tryKeepLocal(-1, 1); // 扩展每条提交数据的内容 forEach(uploadData, function (item) { for (var key in configOption) { configOption.hasOwnProperty(key) && (item[key] = configOption[key]); } }); var xhr = new XMLHttpRequest(); xhr.timeout = 3000; xhr.open('POST', uploadPath, true); xhr.setRequestHeader("Content-type","application/json; charset=utf-8"); xhr.onreadystatechange = xhr.onload = xhr.ontimeout = xhr.onerror = xhr.upload.onprogress = function(event) { window.debugZmClientAcc && console.log(event); }; xhr.send(JSON.stringify(uploadData)); } function tryKeepLocal(dataPoolLength, checkTime) { tryKeepLocal.timer && clearTimeout(tryKeepLocal.timer); // 按间隔暂存统计数据到本地，防止数据丢失，设置检测阈值，防止频繁更新 tryKeepLocal.timer = setTimeout(function () { if (dataPoolLength != dataPool.length) { try { localStorage.setItem('zmAccData', JSON.stringify({ timestamp: +new Date, datas: dataPool.slice(-500) })); } catch(e){} } }, checkTime || 1000); } function initZmClientAcc(paramMap) { Object.assign(configOption, paramMap); uploadInited = Object.values(paramMap).every(it => it); } function forEach(list, cb) { if (!(list instanceof Array) || (typeof cb != 'function')) return; for (var i = 0; i < list.length; i++) { cb(list[i], i); } } })();
git-log-weekly-report 生成周报#!/bin/bash # Generates git changelog grouped by day and output it to file # # optional parameters # -a to filter by author # -s to select start date # -e to select end date # -o to save it to file # -r to specify the repository path NEXT=$(date +%F) SINCE="last.Monday" UNTIL=$NEXT AUTHOR=$(git config user.email) OUTPUT="$(date +%F).log" while getopts "a:s:e:o:r:" arg do case $arg in a) AUTHOR=$OPTARG ;; s) SINCE=$OPTARG ;; e) UNTIL=$OPTARG ;; o) OUTPUT=$OPTARG ;; r) REPO=$OPTARG ;; ?) echo "unknown argument" exit 1 ;; esac done ( git -C "${REPO}" log --author="${AUTHOR}" --since="${SINCE}" --until="${UNTIL}" --format="%cd" --date=short | sort -u | while read DATE ; do GIT_PAGER=$(git -C "${REPO}" log --no-merges --reverse --format="* %s" --since="${DATE} 00:00:00" --until="${DATE} 23:59:59" --author="${AUTHOR}") if [ ! -z "$GIT_PAGER" ] then echo "[${DATE}]" echo "${GIT_PAGER}" echo fi done ) > $OUTPUT echo "log is written to ${OUTPUT}"
<?php define('dir', __DIR__); $dirArr = explode('/', dir); $md = dir . '/' . $dirArr[count($dirArr) - 1] . '.md'; if (is_file($md)) unlink($md); // 生成md文件 // file_put_contents($md, listdir(dir, '', 0)); $notExt = ['.exe', '.doc', '.docx', '.pdf', '.sh~', '.rar', '.zip', '.tar','.gif','.jpg','.png','.mod']; $listArr = listdir(dir); ksort($listArr, SORT_STRING | SORT_FLAG_CASE | SORT_NATURAL); // 对键排序 // var_dump($listArr);die; // asort($listArr, SORT_STRING | SORT_FLAG_CASE | SORT_NATURAL); // 对值排序 $content = getContent($listArr); $tree = "###目录###" . PHP_EOL . "```package" . PHP_EOL . listTree($listArr) . PHP_EOL . '```'; file_put_contents($md, $content . PHP_EOL . $tree); function getContent($arr, $level = 0) { global $notExt; $content = ''; foreach ($arr as $k => $v) { if (is_array($v)) { $content .= '###' . getPlaceholder($level, '#') . $k . "###" . getPlaceholder($level, '#') . PHP_EOL; $content .= getContent($v, $level + 1); } else if(!in_array(getExt($v),$notExt)){ echo getExt($v); $fileArr = explode('/', str_replace('\\', '/', $v)); $file = $fileArr[count($fileArr) - 1]; $content .= '###' . getPlaceholder($level, '#') . $file . "###" . getPlaceholder($level, '#') . PHP_EOL; if (strtolower(getExt($v))==='.md') { $content .= str_replace('.', '', getExt($file)) . PHP_EOL .mb_convert_encoding( file_get_contents($v), 'UTF-8', 'UTF-8,GBK,GB2312,BIG5' ). PHP_EOL ; }else{ $content .= '```' . str_replace('.', '', getExt($file)) . PHP_EOL .mb_convert_encoding( file_get_contents($v), 'UTF-8', 'UTF-8,GBK,GB2312,BIG5' ). PHP_EOL . '```' . PHP_EOL; } } } return $content; } function listTree($arr, $level = 0) { $content = ''; $placeholder = getPlaceholder($level); foreach ($arr as $k => $v) { if (is_array($v)) { $content .= $placeholder . '└── ' . $k . PHP_EOL; $content .= listTree($v, $level + 1); } else { $fileArr = explode('/', str_replace('\\', '/', $v)); $file = $fileArr[count($fileArr) - 1]; $content .= $placeholder . '├── ' . $file . PHP_EOL; } } return $content; } function listdir($dir) { global $notExt; //定义一个数组 $files = array(); $notInArr = ['.', '..', '.git', '.idea', '.DS_Store', 'MD', 'MD.php', '.gitignore', '.gitattributes', 'LICENSE']; //检测是否存在文件 if (is_dir($dir)) { //打开目录 if ($handle = opendir($dir)) { //返回当前文件的条目 while (($file = readdir($handle)) !== false) { //去除特殊目录 if (!in_array($file, $notInArr)) { //判断子目录是否还存在子目录 if (is_dir($dir . "/" . $file)) { // 递归调用本函数，再次获取目录 $files[$file] = listdir($dir . "/" . $file); } else { if (in_array(getExt($file), $notExt)) continue; // 获取目录数组 $files[] = $dir . "/" . $file; } } } //关闭文件夹 closedir($handle); //返回文件夹数组 return $files; } } } /** * 获取占位符 * @param $level * @param string $placeholder * @return string */ function getPlaceholder($level, $placeholder = ' ') { for ($i = 0; $i < $level; $i++) { $placeholder .= $placeholder; } return substr($placeholder, 0, strlen($placeholder) - 1); } /** * 获取文件后戳 * @param $filename * @return bool|string */ function getExt($filename) { $pos = strrpos($filename, '.'); $ext = substr($filename, $pos); return $ext; }