完整的表结构设计:
## 完整的表结构设计
```sql
-- 用户表(已有,稍作调整)
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
nickname VARCHAR(50),
avatar VARCHAR(255),
phone VARCHAR(20),
status TINYINT DEFAULT 1 COMMENT '1:正常 0:禁用',
created_by BIGINT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_username (username),
INDEX idx_status (status)
);
-- 角色表(已有,保持不变)
CREATE TABLE roles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
role_name VARCHAR(50) UNIQUE NOT NULL,
role_code VARCHAR(50) UNIQUE NOT NULL,
description TEXT,
status TINYINT DEFAULT 1 COMMENT '1:正常 0:禁用',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 用户角色关联表(已有,保持不变)
CREATE TABLE user_roles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
UNIQUE KEY uk_user_role (user_id, role_id)
);
-- 菜单表(新增 - 核心)
CREATE TABLE menus (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
parent_id BIGINT DEFAULT 0 COMMENT '父菜单ID,0为顶级菜单',
menu_name VARCHAR(50) NOT NULL,
menu_code VARCHAR(50) UNIQUE NOT NULL COMMENT '菜单编码',
path VARCHAR(200) COMMENT '路由地址',
component VARCHAR(255) COMMENT '组件路径',
redirect VARCHAR(200) COMMENT '重定向地址',
menu_type TINYINT NOT NULL COMMENT '菜单类型:1目录 2菜单 3按钮',
visible TINYINT DEFAULT 1 COMMENT '是否显示:1显示 0隐藏',
status TINYINT DEFAULT 1 COMMENT '菜单状态:1正常 0停用',
icon VARCHAR(100) COMMENT '菜单图标',
sort_order INT DEFAULT 0 COMMENT '显示顺序',
meta JSON COMMENT '路由元信息(标题、缓存等)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_parent_id (parent_id),
INDEX idx_status (status)
);
-- 角色菜单关联表(新增 - 核心)
CREATE TABLE role_menus (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
role_id BIGINT NOT NULL,
menu_id BIGINT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
FOREIGN KEY (menu_id) REFERENCES menus(id) ON DELETE CASCADE,
UNIQUE KEY uk_role_menu (role_id, menu_id)
);
-- 权限表(可选 - 更细粒度控制)
CREATE TABLE permissions (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
permission_name VARCHAR(50) NOT NULL,
permission_code VARCHAR(50) UNIQUE NOT NULL,
description TEXT,
resource VARCHAR(100) COMMENT '资源标识',
action VARCHAR(50) COMMENT '操作类型',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 角色权限关联表(可选)
CREATE TABLE role_permissions (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
role_id BIGINT NOT NULL,
permission_id BIGINT NOT NULL,
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE,
UNIQUE KEY uk_role_permission (role_id, permission_id)
);
-- 操作日志表(推荐)
CREATE TABLE operation_logs (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT,
operation VARCHAR(50) NOT NULL COMMENT '操作类型',
method VARCHAR(10) COMMENT 'HTTP方法',
url VARCHAR(500) COMMENT '请求URL',
ip VARCHAR(50) COMMENT 'IP地址',
user_agent TEXT COMMENT '用户代理',
request_data JSON COMMENT '请求参数',
response_data JSON COMMENT '响应数据',
status TINYINT COMMENT '操作状态:1成功 0失败',
error_msg TEXT COMMENT '错误信息',
duration INT COMMENT '耗时(毫秒)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
INDEX idx_user_id (user_id),
INDEX idx_created_at (created_at)
);
```
## 初始化数据
```sql
-- 插入默认角色
INSERT INTO roles (role_name, role_code, description) VALUES
('超级管理员', 'SUPER_ADMIN', '系统超级管理员'),
('管理员', 'ADMIN', '普通管理员'),
('用户', 'USER', '普通用户');
-- 插入菜单数据
INSERT INTO menus (parent_id, menu_name, menu_code, path, component, menu_type, icon, sort_order, meta) VALUES
-- 系统管理
(0, '系统管理', 'SYSTEM', '/system', 'Layout', 1, 'system', 1, '{"title": "系统管理"}'),
(1, '用户管理', 'USER_MANAGE', '/system/user', 'system/user/index', 2, 'user', 1, '{"title": "用户管理"}'),
(1, '角色管理', 'ROLE_MANAGE', '/system/role', 'system/role/index', 2, 'role', 2, '{"title": "角色管理"}'),
(1, '菜单管理', 'MENU_MANAGE', '/system/menu', 'system/menu/index', 2, 'menu', 3, '{"title": "菜单管理"}'),
-- 用户管理按钮权限
(2, '新增用户', 'USER_ADD', '', '', 3, '', 1, '{}'),
(2, '编辑用户', 'USER_EDIT', '', '', 3, '', 2, '{}'),
(2, '删除用户', 'USER_DELETE', '', '', 3, '', 3, '{}'),
-- 角色管理按钮权限
(3, '新增角色', 'ROLE_ADD', '', '', 3, '', 1, '{}'),
(3, '编辑角色', 'ROLE_EDIT', '', '', 3, '', 2, '{}'),
(3, '删除角色', 'ROLE_DELETE', '', '', 3, '', 3, '{}'),
(3, '分配权限', 'ROLE_ASSIGN', '', '', 3, '', 4, '{}');
-- 给超级管理员分配所有菜单权限
INSERT INTO role_menus (role_id, menu_id)
SELECT 1, id FROM menus;
```
## 主要改进点
1. **新增菜单表** - 支持多级菜单结构
2. **角色菜单关联** - 实现 RBAC 权限控制
3. **菜单类型区分** - 目录/菜单/按钮三种类型
4. **路由元信息** - 使用 JSON 字段存储 Vue Router meta
5. **操作日志** - 记录用户操作行为
6. **索引优化** - 添加必要的数据库索引
这个结构可以满足你的所有需求:用户管理、角色管理、多级菜单配置、权限关联等。