2026山东大学软件学院项目实训个人blog(二)
目录
问题 1:MyBatis Flex 代码生成器无法读取 application.yml 数据源配置
一、本期个人核心任务
完成用户模块的需求分析与方案设计,涵盖需求拆解、库表结构化设计、MyBatis Flex 框架适配及数据模型开发的全链路工作,明确用户模块核心交互逻辑与技术实现路径。
二、核心开发与技术落地
(一)功能分析
围绕 AI 零代码平台的使用流程、账号安全、后台管理三大场景,我把用户模块拆成一套完整的 “从注册到注销” 功能,覆盖普通用户和管理员两类角色:
1.用户注册
支持用账号 + 密码 + 确认密码注册,后台自动校验账号是否重复、密码格式是否合法,保证平台账号唯一、安全。
2.用户登录
通过账号密码完成身份验证,登录后保持会话状态,让用户在使用 AI 生成、模板管理等功能时不用反复登录。
3.获取当前登录用户信息
前端随时能拿到当前登录人的信息,用于页面展示、权限判断和个人中心。
4.用户注销
一键退出登录,清空登录状态,保护账号安全,切换账号更方便。
5.用户权限控制
按角色做权限隔离:
普通用户:用 AI 生成功能、管理自己的项目、修改个人信息;
管理员:拥有平台最高权限,能进后台、管理所有用户。
6.用户管理(仅管理员)
管理员可以在后台搜索用户、查看用户列表、删除违规账号,实现对整个平台用户的统一管控,适配 AI 零代码平台的运营需求。
(二)库表设计
库名:ai_code_mother
表名:user
1.核心设计思路
我通过围绕“身份验证、信息存储、权限管控、数据安全” 四大核心目标设计用户表结构:
-
身份验证层:通过
userAccount(唯一)+userPassword作为核心登录凭证,保障账号唯一性与登录安全性; -
信息存储层:覆盖
userName(昵称)、userAvatar(头像)、userProfile(简介)等个性化信息,满足用户画像基础需求; -
权限管控层:通过
userRole字段区分角色类型,为后续权限拦截提供核心依据; -
数据安全与可维护层:引入
createTime(创建时间)、updateTime(更新时间)、editTime(编辑时间)、isDelete(逻辑删除)字段,实现数据全生命周期追溯与软删除,避免物理删除导致的数据丢失。
2.SQL
-- 用户表
create table if not exists user
(
id bigint auto_increment comment 'id' primary key,
userAccount varchar(256) not null comment '账号',
userPassword varchar(512) not null comment '密码',
userName varchar(256) null comment '用户昵称',
userAvatar varchar(1024) null comment '用户头像',
userProfile varchar(512) null comment '用户简介',
userRole varchar(256) default 'user' not null comment '用户角色:user/admin',
editTime datetime default CURRENT_TIMESTAMP not null comment '编辑时间',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
UNIQUE KEY uk_userAccount (userAccount),
INDEX idx_userName (userName)
) comment '用户' collate = utf8mb4_unicode_ci;
3.设计注意事项:
1.时间字段差异化设计:
-
editTime仅在用户主动修改昵称、头像、简介等个人信息时通过业务代码更新,用于统计用户信息维护行为; -
updateTime由数据库自动触发更新,覆盖所有字段(如密码修改、角色变更),用于数据审计与追溯。
二者分工明确,满足不同维度的时间统计需求。
2.索引优化策略:
-
对
userAccount添加唯一索引,既利用数据库层面杜绝重复账号,又提升登录时的账号查询效率; -
对
userName添加普通索引,优化管理员按昵称搜索用户的场景性能,平衡索引开销与查询效率。
3.数据安全设计:
-
userPassword字段预留足够长度,用于存储加密后的密码,避免明文存储; -
isDelete字段实现逻辑删除,既满足 “删除” 业务需求,又保留数据追溯能力,符合系统数据安全规范。
(三)MyBatis Flex框架适配
1.MyBatis Flex 核心优势与选型原因
传统项目中常用 MyBatis Plus 作为数据访问层增强框架,这次项目我们尝试了更轻量的 MyBatis Flex,它同样是传统操作数据库的 MyBatis 框架的增强框架,但优势很明显:
三大优势:
更轻量:MyBatis Flex除了MyBatis本身,再无任何第三方依赖,因此会带来更高的自主性、把控性和稳定性,尤其适配 AI 平台轻量化部署的需求;
更灵活:提供灵活的 QueryWrapper 查询封装,支持多表关联、复杂条件查询、逻辑删除、乐观锁等场景,可快速适配用户模块 “角色筛选、模糊搜索、软删除查询” 等核心需求;
更高的性能:MyBatis Flex通过独特的架构,没有任何MyBatis拦截器、在SQL执行的过程中,没有任何的SQL Parse,因此相比传统增强框架性能指数级提升。
另一大优势:
在Mybatis Flex中,内置了一个名称为mybatis-flex-codegen的模块,提供了可以通过数据库表,生成代码的功能。
当我们把数据库表设计完成后,就可以使用其快速生成Entity、Mapper、Service、Controller代码,能大幅提高我们的开发效率。
2.构造代码生成器
基于项目配置文件自动解析数据源,自定义生成规则,实现用户表代码的自动化生成:
// MyBatis Flex 代码生成器 (实际开发代码)
public class MyBatisCodeGenerator {
// 要生成的表名
private static final String[] TABLE_NAMES = {"<...表名...>"};
public static void main(String[] args) {
// 获取数据元信息
Dict dict = YamlUtil.loadByPath("application.yml");
Map<String, Object> dataSourceConfig = dict.getByPath("spring.datasource");
String url = String.valueOf(dataSourceConfig.get("url"));
String username = String.valueOf(dataSourceConfig.get("username"));
String password = String.valueOf(dataSourceConfig.get("password"));
// 配置数据源
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
// 创建配置内容
GlobalConfig globalConfig = createGlobalConfig();
// 通过 datasource 和 globalConfig 创建代码生成器
Generator generator = new Generator(dataSource, globalConfig);
// 生成代码
generator.generate();
}
// 详细配置见:https://mybatis-flex.com/zh/others/codegen.html
public static GlobalConfig createGlobalConfig() {
// 创建配置内容
GlobalConfig globalConfig = new GlobalConfig();
// 设置根包,建议先生成到一个临时目录下,生成代码之后,再移动到对应的项目目录
globalConfig.getPackageConfig()
.setBasePackage("...<根包>...");
// 设置表前缀和只生成哪些表,setGenerateTable 未配置时,生成所有表
globalConfig.getStrategyConfig()
.setGenerateTable(TABLE_NAMES)
// 设置逻辑删除的默认字段名称
.setLogicDeleteColumn("isDelete");
// 设置生成 entity 并启用 Lombok
globalConfig.enableEntity()
.setWithLombok(true)
.setJdkVersion(21);
// 设置生成 mapper
globalConfig.enableMapper();
globalConfig.enableMapperXml();
// 设置生成 Service
globalConfig.enableService();
globalConfig.enableServiceImpl();
// 设置生成 Controller
globalConfig.enableController();
// 设置生成注释,比如生成的时间和作者,避免后续多余的代码改动
globalConfig.getJavadocConfig()
.setAuthor("")
.setSince("");
return globalConfig;
}
}
3.查看生成的结果

生成的代码覆盖用户模块基础开发骨架:
-
Entity 层:自动映射数据库字段,包含 Lombok 注解、字段注释、逻辑删除注解等;
-
Mapper 层:自动生成基础 CRUD 方法,支持自定义 SQL 扩展;
-
Service 层:封装通用增删改查逻辑,可快速扩展业务方法;
-
Controller 层:生成 RESTful 风格接口雏形,包含登录、注册、用户信息查询等基础接口定义。
(四)数据模型开发
1.实体类
生成的代码也许不能完全满足我们的要求,比如数据库实体类,可以手动更改其字段配置,指定主键生成策略。
比如id默认是连续生成的,容易被爬虫抓取,同时为了适配分布式部署场景下的 ID 唯一性需求,我更换策略为ASSIGN_ID雪花算法生成。
修改User类的代码如下:
@Table("user")
public class User implements Serializable {
/**
* 主键ID
* 替换默认自增策略为雪花算法,避免ID连续泄露数据量,提升分布式场景下的ID唯一性
*/
@Id(keyType = KeyType.Generator, value = KeyGenerators.snowFlakeId)
private Long id;
}
2.枚举类
对于用户角色这样值的数量有限的、可枚举的字段,我定义一个枚举类,便于在项目中获取值、减少枚举值输入错误的情况。
设计说明:
-
核心方法:
getEnumByValue支持从存储值反向获取枚举实例,便于业务层判断角色;isValidRole校验角色值合法性,避免非法角色值入库;
@Getter
public enum UserRoleEnum {
USER("用户", "user"),
ADMIN("管理员", "admin");
private final String text;
private final String value;
UserRoleEnum(String text, String value) {
this.text = text;
this.value = value;
}
/**
* 根据 value 获取枚举
*
* @param value 枚举值的value
* @return 枚举值
*/
public static UserRoleEnum getEnumByValue(String value) {
if (ObjUtil.isEmpty(value)) {
return null;
}
for (UserRoleEnum anEnum : UserRoleEnum.values()) {
if (anEnum.value.equals(value)) {
return anEnum;
}
}
return null;
}
}
三、开发过程中的问题与解决方案
问题 1:MyBatis Flex 代码生成器无法读取 application.yml 数据源配置
现象:运行代码生成器时,抛出 “数据源配置为空” 异常,无法解析 application.yml 中的数据库连接信息。
原因:配置文件编码格式非 UTF-8,导致解析乱码。
解决方案:
-
统一编码格式:将 application.yml 编码格式改为 UTF-8,避免解析乱码;
-
增加异常处理:在代码生成器中添加配置解析异常捕获,打印详细日志,便于定位问题。
// ====================== 使用 UTF-8 读取 yml ======================
InputStream inputStream = ResourceUtil.getStream("application.yml");
Yaml yaml = new Yaml();
Map<String, Object> yamlMap = yaml.load(inputStream);
问题 2:用户表主键雪花算法生成策略与数据库自增冲突
现象:实体类配置雪花算法生成 ID 后,插入数据时数据库报 “主键重复” 或 “ID 字段不能为空” 异常。
原因:
-
数据库表中 id 字段仍配置为
auto_increment,与雪花算法生成 ID 冲突; -
MyBatis Flex 未正确加载主键生成策略,导致插入时未自动生成 ID。
解决方案:
-
修改数据库表结构:移除 id 字段的
auto_increment属性,保留主键约束; -
增强实体类注解:确认
@Id注解的keyType与value配置正确,补充雪花算法生成器的依赖(MyBatis Flex 内置雪花算法,无需额外依赖);
四、实训收获与技术成长
这周把用户模块从需求到设计再到代码骨架完整走了一遍,收获还是很多的:
-
学会结合业务场景做表结构设计,不是随便建表,而是考虑安全、性能、可扩展;
-
第一次上手 MyBatis Flex,感受到轻量框架的优势,也掌握了代码生成器的实际使用;
-
理解了主键策略、索引、逻辑删除、枚举这些工程化细节,代码更规范、更健壮;
五、后续开发计划
-
核心业务逻辑落地:推进 AI 零代码生成平台的核心业务开发,基于现有框架实现应用生成、模板管理等功能。
-
持续优化:对登录、查询等高频接口做简单压测,优化 SQL 和查询速度,提升平台体验。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)