Files
kefu/im/backend/migrations/023_admin_rbac.sql
T
2026-09-03 08:38:17 +08:00

78 lines
3.9 KiB
SQL

SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS admin_roles (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
role_code VARCHAR(50) NOT NULL,
role_name VARCHAR(80) NOT NULL,
description VARCHAR(255) NOT NULL DEFAULT '',
built_in TINYINT(1) NOT NULL DEFAULT 0,
status TINYINT UNSIGNED NOT NULL DEFAULT 1,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_admin_roles_code (role_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS admin_permissions (
permission_code VARCHAR(80) NOT NULL,
permission_name VARCHAR(100) NOT NULL,
permission_group VARCHAR(50) NOT NULL,
sort_order INT NOT NULL DEFAULT 0,
PRIMARY KEY (permission_code),
KEY idx_admin_permissions_group (permission_group, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS admin_role_permissions (
role_id BIGINT UNSIGNED NOT NULL,
permission_code VARCHAR(80) NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (role_id, permission_code),
CONSTRAINT fk_admin_role_permissions_role FOREIGN KEY (role_id) REFERENCES admin_roles(id) ON DELETE CASCADE,
CONSTRAINT fk_admin_role_permissions_permission FOREIGN KEY (permission_code) REFERENCES admin_permissions(permission_code) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS admin_user_roles (
admin_user_id BIGINT UNSIGNED NOT NULL,
role_id BIGINT UNSIGNED NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (admin_user_id, role_id),
KEY idx_admin_user_roles_role (role_id),
CONSTRAINT fk_admin_user_roles_user FOREIGN KEY (admin_user_id) REFERENCES admin_users(id) ON DELETE CASCADE,
CONSTRAINT fk_admin_user_roles_role FOREIGN KEY (role_id) REFERENCES admin_roles(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO admin_permissions (permission_code, permission_name, permission_group, sort_order) VALUES
('dashboard:view', '查看运营概览', 'dashboard', 10),
('users:view', '查看用户', 'users', 20),
('users:manage', '编辑用户资料和会员', 'users', 21),
('users:security', '重置密码和强制下线', 'users', 22),
('verification:manage', '审核用户认证', 'users', 23),
('violations:manage', '处理违规和账号处罚', 'users', 24),
('content:view', '查看动态内容', 'content', 30),
('content:manage', '删除和处置动态', 'content', 31),
('messages:view', '查看聊天消息记录', 'content', 32),
('reports:handle', '处理举报', 'risk', 40),
('risk:view', '查看风险信息', 'risk', 41),
('membership:manage', '管理会员套餐', 'commerce', 50),
('orders:view', '查看订单', 'commerce', 51),
('orders:manage', '变更订单和退款', 'commerce', 52),
('system:manage', '管理系统、集成和管理员', 'system', 60)
ON DUPLICATE KEY UPDATE
permission_name=VALUES(permission_name),
permission_group=VALUES(permission_group),
sort_order=VALUES(sort_order);
INSERT INTO admin_roles (role_code, role_name, description, built_in, status)
VALUES ('super_admin', '超级管理员', '拥有平台全部权限;内置角色不可删除', 1, 1)
ON DUPLICATE KEY UPDATE role_name=VALUES(role_name), description=VALUES(description), built_in=1, status=1;
INSERT IGNORE INTO admin_role_permissions (role_id, permission_code)
SELECT r.id, p.permission_code
FROM admin_roles r CROSS JOIN admin_permissions p
WHERE r.role_code='super_admin';
-- Existing administrators keep their current capabilities after RBAC is enabled.
INSERT IGNORE INTO admin_user_roles (admin_user_id, role_id)
SELECT a.id, r.id
FROM admin_users a JOIN admin_roles r ON r.role_code='super_admin';