SCHEMA.md 6.4 KB

数据库表结构

投研平台后端当前使用 SQLite(data/ir.db)。表结构在启动时通过代码自动创建:

  • 数据源客户端:SqliteDataSourceClient#initDemoTable → demo_user
  • 用户表:UserService#initSchema → sys_user
  • RBAC 表:RbacService#init → sys_role / sys_permission / sys_user_role / sys_role_permission
  • 菜单表:MenuService#init → sys_menu / sys_role_menu(独立菜单权限体系,与接口权限解耦)

所有 DDL 均为 CREATE TABLE IF NOT EXISTS(幂等,重复启动不会重建已存在的表)。


1. demo_user — 演示用户表

由 init-demo-table 配置控制是否创建,仅供数据源演示接口使用。

字段 类型 约束 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 主键,自增
name TEXT NOT NULL 姓名
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 创建时间

2. sys_user — 系统用户表

由 UserService#initSchema 创建;RbacService 在启动时校验并创建内置管理员。

字段 类型 约束 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 主键,自增
username TEXT NOT NULL UNIQUE 登录名(唯一)
password TEXT NOT NULL BCrypt 加密后的密码
nickname TEXT — 昵称
enabled INTEGER NOT NULL DEFAULT 1 是否启用(0=禁用,1=启用)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 创建时间

3. sys_role — 角色表

内置种子角色:ADMIN(超级管理员)、USER(普通用户)。

字段 类型 约束 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 主键,自增
code TEXT NOT NULL UNIQUE 角色编码(唯一)
name TEXT NOT NULL 角色名称
description TEXT — 描述
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 创建时间

4. sys_permission — 权限表

内置种子权限:user:list/create/update/delete、role:list/create/update/delete/assign、permission:list/create/delete、data:query/write。

字段 类型 约束 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 主键,自增
code TEXT NOT NULL UNIQUE 权限编码(唯一)
name TEXT NOT NULL 权限名称
description TEXT — 描述
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 创建时间

5. sys_user_role — 用户-角色关联表

多对多,复合主键;删除用户/角色时对应关联一并清理。

字段 类型 约束 说明
user_id INTEGER NOT NULL,PRIMARY KEY(user_id, role_id) 用户 ID → sys_user.id
role_id INTEGER NOT NULL,PRIMARY KEY(user_id, role_id) 角色 ID → sys_role.id

6. sys_role_permission — 角色-权限关联表

多对多,复合主键;删除角色/权限时对应关联一并清理。

字段 类型 约束 说明
role_id INTEGER NOT NULL,PRIMARY KEY(role_id, permission_id) 角色 ID → sys_role.id
permission_id INTEGER NOT NULL,PRIMARY KEY(role_id, permission_id) 权限 ID → sys_permission.id

7. sys_menu — 菜单表(独立菜单权限体系)

由 MenuService#init 创建。菜单与接口权限(sys_permission)完全解耦:菜单自身是一棵树,通过 sys_role_menu 直接授予角色,不读取任何接口权限编码。

字段 类型 约束 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 主键,自增
parent_id INTEGER — 父菜单 id → sys_menu.id;NULL = 顶级
name TEXT NOT NULL 菜单名称
type TEXT NOT NULL DEFAULT 'menu' 类型:dir=目录 / menu=菜单
route TEXT — 前端路由 path
component TEXT — 前端组件路径
icon TEXT — 菜单图标
sort INTEGER DEFAULT 0 排序号(升序)
visible INTEGER DEFAULT 1 是否可见(0=隐藏,不参与用户菜单下发)
status INTEGER DEFAULT 1 是否启用(0=停用)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 创建时间

8. sys_role_menu — 角色-菜单关联表

多对多,复合主键;RbacService#deleteRole 与 MenuService#deleteMenu 会同步清理关联。

字段 类型 约束 说明
role_id INTEGER NOT NULL,PRIMARY KEY(role_id, menu_id) 角色 ID → sys_role.id
menu_id INTEGER NOT NULL,PRIMARY KEY(role_id, menu_id) 菜单 ID → sys_menu.id

表关系

┌─────────────── 接口权限(RBAC,sys_permission 管接口) ───────────────┐
sys_user ──< sys_user_role >── sys_role ──< sys_role_permission >── sys_permission
  (用户)        (多对多)         (角色)         (多对多)              (权限)

┌─────────────── 菜单权限(sys_menu,独立体系,与接口权限解耦) ───────────────┐
sys_user ──< sys_user_role >── sys_role ──< sys_role_menu >── sys_menu
  (用户)        (多对多)         (角色)     (多对多)            (菜单树)
  • 一个用户可拥有多个角色;一个角色可被多个用户持有。
  • 一个角色可拥有多个权限;一个权限可授予多个角色。
  • 用户的最终权限 = 其所有角色权限的并集(查询时已 DISTINCT 去重)。
  • 用户的可见菜单 = 其所有角色被授予菜单的并集;下发时向上补全父级、剔除空目录。

种子数据(启动时自动灌入,幂等)

类别 内容
角色 ADMIN(超级管理员,拥有全部权限)、USER(普通用户,默认注册用户角色)
权限 user:list user:create user:update user:delete、role:list role:create role:update role:delete role:assign、permission:list permission:create permission:delete、data:query data:write
菜单 工作台、系统管理(目录)→ 用户管理/角色管理/权限管理/菜单管理、数据源演示;启动时全部授权给 ADMIN 角色,新建菜单也会自动授权给 ADMIN
管理员 由 ir.auth.admin.username/password 配置(默认 admin / admin123),创建并授予 ADMIN 角色

新注册用户由 UserService 自动分配默认角色 USER。