ソースを参照

😁增加租户独立库隔离时主从库/读写分离配置

zuohuaijun 2 年 前
コミット
b111f0f14f

+ 6 - 0
Admin.NET/Admin.NET.Core/Entity/SysTenant.cs

@@ -61,6 +61,12 @@ public class SysTenant : EntityBase
     [MaxLength(64)]
     public string? ConfigId { get; set; }
 
+    /// <summary>
+    /// 从库连接/读写分离
+    /// </summary>
+    [SugarColumn(ColumnDescription = "从库连接/读写分离", ColumnDataType = StaticConfig.CodeFirst_BigString)]
+    public string? SlaveConnections { get; set; }
+
     /// <summary>
     /// 排序
     /// </summary>

+ 6 - 0
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -484,6 +484,12 @@ public enum ErrorCodeEnum
     [ErrorCodeItemMetadata("已存在同名的租户管理员")]
     D1301,
 
+    /// <summary>
+    /// 租户从库配置错误
+    /// </summary>
+    [ErrorCodeItemMetadata("租户从库配置错误")]
+    D1302,
+
     /// <summary>
     /// 该表代码模板已经生成过
     /// </summary>

+ 10 - 1
Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs

@@ -114,6 +114,10 @@ public class SysTenantService : IDynamicApiController, ITransient
         isExist = await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.AdminAccount);
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D1301);
 
+        // 从库配置判断
+        if (!string.IsNullOrWhiteSpace(input.SlaveConnections) && !JSON.IsValid(input.SlaveConnections))
+            throw Oops.Oh(ErrorCodeEnum.D1302);
+
         // ID隔离时设置与主库一致
         if (input.TenantType == TenantTypeEnum.Id)
         {
@@ -284,6 +288,10 @@ public class SysTenantService : IDynamicApiController, ITransient
         if (isExist)
             throw Oops.Oh(ErrorCodeEnum.D1301);
 
+        // 从库配置判断
+        if (!string.IsNullOrWhiteSpace(input.SlaveConnections) && !JSON.IsValid(input.SlaveConnections))
+            throw Oops.Oh(ErrorCodeEnum.D1302);
+
         await _sysTenantRep.AsUpdateable(input.Adapt<TenantOutput>()).IgnoreColumns(true).ExecuteCommandAsync();
 
         // 更新系统机构
@@ -438,7 +446,8 @@ public class SysTenantService : IDynamicApiController, ITransient
                 DbSettings = new DbSettings()
                 {
                     EnableUnderLine = mainConnConfig.DbSettings.EnableUnderLine,
-                }
+                },
+                SlaveConnectionConfigs = JSON.IsValid(tenant.SlaveConnections) ? JSON.Deserialize<List<SlaveConnectionConfig>>(tenant.SlaveConnections) : null // 从库连接配置
             };
             iTenant.AddConnection(tenantConnConfig);
 

+ 8 - 0
Web/src/api-services/models/add-tenant-input.ts

@@ -143,6 +143,14 @@ export interface AddTenantInput {
      */
     configId?: string | null;
 
+    /**
+     * 从库连接/读写分离
+     *
+     * @type {string}
+     * @memberof AddTenantInput
+     */
+    slaveConnections?: string | null;
+
     /**
      * 排序
      *

+ 8 - 0
Web/src/api-services/models/sys-tenant.ts

@@ -143,6 +143,14 @@ export interface SysTenant {
      */
     configId?: string | null;
 
+    /**
+     * 从库连接/读写分离
+     *
+     * @type {string}
+     * @memberof SysTenant
+     */
+    slaveConnections?: string | null;
+
     /**
      * 排序
      *

+ 8 - 0
Web/src/api-services/models/tenant-output.ts

@@ -143,6 +143,14 @@ export interface TenantOutput {
      */
     configId?: string | null;
 
+    /**
+     * 从库连接/读写分离
+     *
+     * @type {string}
+     * @memberof TenantOutput
+     */
+    slaveConnections?: string | null;
+
     /**
      * 排序
      *

+ 8 - 0
Web/src/api-services/models/update-tenant-input.ts

@@ -143,6 +143,14 @@ export interface UpdateTenantInput {
      */
     configId?: string | null;
 
+    /**
+     * 从库连接/读写分离
+     *
+     * @type {string}
+     * @memberof UpdateTenantInput
+     */
+    slaveConnections?: string | null;
+
     /**
      * 排序
      *

+ 5 - 0
Web/src/views/system/tenant/component/editTenant.vue

@@ -79,6 +79,11 @@
 							<el-input v-model="state.ruleForm.connection" placeholder="连接字符串" clearable type="textarea" :disabled="state.ruleForm.tenantType == 0 && state.ruleForm.tenantType != undefined" />
 						</el-form-item>
 					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="从库连接串">
+							<el-input v-model="state.ruleForm.slaveConnections" placeholder="格式:[{'HitRate':10, 'ConnectionString':'xxx'},{'HitRate':10, 'ConnectionString':'xxx'}]" clearable type="textarea" :disabled="state.ruleForm.tenantType == 0 && state.ruleForm.tenantType != undefined" />
+						</el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="备注">
 							<el-input v-model="state.ruleForm.remark" placeholder="请输入备注内容" clearable type="textarea" />

+ 1 - 0
Web/src/views/system/tenant/index.vue

@@ -61,6 +61,7 @@
 				</el-table-column>
 				<!-- <el-table-column prop="configId" label="数据库标识" show-overflow-tooltip /> -->
 				<el-table-column prop="connection" label="数据库连接" min-width="300" header-align="center" show-overflow-tooltip />
+				<el-table-column prop="slaveConnections" label="从库连接" min-width="300" header-align="center" show-overflow-tooltip />
 				<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
 					<template #default="scope">