# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## 构建和开发命令 ### 构建应用程序 ```bash # 清理构建(默认跳过测试) mvn clean package # 清理构建并执行测试 mvn clean package -DskipTests=false # 运行应用程序 mvn spring-boot:run ``` ### 测试命令 ```bash # 运行特定测试类 mvn test -Dtest=FaceCleanerTest # 运行特定包的测试 mvn test -Dtest="com.ycwl.basic.storage.adapters.*Test" # 运行所有测试 mvn test -DskipTests=false ``` ### 开发环境配置 应用程序使用 Spring 配置文件: - 默认激活配置文件:`dev` - 生产环境配置文件:`prod`(启用定时任务) - 配置文件:`application-dev.yml`、`application-prod.yml` ## 架构概览 这是一个 Spring Boot 3.3.5 应用程序(Java 21),采用多租户架构,通过不同的 API 端点为不同的客户端类型提供服务。 ### 控制器架构 - **移动端 APIs** (`/api/mobile/`):面向移动应用的客户端端点 - **PC 端 APIs** (`/api/`):Web 仪表板/管理面板端点 - **任务 APIs** (`/task/`):后台工作和渲染任务端点 - **外部 APIs**:专用集成(打印机、代理、viid、vpt、wvp) ### 核心业务模块 #### 工厂模式实现 三个主要工厂类管理第三方集成: 1. **StorageFactory** (`com.ycwl.basic.storage.StorageFactory`) - 管理:本地存储、AWS S3、阿里云 OSS 存储适配器 - 配置节:`storage.configs[]` 2. **PayFactory** (`com.ycwl.basic.pay.PayFactory`) - 管理:微信支付、聪明支付适配器 - 配置节:`pay.configs[]` 3. **FaceBodyFactory** (`com.ycwl.basic.facebody.FaceBodyFactory`) - 管理:阿里云、百度人脸识别适配器 - 配置节:`facebody.configs[]` #### 适配器模式 每个工厂使用标准化接口: - `IStorageAdapter`:文件操作(上传/下载/删除/ACL) - `IPayAdapter`:支付生命周期(创建/回调/退款) - `IFaceBodyAdapter`:人脸识别操作 #### 定时任务系统 `com.ycwl.basic.task` 包中的后台任务(仅生产环境): - `VideoTaskGenerator`:人脸识别和视频处理 - `FaceCleaner`:人脸和存储清理任务 - `DynamicTaskGenerator`:带延迟队列的动态任务创建 - `ScenicStatsTask`:统计数据聚合 ### 数据库和持久化 - **MyBatis Plus**:具有自动 CRUD 操作的 ORM - **MapperScan**:扫描 `com.ycwl.basic.mapper` 及子包 - **数据库**:MySQL 配合 HikariCP 连接池 - **Redis**:会话管理和缓存 ### 主要库和依赖 - Spring Boot 3.3.5 启用 Java 21 虚拟线程 - MyBatis Plus 3.5.5 用于数据库操作 - JWT (jjwt 0.9.0) 用于身份验证 - 微信支付 SDK 用于支付处理 - 阿里云 OSS 和 AWS S3 用于文件存储 - 阿里云和百度 SDK 用于人脸识别 - OpenTelemetry 用于可观测性(开发环境中禁用) ### 业务逻辑组织 - **Service 层**:`service` 包中的业务逻辑实现 - **Biz 层**:`biz` 包中的高级业务编排 - **Repository 模式**:`repository` 包中的数据访问抽象 - **自定义异常**:特定领域的异常处理 ### 配置管理 每个模块使用 Spring Boot 自动配置启动器: - 支持多供应商的命名配置 - 通过配置进行默认供应商选择 - 针对不同环境的特定配置文件 ## 常见开发模式 ### 添加新的存储/支付/人脸识别供应商 1. 实现相应接口(`IStorageAdapter`、`IPayAdapter`、`IFaceBodyAdapter`) 2. 在相应的类型枚举中添加枚举值 3. 更新工厂的 switch 表达式 4. 如需要,添加配置类 5. 在 application.yml 中更新新供应商配置 ### 身份验证上下文 在整个应用程序中使用 `BaseContextHandler.getUserId()` 获取当前已认证用户 ID。 ### API 响应模式 所有 API 都返回 `ApiResponse` 包装器,通过 `CustomExceptionHandle` 进行一致的错误处理。 ### 添加新的定时任务 1. 在 `com.ycwl.basic.task` 包中创建类 2. 添加 `@Component` 和 `@Profile("prod")` 注解 3. 使用 `@Scheduled` 进行基于 cron 的执行 4. 遵循现有的错误处理和日志记录模式 ## 价格查询系统 (Pricing Module) ### 核心架构 价格查询系统是一个独立的业务模块,位于 `com.ycwl.basic.pricing` 包中,提供商品定价、优惠券管理和价格计算功能。 #### 关键组件 - **PriceCalculationController** (`/api/pricing/calculate`):价格计算API - **CouponManagementController** (`/api/pricing/admin/coupons/`):优惠券管理API - **PricingConfigController** (`/api/pricing/config/`):价格配置管理API #### 商品类型支持 ```java ProductType枚举定义了支持的商品类型: - VLOG_VIDEO: Vlog视频 - RECORDING_SET: 录像集 - PHOTO_SET: 照相集 - PHOTO_PRINT: 照片打印 - MACHINE_PRINT: 一体机打印 ``` #### 价格计算流程 1. 接收PriceCalculationRequest(包含商品列表和用户ID) 2. 查找商品基础配置和分层定价 3. 处理套餐商品(BundleProductItem) 4. 自动应用最优优惠券 5. 返回PriceCalculationResult(包含原价、最终价格、优惠详情) #### 优惠券系统 - **CouponType**: PERCENTAGE(百分比)、FIXED_AMOUNT(固定金额) - **CouponStatus**: CLAIMED(已领取)、USED(已使用)、EXPIRED(已过期) - 支持商品类型限制 (`applicableProducts` JSON字段) - 最小消费金额和最大折扣限制 - 时间有效期控制 #### 分页查询功能 所有管理接口都支持分页查询,使用PageHelper实现: - 优惠券配置分页:支持按状态、名称筛选 - 领取记录分页:支持按用户、优惠券、状态、时间范围筛选 #### 统计功能 - 基础统计:领取数、使用数、可用数 - 详细统计:使用率、平均使用天数 - 时间范围统计:指定时间段的整体数据分析 ### 开发模式 #### 添加新商品类型 1. 在ProductType枚举中添加新类型 2. 在PriceProductConfig表中配置default配置 3. 根据需要添加分层定价(PriceTierConfig) 4. 更新前端产品类型映射 #### 添加新优惠券类型 1. 在CouponType枚举中添加类型 2. 在CouponServiceImpl中实现计算逻辑 3. 更新applicableProducts验证规则 #### 自定义TypeHandler使用 项目使用自定义TypeHandler处理复杂JSON字段: - `BundleProductListTypeHandler`:处理套餐商品列表JSON序列化 ### 测试策略 - 单元测试:每个服务类都有对应测试类 - 配置验证测试:DefaultConfigValidationTest验证default配置 - JSON序列化测试:验证复杂对象的数据库存储 - 分页功能测试:验证PageHelper集成