# CLAUDE.md 本文件为 Claude Code 在此代码仓库中工作时提供指导。 ## 重要规定 **所有回复必须使用中文。** **架构边界规则:** 实现功能前必须遵循 `.claude/rules/architecture-boundaries.md`。 **需要操作数据库时使用 MCP 工具。** ## 项目概述 GPU Guard 是 AI 驱动的智能管理审核平台,采用 Monorepo 架构。后端基于 Midway.js + Cool Admin 框架,前端基于 Vue 3 + Element Plus,AI 引擎采用自研 NetaClaw(ReAct 循环 + WebSocket 实时通信)。 **核心架构:** - **Monorepo**: pnpm workspace 管理多个包 - **后端**: Midway.js 3.20 + Cool Admin 8.x,端口 8003 - **前端**: Vue 3.5 + Vite 5.4 + Element Plus 2.9,端口 9001 - **AI 引擎**: NetaClaw (ReAct + TypeBox Schema + Socket.IO) - **数据库**: MySQL 8.0+ (`cpu_guard`) ## 项目结构 ``` GPU_GUARD_MONOREPO/ ├── packages/ │ ├── backend/ # Midway.js 后端 (Cool Admin 框架) │ ├── frontend/ # Vue 3 前端 (Cool Admin UI) │ └── shared/ # 共享 TypeScript 类型 ├── docs/superpowers/ # 设计文档与实施计划 └── package.json ``` ## 常用命令 ```bash pnpm install # 安装依赖 pnpm dev # 同时启动后端+前端 pnpm --filter @gpu-guard/backend dev # 单独启动后端 (8003) pnpm --filter @gpu-guard/frontend dev # 单独启动前端 (9001) pnpm build # 构建所有包 pnpm lint # 代码检查 ``` ## Cool Admin 框架规范 本项目基于 Cool Admin 开源框架二次开发,**必须遵循以下约定**。 ### 后端 CRUD 模式 (@CoolController) `@CoolController` 装饰器自动生成标准 CRUD 接口: ```typescript @CoolController({ api: ['add', 'delete', 'update', 'info', 'list', 'page'], entity: ProjectInfoEntity, service: ProjectInfoService, pageQueryOp: { keyWordLikeFields: ['name'], // 模糊搜索字段 fieldEq: ['status'], // 精确匹配字段 addOrderBy: { createTime: 'DESC' }, // 默认排序 }, }) export class AdminProjectInfoController extends BaseController {} ``` **自动生成的接口:** | 方法 | 路径 | 说明 | |------|------|------| | POST | `/admin/{module}/{entity}/add` | 新增 | | POST | `/admin/{module}/{entity}/delete` | 删除 (body: {ids: [1,2]}) | | POST | `/admin/{module}/{entity}/update` | 更新 | | GET | `/admin/{module}/{entity}/info` | 详情 (query: id) | | POST | `/admin/{module}/{entity}/list` | 列表 | | POST | `/admin/{module}/{entity}/page` | 分页 (body: {page, size, keyWord, ...}) | **自定义接口:** 在 Controller 类中用 `@Get`/`@Post` 装饰器添加: ```typescript @Get('/ganttData', { summary: '甘特图数据' }) async ganttData(@Query('projectId') projectId: number) { return this.ok(await this.service.ganttData(projectId)); } ``` ### BaseEntity 提供的字段 所有 Entity 继承 `BaseEntity`(来自 `../../base/entity/base.ts`),自动拥有: - `id`: 自增主键 - `createTime`: 创建时间(自动填充) - `updateTime`: 更新时间(自动更新) - `tenantId`: 租户ID(多租户支持,nullable) **创建 Entity 示例:** ```typescript import { BaseEntity } from '../../base/entity/base.js'; import { Column, Entity } from 'typeorm'; @Entity('project_info') export class ProjectInfoEntity extends BaseEntity { @Column({ comment: '项目名称' }) name: string; @Column({ comment: '状态 0未开始 1进行中 2已完成', default: 0 }) status: number; @Column({ comment: '开始日期', type: 'date', nullable: true }) startDate: string; } ``` ### 前端 Service 代理 Cool Admin 根据后端 Controller 文件名自动生成 service 代理对象: ```typescript const { service } = useCool(); // Controller 文件: modules/project/controller/admin/info.ts // → service.project.info.page({...}) // → service.project.info.add({...}) // → service.project.info.update({...}) // → service.project.info.delete({ ids: [1] }) // → service.project.info.info({ id: 1 }) // Controller 文件: modules/project/controller/admin/task.ts // → service.project.task.page({...}) // 自定义接口需要用 request: // service.request({ url: '/admin/project/task/ganttData', params: { projectId: 1 } }) ``` **重要:** service 路径由文件名决定,下划线文件名如 `time_log.ts` 对应 `service.project.time_log`(不是 timeLog)。 ### 前端模块配置 (ModuleConfig) 每个前端模块必须有 `config.ts`: ```typescript export default (): ModuleConfig => { return { name: 'project', label: '项目管理', order: 50, views: [ { path: '/project/list', meta: { label: '项目列表' }, component: () => import('./views/list.vue') }, ] }; }; ``` ## 菜单与权限系统 ### 菜单配置 (base_sys_menu 表) 菜单通过数据库 `base_sys_menu` 表配置,**不在前端硬编码**。 | 字段 | 说明 | |------|------| | `parentId` | 父菜单ID(顶级为 null) | | `name` | 菜单名称 | | `router` | 路由路径(如 `/project/list`) | | `viewPath` | Vue 组件路径(如 `modules/project/views/list.vue`) | | `icon` | 图标 | | `orderNum` | 排序号 | | `type` | 0=目录, 1=菜单页面, 2=按钮权限 | | `isShow` | 是否在侧边栏显示 | | `keepAlive` | 是否缓存页面 | | `perms` | 权限标识(按钮级,如 `project:info:add`) | **新增菜单标准流程:** ```sql -- 1. 新增目录 INSERT INTO base_sys_menu (parentId, name, icon, orderNum, type, isShow, createTime, updateTime) VALUES (null, '项目管理', 'icon-project', 3, 0, 1, NOW(), NOW()); -- 记录返回的 id,假设为 158 -- 2. 新增菜单页面 INSERT INTO base_sys_menu (parentId, name, router, viewPath, orderNum, type, isShow, createTime, updateTime) VALUES (158, '项目列表', '/project/list', 'modules/project/views/list.vue', 1, 1, 1, NOW(), NOW()); -- 3. 隐藏页面(详情页等) INSERT INTO base_sys_menu (parentId, name, router, viewPath, orderNum, type, isShow, createTime, updateTime) VALUES (158, '项目详情', '/project/detail', 'modules/project/views/detail.vue', 2, 1, 0, NOW(), NOW()); ``` ### 权限机制 - **admin 用户** 自动拥有所有权限,无需配置 role_menu 映射 - 普通用户通过 `base_sys_role_menu` 关联角色和菜单 - 权限中间件: JWT Token → 解析 userId → 查询权限列表 → 匹配请求 URL - `/admin/*/comm/` 路径对所有登录用户开放 ## 后端模块 | 模块 | 路径 | 用途 | 关键 Entity | |------|------|------|------------| | **base** | `modules/base/` | 用户、角色、菜单、权限 | BaseSysUser, BaseSysRole, BaseSysMenu | | **netaclaw** | `modules/netaclaw/` | AI Agent 引擎 | NetaClawAgent, NetaClawSession, NetaClawMessage, NetaClawSkill, NetaClawModelChannel | | **audit** | `modules/audit/` | 审核管理 | AuditConfig, AuditOrder, AuditResult | | **dict** | `modules/dict/` | 字典管理 | DictType, DictInfo | | **task** | `modules/task/` | 定时任务 | TaskInfo, TaskLog | | **space** | `modules/space/` | 文件空间 | SpaceInfo, SpaceType | | **user** | `modules/user/` | 应用用户 | UserInfo, UserWx | | **notification** | `modules/notification/` | 通知服务 | NotificationMessageLog | | **plugin** | `modules/plugin/` | 插件系统 | PluginInfo | | **recycle** | `modules/recycle/` | 回收站 | RecycleData | | **demo** | `modules/demo/` | 演示 | DemoGoods | | **swagger** | `modules/swagger/` | API 文档 | - | ## 前端模块 | 模块 | 路由前缀 | 用途 | |------|---------|------| | **base** | `/` | 登录(Canvas星河动画)、用户、角色、菜单、部门 | | **agent** | `/agent/*` | 智能体对话(WebSocket)、技能管理、模型渠道管理 | | **audit** | `/audit/*` | 审核订单管理 | | **dict** | `/dict/*` | 字典管理 | | **task** | `/task/*` | 定时任务 | | **space** | `/space/*` | 文件空间 | | **user** | `/user/*` | 应用用户 | ## 开发规范 - **后端文件名**: 下划线法 (`model_channel.ts`) - **Entity 字段**: 驼峰法 (`modelConfig`) - **注释**: 中文 - **Entity**: 继承 BaseEntity,不使用外键 - **Controller**: 使用 `@CoolController` 自动生成 CRUD - **包管理器**: 必须使用 pnpm - **数据库**: 开发环境 `synchronize: true` 自动建表,生产环境禁止 ## 环境变量 ```env NODE_ENV=development BACKEND_PORT=8003 DB_HOST=120.48.5.80 DB_PORT=3306 DB_DATABASE=cpu_guard ```