enterprise-saa-s-dashboard-.../.kiro/steering/java-api.md

128 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Java API 技术规范
## 运行环境
- JDK 17
## 框架选型
- Spring Boot 3.3.6 (spring-boot-starter-parent)
- ORMMyBatis-Plus
- Lombok
## 架构约束
- API 采用多模块 Maven 项目结构,父项目统一管理依赖版本
- 项目名: geo-bps
- 包名前缀com.geomative.bps.*
- 子模块划分:
- `api-admin` 后台管理入口模块:需登录鉴权,引入 `website`、`device`、`library`、`permission` 等模块
- `api-portal` 前端门户入口模块:无需登录,仅引入对外开放的业务模块
- `device` 设备管理模块
- `website` 网站管理后台
- `library` 资料库模块
- `permission` 权限管理模块
- `common` 公共模块:工具类、基础配置、统一响应格式、全局异常处理等共享代码
- 项目路径:`apps/geo-bps-api/`
- groupId`com.geomative.bsp`
- artifactId`geo-bps-api`
- 项目整体结构:
```
apps/geo-bps-api/
├── pom.xml # 父 POM统一依赖版本管理
├── api-admin/ # 后台管理入口Spring Security 鉴权配置
├── api-portal/ # 前端门户入口,公开接口无需授权
├── business/ # 业务模块聚合器pom packaging
│ ├── pom.xml
│ ├── permission/ # 权限管理模块
│ ├── website/ # 网站业务模块(被两个入口共享)
│ ├── device/ # 设备管理模块
│ └── library/ # 资料库模块
└── common/ # 公共工具、基础配置、统一响应体
```
## 编码规范
### 命名规范
- 类名使用 UpperCamelCase`DeviceService`、`UserDO`
- 方法名、变量名使用 lowerCamelCase`getUserById`、`deviceList`
- 常量全部大写,单词间用下划线,如 `MAX_RETRY_COUNT`
- 包名全部小写,如 `com.example.device.domain`
- 抽象类命名以 `Abstract` 开头;异常类命名以 `Exception` 结尾;测试类命名以被测类名开头、`Test` 结尾
- POJO 类中布尔类型变量不加 `is` 前缀,避免序列化问题
- 领域对象命名后缀约定:
- 数据库映射对象:`XxxDO`
- 数据传输对象:`XxxDTO`
- 视图对象:`XxxVO`
- 查询对象:`XxxQuery`
- 命令对象:`XxxCommand`
### 注释规范
- 所有 public 类、方法必须有 Javadoc 注释
- 方法注释需说明功能、参数含义、返回值、可能抛出的异常
- 代码逻辑复杂处需有行内注释说明意图,而非描述代码本身
- 禁止保留无意义的注释和注释掉的废弃代码
### 异常处理
- 不允许捕获 `Exception` 等大类异常后不做任何处理(空 catch
- 业务异常统一使用自定义异常类,继承 `RuntimeException`
- 不允许用异常控制正常业务流程
- finally 块中不允许使用 return
### 日志规范
- 使用 SLF4J + Logback禁止直接使用 `System.out.println`
- 日志变量声明:`private static final Logger log = LoggerFactory.getLogger(XxxClass.class);`
- 日志输出使用占位符,禁止字符串拼接:`log.info("userId: {}", userId)`
- 异常日志必须输出完整堆栈:`log.error("message", e)`
### 集合与并发
- 初始化集合时指定初始容量,如 `new ArrayList<>(16)`
- 禁止在 foreach 循环中对集合进行 add/remove 操作
- 线程池不允许使用 `Executors` 创建,需通过 `ThreadPoolExecutor` 显式配置参数
### 其他
- 所有方法入参需做非空校验,使用 `Objects.requireNonNull` 或断言
- 魔法值Magic Number禁止直接出现在代码中需定义为常量
- 返回值为集合类型时,不允许返回 null应返回空集合
### DDD 分层架构
- 采用领域驱动设计DDD分层架构每个子模块内部结构如下
```
{module}/
├── interfaces/ # 接口层Controller、DTO、Assembler
├── application/ # 应用层ApplicationService、Command、Query
├── domain/ # 领域层Entity、ValueObject、DomainService、Repository接口、DomainEvent
└── infrastructure/ # 基础设施层Repository实现、Mapper、持久化对象(PO)、外部服务适配
```
## 数据库
- PostgreSQL 12.14 (Debian 12.14-1.pgdg110+1)
### 审计字段规范
- 所有业务表必须包含以下审计字段:
- `created_at` TIMESTAMP NOT NULL — 创建时间INSERT 时自动填充
- `created_by` VARCHAR(64) NULL — 创建人用户ID或用户名字符类型
- `updated_at` TIMESTAMP NOT NULL — 最后修改时间INSERT 和 UPDATE 时自动填充
- `updated_by` VARCHAR(64) NULL — 最后修改人用户ID或用户名字符类型
- `deleted` TINYINT NOT NULL DEFAULT 0 — 删除状态0=未删除1=已删除
### 主键规范
- 所有业务表主键类型为 VARCHAR(64)由应用层生成如雪花算法、UUID 字符串等),不使用数据库自增或 UUID 类型
### PostgreSQL Schema 分模块
- 不同子模块的表使用不同的 PostgreSQL schema 进行隔离:
- `perm` — permission 模块admin_users、revoked_tokens、admin_menus、admin_roles 等)
- `web` — website 模块nav_menus、branches、sub_branches、pages、page_contents、page_seo、fixed_page_contents、enabled_locales 等)
- `dev` — device 模块quotations、access_logs、configurator_steps 等)
- `lib` — library 模块knowledge_articles 等)
- `common` — 公共表contact_submissions、system_config 等)
- MyBatis-Plus 通过 `@TableName(schema = "xxx")` 或全局配置指定 schema
- MyBatis-Plus 配置:
- 通过 `MetaObjectHandler` 自动填充 `created_at`、`updated_at`
- 通过 `@TableLogic` 注解标记 `deleted` 字段实现逻辑删除
- 查询默认过滤 `deleted=1` 的记录
## 部署
- 集成 Nginx 作为前置代理
- `api-admin`Nginx 直接流量穿透,转发至单实例后台管理服务
- `api-portal`Nginx 4层负载均衡TCP/stream模块支持多实例横向扩展