# 前端约定 ## 优先参考的代码来源 - 关联后端工程中的生成器模板: `ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/*.vm` `ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/*.vm` - `src/api/system/user/index.ts` - `src/api/system/user/types.ts` - `src/views/system/user/index.vue` - `src/views/demo/demo/index.vue` - `src/views/system/*` - `src/views/workflow/*` - `src/components/*` - `src/assets/styles/components/*` ## 基础栈与格式 - 技术栈是 Vue 3 + TypeScript + Element Plus + Vite。 - 请求统一通过 `@/utils/request`。 - API 返回值类型常用 `AxiosPromise`。 - 项目默认 2 空格缩进。 - 使用单引号和分号。 - 不要在一个页面里混入与仓库不一致的格式和写法。 ## 决策顺序 写代码时按下面顺序取样: 1. 当前业务目录下最近似页面。 2. 当前模块下最近似 API/types 文件。 3. 当前项目的公共组件、公共工具、公共样式。 4. 关联后端工程的 generator 模板。 5. 通用 Vue 3 / Element Plus 默认写法。 如果上述规则冲突,优先相信当前项目真实代码。 ## API 文件规则 - 标准 CRUD 的 API、types、列表页骨架可以先参考后端生成器模板,再根据当前前端项目风格落地。 - API 文件通常放在 `src/api///index.ts`。 - 同目录维护 `types.ts`。 - 常见 import 形式: `import request from '@/utils/request';` `import { AxiosPromise } from 'axios';` `import { XxxForm, XxxQuery, XxxVO } from './types';` `import { PageResult } from '@/api/types';` - 列表接口通常返回 `AxiosPromise>`。 - 详情接口返回 `AxiosPromise` 或更复杂的 `InfoVO`。 - 特殊请求参数沿用现有实现,例如: `parseStrEmpty(userId)` `headers: { isEncrypt: true, repeatSubmit: false }` `params` 用于 query string,`data` 用于 body。 - 当前仓库部分模块会在文件底部 `export default { ... }`,已有模块使用这种形式时继续保持一致。 ### API 文件建议结构 标准 CRUD 一般按这个顺序组织: 1. import 区 2. 列表接口 3. 详情接口 4. 新增接口 5. 修改接口 6. 删除接口 7. 特殊接口 8. 可选的 `export default` ### API 常见判断 - 如果后端是列表分页接口,前端通常返回 `AxiosPromise>`。 - 如果后端返回复合结构,例如 `user + roles + posts`,单独定义 `InfoVO`。 - 如果接口需要加密或关闭重复提交,直接在 `headers` 里表达,不要另起封装。 ## 类型文件规则 - 类型文件通常定义 `Query`、`VO`、`Form`,必要时补 `InfoVO`、`ResetPwdForm` 等扩展类型。 - `Query` 一般继承 `PageQuery`。 - `VO` 常继承 `BaseEntity`。 - ID 字段通常使用 `string | number`。 - 列表页多选 ID 常用 `Array`。 - 数组字段在表单里常直接用 `string[]`、`number[]` 或宽松类型,优先跟随现有模块。 ### 类型拆分建议 - `VO` 面向列表和详情展示。 - `Form` 面向新增和编辑。 - `Query` 面向列表筛选。 - `InfoVO` 面向详情页、编辑页、弹窗预加载等复合返回结构。 ### 类型字段策略 - 能明确写出类型时,不要偷懒用 `any`。 - 只有在当前模块已有宽松写法或后端返回非常不稳定时,才保留 `any`。 - 如果列表和表单字段明显不同,不要强行复用一个接口类型。 ## Vue 页面结构规则 - 标准 CRUD 页可先参考生成器的 `index.vue.vm` 骨架,再按本仓库现有页面补强。 - 页面优先使用 `