# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## 项目概述 羽毛球活动管理系统 - 基于若依(RuoYi)框架的前后端分离项目,用于管理羽毛球俱乐部的签到、活动记录、采购管理和账单结算。 ## 项目结构 ``` claude-badminton/ ├── backend/ # 后端 (Spring Boot + MyBatis + PostgreSQL) │ ├── ruoyi-admin/ # 主应用模块 (端口: 8081) │ ├── ruoyi-common/ # 通用工具模块 │ ├── ruoyi-framework/ # 框架核心模块 │ ├── ruoyi-system/ # 系统管理模块 │ ├── ruoyi-service/ # 业务服务模块 (羽毛球管理) │ ├── ruoyi-generator/ # 代码生成模块 │ ├── ruoyi-quartz/ # 定时任务模块 │ ├── ruoyi-ui/ # 旧版前端 (Vue 2) │ └── sql/ # 数据库脚本 └── frontend/ # 新版前端 (Vue 3 + Vite + Element Plus) ``` ## 命令速查 ### 后端命令 ```bash # 进入后端目录 cd backend # Maven 构建 mvn clean package -DskipTests # 打包(跳过测试) mvn clean install # 安装到本地仓库 # 运行(开发环境) cd ruoyi-admin mvn spring-boot:run # 运行(生产环境) java -jar ruoyi-admin/target/ruoyi-admin.jar --spring.profiles.active=prod # Windows 快捷脚本 bin\run.bat # 启动服务 bin\clean.bat # 清理编译 bin\package.bat # 打包 ``` ### 前端命令 ```bash # 进入前端目录 cd frontend # 安装依赖 npm install # 或使用国内镜像 npm install --registry=https://registry.npmmirror.com # 开发环境 (端口: 80, 代理到 http://localhost:8081) npm run dev # 构建 npm run build:prod # 生产环境 npm run build:stage # 预发布环境 # 预览构建产物 npm run preview ``` ### 数据库初始化 ```bash # 使用 PostgreSQL,按顺序执行: # 1. backend/sql/postgresql.sql - 基础表结构 # 2. backend/sql/postgresql_view.sql - 视图和代码生成支持 # 注意:quartz.sql 和 ry_20250522.sql 是 MySQL 语法,仅用于参考 ``` ## 技术栈 ### 后端 - **框架**: Spring Boot 2.5.15 + Spring Security 5.7.12 - **数据库**: PostgreSQL (原项目为 MySQL,已适配 PostgreSQL) - **ORM**: MyBatis (配置支持 MyBatis-Plus) - **认证**: JWT (io.jsonwebtoken:jjwt 0.9.1) - **缓存**: Redis (可选) - **API 文档**: Swagger 3.0.0 - **工具库**: Druid 1.2.23, PageHelper 1.4.7, Fastjson2 2.0.57 ### 前端 - **框架**: Vue 3.5.16 + Vite 6.3.5 - **UI 库**: Element Plus 2.10.7 - **状态管理**: Pinia 3.0.2 - **路由**: Vue Router 4.5.1 - **HTTP**: Axios 1.9.0 - **图表**: ECharts 5.6.0 - **富文本**: @vueup/vue-quill 1.2.0 - **自动导入**: unplugin-auto-import (Vue/Pinia API 无需手动导入) ## 架构要点 ### 后端架构 #### 模块依赖关系 ``` ruoyi-admin (主应用) ├─> ruoyi-framework (框架核心: 安全、缓存、配置) ├─> ruoyi-system (系统管理: 用户、角色、菜单、字典) ├─> ruoyi-service (业务服务: 羽毛球管理模块) ├─> ruoyi-generator (代码生成器) └─> ruoyi-quartz (定时任务) ruoyi-framework └─> ruoyi-common (通用工具: 注解、常量、异常、工具类) ruoyi-system, ruoyi-service, ruoyi-generator, ruoyi-quartz └─> ruoyi-common ``` #### 核心业务模块 (ruoyi-service) 羽毛球管理系统的业务逻辑位于 `ruoyi-service` 模块,包含: - **签到管理** (`badminton_signin`): 用户每日签到,自动创建活动记录 - **活动记录** (`badminton_activity`): 活动信息、参与人员、费用计算 - **采购管理** (`badminton_procurement`): 羽毛球及耗材采购、批次管理 - **批次库存** (`badminton_shuttlecock_batch`): 按批次核算成本,FIFO 消耗 - **消耗明细** (`badminton_shuttlecock_usage`): 活动消耗与批次关联 - **账单管理** (`badminton_bill`): 月度账单生成、费用分摊、付款记录 #### 关键业务流程 **多批次羽毛球消耗**: 1. 活动记录可从多个采购批次消耗羽毛球 2. 前端选择批次(多选)并输入各批次消耗数量 3. 系统按 FIFO 原则优先消耗早期批次 4. 自动计算费用:各批次费用 = 数量 × 该批次单价 5. 扣减库存并更新批次状态(有库存/预警/已用完) **账单生成**: 1. 每月 1 日自动生成上月账单(定时任务) 2. 汇总用户参与的活动记录,计算分摊金额 3. 支持平均分摊、阶梯分摊、混合分摊模式 4. 生成账单主表和明细表,关联具体活动 #### 配置文件 - `application.yml`: 主配置(端口 8081,context-path: /) - `application-dev.yml`: 开发环境(数据库、Redis 连接) - `application-prod.yml`: 生产环境 - 数据库使用 PostgreSQL,PageHelper 方言配置为 `postgresql` ### 前端架构 #### 路由系统 - **静态路由** (`src/router/index.js`): 登录、注册、404、401、首页 - **动态路由**: 从后端 API `GET /getRouters` 获取,根据用户权限动态加载 - 组件解析: `import.meta.glob('./../../views/**/*.vue')` 映射后端路由字符串到 Vue 组件 - 特殊组件: `Layout` (主外壳), `ParentView` (嵌套路由), `InnerLink` (iframe) #### 认证流程 1. JWT 令牌存储在 cookie (`Admin-Token`) 2. `src/permission.js` 全局路由守卫检查令牌 3. 首次认证: 获取用户信息 (`/getInfo`),生成动态路由 4. Axios 拦截器注入 `Authorization: Bearer {token}` 头部 5. 权限格式: `模块:实体:操作` (如 `system:user:edit`),`*:*:*` = 全部权限 #### API 层 (`src/utils/request.js`) - 基础 URL: `VITE_APP_BASE_API` (开发环境 `/dev-api`, 生产环境 `/prod-api`) - 超时: 10 秒 - 防重复提交: 1 秒内阻止相同 POST/PUT 请求 - 响应码: 200=成功, 401=会话过期, 500=错误, 601=警告 - 文件下载: `download()` 方法处理 blob 验证 #### 目录结构 ``` src/ ├── api/ # API 接口定义(按后端模块组织) │ ├── badminton/ # 羽毛球管理 API │ │ ├── activity.js # 活动记录 │ │ ├── billing.js # 账单管理 │ │ ├── procurement.js # 采购管理 │ │ └── signin.js # 签到管理 │ ├── system/ # 系统管理 API │ ├── monitor/ # 监控 API │ └── tool/ # 工具 API ├── views/ # 页面组件 │ ├── badminton/ # 羽毛球管理页面 │ │ ├── signin/ # 签到页面 │ │ ├── activity/ # 活动记录页面 │ │ ├── procurement/ # 采购管理页面 │ │ ├── billing/ # 账单管理页面 │ │ └── statistics/ # 统计分析页面 │ ├── system/ # 系统管理页面 │ ├── monitor/ # 监控页面 │ └── tool/ # 工具页面 ├── store/modules/ # Pinia 状态管理 │ ├── user.js # 用户状态 │ ├── permission.js # 权限路由 │ ├── app.js # 应用配置 │ ├── settings.js # 界面设置 │ ├── tagsView.js # 标签视图 │ └── dict.js # 字典缓存 ├── layout/ # 布局组件 │ ├── components/ # 侧边栏、导航栏、标签视图 │ └── index.vue # 主布局 ├── components/ # 全局组件 │ ├── Pagination/ # 分页组件 │ ├── DictTag/ # 字典标签 │ ├── Editor/ # 富文本编辑器 │ ├── FileUpload/ # 文件上传 │ └── RightToolbar/ # 右侧工具栏 ├── plugins/ # 插件系统 │ ├── auth.js # 权限指令 │ ├── cache.js # 缓存操作 │ ├── modal.js # 弹窗封装 │ ├── tab.js # 标签页操作 │ └── download.js # 文件下载 ├── directive/ # 自定义指令 │ └── permission/ # 权限指令 (v-permission) ├── utils/ # 工具函数 │ ├── request.js # Axios 封装 │ ├── auth.js # Token 操作 │ ├── ruoyi.js # 若依工具函数 │ ├── validate.js # 表单验证 │ └── dict.js # 字典工具 └── assets/ # 静态资源 ├── icons/svg/ # SVG 图标 (vite-plugin-svg-icons) └── styles/ # 全局样式 ``` #### 全局属性 (通过 `getCurrentInstance()` 访问) - `useDict`: 字典加载 - `download`: 文件下载 - `parseTime`: 时间格式化 - `resetForm`: 表单重置 - `handleTree`: 树形数据处理 - `addDateRange`: 日期范围查询 - `getConfigKey`: 获取系统配置 - `selectDictLabel`: 字典标签转换 #### SVG 图标 将 SVG 文件放在 `src/assets/icons/svg/`,自动注册,使用 `` ## 开发约定 ### 后端约定 - **包结构**: `com.ruoyi.{module}.{layer}` (如 `com.ruoyi.badminton.controller`) - **Controller**: 继承 `BaseController`,使用 `AjaxResult` 统一响应 - **Service**: 接口 + 实现类,事务注解 `@Transactional` - **Mapper**: MyBatis XML 映射文件位于 `resources/mapper/` - **权限注解**: `@PreAuthorize("@ss.hasPermi('system:user:list')")` - **日志注解**: `@Log(title = "用户管理", businessType = BusinessType.INSERT)` - **数据权限**: `@DataScope` 注解自动过滤数据 ### 前端约定 - **语言**: 全项目使用中文(Element Plus zh-cn、界面文本、注释) - **API 模块**: 每个端点导出独立函数 (如 `listUser`, `getUser`, `addUser`) - **视图模式**: CRUD 列表页 + 搜索表单 + 表格 + 添加/编辑对话框 - **字典使用**: `useDict()` 加载,`` 显示 - **组件尺寸**: 存储在 cookie (`size`),默认 `'default'` - **路径别名**: `@` → `./src`, `~` → 项目根目录 ## 常见任务 ### 添加新的业务模块 **后端**: 1. 在 `ruoyi-service` 创建包: `com.ruoyi.{module}` 2. 创建 `domain` (实体类,继承 `BaseEntity`) 3. 创建 `mapper` (接口 + XML) 4. 创建 `service` (接口 + 实现类) 5. 创建 `controller` (继承 `BaseController`) 6. 在 `resources/mapper/{module}/` 创建 Mapper XML 7. 配置权限标识和菜单(通过系统管理界面) **前端**: 1. 在 `src/api/` 创建 API 模块文件 2. 在 `src/views/` 创建页面组件 3. 后端配置菜单后,前端自动加载路由(无需手动配置) ### 使用代码生成器 1. 访问系统管理 → 代码生成 2. 导入数据表,配置生成信息 3. 生成代码(Java + Vue + SQL) 4. 将生成的代码复制到对应目录 5. 执行菜单 SQL,刷新页面即可看到新菜单 ### 调试技巧 **后端**: - 日志级别: `application.yml` 中设置 `logging.level.com.ruoyi: debug` - Swagger 文档: `http://localhost:8081/swagger-ui/index.html` - Druid 监控: `http://localhost:8081/druid/index.html` **前端**: - 开发环境自动代理 `/dev-api` 到 `http://localhost:8081` - 修改代理目标: `vite.config.js` 中的 `baseUrl` 变量 - 查看路由: Vue DevTools → Router - 查看状态: Vue DevTools → Pinia ## 重要文件 ### 后端 - `backend/pom.xml`: Maven 父 POM,依赖版本管理 - `backend/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java`: 启动类 - `backend/ruoyi-admin/src/main/resources/application.yml`: 主配置 - `backend/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java`: 统一响应 - `backend/ruoyi-framework/src/main/java/com/ruoyi/framework/security/`: Spring Security 配置 ### 前端 - `frontend/vite.config.js`: Vite 配置(代理、插件、构建) - `frontend/src/main.js`: 应用入口 - `frontend/src/permission.js`: 路由守卫 - `frontend/src/settings.js`: 界面配置 - `frontend/src/utils/request.js`: Axios 封装 - `frontend/src/store/modules/permission.js`: 动态路由生成 ## 注意事项 1. **数据库**: 项目已从 MySQL 适配到 PostgreSQL,SQL 语法需注意差异 2. **端口冲突**: 后端 8081,前端 80,确保端口未被占用 3. **跨域**: 开发环境通过 Vite 代理解决,生产环境需配置 Nginx 4. **权限**: 新增功能需在系统管理中配置菜单和权限标识 5. **字典**: 使用字典管理固定数据(如状态码),避免硬编码 6. **文件上传**: 上传路径配置在 `application.yml` 的 `ruoyi.profile` 7. **定时任务**: 使用 Quartz,在系统监控 → 定时任务中管理 8. **批次消耗**: 羽毛球消耗支持多批次,前端需传递批次数组 ## 参考文档 - 若依官方文档: http://doc.ruoyi.vip - 技术实现文档: `frontend/docs/技术实现文档.md` (详细的业务逻辑和数据库设计) - 前端 CLAUDE.md: `frontend/CLAUDE.md` (前端详细架构)