From f514818e5d9349337358ac0244ca048a7d1a46d9 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Wed, 26 Jun 2024 10:30:53 +0800 Subject: [PATCH] fix: multi-tenant phase 2 --- database/install/kpi_report.sql | 2 +- database/install/sys_log_operate.sql | 2 +- database/install/sys_role_menu.sql | 4 +-- database/install/sys_tenant.sql | 2 +- database/upgrade/upg_kpi_report.sql | 3 +- database/upgrade/upg_sys_log_operate.sql | 3 +- database/upgrade/upg_sys_tenant.sql | 5 +-- database/upgrade/upg_sys_user.sql | 2 +- features/pm/performance.go | 8 ++--- misc/importdb.sh | 2 +- .../middleware/collectlogs/operate_log.go | 1 + .../repository/udm_sub.impl.go | 14 +++++--- src/modules/system/controller/sys_tenant.go | 4 +-- src/modules/system/model/sys_log_operate.go | 3 +- .../system/repository/sys_log_operate.impl.go | 32 +++++++++++++------ .../system/repository/sys_tenant.impl.go | 6 ++-- 16 files changed, 56 insertions(+), 37 deletions(-) diff --git a/database/install/kpi_report.sql b/database/install/kpi_report.sql index e8fc7fa9..5db57c95 100644 --- a/database/install/kpi_report.sql +++ b/database/install/kpi_report.sql @@ -33,7 +33,7 @@ CREATE TABLE `kpi_report` ( `granularity` tinyint(4) NULL DEFAULT 60 COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL, `created_at` bigint(20) NULL DEFAULT NULL, - `tenant_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `tenant_id` varchar(32) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, INDEX `idx_timestamp`(`created_at`) USING BTREE, INDEX `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE diff --git a/database/install/sys_log_operate.sql b/database/install/sys_log_operate.sql index 59527e6f..240de2ad 100644 --- a/database/install/sys_log_operate.sql +++ b/database/install/sys_log_operate.sql @@ -38,7 +38,7 @@ CREATE TABLE `sys_log_operate` ( `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '操作状态(0异常 1正常)', `oper_time` bigint(20) NULL DEFAULT 0 COMMENT '操作时间', `cost_time` bigint(20) NULL DEFAULT 0 COMMENT '消耗时间(毫秒)', - `tenant_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `tenant_id` varchar(32) NULL DEFAULT NULL COMMENT 'Tenant ID refer to sys_tenant', PRIMARY KEY (`oper_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 30 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统操作日志表' ROW_FORMAT = Dynamic; diff --git a/database/install/sys_role_menu.sql b/database/install/sys_role_menu.sql index ed7dad14..747b61ae 100644 --- a/database/install/sys_role_menu.sql +++ b/database/install/sys_role_menu.sql @@ -284,9 +284,9 @@ INSERT INTO `sys_role_menu` VALUES (5, 2082); INSERT INTO `sys_role_menu` VALUES (5, 2087); INSERT INTO `sys_role_menu` VALUES (5, 2131); INSERT INTO `sys_role_menu` VALUES (5, 2132); -INSERT INTO `sys_role_menu` VALUES (100, 2153); -INSERT INTO `sys_role_menu` VALUES (100, 2154); +INSERT INTO `sys_role_menu` VALUES (100, 2155); INSERT INTO `sys_role_menu` VALUES (100, 2156); +INSERT INTO `sys_role_menu` VALUES (100, 2157); INSERT INTO `sys_role_menu` VALUES (100, 2158); INSERT INTO `sys_role_menu` VALUES (100, 2159); INSERT INTO `sys_role_menu` VALUES (100, 2160); diff --git a/database/install/sys_tenant.sql b/database/install/sys_tenant.sql index dcedba41..ee35aca8 100644 --- a/database/install/sys_tenant.sql +++ b/database/install/sys_tenant.sql @@ -41,6 +41,6 @@ CREATE TABLE `sys_tenant` ( -- ---------------------------- -- Records of sys_tenant -- ---------------------------- -INSERT INTO `sys_tenant` VALUES (1, 0, '0', 'TenantRoot', 0, '', '', '1', '0', 'admin', 1699348237468, '', 1718783333041); +-- INSERT INTO `sys_tenant` VALUES (1, 0, '0', 'TenantRoot', 0, '', '', '1', '0', 'admin', 1699348237468, '', 1718783333041); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_kpi_report.sql b/database/upgrade/upg_kpi_report.sql index 121ac5d3..b59323e8 100644 --- a/database/upgrade/upg_kpi_report.sql +++ b/database/upgrade/upg_kpi_report.sql @@ -37,8 +37,7 @@ CREATE TABLE IF NOT EXISTS `kpi_report` ( INDEX `idx_uid_datetime`(`rm_uid`, `date`, `start_time`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 10660 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -ALTER TABLE `kpi_report` -ADD COLUMN IF NOT EXISTS `tenant_name` varchar(128) NULL AFTER `created_at`; +ALTER TABLE `kpi_report` ADD COLUMN IF NOT EXISTS `tenant_id` varchar(32) NULL DEFAULT NULL AFTER `created_at`; ALTER TABLE `kpi_report` ADD INDEX IF NOT EXISTS `idx_timestamp`(`created_at`) USING BTREE, diff --git a/database/upgrade/upg_sys_log_operate.sql b/database/upgrade/upg_sys_log_operate.sql index 23a7d7ca..3073bcb1 100644 --- a/database/upgrade/upg_sys_log_operate.sql +++ b/database/upgrade/upg_sys_log_operate.sql @@ -30,5 +30,6 @@ CREATE TABLE IF NOT EXISTS `sys_log_operate` ( PRIMARY KEY (`oper_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统操作日志表'; -ALTER TABLE `sys_log_operate` ADD COLUMN IF NOT EXISTS `tenant_name` varchar(128) NULL AFTER `cost_time`; +ALTER TABLE `sys_log_operate` ADD COLUMN IF NOT EXISTS `tenant_id` varchar(32) NULL DEFAULT NULL AFTER `cost_time`; + diff --git a/database/upgrade/upg_sys_tenant.sql b/database/upgrade/upg_sys_tenant.sql index 8398efe0..1c3d57e4 100644 --- a/database/upgrade/upg_sys_tenant.sql +++ b/database/upgrade/upg_sys_tenant.sql @@ -37,12 +37,9 @@ CREATE TABLE IF NOT EXISTS `sys_tenant` ( PRIMARY KEY (`tenant_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic; --- alert table -ALTER TABLE `tenants_db`.`sys_tenant` DROP INDEX IF EXISTS `uni_idx_tenant_name`; - -- ---------------------------- -- Records of sys_tenant -- ---------------------------- -INSERT IGNORE INTO `sys_tenant` VALUES (1, 0, '0', 'TenantRoot', 0, '', '', '1', '0', 'admin', 1699348237468, 'supervisor', 1718783333041); +-- INSERT IGNORE INTO `sys_tenant` VALUES (1, 0, '0', 'TenantRoot', 0, '', '', '1', '0', 'admin', 1699348237468, 'supervisor', 1718783333041); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_sys_user.sql b/database/upgrade/upg_sys_user.sql index a9f07968..c5513a69 100644 --- a/database/upgrade/upg_sys_user.sql +++ b/database/upgrade/upg_sys_user.sql @@ -39,6 +39,6 @@ ALTER TABLE `sys_user` MODIFY COLUMN `phonenumber` varchar(16) CHARACTER SET utf ALTER TABLE `sys_user` MODIFY COLUMN `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注' AFTER `update_time`; -- multi-tenancy -ALTER TABLE `tenants_db`.`sys_user` ADD COLUMN IF NOT EXISTS `tenant_id` bigint(20) NULL DEFAULT NULL COMMENT 'Tenant ID' AFTER `dept_id`; +ALTER TABLE `sys_user` ADD COLUMN IF NOT EXISTS `tenant_id` bigint(20) NULL DEFAULT NULL DEFAULT NULL COMMENT 'Tenant ID' AFTER `dept_id`; SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file diff --git a/features/pm/performance.go b/features/pm/performance.go index 54ddc728..c51a9690 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -76,8 +76,8 @@ type KpiData struct { Granularity int8 `json:"granularity" xorm:"granularity"` KPIValues []KPIVal `json:"kpiValues" xorm:"json 'kpi_values'"` //CreatedAt int64 `json:"createdAt" xorm:"created 'created_at'"` - CreatedAt int64 `json:"createdAt" xorm:"'created_at'"` - TenantName string `json:"tenantName" xorm:"tenant_name"` + CreatedAt int64 `json:"createdAt" xorm:"'created_at'"` + TenantID string `json:"tenantId" xorm:"tenant_id"` } type KPIVal struct { KPIID string `json:"kpi_id" xorm:"kpi_id"` @@ -259,8 +259,8 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) { } // set tenant_name if exist - where := fmt.Sprintf("status='1' and tenant_id=(select parent_id from sys_tenant where status='1' and tenancy_type='UPF' and tenancy_key='%s')", kpiData.RmUid) - kpiData.TenantName, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "tenant_name", where) + where := fmt.Sprintf("status='1' and tenancy_type='UPF' and tenancy_key='%s'", kpiData.RmUid) + kpiData.TenantID, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "parent_id", where) // insert kpi_report table, no session tableName := "kpi_report_" + strings.ToLower(kpiReport.Task.NE.NeType) affected, err := xEngine.Table(tableName).Insert(kpiData) diff --git a/misc/importdb.sh b/misc/importdb.sh index e3a6ca3b..23f10654 100644 --- a/misc/importdb.sh +++ b/misc/importdb.sh @@ -131,7 +131,7 @@ for ne_type in ${ne_types}; do if [ $? = 0 ]; then echo "done" fi - SQL="ALTER TABLE ${TABLE_NAME} ADD COLUMN IF NOT EXISTS `tenant_name` varchar(128) NULL AFTER `created_at`;" + SQL="ALTER TABLE ${TABLE_NAME} ADD COLUMN IF NOT EXISTS `tenant_id` varchar(32) NULL DEFAULT NULL AFTER `created_at`;" echo -n "Alter table ${TABLE_NAME} ..." mysql -u${USER} -p${PASSWORD} -P ${PORT} --protocol tcp -D ${DBNAME} -e "${SQL}" if [ $? = 0 ]; then diff --git a/src/framework/middleware/collectlogs/operate_log.go b/src/framework/middleware/collectlogs/operate_log.go index 46b02a5e..b4cadc79 100644 --- a/src/framework/middleware/collectlogs/operate_log.go +++ b/src/framework/middleware/collectlogs/operate_log.go @@ -121,6 +121,7 @@ func OperateLog(options Options) gin.HandlerFunc { OperName: loginUser.User.UserName, DeptName: loginUser.User.Dept.DeptName, TenantName: loginUser.User.Tenant.TenantName, + TenantID: loginUser.User.Tenant.TenantID, } if loginUser.User.UserType == "sys" { diff --git a/src/modules/network_element/repository/udm_sub.impl.go b/src/modules/network_element/repository/udm_sub.impl.go index fd293f38..94818908 100644 --- a/src/modules/network_element/repository/udm_sub.impl.go +++ b/src/modules/network_element/repository/udm_sub.impl.go @@ -114,17 +114,21 @@ func (r *UDMSubImpl) SelectPage(query map[string]any) map[string]any { params = append(params, tenantID[0]) } } else if v, ok := query["userName"]; ok && v != "" { - var tenantID []string - err := dborm.DefaultDB().Table("sys_user"). - Where("user_name=?", v).Cols("tenant_id").Distinct().Find(&tenantID) + var tenantID string + _, err := dborm.DefaultDB().Table("sys_user"). + Where("user_name=?", v).Cols("tenant_id").Distinct().Get(&tenantID) if err != nil { log.Errorf("Find tenant_id from sys_user err => %v", err) } log.Tracef("userName=%v, tenantID=%v", v, tenantID) - if len(tenantID) > 0 { + if tenantID != "" { conditions = append(conditions, "s.tenant_id = ?") - params = append(params, tenantID[0]) + params = append(params, tenantID) } + // if len(tenantID) > 0 { + // conditions = append(conditions, "s.tenant_id = ?") + // params = append(params, tenantID[0]) + // } } // 构建查询条件语句 diff --git a/src/modules/system/controller/sys_tenant.go b/src/modules/system/controller/sys_tenant.go index 30d15291..42fdb8e9 100644 --- a/src/modules/system/controller/sys_tenant.go +++ b/src/modules/system/controller/sys_tenant.go @@ -132,7 +132,7 @@ func (s *SysTenantController) Add(c *gin.Context) { } // 检查租户名称唯一 - if body.ParentID == "1" { + if body.ParentID == "0" { uniqueTenantName := s.sysTenantService.CheckUniqueTenantName(body.TenantName, body.ParentID, "") if !uniqueTenantName { // 租户新增【%s】失败,租户名称已存在 @@ -197,7 +197,7 @@ func (s *SysTenantController) Edit(c *gin.Context) { } // 检查租户名称唯一 - if body.ParentID == "1" { + if body.ParentID == "0" { uniqueTenantName := s.sysTenantService.CheckUniqueTenantName(body.TenantName, body.ParentID, body.TenantID) if !uniqueTenantName { // 租户修改【%s】失败,租户名称已存在 diff --git a/src/modules/system/model/sys_log_operate.go b/src/modules/system/model/sys_log_operate.go index 4885e925..9843b741 100644 --- a/src/modules/system/model/sys_log_operate.go +++ b/src/modules/system/model/sys_log_operate.go @@ -34,6 +34,7 @@ type SysLogOperate struct { OperTime int64 `json:"operTime"` // 消耗时间(毫秒) CostTime int64 `json:"costTime"` - // Tenant name refer to tenant_name of sys_tenant + // TenantName and TenantID refer to sys_tenant TenantName string `json:"tenantName"` + TenantID string `json:"tenantId"` } diff --git a/src/modules/system/repository/sys_log_operate.impl.go b/src/modules/system/repository/sys_log_operate.impl.go index 33bb83c1..23873a65 100644 --- a/src/modules/system/repository/sys_log_operate.impl.go +++ b/src/modules/system/repository/sys_log_operate.impl.go @@ -4,6 +4,8 @@ import ( "strings" "time" + dborm "be.ems/lib/core/datasource" + "be.ems/lib/log" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" @@ -14,9 +16,11 @@ import ( // 实例化数据层 SysLogOperateImpl 结构体 var NewSysLogOperateImpl = &SysLogOperateImpl{ selectSql: `select - oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, - oper_url, oper_ip, oper_location, oper_param, oper_msg, status, oper_time, cost_time - from sys_log_operate`, + l.oper_id, l.title, l.business_type, l.method, l.request_method, l.operator_type, l.oper_name, l.dept_name, + l.oper_url, l.oper_ip, l.oper_location, l.oper_param, l.oper_msg, l.status, l.oper_time, l.cost_time, + t.tenant_name + from sys_log_operate l + left join sys_tenant t on t.tenant_id = l.tenant_id`, resultMap: map[string]string{ "oper_id": "OperID", @@ -35,6 +39,7 @@ var NewSysLogOperateImpl = &SysLogOperateImpl{ "status": "Status", "oper_time": "OperTime", "cost_time": "CostTime", + "tenant_name": "TenantName", }, } @@ -100,9 +105,18 @@ func (r *SysLogOperateImpl) SelectSysLogOperatePage(query map[string]any) map[st } // multi-tenancy, only filter user setting tenant_id - if v, ok := query["operName"]; ok && v != "" { - conditions = append(conditions, "oper_name=?") - params = append(params, v) + if v, ok := query["tenantName"]; ok && v != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_tenant"). + Where("tenant_name=?", v).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("get tenant_id err => %v", err) + } + if tenantID != "" { + conditions = append(conditions, "l.tenant_id = ?") + params = append(params, tenantID) + } + log.Tracef("tenantName=%v, tenantID=%v", v, tenantID) } // 构建查询条件语句 @@ -118,7 +132,7 @@ func (r *SysLogOperateImpl) SelectSysLogOperatePage(query map[string]any) map[st } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from sys_log_operate" + totalSql := "select count(1) as 'total' from sys_log_operate l" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err) @@ -253,8 +267,8 @@ func (r *SysLogOperateImpl) InsertSysLogOperate(SysLogOperate model.SysLogOperat if SysLogOperate.CostTime > 0 { params["cost_time"] = SysLogOperate.CostTime } - if SysLogOperate.TenantName != "" { - params["tenant_name"] = SysLogOperate.TenantName + if SysLogOperate.TenantID != "" { + params["tenant_id"] = SysLogOperate.TenantID } // 构建执行语句 diff --git a/src/modules/system/repository/sys_tenant.impl.go b/src/modules/system/repository/sys_tenant.impl.go index 5dc72b9b..e334dbdf 100644 --- a/src/modules/system/repository/sys_tenant.impl.go +++ b/src/modules/system/repository/sys_tenant.impl.go @@ -236,6 +236,7 @@ func (r *SysTenantImpl) IsUniqueTenancy(sysTenant model.SysTenant) bool { // 查询条件拼接 var conditions []string var params []any + if sysTenant.TenantID != "" { conditions = append(conditions, "tenant_id != ?") params = append(params, sysTenant.TenantID) @@ -245,8 +246,9 @@ func (r *SysTenantImpl) IsUniqueTenancy(sysTenant model.SysTenant) bool { params = append(params, sysTenant.TenancyType) } if sysTenant.TenancyKey != "" { - conditions = append(conditions, "? like tenancy_key") - params = append(params, sysTenant.TenancyKey) + conditions = append(conditions, "(? like tenancy_key or tenancy_key like ?)") + //conditions = append(conditions, "(LOCATE(?, tenancy_key)>0 or LOCATE(tenancy_key, ?)>0)") + params = append(params, sysTenant.TenancyKey, sysTenant.TenancyKey) } // 构建查询条件语句