多租户的后台管理系统框架涉及到在不同租户之间隔离数据(字段隔离)------------升鲜宝供应链管理系统NestJs版本(一)
cnblogs 2024-06-19 08:09:00 阅读 94
在多租户系统中,为了区分平台级用户和租户级用户,我们通常会使用一个特定的租户ID来表示平台级用户和角色。这种设计确保了平台级用户和角色能够被正确识别和管理,而不会与任何具体租户的用户和角色混淆。
### 设计方案
1. **特定租户ID**:使用一个特定的租户ID(例如,`0` 或 `1`)来表示平台级用户和角色。这样可以明确区分平台级用户和租户级用户。
2. **数据库字段**:在`ns_user`和`ns_role`表中使用这个特定的租户ID来标识平台级用户和角色。
### 修改数据字典
#### **1. ns_tenant (租户表)**
无需修改,继续存储租户的基本信息。
#### **2. ns_user (用户表)**
添加注释以说明特定的租户ID用于平台级用户。
```sql
CREATE TABLE `ns_user` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID,外键。平台用户使用特定租户ID,如0',
`name` VARCHAR(255) NOT NULL COMMENT '用户名',
`email` VARCHAR(255) UNIQUE COMMENT '邮箱',
`password` VARCHAR(255) COMMENT '密码',
`role_id` BIGINT COMMENT '角色ID,外键',
`sort_code` INT COMMENT '排序码',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`),
FOREIGN KEY (`role_id`) REFERENCES `ns_role` (`id`)
) COMMENT='用户表,存储租户内用户的信息,平台用户使用特定租户ID';
```
#### **3. ns_role (角色表)**
添加注释以说明特定的租户ID用于平台级角色。
```sql
CREATE TABLE `ns_role` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID,外键。平台角色使用特定租户ID,如0',
`name` VARCHAR(255) NOT NULL COMMENT '角色名称',
`description` TEXT COMMENT '角色描述',
`role_type` VARCHAR(50) COMMENT '角色类型(如 platform_admin, tenant_admin)',
`sort_code` INT COMMENT '排序码',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`)
) COMMENT='角色表,定义租户内不同的角色和它们的基本信息,平台角色使用特定租户ID';
```
### 完整的 SQL 语句
结合以上调整,以下是完整的SQL创建语句:
```sql
-- 创建租户表
CREATE TABLE `ns_tenant` (
`id` BIGINT AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL COMMENT '租户名称',
`description` TEXT COMMENT '租户描述',
`sort_code` INT COMMENT '排序码',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`)
) COMMENT='租户表,存储租户基本信息';
-- 创建用户表
CREATE TABLE `ns_user` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID,外键。平台用户使用特定租户ID,如0',
`name` VARCHAR(255) NOT NULL COMMENT '用户名',
`email` VARCHAR(255) UNIQUE COMMENT '邮箱',
`password` VARCHAR(255) COMMENT '密码',
`role_id` BIGINT COMMENT '角色ID,外键',
`sort_code` INT COMMENT '排序码',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`),
FOREIGN KEY (`role_id`) REFERENCES `ns_role` (`id`)
) COMMENT='用户表,存储租户内用户的信息,平台用户使用特定租户ID';
-- 创建角色表
CREATE TABLE `ns_role` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID,外键。平台角色使用特定租户ID,如0',
`name` VARCHAR(255) NOT NULL COMMENT '角色名称',
`description` TEXT COMMENT '角色描述',
`role_type` VARCHAR(50) COMMENT '角色类型(如 platform_admin, tenant_admin)',
`sort_code` INT COMMENT '排序码',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`)
) COMMENT='角色表,定义租户内不同的角色和它们的基本信息,平台角色使用特定租户ID';
-- 创建权限表
CREATE TABLE `ns_permission` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID,外键',
`name` VARCHAR(255) NOT NULL COMMENT '权限名称',
`description` TEXT COMMENT '权限描述',
`resource_type` VARCHAR(50) COMMENT '资源类型(如 button, menu, column)',
`resource_name` VARCHAR(255) COMMENT '资源名称',
`action` VARCHAR(50) COMMENT '允许的操作(如 read, write)',
`sort_code` INT COMMENT '排序码',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`)
) COMMENT='权限表,定义系统内的权限和它们的作用范围';
-- 创建组织机构表
CREATE TABLE `ns_org` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID,外键',
`name` VARCHAR(255) NOT NULL COMMENT '组织名称',
`description` TEXT COMMENT '组织描述',
`parent_id` BIGINT COMMENT '父组织ID',
`sort_code` INT COMMENT '排序码',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`),
FOREIGN KEY (`parent_id`) REFERENCES `ns_org` (`id`)
) COMMENT='组织机构表,用于管理租户内的组织结构,如部门或团队';
-- 创建菜单表
CREATE TABLE `ns_menu` (
`id` BIGINT AUTO_INCREMENT,
`parent_id` BIGINT COMMENT '父菜单ID,用于创建菜单层级',
`title` VARCHAR(255) NOT NULL COMMENT '菜单标题',
`path` VARCHAR(255)
COMMENT '菜单对应的路径',
`icon` VARCHAR(100) COMMENT '菜单项图标',
`sort_order` INT COMMENT '菜单排序',
`enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)',
`remark` TEXT COMMENT '备注',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`parent_id`) REFERENCES `ns_menu` (`id`)
) COMMENT='菜单表,存储系统菜单项,通常用于构建用户界面的导航系统';
-- 创建角色菜单表
CREATE TABLE `ns_role_menu` (
`id` BIGINT AUTO_INCREMENT,
`role_id` BIGINT COMMENT '角色ID',
`menu_id` BIGINT COMMENT '菜单ID',
`permission` VARCHAR(50) COMMENT '对该菜单的具体权限(如查看、编辑)',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`role_id`) REFERENCES `ns_role` (`id`),
FOREIGN KEY (`menu_id`) REFERENCES `ns_menu` (`id`)
) COMMENT='角色菜单表,定义角色和菜单之间的关系,控制不同角色可访问的菜单项';
-- 创建角色机构权限范围表
CREATE TABLE `ns_role_org_permission` (
`id` BIGINT AUTO_INCREMENT,
`role_id` BIGINT COMMENT '角色ID',
`org_id` BIGINT COMMENT '组织机构ID',
`permission` VARCHAR(50) COMMENT '权限类型(如读、写)',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`role_id`) REFERENCES `ns_role` (`id`),
FOREIGN KEY (`org_id`) REFERENCES `ns_org` (`id`)
) COMMENT='角色机构权限范围表,定义角色在不同组织结构中的数据访问权限';
-- 创建角色数据列权限表
CREATE TABLE `ns_role_column_permission` (
`id` BIGINT AUTO_INCREMENT,
`role_id` BIGINT COMMENT '角色ID',
`table_name` VARCHAR(255) COMMENT '数据表名称',
`column_name` VARCHAR(255) COMMENT '列名称',
`permission_type` VARCHAR(50) COMMENT '权限类型(如读、写)',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`role_id`) REFERENCES `ns_role` (`id`)
) COMMENT='角色数据列权限表,管理角色对不同数据表列的访问权限';
-- 创建支付明细费用表
CREATE TABLE `ns_payment_detail` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID',
`package_id` BIGINT COMMENT '套餐ID',
`subscription_id` BIGINT COMMENT '订阅ID,关联`ns_tenant_package_subscription`表',
`amount` DECIMAL(10, 2) COMMENT '支付金额',
`payment_method` VARCHAR(255) COMMENT '支付方式(如信用卡、PayPal、转账等)',
`payment_status` VARCHAR(50) COMMENT '支付状态(如`pending`, `completed`, `failed`)',
`transaction_id` VARCHAR(255) COMMENT '交易流水号',
`payment_date` DATETIME COMMENT '支付日期',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`),
FOREIGN KEY (`package_id`) REFERENCES `ns_package` (`id`),
FOREIGN KEY (`subscription_id`) REFERENCES `ns_tenant_package_subscription` (`id`)
) COMMENT='支付明细费用表,用于记录租户订购套餐时的支付明细';
-- 创建租户套餐订阅表
CREATE TABLE `ns_tenant_package_subscription` (
`id` BIGINT AUTO_INCREMENT,
`tenant_id` BIGINT COMMENT '租户ID',
`package_id` BIGINT COMMENT '套餐ID',
`subscription_date` DATE COMMENT '订阅日期',
`expiration_date` DATE COMMENT '到期日期',
`status` VARCHAR(50) COMMENT '状态(如激活、过期)',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`created_date` DATETIME COMMENT '创建时间',
`updated_date` DATETIME COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`),
FOREIGN KEY (`package_id`) REFERENCES `ns_package` (`id`)
) COMMENT='租户套餐订阅表,管理租户订阅套餐的详情';
```
在上述设计中:
- `tenant_id`字段为`0`时表示平台级用户和角色。
- 普通租户用户和角色使用具体的`tenant_id`来标识其所属的租户。
这种设计确保了平台级用户和角色能够被正确识别和管理,不会与任何具体租户的用户和角色混淆。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。