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