# 前端 Agent 说明 ## 技术与运行 - 技术栈:Vue 3、TypeScript strict mode、Vite、Pinia、Vue Router、Element Plus / `element-plus-secondary`、Less。 - 路径别名 `@/` 指向 `frontend/src/`。 - 构建目标是 Chrome 81,并启用 Vite legacy 插件;不要只按最新浏览器能力选择 API。 - 常用命令: ```bash cd frontend npm run dev npm run build ``` `dev` 和 `build` 都会先运行 `vue-tsc -b`。依赖变更只手动修改 `package.json`;`package-lock.json` 由 npm 命令自动生成且不入库,不要手工编辑或强制加入提交,也不要提交私有 registry 配置。 ## 代码组织 | 内容 | 位置 | | --- | --- | | 后端接口封装 | `src/api/.ts` | | 仅单个业务域使用的类型和模型 | 跟随对应 `src/api/.ts` | | 跨页面/跨模块共享实体与配置 | `src/entity/` | | Pinia 状态 | `src/stores/.ts` | | 路由 | `src/router/index.ts`、`dynamic.ts`、`watch.ts` | | 页面级视图 | `src/views//` | | 业务域私有子组件 | 对应 `src/views//` 子目录 | | 跨业务复用组件 | `src/components//` | | 工具函数 | `src/utils/` | | 用户可见文案 | `src/i18n/` 五种语言 JSON | 组件目录常使用 `index.ts` 加 `src/` 的形式。新增复用组件时优先参考相邻组件结构;仅单个页面使用的组件不要提前提升到全局 `components/`。 ## API 调用 - 不要在视图组件中直接使用 axios;统一通过 `@/utils/request.ts` 的 `request` 实例。 - 新接口放入对应 `src/api/.ts`,导出类似 `xxxApi` 的对象,并复用既有命名风格。 - 普通请求使用 `request.get/post/put/delete/patch`;SSE 使用 `request.fetchStream` 并传入 `AbortController`。 - 不要手工添加认证 token、助手 token、证书、语言或 xpack 静态资源头。普通请求的头由 request interceptor 统一处理;SSE 走 `request.fetchStream`(原生 fetch,不经过 axios interceptor),头部在 `fetchStream` 内单独拼装(当前不含 `Accept-Language`),新增请求头时两条路径都要核对。 - 下载类 blob 请求沿用: ```ts request.get('/path', { responseType: 'blob', requestOptions: { customError: true }, }) ``` - 后端统一响应中 `code === 0` 时 interceptor 会返回 `data`;调用方不要重复解包。 - 外部请求失败需要自定义处理时使用 `customError` 或 `silent`,不要绕开统一请求封装。 ## 类型 - 新增代码优先使用具体 interface/type 或从 API 模块导出的模型;不要扩大 `any` 的使用范围。 - 后端返回结构复杂且已有转换函数时,参考 `src/api/chat.ts` 的模型类和 `toXxx` 转换函数模式。 - 共享类型放 `src/entity/`,业务专属类型跟随业务模块,避免相同 DTO 在多个视图中重复声明。 - 修改类型后必须运行 `npm run build`,让 `vue-tsc` 检查模板和引用。 ## 状态管理 - 新 store 放 `src/stores/.ts`,使用 Pinia options API 风格:`state`、`getters`、`actions`。 - 为 state 定义 interface;getter 命名沿用 `getXxx`,action 命名表达业务行为。 - 需要在 setup 外使用的 store,参考现有模块通过 `stores/index.ts` 的 `store` 实例导出包装函数。 - 用户、语言、工作空间、助手上下文等状态已有 store;不要在组件里复制派生状态或直接改缓存键。 ## 路由与权限 - 静态路由主要在 `src/router/index.ts`;由许可证或管理员能力控制的动态路由在 `dynamic.ts` 与 xpack 的 `LicenseGenerator.generateRouters` 中处理。 - 修改 `watch.ts` 时必须核对: - 普通登录和管理员登录白名单; - `/assistant`、`/embeddedPage`、`/embeddedCommon`、`/401` 助手白名单; - `userStore.isAdmin` 与 `isSpaceAdmin` 的路由差异; - xpack 静态脚本加载失败路径:`LicenseGenerator` 是无类型声明的 window 全局,登录/改密加密(`sqlbotEncrypt`)和动态路由注册都硬依赖它,脚本加载失败只提示并中断导航,没有降级。 - 新路由必须配置名称、标题 i18n 和正确父布局;不要绕过已有访问控制。 ## 视图、组件与样式 - 页面组件使用 Vue 3 组合式 API;新组件优先使用 `