using Admin.NET.Core;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
namespace Admin.NET.Application
{
///
/// 系统参数配置服务
///
[ApiDescriptionSettings(Name = "Config", Order = 100)]
[Route("api")]
public class SysConfigService : ISysConfigService, IDynamicApiController, ITransient
{
private readonly IRepository _sysConfigRep; // 参数配置表仓储
private readonly ISysCacheService _sysCacheService;
///
/// 构造函数
///
///
///
public SysConfigService(IRepository sysConfigRep, ISysCacheService sysCacheService)
{
_sysConfigRep = sysConfigRep;
_sysCacheService = sysCacheService;
}
///
/// 分页获取系统参数配置
///
///
///
[HttpGet("sysConfig/page")]
public async Task> QueryConfigPageList([FromQuery] ConfigPageInput input)
{
var name = !string.IsNullOrEmpty(input.Name?.Trim());
var code = !string.IsNullOrEmpty(input.Code?.Trim());
var groupCode = !string.IsNullOrEmpty(input.GroupCode?.Trim());
var configs = await _sysConfigRep.DetachedEntities
.Where((name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%")),
(code, u => EF.Functions.Like(u.Code, $"%{input.Code.Trim()}%")),
(groupCode, u => EF.Functions.Like(u.GroupCode, $"%{input.GroupCode.Trim()}%")))
.Where(u => u.Status != CommonStatus.DELETED)
.OrderBy(PageInputOrder.OrderBuilder(input))
.ToADPagedListAsync(input.PageNo, input.PageSize);
return configs;
}
///
/// 获取系统参数配置列表
///
///
[HttpGet("sysConfig/list")]
public async Task> GetConfigList()
{
return await _sysConfigRep.DetachedEntities.Where(u => u.Status != CommonStatus.DELETED).ToListAsync();
}
///
/// 增加系统参数配置
///
///
///
[HttpPost("sysConfig/add")]
public async Task AddConfig(AddConfigInput input)
{
var isExist = await _sysConfigRep.DetachedEntities.AnyAsync(u => u.Name == input.Name || u.Code == input.Code);
if (isExist)
throw Oops.Oh(ErrorCode.D9000);
var config = input.Adapt();
await config.InsertAsync();
}
///
/// 删除系统参数配置
///
///
///
[HttpPost("sysConfig/delete")]
public async Task DeleteConfig(DeleteConfigInput input)
{
var config = await _sysConfigRep.FirstOrDefaultAsync(u => u.Id == input.Id);
// 禁止删除系统参数
//if (config.SysFlag == YesOrNot.Y.ToString())
// throw Oops.Oh(ErrorCode.D9001);
var deleteEntity = await config.DeleteNowAsync();
//删除缓存
await _sysCacheService.DelCacheKey(deleteEntity.Entity.Code);
}
///
/// 更新系统参数配置
///
///
///
[HttpPost("sysConfig/edit")]
public async Task UpdateConfig(UpdateConfigInput input)
{
var isExist = await _sysConfigRep.DetachedEntities.AnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id);
if (isExist)
throw Oops.Oh(ErrorCode.D9000);
var config = input.Adapt();
await config.UpdateAsync(ignoreNullValues: true);
//更新缓存
var value = config != null ? config.Value : "";
await _sysCacheService.SetStringAsync(input.Code, value);
}
///
/// 获取系统参数配置
///
///
///
[HttpGet("sysConfig/detail")]
public async Task GetConfig([FromQuery] QueryConfigInput input)
{
return await _sysConfigRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id);
}
///
/// 获取配置信息
///
///
///
private async Task GetConfigCache(string code)
{
var value = await _sysCacheService.GetStringAsync(code);
if (string.IsNullOrEmpty(value))
{
var config = await _sysConfigRep.DetachedEntities.FirstOrDefaultAsync(u => u.Code == code);
value = config != null ? config.Value : "";
await _sysCacheService.SetStringAsync(code, value);
}
return value;
}
///
/// 更新配置缓存
///
///
///
///
public async Task UpdateConfigCache(string code, string value)
{
await _sysCacheService.SetStringAsync(code, value);
}
///
/// 获取演示环境开关是否开启,默认为false
///
///
[NonAction]
public async Task GetDemoEnvFlag()
{
var value = await GetConfigCache("DILON_DEMO_ENV_FLAG");
return bool.Parse(value);
}
///
/// 获取验证码开关标识
///
///
[NonAction]
public async Task GetCaptchaOpenFlag()
{
var value = await GetConfigCache("DILON_CAPTCHA_OPEN");
return bool.Parse(value);
}
///
/// 获取单用户登录开关标识
///
///
[NonAction]
public async Task GetEnableSingleLoginFlag()
{
var value = await GetConfigCache("DILON_ENABLE_SINGLE_LOGIN");
return bool.Parse(value);
}
}
}