use school_news;
-- 统一资源权限控制表
DROP TABLE IF EXISTS `tb_resource_permission`;
CREATE TABLE `tb_resource_permission` (
  `id` VARCHAR(50) NOT NULL COMMENT '权限ID',
  `resource_type` INT(4) NOT NULL COMMENT '资源类型（1新闻 2课程 3学习任务 4部门 5角色 6成就 7定时任务 8轮播图 9标签）',
  `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID',
  `dept_id` VARCHAR(50) DEFAULT NULL COMMENT '部门ID（NULL表示不限制部门）',
  `role_id` VARCHAR(50) DEFAULT NULL COMMENT '角色ID（NULL表示不限制角色）',
  `can_read` TINYINT(1) DEFAULT 1 COMMENT '读权限（0否 1是）',
  `can_write` TINYINT(1) DEFAULT 0 COMMENT '写权限（0否 1是）',
  `can_execute` TINYINT(1) DEFAULT 0 COMMENT '执行权限（0否 1是）',
  `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者',
  `updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_resource_dept_role` (`resource_type`, `resource_id`, `dept_id`, `role_id`, `deleted`),
  KEY `idx_resource` (`resource_type`, `resource_id`),
  KEY `idx_dept` (`dept_id`),
  KEY `idx_role` (`role_id`),
  KEY `idx_permissions` (`can_read`, `can_write`, `can_execute`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='统一资源权限控制表';

-- 说明：
-- 1. resource_type 资源类型说明（对应ResourceType枚举）：
--    1 - NEWS (新闻/资源)
--    2 - COURSE (课程)
--    3 - TASK (学习任务)
--    4 - DEPT (部门)
--    5 - ROLE (角色)
--    6 - ACHIEVEMENT (成就)
--    7 - CRONTAB_TASK (定时任务)
--    8 - BANNER (轮播图)
--    9 - TAG (标签)
--    注意：这些值必须与 common-core/enums/ResourceType.java 中的枚举定义完全一致
--
-- 2. dept_id 和 role_id 组合使用：
--    - 都为NULL：超级管理员权限，所有人可访问
--    - dept_id有值，role_id为NULL：该部门所有人可访问
--    - dept_id为NULL，role_id有值：该角色所有人可访问（跨部门）
--    - 都有值：该部门的该角色可访问（精确控制）
--
-- 3. 权限说明：
--    - can_read：查看权限（浏览、阅读、查询）
--    - can_write：编辑权限（修改、删除）
--    - can_execute：执行权限（发布、审核、执行等高级操作）
--
-- 4. 权限创建逻辑：
--    - root_department的superadmin创建资源时：为所有部门和角色创建权限
--    - 普通用户创建资源时：为父部门管理员+子部门所有角色创建权限
--    - 始终为root_department的superadmin创建全权限记录
--
-- 5. 查询示例：
--    查询用户对某资源的权限：
--    SELECT * FROM tb_resource_permission 
--    WHERE resource_type = 1 
--      AND resource_id = 'xxx'
--      AND (
--        (dept_id IS NULL AND role_id IS NULL)  -- 超级权限
--        OR (dept_id = '用户部门' AND role_id IS NULL)  -- 部门权限
--        OR (role_id = '用户角色' AND dept_id IS NULL)  -- 角色权限
--        OR (dept_id = '用户部门' AND role_id = '用户角色')  -- 精确权限
--      )
--      AND can_read = 1
--      AND deleted = 0;

