code-patterns
SKILL.md
编码规范指南
通用模板。如果项目有专属技能(如
leniu-code-patterns),优先使用。
核心规范
RESTful API 设计
| 操作 | HTTP 方法 | URL 示例 | 说明 |
|---|---|---|---|
| 创建 | POST | /api/v1/orders |
请求体传参 |
| 查询列表 | GET | /api/v1/orders |
Query 参数分页 |
| 查询详情 | GET | /api/v1/orders/{id} |
路径参数 |
| 全量更新 | PUT | /api/v1/orders/{id} |
请求体传参 |
| 部分更新 | PATCH | /api/v1/orders/{id} |
请求体传参 |
| 删除 | DELETE | /api/v1/orders/{id} |
路径参数 |
URL 规范:
- 使用名词复数:
/orders而非/order - 使用小写连字符:
/order-items而非/orderItems - 版本号放 URL 前缀:
/api/v1/ - 嵌套资源不超过两层:
/orders/{id}/items
命名规范
| 类型 | 风格 | 示例 |
|---|---|---|
| 类名 | UpperCamelCase | OrderService, UserController |
| 方法名 | lowerCamelCase | createOrder(), getUserById() |
| 变量名 | lowerCamelCase | orderNo, userName |
| 常量 | UPPER_SNAKE_CASE | MAX_RETRY_COUNT, DEFAULT_PAGE_SIZE |
| 包名 | 全小写 | com.example.order |
| 数据库表/字段 | lower_snake_case | t_order, order_no |
类命名约定:
| 后缀 | 用途 | 示例 |
|---|---|---|
Controller |
控制器 | OrderController |
Service / ServiceImpl |
服务层 | OrderServiceImpl |
Mapper / Repository |
数据访问 | OrderMapper |
DTO |
请求参数 | OrderCreateDTO |
VO |
响应对象 | OrderVO |
Enum |
枚举 | OrderStatusEnum |
Config |
配置类 | RedisConfig |
Handler |
处理器 | GlobalExceptionHandler |
Interceptor |
拦截器 | AuthInterceptor |
Utils / Helper |
工具类 | DateUtils |
方法命名约定
| 前缀 | 含义 | 示例 |
|---|---|---|
create / add |
创建 | createOrder() |
update / modify |
更新 | updateStatus() |
delete / remove |
删除 | deleteById() |
get / find / query |
查询 | getById(), findByName() |
list |
查询列表 | listByStatus() |
page |
分页查询 | pageQuery() |
count |
计数 | countByStatus() |
is / has / can |
布尔判断 | isValid(), hasPermission() |
check / validate |
校验 | checkDuplicate() |
convert / to |
转换 | convertToVO(), toDTO() |
Git 提交规范(Conventional Commits)
<type>(<scope>): <subject>
<body>
<footer>
| type | 说明 |
|---|---|
feat |
新功能 |
fix |
修复 Bug |
docs |
文档变更 |
style |
代码格式(不影响逻辑) |
refactor |
重构(非新功能、非修复) |
perf |
性能优化 |
test |
测试相关 |
chore |
构建/工具变更 |
示例:
feat(order): 新增订单导出功能
支持按时间范围导出订单数据为 Excel 格式。
Closes #123
数据类型规范
布尔语义字段必须使用 Boolean
// ❌ 错误
private Integer ifNarrow;
private Integer isEnabled;
// ✅ 正确
private Boolean narrow; // getter 自动生成 isNarrow()
private Boolean enabled; // getter 自动生成 isEnabled()
规则:
- 语义为"是/否"的字段,类型必须为
Boolean - 字段名不加
if/is/has前缀(JavaBean 规范中Boolean的 getter 自动生成isXxx()) - 数据库字段使用
TINYINT(1)或BIT(1)
枚举字段必须提供明确约束
// ❌ 错误:调用方无法知道合法值
@ApiModelProperty(value = "操作类型")
private Integer tradeType;
// ✅ 方案一:VO/DTO 层直接用枚举(推荐)
@ApiModelProperty(value = "操作类型")
private AccTradeTypeEnum tradeType;
// ✅ 方案二:保留 Integer 但标注合法值
@ApiModelProperty(value = "操作类型:1-充值 2-消费 3-退款", allowableValues = "1,2,3")
private Integer tradeType;
金额字段禁止使用浮点类型
// ❌ 错误
private Double amount;
private Float price;
// ✅ 正确:Entity/Service 层用 Long(分),VO 层展示用 BigDecimal(元)
private Long amountFen;
private BigDecimal amountYuan;
原始类型 vs 包装类型
| 场景 | 用原始类型 | 用包装类型 |
|---|---|---|
| Entity / VO / DTO 字段 | — | ✅ 统一用包装类型 |
| 方法参数(不允许 null) | ✅ int count |
— |
| 方法参数(允许 null) | — | ✅ Integer count |
| 局部变量 | ✅ int i = 0 |
— |
Optional 使用规范
// ❌ 错误:of() 不接受 null,value 为 null 直接 NPE
Optional.of(value).orElse(defaultValue);
// ✅ 正确:ofNullable() 安全处理 null
Optional.ofNullable(value).orElse(defaultValue);
// ❌ 禁止:Optional 作为方法参数或类字段
public void process(Optional<String> name) { ... }
private Optional<String> name;
// ✅ 允许:Optional 作为方法返回值、链式处理
public Optional<Entity> findById(Long id) { ... }
Optional.ofNullable(entity).map(Entity::getConfig).orElse(DEFAULT_VALUE);
@Transactional 规范
// ❌ 错误:默认只回滚 RuntimeException
@Transactional
public void createOrder() { ... }
// ✅ 正确:显式指定回滚异常
@Transactional(rollbackFor = Exception.class)
public void createOrder() { ... }
- 所有
@Transactional必须显式写rollbackFor = Exception.class - 只读查询不加
@Transactional(或用readOnly = true) - 事务方法不要 try-catch 吞掉异常,否则事务不回滚
TODO 管理规范
// ❌ 错误:无负责人、无日期、无跟踪
// TODO 修改一下
// ✅ 正确:完整 TODO 格式
// TODO(@陈沈杰, 2026-03-20, #TASK-1234): 移动端 AppId 赋值逻辑待产品确认
- 每个 TODO 必须有对应的任务号
- 超过 2 个迭代未处理的 TODO 必须清理
- 不用的代码直接删除,不要注释保留
代码格式化规范
| 项目 | 规范 |
|---|---|
| 缩进 | 4 个空格(不用 Tab) |
| 行宽 | 120 字符 |
| 大括号 | K&R 风格(同行开始) |
| 空行 | 方法间 1 个空行,逻辑块间 1 个空行 |
| import | 分组排序:java → jakarta → org → net → com,组间空行 |
代码示例
统一响应格式
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
private int code;
private String message;
private T data;
public static <T> Result<T> ok(T data) {
return new Result<>(200, "success", data);
}
public static <T> Result<T> fail(int code, String message) {
return new Result<>(code, message, null);
}
}
枚举定义规范
@Getter
@AllArgsConstructor
public enum OrderStatusEnum {
PENDING(0, "待处理"),
COMPLETED(1, "已完成"),
CANCELLED(2, "已取消");
private final int code;
private final String desc;
public static OrderStatusEnum of(int code) {
for (OrderStatusEnum status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("未知状态码: " + code);
}
}
常见错误
| 错误 | 正确做法 |
|---|---|
URL 用动词:/getOrder |
用名词 + HTTP 方法:GET /orders/{id} |
方法名含义不清:process() |
明确动作:calculateTotalAmount() |
魔法数字:if (status == 1) |
用枚举或常量 |
| 一个方法超过 80 行 | 拆分为多个私有方法 |
| 注释描述"做了什么" | 注释描述"为什么这样做" |
| Git 提交信息写"fix bug" | 写清楚修了什么:fix(order): 修复金额计算精度丢失 |
Boolean 变量名:flag |
有意义的名字:isActive, hasPermission |
缩写命名:usr, mgr |
完整命名:user, manager |
Optional.of(可能null值) |
Optional.ofNullable(value) |
@Transactional 无 rollbackFor |
@Transactional(rollbackFor = Exception.class) |
| TODO 无负责人和日期 | // TODO(@负责人, 日期, #任务号): 描述 |
布尔字段用 Integer |
用 Boolean 类型 |
| 枚举字段无合法值说明 | @ApiModelProperty 标注合法值或直接用枚举类型 |
Weekly Installs
4
Repository
xu-cell/ai-engi…ing-initGitHub Stars
8
First Seen
8 days ago
Security Audits
Installed on
github-copilot4
codex4
kimi-cli4
gemini-cli4
cursor4
amp4