From 3b03f87a02458f719e2eb4bf112a13441b427d14 Mon Sep 17 00:00:00 2001 From: ‘chensiAb’ <‘chenchenco03@163.com’> Date: Tue, 25 Mar 2025 13:54:34 +0800 Subject: [PATCH] Merge branch 'master' of ssh://dev.zhiheiot.com:29418/mob-components --- _cursor.ai/rules/all-dev-specification.mdc | 304 +++++++++++++++++++++++++++----------------------- 1 files changed, 165 insertions(+), 139 deletions(-) diff --git "a/_cursor.ai/102-\345\274\200\345\217\221\350\247\204\350\214\203.md" b/_cursor.ai/rules/all-dev-specification.mdc similarity index 74% rename from "_cursor.ai/102-\345\274\200\345\217\221\350\247\204\350\214\203.md" rename to _cursor.ai/rules/all-dev-specification.mdc index c73d973..f02256a 100644 --- "a/_cursor.ai/102-\345\274\200\345\217\221\350\247\204\350\214\203.md" +++ b/_cursor.ai/rules/all-dev-specification.mdc @@ -1,39 +1,24 @@ +--- +description: +globs: +alwaysApply: true +--- + # 开发规范 -- [开发规范](#开发规范) - - [规范宗旨](#规范宗旨) - - [命名问题](#命名问题) - - [命名需要具有实义](#命名需要具有实义) - - [文件命名](#文件命名) - - [界面层文件](#界面层文件) - - [数据控制层文件](#数据控制层文件) - - [组件文件](#组件文件) - - [请求文件](#请求文件) - - [样式命名](#样式命名) - - [界面样式](#界面样式) - - [组件样式](#组件样式) - - [JS 变量和属性的命名](#js-变量和属性的命名) - - [变量命名的特别约定](#变量命名的特别约定) - - [JS 方法的命名](#js-方法的命名) - - [在数据控制层](#在数据控制层) - - [在组件内](#在组件内) - - [书写问题](#书写问题) - - [JS 中的书写](#js-中的书写) - - [变量定义符](#变量定义符) - - [模版中的函数调用](#模版中的函数调用) - - [CSS 属性顺序](#css-属性顺序) +## 开发规范宗旨 -## 规范宗旨 - -**代码首先是给人读的,其次才是给机器运行**,所以让代码容易阅读是应尽的责任 - -除了尽可能不写难懂的代码外,我们还需要尽量遵守统一的规范,来帮助我们更高效率的相互阅读代码 - -## 命名问题 +**代码首先是给人读的,其次才是给机器运行**,所以让代码容易阅读是你应尽的责任 +包括但不限于以下内容: +- 给变量、函数命名时,需要具有实义 +- 避免使用难懂的语法或设计,用最简单的方式解决问题 +- 避免单块代码过长,拆分为多个更简短的函数或方法 +- 避免代码重复,通过封装函数、类或模块进行复用,封装遵守单一职责原则 +- 写注释应解释 "为什么" 而不仅仅是 "做什么" ### 命名需要具有实义 -命名的核心原则是名称含有具体的实体含义 +命名的原则是名称中有具体实体含义的词汇 比如没有实义的 @@ -49,111 +34,7 @@ 改进后,从函数名一看便知,这是商品被选中了以后的需要进行的操作,又因为具备了在同一个页面的唯一性,能帮我们快速获取信息,知道这是哪个业务的哪个环节,大幅提高阅读效率,这就是实义 -### 文件命名 - -常用文件命名约定 - -#### 界面层文件 - -界面层文件(.vue、.scss),采用小驼峰命名 - -``` -index.vue -index.scss -``` - -#### 数据控制层文件 - -数据控制层文件(.js),以固定前缀 P 开头,再接大驼峰 - -``` -PIndex.js -``` - -数据层代码定义的名称,需要和文件名一致 - -```js -export class PIndex extends Pilot {} -``` - -#### 组件文件 - -不论是公共组件还是页面子组件(.vue、.scss),都以固定前缀 C 开头,再接大驼峰 - -``` -CMenu.vue -CMenu.scss -``` - -组件代码定义的名称,需要和文件名一致 - -```js -// CMenu.vue 的组件名,必须是 CMenu -export default { - name: 'CMenu', -} -``` - -#### 请求文件 - -请求层文件(.js),以固定前缀 F 开头,再接大驼峰 - -``` -FCommon.js -``` - -请求集合的代码定义名称,需要和文件名一致 - -```js -// FCommon.js 的类名称,必须是 FCommon -class FCommon extends Fetcher {} - -// FCommon.js 代表的类的实例名称,则是 $fetchCommon -export const $fetchCommon = new FCommon(); -``` - -### 样式命名 - -样式名的命名,采用横杠连接 - -```css -.page-name {} -``` - -#### 界面样式 - -任何一个界面必定包含众多样式,所以: - -* 最父级样式名固定,与界面名称一直 -* 中间层,需要以父级为前缀,接板块说明 -* 末端则可单名,且尽量不含实义 - -```css -/** 在界面 userList.vue 中,最父级样式名名称固定 **/ -.user-list { - - /** 中间多层,以父级为前缀 **/ - .user-list-title { - - /** 末端可单名,尽量非实义 **/ - .left, - .text, - .icon, - .sub, - .close {} - } -} -``` - -#### 组件样式 - -组件样式名必须已 `c-` 开头,最父级样式名必须与组件名挂钩 - -例如,组件 CMenu.vue 中,最父级样式名必须是: - -```css -.c-menu {} -``` +## 常见命名要求 ### JS 变量和属性的命名 @@ -178,6 +59,8 @@ ```js // 允许 is 开头的变量名 let isOpened = false; +// 更好的命名 +let selectorOpened = false; ``` **事件变量用 evt** @@ -300,9 +183,123 @@ } ``` -## 书写问题 +### 样式命名 -书写规则都由编辑器自动格式化即可,这里主要说明非格式化的几点约定 +样式名的命名,采用横杠连接 + +```css +.page-name {} +``` + +#### 界面样式 + +任何一个界面必定包含众多样式,所以: + +* 最父级样式名固定,与界面名称一直 +* 中间层,需要以父级为前缀,接板块说明 +* 末端则可单名,且尽量不含实义 + +```css +/** 在界面 userList.vue 中,最父级样式名名称固定 **/ +.user-list { + + /** 中间多层,以父级为前缀 **/ + .user-list-title { + + /** 末端可单名,尽量非实义 **/ + .left, + .text, + .icon, + .sub, + .close {} + } +} +``` + +#### 组件样式 + +组件样式名必须已 `c-` 开头,最父级样式名必须与组件名挂钩 + +例如,组件 CMenu.vue 中,最父级样式名必须是: + +```css +.c-menu {} +``` + + +### 文件命名 + +常用文件命名约定 + +#### 界面层文件 + +界面层文件(.vue、.scss),采用小驼峰命名 + +``` +index.vue +index.scss +``` + +#### 数据控制层文件 + +数据控制器文件(.js),以固定前缀 P 开头,再接大驼峰 + +``` +PIndex.js +``` + +数据层代码定义的名称,需要和文件名一致 + +```js +export class PIndex extends Pilot {} +``` + +#### 组件文件 + +不论是公共组件还是页面子组件(.vue、.scss),都以固定前缀 C 开头,再接大驼峰 + +``` +CMenu.vue +CMenu.scss +``` + +组件代码定义的名称,需要和文件名一致 + +```js +// CMenu.vue 的组件名,必须是 CMenu +export default { + name: 'CMenu', +} +``` + +#### 请求文件 + +请求层文件(.js),以固定前缀 F 开头,再接大驼峰 + +``` +FCommon.js +``` + +请求集合的代码定义名称,需要和文件名一致 + +```js +// FCommon.js 的类名称,必须是 FCommon +class FCommon extends Fetcher {} + +// FCommon.js 代表的类的实例名称,则是 $fetchCommon +export const $fetchCommon = new FCommon(); +``` + +## 常见书写要求 + +### 基础书写要求 + +例如: +- 使用四个空格代替 tab 进行缩进(包括代码和文档) +- 单行代码宽度最多100个字符 +- js 代码使用单引号 + +更多规则请参考根目录 `.prettierrc` 文件 ### JS 中的书写 @@ -333,17 +330,46 @@ * 对于普通数据,如果明确要变更变量值,才使用 `let` * 对于引用数据,如果明确需要重新赋值一个引用对象,才使用 `let` +#### 变量判断 + +为了避免弱类型带来的bug追踪困难,变量判断需要使用恒等号,必须判断类型一致 + +```js +// 需要同时判断值和类型 +if (order.state === 1) {} +``` + #### 模版中的函数调用 -模版中调用函数,必须显式的书写 evt 变量和箭头函数,即: `evt => fncName()` -我们把 Taro 自身组件视为普通元素,元素绑定事件使用 `@tap` 的方式,非元素皆是组件,组件使用 `:onClick` 的方式绑定 +- 模版中调用函数,为了便于阅读,必须显式的书写 evt 变量和箭头函数,即: `evt => fncName()`,**这是规范要求,不是代码冗余** +- 把 Taro 自身组件视为普通元素,元素绑定事件使用 `@tap` 的方式 +- 非元素皆是组件,组件使用 `:onClick` 的方式绑定 例如: ```html +<!-- 元素绑定事件使用 --> <view @tap="() => onOpenOrderDetail()"></view> +<!-- 组件绑定事件使用 --> <CMenu :onItemClick="evt => onMenuItemClick(evt)" /> ``` +#### 以 JSDoc 格式写方法注释 + +公共代码中的方法都需要以 JSDoc 的格式写注释 + +```js +export class Tools { + /** + * 显示消息提示框 + * @param {string} msg - 提示的消息内容 + * @param {number} [duration=2000] - 提示框显示时长(毫秒) + * @param {boolean} [mask=false] - 是否显示透明蒙层,防止触摸穿透 + */ + static toast(msg, duration = 2000, mask = false) { + } +} +``` + ### CSS 属性顺序 为了避免 css 属性写重复,请按如下顺序书写: -- Gitblit v1.9.1