初始:

表结构默认字段

1. 所有表使用 InnoDB 引擎,utf8mb4 字符集
2. 前缀规则
3. 所有表必须使用  关联原则 作为前缀。方便指向关联业务
4. 例如:orders 主表
5.    orders_ext 扩展表
6.    orders_chang 转单表

必须添加的字段

`remark` varchar(255) DEFAULT '' COMMENT '备注',
`over_flag` tinyint NOT NULL DEFAULT '0' COMMENT '完结标识 0-未完结,1-已完结',
`create_user` bigint NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_user` bigint DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY ( `change_id` ),
UNIQUE KEY `uniq_xxid_xxcode`(`xx_id`, `xx_code`),
KEY `idx_create_time` (`create_time`),                       
KEY `idx_update_time` (`update_time`),  

1. 索引规则

1. 普通索引:idx_xxx
2. 唯一索引:uniq_xxx 每个表必须有唯一约束
3. 为什么这么设计:
4. 完结标识,创建时间,更新时间, 有助于统一进行数据归档,提高归档效率、报表生成的效率、 分摊主库压力,提升查询效率,减少运营成本  。
5. 数据归档
6. 什么是归档:数据定期从主库中移除,转移到备份库中,主系统中不在提供查询
7. 归档的目的:分摊主库压力,提升查询效率,减少运营成本
8. 什么数据该归档:已完结并且创建时间超过1.5年以上的数据
9. 归档后需要查询怎么办:通过备份库导出数据查询

2. 样例表

CREATE TABLE `orders_change` (
    `change_id` BIGINT NOT NULL  COMMENT 'id',
    `change_no` VARCHAR ( 64 ) NOT NULL  COMMENT '转第三方业务单号',
    `orders_id` BIGINT NOT NULL COMMENT 'order表订单ID',
    `tracking_number` VARCHAR ( 64 ) NOT NULL DEFAULT '' COMMENT 'order表跟踪号',
    `reference_no` VARCHAR ( 64 ) NOT NULL DEFAULT '' COMMENT 'order表参考号',
    `change_status` TINYINT NOT NULL DEFAULT '1' COMMENT '转单状态 1-正常,99-取消',
    `change_site_id` INT DEFAULT '0' COMMENT '转单发起网点',
    `change_carrier_id` INT DEFAULT NULL COMMENT '转单服务商(承运商)id',
    `change_carrier_code` VARCHAR ( 64 ) DEFAULT '' COMMENT '转单服务商(承运商)code',
    `change_order_code` VARCHAR ( 64 ) DEFAULT '' COMMENT '第三方系统生成的面单号',
    `change_tracking_no` VARCHAR ( 64 ) DEFAULT '' COMMENT '第三方系统生成的参考单号',
    `change_file_path_flag` TINYINT NOT NULL DEFAULT '0' COMMENT '获取第三方三方面单标识 0-未获取,1-已获取,2-获取失败',
    `change_file_path` VARCHAR ( 512 ) NOT NULL DEFAULT '' COMMENT '第三方面单文件路径',
    `remark` VARCHAR ( 255 ) DEFAULT NULL COMMENT '备注',
    `over_flag` TINYINT NOT NULL DEFAULT '0' COMMENT '完结标识 0-未完结,1-已完结',
    `create_user` BIGINT NOT NULL COMMENT '创建人',
    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_user` BIGINT DEFAULT NULL COMMENT '更新人',
    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY ( `change_id` ),
    UNIQUE KEY `uniq_change_no` ( `change_no` ),
    KEY `idx_tracking_number` ( `tracking_number` ),
    KEY `idx_orders_id` ( `orders_id` ),
    KEY `idx_create_time` ( `create_time` ),
    KEY `idx_update_time` ( `update_time` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '转第三方承配主表';

3. 表对应的实体

所有表对应的实体类必须继承 BasePo

/**
 * 基础实体类
 *
 * @author dengpengbin
 */
@Data
public class BasePo implements Serializable {

    /**
     * 创建人
     */
    @Schema(description = "创建人", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    /**
     * 创建时间,由数据库维护
     */
    @Schema(description = "创建时间", hidden = true)
    private LocalDateTime createTime;

    /**
     * 更新人
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @Schema(description = "更新人", hidden = true)
    private Long updateUser;

    /**
     * 更新时间,由数据库维护
     */
    @Schema(description = "更新时间", hidden = true)
    private LocalDateTime updateTime;

}

4. 异常类

所有异常类统一使用 ServiceException。

/**
 * 业务异常
 *
 * @author Chill
 */
@Getter
public class ServiceException extends RuntimeException {

    @Serial
    private static final long serialVersionUID = 2359767895161832954L;

    protected IResultCode resultCode;

    protected String message;

    protected ServiceExceptionInfo<?>  messageInfo;

    public ServiceException() {
        this.resultCode = ResultCode.FAILURE;
    }

    public ServiceException(String message) {
        this();
        this.message = message;
    }

    public ServiceException(String msg, Object... msgParams) {
        this(MessageUtil.format(msg, msgParams)!=null ? MessageUtil.format(msg, msgParams) : msg);
    }


    public ServiceException(IResultCode resultCode) {
        this(resultCode.getMessage());
    }

    public ServiceException(Throwable cause) {
        super(cause);
    }

    public <T extends Enum<T> & DefaultMessage> ServiceException(T message) {
        this(message.getDefaultMessage());
        this.messageInfo = new ServiceExceptionInfo<>(message);
    }


    public <T extends Enum<T> & DefaultMessage> ServiceException(IResultCode resultCode, T message) {
        this(message.getDefaultMessage());
        this.resultCode = resultCode;
        this.messageInfo = new ServiceExceptionInfo<>(message);
    }

    /**
     * 提高性能
     *
     * @return Throwable
     */
    @Override
    public Throwable fillInStackTrace() {
        return this;
    }

    public Throwable doFillInStackTrace() {
        return super.fillInStackTrace();
    }

    public <T extends Enum<T> & DefaultMessage> T getMessageEnum() {

        return (T) Optional.ofNullable(messageInfo)
            .map(ServiceExceptionInfo::getMessageEnum)
            .orElse(null);
    }

}

5.代码规范

1. 实体类应与数据库表名保持语义一致,使用驼峰命名法,首字母大写。
2. id 统一使用 @TableId(value = "xx_id",type = IdType.ASSIGN_ID) 注解
3. 字段应与数据库字段保持一致,使用 @TableField 注解
4. 使用 @RequestBody 时,前端必须使用 application/json。
5. 接口返回统一使用 R<T> 封装,避免直接返回原始对象。
6. 所有业务异常抛出 ServiceException
7. 所有常量类以 Constant 结尾。
8. 字典值建议统一写到 Enum 中,包含 getCode() 和 getDesc() 方法。
9. 使用 Swagger 注解,如 @Operation, @Schema。
作者:陆飞  创建时间:2026-01-13 16:52
最后编辑:陆飞  更新时间:2026-03-03 10:08