# CLAUDE.md 本文件用于指导 Claude Code (claude.ai/code) 在此代码仓库中工作时的行为规范。 > 本规范适用于 BladeX 微服务平台的所有开发任务,为强制性条款。除非用户显式豁免,任何条目都不得忽视或删减。 > > 作为 AI 助手参与本项目开发时,你必须: > - 每次输出前深度理解 BladeX 微服务架构、Spring Cloud 全栈技术特征和多租户业务模型 > - 当回答依赖外部知识时,先查询 Spring Boot 3.x、Spring Cloud 2025、MyBatis-Plus 等官方文档 > - 若需求含糊,先复述已知信息并列出关键澄清问题 > - 面对复杂需求,先拆分为可管理的子任务 > > 所有开发内容必须建立在深度思考过的基础之上,禁止机械生成与错误填充。 > 如果你已了解所有规范,请在用户第一次对话时说明:"我已充分了解 BladeX 微服务平台开发规范。" --- ## 1. 项目概述 BladeX 是基于 Spring Cloud 2025 + Spring Boot 3.x 构建的**企业级微服务开发平台**,提供 SaaS 多租户、OAuth2 认证、数据/接口权限、工作流、分布式事务等核心能力。 --- ## 2. 项目架构 ``` BladeX/ ├── blade-auth/ # OAuth2 认证授权服务 ├── blade-common/ # 公共模块(常量、工具类、启动配置) ├── blade-gateway/ # Spring Cloud Gateway 网关服务 ├── blade-ops/ # 运维服务模块 │ ├── blade-admin/ # Spring Boot Admin 监控 │ ├── blade-develop/ # 代码生成服务 │ ├── blade-flow/ # Flowable 工作流服务 │ ├── blade-job/ # 分布式任务调度 │ ├── blade-log/ # 日志服务 │ ├── blade-report/ # 报表服务 │ └── blade-resource/ # 资源管理服务(OSS、SMS) ├── blade-ops-api/ # 运维服务 API 契约 ├── blade-plugin/ / blade-plugin-api/ # 插件扩展模块(预留) ├── blade-service/ # 业务服务模块 │ ├── blade-desk/ # 工作台服务(通知、流程) │ └── blade-system/ # 系统管理服务(用户、角色、菜单、租户等) ├── blade-service-api/ # 业务服务 API 契约 ├── doc/ # Nacos 配置 & 多数据库建表脚本 ├── script/ # Docker / FatJar 部署脚本 └── pom.xml # Maven 父工程配置 ``` ### 2.1 分层架构 每个业务模块遵循标准分层,**API 与 Service 分离**: | 层次 | 包路径 | 所在模块 | | --- | --- | --- | | Controller | `controller/` | Service 模块 | | Service / ServiceImpl | `service/` + `service/impl/` | Service 模块 | | Mapper(接口 + XML 同包) | `mapper/` | Service 模块 | | Wrapper | `wrapper/` | Service 模块(Entity → VO 转换) | | Entity / VO / DTO | `pojo/entity/` `pojo/vo/` `pojo/dto/` | **API 模块** | | Feign Client | `feign/` | **API 模块**(含 Fallback 降级) | | Cache | `cache/` | **API 模块** | ### 2.2 API 与 Service 分离原则 - **API 模块**(`blade-*-api`):定义 Entity、VO、DTO、Feign 接口、Cache 工具,供其他服务依赖 - **Service 模块**(`blade-service/*`、`blade-ops/*`):实现 Controller、ServiceImpl、Mapper、Wrapper - 跨服务调用通过 Feign Client 完成,禁止直接依赖其他 Service 模块 > **与 Boot 版的关键区别**:Cloud 采用 API/Service 模块分离,跨服务通过 Feign 调用;Controller 路由无需 `AppConstant` 前缀(网关按服务名路由)。 --- ## 3. 技术栈 | 类别 | 技术 | | --- | --- | | 基础框架 | Spring Boot 3.2.x / Spring Cloud 2025 / Maven | | ORM | MyBatis-Plus(禁止 JDBC 直连) | | 微服务 | Nacos(注册/配置)、Sentinel(熔断)、Seata(分布式事务)、OpenFeign | | 网关 | Spring Cloud Gateway(WebFlux) | | 安全 | OAuth2 / JWT(自研 Secure 框架)、数据权限、接口权限 | | 缓存 | Redis(Protostuff 序列化) | | 工作流 / 任务调度 | Flowable / PowerJob | | 数据库连接池 | Druid | | 文档 | Knife4j(OpenAPI 3.0) | | 监控 | Spring Boot Admin / Prometheus / ELK / Zipkin | | 数据库 | MySQL / PostgreSQL / Oracle / SQL Server / 达梦 / 人大金仓 / 崖山 | --- ## 4. 开发规范 ### 4.1 编写新功能前 1. 先阅读目标模块中已有的类,理解其结构、命名和风格 2. 标准参考模块:`blade-service/blade-system`(Service)、`blade-service-api/blade-system-api`(API) 3. 主动模仿现有代码风格,包括缩进(Java 用 Tab,YAML/JSON 用 2 空格)、注解顺序、Javadoc 格式 4. 新建类必须包含 BladeX 商业许可证头部和 Javadoc 类注释(`@author Chill`) ### 4.2 编写完成后 1. 使用 `mvn clean compile -DskipTests` 编译验证,编译不通过必须修复 2. 引入模块依赖前先检查循环依赖,若存在则采用更优方案 3. 编译通过后将测试交由用户执行,**不得自行执行任何测试** 4. 除非用户明确要求,不应撰写示例或额外文档 ### 4.3 代码生成 当需要生成 CRUD 全套代码(Entity、VO、Service、Controller、Wrapper、Mapper、建表语句等)时,优先使用 **`/blade-design`** skill。该 skill 可根据模块名、实体名和字段列表,自动生成符合 BladeX 框架规范的后端代码和多数据库建表语句,确保生成结果与项目风格完全一致。 --- ## 5. 命名规范 ### 5.1 包名 统一前缀 `org.springblade`,按模块划分:`system`、`desk`、`auth`、`gateway`、`develop`、`flow`、`common` 等 ### 5.2 类名 | 类型 | 规则 | 示例 | | --- | --- | --- | | Entity | 直接类名 | `Notice`、`Tenant` | | VO / DTO | `XxxVO` / `XxxDTO` | `NoticeVO`、`DeptDTO` | | Service 接口 | `IXxxService` | `INoticeService` | | Service 实现 | `XxxServiceImpl` | `NoticeServiceImpl` | | Controller | `XxxController` | `NoticeController` | | Mapper | `XxxMapper` | `NoticeMapper` | | Wrapper | `XxxWrapper` | `NoticeWrapper` | | Feign 接口 / 降级 | `IXxxClient` / `IXxxClientFallback` | `INoticeClient` | | 表名 | `blade_` + 下划线 | `blade_notice` | ### 5.3 变量命名 - 必须具有明确语义:`Exception exception`(✅)`Exception e`(❌);`List noticeList`(✅)`List list`(❌) - 冲突时提升语义:`Cache cache; Cache noticeCache`(✅)`Cache cache1; Cache cache2`(❌) --- ## 6. 编码规范 ### 6.1 注解顺序 - **Controller 类**:租户注解(`@TenantDS`/`@NonDS`) → `@RestController` → Lombok(`@AllArgsConstructor`) → 安全注解(`@PreAuth`) → `@RequestMapping` → `@Tag` - **Controller 方法**:HTTP 方法注解 → `@ApiOperationSupport(order=N)` → `@Operation` - **Entity 类**:`@Data` → `@EqualsAndHashCode` → `@TableName` → `@Schema` - **VO 类**:`@Data` → `@EqualsAndHashCode(callSuper = true)` → `@Schema` ### 6.2 Entity-Service 继承体系(核心) Entity 基类的选择**直接决定** Service 和 ServiceImpl 的继承方式,三者必须配套: | 场景 | Entity | Service 接口 | ServiceImpl | 示例 | | --- | --- | --- | --- | --- | | **多租户业务表** | `extends TenantEntity` | `extends BaseService` | `extends BaseServiceImpl` | Notice, Post, Dept | | **非租户业务表** | `extends BaseEntity` | `extends BaseService` | `extends BaseServiceImpl` | Tenant | | **轻量级/关系表** | `implements Serializable` | `extends IService` | `extends ServiceImpl` | RoleMenu, Dict, Role | - `TenantEntity` 继承自 `BaseEntity` 并额外包含 `tenantId` - `BaseEntity` 包含:id, createUser, createDept, createTime, updateUser, updateTime, status, isDeleted - `BaseService`/`BaseServiceImpl` 是 BladeX 增强版,提供 `deleteLogic()` 等方法,**要求 Entity 继承 BaseEntity 或 TenantEntity** - `IService`/`ServiceImpl` 是 MyBatis-Plus 原生版,用于 `implements Serializable` 的轻量实体,删除用 `removeByIds()` ### 6.3 Controller 约定 - 继承 `BladeController`,使用 `@AllArgsConstructor` 注入 - **路由直接使用资源路径**(如 `@RequestMapping("notice")`),网关按服务名路由,无需 `AppConstant` 前缀(Boot 版需要前缀) - 统一返回 `R` 响应体 - Entity → VO 转换通过 `XxxWrapper.build().entityVO()` / `.pageVO()` ### 6.4 Feign Client(Cloud 特有) - 定义在 API 模块的 `feign/` 包中 - `@FeignClient(value = AppConstant.APPLICATION_XXX_NAME)` - 路径常量定义在接口内:`String API_PREFIX = "/feign/client/xxx"` - 降级类命名:`IXxxClientFallback` ### 6.5 依赖注入 - Controller 使用 `@AllArgsConstructor` + `private final` 字段 - Service 需要额外依赖时使用 `@RequiredArgsConstructor` + `private final` 字段 ### 6.6 Lombok 禁止手写 getter/setter,统一使用 `@Data`、`@EqualsAndHashCode(callSuper = true)`、`@AllArgsConstructor`、`@RequiredArgsConstructor`、`@Slf4j` 等 ### 6.7 Java 17 特性 - 可使用增强 switch、Text Blocks、Pattern Matching for instanceof、`@Serial` - **禁止** `var` / `val` 类型推断,所有变量显式声明类型 - 优先使用 Stream API,Lambda 保持简洁 ### 6.8 MyBatis-Plus - 简单查询使用 `LambdaQueryWrapper`,复杂查询写在 Mapper XML 中 - Mapper XML 与接口**同包**放置(`src/main/java` 下) - 分页统一使用 `Condition.getPage(query)` + `Condition.getQueryWrapper()` - 禁止 JDBC 直连查询 ### 6.9 日志 - 使用 `@Slf4j`,占位符传参(禁止字符串拼接) - 包含关键业务标识,异常必须携带堆栈,禁止打印敏感信息 --- ## 7. 数据库规范 - **表名前缀**:`blade_`(如 `blade_notice`、`blade_user`) - **业务表必含字段**:`id`(BIGINT)、`tenant_id`(VARCHAR)、`create_user`、`create_dept`、`create_time`、`update_user`、`update_time`、`status`、`is_deleted` - **主键策略**:雪花算法(`IdType.ASSIGN_ID`),Long 字段用 `@JsonSerialize(using = ToStringSerializer.class)` 防精度丢失 - **逻辑删除**:`is_deleted` (INT),0 = 未删除,1 = 已删除 - **索引命名**:唯一索引 `uk_` 前缀,普通索引 `idx_` 前缀 - **多数据库**:支持 7 种数据库,建表脚本位于 `doc/sql/`,修改表结构时需同步所有脚本 --- ## 8. 多租户与安全 - **多租户**:默认字段隔离模式(`tenant_id`),MP 内置方法自动注入;自定义 SQL 需手动 `AuthUtil.getTenantId()` - **租户注解**:`@TenantDS`(启用数据源切换)/ `@NonDS`(禁用切换) - **权限注解**:`@PreAuth(menu = "xxx")`(菜单权限)、`@PreAuth(AuthConstant.PERMIT_ALL)`(公开) - **数据权限**:DataScopeHandler 行级过滤 - **接口权限**:ApiScopeHandler 端点级控制 --- ## 9. 缓存规范 - `CacheUtil` 统一操作,常量在 `CacheConstant` - 数据变更后清除缓存:`CacheUtil.clear(CACHE_NAME, Boolean.FALSE)` - 字典翻译:`DictCache.getValue(DictEnum.XXX, value)` --- ## 10. 商业许可头部 所有新建的 Java 源文件必须在文件顶部包含以下许可头部: ```java /** * BladeX Commercial License Agreement * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. *

* Use of this software is governed by the Commercial License Agreement * obtained after purchasing a license from BladeX. *

* 1. This software is for development use only under a valid license * from BladeX. *

* 2. Redistribution of this software's source code to any third party * without a commercial license is strictly prohibited. *

* 3. Licensees may copyright their own code but cannot use segments * from this software for such purposes. Copyright of this software * remains with BladeX. *

* Using this software signifies agreement to this License, and the software * must not be used for illegal purposes. *

* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is * not liable for any claims arising from secondary or illegal development. *

* Author: Chill Zhuang (bladejava@qq.com) */ ``` --- ## 11. 构建与部署 ```bash mvn clean compile -DskipTests # 编译验证 mvn clean package -DskipTests # 打包 mvn clean package docker:build -DskipTests # Docker 镜像 ``` - Nacos 配置:`doc/nacos/blade-{dev|test|prod}.yaml` - Docker 部署:`script/docker/app/docker-compose.yml` - 开发环境默认:Nacos `localhost:8848`、Sentinel `localhost:8858`、Redis `127.0.0.1:6379`、MySQL `localhost:3306/bladex` --- ## 12. Git 提交规范 当需要提交代码时,优先使用 **`/blade-commit`** skill,它会自动分析变更内容并生成符合项目规范的 Gitmoji 提交信息。 采用 **Gitmoji** 风格,中文描述。格式:`:: 简要描述` | Gitmoji | 场景 | 示例 | | --- | --- |------------------------| | `:sparkles:` | 新增功能 | `:sparkles: 新增角色授权功能` | | `:zap:` | 优化重构 | `:zap: 优化字典查询排序逻辑` | | `:bug:` | 修复缺陷 | `:bug: 修复用户查询未过滤已删除数据` | | `:tada:` | 版本发布 | `:tada: x.x.x.RELEASE` | | `:recycle:` | 代码重构 | `:recycle: 重构租户删除逻辑` | --- ## 13. 框架组件速查 | 组件 | 用途 | | --- | --- | | `R` | 统一 API 响应 | | `BladeController` | Controller 基类 | | `TenantEntity` / `BaseEntity` | 实体基类(多租户/非租户) | | `BaseService` / `BaseServiceImpl` | BladeX 增强 Service(含 deleteLogic) | | `BaseEntityWrapper` | Entity→VO 转换基类 | | `BladeUser` | 当前登录用户(含租户信息) | | `Condition` / `Query` | 查询条件构建 / 分页参数 | | `CacheUtil` / `DictCache` | 缓存工具 / 字典缓存 | | `AuthUtil` | 获取当前用户/租户信息 | | `Func` / `BeanUtil` / `StringUtil` | 通用工具类 | | `ServiceException` | 业务异常 | | `@PreAuth` / `@TenantDS` / `@NonDS` | 权限 / 租户数据源切换 | | `@BladeView` / `@DataRecord` / `@XssIgnore` | 视图控制 / 数据审计 / XSS 跳过 | --- ## 14. 风格一致性 1. 风格不确定时,优先查阅现有代码并模仿当前模块的实现方式 2. 新模块参考 `blade-service/blade-system` 作为标准模板 3. 现有模块已满足需求时,禁止自写替代实现 4. 与用户交互全程使用**中文**,代码注释和 Javadoc 亦使用中文