2026-02-12 16:35 - 16:43
统一使用新表结构,移除旧的 sys_* 表逻辑,修复接口适配问题,确保所有服务正常运行。
已删除所有 sys_* 表(13个):
sys_users, sys_sessions, sys_roles, sys_permissionssys_user_roles, sys_role_permissionssys_login_logs, sys_operation_logssys_configs, sys_dict_types, sys_dict_itemssys_files, sys_tasksusers - 用户表(认证服务使用)sessions - 会话表documents, templates, nodes, edges, rules 等核心业务表问题: preferences 字段类型为 JSONB,导致 MyBatis-Plus 更新时类型转换错误
解决方案: 将 preferences 字段类型从 JSONB 改为 TEXT
ALTER TABLE users ALTER COLUMN preferences TYPE text;
原因:
character varying 转换为 jsonbTEXT 类型可以存储 JSON 字符串,避免类型转换问题文件: backend/auth-service/src/main/java/com/lingyue/auth/entity/User.java
修改: 添加 PostgreSQL JSONB TypeHandler(最终未使用,改用 TEXT 类型)
@TableField(value = "preferences", typeHandler = com.lingyue.common.handler.PostgresJsonbTypeHandler.class)
private String preferences;
文件: backend/auth-service/src/main/java/com/lingyue/auth/service/AuthService.java
修改: 使用 UpdateWrapper 只更新 last_login_at 字段
// 更新最后登录时间(只更新需要的字段)
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", user.getId())
.set("last_login_at", new java.util.Date());
userRepository.update(null, updateWrapper);
文件: backend/common/src/main/java/com/lingyue/common/handler/PostgresJsonbTypeHandler.java
新增: 自定义 TypeHandler 处理 PostgreSQL JSONB 类型(备用方案)
@MappedTypes(String.class)
public class PostgresJsonbTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
PGobject jsonObject = new PGobject();
jsonObject.setType("jsonb");
jsonObject.setValue(parameter);
ps.setObject(i, jsonObject);
}
// ...
}
文件: 0211docs/init_mock.sql
变更:
sys_* 表定义和数据preferences 字段类型改为 TEXT管理员账号:
INSERT INTO users (
id: '1',
username: 'admin',
email: 'admin@lingyue.com',
password_hash: '$2a$10$0AUCG2mG7a6JXErOTI.Pg.Q/R04plOXvc.TDMeWzwwZQ23ZmrtJxC',
display_name: '管理员',
role: 'admin',
is_active: true
)
登录信息:
adminadmin123文件: frontend/vue-demo/src/api/index.js
已完成:
/api/v1/graph/* 前缀graphTemplateApi, graphProjectApi, graphReportApi文件: frontend/vue-demo/vite.config.js
修改: 默认使用本地后端
const API_SERVER = process.env.API_SERVER || 'http://localhost:18520'
已创建完整的 API 文档:
frontend/vue-demo/API_GUIDE.md - API 使用指南frontend/vue-demo/API_MAPPING.md - 前后端接口映射对照表frontend/vue-demo/README_DEV.md - 开发指南curl -X POST http://localhost:18520/auth/login \
-H "Content-Type: application/json" \
-d '{"usernameOrEmail":"admin","password":"admin123"}'
响应:
{
"msg": "登录成功",
"code": 200,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiJ9...",
"tokenType": "Bearer",
"expiresIn": 604800,
"userId": "1",
"username": "admin"
}
}
✅ 登录成功!
curl http://localhost:18520/actuator/health
响应:
{
"status": "UP",
"components": {
"db": {"status": "UP"},
"diskSpace": {"status": "UP"},
"ping": {"status": "UP"}
}
}
✅ 所有服务正常运行!
0211docs/init_mock.sql - 精简并更新表结构database/migrations/001_cleanup_old_tables.sql - 清理旧表脚本database/CLEANUP_SUMMARY.md - 清理总结文档backend/auth-service/src/main/java/com/lingyue/auth/entity/User.javabackend/auth-service/src/main/java/com/lingyue/auth/service/AuthService.javabackend/common/src/main/java/com/lingyue/common/handler/PostgresJsonbTypeHandler.javabackend/auth-service/src/test/java/com/lingyue/auth/PasswordHashGenerator.javafrontend/vue-demo/vite.config.jsfrontend/vue-demo/src/api/index.jsfrontend/vue-demo/API_GUIDE.mdfrontend/vue-demo/API_MAPPING.mdfrontend/vue-demo/README_DEV.md问题: MyBatis-Plus 无法自动处理 JSONB 类型转换
解决方案:
最终选择: 方案二,因为:
问题: updateById() 会更新所有字段,包括有类型问题的字段
解决方案: 使用 UpdateWrapper 只更新需要的字段
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", userId).set("field_name", value);
repository.update(null, wrapper);
正确的密码哈希生成:
String hash = PasswordUtil.encode("admin123");
// 结果: $2a$10$0AUCG2mG7a6JXErOTI.Pg.Q/R04plOXvc.TDMeWzwwZQ23ZmrtJxC
UpdateWrapper 进行部分字段更新sys_* 表已删除preferences 字段类型问题已解决系统现在使用统一的新表结构,代码更清晰,维护更简单! 🎉