Skip to content

数据库表结构

Art Admin 使用 MySQL 8.0,核心包含 9 张表。主键使用 BIGINT 雪花 ID(Token 表除外)。

表一览

表名说明主键策略
sys_user系统用户雪花 ID
sys_role系统角色雪花 ID
sys_menu系统菜单雪花 ID
sys_permission权限标识雪花 ID
sys_user_role用户-角色关联复合主键
sys_role_menu角色-菜单关联复合主键
sys_role_permission角色-权限关联复合主键
token_access访问令牌自增 ID
token_refresh刷新令牌自增 ID

核心表结构

sys_user(系统用户)

sql
CREATE TABLE `sys_user` (
  `id` bigint NOT NULL COMMENT '主键ID(雪花ID)',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(1024) NOT NULL COMMENT '密码(加密存储)',
  `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
  `is_super` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否超级管理员',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `avatar` varchar(200) DEFAULT NULL COMMENT '头像',
  `status` int NOT NULL DEFAULT 1 COMMENT '状态:0-不可用,1-正常',
  `last_login_time` datetime(6) DEFAULT NULL COMMENT '最后登录时间',
  `last_active_time` datetime(6) DEFAULT NULL COMMENT '最近活跃时间',
  `created_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_sys_user_username` (`username`)
) ENGINE=InnoDB COMMENT='系统用户表';

sys_menu(菜单 + RBAC 权限)

sql
CREATE TABLE `sys_menu` (
  `id` BIGINT NOT NULL COMMENT '主键ID(雪花ID)',
  `parent_id` BIGINT NULL COMMENT '父级菜单ID',
  `name` VARCHAR(50) NOT NULL COMMENT '菜单名称',
  `code` VARCHAR(50) NOT NULL COMMENT '菜单编码/权限标识',
  `path` VARCHAR(200) NULL COMMENT '路由地址',
  `component` VARCHAR(200) NULL COMMENT '组件路径',
  `icon` VARCHAR(100) NULL COMMENT '图标',
  `sort` INT NOT NULL DEFAULT 0 COMMENT '排序',
  `is_visible` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否可见',
  `is_external` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否外链',
  `is_iframe` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否内嵌iframe',
  `is_full_page` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否全屏页面',
  `keep_alive` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否缓存',
  `status` INT NOT NULL DEFAULT 1 COMMENT '状态',
  `created_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='系统菜单表';

RBAC 关联表

sql
-- 用户-角色(多对多)
CREATE TABLE `sys_user_role` (
  `user_id` BIGINT NOT NULL,
  `role_id` BIGINT NOT NULL,
  PRIMARY KEY (`user_id`, `role_id`)
);

-- 角色-菜单(多对多)
CREATE TABLE `sys_role_menu` (
  `role_id` BIGINT NOT NULL,
  `menu_id` BIGINT NOT NULL,
  PRIMARY KEY (`role_id`, `menu_id`)
);

-- 角色-权限(多对多)
CREATE TABLE `sys_role_permission` (
  `role_id` BIGINT NOT NULL,
  `permission_id` BIGINT NOT NULL,
  PRIMARY KEY (`role_id`, `permission_id`)
);

设计原则

无外键约束

WARNING

数据库中不使用外键约束。关联关系仅在 EF Core 通过 [ForeignKey] 声明导航属性,MySQL 表中不存在实际 FK。

好处:

  • 迁移更灵活,不受外键顺序限制
  • 删除/更新不触发级联
  • 性能更好(减少锁竞争)

雪花 ID

所有业务实体主键使用 BIGINT + 雪花 ID(IdGen.NextId()),Token 表使用自增 ID。

时间精度

所有时间字段使用 datetime(6) 微秒精度。

Snake Case 命名

EF Core 配置了 snake_case 命名策略,C# 的 PascalCase 属性自动映射为 snake_case 列名。

文件位置

database/
├── schemas/
│   └── 01_core_tables.sql    # 完整表结构
├── seeds/
│   └── 01_sys_user.sql       # 初始数据
└── migrations/
    └── yyyyMMdd_desc.sql     # 增量迁移