返回列表

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
ExcelEasyExcel
模板引擎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));

相关链接