# RULE.md - 哈哈零售系统智能体代码生成规则 > 本文件为 AI Agent 代码生成提供强制规则约束,定义生成边界与规范。 > 所有规则均为强制性,Agent 生成代码时必须严格遵守。违反规则的代码不可提交。 --- ## 1. 项目边界 ### 1.1 技术栈版本锁定 | 技术 | 版本 | 禁止变更 | |------|------|----------| | Java | 21 | 禁止使用 Java 22+ 特性 | | Spring Boot | 4.0.3 | 禁止降级或升级 | | MyBatis-Plus | 3.5.16 | 使用 mybatis-plus-spring-boot4-starter | | Sa-Token | 1.45.0 | 使用 sa-token-spring-boot3-starter | | Hutool | 5.8.40 | 禁止使用 hutool 6.x API | | FastJson2 | 2.0.53 | 禁止使用 fastjson (v1) | | Lombok | 1.18.36 | -- | | Jakarta EE | Jakarta (非 Javax) | Spring Boot 4 使用 jakarta 命名空间 | ### 1.2 模块依赖方向(严格单向) ``` haha-admin --> haha-service --> haha-mapper --> haha-entity haha-miniapp --> haha-service --> haha-mapper --> haha-entity | haha-common <---------------------------+(所有模块均可依赖) haha-sdk(独立模块,不依赖其他内部模块) ``` **禁止**: - haha-mapper 依赖 haha-service(反向依赖) - haha-entity 依赖 haha-mapper 或 haha-service(反向依赖) - haha-common 依赖任何其他内部模块 - haha-admin 与 haha-miniapp 互相依赖 ### 1.3 双应用架构 | 应用 | 模块 | 端口 | Context-Path | 用途 | |------|------|------|--------------|------| | AdminApplication | haha-admin | 7070 | /admin | 运营平台后端 | | MiniappApplication | haha-miniapp | 7077 | /api | 小程序后端 | 两个应用共享 haha-common / haha-entity / haha-mapper / haha-service,共享 `@ComponentScan(basePackages = {"com.haha"})` 和 `@MapperScan("com.haha.mapper")`。 --- ## 2. 代码生成规则 ### 2.1 实体类(Entity) **位置**: `haha-entity/src/main/java/com/haha/entity/` **必须遵守**: ```java package com.haha.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("t_xxx") // 表名必须 t_ 前缀 public class Xxx implements Serializable { private static final long serialVersionUID = 1L; @TableId(type = IdType.ASSIGN_ID) // 雪花算法 @JsonSerialize(using = ToStringSerializer.class) // Long -> String 防精度丢失 private Long id; // 日期字段必须加格式注解 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private LocalDateTime createTime; // 非数据库字段必须标记 @TableField(exist = false) private String statusLabel; // 金额字段使用 BigDecimal,禁止使用 double/float // private BigDecimal amount; } ``` **规则**: - `id` 字段必须添加 `@JsonSerialize(using = ToStringSerializer.class)`,禁止遗漏 - 所有 Long 类型外键字段(如 userId, orderId, shopId)也必须添加 `@JsonSerialize(using = ToStringSerializer.class)` - 日期字段必须添加 `@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")` - 金额字段必须使用 `BigDecimal`,禁止使用 `double` 或 `float` - 实现 `Serializable` 接口 - 非 DB 字段必须用 `@TableField(exist = false)` 标注 - 数据库字段命名用下划线(`create_time`),Java 字段用驼峰(`createTime`),MyBatis-Plus 自动映射 ### 2.2 DTO 类 **位置**: `haha-entity/src/main/java/com/haha/entity/dto/` 或 `haha-admin/src/main/java/com/haha/admin/dto/` ```java package com.haha.entity.dto; import lombok.Data; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; @Data @Builder @NoArgsConstructor @AllArgsConstructor public class XxxCreateDTO { // 使用 Jakarta Validation 注解 // @NotNull(message = "xxx不能为空") // @NotEmpty(message = "xxx不能为空") // @Size(max = 50, message = "xxx长度不能超过50") private String name; } ``` **规则**: - DTO 按操作分:`XxxCreateDTO`、`XxxUpdateDTO`、`XxxQueryDTO` - 查询 DTO 继承 `BasePageQueryDTO`(来自 haha-common)并调用 `validate()` 方法校验分页参数 - 使用 Jakarta Validation 注解(`jakarta.validation.constraints.*`),禁止使用 `javax.validation.*` - haha-common 模块使用 Validation 注解时,必须在 pom.xml 中显式添加 `jakarta.validation-api` 依赖 ### 2.3 VO 类 **位置**: `haha-common/src/main/java/com/haha/common/vo/` **规则**: - 统一返回使用 `Result`(`Result.success()` / `Result.error()`) - 分页返回使用 `PageResult`,通过 `PageResult.of(IPage)` 转换 - VO 类用 `@Data` 注解,实现 `Serializable` ### 2.4 Mapper 接口 **位置**: `haha-mapper/src/main/java/com/haha/mapper/` ```java package com.haha.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.haha.entity.Xxx; import org.apache.ibatis.annotations.Param; public interface XxxMapper extends BaseMapper { // 简单查询:使用注解式 SQL // @Select("SELECT ... FROM t_xxx WHERE ...") // List findByCondition(@Param("field") String field); // 复杂查询:使用 XML 映射文件 // 对应文件:haha-mapper/src/main/resources/mapper/XxxMapper.xml } ``` **规则**: - 必须继承 `BaseMapper` - 简单 SQL 用 `@Select` / `@Update` / `@Insert` 注解,动态 SQL 用 `