Преглед на файлове

😎1、增加腾讯云短信 2、调整logo路径设置 3、升级npm包依赖 4、优化调整代码

zuohuaijun преди 1 година
родител
ревизия
f1291bcbcd

+ 8 - 1
Admin.NET/Admin.NET.Application/Configuration/SMS.json

@@ -5,7 +5,14 @@
     "Aliyun": {
       "AccessKeyId": "",
       "AccessKeySecret": "",
-      "SignName": "AdminNET平台", // 短信签名
+      "SignName": "AdminNET 平台", // 短信签名
+      "TemplateCode": "" // 短信模板
+    },
+    "Tencentyun": {
+      "SdkAppId": "",
+      "AccessKeyId": "",
+      "AccessKeySecret": "",
+      "SignName": "AdminNET 平台", // 短信签名
       "TemplateCode": "" // 短信模板
     }
   }

+ 3 - 2
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -17,7 +17,7 @@
     <PackageReference Include="AngleSharp" Version="1.1.2" />
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.4.0" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
-    <PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.13.15" />
+    <PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.14.0" />
     <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.3.17" />
     <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.3.17" />
     <PackageReference Include="Furion.Pure" Version="4.9.3.17" />
@@ -34,9 +34,10 @@
     <PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.2" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.2.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.4.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.158-preview09" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.158" />
     <PackageReference Include="SSH.NET" Version="2024.0.0" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.4.0" />
+    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1021" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
   </ItemGroup>

+ 10 - 0
Admin.NET/Admin.NET.Core/Option/SMSOptions.cs

@@ -15,11 +15,21 @@ public sealed class SMSOptions : IConfigurableOptions
     /// Aliyun
     /// </summary>
     public SMSSettings Aliyun { get; set; }
+
+    /// <summary>
+    /// Tencentyun
+    /// </summary>
+    public SMSSettings Tencentyun { get; set; }
 }
 
 public sealed class SMSSettings
 {
     /// <summary>
+    /// SdkAppId
+    /// </summary>
+    public string SdkAppId { get; set; }
+
+    /// <summary>
     /// AccessKey ID
     /// </summary>
     public string AccessKeyId { get; set; }

+ 21 - 20
Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs

@@ -13,8 +13,8 @@ namespace Admin.NET.Core.Service;
 public class SysConfigService : IDynamicApiController, ITransient
 {
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysConfig> sysConfigRep_ = null;
     private readonly SysCacheService _sysCacheService;
+    private SimpleClient<SysConfig> sysConfigRep = null;
 
     public SysConfigService(ISqlSugarClient db,
         SysCacheService sysCacheService)
@@ -22,15 +22,16 @@ public class SysConfigService : IDynamicApiController, ITransient
         _db = db;
         _sysCacheService = sysCacheService;
     }
-    public SimpleClient<SysConfig> _sysConfigRep
+
+    public SimpleClient<SysConfig> SysConfigRep
     {
         get
         {
-            if (sysConfigRep_ == null)
-                sysConfigRep_ = _db.GetSimpleClient<SysConfig>();
-            return sysConfigRep_;
+            sysConfigRep ??= _db.GetSimpleClient<SysConfig>();
+            return sysConfigRep;
         }
     }
+
     /// <summary>
     /// 获取参数配置分页列表 🔖
     /// </summary>
@@ -39,7 +40,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取参数配置分页列表")]
     public async Task<SqlSugarPagedList<SysConfig>> Page(PageConfigInput input)
     {
-        return await _sysConfigRep.AsQueryable()
+        return await SysConfigRep.AsQueryable()
             .Where(u => u.GroupCode != "WebConfig") // 不显示 WebConfig 分组
             .WhereIF(!string.IsNullOrWhiteSpace(input.Name?.Trim()), u => u.Name.Contains(input.Name))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Code?.Trim()), u => u.Code.Contains(input.Code))
@@ -55,7 +56,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取参数配置列表")]
     public async Task<List<SysConfig>> GetList()
     {
-        return await _sysConfigRep.GetListAsync();
+        return await SysConfigRep.GetListAsync();
     }
 
     /// <summary>
@@ -67,11 +68,11 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("增加参数配置")]
     public async Task AddConfig(AddConfigInput input)
     {
-        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);
 
-        await _sysConfigRep.InsertAsync(input.Adapt<SysConfig>());
+        await SysConfigRep.InsertAsync(input.Adapt<SysConfig>());
     }
 
     /// <summary>
@@ -83,12 +84,12 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("更新参数配置")]
     public async Task UpdateConfig(UpdateConfigInput input)
     {
-        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);
 
         var config = input.Adapt<SysConfig>();
-        await _sysConfigRep.AsUpdateable(config).IgnoreColumns(true).ExecuteCommandAsync();
+        await SysConfigRep.AsUpdateable(config).IgnoreColumns(true).ExecuteCommandAsync();
 
         _sysCacheService.Remove(config.Code);
     }
@@ -102,11 +103,11 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("删除参数配置")]
     public async Task DeleteConfig(DeleteConfigInput input)
     {
-        var config = await _sysConfigRep.GetFirstAsync(u => u.Id == input.Id);
+        var config = await SysConfigRep.GetFirstAsync(u => u.Id == input.Id);
         if (config.SysFlag == YesNoEnum.Y) // 禁止删除系统参数
             throw Oops.Oh(ErrorCodeEnum.D9001);
 
-        await _sysConfigRep.DeleteAsync(config);
+        await SysConfigRep.DeleteAsync(config);
 
         _sysCacheService.Remove(config.Code);
     }
@@ -122,11 +123,11 @@ public class SysConfigService : IDynamicApiController, ITransient
     {
         foreach (var id in ids)
         {
-            var config = await _sysConfigRep.GetFirstAsync(u => u.Id == id);
+            var config = await SysConfigRep.GetFirstAsync(u => u.Id == id);
             if (config.SysFlag == YesNoEnum.Y) // 禁止删除系统参数
                 continue;
 
-            await _sysConfigRep.DeleteAsync(config);
+            await SysConfigRep.DeleteAsync(config);
 
             _sysCacheService.Remove(config.Code);
         }
@@ -140,7 +141,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取参数配置详情")]
     public async Task<SysConfig> GetDetail([FromQuery] ConfigInput input)
     {
-        return await _sysConfigRep.GetFirstAsync(u => u.Id == input.Id);
+        return await SysConfigRep.GetFirstAsync(u => u.Id == input.Id);
     }
 
     /// <summary>
@@ -156,7 +157,7 @@ public class SysConfigService : IDynamicApiController, ITransient
         var value = _sysCacheService.Get<string>(code);
         if (string.IsNullOrEmpty(value))
         {
-            var config = await _sysConfigRep.GetFirstAsync(u => u.Code == code);
+            var config = await SysConfigRep.GetFirstAsync(u => u.Code == code);
             value = config != null ? config.Value : default;
             _sysCacheService.Set(code, value);
         }
@@ -173,11 +174,11 @@ public class SysConfigService : IDynamicApiController, ITransient
     [NonAction]
     public async Task UpdateConfigValue(string code, string value)
     {
-        var config = await _sysConfigRep.GetFirstAsync(u => u.Code == code);
+        var config = await SysConfigRep.GetFirstAsync(u => u.Code == code);
         if (config == null) return;
 
         config.Value = value;
-        await _sysConfigRep.AsUpdateable(config).ExecuteCommandAsync();
+        await SysConfigRep.AsUpdateable(config).ExecuteCommandAsync();
 
         _sysCacheService.Remove(config.Code);
     }
@@ -189,7 +190,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     [DisplayName("获取分组列表")]
     public async Task<List<string>> GetGroupList()
     {
-        return await _sysConfigRep.AsQueryable()
+        return await SysConfigRep.AsQueryable()
             .Where(u => u.GroupCode != "WebConfig") // 不显示 WebConfig 分组
             .GroupBy(u => u.GroupCode)
             .Select(u => u.GroupCode).ToListAsync();

+ 79 - 2
Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs

@@ -5,6 +5,9 @@
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
 using AlibabaCloud.SDK.Dysmsapi20170525.Models;
+using TencentCloud.Common;
+using TencentCloud.Common.Profile;
+using TencentCloud.Sms.V20190711;
 
 namespace Admin.NET.Core.Service;
 
@@ -34,6 +37,21 @@ public class SysSmsService : IDynamicApiController, ITransient
     [DisplayName("发送短信")]
     public async Task SendSms([Required] string phoneNumber)
     {
+        if (!string.IsNullOrWhiteSpace(_smsOptions.Aliyun.AccessKeyId) && !string.IsNullOrWhiteSpace(_smsOptions.Aliyun.AccessKeySecret))
+            await AliyunSendSms(phoneNumber);
+        else
+            await TencentSendSms(phoneNumber);
+    }
+
+    /// <summary>
+    /// 阿里云发送短信 📨
+    /// </summary>
+    /// <param name="phoneNumber"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("阿里云发送短信")]
+    public async Task AliyunSendSms([Required] string phoneNumber)
+    {
         if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid)
             throw Oops.Oh("请正确填写手机号码");
 
@@ -46,7 +64,7 @@ public class SysSmsService : IDynamicApiController, ITransient
             code = verifyCode
         });
 
-        var client = CreateClient();
+        var client = CreateAliyunClient();
         var sendSmsRequest = new SendSmsRequest
         {
             PhoneNumbers = phoneNumber, // 待发送手机号, 多个以逗号分隔
@@ -70,10 +88,54 @@ public class SysSmsService : IDynamicApiController, ITransient
     }
 
     /// <summary>
+    /// 腾讯云发送短信 📨
+    /// </summary>
+    /// <param name="phoneNumber"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("腾讯云发送短信")]
+    public async Task TencentSendSms([Required] string phoneNumber)
+    {
+        if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid)
+            throw Oops.Oh("请正确填写手机号码");
+
+        // 生成随机验证码
+        var random = new Random();
+        var verifyCode = random.Next(100000, 999999);
+
+        // 实例化要请求产品的client对象,clientProfile是可选的
+        var client = new SmsClient(CreateTencentClient(), "ap-guangzhou", new ClientProfile() { HttpProfile = new HttpProfile() { Endpoint = ("sms.tencentcloudapi.com") } });
+        // 实例化一个请求对象,每个接口都会对应一个request对象
+        var req = new TencentCloud.Sms.V20190711.Models.SendSmsRequest
+        {
+            PhoneNumberSet = new string[] { "+86" + phoneNumber.Trim(',') },
+            SmsSdkAppid = _smsOptions.Tencentyun.SdkAppId,
+            Sign = _smsOptions.Tencentyun.SignName,
+            TemplateID = _smsOptions.Tencentyun.TemplateCode,
+            TemplateParamSet = new string[] { verifyCode.ToString() }
+        };
+
+        // 返回的resp是一个SendSmsResponse的实例,与请求对象对应
+        TencentCloud.Sms.V20190711.Models.SendSmsResponse resp = client.SendSmsSync(req);
+
+        if (resp.SendStatusSet[0].Code == "Ok" && resp.SendStatusSet[0].Message == "send success")
+        {
+            // var bizId = sendSmsResponse.Body.BizId;
+            _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(60));
+        }
+        else
+        {
+            throw Oops.Oh($"短信发送失败:{resp.SendStatusSet[0].Code}-{resp.SendStatusSet[0].Message}");
+        }
+
+        await Task.CompletedTask;
+    }
+
+    /// <summary>
     /// 阿里云短信配置
     /// </summary>
     /// <returns></returns>
-    private AlibabaCloud.SDK.Dysmsapi20170525.Client CreateClient()
+    private AlibabaCloud.SDK.Dysmsapi20170525.Client CreateAliyunClient()
     {
         var config = new AlibabaCloud.OpenApiClient.Models.Config
         {
@@ -83,4 +145,19 @@ public class SysSmsService : IDynamicApiController, ITransient
         };
         return new AlibabaCloud.SDK.Dysmsapi20170525.Client(config);
     }
+
+    /// <summary>
+    /// 腾讯云短信配置
+    /// </summary>
+    /// <returns></returns>
+    private Credential CreateTencentClient()
+    {
+        var cred = new Credential
+        {
+            SecretId = _smsOptions.Tencentyun.AccessKeyId,
+            SecretKey = _smsOptions.Tencentyun.AccessKeySecret
+        };
+
+        return cred;
+    }
 }

+ 12 - 11
Admin.NET/Admin.NET.Core/Service/OnlineUser/SysOnlineUserService.cs

@@ -15,9 +15,9 @@ namespace Admin.NET.Core.Service;
 public class SysOnlineUserService : IDynamicApiController, ITransient
 {
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysOnlineUser> sysOnlineUerRep_ = null;
     private readonly SysConfigService _sysConfigService;
     private readonly IHubContext<OnlineUserHub, IOnlineUserHub> _onlineUserHubContext;
+    private SimpleClient<SysOnlineUser> sysOnlineUerRep = null;
 
     public SysOnlineUserService(ISqlSugarClient db,
         SysConfigService sysConfigService,
@@ -27,15 +27,16 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
         _sysConfigService = sysConfigService;
         _onlineUserHubContext = onlineUserHubContext;
     }
-    public SimpleClient<SysOnlineUser> _sysOnlineUerRep
+
+    public SimpleClient<SysOnlineUser> SysOnlineUerRep
     {
         get
         {
-            if (sysOnlineUerRep_ == null)
-                sysOnlineUerRep_ = _db.GetSimpleClient<SysOnlineUser>();
-            return sysOnlineUerRep_;
+            sysOnlineUerRep ??= _db.GetSimpleClient<SysOnlineUser>();
+            return sysOnlineUerRep;
         }
     }
+
     /// <summary>
     /// 获取在线用户分页列表 🔖
     /// </summary>
@@ -43,7 +44,7 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
     [DisplayName("获取在线用户分页列表")]
     public async Task<SqlSugarPagedList<SysOnlineUser>> Page(PageOnlineUserInput input)
     {
-        return await _sysOnlineUerRep.AsQueryable()
+        return await SysOnlineUerRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.UserName), u => u.UserName.Contains(input.UserName))
             .WhereIF(!string.IsNullOrWhiteSpace(input.RealName), u => u.RealName.Contains(input.RealName))
             .ToPagedListAsync(input.Page, input.PageSize);
@@ -59,7 +60,7 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
     public async Task ForceOffline(SysOnlineUser user)
     {
         await _onlineUserHubContext.Clients.Client(user.ConnectionId).ForceOffline("强制下线");
-        await _sysOnlineUerRep.DeleteAsync(user);
+        await SysOnlineUerRep.DeleteAsync(user);
     }
 
     /// <summary>
@@ -71,8 +72,8 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
     [NonAction]
     public async Task PublicNotice(SysNotice notice, List<long> userIds)
     {
-        var userList = await _sysOnlineUerRep.GetListAsync(u => userIds.Contains(u.UserId));
-        if (!userList.Any()) return;
+        var userList = await SysOnlineUerRep.GetListAsync(u => userIds.Contains(u.UserId));
+        if (userList.Count == 0) return;
 
         foreach (var item in userList)
         {
@@ -89,7 +90,7 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
     {
         if (await _sysConfigService.GetConfigValue<bool>(CommonConst.SysSingleLogin))
         {
-            var users = await _sysOnlineUerRep.GetListAsync(u => u.UserId == userId);
+            var users = await SysOnlineUerRep.GetListAsync(u => u.UserId == userId);
             foreach (var user in users)
             {
                 await ForceOffline(user);
@@ -105,7 +106,7 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
     [NonAction]
     public async Task ForceOffline(long userId)
     {
-        var users = await _sysOnlineUerRep.GetListAsync(u => u.UserId == userId);
+        var users = await SysOnlineUerRep.GetListAsync(u => u.UserId == userId);
         foreach (var user in users)
         {
             await ForceOffline(user);

+ 28 - 27
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -14,11 +14,11 @@ public class SysOrgService : IDynamicApiController, ITransient
 {
     private readonly UserManager _userManager;
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysOrg> sysOrgRep_ = null;
     private readonly SysCacheService _sysCacheService;
     private readonly SysUserExtOrgService _sysUserExtOrgService;
     private readonly SysUserRoleService _sysUserRoleService;
     private readonly SysRoleOrgService _sysRoleOrgService;
+    private SimpleClient<SysOrg> sysOrgRep = null;
 
     public SysOrgService(UserManager userManager,
         ISqlSugarClient db,
@@ -34,15 +34,16 @@ public class SysOrgService : IDynamicApiController, ITransient
         _sysUserRoleService = sysUserRoleService;
         _sysRoleOrgService = sysRoleOrgService;
     }
-    public SimpleClient<SysOrg> _sysOrgRep
+
+    public SimpleClient<SysOrg> SysOrgRep
     {
         get
         {
-            if (sysOrgRep_ == null)
-                sysOrgRep_ = _db.GetSimpleClient<SysOrg>();
-            return sysOrgRep_;
+            sysOrgRep ??= _db.GetSimpleClient<SysOrg>();
+            return sysOrgRep;
         }
     }
+
     /// <summary>
     /// 获取机构列表 🔖
     /// </summary>
@@ -53,7 +54,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         // 获取拥有的机构Id集合
         var userOrgIdList = await GetUserOrgIdList();
 
-        var iSugarQueryable = _sysOrgRep.AsQueryable().OrderBy(u => u.OrderNo);
+        var iSugarQueryable = SysOrgRep.AsQueryable().OrderBy(u => u.OrderNo);
 
         // 带条件筛选时返回列表数据
         if (!string.IsNullOrWhiteSpace(input.Name) || !string.IsNullOrWhiteSpace(input.Code) || !string.IsNullOrWhiteSpace(input.Type))
@@ -77,7 +78,7 @@ public class SysOrgService : IDynamicApiController, ITransient
             HandlerOrgTree(orgTree, userOrgIdList);
         }
 
-        var sysOrg = await _sysOrgRep.GetSingleAsync(u => u.Id == input.Id);
+        var sysOrg = await SysOrgRep.GetSingleAsync(u => u.Id == input.Id);
         if (sysOrg != null)
         {
             sysOrg.Children = orgTree;
@@ -113,7 +114,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         if (!_userManager.SuperAdmin && input.Pid == 0)
             throw Oops.Oh(ErrorCodeEnum.D2009);
 
-        if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code))
+        if (await SysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code))
             throw Oops.Oh(ErrorCodeEnum.D2002);
 
         if (!_userManager.SuperAdmin && input.Pid != 0)
@@ -132,12 +133,12 @@ public class SysOrgService : IDynamicApiController, ITransient
         }
         else
         {
-            var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid);
+            var pOrg = await SysOrgRep.GetFirstAsync(u => u.Id == input.Pid);
             if (pOrg != null)
                 DeleteAllUserOrgCache(pOrg.Id, pOrg.Pid);
         }
 
-        var newOrg = await _sysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync();
+        var newOrg = await SysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync();
         return newOrg.Id;
     }
 
@@ -150,8 +151,8 @@ public class SysOrgService : IDynamicApiController, ITransient
     public async Task BatchAddOrgs(List<SysOrg> orgs)
     {
         DeleteAllUserOrgCache(0, 0);
-        await _sysOrgRep.AsDeleteable().ExecuteCommandAsync();
-        await _sysOrgRep.AsInsertable(orgs).ExecuteCommandAsync();
+        await SysOrgRep.AsDeleteable().ExecuteCommandAsync();
+        await SysOrgRep.AsInsertable(orgs).ExecuteCommandAsync();
     }
 
     /// <summary>
@@ -173,7 +174,7 @@ public class SysOrgService : IDynamicApiController, ITransient
             //_ = pOrg ?? throw Oops.Oh(ErrorCodeEnum.D2000);
 
             // 若父机构发生变化则清空用户机构缓存
-            var sysOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Id);
+            var sysOrg = await SysOrgRep.GetFirstAsync(u => u.Id == input.Id);
             if (sysOrg != null && sysOrg.Pid != input.Pid)
             {
                 // 删除与此机构、新父机构有关的用户机构缓存
@@ -183,7 +184,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         if (input.Id == input.Pid)
             throw Oops.Oh(ErrorCodeEnum.D2001);
 
-        if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id))
+        if (await SysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id))
             throw Oops.Oh(ErrorCodeEnum.D2002);
 
         // 父Id不能为自己的子节点
@@ -199,7 +200,7 @@ public class SysOrgService : IDynamicApiController, ITransient
                 throw Oops.Oh(ErrorCodeEnum.D2003);
         }
 
-        await _sysOrgRep.AsUpdateable(input.Adapt<SysOrg>()).IgnoreColumns(true).ExecuteCommandAsync();
+        await SysOrgRep.AsUpdateable(input.Adapt<SysOrg>()).IgnoreColumns(true).ExecuteCommandAsync();
     }
 
     /// <summary>
@@ -212,7 +213,7 @@ public class SysOrgService : IDynamicApiController, ITransient
     [DisplayName("删除机构")]
     public async Task DeleteOrg(DeleteOrgInput input)
     {
-        var sysOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+        var sysOrg = await SysOrgRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
 
         // 是否有权限操作此机构
         if (!_userManager.SuperAdmin)
@@ -223,13 +224,13 @@ public class SysOrgService : IDynamicApiController, ITransient
         }
 
         // 若机构为租户默认机构禁止删除
-        var isTenantOrg = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysTenant>>()
+        var isTenantOrg = await SysOrgRep.ChangeRepository<SqlSugarRepository<SysTenant>>()
             .IsAnyAsync(u => u.OrgId == input.Id);
         if (isTenantOrg)
             throw Oops.Oh(ErrorCodeEnum.D2008);
 
         // 若机构有用户则禁止删除
-        var orgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
+        var orgHasEmp = await SysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
             .IsAnyAsync(u => u.OrgId == input.Id);
         if (orgHasEmp)
             throw Oops.Oh(ErrorCodeEnum.D2004);
@@ -240,11 +241,11 @@ public class SysOrgService : IDynamicApiController, ITransient
             throw Oops.Oh(ErrorCodeEnum.D2005);
 
         // 若子机构有用户则禁止删除
-        var childOrgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
+        var childOrgTreeList = await SysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
         var childOrgIdList = childOrgTreeList.Select(u => u.Id).ToList();
 
         // 若子机构有用户则禁止删除
-        var cOrgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
+        var cOrgHasEmp = await SysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
             .IsAnyAsync(u => childOrgIdList.Contains(u.OrgId));
         if (cOrgHasEmp)
             throw Oops.Oh(ErrorCodeEnum.D2007);
@@ -253,7 +254,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         DeleteAllUserOrgCache(sysOrg.Id, sysOrg.Pid);
 
         // 级联删除机构子节点
-        await _sysOrgRep.DeleteAsync(u => childOrgIdList.Contains(u.Id));
+        await SysOrgRep.DeleteAsync(u => childOrgIdList.Contains(u.Id));
 
         // 级联删除角色机构数据
         await _sysRoleOrgService.DeleteRoleOrgByOrgIdList(childOrgIdList);
@@ -276,16 +277,16 @@ public class SysOrgService : IDynamicApiController, ITransient
             {
                 var userOrgs = _sysCacheService.Get<List<long>>(userOrgKey);
                 var userId = long.Parse(userOrgKey.Substring(CacheConst.KeyUserOrg));
-                if (userOrgs != null&&(userOrgs.Contains(orgId) || userOrgs.Contains(orgPid)))
+                if (userOrgs != null && (userOrgs.Contains(orgId) || userOrgs.Contains(orgPid)))
                 {
-                    SqlSugarFilter.DeleteUserOrgCache(userId, _sysOrgRep.Context.CurrentConnectionConfig.ConfigId.ToString());
+                    SqlSugarFilter.DeleteUserOrgCache(userId, SysOrgRep.Context.CurrentConnectionConfig.ConfigId.ToString());
                 }
                 if (orgPid == 0)
                 {
                     var dataScope = _sysCacheService.Get<int>($"{CacheConst.KeyRoleMaxDataScope}{userId}");
                     if (dataScope == (int)DataScopeEnum.All)
                     {
-                        SqlSugarFilter.DeleteUserOrgCache(userId, _sysOrgRep.Context.CurrentConnectionConfig.ConfigId.ToString());
+                        SqlSugarFilter.DeleteUserOrgCache(userId, SysOrgRep.Context.CurrentConnectionConfig.ConfigId.ToString());
                     }
                 }
             }
@@ -307,7 +308,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         if (orgIdList == null || orgIdList.Count < 1)
         {
             // 本人创建机构集合
-            var orgList0 = await _sysOrgRep.AsQueryable().Where(u => u.CreateUserId == userId).Select(u => u.Id).ToListAsync();
+            var orgList0 = await SysOrgRep.AsQueryable().Where(u => u.CreateUserId == userId).Select(u => u.Id).ToListAsync();
             // 扩展机构集合
             var orgList1 = await _sysUserExtOrgService.GetUserExtOrgList(userId);
             // 角色机构集合
@@ -393,7 +394,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         // 若数据范围是全部,则获取所有机构Id集合
         if (dataScope == (int)DataScopeEnum.All)
         {
-            orgIdList = await _sysOrgRep.AsQueryable().Select(u => u.Id).ToListAsync();
+            orgIdList = await SysOrgRep.AsQueryable().Select(u => u.Id).ToListAsync();
         }
         // 若数据范围是本部门及以下,则获取本节点和子节点集合
         else if (dataScope == (int)DataScopeEnum.DeptChild)
@@ -416,7 +417,7 @@ public class SysOrgService : IDynamicApiController, ITransient
     [NonAction]
     public async Task<List<long>> GetChildIdListWithSelfById(long pid)
     {
-        var orgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, pid, true);
+        var orgTreeList = await SysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, pid, true);
         return orgTreeList.Select(u => u.Id).ToList();
     }
 }

+ 11 - 10
Admin.NET/Admin.NET.Core/Service/Role/SysRoleOrgService.cs

@@ -12,21 +12,22 @@ namespace Admin.NET.Core.Service;
 public class SysRoleOrgService : ITransient
 {
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysRoleOrg> sysRoleOrgRep_ = null;
+    private SimpleClient<SysRoleOrg> sysRoleOrgRep = null;
 
     public SysRoleOrgService(ISqlSugarClient db)
     {
         _db = db;
     }
-    public SimpleClient<SysRoleOrg> _sysRoleOrgRep
+
+    public SimpleClient<SysRoleOrg> SysRoleOrgRep
     {
         get
         {
-            if (sysRoleOrgRep_ == null)
-                sysRoleOrgRep_ = _db.GetSimpleClient<SysRoleOrg>();
-            return sysRoleOrgRep_;
+            sysRoleOrgRep ??= _db.GetSimpleClient<SysRoleOrg>();
+            return sysRoleOrgRep;
         }
     }
+
     /// <summary>
     /// 授权角色机构
     /// </summary>
@@ -34,7 +35,7 @@ public class SysRoleOrgService : ITransient
     /// <returns></returns>
     public async Task GrantRoleOrg(RoleOrgInput input)
     {
-        await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == input.Id);
+        await SysRoleOrgRep.DeleteAsync(u => u.RoleId == input.Id);
         if (input.DataScope == (int)DataScopeEnum.Define)
         {
             var roleOrgs = input.OrgIdList.Select(u => new SysRoleOrg
@@ -42,7 +43,7 @@ public class SysRoleOrgService : ITransient
                 RoleId = input.Id,
                 OrgId = u
             }).ToList();
-            await _sysRoleOrgRep.InsertRangeAsync(roleOrgs);
+            await SysRoleOrgRep.InsertRangeAsync(roleOrgs);
         }
     }
 
@@ -53,7 +54,7 @@ public class SysRoleOrgService : ITransient
     /// <returns></returns>
     public async Task<List<long>> GetRoleOrgIdList(List<long> roleIdList)
     {
-        return await _sysRoleOrgRep.AsQueryable()
+        return await SysRoleOrgRep.AsQueryable()
             .Where(u => roleIdList.Contains(u.RoleId))
             .Select(u => u.OrgId).ToListAsync();
     }
@@ -65,7 +66,7 @@ public class SysRoleOrgService : ITransient
     /// <returns></returns>
     public async Task DeleteRoleOrgByOrgIdList(List<long> orgIdList)
     {
-        await _sysRoleOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId));
+        await SysRoleOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId));
     }
 
     /// <summary>
@@ -75,6 +76,6 @@ public class SysRoleOrgService : ITransient
     /// <returns></returns>
     public async Task DeleteRoleOrgByRoleId(long roleId)
     {
-        await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == roleId);
+        await SysRoleOrgRep.DeleteAsync(u => u.RoleId == roleId);
     }
 }

+ 13 - 12
Admin.NET/Admin.NET.Core/Service/User/SysUserExtOrgService.cs

@@ -12,21 +12,22 @@ namespace Admin.NET.Core.Service;
 public class SysUserExtOrgService : ITransient
 {
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysUserExtOrg> sysUserExtOrgRep_ = null;
+    private SimpleClient<SysUserExtOrg> sysUserExtOrgRep = null;
 
     public SysUserExtOrgService(ISqlSugarClient db)
     {
         _db = db;
     }
-    public SimpleClient<SysUserExtOrg> _sysUserExtOrgRep
+
+    public SimpleClient<SysUserExtOrg> SysUserExtOrgRep
     {
         get
         {
-            if (sysUserExtOrgRep_ == null)
-                sysUserExtOrgRep_ = _db.GetSimpleClient<SysUserExtOrg>();
-            return sysUserExtOrgRep_;
+            sysUserExtOrgRep ??= _db.GetSimpleClient<SysUserExtOrg>();
+            return sysUserExtOrgRep;
         }
     }
+
     /// <summary>
     /// 获取用户扩展机构集合
     /// </summary>
@@ -34,7 +35,7 @@ public class SysUserExtOrgService : ITransient
     /// <returns></returns>
     public async Task<List<SysUserExtOrg>> GetUserExtOrgList(long userId)
     {
-        return await _sysUserExtOrgRep.GetListAsync(u => u.UserId == userId);
+        return await SysUserExtOrgRep.GetListAsync(u => u.UserId == userId);
     }
 
     /// <summary>
@@ -45,14 +46,14 @@ public class SysUserExtOrgService : ITransient
     /// <returns></returns>
     public async Task UpdateUserExtOrg(long userId, List<SysUserExtOrg> extOrgList)
     {
-        await _sysUserExtOrgRep.DeleteAsync(u => u.UserId == userId);
+        await SysUserExtOrgRep.DeleteAsync(u => u.UserId == userId);
 
         if (extOrgList == null || extOrgList.Count < 1) return;
         extOrgList.ForEach(u =>
         {
             u.UserId = userId;
         });
-        await _sysUserExtOrgRep.InsertRangeAsync(extOrgList);
+        await SysUserExtOrgRep.InsertRangeAsync(extOrgList);
     }
 
     /// <summary>
@@ -62,7 +63,7 @@ public class SysUserExtOrgService : ITransient
     /// <returns></returns>
     public async Task DeleteUserExtOrgByOrgIdList(List<long> orgIdList)
     {
-        await _sysUserExtOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId));
+        await SysUserExtOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId));
     }
 
     /// <summary>
@@ -72,7 +73,7 @@ public class SysUserExtOrgService : ITransient
     /// <returns></returns>
     public async Task DeleteUserExtOrgByUserId(long userId)
     {
-        await _sysUserExtOrgRep.DeleteAsync(u => u.UserId == userId);
+        await SysUserExtOrgRep.DeleteAsync(u => u.UserId == userId);
     }
 
     /// <summary>
@@ -82,7 +83,7 @@ public class SysUserExtOrgService : ITransient
     /// <returns></returns>
     public async Task<bool> HasUserOrg(long orgId)
     {
-        return await _sysUserExtOrgRep.IsAnyAsync(u => u.OrgId == orgId);
+        return await SysUserExtOrgRep.IsAnyAsync(u => u.OrgId == orgId);
     }
 
     /// <summary>
@@ -92,6 +93,6 @@ public class SysUserExtOrgService : ITransient
     /// <returns></returns>
     public async Task<bool> HasUserPos(long posId)
     {
-        return await _sysUserExtOrgRep.IsAnyAsync(u => u.PosId == posId);
+        return await SysUserExtOrgRep.IsAnyAsync(u => u.PosId == posId);
     }
 }

+ 13 - 12
Admin.NET/Admin.NET.Core/Service/User/SysUserLdapService.cs

@@ -12,21 +12,22 @@ namespace Admin.NET.Core.Service;
 public class SysUserLdapService : ITransient
 {
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysUserLdap> sysUserLdapRep_ = null;
+    private SimpleClient<SysUserLdap> sysUserLdapRep = null;
 
     public SysUserLdapService(ISqlSugarClient db)
     {
         _db = db;
     }
-    public SimpleClient<SysUserLdap> _sysUserLdapRep
+
+    public SimpleClient<SysUserLdap> SysUserLdapRep
     {
         get
         {
-            if (sysUserLdapRep_ == null)
-                sysUserLdapRep_ = _db.GetSimpleClient<SysUserLdap>();
-            return sysUserLdapRep_;
+            sysUserLdapRep ??= _db.GetSimpleClient<SysUserLdap>();
+            return sysUserLdapRep;
         }
     }
+
     /// <summary>
     /// 批量插入域账号
     /// </summary>
@@ -35,11 +36,11 @@ public class SysUserLdapService : ITransient
     /// <returns></returns>
     public async Task InsertUserLdaps(long tenantId, List<SysUserLdap> sysUserLdaps)
     {
-        await _sysUserLdapRep.DeleteAsync(u => u.TenantId == tenantId);
+        await SysUserLdapRep.DeleteAsync(u => u.TenantId == tenantId);
 
-        await _sysUserLdapRep.InsertRangeAsync(sysUserLdaps);
+        await SysUserLdapRep.InsertRangeAsync(sysUserLdaps);
 
-        await _sysUserLdapRep.AsUpdateable()
+        await SysUserLdapRep.AsUpdateable()
             .InnerJoin<SysUser>((l, u) => l.EmployeeId == u.Account && u.Status == StatusEnum.Enable && u.IsDelete == false && l.IsDelete == false)
             .SetColumns((l, u) => new SysUserLdap { UserId = u.Id })
             .ExecuteCommandAsync();
@@ -55,12 +56,12 @@ public class SysUserLdapService : ITransient
     /// <returns></returns>
     public async Task AddUserLdap(long tenantId, long userId, string account, string domainAccount)
     {
-        var userLdap = await _sysUserLdapRep.GetFirstAsync(u => u.TenantId == tenantId && u.IsDelete == false && (u.Account == account || u.UserId == userId || u.EmployeeId == domainAccount));
+        var userLdap = await SysUserLdapRep.GetFirstAsync(u => u.TenantId == tenantId && u.IsDelete == false && (u.Account == account || u.UserId == userId || u.EmployeeId == domainAccount));
         if (userLdap != null)
-            await _sysUserLdapRep.DeleteByIdAsync(userLdap.Id);
+            await SysUserLdapRep.DeleteByIdAsync(userLdap.Id);
 
         if (!string.IsNullOrWhiteSpace(domainAccount))
-            await _sysUserLdapRep.InsertAsync(new SysUserLdap { EmployeeId = account, TenantId = tenantId, UserId = userId, Account = domainAccount });
+            await SysUserLdapRep.InsertAsync(new SysUserLdap { EmployeeId = account, TenantId = tenantId, UserId = userId, Account = domainAccount });
     }
 
     /// <summary>
@@ -70,6 +71,6 @@ public class SysUserLdapService : ITransient
     /// <returns></returns>
     public async Task DeleteUserLdapByUserId(long userId)
     {
-        await _sysUserLdapRep.DeleteAsync(u => u.UserId == userId);
+        await SysUserLdapRep.DeleteAsync(u => u.UserId == userId);
     }
 }

+ 14 - 13
Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs

@@ -12,8 +12,8 @@ namespace Admin.NET.Core.Service;
 public class SysUserRoleService : ITransient
 {
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysUserRole> sysUserRoleRep_ = null;
     private readonly SysCacheService _sysCacheService;
+    private SimpleClient<SysUserRole> sysUserRoleRep = null;
 
     public SysUserRoleService(ISqlSugarClient db,
         SysCacheService sysCacheService)
@@ -21,15 +21,16 @@ public class SysUserRoleService : ITransient
         _db = db;
         _sysCacheService = sysCacheService;
     }
-    public SimpleClient<SysUserRole> _sysUserRoleRep
+
+    public SimpleClient<SysUserRole> SysUserRoleRep
     {
         get
         {
-            if (sysUserRoleRep_ == null)
-                sysUserRoleRep_ = _db.GetSimpleClient<SysUserRole>();
-            return sysUserRoleRep_;
+            sysUserRoleRep ??= _db.GetSimpleClient<SysUserRole>();
+            return sysUserRoleRep;
         }
     }
+
     /// <summary>
     /// 授权用户角色
     /// </summary>
@@ -37,7 +38,7 @@ public class SysUserRoleService : ITransient
     /// <returns></returns>
     public async Task GrantUserRole(UserRoleInput input)
     {
-        await _sysUserRoleRep.DeleteAsync(u => u.UserId == input.UserId);
+        await SysUserRoleRep.DeleteAsync(u => u.UserId == input.UserId);
 
         if (input.RoleIdList == null || input.RoleIdList.Count < 1) return;
         var roles = input.RoleIdList.Select(u => new SysUserRole
@@ -45,7 +46,7 @@ public class SysUserRoleService : ITransient
             UserId = input.UserId,
             RoleId = u
         }).ToList();
-        await _sysUserRoleRep.InsertRangeAsync(roles);
+        await SysUserRoleRep.InsertRangeAsync(roles);
         _sysCacheService.Remove(CacheConst.KeyUserButton + input.UserId);
     }
 
@@ -56,7 +57,7 @@ public class SysUserRoleService : ITransient
     /// <returns></returns>
     public async Task DeleteUserRoleByRoleId(long roleId)
     {
-        await _sysUserRoleRep.AsQueryable()
+        await SysUserRoleRep.AsQueryable()
              .Where(u => u.RoleId == roleId)
              .Select(u => u.UserId)
              .ForEachAsync(userId =>
@@ -64,7 +65,7 @@ public class SysUserRoleService : ITransient
                  _sysCacheService.Remove(CacheConst.KeyUserButton + userId);
              });
 
-        await _sysUserRoleRep.DeleteAsync(u => u.RoleId == roleId);
+        await SysUserRoleRep.DeleteAsync(u => u.RoleId == roleId);
     }
 
     /// <summary>
@@ -74,7 +75,7 @@ public class SysUserRoleService : ITransient
     /// <returns></returns>
     public async Task DeleteUserRoleByUserId(long userId)
     {
-        await _sysUserRoleRep.DeleteAsync(u => u.UserId == userId);
+        await SysUserRoleRep.DeleteAsync(u => u.UserId == userId);
         _sysCacheService.Remove(CacheConst.KeyUserButton + userId);
     }
 
@@ -85,7 +86,7 @@ public class SysUserRoleService : ITransient
     /// <returns></returns>
     public async Task<List<SysRole>> GetUserRoleList(long userId)
     {
-        var sysUserRoleList = await _sysUserRoleRep.AsQueryable()
+        var sysUserRoleList = await SysUserRoleRep.AsQueryable()
             .Includes(u => u.SysRole)
             .Where(u => u.UserId == userId).ToListAsync();
         return sysUserRoleList.Where(u => u.SysRole != null).Select(u => u.SysRole).ToList();
@@ -98,7 +99,7 @@ public class SysUserRoleService : ITransient
     /// <returns></returns>
     public async Task<List<long>> GetUserRoleIdList(long userId)
     {
-        return await _sysUserRoleRep.AsQueryable()
+        return await SysUserRoleRep.AsQueryable()
             .Where(u => u.UserId == userId).Select(u => u.RoleId).ToListAsync();
     }
 
@@ -109,7 +110,7 @@ public class SysUserRoleService : ITransient
     /// <returns></returns>
     public async Task<List<long>> GetUserIdList(long roleId)
     {
-        return await _sysUserRoleRep.AsQueryable()
+        return await SysUserRoleRep.AsQueryable()
             .Where(u => u.RoleId == roleId).Select(u => u.UserId).ToListAsync();
     }
 }

+ 23 - 23
Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs

@@ -14,7 +14,6 @@ public class SysUserService : IDynamicApiController, ITransient
 {
     private readonly UserManager _userManager;
     private readonly ISqlSugarClient _db;
-    private SimpleClient<SysUser> sysUserRep_ = null;
     private readonly SysOrgService _sysOrgService;
     private readonly SysUserExtOrgService _sysUserExtOrgService;
     private readonly SysUserRoleService _sysUserRoleService;
@@ -22,6 +21,7 @@ public class SysUserService : IDynamicApiController, ITransient
     private readonly SysOnlineUserService _sysOnlineUserService;
     private readonly SysCacheService _sysCacheService;
     private readonly SysUserLdapService _sysUserLdapService;
+    private SimpleClient<SysUser> sysUserRep = null;
 
     public SysUserService(UserManager userManager,
         ISqlSugarClient db,
@@ -43,13 +43,13 @@ public class SysUserService : IDynamicApiController, ITransient
         _sysCacheService = sysCacheService;
         _sysUserLdapService = sysUserLdapService;
     }
-    public SimpleClient<SysUser> _sysUserRep
+
+    public SimpleClient<SysUser> SysUserRep
     {
         get
         {
-            if (sysUserRep_ == null)
-                sysUserRep_ = _db.GetSimpleClient<SysUser>();
-            return sysUserRep_;
+            sysUserRep ??= _db.GetSimpleClient<SysUser>();
+            return sysUserRep;
         }
     }
 
@@ -74,7 +74,7 @@ public class SysUserService : IDynamicApiController, ITransient
             orgList = _userManager.SuperAdmin ? null : userOrgIdList;
         }
 
-        return await _sysUserRep.AsQueryable()
+        return await SysUserRep.AsQueryable()
             .LeftJoin<SysOrg>((u, a) => u.OrgId == a.Id)
             .LeftJoin<SysPos>((u, a, b) => u.PosId == b.Id)
             .Where(u => u.AccountType != AccountTypeEnum.SuperAdmin)
@@ -103,14 +103,14 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("增加用户")]
     public virtual async Task<long> AddUser(AddUserInput input)
     {
-        var isExist = await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.Account);
+        var isExist = await SysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.Account);
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D1003);
 
         var password = await _sysConfigService.GetConfigValue<string>(CommonConst.SysPassword);
 
         var user = input.Adapt<SysUser>();
         user.Password = CryptogramUtil.Encrypt(password);
-        var newUser = await _sysUserRep.AsInsertable(user).ExecuteReturnEntityAsync();
+        var newUser = await SysUserRep.AsInsertable(user).ExecuteReturnEntityAsync();
 
         input.Id = newUser.Id;
         await UpdateRoleAndExtOrg(input);
@@ -132,19 +132,19 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("更新用户")]
     public virtual async Task UpdateUser(UpdateUserInput input)
     {
-        if (await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.Account && u.Id != input.Id))
+        if (await SysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.Account && u.Id != input.Id))
             throw Oops.Oh(ErrorCodeEnum.D1003);
 
-        await _sysUserRep.AsUpdateable(input.Adapt<SysUser>()).IgnoreColumns(true)
+        await SysUserRep.AsUpdateable(input.Adapt<SysUser>()).IgnoreColumns(true)
             .IgnoreColumns(u => new { u.Password, u.Status }).ExecuteCommandAsync();
 
         await UpdateRoleAndExtOrg(input);
 
         // 删除用户机构缓存
-        SqlSugarFilter.DeleteUserOrgCache(input.Id, _sysUserRep.Context.CurrentConnectionConfig.ConfigId.ToString());
+        SqlSugarFilter.DeleteUserOrgCache(input.Id, SysUserRep.Context.CurrentConnectionConfig.ConfigId.ToString());
 
         // 若账号的角色和组织架构发生变化,则强制下线账号进行权限更新
-        var user = await _sysUserRep.AsQueryable().ClearFilter().FirstAsync(u => u.Id == input.Id);
+        var user = await SysUserRep.AsQueryable().ClearFilter().FirstAsync(u => u.Id == input.Id);
         var roleIds = await GetOwnRoleList(input.Id);
         if (input.OrgId != user.OrgId || !input.RoleIdList.OrderBy(u => u).SequenceEqual(roleIds.OrderBy(u => u)))
             await _sysOnlineUserService.ForceOffline(input.Id);
@@ -174,7 +174,7 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("删除用户")]
     public virtual async Task DeleteUser(DeleteUserInput input)
     {
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await SysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
         if (user.AccountType == AccountTypeEnum.SuperAdmin)
             throw Oops.Oh(ErrorCodeEnum.D1014);
         if (user.Id == _userManager.UserId)
@@ -183,7 +183,7 @@ public class SysUserService : IDynamicApiController, ITransient
         // 强制下线
         await _sysOnlineUserService.ForceOffline(user.Id);
 
-        await _sysUserRep.DeleteAsync(user);
+        await SysUserRep.DeleteAsync(user);
 
         // 删除用户角色
         await _sysUserRoleService.DeleteUserRoleByUserId(input.Id);
@@ -202,7 +202,7 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("查看用户基本信息")]
     public virtual async Task<SysUser> GetBaseInfo()
     {
-        return await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
+        return await SysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
     }
 
     /// <summary>
@@ -213,7 +213,7 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("更新用户基本信息")]
     public virtual async Task<int> UpdateBaseInfo(SysUser user)
     {
-        return await _sysUserRep.AsUpdateable(user)
+        return await SysUserRep.AsUpdateable(user)
             .IgnoreColumns(u => new { u.CreateTime, u.Account, u.Password, u.AccountType, u.OrgId, u.PosId }).ExecuteCommandAsync();
     }
 
@@ -228,7 +228,7 @@ public class SysUserService : IDynamicApiController, ITransient
         if (_userManager.UserId == input.Id)
             throw Oops.Oh(ErrorCodeEnum.D1026);
 
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await SysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
         if (user.AccountType == AccountTypeEnum.SuperAdmin)
             throw Oops.Oh(ErrorCodeEnum.D1015);
 
@@ -250,7 +250,7 @@ public class SysUserService : IDynamicApiController, ITransient
         }
 
         user.Status = input.Status;
-        return await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new { u.Status }).ExecuteCommandAsync();
+        return await SysUserRep.AsUpdateable(user).UpdateColumns(u => new { u.Status }).ExecuteCommandAsync();
     }
 
     /// <summary>
@@ -281,7 +281,7 @@ public class SysUserService : IDynamicApiController, ITransient
         input.PasswordOld = CryptogramUtil.SM2Decrypt(input.PasswordOld);
         input.PasswordNew = CryptogramUtil.SM2Decrypt(input.PasswordNew);
 
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await SysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
         if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
         {
             if (user.Password != MD5Encryption.Encrypt(input.PasswordOld))
@@ -308,7 +308,7 @@ public class SysUserService : IDynamicApiController, ITransient
             user.Password = CryptogramUtil.Encrypt(input.PasswordNew);
         }
 
-        return await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync();
+        return await SysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync();
     }
 
     /// <summary>
@@ -319,10 +319,10 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("重置用户密码")]
     public virtual async Task<string> ResetPwd(ResetPwdUserInput input)
     {
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await SysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
         var password = await _sysConfigService.GetConfigValue<string>(CommonConst.SysPassword);
         user.Password = CryptogramUtil.Encrypt(password);
-        await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync();
+        await SysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync();
 
         // 清空密码错误次数
         var keyErrorPasswordCount = $"{CacheConst.KeyErrorPasswordCount}{user.Account}";
@@ -339,7 +339,7 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("解除登录锁定")]
     public virtual async Task UnlockLogin(UnlockLoginInput input)
     {
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await SysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
 
         // 清空密码错误次数
         var keyErrorPasswordCount = $"{CacheConst.KeyErrorPasswordCount}{user.Account}";

+ 13 - 13
Web/package.json

@@ -29,7 +29,7 @@
 		"echarts": "^5.5.0",
 		"echarts-gl": "^2.0.9",
 		"echarts-wordcloud": "^2.1.0",
-		"element-plus": "^2.7.3",
+		"element-plus": "^2.7.4",
 		"js-cookie": "^3.0.5",
 		"js-table2excel": "^1.1.2",
 		"jsplumb": "^2.15.6",
@@ -51,7 +51,7 @@
 		"vform3-builds": "^3.0.10",
 		"vue": "^3.4.27",
 		"vue-clipboard3": "^2.0.0",
-		"vue-demi": "^0.14.7",
+		"vue-demi": "^0.14.8",
 		"vue-grid-layout": "3.0.0-beta1",
 		"vue-i18n": "^9.13.1",
 		"vue-json-pretty": "^2.4.0",
@@ -65,28 +65,28 @@
 	"devDependencies": {
 		"@plugin-web-update-notification/vite": "^1.7.1",
 		"@types/lodash-es": "^4.17.12",
-		"@types/node": "^20.12.13",
+		"@types/node": "^20.14.2",
 		"@types/nprogress": "^0.2.3",
 		"@types/sortablejs": "^1.15.8",
-		"@typescript-eslint/eslint-plugin": "^7.11.0",
-		"@typescript-eslint/parser": "^7.11.0",
-		"@vitejs/plugin-vue": "^5.0.4",
-		"@vitejs/plugin-vue-jsx": "^3.1.0",
+		"@typescript-eslint/eslint-plugin": "^7.12.0",
+		"@typescript-eslint/parser": "^7.12.0",
+		"@vitejs/plugin-vue": "^5.0.5",
+		"@vitejs/plugin-vue-jsx": "^4.0.0",
 		"@vue/compiler-sfc": "^3.4.27",
-		"code-inspector-plugin": "^0.14.0",
-		"eslint": "^9.3.0",
+		"code-inspector-plugin": "^0.14.1",
+		"eslint": "^9.4.0",
 		"eslint-plugin-vue": "^9.26.0",
 		"less": "^4.2.0",
-		"prettier": "^3.2.5",
+		"prettier": "^3.3.1",
 		"rollup-plugin-visualizer": "^5.12.0",
-		"sass": "^1.77.3",
-		"terser": "^5.31.0",
+		"sass": "^1.77.4",
+		"terser": "^5.31.1",
 		"typescript": "^5.4.5",
 		"vite": "^5.2.12",
 		"vite-plugin-cdn-import": "^1.0.1",
 		"vite-plugin-compression2": "^1.1.1",
 		"vite-plugin-vue-setup-extend-plus": "^0.1.0",
-		"vue-eslint-parser": "^9.4.2"
+		"vue-eslint-parser": "^9.4.3"
 	},
 	"browserslist": [
 		"> 1%",

+ 1 - 0
Web/src/App.vue

@@ -118,6 +118,7 @@ const loadSysInfo = () => {
 
 			const data = res.data.result;
 			// 系统logo
+			data.sysLogo = window.__env__.VITE_API_URL + data.sysLogo;
 			themeConfig.value.logoUrl = data.sysLogo;
 			// 主标题
 			themeConfig.value.globalTitle = data.sysTitle;

+ 168 - 0
Web/src/api-services/apis/sys-sms-api.ts

@@ -25,6 +25,55 @@ export const SysSmsApiAxiosParamCreator = function (configuration?: Configuratio
     return {
         /**
          * 
+         * @summary 阿里云发送短信 📨
+         * @param {string} phoneNumber 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysSmsAliyunSendSmsPhoneNumberPost: async (phoneNumber: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'phoneNumber' is not null or undefined
+            if (phoneNumber === null || phoneNumber === undefined) {
+                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsAliyunSendSmsPhoneNumberPost.');
+            }
+            const localVarPath = `/api/sysSms/aliyunSendSms/{phoneNumber}`
+                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)));
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
+        /**
+         * 
          * @summary 发送短信 📨
          * @param {string} phoneNumber 
          * @param {*} [options] Override http request option.
@@ -72,6 +121,55 @@ export const SysSmsApiAxiosParamCreator = function (configuration?: Configuratio
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 腾讯云发送短信 📨
+         * @param {string} phoneNumber 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysSmsTencentSendSmsPhoneNumberPost: async (phoneNumber: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'phoneNumber' is not null or undefined
+            if (phoneNumber === null || phoneNumber === undefined) {
+                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsTencentSendSmsPhoneNumberPost.');
+            }
+            const localVarPath = `/api/sysSms/tencentSendSms/{phoneNumber}`
+                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)));
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
     }
 };
 
@@ -83,6 +181,20 @@ export const SysSmsApiFp = function(configuration?: Configuration) {
     return {
         /**
          * 
+         * @summary 阿里云发送短信 📨
+         * @param {string} phoneNumber 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
          * @summary 发送短信 📨
          * @param {string} phoneNumber 
          * @param {*} [options] Override http request option.
@@ -95,6 +207,20 @@ export const SysSmsApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 腾讯云发送短信 📨
+         * @param {string} phoneNumber 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
     }
 };
 
@@ -106,6 +232,16 @@ export const SysSmsApiFactory = function (configuration?: Configuration, basePat
     return {
         /**
          * 
+         * @summary 阿里云发送短信 📨
+         * @param {string} phoneNumber 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysSmsApiFp(configuration).apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
          * @summary 发送短信 📨
          * @param {string} phoneNumber 
          * @param {*} [options] Override http request option.
@@ -114,6 +250,16 @@ export const SysSmsApiFactory = function (configuration?: Configuration, basePat
         async apiSysSmsSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
             return SysSmsApiFp(configuration).apiSysSmsSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 腾讯云发送短信 📨
+         * @param {string} phoneNumber 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysSmsApiFp(configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(axios, basePath));
+        },
     };
 };
 
@@ -126,6 +272,17 @@ export const SysSmsApiFactory = function (configuration?: Configuration, basePat
 export class SysSmsApi extends BaseAPI {
     /**
      * 
+     * @summary 阿里云发送短信 📨
+     * @param {string} phoneNumber 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysSmsApi
+     */
+    public async apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysSmsApiFp(this.configuration).apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
      * @summary 发送短信 📨
      * @param {string} phoneNumber 
      * @param {*} [options] Override http request option.
@@ -135,4 +292,15 @@ export class SysSmsApi extends BaseAPI {
     public async apiSysSmsSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
         return SysSmsApiFp(this.configuration).apiSysSmsSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 腾讯云发送短信 📨
+     * @param {string} phoneNumber 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysSmsApi
+     */
+    public async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysSmsApiFp(this.configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(this.axios, this.basePath));
+    }
 }

+ 16 - 0
Web/src/api-services/models/info-save-input.ts

@@ -67,4 +67,20 @@ export interface InfoSaveInput {
      * @memberof InfoSaveInput
      */
     sysCopyright?: string | null;
+
+    /**
+     * ICP备案号
+     *
+     * @type {string}
+     * @memberof InfoSaveInput
+     */
+    sysIcp?: string | null;
+
+    /**
+     * ICP地址
+     *
+     * @type {string}
+     * @memberof InfoSaveInput
+     */
+    sysIcpUrl?: string | null;
 }

+ 2 - 0
Web/src/views/system/infoSetting/index.vue

@@ -116,6 +116,8 @@ const loadData = async () => {
 		if (res.data!.type !== 'success') return;
 
 		const result = res.data.result;
+		result.sysLogo = window.__env__.VITE_API_URL + result.sysLogo;
+
 		state.formData = {
 			sysLogoBlob: undefined,
 			sysLogo: result.sysLogo,