添加项目文件。

This commit is contained in:
fuenmao
2025-09-29 13:48:36 +08:00
parent f61e922f0c
commit 5dc1780ef1
407 changed files with 63703 additions and 0 deletions
@@ -0,0 +1,206 @@
// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛
//
// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:
// 1.请不要删除和修改根目录下的LICENSE文件。
// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。
// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin
// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。
// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。
// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。
namespace SimpleAdmin.System;
/// <inheritdoc cref="IConfigService"/>
public class ConfigService : DbRepository<SysConfig>, IConfigService
{
private readonly ISimpleCacheService _simpleCacheService;
public ConfigService(ISimpleCacheService simpleCacheService)
{
_simpleCacheService = simpleCacheService;
}
#region 查询
/// <inheritdoc/>
public async Task<List<SysConfig>> GetConfigsByCategory(string category)
{
var key = SystemConst.CACHE_DEV_CONFIG + category;//系统配置key
//先从redis拿配置
var configList = _simpleCacheService.HashGetAll<SysConfig>(key).Values.ToList();
if (configList.Count == 0)
{
//redis没有再去数据可拿
var configs = await GetListAsync(it => it.Category == category);//获取系统配置列表
if (configs.Count > 0)
{
configList = configs;
_simpleCacheService.HashSet(key, configList.ToDictionary(it => it.ConfigKey));//如果不为空,插入redis
}
}
return configList.ToList();
}
/// <inheritdoc/>
public async Task<List<SysConfig>> GetSysConfigList()
{
//这里不返回系统配置
return await GetListAsync(it => it.Category != CateGoryConst.CONFIG_BIZ_DEFINE);
}
/// <inheritdoc/>
public async Task<SysConfig> GetByConfigKey(string category, string configKey)
{
var key = SystemConst.CACHE_DEV_CONFIG + category;//系统配置key
//先从redis拿配置
var config = _simpleCacheService.HashGetOne<SysConfig>(key, configKey);
if (config == null)
{
//redis没有再去数据可拿
config = await GetFirstAsync(it => it.Category == category && it.ConfigKey == configKey);//获取系统配置
if (config != null)
{
await GetConfigsByCategory(category);//获取全部字典,并插入redis
}
}
return config;
}
/// <inheritdoc/>
public async Task<SqlSugarPagedList<SysConfig>> Page(ConfigPageInput input)
{
var query = Context.Queryable<SysConfig>().Where(it => it.Category == CateGoryConst.CONFIG_BIZ_DEFINE)//自定义配置
.WhereIF(!string.IsNullOrEmpty(input.SearchKey),
it => it.ConfigKey.Contains(input.SearchKey) || it.ConfigValue.Contains(input.SearchKey))//根据关键字查询
.OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序
.OrderBy(it => it.SortCode)
.OrderBy(it => it.CreateTime);//排序
var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页
return pageInfo;
}
/// <inheritdoc/>
public async Task<FileStreamResult> GetIco()
{
var config = await GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_ICO);//获取系统配置 ico
var icoBase64 = config.ConfigValue.Split(",")[1];//获取ico的base64
//转为byte数组
var bytes = Convert.FromBase64String(icoBase64);
//将byte数组转为流
var stream = new MemoryStream(bytes);
return new FileStreamResult(stream, "image/x-icon");
}
/// <inheritdoc/>
public async Task<bool> IsTenant()
{
var tenantOption = await GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_TENANT_OPTIONS);
var isTenant = tenantOption.ConfigValue != SysDictConst.TENANT_OPTIONS_CLOSE;//是否开启多租户
return isTenant;
}
#endregion
#region 添加
/// <inheritdoc/>
public async Task Add(ConfigAddInput input)
{
await CheckInput(input);
var devConfig = input.Adapt<SysConfig>();//实体转换
if (await InsertAsync(devConfig))//插入数据)
await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存
}
#endregion
#region 编辑
/// <inheritdoc/>
public async Task Edit(ConfigEditInput input)
{
await CheckInput(input);
var devConfig = input.Adapt<SysConfig>();//实体转换
if (await UpdateAsync(devConfig))//更新数据
await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存
}
/// <inheritdoc/>
public async Task EditBatch(List<SysConfig> devConfigs)
{
if (devConfigs.Count > 0)
{
//根据分类分组
var configGroups = devConfigs.GroupBy(it => it.Category).ToList();
//遍历分组
foreach (var item in configGroups)
{
var configList = await GetConfigsByCategory(item.Key);//获取系统配置
var configs = item.ToList();//获取分组完的配置列表
var keys = configs.Select(it => it.ConfigKey).ToList();//获取key列表
configList = configList.Where(it => keys.Contains(it.ConfigKey)).ToList();//获取要修改的列表
//遍历配置列表
configList.ForEach(it =>
{
//赋值ConfigValue
it.ConfigValue = configs.Where(c => c.ConfigKey == it.ConfigKey).First().ConfigValue;
});
//更新数据
if (await UpdateRangeAsync(configList))
await RefreshCache(item.Key);//刷新缓存
}
}
}
#endregion
#region 删除
/// <inheritdoc/>
public async Task Delete(ConfigDeleteInput input)
{
//获取所有业务配置
var configs = await GetConfigsByCategory(CateGoryConst.CONFIG_BIZ_DEFINE);
if (configs.Any(it => it.Id == input.Id))//如果有当前配置
{
if (await DeleteByIdAsync(input.Id))//删除配置
await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存
}
}
#endregion
#region 方法
/// <summary>
/// 刷新缓存
/// </summary>
/// <param name="category">分类</param>
/// <returns></returns>
private async Task RefreshCache(string category)
{
_simpleCacheService.Remove(SystemConst.CACHE_DEV_CONFIG + category);//redis删除
await GetConfigsByCategory(category);//重新获取
}
/// <summary>
/// 检查输入参数
/// </summary>
/// <param name="sysConfig"></param>
private async Task CheckInput(SysConfig sysConfig)
{
var configs = await GetConfigsByCategory(CateGoryConst.CONFIG_BIZ_DEFINE);//获取全部字典
//判断是否从存在重复字典名
var hasSameKey = configs.Any(it => it.ConfigKey == sysConfig.ConfigKey && it.Id != sysConfig.Id);
if (hasSameKey)
{
throw Oops.Bah($"存在重复的配置键:{sysConfig.ConfigKey}");
}
//设置分类为业务
sysConfig.Category = CateGoryConst.CONFIG_BIZ_DEFINE;
}
#endregion 方法
}
@@ -0,0 +1,69 @@
// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛
//
// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:
// 1.请不要删除和修改根目录下的LICENSE文件。
// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。
// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin
// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。
// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。
// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。
namespace SimpleAdmin.System;
/// <summary>
/// 配置分页参数
/// </summary>
public class ConfigPageInput : BasePageInput
{
}
/// <summary>
/// 添加配置参数
/// </summary>
public class ConfigAddInput : SysConfig
{
/// <summary>
/// 配置键
/// </summary>
[Required(ErrorMessage = "configKey不能为空")]
public override string ConfigKey { get; set; }
/// <summary>
/// 配置值
/// </summary>
[Required(ErrorMessage = "ConfigValue不能为空")]
public override string ConfigValue { get; set; }
}
/// <summary>
/// 编辑配置参数
/// </summary>
public class ConfigEditInput : ConfigAddInput
{
/// <summary>
/// ID
/// </summary>
[IdNotNull(ErrorMessage = "Id不能为空")]
public override long Id { get; set; }
}
/// <summary>
/// 删除配置参数
/// </summary>
public class ConfigDeleteInput : BaseIdInput
{
}
/// <summary>
/// 批量修改输入参数
/// </summary>
public class ConfigEditBatchInput
{
/// <summary>
/// 分类
/// </summary>
public string CateGory { get; set; }
public List<SysConfig> DevConfigs { get; set; }
}
@@ -0,0 +1,97 @@
// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛
//
// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:
// 1.请不要删除和修改根目录下的LICENSE文件。
// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。
// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin
// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。
// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。
// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。
namespace SimpleAdmin.System;
/// <summary>
/// 系统配置服务
/// </summary>
public interface IConfigService : ITransient
{
#region 查询
/// <summary>
/// 根据分类和配置键获配置
/// </summary>
/// <param name="category">分类</param>
/// <param name="configKey">配置键</param>
/// <returns>配置信息</returns>
Task<SysConfig> GetByConfigKey(string category, string configKey);
/// <summary>
/// 根据分类获取配置列表
/// </summary>
/// <param name="category">分类名称</param>
/// <returns>配置列表</returns>
Task<List<SysConfig>> GetConfigsByCategory(string category);
/// <summary>
/// 分页查询其他配置
/// </summary>
/// <param name="input">查询参数</param>
/// <returns>其他配置列表</returns>
Task<SqlSugarPagedList<SysConfig>> Page(ConfigPageInput input);
Task<FileStreamResult> GetIco();
/// <summary>
/// 获取系统配置列表,不包含业务的
/// </summary>
/// <returns></returns>
Task<List<SysConfig>> GetSysConfigList();
/// <summary>
/// 是否是多租户模式
/// </summary>
/// <returns></returns>
Task<bool> IsTenant();
#endregion
#region 新增
/// <summary>
/// 新增配置
/// </summary>
/// <param name="input">新增参数</param>
/// <returns></returns>
Task Add(ConfigAddInput input);
#endregion
#region 编辑
/// <summary>
/// 修改配置
/// </summary>
/// <param name="input">修改参数</param>
/// <returns></returns>
Task Edit(ConfigEditInput input);
/// <summary>
/// 批量编辑
/// </summary>
/// <param name="devConfigs">配置列表</param>
/// <returns></returns>
Task EditBatch(List<SysConfig> devConfigs);
#endregion
#region 删除
/// <summary>
/// 删除配置
/// </summary>
/// <param name="input">删除</param>
/// <returns></returns>
Task Delete(ConfigDeleteInput input);
#endregion
}
@@ -0,0 +1,237 @@
// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛
//
// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:
// 1.请不要删除和修改根目录下的LICENSE文件。
// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。
// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin
// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。
// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。
// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。
namespace SimpleAdmin.System;
/// <summary>
/// <inheritdoc cref="IDictService"/>
/// </summary>
public class DictService : DbRepository<SysDict>, IDictService
{
private readonly ISimpleCacheService _simpleCacheService;
public DictService(ISimpleCacheService simpleCacheService)
{
_simpleCacheService = simpleCacheService;
}
/// <inheritdoc />
public async Task<SqlSugarPagedList<SysDict>> Page(DictPageInput input)
{
var query = Context.Queryable<SysDict>().Where(it => it.Category == input.Category)//根据分类查询
.Where(it => it.ParentId == input.ParentId)//根据父ID查询
.WhereIF(!string.IsNullOrEmpty(input.SearchKey),
it => it.DictLabel.Contains(input.SearchKey) || it.DictValue.Contains(input.SearchKey))//根据关键字查询
.OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")
.OrderBy(it => it.SortCode)//排序
.OrderBy(it => it.CreateTime);//排序
var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页
return pageInfo;
}
/// <inheritdoc />
public async Task Add(DictAddInput input)
{
await CheckInput(input);//检查参数
var devDict = input.Adapt<SysDict>();//实体转换
if (await InsertAsync(devDict))//插入数据
await RefreshCache();//刷新缓存
}
/// <inheritdoc />
public async Task Edit(DictAddInput input)
{
await CheckInput(input);//检查参数
var devDict = input.Adapt<SysDict>();//实体转换
if (await UpdateAsync(devDict))//更新数据
await RefreshCache();//刷新缓存
}
/// <inheritdoc />
public async Task Delete(DictDeleteInput input)
{
//获取所有ID
var ids = input.Ids;
if (ids.Count > 0)
{
//获取所有字典
var dictList = await GetListAsync();
//判断是否有系统字典
var frm = dictList.Any(it => ids.Contains(it.Id) && it.Category == CateGoryConst.DICT_FRM);
//如果是系统字典提示不可删除
if (frm) throw Oops.Bah("不可删除系统内置字典");
var deleteIds = new List<long>();//要删除的id列表
deleteIds.AddRange(ids);//
ids.ForEach(it =>
{
//获取子节点
var children = GetDevDictChildren(dictList, it);
//提取ID
var childrenIds = children.Select(c => c.Id).ToList();
deleteIds.AddRange(childrenIds);
});
//删除数据
if (await DeleteByIdsAsync(deleteIds.Cast<object>().ToArray()))
await RefreshCache();//刷新缓存
}
}
/// <summary>
/// 获取全部
/// </summary>
/// <returns></returns>
public override async Task<List<SysDict>> GetListAsync()
{
//先从redis拿
var sysDictList = _simpleCacheService.Get<List<SysDict>>(SystemConst.CACHE_DEV_DICT);
if (sysDictList == null)
{
sysDictList = await base.GetListAsync();//去数据库拿
if (sysDictList.Count > 0)
{
_simpleCacheService.Set(SystemConst.CACHE_DEV_DICT, sysDictList);//如果数据库有数,更新redis
return sysDictList;
}
}
return sysDictList;
}
/// <inheritdoc />
public async Task<SysDict> GetDict(string dictValue)
{
var sysDictList = await GetListAsync();
var devDict = sysDictList.Where(it => it.DictValue == dictValue).FirstOrDefault();
return devDict;
}
/// <inheritdoc />
public async Task<List<SysDict>> GetChildrenByDictValue(string dictValue)
{
var sysDictList = await GetListAsync();
var devDict = sysDictList.Where(it => it.DictValue == dictValue).FirstOrDefault();
if (devDict != null)
{
var children = GetDevDictChildren(sysDictList, devDict.Id);
return children;
}
return new List<SysDict>();
}
/// <inheritdoc />
public async Task<List<string>> GetValuesByDictValue(string dictValue, List<SysDict> devDictList = null)
{
var sysDictList = devDictList == null ? await GetListAsync() : devDictList;//获取全部
var id = sysDictList.Where(it => it.DictValue == dictValue).Select(it => it.Id).FirstOrDefault();//根据value找到父节点
if (id > 0)
return sysDictList.Where(it => it.ParentId == id).Select(it => it.DictValue).ToList();//拿到字典值
return new List<string>();
}
/// <inheritdoc />
public async Task<Dictionary<string, List<string>>> GetValuesByDictValue(string[] dictValues)
{
var result = new Dictionary<string, List<string>>();
var sysDictList = await GetListAsync();//获取全部
foreach (var dictValue in dictValues)
{
var data = await GetValuesByDictValue(dictValue, sysDictList);
result.Add(dictValue, data);
}
return result;
}
/// <inheritdoc />
public async Task<List<SysDict>> Tree(DictTreeInput input)
{
var devList= await Context.Queryable<SysDict>()
.WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)
.WhereIF(!string.IsNullOrEmpty(input.DictValue), it => it.DictValue == input.DictValue)
.OrderBy(it => it.SortCode)
.ToListAsync();
return ConstructResourceTrees(devList);
}
/// <inheritdoc />
public List<SysDict> ConstructResourceTrees(List<SysDict> dictList, long parentId = 0)
{
//找下级字典ID列表
var resources = dictList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList();
if (resources.Count > 0)//如果数量大于0
{
var data = new List<SysDict>();
foreach (var item in resources)//遍历字典
{
item.Children = ConstructResourceTrees(dictList, item.Id);//添加子节点
data.Add(item);//添加到列表
}
return data;//返回结果
}
return new List<SysDict>();
}
#region 方法
/// <summary>
/// 刷新缓存
/// </summary>
private async Task RefreshCache()
{
_simpleCacheService.Remove(SystemConst.CACHE_DEV_DICT);
await GetListAsync();
}
/// <summary>
/// 检查输入参数
/// </summary>
/// <param name="sysDict"></param>
private async Task CheckInput(SysDict sysDict)
{
var dictList = await GetListAsync();//获取全部字典
//判断是否从存在重复字典名
var hasSameLabel = dictList.Any(it =>
it.ParentId == sysDict.ParentId && it.Category == sysDict.Category && it.DictLabel == sysDict.DictLabel && it.Id != sysDict.Id);
if (hasSameLabel)
{
throw Oops.Bah($"存在重复的字典名称:{sysDict.DictLabel}");
}
//判断是否存在重复字典值
var hasSameValue = dictList.Any(it => it.ParentId == sysDict.ParentId && it.DictValue == sysDict.DictValue && it.Id != sysDict.Id);
if (hasSameValue)
{
throw Oops.Bah($"存在重复的字典值:{sysDict.DictValue}");
}
}
/// <summary>
/// 获取字典所有下级
/// </summary>
/// <param name="dictList">字典列表</param>
/// <param name="parentId">父ID</param>
/// <returns></returns>
public List<SysDict> GetDevDictChildren(List<SysDict> dictList, long parentId)
{
//找下级ID列表
var dicts = dictList.Where(it => it.ParentId == parentId).ToList();
if (dicts.Count > 0)//如果数量大于0
{
var data = new List<SysDict>();
foreach (var item in dicts)//遍历机构
{
var devDictChildren = GetDevDictChildren(dictList, item.Id);
data.AddRange(devDictChildren);//添加子节点);
data.Add(item);////添加到列表
}
return data;//返回结果
}
return new List<SysDict>();
}
#endregion 方法
}
@@ -0,0 +1,90 @@
// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛
//
// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:
// 1.请不要删除和修改根目录下的LICENSE文件。
// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。
// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin
// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。
// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。
// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。
namespace SimpleAdmin.System;
/// <summary>
/// 字典查询参数
/// </summary>
public class DictInput
{
}
/// <summary>
/// 字典树参数
/// </summary>
public class DictTreeInput
{
/// <summary>
/// 字典分类
/// </summary>
public string Category { get; set; }
public string DictValue { get; set; }
}
/// <summary>
/// 字典查询参数
/// </summary>
public class DictPageInput : BasePageInput
{
/// <summary>
/// 父id
///</summary>
public long ParentId { get; set; }
/// <summary>
/// 分类
///</summary>
public string Category { get; set; } = SysDictConst.DICT_CATEGORY_FRM;
}
/// <summary>
/// 添加字典参数
/// </summary>
public class DictAddInput : SysDict
{
/// <summary>
/// 父ID
/// </summary>
public override long ParentId { get; set; } = 0;
/// <summary>
/// 字典名称
/// </summary>
[Required(ErrorMessage = "DictLabel不能为空")]
public override string DictLabel { get; set; }
/// <summary>
/// 字典值
/// </summary>
[Required(ErrorMessage = "DictValue不能为空")]
public override string DictValue { get; set; }
}
/// <summary>
/// 编辑字典参数
/// </summary>
public class DictEditInput : DictAddInput
{
/// <summary>
/// ID
/// </summary>
[IdNotNull(ErrorMessage = "Id不能为空")]
public override long Id { get; set; }
}
/// <summary>
/// 删除字典参数
/// </summary>
public class DictDeleteInput : BaseIdListInput
{
}
@@ -0,0 +1,95 @@
// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛
//
// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:
// 1.请不要删除和修改根目录下的LICENSE文件。
// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。
// 3.分发源码时候,请注明软件出处 https://gitee.com/dotnetmoyu/SimpleAdmin
// 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。
// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为。
// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。
namespace SimpleAdmin.System;
/// <summary>
/// 字典服务
/// </summary>
public interface IDictService : ITransient
{
/// <summary>
/// 添加字典
/// </summary>
/// <param name="input">输入参数</param>
/// <returns></returns>
Task Add(DictAddInput input);
/// <summary>
/// 构建字典树形结构
/// </summary>
/// <param name="dictList">字典列表</param>
/// <param name="parentId">父ID</param>
/// <returns>字典树形结构</returns>
List<SysDict> ConstructResourceTrees(List<SysDict> dictList, long parentId = 0);
/// <summary>
/// 删除字典
/// </summary>
/// <param name="input">删除参数</param>
/// <returns></returns>
Task Delete(DictDeleteInput input);
/// <summary>
/// 编辑字典
/// </summary>
/// <param name="input">输入参数</param>
/// <returns></returns>
Task Edit(DictAddInput input);
/// <summary>
/// 获取字典
/// </summary>
/// <param name="dictValue">字典</param>
/// <returns></returns>
Task<SysDict> GetDict(string dictValue);
/// <summary>
/// 获取所有
/// </summary>
/// <returns>字典列表</returns>
Task<List<SysDict>> GetListAsync();
/// <summary>
/// 根据字典DictValue获取字典值列表
/// </summary>
/// <param name="dictValue">字典值</param>
/// <param name="devDictList">字典列表</param>
/// <returns>字典值列表</returns>
Task<List<string>> GetValuesByDictValue(string dictValue, List<SysDict> devDictList = null);
/// <summary>
/// 根据字典DictValue列表获取对应字典值列表
/// </summary>
/// <param name="dictValues">字典值列表</param>
/// <returns></returns>
Task<Dictionary<string, List<string>>> GetValuesByDictValue(string[] dictValues);
/// <summary>
/// 字典分页查询
/// </summary>
/// <param name="input">查询参数</param>
/// <returns>字典分页列表</returns>
Task<SqlSugarPagedList<SysDict>> Page(DictPageInput input);
/// <summary>
/// 获取字典树形结构
/// </summary>
/// <param name="input">查询参数</param>
/// <returns>字典树形结构</returns>
Task<List<SysDict>> Tree(DictTreeInput input);
/// <summary>
/// 根据字典值获取子级字典
/// </summary>
/// <param name="dictValue">字典值</param>
/// <returns></returns>
Task<List<SysDict>> GetChildrenByDictValue(string dictValue);
}