xiaokeer-a-server
基于若依框架深度定制的个人资源管理后端服务,实现完整的 RBAC 权限体系与通用 CRUD 模板。
JavaSpring BootSpring SecurityMyBatis-PlusRedisJWT
项目简介
xiaokeer-a-server 是一个基于若依框架深度定制的个人资源管理后端服务,定位为个人知识库/资源管理系统。项目采用 Spring Boot 3.0 + Spring Security 6.x + MyBatis-Plus 技术栈,实现了完整的 RBAC 权限体系、JWT + Redis 双 Token 认证、五级数据权限控制,以及高度抽象的通用 CRUD 模板。
主要特性
- 🔐 完整权限体系:RBAC + 数据权限的五级权限控制
- 🔑 双 Token 认证:JWT + Redis 实现无状态认证与会话管理
- 📊 五级数据权限:全部/自定义/本部门/本部门及以下/仅本人
- ⚡ 通用 CRUD 模板:控制器接口化设计,新模块只需实现接口
- 🛠️ 代码生成器:基于 Velocity 模板,自动生成前后端代码
- ☁️ 云服务集成:阿里云 OSS、语音合成、翻译服务
技术栈
| 类别 | 技术 |
|---|---|
| 核心框架 | Spring Boot 3.0 |
| 安全框架 | Spring Security 6.x |
| ORM 框架 | MyBatis-Plus 3.5.5 |
| 数据库 | MySQL 8.x |
| 缓存 | Redis |
| 认证 | JWT (jjwt) |
| 连接池 | Druid |
| 工具库 | Hutool, FastJSON2, Lombok |
| Excel | EasyExcel |
| 模板引擎 | Velocity |
技术亮点
亮点一:双 Token 认证机制
解决了 JWT 无法主动失效的问题:
- JWT Token:包含用户 UUID,用于快速解析用户身份
- Redis Token:存储完整 LoginUser 对象,支持主动踢下线
// Token 创建流程
public String createToken(LoginUser loginUser) {
String token = IdUtils.fastUUID(); // 生成 UUID
loginUser.setToken(token);
refreshToken(loginUser); // 缓存到 Redis
Map<String, Object> claims = new HashMap<>();
claims.put(Constants.LOGIN_USER_KEY, token); // JWT 携带 UUID
return Jwts.builder().setClaims(claims)
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
亮点二:五级数据权限体系
通过 AOP 切面动态拼接 SQL 条件,无侵入式实现数据隔离:
| 类型 | 说明 | SQL 条件 |
|---|---|---|
| DATA_SCOPE_ALL | 全部数据权限 | 无限制 |
| DATA_SCOPE_CUSTOM | 自定义数据权限 | dept_id IN (SELECT dept_id FROM sys_role_dept WHERE role_id = ?) |
| DATA_SCOPE_DEPT | 本部门数据权限 | dept_id = ? |
| DATA_SCOPE_DEPT_AND_CHILD | 本部门及以下 | dept_id IN (SELECT dept_id FROM sys_dept WHERE find_in_set(?, ancestors)) |
| DATA_SCOPE_SELF | 仅本人数据 | user_id = ? |
亮点三:通用 CRUD 模板
控制器接口化设计,新业务模块只需实现接口即可获得完整的增删改查能力:
// 控制器接口定义
public interface XiaokeerIDSUController<Form, Dto, Po, View> {
Result<View> getById(Form form);
Result<Boolean> delete(Form form);
Result<Boolean> update(Form form);
Result<Boolean> insert(Form form);
Result<Page<View>> page(Form form);
Result<List<View>> list(Form form);
}
亮点四:MyBatis-Plus 增强
封装常用 CRUD 操作,内置安全限制:
// 安全批量查询 - 避免 BigIn 异常
public static <T, R> List<R> select(
Function<List<T>, List<R>> selectFunc,
List<T> ids,
int safeBatchThresholdValue) {
List<List<T>> allSubIds = ListUtil.partition(ids, safeBatchThresholdValue);
// 分批查询,避免 IN 条件过大
}
亮点五:Redis 时间窗口计数器
基于 Redis 实现的滑动时间窗口计数器,适用于限流、统计等场景:
public interface RedisTimeWindowCounter extends StringKey {
long getInitNumber(); // 初始值
Time getTime(); // 时间窗口
long getIncrValue(); // 递增值
default Long count() {
// 滑动窗口计数实现
}
}
亮点六:异步日志写入
操作日志异步写入数据库,不阻塞主业务流程:
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
相关链接
- 代码仓库:GitHub