# OpenSpec Instructions These instructions are for AI assistants working in this project. Always open `@/openspec/AGENTS.md` when the request: - Mentions planning or proposals (words like proposal, spec, change, plan) - Introduces new capabilities, breaking changes, architecture shifts, or big performance/security work - Sounds ambiguous and you need the authoritative spec before coding Use `@/openspec/AGENTS.md` to learn: - How to create and apply change proposals - Spec format and conventions - Project structure and guidelines Keep this managed block so 'openspec update' can refresh the instructions. # CLAUDE.md 本文档为 Claude Code (claude.ai/code) 在此仓库中处理代码提供指导。请始终用中文沟通 ## 项目概览 **Yudao(芋道)** - 基于 Spring Boot 的快速开发平台,采用多模块架构。这是 Yudao 平台的 AI/媒体重点部署版本,具备数字人生成、语音克隆、视频混剪和内容分析能力。 ### 核心技术栈 **后端:** - Java 17 + Spring Boot 3.5.5 - Maven 构建管理 - MyBatis Plus 3.5.14 + Dynamic Datasource ORM - Redis + Redisson 缓存 - Spring Security 6.5.2 认证 - Flowable 7.0.1 工作流 - Springdoc/OpenAPI 文档 **前端:** - Vue.js 3.5.22 + Composition API - Vite 7.1.7 构建工具 - Ant Design Vue 4.2.6 UI组件 - TypeScript 类型安全 - Pinia 3.0.3 状态管理 - TailwindCSS 4.1.14 样式 ### 代码规范 #### Vue.js 最佳实践 ##### 代码规划 - 代码简洁易于人类阅读 ##### 组件结构 - 优先使用组合式 API 而非选项式 API - 保持组件小巧且功能专注 - 采用恰当的 TypeScript 集成方案 - 实现规范的 props 验证 - 使用标准的 emit 声明 - 保持模板逻辑简洁 - 优先使用template 语法,而不是函数组件 - 优先使用函数或者hook,而不是类 ##### 组合式 API - 正确使用 ref 与 reactive - state模块化 ```js const uiState = ref({ dialogVisible:false, tableLoading:false}) const open = ()=>{ uiState.value.dialogVisible = true } ``` - 合理实现生命周期钩子 - 通过组合式函数封装可复用逻辑 - 保持 setup 函数整洁 - 规范使用计算属性 - 合理实现侦听器 ##### 状态管理 - 使用 Pinia 进行状态管理 - 保持仓库模块化 - 采用合理的状态组织方式 - 规范实现操作逻辑 - 正确使用获取器 - 妥善处理异步状态 ##### 性能优化 - 实现组件懒加载 - 配置恰当的缓存策略 - 高效使用计算属性 - 避免不必要的侦听器 - 区分使用 v-show 与 v-if - 实现科学的 key 管理 ##### 路由管理 - 规范使用 Vue Router - 实现完整的导航守卫 - 合理配置路由元字段 - 正确处理路由参数 - 实现路由懒加载 - 使用标准的导航方法 ##### 表单处理 - 正确使用 v-model - 实现完善的验证机制 - 规范处理表单提交 - 展示合理的加载状态 - 配置完整的错误处理 - 实现表单重置功能 ##### TypeScript 集成 - 使用规范的组件类型定义 - 实现完整的 props 类型声明 - 规范 emit 类型声明 - 处理类型推断 - 使用标准的组合函数类型 - 实现完整的仓库类型定义 ## 代码简化 - 只保留核心分支,移除重复校验 / 冗余注释”,例:“生成 Java 订单支付接口逻辑,仅包含参数非空校验、支付状态判断 2 个核心分支,无需异常场景的冗余兜底代码 - 用三目运算符简化 if-else 冗余,避免单分支重复判断;变量仅定义必要的,移除未被调用的临时变量 **数据库与基础设施:** - MySQL 8.0+(主要) - 支持 PostgreSQL、Oracle、SQL Server、DM、KingbaseES、OpenGauss、TiDB - Redis 缓存 - Docker 容器化 ## 项目结构 ``` /d/projects/sionrui/ ├── yudao-dependencies/ # Maven 依赖版本管理 ├── yudao-framework/ # 框架组件和 Spring Boot 启动器 ├── yudao-server/ # 主应用服务器(端口 9900) ├── yudao-module-system/ # 系统管理(用户、角色、权限) ├── yudao-module-infra/ # 基础设施(文件、配置、任务) ├── yudao-module-member/ # 会员中心 ├── yudao-module-pay/ # 支付系统 ├── yudao-module-ai/ # AI/ML 功能(聊天、图像、知识、音乐) ├── yudao-module-tik/ # Tik/媒体模块(语音克隆、头像、视频) ├── frontend/app/web-gold/ # Vue.js 前端 ├── sql/ # 数据库模式 ├── script/ # 构建和部署脚本 └── docs/ # 文档 ``` **代码生成:** - 内置 CRUD 操作代码生成器 - 生成 Java、Vue、SQL 脚本和 API 文档 - 支持单表、树表、主子表模式 ### 前端(Vue.js) **开发:** ```bash cd frontend/app/web-gold # 安装依赖 pnpm install # 启动开发服务器(代理到后端 9900 端口) pnpm run dev # 生产构建 pnpm run build # 代码检查 pnpm run lint # 代码格式化 pnpm run format ``` ## 模块架构 ### 后端模块结构模式 每个模块都遵循一致的分层架构: ``` module/ ├── controller/ # REST 控制器(admin-api/、api/) ├── service/ # 业务逻辑 + 接口 │ ├── {Xxx}Service.java # 接口 │ └── {Xxx}ServiceImpl.java # 实现 ├── mapper/ # 数据访问层 ├── client/ # 外部 API 客户端 ├── config/ # 配置类 ├── util/ # 工具类 └── vo/ # 值对象 ├── {Xxx}SaveReqVO.java # 创建请求 ├── {Xxx}PageReqVO.java # 分页请求 ├── {Xxx}UpdateReqVO.java # 更新请求 └── {Xxx}RespVO.java # 响应 ``` **核心模块:** 1. **yudao-module-tik** - 媒体/AI 功能 - `voice/` - 语音克隆(CosyVoice、Latentsync) - `file/` - 带 OSS 集成的文件管理 - `chat/` - 对话管理 - `media/` - 媒体处理 - `quota/` - 配额管理 2. **yudao-module-ai** - AI/ML 能力 - 聊天补全 API - 图像生成(Midjourney) - 音乐生成(Suno) - 带向量搜索的知识库 3. **yudao-module-system** - 核心系统功能 - 用户/角色/权限管理 - 多租户支持 - 审计日志 ### 前端结构 ``` frontend/app/web-gold/src/ ├── api/ # API 服务层 │ ├── axios/ # Axios 拦截器 │ ├── voice.js # 语音相关 API │ └── mix.js # 视频混剪 API ├── components/ # 可复用 Vue 组件 ├── router/ │ └── index.js # Vue Router 配置 ├── stores/ │ └── voiceCopy.js # Pinia 状态管理 ├── views/ │ ├── dh/ # 数字人功能 │ │ ├── Avatar.vue │ │ ├── Video.vue │ │ └── VoiceCopy.vue │ ├── material/ # 素材库 │ └── content-style/# 内容分析 └── utils/ └── video-cover.ts # 工具函数 ``` **核心路由:** - `/digital-human/*` - 语音克隆、头像、视频生成 - `/content-style/*` - 内容分析和基准测试 - `/trends/*` - 趋势分析 - `/material/*` - 素材库管理 ## 配置 ### 后端配置文件 **主配置:** `yudao-server/src/main/resources/application.yaml` - Spring Boot 配置 - 数据库连接 - Redis 设置 - 安全设置 - 多租户配置 - AI 服务 API 密钥 **本地开发:** `yudao-server/src/main/resources/application-local.yaml` - 本地开发覆盖 - 数据库:`jdbc:mysql://8.155.172.147:3306/sion_rui_dev` - Redis:`8.155.172.147:6379` - 端口:9900 **配置环境:** - `local` - 开发(端口 9900) - `dev` - 开发服务器 - `prod` - 生产 ### 前端配置 **Vite 配置:** `frontend/app/web-gold/vite.config.js` - 开发服务器代理到后端 - 构建配置 - 插件设置 **API 代理:** - 开发服务器将 `/admin-api` 和 `/api` 代理到 `http://localhost:9900` ## 数据库模式 **位置:** `sql/mysql/` - 主模式:`ruoyi-vue-pro.sql` (949KB) - Quartz:`quartz.sql` 用于定时任务 - 模块特定迁移在各模块文件夹中 **模式更新:** - 将 SQL 迁移添加到 `sql/mysql/` - 遵循命名约定:`V{version}__{description}.sql` ## API 文档 - **Swagger UI:** `http://localhost:9900/swagger-ui.html` - **API 文档:** `http://localhost:9900/v3/api-docs` **API 路径约定:** - 管理 API:`/admin-api/{module}/{resource}` - 应用 API:`/api/{module}/{resource}` - CRUD 端点: - 创建:`POST /module/resource/create` - 更新:`PUT /module/resource/update` - 删除:`DELETE /module/resource/delete` - 查询:`GET /module/resource/get?id=xxx` - 分页:`GET /module/resource/page` ## 代码风格与规范 ### 后端(Java) **架构层:** 1. **Controller** - 请求处理、验证、调用 Service 2. **Service** - 业务逻辑、事务管理 3. **Mapper** - 使用 MyBatis Plus 进行数据访问 4. **VO** - API 请求/响应对象 5. **DO** - 映射到数据库表的数据对象 **关键规范:** - Mapper 接口继承 `BaseMapperX` - DO 类继承 `BaseDO` 或 `TenantBaseDO` 以支持多租户 - 使用 `@PreAuthorize` 进行权限控制 - 统一使用 `CommonResult` 作为 API 响应 - Service 方法使用 `@Transactional` 进行写操作 - 异常代码在 `ErrorCodeConstants` 中,格式为:`MODULE_RESOURCE_ACTION_ERROR` **命名规范:** - Controller:`{Xxx}Controller` 或 `App{Xxx}Controller` - Service:`{Xxx}Service` 和 `{Xxx}ServiceImpl` - Mapper:`{Xxx}Mapper` - VO:`{Xxx}SaveReqVO`、`{Xxx}PageReqVO`、`{Xxx}RespVO` - DO:`{Xxx}DO` ### 前端(Vue.js) **关键模式:** - Composition API + `