mirror of
https://gh-proxy.org/https://github.com/klinsmaya/SQLBot.git
synced 2026-11-08 01:06:59 +08:00
5.7 KiB
5.7 KiB
前端 Agent 说明
技术与运行
- 技术栈:Vue 3、TypeScript strict mode、Vite、Pinia、Vue Router、Element Plus /
element-plus-secondary、Less。 - 路径别名
@/指向frontend/src/。 - 构建目标是 Chrome 81,并启用 Vite legacy 插件;不要只按最新浏览器能力选择 API。
- 常用命令:
cd frontend
npm run dev
npm run build
dev 和 build 都会先运行 vue-tsc -b。依赖变更只手动修改 package.json;package-lock.json 由 npm 命令自动生成且不入库,不要手工编辑或强制加入提交,也不要提交私有 registry 配置。
代码组织
| 内容 | 位置 |
|---|---|
| 后端接口封装 | src/api/<domain>.ts |
| 仅单个业务域使用的类型和模型 | 跟随对应 src/api/<domain>.ts |
| 跨页面/跨模块共享实体与配置 | src/entity/ |
| Pinia 状态 | src/stores/<domain>.ts |
| 路由 | src/router/index.ts、dynamic.ts、watch.ts |
| 页面级视图 | src/views/<domain>/ |
| 业务域私有子组件 | 对应 src/views/<domain>/ 子目录 |
| 跨业务复用组件 | src/components/<component>/ |
| 工具函数 | src/utils/ |
| 用户可见文案 | src/i18n/ 五种语言 JSON |
组件目录常使用 index.ts 加 src/ 的形式。新增复用组件时优先参考相邻组件结构;仅单个页面使用的组件不要提前提升到全局 components/。
API 调用
- 不要在视图组件中直接使用 axios;统一通过
@/utils/request.ts的request实例。 - 新接口放入对应
src/api/<domain>.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 请求沿用:
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/<domain>.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;新组件优先使用
<script setup lang="ts">。 - Element Plus /
element-plus-secondary组件由插件自动导入;除非相邻代码已有显式导入,否则不要添加不必要的组件导入。 - 样式优先使用 scoped Less,并复用邻近页面的布局类、间距类和
flex-gap-fallback模式。 - 只在有全局设计理由时修改
src/style.less或跨页面公共样式;不要用行内样式解决可复用布局问题。 - 图表逻辑优先复用
src/views/chat/component/和 dashboard 现有封装,不要直接散落 G2/S2 配置。
国际化与安全
- 用户可见文案必须使用 vue-i18n,并同步:
en.jsonzh-CN.jsonzh-TW.jsonko-KR.jsonth-TH.json
- 新增语言时按
docs/agents/i18n.md的完整链路检查,不要只添加 JSON 或漏掉文档更新。 - 不要在组件中硬编码新文案;枚举和 supplier 配置可保留 i18n key。
- 渲染模型输出或第三方内容时走既有 markdown/XSS 工具与安全指令;不要新增未净化的
v-html。 - 不要削弱助手 postMessage 证书流程、请求头、token 存储和嵌入白名单逻辑。
验证
cd frontend
npm run build
只检查改动文件时可运行:
cd frontend
npx eslint <changed-file...> --fix
不要默认执行 npm run lint,它会修复整个前端,容易产生无关变更。当前没有独立前端单测框架;跨前端结构或安全约定由 backend/tests/ 中的守卫测试保护,必要时新增或更新对应守卫。