# 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/`，自动注册，使用 `<svg-icon icon-class="名称" />`

## 开发约定

### 后端约定
- **包结构**: `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()` 加载，`<dict-tag>` 显示
- **组件尺寸**: 存储在 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` (前端详细架构)
