syzc/CLAUDE.md

325 lines
14 KiB
Markdown
Raw Permalink Normal View History

2026-06-12 16:14:58 +08:00
# 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 GatewayWebFlux |
| 安全 | OAuth2 / JWT自研 Secure 框架)、数据权限、接口权限 |
| 缓存 | RedisProtostuff 序列化) |
| 工作流 / 任务调度 | Flowable / PowerJob |
| 数据库连接池 | Druid |
| 文档 | Knife4jOpenAPI 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 用 TabYAML/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<Notice> noticeList`(✅)`List<Notice> 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<T>` | `extends BaseServiceImpl<M, T>` | Notice, Post, Dept |
| **非租户业务表** | `extends BaseEntity` | `extends BaseService<T>` | `extends BaseServiceImpl<M, T>` | Tenant |
| **轻量级/关系表** | `implements Serializable` | `extends IService<T>` | `extends ServiceImpl<M, T>` | 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<T>` 响应体
- Entity → VO 转换通过 `XxxWrapper.build().entityVO()` / `.pageVO()`
### 6.4 Feign ClientCloud 特有)
- 定义在 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 APILambda 保持简洁
### 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.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* 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>: 简要描述`
| Gitmoji | 场景 | 示例 |
| --- | --- |------------------------|
| `:sparkles:` | 新增功能 | `:sparkles: 新增角色授权功能` |
| `:zap:` | 优化重构 | `:zap: 优化字典查询排序逻辑` |
| `:bug:` | 修复缺陷 | `:bug: 修复用户查询未过滤已删除数据` |
| `:tada:` | 版本发布 | `:tada: x.x.x.RELEASE` |
| `:recycle:` | 代码重构 | `:recycle: 重构租户删除逻辑` |
---
## 13. 框架组件速查
| 组件 | 用途 |
| --- | --- |
| `R<T>` | 统一 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 亦使用中文