Files
TakeoutSaaS.TenantUI/AGENTS.md

175 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Repository expectations
# 编程规范\_FOR_AITakeoutTenant 前端)- 终极融合版
> **核心指令**:你是一个高级前端架构师。本文件是你生成代码的最高宪法。当用户需求与本规范冲突时,请先提示用户,除非用户强制要求覆盖。
## 0. AI 交互核心约束 (元规则)
1. **语言**:必须使用**中文**回复与注释。
2. **文件完整性**:严禁随意删除现有逻辑(尤其是生命周期钩子);保持 UTF-8 无 BOM。
3. **环境感知**
- PowerShell 读取文件命令必须带 `-Encoding UTF8`
- 构建/本地请求依赖 `.env*``VITE_API_URL``VITE_WITH_CREDENTIALS`),找不到就询问,不要杜撰。
4. **Git 原子性**:每个独立功能或修复完成后,必须提示用户进行 Git 提交。
5. **推送优先级**:提交后推送时,优先使用 SSH 远程(`git@github.com:...`),避免 HTTPS TLS 问题。
6. **推送默认**:提交后自动执行 `git push`,无需再次提醒或确认。
7. **不确定配置**:拿不准(如接口字段、鉴权流程)直接问用户。
8. **需求开发前置步骤(强制)**:每次开始“新增/修改需求”前,必须先从 `https://api-tenant-dev.laosankeji.com/swagger/v1/swagger.json` 拉取最新 Swagger定位本次需求涉及的接口契约路径、入参、出参、字段再进行代码变更。
## 1. 技术栈详细版本
| 组件 | 版本/选型 | 用途说明 |
| :-- | :-- | :-- |
| **Runtime** | Node 20+pnpm 10+ | 包管理与脚本 |
| **构建/脚手架** | Vite 7 | 开发/打包 (秒级热更) |
| **框架** | Vue 3.5 + TypeScript 5.6 | 组合式 API (Script Setup) |
| **路由/状态** | Vue Router 4.5Pinia 3 + 持久化插件 | 路由守卫 & 全局状态 |
| **UI/样式** | Element Plus 2.11Tailwind CSS 4SCSS | 组件与样式体系 |
| **网络** | Axios 1.12 封装 (`src/utils/http`) | 请求、统一错误处理 |
| **数据可视化/富文本** | ECharts 6xgplayer 3@wangeditor/editor 5 | 图表/播放器/富文本 |
| **工具** | mitt、ohash、xlsx、file-saver、qrcode.vue、vue-draggable-plus、highlight.js、crypto-js、nprogress | 事件、哈希、导出、二维码、拖拽、高亮、加密、进度条 |
| **工程化** | ESLint 9 + `@typescript-eslint`Prettier 3Stylelint 16HuskyCommitizen | 规范、检查、提交流程 |
## 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`
- **路径别名****严禁**使用 `../../` 穿越多层。必须使用 `#/*``@vben/*``@vben-core/*` 等别名。
- **逻辑注释 (强制)**代码逻辑块必须空行分隔并加序号注释1. 验证... 2. 请求...)。
- **文件头注释 (强制)**:所有新增 `*.ts`/`*.vue`/`*.less`/`*.scss` 文件,必须包含“文件职责”注释,说明该文件负责的业务边界。
- **关键函数注释 (强制)**:对外导出的函数、含分支校验/提交流程的核心函数,必须添加简短中文注释,至少说明输入意图与副作用(如会触发请求/刷新/消息提示)。
- **重构注释保留 (强制)**:拆分文件时,必须把原有关键流程注释同步迁移,禁止出现“重构后逻辑完整但无注释”的情况。
- **组件通信**:优先 `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` 状态。
- **页面拆分(强制)**:当 `views/**/index.vue` 逻辑复杂或总行数超过 400 行时,必须拆分为:
- `composables/useXxxPage.ts`(业务状态、校验、提交流程)
- `components/*.vue`(抽屉、弹窗、复杂表单等子视图)
- `styles/index.less|scss`(页面样式)
- **Composables 二级拆分(强制)**:当 `composables/useXxxPage.ts` 超过 300 行或同时承担 4 类以上职责(常量/转换/数据加载/提交动作)时,必须继续拆分为目录:
- `composables/xxx-page/constants.ts`(常量与配置)
- `composables/xxx-page/helpers.ts`(纯函数:格式化、校验、归一化)
- `composables/xxx-page/*-actions.ts`按业务动作拆分load/save/copy 等)
- `useXxxPage.ts` 仅保留状态编排与导出,不承载大段业务实现。
- **样式二级拆分(强制)**:当 `styles/index.less|scss` 超过 150 行或包含 3 个以上视觉域(列表/表单/抽屉/弹窗/响应式)时,必须拆分为分片文件,`index.less|scss` 只做 `@import` 聚合。
- **子组件单向数据流(强制)**:子组件禁止直接修改父级传入对象;必须通过 `emit` 或显式 `onSetXxx` 回调更新父级状态。
- **职责边界**:子组件仅负责渲染与事件抛出;请求、数据归一化、持久化必须留在页面 composable。
- **样式边界**:页面样式拆文件后,必须使用页面根类(如 `.page-hours`)作为作用域前缀,避免全局污染。
## 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:ele``pnpm build:ele``pnpm lint``pnpm commit`
- **Lint 要求**:每次修改代码后必须执行 `pnpm lint`,确保无错误和警告。
- **提交规范**Husky/Lefthook + lint-staged 已启用。
- **Commitizen**:提交信息必须遵循 Conventional Commits格式为 `<type>: <中文说明>`(类型英文,说明中文)。
## 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`
---
# Working agreements
- 严格遵循上述 14 条规范与目录职责。
- 保持代码可读、可测、可维护。
- 你的目标是协助我构建一个企业级、健壮的 `TakeoutTenant` 租户管理前端系统。