# CLAUDE.md

## 项目规则（重要）

### Communication
- 永远使用简体中文进行思考和对话

### Documentation
- 编写 .md 文档时，也要用中文

## Java Code Style
- 在实体类中使用 `@Data` 注解保证代码的简洁
- 尽量使用 MyBatis Plus 进行 CRUD 操作（版本 3.5.10，Spring Boot 3 适配版）
- 服务层中的使用@Resource注释，替代@Autowired

# 测试验证
- /login/test接口可以传入username和password获取token，用于测试验证接口的功能。
用于测试的账号：
username: admin password admin123
- swagger-ui的地址为/swagger-ui/index.html
---

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.


## Project Overview

This is a **RuoYi v3.9.1** based rapid development platform - a Spring Boot + Vue.js full-stack separated admin system framework. Despite the "loan-pricing" directory name, this is the standard RuoYi framework template used as a foundation for a loan pricing system.

**Key Technologies:**
- Backend: Java 17, Spring Boot 3.5.8, **MyBatis Plus 3.5.10**, MySQL 8.2.0, Redis (Lettuce)
- Frontend: Vue 2.6.12, Element UI 2.15.14, Vue Router 3.4.9, Vuex 3.6.0
- Security: JWT token authentication, Spring Security with RBAC
- API Docs: SpringDoc OpenAPI 3.0 at `/swagger-ui.html`

## Development Commands

### Backend (Java/Maven)

**Building:**
```bash
# Package entire project (Windows)
bin\package.bat

# Or using Maven directly
mvn clean package -Dmaven.test.skip=true

# Clean build artifacts
bin\clean.bat
```

**Running:**
```bash
# Run using the packaged jar
bin\run.bat

# Or using Maven
mvn spring-boot:run

# Or run directly with java
java -jar ruoyi-admin/target/ruoyi-admin.jar
```

**Testing:**
```bash
mvn test
```

**Default Access:**
- Backend: http://localhost:8080
- API Docs: http://localhost:8080/swagger-ui.html
- Druid Monitor: http://localhost:8080/druid (ruoyi/123456)

### Frontend (Vue.js)

**Development:**
```bash
cd ruoyi-ui
npm install
npm run dev
```

**Production Build:**
```bash
cd ruoyi-ui
npm run build:prod
```

**Staging Build:**
```bash
npm run build:stage
```

**Default Access:** http://localhost

### Default Login Credentials

- Username: `admin`
- Password: `admin123`

## Architecture & Module Structure

### Maven Multi-Module Layout

```
ruoyi/
├── ruoyi-admin/         # Main web application entry point
├── ruoyi-framework/     # Framework utilities (security, config, MyBatis Plus, interceptors)
├── ruoyi-system/        # Core system modules (users, roles, menus, depts)
├── ruoyi-common/        # Common utilities and domain models
├── ruoyi-generator/     # Code generation tool (Velocity templates)
├── ruoyi-quartz/        # Scheduled task management
└── ruoyi-ui/           # Vue.js frontend
```

### Backend Architecture Patterns

**Layered Architecture:**
```
Controller (@RestController) -> Service (@Service) -> Mapper (MyBatis Plus) -> Database
```

**Key Conventions:**
- Controllers in `ruoyi-admin/src/main/java/com/ruoyi/web/controller/`
- Services in `ruoyi-system/src/main/java/com/ruoyi/system/service/`
- Domain entities in `ruoyi-common/src/main/java/com/ruoyi/common/core/domain/`
- MyBatis Plus Mappers 接口在 `ruoyi-system/src/main/java/com/ruoyi/system/mapper/`
- MyBatis XML 映射文件在 `ruoyi-system/src/main/resources/mapper/`

**Security Flow:**
1. JWT tokens stored in `Authorization` header
2. Spring Security filters validate tokens
3. `@PreAuthorize` annotations for method-level permissions
4. Data scoping by department (see `DataScope` aspect)

**Configuration:**
- Main config: [application.yml](ruoyi-admin/src/main/resources/application.yml)
- Environment-specific: [application-dev.yml](ruoyi-admin/src/main/resources/application-dev.yml) (dev profile active by default)
- MyBatis Plus config: [MybatisPlusConfig.java](ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java)

### Frontend Architecture

**Structure:**
```
ruoyi-ui/
├── src/
│   ├── api/           # API request functions (axios)
│   ├── assets/        # Static resources
│   ├── components/    # Reusable Vue components
│   ├── layout/        # Layout components (sidebar, header)
│   ├── router/        # Vue Router configuration
│   ├── store/         # Vuex state management
│   ├── utils/         # Utility functions
│   └── views/         # Page components
├── vue.config.js      # Vue CLI configuration
└── package.json
```

**State Management:**
- Permission routes stored in Vuex `store/permission.js`
- User info in `store/user.js`
- Settings in `store/settings.js`

**API Integration:**
- Base URL configured in `vue.config.js` (proxy to backend)
- Request interceptors add JWT tokens in `src/utils/request.js`

## Database Setup

1. Import schema: [sql/ry_20250522.sql](sql/ry_20250522.sql)
2. Configure connection in [application-dev.yml](ruoyi-admin/src/main/resources/application-dev.yml)
3. Default database name: `ruoyi-test` (change as needed)
4. Redis required for caching (configured in same yml file)

## Code Generation

The framework includes a code generator at `/tool/gen` (when running):
- Generates Controller, Service, MyBatis Plus Mapper, domain classes
- Generates Vue CRUD pages
- Uses Velocity templates in `ruoyi-generator/src/main/resources/vm/`

## Important Configuration Notes

**File Upload:**
- Max single file: 10MB
- Max total: 20MB
- Upload path: `D:/ruoyi/uploadPath` (configurable in application.yml)

**Token Settings:**
- Expiration: 30 minutes
- Header name: `Authorization`
- Secret: configured in application.yml

**Validation:**
- Captcha type: `math` (math calculation) or `char` (character)
- Max password retry: 5 times
- Lock time: 10 minutes

## Common Development Patterns

**Adding a New Feature:**
1. Create database table
2. Use code generator at `/tool/gen` or create manually:
   - Domain entity in `ruoyi-common/.../domain/` (使用 `@Data` 注解)
   - MyBatis Plus Mapper 接口继承 `BaseMapper<Entity>` in `ruoyi-system/.../mapper/`
   - Service interface and implementation in `ruoyi-system/.../service/`
   - Controller in `ruoyi-admin/.../controller/`
   - Vue API function in `ruoyi-ui/src/api/`
   - Vue page component in `ruoyi-ui/src/views/`
3. Add menu permissions in system -> menu management
4. Assign permissions to roles

**Permission Control:**
- Backend: Use `@PreAuthorize("@ss.hasPermi('system:user:list')")`
- Frontend: Use `v-hasPermi="['system:user:add']"` directive

**Data Pagination:**
- Backend: 使用 MyBatis Plus 的 `Page<T>` 对象或 `PageHelper.startPage()`
- Frontend: Use `<el-pagination>` component
