first commit
This commit is contained in:
300
docs/开发规范.md
Normal file
300
docs/开发规范.md
Normal file
@@ -0,0 +1,300 @@
|
||||
# 开发规范文档
|
||||
|
||||
## 一、命名规范
|
||||
|
||||
### 1.1 文件命名
|
||||
- **页面文件**:使用小写字母,多个单词用短横线连接,如 `user-profile.vue`
|
||||
- **组件文件**:使用大驼峰命名,如 `UserCard.vue`、`LoadingView.vue`
|
||||
- **工具类文件**:使用小写字母,多个单词用短横线连接,如 `request.js`、`storage.js`
|
||||
- **常量文件**:使用小写字母,如 `constants.js`、`env.js`
|
||||
|
||||
### 1.2 变量命名
|
||||
- **普通变量**:使用小驼峰命名,如 `userName`、`userInfo`
|
||||
- **常量**:使用全大写字母,单词间用下划线连接,如 `API_BASE_URL`、`MAX_RETRY_COUNT`
|
||||
- **私有变量**:以下划线开头,如 `_privateMethod`
|
||||
- **布尔值**:以 `is`、`has`、`can` 等开头,如 `isLogin`、`hasPermission`
|
||||
|
||||
### 1.3 函数命名
|
||||
- **普通函数**:使用小驼峰命名,动词开头,如 `getUserInfo`、`handleClick`
|
||||
- **事件处理函数**:以 `handle` 或 `on` 开头,如 `handleSubmit`、`onLoad`
|
||||
- **工具函数**:使用动词开头,如 `formatDate`、`validatePhone`
|
||||
|
||||
### 1.4 组件命名
|
||||
- **全局组件**:使用大驼峰命名,至少两个单词,如 `LoadingView`、`EmptyView`
|
||||
- **页面组件**:使用大驼峰命名,如 `LoginPage`、`UserProfile`
|
||||
- **业务组件**:使用大驼峰命名,体现业务含义,如 `UserCard`、`OrderList`
|
||||
|
||||
## 二、代码注释规范
|
||||
|
||||
### 2.1 文件注释
|
||||
每个文件开头必须包含文件说明注释:
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* 用户相关接口
|
||||
* @author 张三
|
||||
* @date 2024-01-01
|
||||
*/
|
||||
```
|
||||
|
||||
### 2.2 函数注释
|
||||
关键函数必须添加注释,说明功能、参数、返回值:
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* 用户登录
|
||||
* @param {object} data 登录数据
|
||||
* @param {string} data.phone 手机号
|
||||
* @param {string} data.password 密码
|
||||
* @returns {Promise<object>} 登录结果
|
||||
*/
|
||||
export const login = (data) => {
|
||||
return request.post('/auth/login', data)
|
||||
}
|
||||
```
|
||||
|
||||
### 2.3 复杂逻辑注释
|
||||
对于复杂的业务逻辑,必须添加行内注释:
|
||||
|
||||
```javascript
|
||||
// 检查Token是否过期
|
||||
if (tokenExpireTime < Date.now()) {
|
||||
// Token已过期,刷新Token
|
||||
await refreshToken()
|
||||
}
|
||||
```
|
||||
|
||||
### 2.4 TODO注释
|
||||
待完成的功能使用 TODO 标记:
|
||||
|
||||
```javascript
|
||||
// TODO: 添加图片压缩功能
|
||||
// FIXME: 修复在iOS端的兼容性问题
|
||||
```
|
||||
|
||||
## 三、代码风格规范
|
||||
|
||||
### 3.1 缩进与空格
|
||||
- 使用 2 个空格缩进
|
||||
- 运算符前后加空格
|
||||
- 逗号后加空格
|
||||
- 对象属性冒号后加空格
|
||||
|
||||
### 3.2 引号使用
|
||||
- JavaScript 统一使用单引号
|
||||
- HTML 属性统一使用双引号
|
||||
|
||||
### 3.3 分号使用
|
||||
- 语句结尾不使用分号(根据 Prettier 配置)
|
||||
|
||||
### 3.4 代码长度
|
||||
- 单行代码不超过 100 个字符
|
||||
- 函数代码行数不超过 50 行
|
||||
- 文件代码行数不超过 500 行
|
||||
|
||||
## 四、Vue 组件规范
|
||||
|
||||
### 4.1 组件结构顺序
|
||||
```vue
|
||||
<template>
|
||||
<!-- 模板内容 -->
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// 1. 导入
|
||||
import { ref } from 'vue'
|
||||
|
||||
// 2. 组件定义
|
||||
export default {
|
||||
name: 'ComponentName',
|
||||
components: {},
|
||||
props: {},
|
||||
emits: [],
|
||||
setup() {
|
||||
// 3. 响应式数据
|
||||
// 4. 计算属性
|
||||
// 5. 方法
|
||||
// 6. 生命周期
|
||||
// 7. 返回
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
/* 样式内容 */
|
||||
</style>
|
||||
```
|
||||
|
||||
### 4.2 Props 定义
|
||||
Props 必须定义类型、默认值和校验:
|
||||
|
||||
```javascript
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
count: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
validator: (value) => value >= 0
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 事件命名
|
||||
- 使用短横线命名:`@update-value`
|
||||
- 使用动词开头:`@click`、`@change`、`@submit`
|
||||
|
||||
## 五、Git 提交规范
|
||||
|
||||
### 5.1 提交信息格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
<body>
|
||||
|
||||
<footer>
|
||||
```
|
||||
|
||||
### 5.2 Type 类型
|
||||
- `feat`: 新功能
|
||||
- `fix`: 修复 Bug
|
||||
- `docs`: 文档更新
|
||||
- `style`: 代码格式调整
|
||||
- `refactor`: 重构代码
|
||||
- `perf`: 性能优化
|
||||
- `test`: 测试相关
|
||||
- `chore`: 构建/工具链相关
|
||||
|
||||
### 5.3 提交示例
|
||||
```
|
||||
feat(login): 添加手机号验证码登录功能
|
||||
|
||||
- 实现验证码发送接口
|
||||
- 添加验证码输入组件
|
||||
- 完成登录逻辑
|
||||
|
||||
Closes #123
|
||||
```
|
||||
|
||||
## 六、API 接口规范
|
||||
|
||||
### 6.1 接口文件组织
|
||||
按业务模块划分接口文件:
|
||||
```
|
||||
api/
|
||||
├── modules/
|
||||
│ ├── auth.js # 认证相关
|
||||
│ ├── user.js # 用户相关
|
||||
│ └── order.js # 订单相关
|
||||
└── index.js # 统一导出
|
||||
```
|
||||
|
||||
### 6.2 接口命名
|
||||
- 使用动词开头:`getUserInfo`、`updateUserInfo`
|
||||
- RESTful 风格:`getList`、`getDetail`、`create`、`update`、`delete`
|
||||
|
||||
### 6.3 接口注释
|
||||
每个接口必须添加注释说明:
|
||||
|
||||
```javascript
|
||||
/**
|
||||
* 获取用户信息
|
||||
* @param {string} userId 用户ID
|
||||
* @returns {Promise<object>} 用户信息
|
||||
*/
|
||||
export const getUserInfo = (userId) => {
|
||||
return request.get(`/user/${userId}`)
|
||||
}
|
||||
```
|
||||
|
||||
## 七、样式规范
|
||||
|
||||
### 7.1 选择器命名
|
||||
- 使用短横线命名:`.user-card`、`.login-form`
|
||||
- 避免使用 ID 选择器
|
||||
- 避免使用标签选择器
|
||||
|
||||
### 7.2 样式组织
|
||||
```scss
|
||||
.component-name {
|
||||
// 1. 定位属性
|
||||
position: relative;
|
||||
|
||||
// 2. 盒模型属性
|
||||
display: flex;
|
||||
width: 100%;
|
||||
padding: 20rpx;
|
||||
|
||||
// 3. 文本属性
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
|
||||
// 4. 其他属性
|
||||
background-color: #fff;
|
||||
|
||||
// 5. 嵌套选择器
|
||||
.child-element {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7.3 单位使用
|
||||
- 小程序端:使用 `rpx`
|
||||
- H5 端:使用 `rem` 或 `vw`
|
||||
- 固定尺寸:使用 `px`
|
||||
|
||||
## 八、性能优化规范
|
||||
|
||||
### 8.1 图片优化
|
||||
- 使用合适的图片格式(WebP、JPEG、PNG)
|
||||
- 压缩图片大小
|
||||
- 使用图片懒加载
|
||||
- 使用雪碧图合并小图标
|
||||
|
||||
### 8.2 代码优化
|
||||
- 避免在循环中进行复杂计算
|
||||
- 使用防抖和节流
|
||||
- 合理使用计算属性和侦听器
|
||||
- 及时清理定时器和事件监听
|
||||
|
||||
### 8.3 网络优化
|
||||
- 合并接口请求
|
||||
- 使用请求缓存
|
||||
- 实现请求重试机制
|
||||
- 避免重复请求
|
||||
|
||||
## 九、安全规范
|
||||
|
||||
### 9.1 数据安全
|
||||
- 敏感信息加密存储
|
||||
- Token 定期刷新
|
||||
- 防止 XSS 攻击
|
||||
- 防止 CSRF 攻击
|
||||
|
||||
### 9.2 权限控制
|
||||
- 实现路由权限控制
|
||||
- 实现接口权限控制
|
||||
- 实现按钮级权限控制
|
||||
|
||||
## 十、测试规范
|
||||
|
||||
### 10.1 单元测试
|
||||
- 工具函数必须编写单元测试
|
||||
- 测试覆盖率不低于 80%
|
||||
- 使用 Jest 测试框架
|
||||
|
||||
### 10.2 集成测试
|
||||
- 关键业务流程必须编写集成测试
|
||||
- 使用 uni-automator 进行自动化测试
|
||||
|
||||
### 10.3 测试命名
|
||||
```javascript
|
||||
describe('工具函数测试', () => {
|
||||
test('应该正确验证手机号', () => {
|
||||
expect(isPhone('13800138000')).toBe(true)
|
||||
})
|
||||
})
|
||||
```
|
||||
Reference in New Issue
Block a user