admin/sql/install_data_permission.sql
2026-07-03 11:58:24 +08:00

350 lines
18 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 数据权限模块 — RBAC 侧表结构
-- 设计文档:E:\oms0414\docs\数据权限设计.md
-- 与 user / role / organization 同库;表名小写,与 Fake.Rbac 风格一致
-- 执行前请确认已存在 RBAC 基础表
-- ---------------------------------------------------------------------------
-- 1. 用户组织权限
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `user_org_perm` (
`Id` CHAR(36) NOT NULL COMMENT '主键 GUID',
`UserId` CHAR(36) NOT NULL COMMENT 'FK user.Id',
`OrganizationId` CHAR(36) NOT NULL COMMENT 'FK organization.Id',
`OrgScope` TINYINT NOT NULL DEFAULT 2 COMMENT '1=仅本级 2=本级+所有下级',
`EffectiveTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '生效时间',
`ExpireTime` DATETIME NULL COMMENT '过期时间,NULL=永久',
`IsTemporary` TINYINT NOT NULL DEFAULT 0 COMMENT '是否临时授权:0否 1是',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
KEY `idx_user_org_perm_user` (`UserId`, `IsDeleted`),
KEY `idx_user_org_perm_org` (`OrganizationId`),
KEY `idx_user_org_perm_expire` (`ExpireTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户组织数据权限';
-- ---------------------------------------------------------------------------
-- 2. 角色组织权限(角色继承 / 模板绑定)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `role_org_perm` (
`Id` CHAR(36) NOT NULL,
`RoleId` CHAR(36) NOT NULL COMMENT 'FK role.Id',
`OrganizationId` CHAR(36) NOT NULL,
`OrgScope` TINYINT NOT NULL DEFAULT 2,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_role_org_perm` (`RoleId`, `OrganizationId`, `IsDeleted`),
KEY `idx_role_org_perm_role` (`RoleId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色组织数据权限';
-- ---------------------------------------------------------------------------
-- 3. 数据范围(个人/小组/部门/组织树/全局)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `role_data_scope` (
`Id` CHAR(36) NOT NULL,
`RoleId` CHAR(36) NOT NULL,
`DataScope` TINYINT NOT NULL COMMENT '1个人 2小组 3部门 4组织树 5全局',
`DataResourceCode` VARCHAR(32) NULL COMMENT 'NULL=全局默认;Order/Customer/Recharge 等',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_role_data_scope` (`RoleId`, `DataResourceCode`, `IsDeleted`),
KEY `idx_role_data_scope_role` (`RoleId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色数据范围';
CREATE TABLE IF NOT EXISTS `user_data_scope` (
`Id` CHAR(36) NOT NULL,
`UserId` CHAR(36) NOT NULL,
`DataScope` TINYINT NOT NULL,
`DataResourceCode` VARCHAR(32) NULL,
`EffectiveTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ExpireTime` DATETIME NULL,
`IsTemporary` TINYINT NOT NULL DEFAULT 0,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_user_data_scope` (`UserId`, `DataResourceCode`, `IsDeleted`),
KEY `idx_user_data_scope_user` (`UserId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户数据范围(覆盖角色默认)';
-- ---------------------------------------------------------------------------
-- 4. 业务维度
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `role_biz_perm` (
`Id` CHAR(36) NOT NULL,
`RoleId` CHAR(36) NOT NULL,
`BizType` VARCHAR(32) NOT NULL COMMENT 'product_line/kpi_area/customer_group/warehouse/region',
`BizId` VARCHAR(64) NOT NULL COMMENT '业务主键字符串',
`BizName` VARCHAR(128) NULL COMMENT '冗余展示名',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
KEY `idx_role_biz_perm_role` (`RoleId`, `BizType`),
KEY `idx_role_biz_perm_biz` (`BizType`, `BizId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色业务维度权限';
CREATE TABLE IF NOT EXISTS `user_biz_perm` (
`Id` CHAR(36) NOT NULL,
`UserId` CHAR(36) NOT NULL,
`BizType` VARCHAR(32) NOT NULL,
`BizId` VARCHAR(64) NOT NULL,
`BizName` VARCHAR(128) NULL,
`EffectiveTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ExpireTime` DATETIME NULL,
`IsTemporary` TINYINT NOT NULL DEFAULT 0,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
KEY `idx_user_biz_perm_user` (`UserId`, `BizType`),
KEY `idx_user_biz_perm_biz` (`BizType`, `BizId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户业务维度权限';
-- ---------------------------------------------------------------------------
-- 5. 密级
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `role_secret_perm` (
`Id` CHAR(36) NOT NULL,
`RoleId` CHAR(36) NOT NULL,
`SecretLevel` TINYINT NOT NULL COMMENT '1公开 2内部 3机密 4绝密',
`DataResourceCode` VARCHAR(32) NULL,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
KEY `idx_role_secret_perm_role` (`RoleId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色密级权限';
CREATE TABLE IF NOT EXISTS `user_secret_perm` (
`Id` CHAR(36) NOT NULL,
`UserId` CHAR(36) NOT NULL,
`SecretLevel` TINYINT NOT NULL,
`DataResourceCode` VARCHAR(32) NULL,
`EffectiveTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ExpireTime` DATETIME NULL,
`IsTemporary` TINYINT NOT NULL DEFAULT 0,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
KEY `idx_user_secret_perm_user` (`UserId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户密级权限';
-- ---------------------------------------------------------------------------
-- 6. 自定义过滤规则(JSON AST,禁止存 SQL)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `role_filter_rule` (
`Id` CHAR(36) NOT NULL,
`RoleId` CHAR(36) NOT NULL,
`DataResourceCode` VARCHAR(32) NOT NULL,
`FilterContent` JSON NOT NULL COMMENT '过滤条件 AST',
`FilterHash` CHAR(64) NOT NULL COMMENT 'SHA256(FilterContent)',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_role_filter_rule` (`RoleId`, `DataResourceCode`, `IsDeleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色自定义过滤';
CREATE TABLE IF NOT EXISTS `user_filter_rule` (
`Id` CHAR(36) NOT NULL,
`UserId` CHAR(36) NOT NULL,
`DataResourceCode` VARCHAR(32) NOT NULL,
`FilterContent` JSON NOT NULL,
`FilterHash` CHAR(64) NOT NULL,
`EffectiveTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ExpireTime` DATETIME NULL,
`IsTemporary` TINYINT NOT NULL DEFAULT 0,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_user_filter_rule` (`UserId`, `DataResourceCode`, `IsDeleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户自定义过滤';
-- ---------------------------------------------------------------------------
-- 7. 数据资源注册(模块接入清单)
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `data_resource` (
`Id` CHAR(36) NOT NULL,
`Code` VARCHAR(32) NOT NULL COMMENT 'Order/Customer/Recharge/ChannelProduct/Xhs',
`Name` VARCHAR(64) NOT NULL,
`Description` VARCHAR(256) NULL,
`MainTable` VARCHAR(64) NULL COMMENT '主表名,如 t_order',
`OrgField` VARCHAR(64) NULL COMMENT '组织字段名',
`OwnerField` VARCHAR(64) NULL COMMENT '负责人字段名',
`SecretLevelField` VARCHAR(64) NULL DEFAULT 'SecretLevel',
`IsEnabled` TINYINT NOT NULL DEFAULT 1,
`SortOrder` INT NOT NULL DEFAULT 0,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_data_resource_code` (`Code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据权限资源注册';
-- ---------------------------------------------------------------------------
-- 8. 字段脱敏配置
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `data_perm_field_mask` (
`Id` CHAR(36) NOT NULL,
`DataResourceCode` VARCHAR(32) NOT NULL,
`FieldName` VARCHAR(64) NOT NULL COMMENT 'DTO/表字段名',
`SecretLevel` TINYINT NOT NULL COMMENT '达到此密级才脱敏',
`MaskType` VARCHAR(32) NOT NULL DEFAULT 'partial' COMMENT 'partial/full/hide',
`MaskPattern` VARCHAR(128) NULL COMMENT '如 phone: 3,4 保留首尾',
`IsEnabled` TINYINT NOT NULL DEFAULT 1,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_field_mask` (`DataResourceCode`, `FieldName`, `IsDeleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字段级脱敏配置';
-- ---------------------------------------------------------------------------
-- 9. 权限模板
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `data_perm_template` (
`Id` CHAR(36) NOT NULL,
`Name` VARCHAR(64) NOT NULL,
`Code` VARCHAR(32) NOT NULL COMMENT '模板编码,如 SalesStaff',
`Description` VARCHAR(256) NULL,
`RoleCode` VARCHAR(64) NULL COMMENT '可选绑定 RBAC role.Code,分配角色时自动套用',
`IsBuiltIn` TINYINT NOT NULL DEFAULT 0 COMMENT '内置模板不可删',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_data_perm_template_code` (`Code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据权限模板';
CREATE TABLE IF NOT EXISTS `data_perm_template_item` (
`Id` CHAR(36) NOT NULL,
`TemplateId` CHAR(36) NOT NULL,
`DimensionType` VARCHAR(32) NOT NULL COMMENT 'org/data_scope/biz/secret/filter',
`ItemContent` JSON NOT NULL COMMENT '维度配置 JSON',
`SortOrder` INT NOT NULL DEFAULT 0,
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (`Id`),
KEY `idx_template_item_tpl` (`TemplateId`, `DimensionType`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据权限模板明细';
-- ---------------------------------------------------------------------------
-- 10. 审计
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `data_perm_change_log` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`TargetType` VARCHAR(16) NOT NULL COMMENT 'user/role/template',
`TargetId` CHAR(36) NOT NULL,
`Action` VARCHAR(16) NOT NULL COMMENT 'create/update/delete/apply_template',
`BeforeJson` JSON NULL,
`AfterJson` JSON NULL,
`OperatorUserId` CHAR(36) NOT NULL COMMENT '操作人 user.Id',
`OperatorMapId` INT NULL COMMENT '操作人 mapId',
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
KEY `idx_perm_change_target` (`TargetType`, `TargetId`, `CreateTime`),
KEY `idx_perm_change_operator` (`OperatorUserId`, `CreateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据权限配置变更日志';
CREATE TABLE IF NOT EXISTS `data_perm_access_log` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`UserId` CHAR(36) NOT NULL,
`MapId` INT NULL,
`DataResourceCode` VARCHAR(32) NOT NULL,
`ApiPath` VARCHAR(256) NOT NULL,
`HttpMethod` VARCHAR(8) NOT NULL DEFAULT 'GET',
`AppliedScopeJson` JSON NULL COMMENT '生效五维快照',
`RowCount` INT NULL COMMENT '返回行数',
`ElapsedMs` INT NULL,
`ClientIp` VARCHAR(64) NULL,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`),
KEY `idx_perm_access_user_time` (`UserId`, `CreateTime`),
KEY `idx_perm_access_resource` (`DataResourceCode`, `CreateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据权限访问审计(可采样)';
-- ---------------------------------------------------------------------------
-- 11. 种子:数据资源注册
-- ---------------------------------------------------------------------------
INSERT INTO `data_resource` (`Id`, `Code`, `Name`, `Description`, `MainTable`, `OrgField`, `OwnerField`, `SortOrder`) VALUES
('da300001-0000-4000-8000-000000000001', 'Order', '订单', '运营后台订单查询', 't_order', 'OrganizationId', 'CreateUserId', 10),
('da300001-0000-4000-8000-000000000002', 'Customer', '客户', '客户资料列表', 't_customer', 'OrganizationId', 'Salesman', 20),
('da300001-0000-4000-8000-000000000003', 'Recharge', '充值', '充值审核列表', 't_recharge_record', NULL, 'CreateUserId', 30),
('da300001-0000-4000-8000-000000000004', 'ChannelProduct', '销售产品', '渠道产品配置', 't_sales_product', NULL, NULL, 40),
('da300001-0000-4000-8000-000000000005', 'Xhs', '小红书', '小红书模块', NULL, NULL, NULL, 50)
ON DUPLICATE KEY UPDATE
`Name` = VALUES(`Name`),
`Description` = VALUES(`Description`),
`MainTable` = VALUES(`MainTable`),
`OrgField` = VALUES(`OrgField`),
`OwnerField` = VALUES(`OwnerField`);
-- ---------------------------------------------------------------------------
-- 12. 种子:内置权限模板(明细需按环境组织 Id 调整后再 apply)
-- ---------------------------------------------------------------------------
INSERT INTO `data_perm_template` (`Id`, `Name`, `Code`, `Description`, `RoleCode`, `IsBuiltIn`, `CreateUserId`, `CreateTime`) VALUES
('da000001-0000-4000-8000-000000000001', '普通销售', 'SalesStaff', '个人级+指定产品线+密级1-2', NULL, 1, 0, NOW()),
('da000001-0000-4000-8000-000000000002', '销售主管', 'SalesSupervisor', '部门级+全部产品线+密级1-3', NULL, 1, 0, NOW()),
('da000001-0000-4000-8000-000000000003', '分公司经理', 'BranchManager', '组织树级+密级1-3', NULL, 1, 0, NOW()),
('da000001-0000-4000-8000-000000000004', '总部产品经理', 'ProductManager', '全局级+单产品线+密级1-2', NULL, 1, 0, NOW()),
('da000001-0000-4000-8000-000000000005', '财务专员', 'FinanceStaff', '组织树级+密级含3-4', NULL, 1, 0, NOW()),
('da000001-0000-4000-8000-000000000006', '客服专员', 'CsStaff', '个人级+密级1-2', NULL, 1, 0, NOW())
ON DUPLICATE KEY UPDATE
`Name` = VALUES(`Name`),
`Description` = VALUES(`Description`);
INSERT INTO `data_perm_template_item` (`Id`, `TemplateId`, `DimensionType`, `ItemContent`, `SortOrder`) VALUES
-- 普通销售
('da200001-0000-4000-8000-000000000011', 'da000001-0000-4000-8000-000000000001', 'data_scope', '{"dataScope":1,"dataResourceCode":null}', 1),
('da200001-0000-4000-8000-000000000012', 'da000001-0000-4000-8000-000000000001', 'secret', '{"secretLevels":[1,2]}', 2),
-- 销售主管
('da200001-0000-4000-8000-000000000021', 'da000001-0000-4000-8000-000000000002', 'data_scope', '{"dataScope":3,"dataResourceCode":null}', 1),
('da200001-0000-4000-8000-000000000022', 'da000001-0000-4000-8000-000000000002', 'secret', '{"secretLevels":[1,2,3]}', 2),
-- 分公司经理
('da200001-0000-4000-8000-000000000031', 'da000001-0000-4000-8000-000000000003', 'data_scope', '{"dataScope":4,"dataResourceCode":null}', 1),
('da200001-0000-4000-8000-000000000032', 'da000001-0000-4000-8000-000000000003', 'secret', '{"secretLevels":[1,2,3]}', 2),
-- 总部产品经理
('da200001-0000-4000-8000-000000000041', 'da000001-0000-4000-8000-000000000004', 'data_scope', '{"dataScope":5,"dataResourceCode":null}', 1),
('da200001-0000-4000-8000-000000000042', 'da000001-0000-4000-8000-000000000004', 'secret', '{"secretLevels":[1,2]}', 2),
-- 财务专员
('da200001-0000-4000-8000-000000000051', 'da000001-0000-4000-8000-000000000005', 'data_scope', '{"dataScope":4,"dataResourceCode":null}', 1),
('da200001-0000-4000-8000-000000000052', 'da000001-0000-4000-8000-000000000005', 'secret', '{"secretLevels":[1,2,3,4]}', 2),
-- 客服专员
('da200001-0000-4000-8000-000000000061', 'da000001-0000-4000-8000-000000000006', 'data_scope', '{"dataScope":1,"dataResourceCode":null}', 1),
('da200001-0000-4000-8000-000000000062', 'da000001-0000-4000-8000-000000000006', 'secret', '{"secretLevels":[1,2]}', 2)
ON DUPLICATE KEY UPDATE
`ItemContent` = VALUES(`ItemContent`),
`SortOrder` = VALUES(`SortOrder`);
-- ---------------------------------------------------------------------------
-- 13. 种子:字段脱敏(Customer / Order)
-- ---------------------------------------------------------------------------
INSERT INTO `data_perm_field_mask` (`Id`, `DataResourceCode`, `FieldName`, `SecretLevel`, `MaskType`, `MaskPattern`) VALUES
('fa000001-0000-4000-8000-000000000001', 'Customer', 'Phone', 4, 'partial', 'phone'),
('fa000001-0000-4000-8000-000000000002', 'Customer', 'Email', 4, 'partial', 'email'),
('fa000001-0000-4000-8000-000000000003', 'Customer', 'Password', 1, 'hide', NULL),
('fa000001-0000-4000-8000-000000000004', 'Order', 'PayableAmount', 3, 'hide', NULL),
('fa000001-0000-4000-8000-000000000005', 'Order', 'CostAmount', 3, 'hide', NULL),
('fa000001-0000-4000-8000-000000000006', 'Order', 'ProfitAmount', 4, 'hide', NULL)
ON DUPLICATE KEY UPDATE
`SecretLevel` = VALUES(`SecretLevel`),
`MaskType` = VALUES(`MaskType`);