- Swagger UI:http://localhost:8790/swagger-ui/index.html
- Knife4j UI:http://localhost:8790/doc.html
- API Doc:http://localhost:8790/v3/api-docs
- 登录安全:验证码、登录失败锁定、限流、密码强度、忘记密码、强制改密。
- 审计:操作日志、登录日志、异常日志、敏感操作记录。
- 会话管理:在线用户、强制下线、Token 失效管理。
- 系统配置:参数配置、租户配置、字典缓存刷新策略。
- 文件能力:上传、下载、附件管理、对象存储适配。
- 数据能力:Excel 导入导出、批量导入校验、导出权限控制。
- 任务能力:定时任务、异步任务、任务执行日志。
- 通知能力:公告、站内信、消息已读未读。
- 监控能力:服务健康、接口耗时、慢 SQL、缓存状态、JVM/数据库基础监控。
- 权限细化:按钮级、接口方法级、数据导出级权限。
- 业务配置:首页仪表盘、租户首页数据、菜单初始化模板。
- 生产支撑:统一错误码、接口幂等、防重复提交、请求追踪 ID。
- 前端体验:首页指标、个人偏好、表格列配置、导入导出入口。
- 测试与交付:CI、数据库迁移工具、环境初始化脚本。
默认有:
- 超级管理员角色,角色编码
superAdmin。 - 超级管理员用户,所属角色为超级管理员,用户名
superAdmin,密码123。
超级管理员登录系统后,可以创建:
- 【角色管理】创建角色名
租户管理员,角色编码tenantAdmin。 - 【租户管理】创建租户名
租户1。 - 【部门管理】创建部门名
租户1-总部。 - 【用户管理】创建用户昵称
租户1管理员,用户名tenant1Admin,所属角色租户管理员,部门租户1-总部,租户租户1。
租户1管理员登录系统后,可以创建:
- 【部门管理】创建部门名
租户1-部门1、租户1-部门2和子部门租户1-部门2子部门。 - 【角色管理】创建角色:
- 角色名
租户1全部,角色编码tenant1All,数据权限全部。 - 角色名
租户1自定义,角色编码tenant1Custom:- 查询数据权限:
自定义,选租户1-部门1、租户1-部门2,不包含子部门。 - 增删改数据权限:
自定义,选租户1-部门2,不包含子部门。
- 查询数据权限:
- 角色名
租户1本部门及以下,角色编码tenant1CurrentDeptAndChildren,数据权限本部门及以下。 - 角色名
租户1本部门,角色编码tenant1CurrentDept,数据权限本部门。 - 角色名
租户1仅本人,角色编码tenant1OnlySelf,数据权限仅本人。
- 角色名
- 【用户管理】创建用户:
- 昵称
租户1用户(全部),用户名tenant1AllUser,所属角色租户1全部,部门租户1-部门2子部门。 - 昵称
租户1用户(自定义),用户名tenant1CustomUser,所属角色租户1自定义,部门租户1-部门1。 - 昵称
租户1用户(本部门及以下),用户名tenant1CurrentDeptAndChildrenUser,所属角色租户1本部门及以下,部门租户1-部门2。 - 昵称
租户1用户(本部门),用户名tenant1CurrentDeptUser,所属角色租户1本部门,部门租户1-部门2。 - 昵称
租户1用户(仅本人),用户名tenant1OnlySelfUser,所属角色租户1仅本人,部门租户1-部门1。
- 昵称
- 【测试数据管理】创建测试数据(共5条):
- 值
数据-总部,归属部门租户1-总部,创建人tenant1Admin。 - 值
数据-部门1-管理员创建,归属部门租户1-部门1,创建人tenant1Admin。 - 值
数据-部门1-仅本人创建,归属部门租户1-部门1,创建人tenant1OnlySelfUser(关键数据)。 - 值
数据-部门2,归属部门租户1-部门2,创建人tenant1Admin。 - 值
数据-部门2子部门,归属部门租户1-部门2子部门,创建人tenant1Admin。
- 值
测试数据拦截:
- 登录
superAdmin(超级管理员):- 查询结果:查看所有 5 条数据。
- 新增结果:可以在 任意部门 创建数据。
- 增删改结果:可以修改/删除所有 5 条数据。
- 原因:拥有最高权限(
StpExtUtil.isSuperAdmin),拦截器和校验逻辑直接放行,无视租户和数据范围限制。
- 登录
tenant1Admin(租户管理员):- 查询结果:查看所有 5 条数据。
- 新增结果:可以在 任意部门 创建数据。
- 增删改结果:可以修改/删除所有 5 条数据。
- 原因:作为租户管理员,权限配置为“全部数据权限”,校验逻辑放行所有部门。
- 登录
tenant1AllUser(全部权限):- 查询结果:查看所有 5 条数据。
- 新增结果:可以在 任意部门 创建数据。
- 增删改结果:可以修改/删除所有 5 条数据。
- 原因:角色权限为“全部”,校验逻辑允许在租户下任意部门操作。
- 登录
tenant1CustomUser(自定义权限:查部门1+2,改仅部门2):- 查询结果:查看 3 条数据(
数据-部门1-管理员创建、数据-部门1-仅本人创建、数据-部门2)。 - 新增结果:
- 在
租户1-部门2新增:成功。 - 在
租户1-部门1新增:失败(抛出异常:“无权在所选部门操作数据”)。
- 在
- 增删改结果:
- 修改
数据-部门2:成功。 - 修改
数据-部门1-管理员创建:失败(提示“无增删改权限”)。
- 修改
- 原因:
- 查询:Query 权限覆盖了
部门1和部门2。 - 新增/修改:Update 权限仅勾选了
部门2。Service 层保存前校验的是 Update 权限,SQL 拦截器也是注入 Update 权限,严格实现了读写分离。
- 查询:Query 权限覆盖了
- 查询结果:查看 3 条数据(
- 登录
tenant1CurrentDeptAndChildrenUser(本部门及以下,所在部门:部门2):- 查询结果:查看 2 条数据(
数据-部门2、数据-部门2子部门)。 - 新增结果:可以在
租户1-部门2和租户1-部门2子部门新增;在其他部门新增失败。 - 增删改结果:可以修改/删除这 2 条数据。
- 原因:权限范围包含本部门(部门2)及其子部门,操作范围严格限制在该树形结构内。
- 查询结果:查看 2 条数据(
- 登录
tenant1CurrentDeptUser(本部门,所在部门:部门2):- 查询结果:仅查看 1 条数据(
数据-部门2)。 - 新增结果:仅可以在
租户1-部门2新增;在子部门或其他部门新增失败。 - 增删改结果:仅可以修改/删除这 1 条数据。
- 原因:严格限制为本部门,自动排除子部门数据。
- 查询结果:仅查看 1 条数据(
- 登录
tenant1OnlySelfUser(仅本人,所在部门:部门1):- 查询结果:仅查看 1 条数据(
数据-部门1-仅本人创建)。 - 新增结果:可以在
租户1-部门1新增(通常限制为当前所在部门);在其他部门新增失败。 - 增删改结果:
- 修改
数据-部门1-仅本人创建:成功。 - 修改
数据-部门1-管理员创建:失败。
- 修改
- 原因:
- 新增:允许在自己所属部门创建数据。
- 改/查:严格按
created_by = 当前用户过滤,只能操作自己的数据。
- 查询结果:仅查看 1 条数据(
权限范围:
| 登录用户(用户名) | 角色权限类型 | 查询范围 | 新增/修改范围 | 读写分离说明 |
|---|---|---|---|---|
| superAdmin | 超级管理员 | 全部 | 全部 | 无 |
| tenant1Admin | 租户管理员 | 全部 | 全部 | 无 |
| tenant1AllUser | 全部 | 全部 | 全部 | 无 |
| tenant1CustomUser | 自定义 |
部门1 + 部门2 | 仅 部门2 | ✅ 只能读部门1,不能写部门1 |
| tenant1CurrentDeptAndChildrenUser | 本部门及以下 | 部门2 + 子部门 | 部门2 + 子部门 | 无 |
| tenant1CurrentDeptUser | 本部门 | 仅 部门2 | 仅 部门2 | 无 |
| tenant1OnlySelfUser | 仅本人 | 仅 部门1 (且本人创建) | 仅 部门1 (且本人创建) | 无 |