Files
hera/AGENTS.md

73 lines
4.4 KiB
Markdown
Raw Permalink 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.
# Hera Backend Agent Guide
本文件适用于本仓库全部目录。Codex 修改代码前必须先阅读本文件,并遵循阿里巴巴《Java 开发手册》的命名、分层、异常处理和数据库规范。
## 技术基线
- Java 8,Spring Boot 2.7.x,MyBatis 2.3.x,MySQL 8.x。
- 构建工具为 Maven,编码统一使用 UTF-8。
- 不得擅自升级 Java、Spring Boot 或数据库大版本。
- 优先复用现有包结构、公共响应、异常和鉴权组件,避免引入功能重复的依赖。
## 修改流程
1. 修改前先检查 `git status`,保留用户已有的未提交改动。
2. 阅读需求涉及的 Controller、Service、Mapper、实体和 SQL,不凭字段名猜测数据库结构。
3. 数据库结构以 `src/main/resources/schema.sql` 和用户提供的最新 SQL 为准。
4. 改动保持最小范围,不做与需求无关的格式化或重构。
5. 完成后至少执行编译、`git diff --check` 和受影响功能验证。
## Java 编码规范
- 类名使用 UpperCamelCase,方法、参数和变量使用 lowerCamelCase,常量使用 UPPER_SNAKE_CASE。
- Mapper 接口统一以 `Mapper` 结尾,Service 和 Controller 分别以 `Service`、`Controller` 结尾。
- 包名全部小写;按 `controller/service/mapper/entity` 职责分层,禁止跨层绕过 Service 直接访问 Mapper。
- 方法职责保持单一。复杂条件先拆分为有业务含义的方法,避免深层嵌套。
- 禁止无含义的魔法值;有业务含义的状态值应提取为常量或枚举。
- 字符串比较使用常量调用 `equals`,包装类型比较使用 `equals`,不得依赖 `==`。
- 返回集合时优先返回空集合而不是 `null`。
- 捕获异常后必须处理、转换或记录,禁止空 `catch`;不得把数据库或系统内部异常原文直接返回前端。
- `ThreadLocal` 必须在请求结束时执行 `remove()`。
- 日期时间使用 `java.time` API,不新增 `Date`/`Calendar` 业务代码。
- 不写无意义注释;实体类、实体字段和公共 API 必须使用 `/** ... */` Javadoc 说明业务含义。
## Spring 与接口规范
- Controller 只负责参数接收、鉴权上下文和响应包装,业务逻辑放在 Service。
- 写操作需要事务时在 Service 层使用 `@Transactional`。
- 接口统一返回 `ApiResponse<T>`,业务错误统一抛出 `BusinessException`。
- 新增 `/api/**` 接口默认需要 JWT;公开接口必须显式加入白名单并说明原因。
- 请求参数必须设置合理的长度、范围和分页上限,不信任客户端传入的用户 ID 或状态值。
- 密码、密钥、身份证信息等敏感字段不得出现在日志或接口响应中。
## MyBatis 规范
- Mapper 接口只声明方法并保留 `@Mapper`;业务 SQL 统一写在 `src/main/resources/mapper/*.xml`。
- XML 文件名与 Mapper 接口名一致,`namespace` 必须是 Mapper 接口的完整类名。
- 多参数方法必须使用 `@Param` 明确命名。
- 查询必须显式列出字段,禁止使用 `SELECT *`。
- 数据库字段使用 snake_case,Java 属性使用 lowerCamelCase;依赖 MyBatis 驼峰映射或显式 `resultMap`。
- 新增记录需要回填主键时使用 `useGeneratedKeys="true" keyProperty="id"`。
- 更新和删除必须带明确的主键或业务条件;禁止无条件全表更新、删除。
- 分页参数必须在 Service 层限制范围;当前单页最大值为 100。
- 唯一约束和外键冲突转换为可理解的业务响应,不向客户端暴露 SQL。
## 数据库规范
- 表名、字段名使用小写 snake_case;主键统一命名为 `id`。
- 表和重要字段必须有业务注释;时间字段统一使用 `created_at`、`updated_at`。
- 线上可重复执行的初始化脚本使用 `CREATE TABLE IF NOT EXISTS`,禁止在应用启动脚本中使用 `DROP TABLE`。
- 修改表结构时考虑已有数据兼容性;不得通过删除重建表来完成普通字段变更。
- 账号密码只保存安全哈希;真实姓名、身份证号等敏感信息按字段约定加密或哈希后存储。
## 验证命令
本机无全局 Maven 时,使用 IntelliJ 自带 Maven 和已安装的 JDK 8:
```bash
env JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home' \
'/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/bin/mvn' test
```
涉及数据库 Mapper 时,还应在可用的测试数据库上至少验证对应的查询和写入链路;写入的临时数据必须在验证结束后清理。