多租户的后台管理系统框架涉及到在不同租户之间隔离数据(字段隔离)------------升鲜宝供应链管理系统NestJs版本(一)
在多租户系统中,为了区分平台级用户和租户级用户,我们通常会使用一个特定的租户ID来表示平台级用户和角色。这种设计确保了平台级用户和角色能够被正确识别和管理,而不会与任何具体租户的用户和角色混淆。
设计方案
1. **特定租户ID**:使用一个特定的租户ID(例如,`0` 或 `1`)来表示平台级用户和角色。这样可以明确区分平台级用户和租户级用户。
2. **数据库字段**:在`ns_user`和`ns_role`表中使用这个特定的租户ID来标识平台级用户和角色。 添加注释以说明特定的租户ID用于平台级用户。 -
-- 创建语言表 CREATE TABLE `ns_languages` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `code` VARCHAR(10) NOT NULL COMMENT '语言代码(如 en, zh, fr)', `name` VARCHAR(100) NOT NULL COMMENT '语言名称(如 English, 中文, Français)', `enabled` BOOLEAN DEFAULT TRUE COMMENT '是否启用', `sort_code` INT COMMENT '排序码', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', `remark` TEXT COMMENT '备注' ) ENGINE=InnoDB COMMENT='语言表,存储系统支持的语言列表'; -- 创建翻译表 CREATE TABLE `ns_translations` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `language_id` INT NOT NULL COMMENT '语言ID', `translation_key` VARCHAR(255) NOT NULL COMMENT '翻译键', `translation_value` TEXT COMMENT '翻译值', `sort_code` INT COMMENT '排序码', `enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)', `remark` TEXT COMMENT '备注', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`language_id`) REFERENCES `ns_languages` (`id`) ) ENGINE=InnoDB COMMENT='翻译表,存储对应各语言的界面元素的翻译'; -- 创建租户表 CREATE TABLE `ns_tenant` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `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', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', `language_id` INT DEFAULT 1 COMMENT '默认语言ID', FOREIGN KEY (`language_id`) REFERENCES `ns_languages` (`id`) ) ENGINE=InnoDB COMMENT='租户表,存储租户基本信息'; -- 创建用户表 CREATE TABLE `ns_user` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL COMMENT '用户名', `email` VARCHAR(255) UNIQUE COMMENT '邮箱', `password` VARCHAR(255) COMMENT '密码', `tenant_id` BIGINT NOT NULL COMMENT '租户ID', `language_id` INT DEFAULT 1 COMMENT '默认语言ID', `sort_code` INT COMMENT '排序码', `enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)', `remark` TEXT COMMENT '备注', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`), FOREIGN KEY (`language_id`) REFERENCES `ns_languages` (`id`) ) ENGINE=InnoDB COMMENT='用户表,存储租户内用户的信息,平台用户使用特定租户ID'; -- 创建用户角色关系表 CREATE TABLE `ns_user_role` ( `user_id` BIGINT NOT NULL COMMENT '用户ID', `role_id` BIGINT NOT NULL COMMENT '角色ID', `sort_code` INT COMMENT '排序码', `enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)', `remark` TEXT COMMENT '备注', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', PRIMARY KEY (`user_id`, `role_id`), FOREIGN KEY (`user_id`) REFERENCES `ns_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`role_id`) REFERENCES `ns_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB COMMENT='用户角色关系表,用于存储用户和角色之间的多对多关系'; -- 创建角色表 CREATE TABLE `ns_role` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL COMMENT '角色名称', `description` TEXT COMMENT '角色描述', `role_type` VARCHAR(50) COMMENT '角色类型(如 platform_admin, tenant_admin)', `tenant_id` BIGINT COMMENT '租户ID', `sort_code` INT COMMENT '排序码', `enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)', `remark` TEXT COMMENT '备注', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`) ) ENGINE=InnoDB COMMENT='角色表,定义租户内不同的角色和它们的基本信息,平台角色使用特定租户ID'; -- 创建权限表 CREATE TABLE `ns_permission` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `tenant_id` BIGINT NOT NULL 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', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`) ) ENGINE=InnoDB COMMENT='权限表,定义系统内的权限和它们的作用范围'; -- 创建组织机构表 CREATE TABLE `ns_org` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `tenant_id` BIGINT NOT NULL 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', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`), FOREIGN KEY (`parent_id`) REFERENCES `ns_org` (`id`) ) ENGINE=InnoDB COMMENT='组织机构表,用于管理租户内的组织结构,如部门或团队'; -- 创建菜单表 CREATE TABLE `ns_menu` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `tenant_id` BIGINT NOT NULL COMMENT '租户ID', `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', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`), FOREIGN KEY (`parent_id`) REFERENCES `ns_menu` (`id`) ) ENGINE=InnoDB COMMENT='菜单表,存储系统菜单项,通常用于构建用户界面的导航系统'; -- 创建套餐表 CREATE TABLE `ns_package` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `tenant_id` BIGINT NOT NULL COMMENT '租户ID', `name` VARCHAR(255) NOT NULL COMMENT '套餐名称', `description` TEXT COMMENT '套餐描述', `price` DECIMAL(10, 2) COMMENT '价格', `duration` INT COMMENT '持续时间(天)', `user_limit` INT COMMENT '用户人数限制', `sort_code` INT COMMENT '排序码', `enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)', `remark` TEXT COMMENT '备注', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`tenant_id`) REFERENCES `ns_tenant` (`id`) ) ENGINE=InnoDB COMMENT='套餐表,描述各种套餐的详细信息'; -- 创建套餐权限表 CREATE TABLE `ns_package_permission` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `package_id` BIGINT NOT NULL COMMENT '套餐ID', `permission_id` BIGINT NOT NULL COMMENT '权限ID', `sort_code` INT COMMENT '排序码', `enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)', `remark` TEXT COMMENT '备注', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`package_id`) REFERENCES `ns_package` (`id`), FOREIGN KEY (`permission_id`) REFERENCES `ns_permission` (`id`) ) ENGINE=InnoDB COMMENT='套餐权限表,定义套餐与权限之间的关系,管理套餐所包含的权限'; -- 创建角色套餐关系表 CREATE TABLE `ns_role_package` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `role_id` BIGINT NOT NULL COMMENT '角色ID', `package_id` BIGINT NOT NULL COMMENT '套餐ID', `sort_code` INT COMMENT '排序码', `enabled` INT DEFAULT 1 COMMENT '状态 (0 禁用, 1 启用)', `remark` TEXT COMMENT '备注', `created_by` BIGINT COMMENT '创建人ID', `modified_by` BIGINT COMMENT '修改人ID', `delete_flag` BOOLEAN DEFAULT FALSE COMMENT '是否删除', `created_date` DATETIME COMMENT '创建时间', `modified_date` DATETIME COMMENT '修改时间', FOREIGN KEY (`role_id`) REFERENCES `ns_role` (`id`), FOREIGN KEY (`package_id`) REFERENCES `ns_package` (`id`) ) ENGINE=InnoDB COMMENT='角色套餐关系表,管理角色与套餐之间的关系';