Pārlūkot izejas kodu

refactor: 😀优化配置参数表租户隔离方式

喵你个旺呀 1 gadu atpakaļ
vecāks
revīzija
c155128c3e

+ 5 - 5
Admin.NET/Admin.NET.Core/Entity/SysConfig.cs

@@ -7,13 +7,13 @@
 namespace Admin.NET.Core;
 
 /// <summary>
-/// 系统参数配置表
+/// 系统配置参数表
 /// </summary>
-[SugarTable(null, "系统参数配置表")]
+[SugarTable(null, "系统配置参数表")]
 [SysTable]
 [SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)]
 [SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc, IsUnique = true)]
-public partial class SysConfig : EntityTenant
+public partial class SysConfig : EntityBase
 {
     /// <summary>
     /// 名称
@@ -30,9 +30,9 @@ public partial class SysConfig : EntityTenant
     public string? Code { get; set; }
 
     /// <summary>
-    /// 属性值
+    /// 属性默认值
     /// </summary>
-    [SugarColumn(ColumnDescription = "属性值", Length = -1)]
+    [SugarColumn(ColumnDescription = "属性默认值", Length = -1)]
     [MaxLength(64)]
     [IgnoreUpdateSeedColumn]
     public string? Value { get; set; }

+ 35 - 0
Admin.NET/Admin.NET.Core/Entity/SysConfigValue.cs

@@ -0,0 +1,35 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 系统配置参数值表
+/// </summary>
+[SugarTable(null, "系统配置参数值表")]
+[SysTable]
+[SugarIndex("index_{table}_N", nameof(ConfigId), OrderByType.Asc)]
+public partial class SysConfigValue : EntityTenant
+{
+    /// <summary>
+    /// 配置Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "配置Id")]
+    public long ConfigId { get; set; }
+
+    /// <summary>
+    /// 属性默认值
+    /// </summary>
+    [MaxLength(64)]
+    [SugarColumn(ColumnDescription = "属性默认值", Length = -1)]
+    public string? Value { get; set; }
+
+    /// <summary>
+    /// 配置
+    /// </summary>
+    [Navigate(NavigateType.OneToOne, nameof(ConfigId))]
+    public SysConfig Config { get; set; }
+}

+ 72 - 24
Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs

@@ -15,17 +15,20 @@ namespace Admin.NET.Core.Service;
 public class SysConfigService : IDynamicApiController, ITransient
 {
     private static readonly SysTenantService SysTenantService = App.GetService<SysTenantService>();
+    private readonly SqlSugarRepository<SysConfigValue> _sysConfigValueRep;
     private readonly SqlSugarRepository<SysConfig> _sysConfigRep;
     private readonly SqlSugarRepository<SysTenant> _sysTenantRep;
     private readonly SysCacheService _sysCacheService;
     private readonly UserManager _userManager;
 
     public SysConfigService(
+        SqlSugarRepository<SysConfigValue> sysConfigValueRep,
         SqlSugarRepository<SysTenant> sysTenantRep,
         SqlSugarRepository<SysConfig> sysConfigRep,
         SysCacheService sysCacheService,
         UserManager userManager)
     {
+        _sysConfigValueRep = sysConfigValueRep;
         _sysCacheService = sysCacheService;
         _sysConfigRep = sysConfigRep;
         _sysTenantRep = sysTenantRep;
@@ -40,9 +43,8 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取参数配置分页列表")]
     public async Task<SqlSugarPagedList<SysConfig>> Page(PageConfigInput input)
     {
-        return await _sysConfigRep.AsQueryable()
-            // .Where(u => u.GroupCode != ConfigConst.SysWebConfigGroup || u.GroupCode == null) // 不显示 WebConfig 分组
-            .WhereIF(!_userManager.SuperAdmin, u => u.TenantId == _userManager.TenantId)
+        var queryable = await GetConfigQueryable();
+        return await queryable
             .WhereIF(!string.IsNullOrWhiteSpace(input.Name?.Trim()), u => u.Name.Contains(input.Name))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Code?.Trim()), u => u.Code.Contains(input.Code))
             .WhereIF(!string.IsNullOrWhiteSpace(input.GroupCode?.Trim()), u => u.GroupCode.Equals(input.GroupCode))
@@ -57,8 +59,8 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取参数配置列表")]
     public async Task<List<SysConfig>> List(PageConfigInput input)
     {
-        var configQueryable = await GetConfigQueryable();
-        return await configQueryable
+        var queryable = await GetConfigQueryable();
+        return await queryable
             .WhereIF(!string.IsNullOrWhiteSpace(input.GroupCode?.Trim()), u => u.GroupCode.Equals(input.GroupCode))
             .ToListAsync();
     }
@@ -95,8 +97,32 @@ public class SysConfigService : IDynamicApiController, ITransient
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D9000);
 
         var config = input.Adapt<SysConfig>();
-        await _sysConfigRep.AsUpdateable(config).IgnoreColumns(true).ExecuteCommandAsync();
-
+        if (input.SysFlag != YesNoEnum.Y)
+        {
+            config.Value = null;
+            var configValue = await _sysConfigValueRep.AsQueryable().ClearFilter()
+                .WhereIF(_userManager.TenantId > 0, u => u.TenantId == _userManager.TenantId)
+                .WhereIF(_userManager.TenantId <= 0, u => u.TenantId == SqlSugarConst.DefaultTenantId)
+                .SingleAsync(u => u.ConfigId == config.Id);
+            if (configValue == null)
+            {
+                await _sysConfigValueRep.InsertAsync(new SysConfigValue()
+                {
+                    ConfigId = config.Id,
+                    Value = input.Value
+                });
+            }
+            else
+            {
+                configValue.Value = input.Value;
+                await _sysConfigValueRep.UpdateAsync(configValue);
+            }
+        }
+        else
+        {
+            await _sysConfigValueRep.DeleteAsync(u => u.ConfigId == input.Id);
+        }
+        await _sysConfigRep.AsUpdateable(config).ExecuteCommandAsync();
         Remove(config);
     }
 
@@ -114,8 +140,8 @@ public class SysConfigService : IDynamicApiController, ITransient
         // 禁止删除系统参数
         if (config.SysFlag == YesNoEnum.Y) throw Oops.Oh(ErrorCodeEnum.D9001);
 
+        await _sysConfigValueRep.DeleteAsync(u => u.ConfigId == config.Id);
         await _sysConfigRep.DeleteAsync(config);
-
         Remove(config);
     }
 
@@ -136,6 +162,7 @@ public class SysConfigService : IDynamicApiController, ITransient
             if (config.SysFlag == YesNoEnum.Y) continue;
 
             await _sysConfigRep.DeleteAsync(config);
+            await _sysConfigValueRep.DeleteAsync(u => u.ConfigId == config.Id);
 
             Remove(config);
         }
@@ -149,7 +176,8 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取参数配置详情")]
     public async Task<SysConfig> GetDetail([FromQuery] ConfigInput input)
     {
-        return await _sysConfigRep.GetFirstAsync(u => u.Id == input.Id);
+        var query = await GetConfigQueryable();
+        return await query.FirstAsync(u => u.Id == input.Id);
     }
 
     /// <summary>
@@ -165,8 +193,8 @@ public class SysConfigService : IDynamicApiController, ITransient
         var value = _sysCacheService.Get<string>($"{CacheConst.KeyConfig}{code}");
         if (string.IsNullOrEmpty(value))
         {
-            var configQueryable = await GetConfigQueryable();
-            var config = await configQueryable.FirstAsync(u => u.Code == code);
+            var query = await GetConfigQueryable();
+            var config = await query.FirstAsync(u => u.Code == code);
             value = config?.Value;
             _sysCacheService.Set($"{CacheConst.KeyConfig}{code}", value);
         }
@@ -181,7 +209,29 @@ public class SysConfigService : IDynamicApiController, ITransient
     [NonAction]
     public Task<ISugarQueryable<SysConfig>> GetConfigQueryable()
     {
-        return Task.FromResult(_sysConfigRep.AsQueryable().ClearFilter().Where(u => u.SysFlag == YesNoEnum.Y || u.SysFlag == YesNoEnum.N && u.TenantId == _userManager.TenantId));
+        var tenantId = _userManager.TenantId;
+        if (_userManager.TenantId <= 0) tenantId = SqlSugarConst.DefaultTenantId;
+        return Task.FromResult(
+            _sysConfigRep.AsQueryable()
+                .LeftJoin<SysConfigValue>((u, w) => u.Id == w.ConfigId).ClearFilter()
+                .Where((u, w) => w.TenantId == null || w.TenantId == tenantId)
+                .Select((u, w) => new SysConfig
+                {
+                    Id = u.Id,
+                    Name = u.Name,
+                    Code = u.Code,
+                    GroupCode = u.GroupCode,
+                    SysFlag = u.SysFlag,
+                    Remark = u.Remark,
+                    Value = w.Value ?? u.Value,
+                    CreateTime = SqlFunc.IIF(u.SysFlag == YesNoEnum.Y, u.CreateTime, w.CreateTime),
+                    UpdateTime = SqlFunc.IIF(u.SysFlag == YesNoEnum.Y, u.UpdateTime, w.UpdateTime),
+                    CreateUserId = SqlFunc.IIF(u.SysFlag == YesNoEnum.Y, u.CreateUserId, w.CreateUserId),
+                    CreateUserName = SqlFunc.IIF(u.SysFlag == YesNoEnum.Y, u.CreateUserName, w.CreateUserName),
+                    UpdateUserId = SqlFunc.IIF(u.SysFlag == YesNoEnum.Y, u.UpdateUserId, w.UpdateUserId),
+                    UpdateUserName = SqlFunc.IIF(u.SysFlag == YesNoEnum.Y, u.UpdateUserName, w.UpdateUserName),
+                })
+            );
     }
 
     /// <summary>
@@ -193,12 +243,12 @@ public class SysConfigService : IDynamicApiController, ITransient
     [NonAction]
     public async Task UpdateConfigValue(string code, string value)
     {
-        var configQueryable = await GetConfigQueryable();
-        var config = await configQueryable.FirstAsync(u => u.Code == code);
+        var query = await GetConfigQueryable();
+        var config = await query.FirstAsync(u => u.Code == code);
         if (config == null) return;
 
         config.Value = value;
-        await _sysConfigRep.AsUpdateable(config).ExecuteCommandAsync();
+        await UpdateConfig(config.Adapt<UpdateConfigInput>());
 
         Remove(config);
     }
@@ -210,11 +260,8 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取分组列表")]
     public async Task<List<string>> GetGroupList()
     {
-        var configQueryable = await GetConfigQueryable();
-        return await configQueryable
-            // .Where(u => u.GroupCode != ConfigConst.SysWebConfigGroup || u.GroupCode == null) // 不显示 WebConfig 分组
-            .GroupBy(u => u.GroupCode)
-            .Select(u => u.GroupCode).ToListAsync();
+        var query = await GetConfigQueryable();
+        return await query.GroupBy(u => u.GroupCode).Select(u => u.GroupCode).ToListAsync();
     }
 
     /// <summary>
@@ -250,13 +297,14 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("批量更新参数配置值")]
     public async Task BatchUpdateConfig(List<BatchConfigInput> input)
     {
-        var configQueryable = await GetConfigQueryable();
+        var query = await GetConfigQueryable();
         foreach (var config in input)
         {
-            var info = await configQueryable.FirstAsync(c => c.Code == config.Code);
+            var info = await query.FirstAsync(c => c.Code == config.Code);
             if (info == null || info.SysFlag == YesNoEnum.Y) continue;
 
-            await _sysConfigRep.AsUpdateable().SetColumns(u => u.Value == config.Value).Where(u => u.Code == config.Code).ExecuteCommandAsync();
+            info.Value = config.Value;
+            await UpdateConfig(info.Adapt<UpdateConfigInput>());
             Remove(info);
         }
     }
@@ -274,7 +322,7 @@ public class SysConfigService : IDynamicApiController, ITransient
         tenant ??= await _sysTenantRep.GetFirstAsync(u => u.Id == SqlSugarConst.DefaultTenantId);
         _ = tenant ?? throw Oops.Oh(ErrorCodeEnum.D1002);
 
-        var wayList = await _sysConfigRep.Context.Queryable<SysUserRegWay>().ClearFilter()
+        var wayList = await _sysConfigRep.Change<SysUserRegWay>().AsQueryable().ClearFilter()
             .Where(u => u.TenantId == tenant.Id)
             .Select(u => new { Label = u.Name, Value = u.Id })
             .ToListAsync();