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;