91 lines
3.5 KiB
Markdown
91 lines
3.5 KiB
Markdown
# 12.5 代码审查清单
|
||
|
||
:::tip 概述
|
||
代码审查(Code Review)是保证代码质量的重要环节。以下清单涵盖后端和前端的审查要点。
|
||
:::
|
||
|
||
## 后端审查清单
|
||
|
||
### Model 层
|
||
|
||
- [ ] 继承 Eloquent `Model`(业务模型位于 `app/Models/`)
|
||
- [ ] `protected $table` 显式指定表名(含前缀或与 `DB_PREFIX` 推导一致)
|
||
- [ ] 引入 `SoftDeletesByFlag`(is_delete 软删除)与 `HasAuditColumns`(审计字段)Trait
|
||
- [ ] `$fillable` 白名单完整(批量赋值字段)
|
||
- [ ] 关联关系定义正确(如有)
|
||
- [ ] 无硬编码的数据库前缀
|
||
|
||
### Service 层
|
||
|
||
- [ ] 继承正确的基类(`BaseService` 或 `BaseTenantService`,树形模块不参与租户隔离)
|
||
- [ ] `$modelClass` 配置正确
|
||
- [ ] Trait 组合按需(`HasCrudOperations` / `HasQueryScopes` / `HasSerializeMaps` / `HasUniqueCheck` / `HasFileProcessing`)
|
||
- [ ] 查询条件配置合理(`pageLikeFields` / `pageEqFields`)
|
||
- [ ] 排序配置合理(`pageOrderBy` / `orderFieldAllow` 白名单)
|
||
- [ ] 唯一性校验配置(`uniqueFields`)
|
||
- [ ] 枚举映射配置(`serializeMaps`)
|
||
- [ ] 文件字段配置(`fileFields` / `fileSaveDir`)
|
||
- [ ] 钩子方法中无 SQL 注入风险(使用查询构造器参数绑定)
|
||
- [ ] 写操作在事务中执行(`HasCrudOperations` 已用 `DB::transaction` 包裹,自定义逻辑需补充)
|
||
|
||
### Controller 层
|
||
|
||
- [ ] 位于 `app/Http/Controllers/Api/`,瘦控制器(参数获取 → 调 Service → 返回 JSON)
|
||
- [ ] 通过构造函数注入 Service(不手动 new)
|
||
- [ ] 所有接口标注 `#[Permission]` 注解
|
||
- [ ] 所有写操作标注 `#[OperationLog]` 注解
|
||
- [ ] 权限码格式正确(`sys:模块名:操作`)
|
||
- [ ] 返回值类型为 `JsonResponse`,使用基类 `success/fail/paginate/_page` 等方法
|
||
- [ ] 参数格式校验由 FormRequest 完成(不在控制器手写校验)
|
||
|
||
### FormRequest
|
||
|
||
- [ ] 继承 `BaseRequest`(`failedValidation` 统一抛出 `code=1` 响应)
|
||
- [ ] `rules()` 覆盖全部必填与格式字段
|
||
- [ ] 场景区分(add / update)
|
||
|
||
### 安全
|
||
|
||
- [ ] 无 SQL 注入风险(使用 ORM / 查询构造器参数绑定)
|
||
- [ ] 无 XSS 风险(输出转义)
|
||
- [ ] 敏感数据不暴露(password、salt 不在响应字段中)
|
||
- [ ] 文件上传有类型和大小限制(`config/file.php` + FormRequest)
|
||
- [ ] 权限校验覆盖所有接口(`#[Permission]`)
|
||
|
||
## 前端审查清单
|
||
|
||
### API 模块
|
||
|
||
- [ ] 函数命名规范(`getXxxPage` / `xxxAdd` / `xxxUpdate` / `xxxDelete`)
|
||
- [ ] HTTP 方法正确(GET/POST/PUT/DELETE)
|
||
- [ ] 参数传递方式正确(params / data)
|
||
- [ ] 错误处理完善(响应拦截器统一处理,业务代码不重复 catch)
|
||
|
||
### 页面组件
|
||
|
||
- [ ] 使用 `<script setup lang="ts">` 语法
|
||
- [ ] Props 有类型定义
|
||
- [ ] 表单有验证规则
|
||
- [ ] 删除操作有确认弹窗
|
||
- [ ] 加载状态处理(loading)
|
||
- [ ] 空数据处理
|
||
|
||
### 权限
|
||
|
||
- [ ] 按钮级权限使用 `v-perm` 指令(如 `v-perm="['sys:example:add']"`,多权限全满足用 `v-perms`)
|
||
- [ ] 权限码与后端 `#[Permission]` 注解一致
|
||
|
||
### 性能
|
||
|
||
- [ ] 列表数据分页加载
|
||
- [ ] 图片懒加载
|
||
- [ ] 组件按需引入
|
||
|
||
## Git 提交审查
|
||
|
||
- [ ] commit message 格式正确(见 [12.3 Git 提交规范](/zh/standards/git.html))
|
||
- [ ] 一个 commit 只做一件事
|
||
- [ ] 无调试代码残留(console.log、dd、dump)
|
||
- [ ] 无敏感信息泄露(密码、密钥、.env)
|
||
- [ ] 通过 `vendor/bin/pint --test`(后端风格)与 `pnpm lint:eslint`(前端风格)
|