9857 字
约 32 分钟
3
后端项目 AI 开发规范(AI Coding Rules)

后端项目 AI 开发规范(AI Coding Rules)

本文档用于约束 AI 编程助手在本项目中的代码生成、代码修改、重构、SQL 编写、数据库设计、接口设计、Git 操作建议以及代码审查行为。

AI 在参与本项目开发时,必须优先遵守本规范。

核心目标:

码出高效,码出质量,保证代码统一、可读、可维护、可扩展、可测试、可追踪。


0. AI 总体行为准则

0.1 基本原则

AI 在生成或修改项目代码时,必须遵循以下原则:

正确性
   ↓
安全性
   ↓
数据一致性
   ↓
可维护性
   ↓
可读性
   ↓
性能
   ↓
代码简洁程度

不得为了“代码更短”牺牲:

  • 可读性
  • 稳定性
  • 数据一致性
  • 可维护性
  • 安全性

0.2 AI 不允许擅自扩大修改范围

如果任务是:

修复订单分页查询 Bug

AI 不应顺手:

重构整个订单模块
升级 Spring Boot
修改数据库字段
调整公共工具类
修改其他无关代码

除非这些修改是解决当前问题所必需。

遵循:

最小必要修改原则。


0.3 AI 修改现有项目时优先遵循已有风格

如果本规范与项目现有代码没有冲突,必须遵循本规范。

如果项目已经形成明确统一的现有约定,例如:

现有 DTO 命名规则
现有异常体系
现有 Result 返回结构
现有 Mapper 规范
现有日志规范
现有包结构

AI 不应自行创造第二套体系。

优先:

理解现有项目
→ 复用现有设计
→ 最小范围修改
→ 保持统一

而不是:

重新设计整个项目

0.4 AI 不得凭空创建基础设施

如果项目已经存在:

Result
BaseException
RedisUtils
UserService
OrderMapper
SecurityUtils

必须优先复用。

禁止因为不知道现有实现就自行生成:

Result2
ResponseResult
NewRedisUtils
CommonException2

造成重复封装。


1. 基础环境规范

1.1 文件路径规范

源码及开发环境相关目录中:

Java
Vue
IDE
JDK
MySQL
Redis
RabbitMQ
Nacos
Maven
Git

所在路径禁止包含:

  • 中文
  • 空格
  • 无必要特殊字符

推荐:

D:/develop/jdk8
D:/develop/mysql
D:/workspace/order-service

不推荐:

D:/开发工具/JDK 8/
D:/我的项目/order service/

2. Java 开发规范

Java 开发默认遵循:

《Java 开发手册(黄山版)》

如果本规范进行了更具体约束,以本项目规范为准。

当前项目默认 Java 版本:

JDK 8

因此 AI 不得生成当前 JDK 无法支持的 Java 语法。

例如未经项目升级,不得默认使用:

record
sealed class
var
switch expression
text block

等高版本特性。


3. 配置文件规范

以下本地环境配置原则上不得提交至 Git:

application-local.yml
application-local.yaml
application-local.properties

以及:

开发人员本机数据库密码
Redis 密码
本地 Nacos 地址
个人 AccessKey
SecretKey
Token
其他敏感信息

AI 如果发现密码、Token、密钥被硬编码进代码或配置文件,应主动指出。

敏感信息必须通过:

环境变量
配置中心
密钥管理系统
部署平台配置

等方式提供。


4. 开发工具统一规范

团队默认开发工具:

IDE:
IntelliJ IDEA

数据库:
Navicat

接口文档 / 接口测试:
Apifox

JDK:
JDK 8

版本管理:
Git

代码仓库:
GitHub

IntelliJ IDEA 必须安装 Alibaba Java Coding Guidelines 插件。

项目正式上线后,接口文档需要做好归档。


5. Git 提交规范

AI 在帮助生成 Commit Message 或分支名称时,必须使用以下规范。


5.1 新功能

格式:

feat/module_name

Commit:

feat/module_name: 具体开发内容

示例:

feat/multi_merchant: 支持多商户下单
feat/order: 增加订单导出功能

5.2 普通 Bug 修复

格式:

bugfix/fix_name

示例:

bugfix/user

Commit:

bugfix/user: 修复手机号为空导致登录失败的问题

5.3 线上紧急修复

格式:

hotfix/fix_name

例如:

hotfix/create_order

Commit:

hotfix/create_order: 修复重复提交导致订单重复创建的问题

hotfix 主要用于:

严重线上 Bug
生产事故
影响核心业务的问题

5.4 性能优化

必须使用:

perf

禁止写成:

pref

格式:

perf/name

示例:

perf/user_login

Commit:

perf/user_login: 优化用户登录查询性能

5.5 不影响业务逻辑的代码调整

使用:

style

例如:

style/log_print: 调整日志格式

适用于:

删除无用注释
格式整理
删除无用 import
无业务影响的代码格式调整

不得将业务重构错误标记为 style。


5.6 重构

使用:

refactor

例如:

refactor/user: 重构用户注册流程

重构原则:

改变代码结构,但原则上不改变业务行为。


5.7 测试

使用:

test

例如:

test/user: 补充用户登录单元测试

适用于:

单元测试
集成测试
测试数据
测试代码

5.8 文档

使用:

docs

例如:

docs/order: 补充订单状态接口说明

适用于:

README
接口文档
技术文档
代码注释

5.9 工程维护

使用:

chore

例如:

chore/dependency: 升级公共依赖版本

适用于:

Maven
依赖
构建脚本
脚手架
工程配置
CI 配置

5.10 Commit 信息要求

禁止使用:

fix
update
修改
优化
测试
代码调整
解决问题
123

Commit 必须说明:

修改类型
+
修改模块
+
具体做了什么

推荐:

bugfix/order: 修复取消订单后库存未释放的问题

而不是:

fix order

6. Git 分支规范

核心分支:

分支 是否保护 说明
test 测试环境
pre 预发布环境
prod 正式生产环境
master 生产代码存档,与 prod 保持同步
feat/* 等 开发分支

6.1 已上线项目

如果系统已经上线:

新功能、普通修复原则上从当前线上稳定代码创建分支:

prod

或者团队明确指定的:

master

例如:

git checkout prod
git pull
git checkout -b feat/order_export

不得默认从 test 拉取。

原因:

test 中可能存在尚未上线代码

6.2 未上线项目

未正式上线项目,从:

test

拉取最新代码。

例如:

git checkout test
git pull
git checkout -b feat/user_login

6.3 线上 Hotfix

生产环境 Bug 必须基于当前生产代码处理。

推荐:

prod
 ↓
hotfix/*
 ↓
Review
 ↓
生产发布流程

禁止:

test
 ↓
hotfix
 ↓
prod

避免把测试环境中尚未上线的功能带入生产。


6.4 公共分支禁止直接开发

禁止直接在:

test
pre
prod
master

编写业务功能。

必须:

稳定分支
   ↓
开发分支
   ↓
开发
   ↓
Push
   ↓
MR / PR

7. Merge Request / Pull Request 规范

开发完成后:

开发分支
 ↓
push 远程仓库
 ↓
创建 MR / PR
 ↓
目标 test

例如:

feat/multi_merchant
       ↓
      test

然后:

将 MR / PR 链接发送团队群
@技术负责人
等待 Code Review

未经 Review:

不得合并。


7.1 Code Review 重点

AI 在执行 CR 时,应重点检查:

业务逻辑
空指针
异常处理
事务
幂等
并发
SQL
索引
数据库一致性
安全问题
SQL 注入
权限
参数校验
日志
性能
重复代码
代码可读性
模块依赖
接口兼容性

不要只检查代码格式。


7.2 CI/CD

代码 Merge 后,通过 CI/CD:

Checkout
 ↓
Build
 ↓
Test
 ↓
Package
 ↓
Image
 ↓
Deploy

原则上不应依赖人工登录服务器执行:

git pull
mvn package
java -jar

完成正常环境发布。


8. 数据库字符集和存储引擎

MySQL 默认:

字符集:
utf8mb4

存储引擎:
InnoDB

9. 数据库命名规范

数据库名:

与项目名保持一致

数据库、表、字段:

小写字母
数字
下划线

禁止:

数字开头
中文
驼峰表名

例如:

推荐:

b_order_info
b_user_address
b_payment_record

不推荐:

OrderInfo
orders
订单表
1_order

10. 表名规范

业务表推荐:

b_业务名称_表用途

例如:

b_order_info
b_order_item
b_user_address

原则上使用单数业务概念。

例如:

推荐:

order
user
product

而不是:

orders
users
products

10.1 禁止滥用缩写

表名和字段名尽量使用完整、有意义的英文单词。

避免:

usr
ord
prod
cont

如果缩写容易产生歧义,必须使用完整名称。

建议名称长度不超过:

32 个字符

11. 数据库注释规范

数据库:

表必须有注释
字段必须有注释

AI 创建 DDL 时不得省略必要 COMMENT。

例如:

`status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '订单状态'

12. 主键规范

每张业务表:

必须存在主键

原则上只有一个主键。

统一命名:

id

推荐:

id bigint NOT NULL

具体 ID 生成策略根据项目现有方案:

数据库自增
雪花算法
分布式 ID

不得擅自引入另一种 ID 体系。


13. 索引规范

唯一索引:

uk_字段名

例如:

uk_order_no

普通索引:

idx_字段名

例如:

idx_user_id

组合索引:

idx_user_id_status

13.1 索引数量

单表索引数量原则上:

不要超过 6 个

但该规则不是机械限制。

如果业务确实需要更多索引,需要根据:

查询频率
数据量
写入压力
选择性
执行计划

综合判断。


13.2 索引选择性

优先在:

选择性较高
查询频率较高
过滤能力较强

的字段建立索引。

不应机械地单独在低选择性字段建立索引,例如:

sex
普通二值 status
is_deleted

如果这些字段与其他高选择性字段形成联合索引,应结合真实查询分析。


14. NULL 与默认值

字段应根据业务设置合理默认值。

尽量减少无业务意义的 NULL。

例如:

0
''
默认状态

但 AI 不得为了“禁止 NULL”而破坏字段本身的业务语义。

如果:

NULL = 尚未发生 / 未填写

具有真实业务含义,可以合理使用 NULL。


15. 金额与小数类型

涉及:

金额
费率
价格
余额
手续费

Java 必须使用:

BigDecimal

MySQL 使用:

DECIMAL

禁止用于金额:

float
double
FLOAT
DOUBLE

16. VARCHAR 规范

VARCHAR 长度必须按照业务合理设置。

原则上如果文本长度非常大,例如超过约:

5000

应评估:

TEXT
对象存储 OSS
独立大字段表

不能无脑:

varchar(10000)
varchar(65535)

17. 布尔字段规范

表达:

是否
开启 / 关闭
存在 / 不存在
启用标识

推荐命名:

is_xxx

例如:

is_open
is_deleted
is_default

数据库类型:

tinyint unsigned

约定:

1 = 是
0 = 否

18. 公共字段规范

业务表至少应考虑:

id
created_time
created_by

根据业务需要增加:

updated_time
updated_by

推荐:

id bigint
created_time datetime
created_by bigint
updated_time datetime
updated_by bigint

如果项目已有统一:

BaseEntity
自动填充机制
MyBatis Plus MetaObjectHandler

应复用现有实现。


19. 常用字段命名

推荐:

status
state
remark

其中具体含义必须由:

字段注释
枚举
业务文档

明确。

不得仅依赖:

0
1
2
3

等魔法数字理解业务。


20. 数据库冗余字段

允许适度冗余,提高查询性能。

但必须满足:

冗余收益明确
数据来源明确
更新机制明确
一致性策略明确

例如订单保存:

商品名称快照
商品价格快照
收货地址快照

可以是合理冗余。

禁止为了“少写 Join”随意复制大量数据。


21. SQL 查询规范

21.1 禁止 SELECT *

禁止:

SELECT *
FROM b_order;

必须明确字段:

SELECT
    id,
    order_no,
    user_id,
    status,
    created_time
FROM b_order;

原因:

降低无效数据传输
减少字段耦合
提高覆盖索引可能性
避免表结构变化影响接口

21.2 SQL 不得机械迷信规则

对于:

!=
<>
IS NULL
OR

AI 不得简单断言:

“一定导致索引失效”

而应该:

结合索引
数据分布
MySQL 优化器
EXPLAIN
真实执行计划

判断。

原则:

尽量写有利于索引和优化器执行的 SQL,但最终以执行计划为依据。


21.3 OR 查询

对于复杂 OR:

WHERE a = ?
   OR b = ?

如果执行计划表现较差,可以考虑:

UNION ALL

但必须保证:

结果语义一致
是否允许重复数据
索引可使用

不得机械替换。


21.4 模糊查询

以下查询:

LIKE '%keyword%'

普通 B-Tree 索引通常无法有效完成前缀定位。

对于:

大数据量
高频搜索
全文搜索

应评估:

Elasticsearch
专业全文检索方案
倒排索引

不得让核心接口长期依赖大表全模糊扫描。


21.5 联合索引

多个 WHERE 条件可以考虑联合索引。

例如:

WHERE user_id = ?
  AND status = ?
  AND created_time >= ?

索引:

idx_user_id_status_created_time

设计时考虑:

最左匹配
字段选择性
排序
范围查询
覆盖索引
真实 SQL

不得只按字段出现顺序机械创建联合索引。


21.6 避免超大 SQL

对于非常复杂的大查询,应评估是否可以:

拆分查询
预聚合
缓存
离线计算
ES
冗余字段
中间表

但拆分 SQL 也会增加:

网络调用
数据库往返
应用计算
数据一致性问题

因此必须根据实际性能决定。


22. EXPLAIN

重要 SQL 必须关注执行计划。

至少检查:

type
possible_keys
key
key_len
rows
filtered
Extra

通常优先追求:

const
eq_ref
ref
range

但 AI 不得简单使用:

system、cost 是最优

这种错误或过度简化的说法。

最终应综合:

扫描行数
索引
回表
排序
临时表
数据量
执行耗时

判断。


23. 隐式类型转换

查询参数类型必须尽量与数据库字段类型一致。

例如数据库:

user_id BIGINT

Java / SQL 参数应使用相匹配的数字类型。

避免:

数字字段传字符串
字符串字段传数字

导致隐式类型转换、索引效果下降或语义异常。


24. Java 命名规范

代码命名禁止:

以下划线开头
以下划线结尾
以 $ 开头
以 $ 结尾

普通业务代码不得随意使用 $


25. 禁止拼音式命名

禁止:

userXinxi
dingdanService
getYonghu

应使用完整英文:

userInfo
orderService
getUser

已经形成国际通用名称或专有名称除外,例如:

Hangzhou
Taobao
Alipay

26. 类名规范

使用:

UpperCamelCase

例如:

UserManagerServiceImpl
OrderController
PaymentService

27. 方法和变量命名

使用:

lowerCamelCase

例如:

addUserInfo()
createOrder()
userId
orderNo

28. Service / DAO 方法命名

查询单个对象

推荐:

get

例如:

getUser()
getUserById()

查询多个对象

推荐:

list

例如:

listUsers()
listOrders()

如果项目历史规范已经统一:

getUserList()

则保持项目现有风格。

不要一个项目中同时出现三种没有规律的命名。


统计

推荐:

count

例如:

countUsers()
countOrdersByStatus()

新增

使用:

save
insert
create

例如:

saveUser()
insertOrder()
createPayment()

其中:

create

更适合业务动作,

insert

更适合 DAO / Mapper 持久层动作。


删除

使用:

remove
delete

例如:

deleteUserById()
removeOrder()

修改

使用:

update

例如:

updateUser()
updateOrderStatus()

29. 常量规范

常量名称:

全部大写
单词之间使用 _

例如:

private static final int MAX_RETRY_COUNT = 3;

禁止:

private static final int maxRetryCount = 3;

作为常量命名。


30. 常量作用域

常量放置位置必须遵循:

作用范围越小越好。

优先级:

类内
 ↓
包内
 ↓
模块内
 ↓
应用内
 ↓
跨服务

不要因为“以后可能会用”就把常量全部放进:

CommonConstants
GlobalConstants

30.1 跨服务常量

真正跨服务共享时,放入项目约定的公共模块,例如:

lamp-common

的:

constant

目录。


30.2 应用级共享常量

多个子模块使用,可以放入:

lamp-xxx-entity/constant

等项目现有公共位置。


30.3 模块级常量

只被当前模块使用:

当前模块 constant

30.4 类内常量

只被单个类使用:

private static final

直接定义在类内部。


31. 枚举规范

枚举类建议:

Enum

结尾。

例如:

OrderStatusEnum
PaymentTypeEnum

枚举成员:

全大写
下划线分割

例如:

WAIT_PAY
PAY_SUCCESS
PAY_FAILED

禁止在代码中大量出现没有说明的:

if (status == 3)

应该使用:

OrderStatusEnum.PAY_SUCCESS

或者项目现有的枚举值体系。


32. 工具类规范

工具类统一:

Utils

作为后缀。

例如:

JsonUtils
DateUtils
EncryptUtils

但如果成熟类库已有能力:

Hutool
Apache Commons
Spring
JDK

禁止无意义重新封装。


33. 类命名补充

抽象类:

Abstract
Base

例如:

AbstractPaymentHandler
BaseController

异常类:

Exception

结尾。

例如:

OrderCreateException

测试类:

被测试类名 + Test

例如:

OrderServiceTest

34. 设计模式应体现在命名中

如果代码明确使用设计模式,应让名称表达职责。

例如:

PaymentStrategy
AlipayPaymentStrategy
PaymentStrategyFactory
OrderState
PaymentHandler

而不是:

PaymentUtil1
PaymentManager2
CommonHandler

35. 注释规范

对于:

核心类
公共接口
公共方法
复杂业务逻辑
关键字段

必须有必要说明。

JavaDoc 至少描述:

类的职责
方法做什么
重要参数
返回值
异常或限制

例如:

/**
 * 创建订单。
 *
 * @param request 创建订单参数
 * @return 订单 ID
 */
public Long createOrder(CreateOrderRequest request) {
}

35.1 禁止低质量注释

禁止:

// 获取用户
User user = getUser();

这种重复代码含义的无价值注释。

注释应该解释:

为什么这么做
业务限制是什么
容易误解的地方是什么
为什么不能直接修改

35.2 注释必须同步维护

AI 修改代码时:

如果原注释已经错误,必须一起修改。

不能出现:

代码是 A
注释还描述 B

错误注释比没有注释更加危险。


36. DTO / VO / Entity Copy

对象转换时:

优先使用项目已有方案。

如果项目已经统一:

MapStruct
BeanUtils
BeanCopier
手工 mapping

继续使用。

禁止因为方便随意混入多套对象转换技术。

对于性能敏感、大量循环对象转换:

应避免高开销反射式复制。


37. Java 8 特性

可以合理使用:

Lambda
Stream
Optional
Method Reference
CompletableFuture

但禁止为了“显得高级”强行使用。

例如简单循环:

for (...)

如果更清晰,就无需强行改成复杂 Stream。

原则:

可读性优先于炫技。


38. Hutool

项目允许使用 Hutool。

可以合理使用:

JSONUtil
StrUtil
MapUtil
DateUtil
CollUtil

但使用前必须判断:

项目是否已经引入 Hutool
当前版本是否支持
JDK 是否已有更直接方案
Spring 是否已经提供相同能力

禁止为了调用一个简单方法额外增加重量依赖。


39. API 路径规范

外部 API 统一考虑增加:

/api

例如:

https://example.com/api/pay/goPay

RESTful 风格优先推荐:

POST /api/orders
GET  /api/orders/{id}
POST /api/payments

如果项目已经有统一接口风格,以已有项目规则为准。


40. 对外接口字段规范

给:

H5
APP
第三方
前端

提供接口时:

只返回调用方真正需要的数据。

禁止直接暴露数据库 Entity。

例如禁止:

return userEntity;

推荐:

return userVO;

避免泄露:

内部字段
敏感字段
数据库设计
无关字段

41. MyBatis SQL 注入规范

禁止:

${param}

直接拼接用户输入。

例如禁止:

WHERE username = '${username}'

必须优先:

WHERE username = #{username}

${} 只有在确实需要动态 SQL 结构,并且输入经过严格白名单控制的情况下才能使用,例如:

动态排序字段
动态表名

也不能直接信任用户传值。


42. 参数校验

重要接口必须进行参数合法性校验。

例如:

不能为空
长度
范围
格式
枚举合法性
金额
ID
时间区间
分页大小

Controller 层可结合:

@Valid
@Validated

业务规则仍应在业务层校验。


43. 方法长度

Java 方法原则上控制在:

100 行以内

如果一个方法过长,优先:

拆职责
提取方法
划分业务步骤
使用合适的设计模式

但禁止为了满足“100 行”机械拆成:

method1()
method2()
method3()

却没有提高语义和可读性。


44. 方法参数规范

当方法参数超过:

3 个

应优先考虑:

Request
Command
DTO
Query Object

封装。

例如不推荐:

createOrder(
    Long userId,
    Long productId,
    Integer quantity,
    BigDecimal amount,
    String address
);

推荐:

createOrder(CreateOrderRequest request);

45. 幂等性

重要接口必须考虑幂等。

重点包括:

创建订单
支付
退款
支付回调
消息消费
优惠券领取
积分发放
库存扣减
重复表单提交
第三方回调

AI 在生成这些代码时必须主动考虑:

幂等 Key
业务唯一键
数据库唯一索引
状态机
Redis
分布式锁
去重表
消息幂等

选择哪一种由具体业务决定。


46. 支付回调

支付回调必须默认考虑:

重复通知
乱序通知
超时
网络重试
业务处理失败
状态重复更新

例如:

支付平台返回成功
↓
本地业务处理失败

必须考虑:

补偿
重试
对账
消息
人工修复

不能简单认为:

第三方调一次 = 本地一定成功

47. 分布式一致性

跨:

数据库
Redis
MQ
第三方支付
远程服务

修改数据时,必须考虑一致性。

AI 应主动分析:

本地事务
最终一致性
事务消息
Outbox
补偿
重试
状态机
幂等

不得用一个本地 @Transactional 假装解决跨服务事务。


48. 模块依赖

模块之间必须避免:

循环依赖
双向依赖
底层模块依赖上层模块

例如禁止:

order → payment
payment → order

形成直接循环依赖。

应考虑:

事件
接口抽象
公共领域模型
中间协调层
重新划分职责

49. 设计应考虑变化

对于明显具有多实现可能性的业务,设计时应考虑扩展性。

例如登录方式:

账号密码
验证码
微信授权
第三方 OAuth

支付方式:

支付宝
微信支付
银行卡
其他第三方支付渠道

这类业务可以评估:

Strategy
Factory
Template Method
Chain of Responsibility
Adapter

但:

不允许为了“未来可能需要”而过度设计。

只有真实存在多个变化方向或者扩展概率较高时才引入设计模式。


50. NULL 处理

变量使用前必须根据业务判断:

是否可能为空
为空意味着什么
应该返回什么
是否应该抛异常

禁止无意义:

if (obj != null) {
    ...
}

一路吞掉问题。

同时禁止:

try {
} catch (Exception e) {
}

静默忽略异常。


51. 魔法值

不变值或具有明确业务意义的值,应使用:

常量
枚举
配置

禁止:

if (status == 7) {
}

应该尽可能:

if (OrderStatusEnum.CLOSED.getCode().equals(status)) {
}

52. 条件判断

优先保持清晰的分支逻辑。

不应机械规定:

所有场景必须 if-else

或者:

绝对不能连续 if

应根据业务语义选择。

可以优先:

Guard Clause
提前返回

降低深层嵌套。

例如:

if (user == null) {
    throw new UserNotFoundException();
}

if (!user.isEnabled()) {
    throw new UserDisabledException();
}

doBusiness(user);

通常比:

if (user != null) {
    if (user.isEnabled()) {
        ...
    }
}

更清晰。


53. 循环数据库访问

禁止出现明显:

N+1 查询
循环单条 INSERT
循环远程调用

例如不推荐:

for (Long id : ids) {
    userMapper.selectById(id);
}

应该优先:

批量查询

例如:

WHERE id IN (...)

54. 批量写入

大批量插入或修改,应使用:

batch insert
batch update
分批处理

不能无限制一次提交几十万条。

AI 应根据数据量考虑:

批次大小
事务大小
内存
数据库压力
锁
超时

55. DAO / Mapper 层职责

DAO / Mapper 层主要负责:

数据访问
CRUD
查询
持久化

复杂业务逻辑应该放在:

Service / Domain

禁止将大量业务判断塞进 DAO。


56. Service 层职责

Service 层负责:

业务规则
事务
流程编排
状态变化
业务校验

Controller 不应包含大量核心业务逻辑。

推荐:

Controller
   ↓
Service
   ↓
DAO / Mapper

57. 避免重复造轮子

如果成熟库已经存在可靠实现:

优先使用。

例如:

JDK
Spring
Apache Commons
Hutool
Guava
项目公共组件

禁止随意重复实现:

字符串工具
日期格式化
JSON
集合判断
HTTP 基础能力
加密基础算法

尤其安全相关能力不得自行发明算法。


58. 多线程规范

多线程环境必须考虑:

原子性
可见性
有序性
线程安全
资源竞争
死锁
线程池
上下文传递
异常

禁止:

new Thread(...).start();

在业务代码中随意创建线程。

优先使用项目统一线程池。


59. 线程池

线程池必须合理配置:

corePoolSize
maximumPoolSize
queue
keepAliveTime
RejectedExecutionHandler
ThreadFactory

禁止无界队列导致:

OOM
任务无限堆积

60. 日志规范

日志必须使用正确级别:

TRACE
DEBUG
INFO
WARN
ERROR

原则:

正常业务关键节点 → INFO

开发调试信息 → DEBUG

可恢复异常 → WARN

需要人工关注的失败 → ERROR

禁止:

所有东西 INFO
所有异常 ERROR

60.1 禁止打印敏感信息

日志禁止打印:

密码
完整身份证号
银行卡号
支付密钥
AccessToken
RefreshToken
验证码
SecretKey
完整手机号
其他敏感个人信息

需要日志记录时必须脱敏。


60.2 异常日志

不得:

log.error("error");

丢失上下文。

推荐至少带:

业务标识
关键参数
异常对象

例如:

log.error("Create order failed, orderNo={}", orderNo, e);

61. 调用频率意识

AI 在设计任何方法、SQL、Redis、MQ 或第三方请求时,都需要考虑:

一天调用多少次
一分钟多少次
一秒多少次
峰值 QPS
并发量
数据量
增长速度

尤其是高频方法,需要主动评估:

数据库
Redis
MQ
锁竞争
网络
线程池
CPU
内存
第三方 API

压力。


62. 高频接口性能

对于高频接口,需要考虑:

索引
缓存
本地缓存
批处理
异步
削峰
限流
连接池
对象创建
序列化
日志量

不得只关注:

单次代码是否能跑通

63. Redis 使用规范

使用 Redis 前必须先判断:

为什么使用
缓存什么
TTL 多久
如何失效
如何更新
缓存穿透
缓存击穿
缓存雪崩
数据一致性

不得:

所有数据库数据全部缓存

64. 分布式锁

使用 Redis 分布式锁必须考虑:

唯一 owner
过期时间
锁续期
异常释放
finally
原子释放
重入问题
业务执行时间

禁止:

GET
DEL

简单实现不安全的锁释放逻辑。


65. RabbitMQ / MQ

消息消费必须默认考虑:

重复消费
消费失败
重试
死信
乱序
堆积
幂等
ACK
消息丢失

生产端考虑:

发送失败
确认机制
事务一致性

66. Nacos / 配置中心

配置中心适合:

环境配置
可动态调整配置
服务配置

敏感信息是否可以直接存放需要根据公司安全方案决定。

禁止把:

应该是常量的代码逻辑
复杂业务规则
整个 JSON 业务数据库

无脑塞入配置中心。


67. Controller 规范

Controller 主要负责:

接收参数
参数校验
权限入口
调用 Service
返回结果

Controller 不应该承担:

复杂业务流程
大量数据库操作
复杂计算

68. Entity / DTO / VO 职责

建议区分:

Entity
数据库对象

DTO / Request
接口输入或业务传输对象

VO / Response
接口输出对象

不要所有层都使用同一个 Entity。

这样可以避免:

数据库变化影响 API
前端传入不允许修改的数据库字段
敏感字段泄露
业务边界混乱

69. 异常处理

业务异常和系统异常应区分。

例如:

库存不足
订单不存在
优惠券已过期

属于:

业务异常

而:

数据库连接失败
Redis 不可用
网络异常
代码 NPE

属于:

系统异常

禁止所有异常:

catch (Exception e) {
    return false;
}

70. 事务规范

事务范围应尽量小。

禁止:

事务中长时间 HTTP 调用
事务中等待用户操作
事务中做大文件处理
事务中执行长时间计算

AI 添加:

@Transactional

前必须判断:

事务边界
异常回滚
传播行为
自调用问题
跨服务是否有效

71. 接口安全

重要接口需要评估:

认证
授权
参数校验
越权
重放
幂等
限流
SQL 注入
XSS
CSRF
文件上传安全
数据脱敏

尤其是:

支付
退款
账户
后台管理
删除
导出
下载
批量操作

不得只判断:

用户有没有登录

还应判断:

用户有没有权限操作这条数据

72. 文件上传

文件上传必须考虑:

文件大小
扩展名
MIME
文件内容
文件名
路径穿越
存储路径
访问权限
病毒风险

不得直接使用用户原始文件名拼接本地路径。


73. 分页接口

列表接口应考虑分页。

必须限制:

pageSize

最大值。

禁止让客户端请求:

pageSize = 1000000

导致数据库和应用内存压力。


74. 时间处理

时间字段语义必须明确。

例如:

created_time
paid_time
expired_time

涉及跨时区系统时,应明确:

数据库时区
JVM 时区
接口时区
序列化格式

不要依赖服务器默认时区。


75. AI 新增代码前检查

AI 在新增代码之前,应优先确认项目是否已经存在:

类似 Service
类似工具类
类似 DTO
类似异常
类似枚举
类似 SQL
类似配置
类似实现

如果已有能力:

优先复用,不重复创建。


76. AI 修改代码后自检

完成代码修改后,AI 应自行检查:

是否可能编译失败
import 是否正确
方法签名是否匹配
空指针
SQL 是否正确
事务是否正确
并发问题
幂等问题
数据库一致性
异常处理
日志
代码重复
变量命名
格式
安全问题
性能问题
是否影响已有接口

77. AI 生成 SQL 后自检

至少检查:

是否 SELECT *
是否可能全表扫描
索引是否合理
参数类型是否一致
是否存在 SQL 注入
是否 N+1
是否需要分页
排序是否有索引
是否可能返回巨大数据量
是否需要 EXPLAIN

78. AI 设计数据库表后自检

检查:

utf8mb4
InnoDB
id
字段类型
金额 DECIMAL
created_time
created_by
updated_time
updated_by
字段注释
表注释
索引
唯一约束
默认值
NULL 语义
字段长度

79. AI 设计接口后自检

检查:

接口职责是否单一
参数是否合法
是否应该分页
是否需要幂等
是否需要权限
是否需要限流
是否暴露 Entity
是否返回多余字段
异常码是否合理
是否兼容已有接口

80. AI 设计业务代码后自检

检查:

是否存在重复逻辑
是否超过合理方法长度
是否出现过深嵌套
是否应该拆方法
是否应该使用枚举
是否存在魔法值
是否重复查数据库
是否重复调用远程服务
是否可能并发冲突
是否可能重复执行
是否需要事务
是否需要补偿

81. AI Code Review 输出标准

如果 AI 被要求 Review 代码,问题优先级按照:

P0:严重安全 / 数据事故风险

P1:明显业务 Bug / 数据一致性 / 并发问题

P2:性能 / SQL / 可维护性问题

P3:命名 / 结构 / 代码规范问题

P4:可选优化

优先指出:

真正可能造成事故的问题

而不是把大量注意力放在:

空格
换行
个人风格

82. AI 不允许为了规范而规范

所有规范的最终目标是:

稳定
安全
清晰
高效
可维护

AI 不得机械执行规范导致:

代码更加复杂
产生过度设计
大量无意义封装
大量无意义接口
大量无意义设计模式

例如:

只有一个简单实现:

UserService

没有必要因为“面向接口”机械创建:

UserService
UserServiceImpl
AbstractUserService
BaseUserService
UserServiceFactory
UserServiceStrategy

除非架构和业务确实需要。


83. 最重要的工程思想

AI 写任何代码之前,都要考虑:

这个功能未来谁维护?

线上出问题怎么定位?

这个接口会不会重复调用?

数据库数据会不会不一致?

这个 SQL 一亿数据还能不能执行?

这个方法 QPS 1000 会发生什么?

依赖服务挂掉会发生什么?

重复消息会发生什么?

支付回调来 10 次会发生什么?

两个用户同时修改这条数据会发生什么?

代码半年以后别人还能不能看懂?

84. 最终原则

本项目拒绝:

能跑就行
先写了再说
复制粘贴
无脑堆 if
无脑加缓存
无脑加索引
无脑分布式锁
无脑设计模式
无脑微服务
无脑抽象

项目倡导:

明确业务
 ↓
明确边界
 ↓
设计数据
 ↓
设计接口
 ↓
考虑异常
 ↓
考虑并发
 ↓
考虑一致性
 ↓
考虑性能
 ↓
编写代码
 ↓
测试
 ↓
Code Review
 ↓
CI/CD

我们不是简单地“把功能写出来”。

我们是在维护一个会长期运行的工程系统。

好的代码不只是:

今天能运行

更应该:

明天能修改
半年后能读懂
业务增长后能承载
线上出事后能定位
团队其他成员能继续维护

因此,无论人还是 AI,在参与本项目开发时,都应该把自己看作:

软件工程师,而不是代码生成器。

架构决定建筑能建多高,

设计决定空间如何组织,

而编码规范决定我们砌出来的每一块砖,最终能不能形成一栋可靠、稳定、长期存在的数字建筑。

后端项目 AI 开发规范(AI Coding Rules)
http://clxhxhhr.top/posts/556/
作者
clxstart
发布于
2026-09-09
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。
文章目录
目录