2026-05-21 11:20:19 +08:00

154 lines
5.4 KiB
Markdown
Raw Permalink 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.

# CLAUDE.md - GPU Guard 前端
## 项目概述
GPU Guard 前端 - 基于 Vue 3 + Cool Admin UI 的 GPU 智能管理审核平台前端。
**技术栈**: Vue 3.5 + TypeScript 5.5 + Vite 5.4 + Element Plus 2.9 + Pinia
**端口**: 9001
**包管理器**: pnpm (必须)
**后端代理**: `/dev/``http://127.0.0.1:8003`
## 重要规定
1. **所有回答用中文**
2. **遵循 Cool Admin 前端约定**
## 常用命令
```bash
pnpm i # 安装依赖
pnpm dev # 启动开发服务器 (端口 9001)
pnpm build # 生产构建
pnpm type-check # TypeScript 类型检查
pnpm lint # ESLint 检查
```
## Cool Admin 前端开发规范
### 模块配置 (ModuleConfig)
每个模块必须有 `config.ts`
```typescript
// src/modules/{模块名}/config.ts
export default (): ModuleConfig => {
return {
name: 'project', // 模块标识
label: '项目管理', // 显示名称
order: 50, // 菜单排序
views: [ // 路由定义
{
path: '/project/list',
meta: { label: '项目列表' },
component: () => import('./views/list.vue')
},
]
};
};
```
### Service 代理 (核心机制)
Cool Admin 根据后端 Controller 文件名自动生成 service 代理:
```typescript
const { service } = useCool();
// 后端 controller 文件: modules/project/controller/admin/info.ts
service.project.info.page({ page: 1, size: 10 }) // POST /admin/project/info/page
service.project.info.add({ name: '新项目' }) // POST /admin/project/info/add
service.project.info.update({ id: 1, name: '改' }) // POST /admin/project/info/update
service.project.info.delete({ ids: [1, 2] }) // POST /admin/project/info/delete
service.project.info.info({ id: 1 }) // GET /admin/project/info/info?id=1
```
**重要规则:**
- service 路径由后端 controller 文件名决定
- 下划线文件名 `time_log.ts``service.project.time_log`(不是 timeLog
- 自定义接口用 `service.request()`: `service.request({ url: '/admin/project/task/ganttData' })`
### 动态路由机制
路由来源(优先级从高到低):
1. 已注册的静态路由
2. 后端 `base_sys_menu` 表中的菜单路由
3. 模块 `config.ts` 中定义的 views
**菜单驱动路由:** 前端根据 `base_sys_menu` 表的 `viewPath` 字段动态加载组件。`viewPath` 格式为 `modules/project/views/list.vue`(相对于 `src/`)。
### 请求拦截器
位于 `src/cool/service/request.ts`
- 自动添加 JWT Token 到 `Authorization` header
- Token 过期自动刷新refreshToken 机制)
- 响应格式: `{ code: 1000, data: ..., message: '...' }`
- code 1000 = 成功,其他 = 失败
### 路径别名
- `/@/``./src/`
- `/$*/``./src/modules/`
## 模块清单
| 模块 | 路由前缀 | 关键页面 |
|------|---------|---------|
| **base** | `/` | 登录(Canvas星河动画)、首页、用户管理、角色管理、菜单管理、部门管理 |
| **agent** | `/agent/*` | 智能体对话(WebSocket)、智能体管理、技能管理、模型渠道管理、检测结果 |
| **project** | `/project/*` | 项目列表、项目详情(甘特图/日历/看板/列表四视图) |
| **data** | `/data/*` | 商业健康险创新药、医保药品管理 |
| **dict** | `/dict/*` | 字典管理 |
| **task** | `/task/*` | 定时任务管理 |
| **space** | `/space/*` | 文件空间管理 |
| **user** | `/user/*` | 应用用户管理 |
| **ontology** | `/ontology/*` | 本体论可视化 |
| **demo** | `/demo/*` | 演示页面 |
## Agent 模块详情
### 页面
| 页面 | 路由 | 说明 |
|-----|------|------|
| Agent 对话 | `/agent/chat` | WebSocket 流式对话 + 会话管理 + Skill 进度 + thinking 折叠 |
| Agent 管理 | `/agent/agents` | 卡片网格 + CRUD + 发布/取消 |
| Agent 编辑 | `/agent/agent-edit` | 5个Tab(基本信息/Skill选择/提示词/模型渠道/接口配置) |
| Skill 管理 | `/agent/skills` | 卡片列表 + 启停 + 详情(配置/提示词/模型) |
| 模型渠道管理 | `/agent/model-channel` | 渠道CRUD + 模型配置 + 连通性测试 |
### 核心逻辑
| 文件 | 用途 |
|-----|------|
| `store/chat.ts` | Pinia Store (WebSocket连接 + token统计 + Skill结果) |
| `hooks/chat.ts` | 对话核心Hook (消息管理/thinking/token_update) |
| `hooks/realtime-voice.ts` | 实时语音交互 (Socket.IO + AudioWorklet) |
| `components/model-channel-selector.vue` | 渠道级联选择器组件 |
## Project 模块详情
### 页面
| 页面 | 路由 | 说明 |
|-----|------|------|
| 项目列表 | `/project/list` | 卡片网格 + 筛选 + 新建/编辑弹窗 |
| 项目详情 | `/project/detail` | Tab切换: 甘特图/日历/看板/列表 |
### 组件
| 组件 | 说明 |
|-----|------|
| `gantt.vue` | dhtmlx-gantt 甘特图 + 拖拽更新 |
| `calendar.vue` | FullCalendar 日历视图 |
| `table.vue` | Element Plus 表格列表 |
| `kanban.vue` | vuedraggable 看板拖拽 |
| `task-drawer.vue` | 任务详情抽屉 + 工时记录 |
| `phase-manager.vue` | 阶段管理弹窗 |
| `time-log-dialog.vue` | 工时记录弹窗 |
## 开发规范
- **组件**: Vue 3 Composition API (`<script lang="ts" setup>`)
- **状态管理**: Pinia
- **样式**: Sass + scoped
- **代码风格**: ESLint + Prettier (tab缩进, 单引号)
- **v-model 双向绑定**: 使用 `computed({ get, set })` 模式,避免双 watch 递归
- **el-tab-pane 懒加载**: 使用 `lazy` 属性,不要用 `v-if` 控制 tab 内容显隐