# 数据库表结构 投研平台后端当前使用 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` | --- ## 表关系 ```text ┌─────────────── 接口权限(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`。