|
@@ -1,3 +1,611 @@
|
|
|
-# web-admin-tools-revit
|
|
|
+# 前端团队代码规范
|
|
|
|
|
|
-后台管理系统模板-revit
|
|
|
+## 命名规范
|
|
|
+全部采取小写方式,以下划线分隔。
|
|
|
+
|
|
|
+例:
|
|
|
+```
|
|
|
+my_project_name
|
|
|
+```
|
|
|
+
|
|
|
+### 目录命名
|
|
|
+参照项目命名规则;
|
|
|
+
|
|
|
+有复数结构时,要采用复数命名法。
|
|
|
+
|
|
|
+例:
|
|
|
+```
|
|
|
+scripts, styles, images, data_models
|
|
|
+```
|
|
|
+
|
|
|
+### JS文件命名
|
|
|
+#### 参照项目命名规则。
|
|
|
+
|
|
|
+例:
|
|
|
+```
|
|
|
+account_model.js
|
|
|
+```
|
|
|
+
|
|
|
+CSS, SCSS文件命名
|
|
|
+#### 参照项目命名规则。
|
|
|
+
|
|
|
+例:
|
|
|
+```
|
|
|
+retina_sprites.scss
|
|
|
+```
|
|
|
+
|
|
|
+#### HTML文件命名
|
|
|
+参照项目命名规则。
|
|
|
+
|
|
|
+例:
|
|
|
+```
|
|
|
+error_report.html
|
|
|
+```
|
|
|
+
|
|
|
+## DOM规范
|
|
|
+
|
|
|
+### 属性顺序
|
|
|
+
|
|
|
+属性应该按照特定的顺序出现以保证易读性;
|
|
|
+
|
|
|
+- <code>class</code>
|
|
|
+- <code>id</code>
|
|
|
+- <code>name</code>
|
|
|
+- <code>data-*</code>
|
|
|
+- <code>src</code> <code>for</code> <code>type</code> <code>href</code> <code>value</code> <code>max-length</code> <code>max</code> <code>min</code> <code>pattern</code>
|
|
|
+- <code>placeholder</code> <code>title</code> <code>alt</code>
|
|
|
+- <code>aria-*</code> <code>role</code>
|
|
|
+- <code>required</code> <code>readonly</code> <code>disabled</code>
|
|
|
+
|
|
|
+class是为高可复用组件设计的,所以应处在第一位;
|
|
|
+
|
|
|
+id更加具体且应该尽量少使用,所以将它放在第二位。
|
|
|
+
|
|
|
+````
|
|
|
+<a class="..." id="..." data-modal="toggle" href="#">Example link</a>
|
|
|
+
|
|
|
+<input class="form-control" type="text">
|
|
|
+
|
|
|
+<img src="..." alt="...">
|
|
|
+
|
|
|
+````
|
|
|
+
|
|
|
+
|
|
|
+## css,scss
|
|
|
+
|
|
|
+### 空格
|
|
|
+以下几种情况不需要空格:
|
|
|
+
|
|
|
+- 属性名后
|
|
|
+- 多个规则的分隔符','前
|
|
|
+- !important '!'后
|
|
|
+- 属性值中'('后和')'前
|
|
|
+- 行末不要有多余的空格
|
|
|
+
|
|
|
+以下几种情况需要空格:
|
|
|
+
|
|
|
+- 属性值前
|
|
|
+- 选择器'>', '+', '~'前后
|
|
|
+- '{'前
|
|
|
+- !important '!'前
|
|
|
+- @else 前后
|
|
|
+- 属性值中的','后
|
|
|
+- 注释'/'后和'/'前
|
|
|
+
|
|
|
+```
|
|
|
+/* not good */
|
|
|
+.element {
|
|
|
+ color :red! important;
|
|
|
+ background-color: rgba(0,0,0,.5);
|
|
|
+}
|
|
|
+
|
|
|
+/* good */
|
|
|
+.element {
|
|
|
+ color: red !important;
|
|
|
+ background-color: rgba(0, 0, 0, .5);
|
|
|
+}
|
|
|
+
|
|
|
+/* not good */
|
|
|
+.element ,
|
|
|
+.dialog{
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* good */
|
|
|
+.element,
|
|
|
+.dialog {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/* not good */
|
|
|
+.element>.dialog{
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* good */
|
|
|
+.element > .dialog{
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* not good */
|
|
|
+.element{
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* good */
|
|
|
+.element {
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* not good */
|
|
|
+@if{
|
|
|
+ ...
|
|
|
+}@else{
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* good */
|
|
|
+@if {
|
|
|
+ ...
|
|
|
+} @else {
|
|
|
+ ...
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 命名
|
|
|
+- 类名使用小写字母,以中划线分隔
|
|
|
+- id采用驼峰式命名
|
|
|
+- scss中的变量、函数、混合、placeholder采用驼峰式命名
|
|
|
+
|
|
|
+```
|
|
|
+/* class */
|
|
|
+.element-content {
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* id */
|
|
|
+#myDialog {
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* 变量 */
|
|
|
+$colorBlack: #000;
|
|
|
+
|
|
|
+/* 函数 */
|
|
|
+@function pxToRem($px) {
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* 混合 */
|
|
|
+@mixin centerBlock {
|
|
|
+ ...
|
|
|
+}
|
|
|
+
|
|
|
+/* placeholder */
|
|
|
+%myDialog {
|
|
|
+ ...
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## JavaScript
|
|
|
+
|
|
|
+### 空行
|
|
|
+
|
|
|
+以下几种情况需要空行:
|
|
|
+
|
|
|
+- 变量声明后(当变量声明在代码块的最后一行时,则无需空行)
|
|
|
+- 注释前(当注释在代码块的第一行时,则无需空行)
|
|
|
+- 代码块后(在函数调用、数组、对象中则无需空行)
|
|
|
+- 文件最后保留一个空行
|
|
|
+
|
|
|
+```
|
|
|
+// need blank line after variable declaration
|
|
|
+var x = 1;
|
|
|
+
|
|
|
+// not need blank line when variable declaration is last expression in the current block
|
|
|
+if (x >= 1) {
|
|
|
+ var y = x + 1;
|
|
|
+}
|
|
|
+
|
|
|
+var a = 2;
|
|
|
+
|
|
|
+// need blank line before line comment
|
|
|
+a++;
|
|
|
+
|
|
|
+function b() {
|
|
|
+ // not need blank line when comment is first line of block
|
|
|
+ return a;
|
|
|
+}
|
|
|
+
|
|
|
+// need blank line after blocks
|
|
|
+for (var i = 0; i < 2; i++) {
|
|
|
+ if (true) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ continue;
|
|
|
+}
|
|
|
+
|
|
|
+var obj = {
|
|
|
+ foo: function() {
|
|
|
+ return 1;
|
|
|
+ },
|
|
|
+
|
|
|
+ bar: function() {
|
|
|
+ return 2;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// not need blank line when in argument list, array, object
|
|
|
+func(
|
|
|
+ 2,
|
|
|
+ function() {
|
|
|
+ a++;
|
|
|
+ },
|
|
|
+ 3
|
|
|
+);
|
|
|
+
|
|
|
+var foo = [
|
|
|
+ 2,
|
|
|
+ function() {
|
|
|
+ a++;
|
|
|
+ },
|
|
|
+ 3
|
|
|
+];
|
|
|
+
|
|
|
+var foo = {
|
|
|
+ a: 2,
|
|
|
+ b: function() {
|
|
|
+ a++;
|
|
|
+ },
|
|
|
+ c: 3
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+### 文档注释
|
|
|
+
|
|
|
+各类标签@param, @method等;
|
|
|
+
|
|
|
+建议在以下情况下使用:
|
|
|
+
|
|
|
+- 所有常量
|
|
|
+- 所有函数
|
|
|
+- 所有类
|
|
|
+
|
|
|
+```
|
|
|
+/**
|
|
|
+ * @func
|
|
|
+ * @desc 一个带参数的函数
|
|
|
+ * @param {string} a - 参数a
|
|
|
+ * @param {number} b=1 - 参数b默认值为1
|
|
|
+ * @param {string} c=1 - 参数c有两种支持的取值</br>1—表示x</br>2—表示xx
|
|
|
+ * @param {object} d - 参数d为一个对象
|
|
|
+ * @param {string} d.e - 参数d的e属性
|
|
|
+ * @param {string} d.f - 参数d的f属性
|
|
|
+ * @param {object[]} g - 参数g为一个对象数组
|
|
|
+ * @param {string} g.h - 参数g数组中一项的h属性
|
|
|
+ * @param {string} g.i - 参数g数组中一项的i属性
|
|
|
+ * @param {string} [j] - 参数j是一个可选参数
|
|
|
+ */
|
|
|
+function foo(a, b, c, d, g, j) {
|
|
|
+ ...
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 引号
|
|
|
+
|
|
|
+最外层统一使用单引号。
|
|
|
+
|
|
|
+```
|
|
|
+// not good
|
|
|
+var x = "test";
|
|
|
+
|
|
|
+// good
|
|
|
+var y = 'foo',
|
|
|
+ z = '<div id="test"></div>';
|
|
|
+```
|
|
|
+
|
|
|
+### 变量命名
|
|
|
+
|
|
|
+- 标准变量采用驼峰式命名(除了对象的属性外,主要是考虑到cgi返回的数据)
|
|
|
+- 'ID'在变量名中全大写
|
|
|
+- 'URL'在变量名中全大写
|
|
|
+- 'Android'在变量名中大写第一个字母
|
|
|
+- 'iOS'在变量名中小写第一个,大写后两个字母
|
|
|
+- 常量全大写,用下划线连接
|
|
|
+- 构造函数,大写第一个字母
|
|
|
+- jquery对象必须以'$'开头命名
|
|
|
+
|
|
|
+```
|
|
|
+var thisIsMyName;
|
|
|
+
|
|
|
+var goodID;
|
|
|
+
|
|
|
+var reportURL;
|
|
|
+
|
|
|
+var AndroidVersion;
|
|
|
+
|
|
|
+var iOSVersion;
|
|
|
+
|
|
|
+var MAX_COUNT = 10;
|
|
|
+
|
|
|
+function Person(name) {
|
|
|
+ this.name = name;
|
|
|
+}
|
|
|
+
|
|
|
+// not good
|
|
|
+var body = $('body');
|
|
|
+
|
|
|
+// good
|
|
|
+var $body = $('body');
|
|
|
+```
|
|
|
+
|
|
|
+### 变量声明
|
|
|
+
|
|
|
+一个函数作用域中所有的变量声明尽量提到函数首部,用一个var声明,不允许出现两个连续的var声明。
|
|
|
+
|
|
|
+```
|
|
|
+function doSomethingWithItems(items) {
|
|
|
+ // use one var
|
|
|
+ var value = 10,
|
|
|
+ result = value + 10,
|
|
|
+ i,
|
|
|
+ len;
|
|
|
+
|
|
|
+ for (i = 0, len = items.length; i < len; i++) {
|
|
|
+ result += 10;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 函数
|
|
|
+
|
|
|
+无论是函数声明还是函数表达式,'('前不要空格,但'{'前一定要有空格;
|
|
|
+
|
|
|
+函数调用括号前不需要空格;
|
|
|
+
|
|
|
+立即执行函数外必须包一层括号;
|
|
|
+
|
|
|
+不要给inline function命名;
|
|
|
+
|
|
|
+参数之间用', '分隔,注意逗号后有一个空格。
|
|
|
+
|
|
|
+```
|
|
|
+// no space before '(', but one space before'{'
|
|
|
+var doSomething = function(item) {
|
|
|
+ // do something
|
|
|
+};
|
|
|
+
|
|
|
+function doSomething(item) {
|
|
|
+ // do something
|
|
|
+}
|
|
|
+
|
|
|
+// not good
|
|
|
+doSomething (item);
|
|
|
+
|
|
|
+// good
|
|
|
+doSomething(item);
|
|
|
+
|
|
|
+// requires parentheses around immediately invoked function expressions
|
|
|
+(function() {
|
|
|
+ return 1;
|
|
|
+})();
|
|
|
+
|
|
|
+// not good
|
|
|
+[1, 2].forEach(function x() {
|
|
|
+ ...
|
|
|
+});
|
|
|
+
|
|
|
+// good
|
|
|
+[1, 2].forEach(function() {
|
|
|
+ ...
|
|
|
+});
|
|
|
+
|
|
|
+// not good
|
|
|
+var a = [1, 2, function a() {
|
|
|
+ ...
|
|
|
+}];
|
|
|
+
|
|
|
+// good
|
|
|
+var a = [1, 2, function() {
|
|
|
+ ...
|
|
|
+}];
|
|
|
+
|
|
|
+// use ', ' between function parameters
|
|
|
+var doSomething = function(a, b, c) {
|
|
|
+ // do something
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+### 数组、对象
|
|
|
+
|
|
|
+对象属性名不需要加引号;
|
|
|
+
|
|
|
+对象以缩进的形式书写,不要写在一行;
|
|
|
+
|
|
|
+数组、对象最后不要有逗号。
|
|
|
+
|
|
|
+```
|
|
|
+// not good
|
|
|
+var a = {
|
|
|
+ 'b': 1
|
|
|
+};
|
|
|
+
|
|
|
+var a = {b: 1};
|
|
|
+
|
|
|
+var a = {
|
|
|
+ b: 1,
|
|
|
+ c: 2,
|
|
|
+};
|
|
|
+
|
|
|
+// good
|
|
|
+var a = {
|
|
|
+ b: 1,
|
|
|
+ c: 2
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+### 括号
|
|
|
+
|
|
|
+下列关键字后必须有大括号(即使代码块的内容只有一行):if, else,for, while, do, switch, try, catch, finally, with。
|
|
|
+
|
|
|
+```
|
|
|
+// not good
|
|
|
+if (condition)
|
|
|
+ doSomething();
|
|
|
+
|
|
|
+// good
|
|
|
+if (condition) {
|
|
|
+ doSomething();
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### jshint
|
|
|
+用'===', '!=='代替'==', '!=';
|
|
|
+
|
|
|
+for-in里一定要有hasOwnProperty的判断;
|
|
|
+
|
|
|
+不要在内置对象的原型上添加方法,如Array, Date;
|
|
|
+
|
|
|
+不要在内层作用域的代码里声明了变量,之后却访问到了外层作用域的同名变量;
|
|
|
+
|
|
|
+变量不要先使用后声明;
|
|
|
+
|
|
|
+不要在一句代码中单单使用构造函数,记得将其赋值给某个变量;
|
|
|
+
|
|
|
+不要在同个作用域下声明同名变量;
|
|
|
+
|
|
|
+不要在一些不需要的地方加括号,例:delete(a.b);
|
|
|
+
|
|
|
+不要使用未声明的变量(全局变量需要加到.jshintrc文件的globals属性里面);
|
|
|
+
|
|
|
+不要声明了变量却不使用;
|
|
|
+
|
|
|
+不要在应该做比较的地方做赋值;
|
|
|
+
|
|
|
+debugger不要出现在提交的代码里;
|
|
|
+
|
|
|
+数组中不要存在空元素;
|
|
|
+
|
|
|
+不要在循环内部声明函数;
|
|
|
+
|
|
|
+不要像这样使用构造函数,例:new function () { ... }, new Object;
|
|
|
+
|
|
|
+```
|
|
|
+// not good
|
|
|
+if (a == 1) {
|
|
|
+ a++;
|
|
|
+}
|
|
|
+
|
|
|
+// good
|
|
|
+if (a === 1) {
|
|
|
+ a++;
|
|
|
+}
|
|
|
+
|
|
|
+// good
|
|
|
+for (key in obj) {
|
|
|
+ if (obj.hasOwnProperty(key)) {
|
|
|
+ // be sure that obj[key] belongs to the object and was not inherited
|
|
|
+ console.log(obj[key]);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// not good
|
|
|
+Array.prototype.count = function(value) {
|
|
|
+ return 4;
|
|
|
+};
|
|
|
+
|
|
|
+// not good
|
|
|
+var x = 1;
|
|
|
+
|
|
|
+function test() {
|
|
|
+ if (true) {
|
|
|
+ var x = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ x += 1;
|
|
|
+}
|
|
|
+
|
|
|
+// not good
|
|
|
+function test() {
|
|
|
+ console.log(x);
|
|
|
+
|
|
|
+ var x = 1;
|
|
|
+}
|
|
|
+
|
|
|
+// not good
|
|
|
+new Person();
|
|
|
+
|
|
|
+// good
|
|
|
+var person = new Person();
|
|
|
+
|
|
|
+// not good
|
|
|
+delete(obj.attr);
|
|
|
+
|
|
|
+// good
|
|
|
+delete obj.attr;
|
|
|
+
|
|
|
+// not good
|
|
|
+if (a = 10) {
|
|
|
+ a++;
|
|
|
+}
|
|
|
+
|
|
|
+// not good
|
|
|
+var a = [1, , , 2, 3];
|
|
|
+
|
|
|
+// not good
|
|
|
+var nums = [];
|
|
|
+
|
|
|
+for (var i = 0; i < 10; i++) {
|
|
|
+ (function(i) {
|
|
|
+ nums[i] = function(j) {
|
|
|
+ return i + j;
|
|
|
+ };
|
|
|
+ }(i));
|
|
|
+}
|
|
|
+
|
|
|
+// not good
|
|
|
+var singleton = new function() {
|
|
|
+ var privateVar;
|
|
|
+
|
|
|
+ this.publicMethod = function() {
|
|
|
+ privateVar = 1;
|
|
|
+ };
|
|
|
+
|
|
|
+ this.publicMethod2 = function() {
|
|
|
+ privateVar = 2;
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+# point-standard
|
|
|
+
|
|
|
+## Project setup
|
|
|
+```
|
|
|
+npm install
|
|
|
+```
|
|
|
+
|
|
|
+### Compiles and hot-reloads for development
|
|
|
+```
|
|
|
+npm run serve
|
|
|
+```
|
|
|
+
|
|
|
+### Compiles and minifies for production
|
|
|
+```
|
|
|
+npm run build
|
|
|
+```
|
|
|
+
|
|
|
+### Run your tests
|
|
|
+```
|
|
|
+npm run test
|
|
|
+```
|
|
|
+
|
|
|
+### Lints and fixes files
|
|
|
+```
|
|
|
+npm run lint
|
|
|
+```
|
|
|
+
|
|
|
+### Customize configuration
|
|
|
+See [Configuration Reference](https://cli.vuejs.org/config/).
|