多租戶的後臺管理系統框架涉及到在不同租戶之間隔離資料(欄位隔離)------------升鮮寶供應鏈管理系統NestJs版本(一)

生鲜配送供应链系统發表於2024-06-19

在多租戶系統中,為了區分平臺級使用者和租戶級使用者,我們通常會使用一個特定的租戶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='角色套餐關係表,管理角色與套餐之間的關係';
 

  

相關文章