the core is: User ↔ Role ↔ Permission
表结构总览
sys_user 用户表
sys_role 角色表
sys_permission 权限表(菜单/按钮/接口)
sys_user_role 用户-角色关联表(多对多)
sys_role_permission 角色-权限关联表(多对多)
1. sys_user
CREATE TABLE `sys_user` (
`id` bigint NOT NULL COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT '密码(加密存储,如BCrypt)',
`nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`gender` tinyint DEFAULT NULL COMMENT '性别(0:未知,1:男,2:女)',
`status` tinyint DEFAULT '1' COMMENT '状态(1:正常,0:禁用)',
`last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
`last_login_ip` varchar(50) DEFAULT NULL COMMENT '最后登录IP',
`create_at` datetime DEFAULT NULL COMMENT '创建时间',
`update_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint DEFAULT '0' COMMENT '逻辑删除(0:未删除,1:已删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
2. sys_role
CREATE TABLE `sys_role` (
`id` bigint NOT NULL COMMENT '角色ID',
`role_name` varchar(50) NOT NULL COMMENT '角色名称,如"管理员"',
`role_code` varchar(50) NOT NULL COMMENT '角色编码,如ROLE_ADMIN,代码里用来判断权限',
`description` varchar(255) DEFAULT NULL COMMENT '角色描述',
`sort` int DEFAULT NULL COMMENT '排序',
`status` tinyint DEFAULT '1' COMMENT '状态(1:启用,0:禁用)',
`create_at` datetime DEFAULT NULL COMMENT '创建时间',
`update_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint DEFAULT '0' COMMENT '逻辑删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_code` (`role_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表';
3. sys_permission
CREATE TABLE `sys_permission` (
`id` bigint NOT NULL COMMENT '权限ID',
`parent_id` bigint DEFAULT '0' COMMENT '父级ID,顶级为0',
`name` varchar(50) NOT NULL COMMENT '权限名称,如"食品管理"',
`type` tinyint NOT NULL COMMENT '类型(1:目录,2:菜单,3:按钮/操作,4:接口)',
`permission_code` varchar(100) DEFAULT NULL COMMENT '权限标识,如 food:add,用于代码里@PreAuthorize判断',
`path` varchar(255) DEFAULT NULL COMMENT '前端路由路径',
`component` varchar(255) DEFAULT NULL COMMENT '前端组件路径',
`icon` varchar(100) DEFAULT NULL COMMENT '图标',
`api_path` varchar(255) DEFAULT NULL COMMENT '接口路径,如 /food/add(type=4时使用)',
`api_method` varchar(10) DEFAULT NULL COMMENT '请求方式 GET/POST/PUT/DELETE',
`sort` int DEFAULT NULL COMMENT '排序',
`status` tinyint DEFAULT '1' COMMENT '状态(1:启用,0:禁用)',
`create_at` datetime DEFAULT NULL COMMENT '创建时间',
`update_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint DEFAULT '0' COMMENT '逻辑删除',
PRIMARY KEY (`id`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_permission_code` (`permission_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='权限表(菜单/按钮/接口)';
4. sys_user_role
CREATE TABLE `sys_user_role` (
`id` bigint NOT NULL,
`user_id` bigint NOT NULL COMMENT '用户ID',
`role_id` bigint NOT NULL COMMENT '角色ID',
`create_at` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`user_id`,`role_id`),
KEY `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户-角色关联表';
5. sys_role_permission
CREATE TABLE `sys_role_permission` (
`id` bigint NOT NULL,
`role_id` bigint NOT NULL COMMENT '角色ID',
`permission_id` bigint NOT NULL COMMENT '权限ID',
`create_at` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_permission` (`role_id`,`permission_id`),
KEY `idx_permission_id` (`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色-权限关联表';
关系链路:用户 → 用户角色关联表 → 角色 → 角色权限关联表 → 权限
一个用户查权限的完整链路:
SELECT DISTINCT p.permission_code
FROM sys_user u
JOIN sys_user_role ur ON ur.user_id = u.id
JOIN sys_role r ON r.id = ur.role_id AND r.status = 1
JOIN sys_role_permission rp ON rp.role_id = r.id
JOIN sys_permission p ON p.id = rp.permission_id AND p.status = 1
WHERE u.id = ? AND u.status = 1;
Top comments (0)