feat: 😀实现系统配置参数值租户隔离
This commit is contained in:
parent
cbaf030f6f
commit
44e2248613
@ -32,7 +32,7 @@ public partial class SysConfig : EntityBase
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 属性值
|
/// 属性值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "属性值", Length = 256)]
|
[SugarColumn(ColumnDescription = "属性值", Length = 512)]
|
||||||
[MaxLength(256)]
|
[MaxLength(256)]
|
||||||
public string? Value { get; set; }
|
public string? Value { get; set; }
|
||||||
|
|
||||||
|
|||||||
35
Admin.NET/Admin.NET.Core/Entity/SysConfigValue.cs
Normal file
35
Admin.NET/Admin.NET.Core/Entity/SysConfigValue.cs
Normal file
@ -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 = 512)]
|
||||||
|
public string? Value { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 配置
|
||||||
|
/// </summary>
|
||||||
|
[Navigate(NavigateType.OneToOne, nameof(ConfigId))]
|
||||||
|
public SysConfig Config { get; set; }
|
||||||
|
}
|
||||||
@ -541,6 +541,12 @@ public enum ErrorCodeEnum
|
|||||||
[ErrorCodeItemMetadata("禁止删除系统参数")]
|
[ErrorCodeItemMetadata("禁止删除系统参数")]
|
||||||
D9001,
|
D9001,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 禁止越权操作系统内置参数
|
||||||
|
/// </summary>
|
||||||
|
[ErrorCodeItemMetadata("禁止越权操作系统内置参数")]
|
||||||
|
D9002,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 已存在同名任务调度
|
/// 已存在同名任务调度
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -12,14 +12,21 @@ namespace Admin.NET.Core.Service;
|
|||||||
[ApiDescriptionSettings(Order = 440, Description = "参数配置")]
|
[ApiDescriptionSettings(Order = 440, Description = "参数配置")]
|
||||||
public class SysConfigService : IDynamicApiController, ITransient
|
public class SysConfigService : IDynamicApiController, ITransient
|
||||||
{
|
{
|
||||||
|
private readonly UserManager _userManager;
|
||||||
private readonly SysCacheService _sysCacheService;
|
private readonly SysCacheService _sysCacheService;
|
||||||
private readonly SqlSugarRepository<SysConfig> _sysConfigRep;
|
private readonly SqlSugarRepository<SysConfig> _sysConfigRep;
|
||||||
|
private readonly SqlSugarRepository<SysConfigValue> _sysConfigValueRep;
|
||||||
|
|
||||||
public SysConfigService(SysCacheService sysCacheService,
|
public SysConfigService(
|
||||||
|
UserManager userManager,
|
||||||
|
SysCacheService sysCacheService,
|
||||||
|
SqlSugarRepository<SysConfigValue> sysConfigValueRep,
|
||||||
SqlSugarRepository<SysConfig> sysConfigRep)
|
SqlSugarRepository<SysConfig> sysConfigRep)
|
||||||
{
|
{
|
||||||
|
_sysConfigValueRep = sysConfigValueRep;
|
||||||
_sysCacheService = sysCacheService;
|
_sysCacheService = sysCacheService;
|
||||||
_sysConfigRep = sysConfigRep;
|
_sysConfigRep = sysConfigRep;
|
||||||
|
_userManager = userManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -30,7 +37,9 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
[DisplayName("获取参数配置分页列表")]
|
[DisplayName("获取参数配置分页列表")]
|
||||||
public async Task<SqlSugarPagedList<SysConfig>> Page(PageConfigInput input)
|
public async Task<SqlSugarPagedList<SysConfig>> Page(PageConfigInput input)
|
||||||
{
|
{
|
||||||
return await _sysConfigRep.AsQueryable()
|
var query = await GetConfigQueryable();
|
||||||
|
return await query
|
||||||
|
.WhereIF(!_userManager.SuperAdmin, u => u.SysFlag == YesNoEnum.N)
|
||||||
.Where(u => u.GroupCode != ConfigConst.SysWebConfigGroup || u.GroupCode == null) // 不显示 WebConfig 分组
|
.Where(u => u.GroupCode != ConfigConst.SysWebConfigGroup || u.GroupCode == null) // 不显示 WebConfig 分组
|
||||||
.WhereIF(!string.IsNullOrWhiteSpace(input.Name?.Trim()), u => u.Name.Contains(input.Name))
|
.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.Code?.Trim()), u => u.Code.Contains(input.Code))
|
||||||
@ -46,7 +55,8 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
[DisplayName("获取参数配置列表")]
|
[DisplayName("获取参数配置列表")]
|
||||||
public async Task<List<SysConfig>> List(PageConfigInput input)
|
public async Task<List<SysConfig>> List(PageConfigInput input)
|
||||||
{
|
{
|
||||||
return await _sysConfigRep.AsQueryable()
|
var query = await GetConfigQueryable();
|
||||||
|
return await query
|
||||||
.WhereIF(!string.IsNullOrWhiteSpace(input.GroupCode?.Trim()), u => u.GroupCode.Equals(input.GroupCode))
|
.WhereIF(!string.IsNullOrWhiteSpace(input.GroupCode?.Trim()), u => u.GroupCode.Equals(input.GroupCode))
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
@ -60,9 +70,9 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
[DisplayName("增加参数配置")]
|
[DisplayName("增加参数配置")]
|
||||||
public async Task AddConfig(AddConfigInput input)
|
public async Task AddConfig(AddConfigInput input)
|
||||||
{
|
{
|
||||||
|
if (input.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D9002);
|
||||||
var isExist = await _sysConfigRep.IsAnyAsync(u => u.Name == input.Name || u.Code == input.Code);
|
var isExist = await _sysConfigRep.IsAnyAsync(u => u.Name == input.Name || u.Code == input.Code);
|
||||||
if (isExist) throw Oops.Oh(ErrorCodeEnum.D9000);
|
if (isExist) throw Oops.Oh(ErrorCodeEnum.D9000);
|
||||||
|
|
||||||
await _sysConfigRep.InsertAsync(input.Adapt<SysConfig>());
|
await _sysConfigRep.InsertAsync(input.Adapt<SysConfig>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,6 +86,7 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
[UnitOfWork]
|
[UnitOfWork]
|
||||||
public async Task UpdateConfig(UpdateConfigInput input)
|
public async Task UpdateConfig(UpdateConfigInput input)
|
||||||
{
|
{
|
||||||
|
if (input.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D9002);
|
||||||
var isExist = await _sysConfigRep.IsAnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id);
|
var isExist = await _sysConfigRep.IsAnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id);
|
||||||
if (isExist) throw Oops.Oh(ErrorCodeEnum.D9000);
|
if (isExist) throw Oops.Oh(ErrorCodeEnum.D9000);
|
||||||
|
|
||||||
@ -92,7 +103,31 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
var config = input.Adapt<SysConfig>();
|
var config = input.Adapt<SysConfig>();
|
||||||
await _sysConfigRep.AsUpdateable(config).IgnoreColumns(true).ExecuteCommandAsync();
|
if (input.SysFlag != YesNoEnum.Y)
|
||||||
|
{
|
||||||
|
config.Value = null;
|
||||||
|
var tenantId = _userManager.TenantId;
|
||||||
|
if (tenantId <= 0) tenantId = SqlSugarConst.DefaultTenantId;
|
||||||
|
var configValue = await _sysConfigValueRep.AsQueryable().ClearFilter().Where(u => u.TenantId == tenantId).SingleAsync(u => u.ConfigId == config.Id);
|
||||||
|
if (configValue == null)
|
||||||
|
{
|
||||||
|
await _sysConfigValueRep.InsertAsync(new SysConfigValue()
|
||||||
|
{
|
||||||
|
ConfigId = config.Id,
|
||||||
|
Value = config.Value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
configValue.Value = config.Value;
|
||||||
|
await _sysConfigValueRep.UpdateAsync(configValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _sysConfigValueRep.DeleteAsync(u => u.ConfigId == config.Id);
|
||||||
|
}
|
||||||
|
await _sysConfigRep.AsUpdateable(config).ExecuteCommandAsync();
|
||||||
|
|
||||||
RemoveConfigCache(config);
|
RemoveConfigCache(config);
|
||||||
}
|
}
|
||||||
@ -111,6 +146,7 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
if (config.SysFlag == YesNoEnum.Y) throw Oops.Oh(ErrorCodeEnum.D9001);
|
if (config.SysFlag == YesNoEnum.Y) throw Oops.Oh(ErrorCodeEnum.D9001);
|
||||||
|
|
||||||
await _sysConfigRep.DeleteAsync(config);
|
await _sysConfigRep.DeleteAsync(config);
|
||||||
|
await _sysConfigValueRep.DeleteAsync(u => u.ConfigId == config.Id);
|
||||||
|
|
||||||
RemoveConfigCache(config);
|
RemoveConfigCache(config);
|
||||||
}
|
}
|
||||||
@ -131,6 +167,7 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
if (config.SysFlag == YesNoEnum.Y) continue;
|
if (config.SysFlag == YesNoEnum.Y) continue;
|
||||||
|
|
||||||
await _sysConfigRep.DeleteAsync(config);
|
await _sysConfigRep.DeleteAsync(config);
|
||||||
|
await _sysConfigValueRep.DeleteAsync(u => u.ConfigId == id);
|
||||||
|
|
||||||
RemoveConfigCache(config);
|
RemoveConfigCache(config);
|
||||||
}
|
}
|
||||||
@ -155,7 +192,8 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
[NonAction]
|
[NonAction]
|
||||||
public async Task<SysConfig> GetConfig(string code)
|
public async Task<SysConfig> GetConfig(string code)
|
||||||
{
|
{
|
||||||
return await _sysConfigRep.GetFirstAsync(u => u.Code == code);
|
var query = await GetConfigQueryable();
|
||||||
|
return await query.FirstAsync(u => u.Code == code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -182,8 +220,9 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
var value = _sysCacheService.Get<string>($"{CacheConst.KeyConfig}{code}");
|
var value = _sysCacheService.Get<string>($"{CacheConst.KeyConfig}{code}");
|
||||||
if (string.IsNullOrEmpty(value))
|
if (string.IsNullOrEmpty(value))
|
||||||
{
|
{
|
||||||
var config = await _sysConfigRep.CopyNew().GetFirstAsync(u => u.Code == code);
|
var query = await GetConfigQueryable();
|
||||||
value = config != null ? config.Value : default;
|
var config = await query.FirstAsync(u => u.Code == code);
|
||||||
|
value = config?.Value;
|
||||||
_sysCacheService.Set($"{CacheConst.KeyConfig}{code}", value);
|
_sysCacheService.Set($"{CacheConst.KeyConfig}{code}", value);
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(value)) return default;
|
if (string.IsNullOrWhiteSpace(value)) return default;
|
||||||
@ -203,7 +242,7 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
if (config == null) return;
|
if (config == null) return;
|
||||||
|
|
||||||
config.Value = value;
|
config.Value = value;
|
||||||
await _sysConfigRep.AsUpdateable(config).ExecuteCommandAsync();
|
await UpdateConfig(config.Adapt<UpdateConfigInput>());
|
||||||
|
|
||||||
RemoveConfigCache(config);
|
RemoveConfigCache(config);
|
||||||
}
|
}
|
||||||
@ -215,7 +254,8 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
[DisplayName("获取分组列表")]
|
[DisplayName("获取分组列表")]
|
||||||
public async Task<List<string>> GetGroupList()
|
public async Task<List<string>> GetGroupList()
|
||||||
{
|
{
|
||||||
return await _sysConfigRep.AsQueryable()
|
var query = await GetConfigQueryable();
|
||||||
|
return await query
|
||||||
.Where(u => u.GroupCode != ConfigConst.SysWebConfigGroup || u.GroupCode == null) // 不显示 WebConfig 分组
|
.Where(u => u.GroupCode != ConfigConst.SysWebConfigGroup || u.GroupCode == null) // 不显示 WebConfig 分组
|
||||||
.GroupBy(u => u.GroupCode)
|
.GroupBy(u => u.GroupCode)
|
||||||
.Select(u => u.GroupCode).ToListAsync();
|
.Select(u => u.GroupCode).ToListAsync();
|
||||||
@ -259,11 +299,44 @@ public class SysConfigService : IDynamicApiController, ITransient
|
|||||||
var configInfo = await _sysConfigRep.GetFirstAsync(u => u.Code == config.Code);
|
var configInfo = await _sysConfigRep.GetFirstAsync(u => u.Code == config.Code);
|
||||||
if (configInfo == null) continue;
|
if (configInfo == null) continue;
|
||||||
|
|
||||||
await _sysConfigRep.AsUpdateable().SetColumns(u => u.Value == config.Value).Where(u => u.Code == config.Code).ExecuteCommandAsync();
|
configInfo.Value = config.Value;
|
||||||
|
await UpdateConfig(configInfo.Adapt<UpdateConfigInput>());
|
||||||
RemoveConfigCache(configInfo);
|
RemoveConfigCache(configInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取参数配置查询器
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[NonAction]
|
||||||
|
public Task<ISugarQueryable<SysConfig>> GetConfigQueryable()
|
||||||
|
{
|
||||||
|
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>
|
/// <summary>
|
||||||
/// 清除配置缓存
|
/// 清除配置缓存
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user