-- RBAC权限系统数据库迁移脚本
-- MySQL 8.0+

-- 创建角色表
CREATE TABLE IF NOT EXISTS `roles` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '角色ID',
    `name` VARCHAR(255) NOT NULL COMMENT '角色名称',
    `slug` VARCHAR(50) NOT NULL COMMENT '角色标识',
    `description` VARCHAR(500) DEFAULT NULL COMMENT '角色描述',
    `level` TINYINT UNSIGNED NOT NULL DEFAULT 50 COMMENT '角色级别(越大越高)',
    `guard_name` VARCHAR(50) NOT NULL DEFAULT 'web' COMMENT '守护名称',
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `deleted_at` DATETIME DEFAULT NULL COMMENT '删除时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_roles_slug` (`slug`),
    KEY `idx_roles_level` (`level`),
    KEY `idx_roles_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';

-- 创建权限表
CREATE TABLE IF NOT EXISTS `permissions` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '权限ID',
    `name` VARCHAR(255) NOT NULL COMMENT '权限名称',
    `slug` VARCHAR(100) NOT NULL COMMENT '权限标识',
    `group_name` VARCHAR(100) DEFAULT NULL COMMENT '权限分组',
    `description` VARCHAR(500) DEFAULT NULL COMMENT '权限描述',
    `sort` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序',
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `deleted_at` DATETIME DEFAULT NULL COMMENT '删除时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_permissions_slug` (`slug`),
    KEY `idx_permissions_group_name` (`group_name`),
    KEY `idx_permissions_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';

-- 创建角色权限关联表
CREATE TABLE IF NOT EXISTS `role_permissions` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `role_id` BIGINT UNSIGNED NOT NULL COMMENT '角色ID',
    `permission_id` BIGINT UNSIGNED NOT NULL COMMENT '权限ID',
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_role_permissions_role_permission` (`role_id`, `permission_id`),
    KEY `idx_role_permissions_permission_id` (`permission_id`),
    CONSTRAINT `fk_role_permissions_role` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE,
    CONSTRAINT `fk_role_permissions_permission` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限关联表';

-- 创建用户角色关联表
CREATE TABLE IF NOT EXISTS `user_roles` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
    `role_id` BIGINT UNSIGNED NOT NULL COMMENT '角色ID',
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_user_roles_user_role` (`user_id`, `role_id`),
    KEY `idx_user_roles_role_id` (`role_id`),
    CONSTRAINT `fk_user_roles_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
    CONSTRAINT `fk_user_roles_role` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';

-- 插入默认超级管理员角色
INSERT INTO `roles` (`name`, `slug`, `description`, `level`, `guard_name`) VALUES
('超级管理员', 'super_admin', '系统超级管理员，拥有所有权限', 100, 'web'),
('管理员', 'admin', '系统管理员，拥有大部分权限', 80, 'web'),
('普通用户', 'user', '普通用户，拥有基础权限', 50, 'web');

-- 插入默认权限
INSERT INTO `permissions` (`name`, `slug`, `group_name`, `description`, `sort`) VALUES
-- 用户模块
('用户查看', 'user.view', '用户模块', '查看用户信息', 1),
('用户创建', 'user.create', '用户模块', '创建新用户', 2),
('用户编辑', 'user.edit', '用户模块', '编辑用户信息', 3),
('用户删除', 'user.delete', '用户模块', '删除用户', 4),
-- 角色模块
('角色查看', 'role.view', '角色模块', '查看角色信息', 1),
('角色创建', 'role.create', '角色模块', '创建新角色', 2),
('角色编辑', 'role.edit', '角色模块', '编辑角色信息', 3),
('角色删除', 'role.delete', '角色模块', '删除角色', 4),
('角色分配权限', 'role.assign', '角色模块', '分配角色权限', 5),
-- 订单模块
('订单查看', 'order.view', '订单模块', '查看订单', 1),
('订单创建', 'order.create', '订单模块', '创建订单', 2),
('订单编辑', 'order.edit', '订单模块', '编辑订单', 3),
('订单删除', 'order.delete', '订单模块', '删除订单', 4),
-- 商品模块
('商品查看', 'goods.view', '商品模块', '查看商品', 1),
('商品创建', 'goods.create', '商品模块', '创建商品', 2),
('商品编辑', 'goods.edit', '商品模块', '编辑商品', 3),
('商品删除', 'goods.delete', '商品模块', '删除商品', 4),
-- 系统模块
('系统配置', 'system.config', '系统模块', '系统配置管理', 1),
('操作日志', 'system.log', '系统模块', '查看操作日志', 2);

-- 为超级管理员角色分配所有权限
INSERT INTO `role_permissions` (`role_id`, `permission_id`)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.slug = 'super_admin';

-- 为管理员角色分配大部分权限（除了系统配置）
INSERT INTO `role_permissions` (`role_id`, `permission_id`)
SELECT r.id, p.id FROM roles r, permissions p 
WHERE r.slug = 'admin' AND p.slug != 'system.config';
