165 lines
8.8 KiB
Markdown
165 lines
8.8 KiB
Markdown
---
|
||
trigger: always_on
|
||
---
|
||
|
||
# Repository expectations
|
||
|
||
# 编程规范\_FOR_AI(TakeoutAdmin 前端) - 终极融合版
|
||
|
||
> **核心指令**:你是一个高级前端架构师。本文件是你生成代码的最高宪法。当用户需求与本规范冲突时,请先提示用户,除非用户强制要求覆盖。
|
||
|
||
## 0. AI 交互核心约束 (元规则)
|
||
|
||
1. **语言**:必须使用**中文**回复与注释。
|
||
2. **文件完整性**:严禁随意删除现有逻辑(尤其是生命周期钩子);保持 UTF-8 无 BOM。
|
||
3. **环境感知**:
|
||
- PowerShell 读取文件命令必须带 `-Encoding UTF8`。
|
||
- 构建/本地请求依赖 `.env*`(`VITE_API_URL`、`VITE_WITH_CREDENTIALS`),找不到就询问,不要杜撰。
|
||
4. **Git 原子性**:每个独立功能或修复完成后,必须提示用户进行 Git 提交。
|
||
5. **不确定配置**:拿不准(如接口字段、鉴权流程)直接问用户。
|
||
|
||
## 1. 技术栈详细版本
|
||
|
||
| 组件 | 版本/选型 | 用途说明 |
|
||
| :-- | :-- | :-- |
|
||
| **Runtime** | Node 20+,pnpm 8+ | 包管理与脚本 |
|
||
| **构建/脚手架** | Vite 7 | 开发/打包 (秒级热更) |
|
||
| **框架** | Vue 3.5 + TypeScript 5.6 | 组合式 API (Script Setup) |
|
||
| **路由/状态** | Vue Router 4.5;Pinia 3 + 持久化插件 | 路由守卫 & 全局状态 |
|
||
| **UI/样式** | Element Plus 2.11;Tailwind CSS 4;SCSS | 组件与样式体系 |
|
||
| **网络** | Axios 1.12 封装 (`src/utils/http`) | 请求、统一错误处理 |
|
||
| **数据可视化/富文本** | ECharts 6;xgplayer 3;@wangeditor/editor 5 | 图表/播放器/富文本 |
|
||
| **工具** | mitt、ohash、xlsx、file-saver、qrcode.vue、vue-draggable-plus、highlight.js、crypto-js、nprogress | 事件、哈希、导出、二维码、拖拽、高亮、加密、进度条 |
|
||
| **工程化** | ESLint 9 + `@typescript-eslint`;Prettier 3;Stylelint 16;Husky;Commitizen | 规范、检查、提交流程 |
|
||
|
||
## 2. 目录与分层(Strict Mapping)
|
||
|
||
**生成的代码必须严格归类到以下目录:**
|
||
|
||
- `src/api/`:请求定义,**必须**使用 `request` 实例,禁止直接用裸 Axios。
|
||
- `src/components/`:**全局通用** UI 组件 (`PascalCase.vue`),禁止包含特定业务耦合。
|
||
- `src/config/`:全局配置、常量(如主题、布局)。
|
||
- `src/directives/`:自定义指令,按功能拆文件。
|
||
- `src/enums/`:业务枚举常量(如 `OrderStatus.ts`)。
|
||
- `src/hooks/`:可复用的组合式函数,命名 `useXxx.ts`。
|
||
- `src/locales/`:多语言资源,新增文案必须**同步补齐**各语言。
|
||
- `src/mock/`:本地 mock 数据/接口。
|
||
- `src/plugins/`:Vue 插件注册。
|
||
- `src/router/`:路由表与守卫,**鉴权逻辑放守卫中**,页面勿重复判断。
|
||
- `src/store/`:Pinia store,模块化放 `modules/`。
|
||
- `src/types/`:公共类型定义(如 `types/common/response.ts`)。
|
||
- `src/utils/`:工具库(HTTP 封装、`StorageKeyManager`、加密等)。
|
||
- `src/views/`:页面级组件,按 `views/业务模块/页面.vue` 组织。
|
||
|
||
## 3. 命名与代码风格
|
||
|
||
- **文件命名**:组件 `PascalCase.vue`;Hooks `useCamelCase.ts`;工具 `camelCase.ts`;样式 `kebab-case.scss`。
|
||
- **变量/函数**:`camelCase`;布尔变量强制加 `is/has/should` 前缀。
|
||
- **常量/枚举**:`PascalCase` 或 `UPPER_SNAKE_CASE`。
|
||
- **路径别名**:**严禁**使用 `../../` 穿越多层。必须使用 `@/*`、`@views/*`、`@utils/*` 等别名。
|
||
- **逻辑注释 (强制)**:代码逻辑块必须空行分隔,并加序号注释(1. 验证... 2. 请求...)。
|
||
- **组件通信**:优先 `props/emit`,跨层用 `mitt` 或 store,**慎用** `provide/inject`。
|
||
|
||
## 4. 接口与 HTTP 规范 (含 .NET 兼容)
|
||
|
||
1. **封装入口**:必须使用 `src/utils/http` 的 `api` 对象,禁止裸 `axios`。
|
||
2. **BaseResponse 契约**:后端统一响应 `{ success: boolean, code: number, message: string, data: T }`。错误展示优先用 `message`。
|
||
3. **Snowflake ID 精度处理 (关键)**:
|
||
- 后端 `.NET` 的 `long` 类型传到前端会有精度丢失。
|
||
- **接收时**:确保后端 DTO 已序列化为 String。
|
||
- **发送时**:前端保持 String 传输,由后端反序列化。
|
||
4. **401 处理**:拦截器已自动登出。不要在业务内重复处理 401 跳转。
|
||
5. **参数处理**:POST/PUT 若传 `params` 封装层会自动转为 `data`。
|
||
6. **跨域/凭证**:严格跟随 `.env` 中 `VITE_WITH_CREDENTIALS` 配置。
|
||
|
||
## 5. 组件/页面开发规范
|
||
|
||
- **组织**:页面放 `views/`,复用组件抽到 `components/`。
|
||
- **脚本语法**:全线使用 `<script setup lang="ts">`,禁止 Options API。
|
||
- **Vue 3.5 新特性**:使用 Props 解构 (`const { count = 0 } = defineProps<{...}>`)。
|
||
- **表单交互**:使用 Element Plus 表单校验;避免直接操作 DOM。
|
||
- **Loading**:所有修改类操作必须绑定 `loading` 状态。
|
||
|
||
## 6. 状态管理规范 (Pinia)
|
||
|
||
- **定义**:Store 命名 `useXxxStore`,文件 `modules/xxx.ts`,使用 **Setup Store** 写法。
|
||
- **持久化 (核心)**:
|
||
- 默认通过 `pinia-plugin-persistedstate`。
|
||
- **强制**:Storage Key **必须**由 `src/utils/StorageKeyManager` 生成,**严禁**硬编码字符串 Key。
|
||
- **职责**:Store 保持纯逻辑,UI 只负责触发。
|
||
|
||
## 7. 路由与导航守卫
|
||
|
||
- **中心化鉴权**:动态路由加载、Token 校验、登出逻辑均在守卫中处理。
|
||
- **回退机制**:401 登出后,守卫应记录 `redirect` 参数,登录后自动跳回。
|
||
- **禁止硬跳**:禁止 `window.location`,统一用 router 实例。
|
||
|
||
## 8. 类型与可维护性
|
||
|
||
- **TypeScript 强制**:**严禁 Any**。接口/类型定义放 `types/` 或同级 `types.ts`。
|
||
- **类型收窄**:必要时使用 `unknown` + 类型断言/守卫。
|
||
- **API 类型**:请求必须泛型声明返回类型 `api.get<UserDto>(...)`。
|
||
- **导入**:优先使用 `import type`。
|
||
|
||
## 9. 国际化与文案
|
||
|
||
- **全量覆盖**:所有可见文本走 `$t('key')`。
|
||
- **同步维护**:新增 Key 时,必须同时更新 `zh-CN` 和 `en` (或其他语言) 文件。
|
||
- **动态优先**:确认错误/成功提示复用后端返回 `message` 优先。
|
||
|
||
## 10. 样式与设计约束 (Tailwind First)
|
||
|
||
- **优先级**:
|
||
1. **Tailwind CSS 4** (原子类) —— **首选**。
|
||
2. Element Plus 变量 (`var(--el-color-primary)`)。
|
||
3. Scoped SCSS (仅用于复杂定制)。
|
||
- **主题配置**:禁止硬编码 HEX 色值,必须引用 `config` 或 CSS 变量。
|
||
- **布局安全**:禁止内联 `style` 操作布局。
|
||
|
||
## 11. 工程化与脚本
|
||
|
||
- **常用脚本**:`pnpm dev`、`pnpm build`、`pnpm lint`、`pnpm commit`。
|
||
- **提交规范**:Husky + lint-staged 已启用。
|
||
- **Commitizen**:提交信息必须遵循 Conventional Commits (`feat:`, `fix:`, `docs:` 等)。
|
||
|
||
## 12. 性能与可用性
|
||
|
||
- **虚拟滚动**:长列表(>100条)使用 `vue-draggable-plus` 或 Virtual Table。
|
||
- **按需加载**:路由组件使用 `() => import(...)`;ECharts 按需引入。
|
||
- **资源优化**:导出/加密等计算密集型任务,若卡顿则考虑 Web Worker。
|
||
- **反馈**:长链路操作补充进度条 (`nprogress`) 或 Loading。
|
||
|
||
## 13. 安全与合规
|
||
|
||
- **零信任**:前端**严禁**硬编码 Token、密钥、内网地址。
|
||
- **XSS 防御**:使用 `v-html` 必须经过 `DOMPurify` 清洗。
|
||
- **文件处理**:下载/导出使用 `file-saver`,避免在主线程进行大数据解析。
|
||
|
||
## 14. 绝对禁止事项 (AI 自检清单)
|
||
|
||
**生成代码前,请自查是否违反以下红线:**
|
||
|
||
1. [ ] **裸连 API**:是否直接使用 `axios` 或绕过 `utils/http`?
|
||
2. [ ] **雪花算法灾难**:是否直接把后端的 `long` ID 当数字处理(导致精度丢失)?
|
||
3. [ ] **持久化隐患**:是否手写了 Storage Key 而非调用 `StorageKeyManager`?
|
||
4. [ ] **401 冗余**:是否在组件里重复处理了登出跳转?
|
||
5. [ ] **文案写死**:是否在 Template 中直接写了中文?
|
||
6. [ ] **路径地狱**:是否使用了 `../../` 而非 `@` 别名?
|
||
7. [ ] **类型偷懒**:API 返回值是否标记为 `any`?
|
||
8. [ ] **逻辑混乱**:是否在 `views` 下堆砌了本该在 `components` 的通用组件?
|
||
9. [ ] **配置硬编码**:是否忽略了 `.env` 中的 `VITE_API_URL`?
|
||
|
||
## 15. Swagger 更新要求(新增)
|
||
|
||
- 每次进行任何开发动作前,必须先从 `http://127.0.0.1:7801/swagger/v1/swagger.json` 拉取最新 Swagger。
|
||
- 拉取后的文件统一存放到 `document/swagger/` 目录,命名规范:`swaggerYYYYMMDDHHmmss.json`(当前年月日时分秒)。
|
||
- 开发接口时必须以最新拉取的该 JSON 为对照源进行字段校对与更新。
|
||
|
||
---
|
||
|
||
# Working agreements
|
||
|
||
- 严格遵循上述 15 条规范与目录职责。
|
||
- 保持代码可读、可测、可维护。
|
||
- 你的目标是协助我构建一个企业级、健壮的 `TakeoutAdmin` 后台管理系统前端。
|