# 项目规范 ## 数据库迁移(Flyway Migration) ### 命名规则 - 脚本格式:`V{YYYYMMDD}_{序号}__{描述}.sql` - 日期必须使用**实际编写日期**,不得使用过去的日期 - 序号从 1 开始,同一天多个脚本递增 - 描述使用下划线分隔的英文短语 ### 核心原则 - **不可变性**:已执行的迁移脚本永远不得修改 - **只增不减**:数据库变更只能通过新增迁移脚本实现 - **向后兼容**:新脚本应兼容已有数据 ### 操作规范 - 删除表:创建新迁移脚本,使用 `DROP TABLE IF EXISTS` - 修改表结构:使用 `ALTER TABLE` 语句 - 新增表:创建新迁移脚本,使用 `CREATE TABLE` ## 框架机制 ### 行级数据隔离(多租户拦截器) - **配置类:** `MybatisPlusConfig` 注册 `TenantLineInnerInterceptor` - **租户字段:** `created_by`(每个业务表的创建人字段) - **租户值来源:** `StpUtil.getLoginIdAsString()`(当前登录用户) - **自动注入:** 所有 SELECT/UPDATE/DELETE 语句自动追加 `WHERE created_by = #{当前用户}` - **归属校验:** 查询单条记录时拦截器自动校验 `created_by`,非本人数据直接返回空 - **排除表:** `user`、`flyway_schema_history`、`databasechangelog`、`databasechangeloglock` ### 自动填充(MetaObjectHandler) - **created_by / updated_by:** 插入/更新时自动填充为当前登录用户 - **created_time / updated_time:** 插入/更新时自动填充当前时间 ### 认证鉴权(Sa-Token) - **会话管理:** 基于 `StpUtil` 的登录/登出/会话查询 - **权限校验:** `@SaCheckPermission` 注解式权限控制 - **未登录处理:** 全局异常处理器捕获 `NotLoginException` 返回 401 ## 编码规范 ### 数据访问层 - **优先使用纯 MyBatis-Plus Java API**(`Wrappers.lambdaQuery()`、`selectList`、`selectById` 等),避免手写 XML SQL - 复杂查询通过 `Wrappers` 链式构建条件,必要时使用 `.apply()` 拼接原生 SQL 片段