禁止拼音、中英混拼命名
业务异常使用自定义 BusinessException,携带错误码
系统异常向上抛出,由统一异常处理器兜底
禁止吞掉异常(空 catch)
catch 中必须记录日志
Controller 入口打 INFO,含请求关键参数
异常打 ERROR,含完整堆栈
禁止在日志中打印用户敏感信息
写接口必须考虑幂等
涉及并发场景必须说明同步策略
魔法值必须定义为常量
禁止 master 分支变更:编码前检查当前分支,master 上立即停止
自动 Commit:每个 task/fix 完成后自动 commit,保持一个 task 一个 commit
Commit 必须可编译:commit 前执行编译检查
禁止自动 Push:push 由用户主动触发,保留审查机会
Message 格式:[<变更名>] <中文简述>
sys_dict_type/sys_dict_data、配置等需被租户查询到的数据)的 tenant_id 必须设为 1(默认租户),禁止设为 0TenantLineInnerInterceptor 会自动在所有 SELECT 查询中追加 WHERE tenant_id = <当前登录用户租户ID>,tenant_id=0 的数据对非零租户用户不可见,导致前端字典加载为空sys_resource(菜单/权限)表不在租户拦截范围内,其 tenant_id 保持 1 即可id, tenant_id, create_by, create_time, create_dept, update_by, update_timeutf8mb4 字符集,InnoDB 引擎${...} 模板;确需入库时使用 CONCAT('$', '{token}') 拼接,并用 rg -n '\$\{[^}]+\}' forge-server/db/migration 确认无残留const { dict } = useDict('dict_type_1', 'dict_type_2')DictSelect 组件,或在 editSchema 中通过 computed 引用 dict.value['xxx'] 作为 props.optionsDictTag 组件,配合字典的 listClass 字段自动映射颜色computed,确保字典数据异步加载后选项能响应式更新imageUpload 组件存储的值是 fileId,不是完整 URLgetFileUrl() 将 fileId 转换为下载链接:
js
import { getFileUrl } from '@/utils/file'
// 正确
h(NAvatar, { src: getFileUrl(row.logo), size: 32, round: true })
// 错误 - fileId 无法直接作为图片 src
h(NAvatar, { src: row.logo, size: 32, round: true })
AuthImage 组件:
/api/file/download/{fileId} 需要鉴权(Bearer Token)<img> 或 <NAvatar> 的 src 属性不会携带 Authorization header,导致 token 无效错误AuthImage 组件,它会通过 fetch 带 token 获取图片并转为 blob URL:
js
import AuthImage from '@/components/common/AuthImage.vue'
// 正确 - AuthImage 自动处理鉴权
h(AuthImage, {
src: row.logo,
imgStyle: { width: '32px', height: '32px', borderRadius: '50%', objectFit: 'cover' }
})
// 错误 - NAvatar src 不会带 token,接口返回"未能读取到有效 token"
h(NAvatar, { src: getFileUrl(row.logo), size: 32, round: true })
AiCrudPage 会自动将多余的折叠到"更多"下拉菜单**** 替代