Просмотр исходного кода

😎1、代码格式化 2、升级依赖

zuohuaijun 10 месяцев назад
Родитель
Сommit
1d539c67ea
32 измененных файлов с 573 добавлено и 486 удалено
  1. 14 14
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  2. 1 1
      Admin.NET/Admin.NET.Core/Entity/EntityBase.cs
  3. 2 1
      Admin.NET/Admin.NET.Core/Entity/SysCodeGen.cs
  4. 1 1
      Admin.NET/Admin.NET.Core/Entity/SysTenantConfigData.cs
  5. 1 1
      Admin.NET/Admin.NET.Core/Entity/SysUserConfigData.cs
  6. 1 2
      Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs
  7. 1 2
      Admin.NET/Admin.NET.Core/Extension/RepositoryExtension.cs
  8. 2 1
      Admin.NET/Admin.NET.Core/Option/DbConnectionOptions.cs
  9. 1 1
      Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs
  10. 1 1
      Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableVisual.cs
  11. 42 35
      Admin.NET/Admin.NET.Core/Service/ExtendService/BaiDuTranslationService.cs
  12. 6 1
      Admin.NET/Admin.NET.Core/Service/ExtendService/Models/BaiDuMapResult.cs
  13. 1 1
      Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs
  14. 187 187
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs
  15. 0 2
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs
  16. 192 192
      Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs
  17. 7 1
      Admin.NET/Admin.NET.Core/Update/AutoVersionUpdate.cs
  18. 1 0
      Admin.NET/Admin.NET.Core/Utils/ComputerUtil.cs
  19. 4 3
      Admin.NET/Admin.NET.Core/Utils/FileHelper.cs
  20. 5 5
      Admin.NET/Admin.NET.Test/Admin.NET.Test.csproj
  21. 1 1
      Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj
  22. 6 0
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Entity/DingTalkRoleUser.cs
  23. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Job/SyncDingTalkRoleJob.cs
  24. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleListOutput.cs
  25. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleListResult.cs
  26. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleResult.cs
  27. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleSimplelistOutput.cs
  28. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleSimplelistResult.cs
  29. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/GetDingTalkCurrentRoleListInput.cs
  30. 7 1
      Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/GetDingTalkCurrentRoleSimplelistInput.cs
  31. 2 2
      Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj
  32. 38 23
      Web/package.json

+ 14 - 14
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -14,19 +14,19 @@
 
   <ItemGroup>
     <PackageReference Include="AlibabaCloud.SDK.Dysmsapi20170525" Version="4.0.0" />
-    <PackageReference Include="AlipaySDKNet.Standard" Version="4.9.511" />
+    <PackageReference Include="AlipaySDKNet.Standard" Version="4.9.585" />
     <PackageReference Include="AngleSharp" Version="1.3.0" />
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.4.0" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
-    <PackageReference Include="Elastic.Clients.Elasticsearch" Version="9.0.1" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.59" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.59" />
-    <PackageReference Include="Furion.Pure" Version="4.9.7.59" />
+    <PackageReference Include="Elastic.Clients.Elasticsearch" Version="9.0.4" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.74" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.74" />
+    <PackageReference Include="Furion.Pure" Version="4.9.7.74" />
 	<PackageReference Include="Hardware.Info" Version="101.0.1" />
     <PackageReference Include="Hashids.net" Version="1.7.0" />
     <PackageReference Include="IPTools.China" Version="1.6.0" />
     <PackageReference Include="IPTools.International" Version="1.6.0" />
-    <PackageReference Include="log4net" Version="3.0.4" />
+    <PackageReference Include="log4net" Version="3.1.0" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.2" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.5.2" />
     <PackageReference Include="Magicodes.IE.Word" Version="2.7.5.2" />
@@ -39,17 +39,17 @@
     <PackageReference Include="QRCoder" Version="1.6.0" />
     <PackageReference Include="RabbitMQ.Client" Version="7.1.2" />
     <PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.5" />
-    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.8.0" />
+    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.9.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.12.0" />
     <PackageReference Include="SqlSugarCore" Version="5.1.4.194-preview24" />
     <PackageReference Include="SSH.NET" Version="2025.0.0" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.4" />
     <PackageReference Include="System.Net.Http" Version="4.3.4" />
     <PackageReference Include="System.Private.Uri" Version="4.3.2" />
-    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1232" />
+    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1246" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
-    <PackageReference Include="BouncyCastle.Cryptography" Version="2.6.0" Aliases="BouncyCastleV2" />
+    <PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" Aliases="BouncyCastleV2" />
   </ItemGroup>
 
   <ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
@@ -63,12 +63,12 @@
   </ItemGroup>
 
   <ItemGroup Condition=" '$(TargetFramework)' == 'net9.0' ">
-    <PackageReference Include="AspNet.Security.OAuth.Gitee" Version="9.3.0" />
-    <PackageReference Include="AspNet.Security.OAuth.Weixin" Version="9.3.0" />
+    <PackageReference Include="AspNet.Security.OAuth.Gitee" Version="9.4.0" />
+    <PackageReference Include="AspNet.Security.OAuth.Weixin" Version="9.4.0" />
     <PackageReference Include="Lazy.Captcha.Core" Version="2.1.0" />
-    <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="9.0.4" />
-    <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="9.0.4" />
-    <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.4" />
+    <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="9.0.5" />
+    <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="9.0.5" />
+    <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.5" />
 	<PackageReference Include="Microsoft.PowerShell.SDK" Version="7.5.1" />
   </ItemGroup>
 

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/EntityBase.cs

@@ -186,7 +186,7 @@ public abstract class EntityBaseTenantOrg : EntityBaseOrg, ITenantIdFilter
 /// <summary>
 /// 租户机构实体基类(数据权限、删除标志)
 /// </summary>
-public abstract class EntityBaseTenantOrgDel: EntityBaseOrgDel, ITenantIdFilter
+public abstract class EntityBaseTenantOrgDel : EntityBaseOrgDel, ITenantIdFilter
 {
     /// <summary>
     /// 租户Id

+ 2 - 1
Admin.NET/Admin.NET.Core/Entity/SysCodeGen.cs

@@ -42,6 +42,7 @@ public partial class SysCodeGen : EntityBase
     [SugarColumn(ColumnDescription = "库定位器名", Length = 64)]
     [MaxLength(64)]
     public string? ConfigId { get; set; }
+
     /// <summary>
     /// 库名
     /// </summary>
@@ -62,6 +63,7 @@ public partial class SysCodeGen : EntityBase
             }
         }
     }
+
     /// <summary>
     /// 数据库名(保留字段)
     /// </summary>
@@ -154,5 +156,4 @@ public partial class SysCodeGen : EntityBase
     /// </summary>
     [SugarColumn(IsIgnore = true)]
     public virtual List<TableUniqueConfigItem> TableUniqueList => string.IsNullOrWhiteSpace(TableUniqueConfig) ? null : JSON.Deserialize<List<TableUniqueConfigItem>>(TableUniqueConfig);
-
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/SysTenantConfigData.cs

@@ -26,4 +26,4 @@ public class SysTenantConfigData : EntityBaseTenantId
     [SugarColumn(ColumnDescription = "参数值", Length = 512)]
     [MaxLength(512)]
     public string? Value { get; set; }
-}
+}

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/SysUserConfigData.cs

@@ -32,4 +32,4 @@ public class SysUserConfigData : EntityBaseId
     [SugarColumn(ColumnDescription = "参数值", Length = 512)]
     [MaxLength(512)]
     public string? Value { get; set; }
-}
+}

+ 1 - 2
Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs

@@ -5,7 +5,6 @@
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
 using Newtonsoft.Json;
-using System.Text.Json;
 
 namespace Admin.NET.Core;
 
@@ -70,7 +69,7 @@ public static partial class ObjectExtension
     public static string ToJson(this object obj)
     {
         var jsonSettings = SetNewtonsoftJsonSetting();
-        return JSON.GetJsonSerializer().Serialize(obj,jsonSettings);
+        return JSON.GetJsonSerializer().Serialize(obj, jsonSettings);
     }
 
     private static JsonSerializerSettings SetNewtonsoftJsonSetting()

+ 1 - 2
Admin.NET/Admin.NET.Core/Extension/RepositoryExtension.cs

@@ -399,9 +399,8 @@ public static class RepositoryExtension
             //判断是否是相同属性
             PropertyInfo pro = t.GetType().GetProperty(info.Name);
             var attr = pro.GetCustomAttribute<SugarColumn>();
-            if (pro != null && attr!=null &&!attr.IsPrimaryKey)
+            if (pro != null && attr != null && !attr.IsPrimaryKey)
                 updateColumns.Add(info.Name);
-
         }
         uNOption.UpdateColumns = updateColumns.ToArray();
         return uNOption;

+ 2 - 1
Admin.NET/Admin.NET.Core/Option/DbConnectionOptions.cs

@@ -45,6 +45,7 @@ public sealed class DbConnectionConfig : ConnectionConfig
     /// 数据库名称
     /// </summary>
     public string DbNickName { get; set; }
+
     /// <summary>
     /// 数据库配置
     /// </summary>
@@ -68,7 +69,7 @@ public sealed class DbConnectionConfig : ConnectionConfig
     /// <summary>
     /// 数据库存储目录(仅SqlServer支持指定目录创建)
     /// </summary>
-    public string DatabaseDirectory { get; set; }    
+    public string DatabaseDirectory { get; set; }
 }
 
 /// <summary>

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -51,7 +51,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         return await _db.Queryable<SysCodeGen>()
             .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName.Contains(input.TableName.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.BusName), u => u.BusName.Contains(input.BusName.Trim()))
-            .ToPagedListAsync(input.Page, input.PageSize); 
+            .ToPagedListAsync(input.Page, input.PageSize);
     }
 
     /// <summary>

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableVisual.cs

@@ -10,8 +10,8 @@ public class VisualDb
 {
     public string ConfigId { get; set; }
     public string DbNickName { get; set; }
-
 }
+
 /// <summary>
 /// 库表可视化
 /// </summary>

+ 42 - 35
Admin.NET/Admin.NET.Core/Service/ExtendService/BaiDuTranslationService.cs

@@ -1,3 +1,8 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
 /*
  *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -25,12 +30,12 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
     private readonly IHttpRemoteService _httpRemoteService;
 
     /// <summary>
-    /// 百度翻译appId  
+    /// 百度翻译appId
     /// </summary>
     private static readonly string _appId = "xxxxxxxxxxx";
 
     /// <summary>
-    /// 百度翻译appKey  
+    /// 百度翻译appKey
     /// </summary>
     private static readonly string _appKey = "xxxxxxxxxxx";
 
@@ -42,15 +47,26 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
     // 语言映射字典
     private static readonly Dictionary<string, string> langMap = new Dictionary<string, string>
     {
-        ["en"] = "en", ["de"]     = "de", ["fi"]     = "fin",
-        ["es"] = "spa", ["fr"]    = "fra", ["it"]    = "it",
-        ["ja"] = "jp", ["ko"]     = "kor", ["no"]    = "nor",
-        ["pl"] = "pl", ["pt"]     = "pt", ["ru"]     = "ru",
-        ["th"] = "th", ["id"]     = "id", ["ms"]     = "may",
-        ["vi"] = "vie", ["zh-HK"] = "yue", ["zh-TW"] = "cht"
+        ["en"] = "en",
+        ["de"] = "de",
+        ["fi"] = "fin",
+        ["es"] = "spa",
+        ["fr"] = "fra",
+        ["it"] = "it",
+        ["ja"] = "jp",
+        ["ko"] = "kor",
+        ["no"] = "nor",
+        ["pl"] = "pl",
+        ["pt"] = "pt",
+        ["ru"] = "ru",
+        ["th"] = "th",
+        ["id"] = "id",
+        ["ms"] = "may",
+        ["vi"] = "vie",
+        ["zh-HK"] = "yue",
+        ["zh-TW"] = "cht"
     };
 
-
     /// <summary>
     /// 初始化一个<see cref="BaiDuTranslationService"/>类型的新实例.
     /// </summary>
@@ -60,7 +76,6 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
         _httpRemoteService = httpRemoteService;
     }
 
-
     /// <summary>
     /// 百度在线翻译
     /// </summary>
@@ -94,17 +109,16 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
     /// <returns>翻译后的文本内容</returns>
     [DisplayName("百度在线翻译")]
     [HttpGet]
-    public async Task<BaiDuTranslationResult> Translation([FromQuery] [Required] string from, [FromQuery] [Required] string to, [FromQuery] [Required] string content)
+    public async Task<BaiDuTranslationResult> Translation([FromQuery][Required] string from, [FromQuery][Required] string to, [FromQuery][Required] string content)
     {
         // 标准版API授权只能翻译基础18语言,201种需要企业尊享版支持见百度api 文档
-        Random rd   = new Random();
+        Random rd = new Random();
         string salt = rd.Next(100000).ToString();
         // 改成您的密钥
         string secretKey = _appKey;
-        string sign      = EncryptString(_appId + content + salt + secretKey);
-        string url       = $"{_baseUrl}q={HttpUtility.UrlEncode(content)}&from={from}&to={to}&appid={_appId}&salt={salt}&sign={sign}";
-        var    res       = await _httpRemoteService.GetAsAsync<BaiDuTranslationResult>(url);
-
+        string sign = EncryptString(_appId + content + salt + secretKey);
+        string url = $"{_baseUrl}q={HttpUtility.UrlEncode(content)}&from={from}&to={to}&appid={_appId}&salt={salt}&sign={sign}";
+        var res = await _httpRemoteService.GetAsAsync<BaiDuTranslationResult>(url);
 
         if (!res.error_code.Equals("0"))
         {
@@ -114,7 +128,6 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
         return res;
     }
 
-
 #if DEBUG
 
     /// <summary>
@@ -150,8 +163,7 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
             foreach (var file in files)
             {
                 var langCode = Path.GetFileNameWithoutExtension(file);
-                var langDic  = await ReadLanguageFile(file);
-
+                var langDic = await ReadLanguageFile(file);
 
                 // 查询出没有生成的键值对
 
@@ -159,7 +171,7 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
                 // var notGen = dic.Where(kv => !langDic.ContainsKey(kv.Key)).ToDictionary(kv => kv.Key, kv => kv.Value);
                 // 转换为 HashSet 提升性能
                 var langDicKey = new HashSet<string>(langDic.Keys);
-                var notGen     = dic.Where(kv => !langDicKey.Contains(kv.Key)).ToDictionary(kv => kv.Key, kv => kv.Value);
+                var notGen = dic.Where(kv => !langDicKey.Contains(kv.Key)).ToDictionary(kv => kv.Key, kv => kv.Value);
 
                 // 没有未生成的跳出
                 if (notGen.Count == 0)
@@ -181,7 +193,6 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
 
                         var result = await Translation("zh", targetLang, $"{gen.Value}");
 
-
                         if (!result.error_code.Equals("0"))
                         {
                             continue;
@@ -201,7 +212,7 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
                         {
                             translationValue = translationValue.Replace("'", "\\'");
                         }
-                        
+
                         str += ($"        {gen.Key}: '{translationValue}',{Environment.NewLine}");
                     }
                     catch (Exception e)
@@ -223,7 +234,6 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
         }
     }
 
-
     /// <summary>
     /// 生成前端菜单i18n文件
     /// </summary>
@@ -257,7 +267,7 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
             foreach (var file in files)
             {
                 var langCode = Path.GetFileNameWithoutExtension(file);
-                var langDic  = await ReadLanguageFile(file);
+                var langDic = await ReadLanguageFile(file);
 
                 // 查询出没有生成的键值对
 
@@ -265,7 +275,7 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
                 // var notGen = dic.Where(kv => !langDic.ContainsKey(kv.Key)).ToDictionary(kv => kv.Key, kv => kv.Value);
                 // 转换为 HashSet 提升性能
                 var langDicKey = new HashSet<string>(langDic.Keys);
-                var notGen     = dic.Where(kv => !langDicKey.Contains(kv.Key)).ToDictionary(kv => kv.Key, kv => kv.Value);
+                var notGen = dic.Where(kv => !langDicKey.Contains(kv.Key)).ToDictionary(kv => kv.Key, kv => kv.Value);
 
                 // 没有未生成的跳出
                 if (notGen.Count == 0)
@@ -287,7 +297,6 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
 
                         var result = await Translation("zh", targetLang, $"{gen.Value}");
 
-                        
                         if (!result.error_code.Equals("0"))
                         {
                             continue;
@@ -339,15 +348,15 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
             throw Oops.Bah("【zh-CN.ts】文件未找到");
         }
 
-        var       dic    = new Dictionary<string, string>();
+        var dic = new Dictionary<string, string>();
         using var reader = new StreamReader(baseFile, Encoding.UTF8);
 
         while (await reader.ReadLineAsync() is { } line)
         {
             if (line.Contains('{') || line.Contains('}')) continue;
 
-            var cleanLine                               = line.Trim().TrimEnd(',').Replace("'", "");
-            var parts                                   = cleanLine.Split(new[] { ':' }, 2);
+            var cleanLine = line.Trim().TrimEnd(',').Replace("'", "");
+            var parts = cleanLine.Split(new[] { ':' }, 2);
             if (parts.Length == 2) dic[parts[0].Trim()] = parts[1].Trim();
         }
 
@@ -362,15 +371,15 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
             throw Oops.Bah($"【{filePath.Split('/').Last()}】文件未找到");
         }
 
-        var       dic    = new Dictionary<string, string>();
+        var dic = new Dictionary<string, string>();
         using var reader = new StreamReader(filePath, Encoding.UTF8);
 
         while (await reader.ReadLineAsync() is { } line)
         {
             if (line.Contains('{') || line.Contains('}')) continue;
 
-            var cleanLine                               = line.Trim().TrimEnd(',').Replace("'", "");
-            var parts                                   = cleanLine.Split(new[] { ':' }, 2);
+            var cleanLine = line.Trim().TrimEnd(',').Replace("'", "");
+            var parts = cleanLine.Split(new[] { ':' }, 2);
             if (parts.Length == 2) dic[parts[0].Trim()] = parts[1].Trim();
         }
 
@@ -392,12 +401,10 @@ public class BaiDuTranslationService : IDynamicApiController, ITransient
         Console.ResetColor();
     }
 
-    #endregion
-
+    #endregion 辅助方法
 
 #endif
 
-
     // 计算MD5值
     [NonAction]
     private static string EncryptString(string str)

+ 6 - 1
Admin.NET/Admin.NET.Core/Service/ExtendService/Models/BaiDuMapResult.cs

@@ -1,3 +1,9 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
 namespace Admin.NET.Core;
 
 /// <summary>
@@ -15,7 +21,6 @@ public class BaiDuTranslationResult
     /// </summary>
     public string To { get; set; }
 
-
     /// <summary>
     /// 翻译结果
     /// </summary>

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs

@@ -375,7 +375,7 @@ public class SysJobService : IDynamicApiController, ITransient
     {
         _sysJobTriggerRecordRep.AsSugarClient().DbMaintenance.TruncateTable<SysJobTriggerRecord>();
     }
-    
+
     /// <summary>
     /// 清空不保留的作业触发器运行记录 🔖
     /// </summary>

+ 187 - 187
Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs

@@ -12,191 +12,191 @@ namespace Admin.NET.Core.Service;
 [ApiDescriptionSettings(Order = 230)]
 public class SysWechatService : IDynamicApiController, ITransient
 {
-	private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
-	private readonly SysConfigService _sysConfigService;
-	private readonly WechatApiClientFactory _wechatApiClientFactory;
-	private readonly WechatApiClient _wechatApiClient;
-
-	public SysWechatService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
-		SysConfigService sysConfigService,
-		WechatApiClientFactory wechatApiClientFactory,
-		SysCacheService sysCacheService)
-	{
-		_sysWechatUserRep = sysWechatUserRep;
-		_sysConfigService = sysConfigService;
-		_wechatApiClientFactory = wechatApiClientFactory;
-		_wechatApiClient = wechatApiClientFactory.CreateWechatClient();
-	}
-
-	/// <summary>
-	/// 生成网页授权Url 🔖
-	/// </summary>
-	/// <param name="input"></param>
-	/// <returns></returns>
-	[AllowAnonymous]
-	[DisplayName("生成网页授权Url")]
-	public string GenAuthUrl(GenAuthUrlInput input)
-	{
-		return _wechatApiClient.GenerateParameterizedUrlForConnectOAuth2Authorize(input.RedirectUrl, input.Scope, input.State);
-	}
-
-	/// <summary>
-	/// 获取微信用户OpenId 🔖
-	/// </summary>
-	/// <param name="input"></param>
-	[AllowAnonymous]
-	[DisplayName("获取微信用户OpenId")]
-	public async Task<string> SnsOAuth2([FromQuery] WechatOAuth2Input input)
-	{
-		var reqOAuth2 = new SnsOAuth2AccessTokenRequest()
-		{
-			Code = input.Code,
-		};
-		var resOAuth2 = await _wechatApiClient.ExecuteSnsOAuth2AccessTokenAsync(reqOAuth2);
-		if (resOAuth2.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
-			throw Oops.Oh(resOAuth2.ErrorMessage + " " + resOAuth2.ErrorCode);
-
-		var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resOAuth2.OpenId);
-		if (wxUser == null)
-		{
-			var reqUserInfo = new SnsUserInfoRequest()
-			{
-				OpenId = resOAuth2.OpenId,
-				AccessToken = resOAuth2.AccessToken,
-			};
-			var resUserInfo = await _wechatApiClient.ExecuteSnsUserInfoAsync(reqUserInfo);
-			wxUser = resUserInfo.Adapt<SysWechatUser>();
-			wxUser.Avatar = resUserInfo.HeadImageUrl;
-			wxUser.NickName = resUserInfo.Nickname;
-			wxUser.OpenId = resOAuth2.OpenId;
-			wxUser.UnionId = resOAuth2.UnionId;
-			wxUser.AccessToken = resOAuth2.AccessToken;
-			wxUser.RefreshToken = resOAuth2.RefreshToken;
-			wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync();
-		}
-		else
-		{
-			wxUser.AccessToken = resOAuth2.AccessToken;
-			wxUser.RefreshToken = resOAuth2.RefreshToken;
-			await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
-		}
-
-		return resOAuth2.OpenId;
-	}
-
-	/// <summary>
-	/// 微信用户登录OpenId 🔖
-	/// </summary>
-	/// <param name="input"></param>
-	/// <returns></returns>
-	[AllowAnonymous]
-	[DisplayName("微信用户登录OpenId")]
-	public async Task<dynamic> OpenIdLogin(WechatUserLogin input)
-	{
-		var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
-		if (wxUser == null)
-			throw Oops.Oh("微信用户登录OpenId错误");
-
-		var tokenExpire = await _sysConfigService.GetTokenExpire();
-		return new
-		{
-			wxUser.Avatar,
-			accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
-			{
-				{ ClaimConst.UserId, wxUser.Id },
-				{ ClaimConst.NickName, wxUser.NickName },
-				{ ClaimConst.LoginMode, LoginModeEnum.APP },
-			}, tokenExpire)
-		};
-	}
-
-	/// <summary>
-	/// 获取配置签名参数(wx.config) 🔖
-	/// </summary>
-	/// <returns></returns>
-	[DisplayName("获取配置签名参数(wx.config)")]
-	public async Task<dynamic> GenConfigPara(SignatureInput input)
-	{
-		string ticket = await _wechatApiClientFactory.TryGetWechatJsApiTicketAsync();
-		return _wechatApiClient.GenerateParametersForJSSDKConfig(ticket, input.Url);
-	}
-
-	/// <summary>
-	/// 获取模板列表 🔖
-	/// </summary>
-	[DisplayName("获取模板列表")]
-	public async Task<dynamic> GetMessageTemplateList()
-	{
-		var accessToken = await GetCgibinToken();
-		var reqTemplate = new CgibinTemplateGetAllPrivateTemplateRequest()
-		{
-			AccessToken = accessToken
-		};
-		var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateGetAllPrivateTemplateAsync(reqTemplate);
-		if (resTemplate.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
-			throw Oops.Oh(resTemplate.ErrorMessage + " " + resTemplate.ErrorCode);
-
-		return resTemplate.TemplateList;
-	}
-
-	/// <summary>
-	/// 发送模板消息 🔖
-	/// </summary>
-	/// <param name="input"></param>
-	/// <returns></returns>
-	[DisplayName("发送模板消息")]
-	public async Task<dynamic> SendTemplateMessage(MessageTemplateSendInput input)
-	{
-		var dataInfo = input.Data.ToDictionary(k => k.Key, k => k.Value);
-		var messageData = new Dictionary<string, CgibinMessageTemplateSendRequest.Types.DataItem>();
-		foreach (var item in dataInfo)
-		{
-			messageData.Add(item.Key, new CgibinMessageTemplateSendRequest.Types.DataItem() { Value = "" + item.Value.Value.ToString() + "" });
-		}
-
-		var accessToken = await GetCgibinToken();
-		var reqMessage = new CgibinMessageTemplateSendRequest()
-		{
-			AccessToken = accessToken,
-			TemplateId = input.TemplateId,
-			ToUserOpenId = input.ToUserOpenId,
-			Url = input.Url,
-			MiniProgram = new CgibinMessageTemplateSendRequest.Types.MiniProgram
-			{
-				AppId = _wechatApiClientFactory._wechatOptions.WxOpenAppId,
-				PagePath = input.MiniProgramPagePath,
-			},
-			Data = messageData
-		};
-		var resMessage = await _wechatApiClient.ExecuteCgibinMessageTemplateSendAsync(reqMessage);
-		return resMessage;
-	}
-
-	/// <summary>
-	/// 删除模板 🔖
-	/// </summary>
-	/// <param name="input"></param>
-	/// <returns></returns>
-	[ApiDescriptionSettings(Name = "DeleteMessageTemplate"), HttpPost]
-	[DisplayName("删除模板")]
-	public async Task<dynamic> DeleteMessageTemplate(DeleteMessageTemplateInput input)
-	{
-		var accessToken = await GetCgibinToken();
-		var reqMessage = new CgibinTemplateDeletePrivateTemplateRequest()
-		{
-			AccessToken = accessToken,
-			TemplateId = input.TemplateId
-		};
-		var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateDeletePrivateTemplateAsync(reqMessage);
-		return resTemplate;
-	}
-
-	/// <summary>
-	/// 获取Access_token
-	/// </summary>
-	[NonAction]
-	public async Task<string> GetCgibinToken()
-	{
-		return await _wechatApiClientFactory.TryGetWechatAccessTokenAsync();
-	}
+    private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
+    private readonly SysConfigService _sysConfigService;
+    private readonly WechatApiClientFactory _wechatApiClientFactory;
+    private readonly WechatApiClient _wechatApiClient;
+
+    public SysWechatService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
+        SysConfigService sysConfigService,
+        WechatApiClientFactory wechatApiClientFactory,
+        SysCacheService sysCacheService)
+    {
+        _sysWechatUserRep = sysWechatUserRep;
+        _sysConfigService = sysConfigService;
+        _wechatApiClientFactory = wechatApiClientFactory;
+        _wechatApiClient = wechatApiClientFactory.CreateWechatClient();
+    }
+
+    /// <summary>
+    /// 生成网页授权Url 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("生成网页授权Url")]
+    public string GenAuthUrl(GenAuthUrlInput input)
+    {
+        return _wechatApiClient.GenerateParameterizedUrlForConnectOAuth2Authorize(input.RedirectUrl, input.Scope, input.State);
+    }
+
+    /// <summary>
+    /// 获取微信用户OpenId 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    [AllowAnonymous]
+    [DisplayName("获取微信用户OpenId")]
+    public async Task<string> SnsOAuth2([FromQuery] WechatOAuth2Input input)
+    {
+        var reqOAuth2 = new SnsOAuth2AccessTokenRequest()
+        {
+            Code = input.Code,
+        };
+        var resOAuth2 = await _wechatApiClient.ExecuteSnsOAuth2AccessTokenAsync(reqOAuth2);
+        if (resOAuth2.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+            throw Oops.Oh(resOAuth2.ErrorMessage + " " + resOAuth2.ErrorCode);
+
+        var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resOAuth2.OpenId);
+        if (wxUser == null)
+        {
+            var reqUserInfo = new SnsUserInfoRequest()
+            {
+                OpenId = resOAuth2.OpenId,
+                AccessToken = resOAuth2.AccessToken,
+            };
+            var resUserInfo = await _wechatApiClient.ExecuteSnsUserInfoAsync(reqUserInfo);
+            wxUser = resUserInfo.Adapt<SysWechatUser>();
+            wxUser.Avatar = resUserInfo.HeadImageUrl;
+            wxUser.NickName = resUserInfo.Nickname;
+            wxUser.OpenId = resOAuth2.OpenId;
+            wxUser.UnionId = resOAuth2.UnionId;
+            wxUser.AccessToken = resOAuth2.AccessToken;
+            wxUser.RefreshToken = resOAuth2.RefreshToken;
+            wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync();
+        }
+        else
+        {
+            wxUser.AccessToken = resOAuth2.AccessToken;
+            wxUser.RefreshToken = resOAuth2.RefreshToken;
+            await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
+        }
+
+        return resOAuth2.OpenId;
+    }
+
+    /// <summary>
+    /// 微信用户登录OpenId 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("微信用户登录OpenId")]
+    public async Task<dynamic> OpenIdLogin(WechatUserLogin input)
+    {
+        var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
+        if (wxUser == null)
+            throw Oops.Oh("微信用户登录OpenId错误");
+
+        var tokenExpire = await _sysConfigService.GetTokenExpire();
+        return new
+        {
+            wxUser.Avatar,
+            accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
+            {
+                { ClaimConst.UserId, wxUser.Id },
+                { ClaimConst.NickName, wxUser.NickName },
+                { ClaimConst.LoginMode, LoginModeEnum.APP },
+            }, tokenExpire)
+        };
+    }
+
+    /// <summary>
+    /// 获取配置签名参数(wx.config) 🔖
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("获取配置签名参数(wx.config)")]
+    public async Task<dynamic> GenConfigPara(SignatureInput input)
+    {
+        string ticket = await _wechatApiClientFactory.TryGetWechatJsApiTicketAsync();
+        return _wechatApiClient.GenerateParametersForJSSDKConfig(ticket, input.Url);
+    }
+
+    /// <summary>
+    /// 获取模板列表 🔖
+    /// </summary>
+    [DisplayName("获取模板列表")]
+    public async Task<dynamic> GetMessageTemplateList()
+    {
+        var accessToken = await GetCgibinToken();
+        var reqTemplate = new CgibinTemplateGetAllPrivateTemplateRequest()
+        {
+            AccessToken = accessToken
+        };
+        var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateGetAllPrivateTemplateAsync(reqTemplate);
+        if (resTemplate.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+            throw Oops.Oh(resTemplate.ErrorMessage + " " + resTemplate.ErrorCode);
+
+        return resTemplate.TemplateList;
+    }
+
+    /// <summary>
+    /// 发送模板消息 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("发送模板消息")]
+    public async Task<dynamic> SendTemplateMessage(MessageTemplateSendInput input)
+    {
+        var dataInfo = input.Data.ToDictionary(k => k.Key, k => k.Value);
+        var messageData = new Dictionary<string, CgibinMessageTemplateSendRequest.Types.DataItem>();
+        foreach (var item in dataInfo)
+        {
+            messageData.Add(item.Key, new CgibinMessageTemplateSendRequest.Types.DataItem() { Value = "" + item.Value.Value.ToString() + "" });
+        }
+
+        var accessToken = await GetCgibinToken();
+        var reqMessage = new CgibinMessageTemplateSendRequest()
+        {
+            AccessToken = accessToken,
+            TemplateId = input.TemplateId,
+            ToUserOpenId = input.ToUserOpenId,
+            Url = input.Url,
+            MiniProgram = new CgibinMessageTemplateSendRequest.Types.MiniProgram
+            {
+                AppId = _wechatApiClientFactory._wechatOptions.WxOpenAppId,
+                PagePath = input.MiniProgramPagePath,
+            },
+            Data = messageData
+        };
+        var resMessage = await _wechatApiClient.ExecuteCgibinMessageTemplateSendAsync(reqMessage);
+        return resMessage;
+    }
+
+    /// <summary>
+    /// 删除模板 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "DeleteMessageTemplate"), HttpPost]
+    [DisplayName("删除模板")]
+    public async Task<dynamic> DeleteMessageTemplate(DeleteMessageTemplateInput input)
+    {
+        var accessToken = await GetCgibinToken();
+        var reqMessage = new CgibinTemplateDeletePrivateTemplateRequest()
+        {
+            AccessToken = accessToken,
+            TemplateId = input.TemplateId
+        };
+        var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateDeletePrivateTemplateAsync(reqMessage);
+        return resTemplate;
+    }
+
+    /// <summary>
+    /// 获取Access_token
+    /// </summary>
+    [NonAction]
+    public async Task<string> GetCgibinToken()
+    {
+        return await _wechatApiClientFactory.TryGetWechatAccessTokenAsync();
+    }
 }

+ 0 - 2
Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs

@@ -353,8 +353,6 @@ public class SysWxOpenService : IDynamicApiController, ITransient
             AccessToken = accessToken,
             Width = input.Width,
             PagePath = input.PagePath,
-
-
         };
         var response = await _wechatApiClient.ExecuteWxaGetWxaCodeAsync(request);
 

+ 192 - 192
Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs

@@ -13,196 +13,196 @@ namespace Admin.NET.Core.Service;
 /// </summary>
 public partial class WechatApiClientFactory : ISingleton
 {
-	private readonly IHttpClientFactory _httpClientFactory;
-	public readonly WechatOptions _wechatOptions;
-	private readonly SysCacheService _sysCacheService;
-
-	public WechatApiClientFactory(IHttpClientFactory httpClientFactory, IOptions<WechatOptions> wechatOptions, SysCacheService sysCacheService)
-	{
-		_httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
-		_wechatOptions = wechatOptions.Value ?? throw new ArgumentNullException(nameof(wechatOptions));
-		_sysCacheService = sysCacheService;
-	}
-
-	/// <summary>
-	/// 微信公众号
-	/// </summary>
-	/// <returns></returns>
-	public WechatApiClient CreateWechatClient()
-	{
-		if (string.IsNullOrEmpty(_wechatOptions.WechatAppId) || string.IsNullOrEmpty(_wechatOptions.WechatAppSecret))
-			throw Oops.Oh("微信公众号配置错误");
-
-		var client = WechatApiClientBuilder.Create(new WechatApiClientOptions()
-		{
-			AppId = _wechatOptions.WechatAppId,
-			AppSecret = _wechatOptions.WechatAppSecret,
-			PushToken = _wechatOptions.WechatToken,
-			PushEncodingAESKey = _wechatOptions.WechatEncodingAESKey,
-		})
-		.UseHttpClient(_httpClientFactory.CreateClient(), disposeClient: false) // 设置 HttpClient 不随客户端一同销毁
-		.Build();
-
-		client.Configure(config =>
-		{
-			JsonSerializerSettings jsonSerializerSettings = NewtonsoftJsonSerializer.GetDefaultSerializerSettings();
-			jsonSerializerSettings.Formatting = Formatting.Indented;
-			config.JsonSerializer = new NewtonsoftJsonSerializer(jsonSerializerSettings); // 指定 System.Text.Json JSON序列化
-																						  // config.JsonSerializer = new SystemTextJsonSerializer(jsonSerializerOptions); // 指定 Newtonsoft.Json  JSON序列化
-		});
-
-		return client;
-	}
-
-	/// <summary>
-	/// 微信小程序
-	/// </summary>
-	/// <returns></returns>
-	public WechatApiClient CreateWxOpenClient()
-	{
-		if (string.IsNullOrEmpty(_wechatOptions.WxOpenAppId) || string.IsNullOrEmpty(_wechatOptions.WxOpenAppSecret))
-			throw Oops.Oh("微信小程序配置错误");
-
-		var client = WechatApiClientBuilder.Create(new WechatApiClientOptions()
-		{
-			AppId = _wechatOptions.WxOpenAppId,
-			AppSecret = _wechatOptions.WxOpenAppSecret,
-			PushToken = _wechatOptions.WxToken,
-			PushEncodingAESKey = _wechatOptions.WxEncodingAESKey,
-		})
-		.UseHttpClient(_httpClientFactory.CreateClient(), disposeClient: false) // 设置 HttpClient 不随客户端一同销毁
-		.Build();
-
-		client.Configure(config =>
-		{
-			JsonSerializerSettings jsonSerializerSettings = NewtonsoftJsonSerializer.GetDefaultSerializerSettings();
-			jsonSerializerSettings.Formatting = Formatting.Indented;
-			config.JsonSerializer = new NewtonsoftJsonSerializer(jsonSerializerSettings); // 指定 System.Text.Json JSON序列化
-																						  // config.JsonSerializer = new SystemTextJsonSerializer(jsonSerializerOptions); // 指定 Newtonsoft.Json  JSON序列化
-		});
-
-		return client;
-	}
-
-	/// <summary>
-	/// 获取微信公众号AccessToken
-	/// </summary>
-	/// <returns></returns>
-	public async Task<string> TryGetWechatAccessTokenAsync()
-	{
-		if (!_sysCacheService.ExistKey($"WxAccessToken_{_wechatOptions.WechatAppId}") || string.IsNullOrEmpty(_sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WechatAppId}")))
-		{
-			var client = CreateWechatClient();
-			var reqCgibinToken = new CgibinTokenRequest();
-			var resCgibinToken = await client.ExecuteCgibinTokenAsync(reqCgibinToken);
-			if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
-				throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
-			_sysCacheService.Set($"WxAccessToken_{_wechatOptions.WechatAppId}", resCgibinToken.AccessToken, TimeSpan.FromSeconds(resCgibinToken.ExpiresIn - 60));
-		}
-
-		return _sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WechatAppId}");
-	}
-
-	/// <summary>
-	/// 获取微信小程序AccessToken
-	/// </summary>
-	/// <returns></returns>
-	public async Task<string> TryGetWxOpenAccessTokenAsync()
-	{
-		if (!_sysCacheService.ExistKey($"WxAccessToken_{_wechatOptions.WxOpenAppId}") || string.IsNullOrEmpty(_sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WxOpenAppId}")))
-		{
-			var client = CreateWxOpenClient();
-			var reqCgibinToken = new CgibinTokenRequest();
-			var resCgibinToken = await client.ExecuteCgibinTokenAsync(reqCgibinToken);
-			if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
-				throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
-			_sysCacheService.Set($"WxAccessToken_{_wechatOptions.WxOpenAppId}", resCgibinToken.AccessToken, TimeSpan.FromSeconds(resCgibinToken.ExpiresIn - 60));
-		}
-
-		return _sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WxOpenAppId}");
-	}
-
-	/// <summary>
-	/// 检查微信公众号AccessToken
-	/// </summary>
-	/// <returns></returns>
-	public async Task CheckWechatAccessTokenAsync()
-	{
-		if (string.IsNullOrEmpty(_wechatOptions.WechatAppId) || string.IsNullOrEmpty(_wechatOptions.WechatAppSecret)) return;
-
-		var req = new CgibinOpenApiQuotaGetRequest
-		{
-			AccessToken = await TryGetWechatAccessTokenAsync(),
-			CgiPath = "/cgi-bin/token"
-		};
-		var client = CreateWechatClient();
-		var res = await client.ExecuteCgibinOpenApiQuotaGetAsync(req);
-
-		var originColor = Console.ForegroundColor;
-		if (res.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
-		{
-			_sysCacheService.Remove($"WxAccessToken_{_wechatOptions.WechatAppId}");
-			Console.ForegroundColor = ConsoleColor.Red;
-			Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信公众号令牌 无效");
-		}
-		else
-		{
-			Console.ForegroundColor = ConsoleColor.Magenta;
-			Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信公众号令牌 有效");
-		}
-		Console.ForegroundColor = originColor;
-	}
-
-	/// <summary>
-	/// 检查微信小程序AccessToken
-	/// </summary>
-	/// <returns></returns>
-	public async Task CheckWxOpenAccessTokenAsync()
-	{
-		if (string.IsNullOrEmpty(_wechatOptions.WxOpenAppId) || string.IsNullOrEmpty(_wechatOptions.WxOpenAppSecret)) return;
-
-		var req = new CgibinOpenApiQuotaGetRequest
-		{
-			AccessToken = await TryGetWxOpenAccessTokenAsync(),
-			CgiPath = "/cgi-bin/token"
-		};
-		var client = CreateWxOpenClient();
-		var res = await client.ExecuteCgibinOpenApiQuotaGetAsync(req);
-
-		var originColor = Console.ForegroundColor;
-		if (res.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
-		{
-			_sysCacheService.Remove($"WxAccessToken_{_wechatOptions.WxOpenAppId}");
-			Console.ForegroundColor = ConsoleColor.Red;
-			Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信小程序令牌 无效");
-		}
-		else
-		{
-			Console.ForegroundColor = ConsoleColor.Magenta;
-			Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信小程序令牌 有效");
-		}
-		Console.ForegroundColor = originColor;
-	}
-
-	/// <summary>
-	/// 获取微信JS接口临时票据jsapi_ticket
-	/// </summary>
-	/// <returns></returns>
-	public async Task<string> TryGetWechatJsApiTicketAsync()
-	{
-		if (!_sysCacheService.ExistKey($"WxJsApiTicket_{_wechatOptions.WechatAppId}") || string.IsNullOrEmpty(_sysCacheService.Get<string>($"WxJsApiTicket_{_wechatOptions.WechatAppId}")))
-		{
-			var accessToken = await TryGetWechatAccessTokenAsync();
-			var client = CreateWechatClient();
-			var request = new CgibinTicketGetTicketRequest()
-			{
-				AccessToken = accessToken
-			};
-			var response = await client.ExecuteCgibinTicketGetTicketAsync(request);
-			if (!response.IsSuccessful())
-				throw Oops.Oh(response.ErrorMessage + " " + response.ErrorCode);
-			_sysCacheService.Set($"WxJsApiTicket_{_wechatOptions.WechatAppId}", response.Ticket, TimeSpan.FromSeconds(response.ExpiresIn - 60));
-		}
-		return _sysCacheService.Get<string>($"WxJsApiTicket_{_wechatOptions.WechatAppId}");
-	}
+    private readonly IHttpClientFactory _httpClientFactory;
+    public readonly WechatOptions _wechatOptions;
+    private readonly SysCacheService _sysCacheService;
+
+    public WechatApiClientFactory(IHttpClientFactory httpClientFactory, IOptions<WechatOptions> wechatOptions, SysCacheService sysCacheService)
+    {
+        _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
+        _wechatOptions = wechatOptions.Value ?? throw new ArgumentNullException(nameof(wechatOptions));
+        _sysCacheService = sysCacheService;
+    }
+
+    /// <summary>
+    /// 微信公众号
+    /// </summary>
+    /// <returns></returns>
+    public WechatApiClient CreateWechatClient()
+    {
+        if (string.IsNullOrEmpty(_wechatOptions.WechatAppId) || string.IsNullOrEmpty(_wechatOptions.WechatAppSecret))
+            throw Oops.Oh("微信公众号配置错误");
+
+        var client = WechatApiClientBuilder.Create(new WechatApiClientOptions()
+        {
+            AppId = _wechatOptions.WechatAppId,
+            AppSecret = _wechatOptions.WechatAppSecret,
+            PushToken = _wechatOptions.WechatToken,
+            PushEncodingAESKey = _wechatOptions.WechatEncodingAESKey,
+        })
+        .UseHttpClient(_httpClientFactory.CreateClient(), disposeClient: false) // 设置 HttpClient 不随客户端一同销毁
+        .Build();
+
+        client.Configure(config =>
+        {
+            JsonSerializerSettings jsonSerializerSettings = NewtonsoftJsonSerializer.GetDefaultSerializerSettings();
+            jsonSerializerSettings.Formatting = Formatting.Indented;
+            config.JsonSerializer = new NewtonsoftJsonSerializer(jsonSerializerSettings); // 指定 System.Text.Json JSON序列化
+                                                                                          // config.JsonSerializer = new SystemTextJsonSerializer(jsonSerializerOptions); // 指定 Newtonsoft.Json  JSON序列化
+        });
+
+        return client;
+    }
+
+    /// <summary>
+    /// 微信小程序
+    /// </summary>
+    /// <returns></returns>
+    public WechatApiClient CreateWxOpenClient()
+    {
+        if (string.IsNullOrEmpty(_wechatOptions.WxOpenAppId) || string.IsNullOrEmpty(_wechatOptions.WxOpenAppSecret))
+            throw Oops.Oh("微信小程序配置错误");
+
+        var client = WechatApiClientBuilder.Create(new WechatApiClientOptions()
+        {
+            AppId = _wechatOptions.WxOpenAppId,
+            AppSecret = _wechatOptions.WxOpenAppSecret,
+            PushToken = _wechatOptions.WxToken,
+            PushEncodingAESKey = _wechatOptions.WxEncodingAESKey,
+        })
+        .UseHttpClient(_httpClientFactory.CreateClient(), disposeClient: false) // 设置 HttpClient 不随客户端一同销毁
+        .Build();
+
+        client.Configure(config =>
+        {
+            JsonSerializerSettings jsonSerializerSettings = NewtonsoftJsonSerializer.GetDefaultSerializerSettings();
+            jsonSerializerSettings.Formatting = Formatting.Indented;
+            config.JsonSerializer = new NewtonsoftJsonSerializer(jsonSerializerSettings); // 指定 System.Text.Json JSON序列化
+                                                                                          // config.JsonSerializer = new SystemTextJsonSerializer(jsonSerializerOptions); // 指定 Newtonsoft.Json  JSON序列化
+        });
+
+        return client;
+    }
+
+    /// <summary>
+    /// 获取微信公众号AccessToken
+    /// </summary>
+    /// <returns></returns>
+    public async Task<string> TryGetWechatAccessTokenAsync()
+    {
+        if (!_sysCacheService.ExistKey($"WxAccessToken_{_wechatOptions.WechatAppId}") || string.IsNullOrEmpty(_sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WechatAppId}")))
+        {
+            var client = CreateWechatClient();
+            var reqCgibinToken = new CgibinTokenRequest();
+            var resCgibinToken = await client.ExecuteCgibinTokenAsync(reqCgibinToken);
+            if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+                throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
+            _sysCacheService.Set($"WxAccessToken_{_wechatOptions.WechatAppId}", resCgibinToken.AccessToken, TimeSpan.FromSeconds(resCgibinToken.ExpiresIn - 60));
+        }
+
+        return _sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WechatAppId}");
+    }
+
+    /// <summary>
+    /// 获取微信小程序AccessToken
+    /// </summary>
+    /// <returns></returns>
+    public async Task<string> TryGetWxOpenAccessTokenAsync()
+    {
+        if (!_sysCacheService.ExistKey($"WxAccessToken_{_wechatOptions.WxOpenAppId}") || string.IsNullOrEmpty(_sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WxOpenAppId}")))
+        {
+            var client = CreateWxOpenClient();
+            var reqCgibinToken = new CgibinTokenRequest();
+            var resCgibinToken = await client.ExecuteCgibinTokenAsync(reqCgibinToken);
+            if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+                throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
+            _sysCacheService.Set($"WxAccessToken_{_wechatOptions.WxOpenAppId}", resCgibinToken.AccessToken, TimeSpan.FromSeconds(resCgibinToken.ExpiresIn - 60));
+        }
+
+        return _sysCacheService.Get<string>($"WxAccessToken_{_wechatOptions.WxOpenAppId}");
+    }
+
+    /// <summary>
+    /// 检查微信公众号AccessToken
+    /// </summary>
+    /// <returns></returns>
+    public async Task CheckWechatAccessTokenAsync()
+    {
+        if (string.IsNullOrEmpty(_wechatOptions.WechatAppId) || string.IsNullOrEmpty(_wechatOptions.WechatAppSecret)) return;
+
+        var req = new CgibinOpenApiQuotaGetRequest
+        {
+            AccessToken = await TryGetWechatAccessTokenAsync(),
+            CgiPath = "/cgi-bin/token"
+        };
+        var client = CreateWechatClient();
+        var res = await client.ExecuteCgibinOpenApiQuotaGetAsync(req);
+
+        var originColor = Console.ForegroundColor;
+        if (res.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+        {
+            _sysCacheService.Remove($"WxAccessToken_{_wechatOptions.WechatAppId}");
+            Console.ForegroundColor = ConsoleColor.Red;
+            Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信公众号令牌 无效");
+        }
+        else
+        {
+            Console.ForegroundColor = ConsoleColor.Magenta;
+            Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信公众号令牌 有效");
+        }
+        Console.ForegroundColor = originColor;
+    }
+
+    /// <summary>
+    /// 检查微信小程序AccessToken
+    /// </summary>
+    /// <returns></returns>
+    public async Task CheckWxOpenAccessTokenAsync()
+    {
+        if (string.IsNullOrEmpty(_wechatOptions.WxOpenAppId) || string.IsNullOrEmpty(_wechatOptions.WxOpenAppSecret)) return;
+
+        var req = new CgibinOpenApiQuotaGetRequest
+        {
+            AccessToken = await TryGetWxOpenAccessTokenAsync(),
+            CgiPath = "/cgi-bin/token"
+        };
+        var client = CreateWxOpenClient();
+        var res = await client.ExecuteCgibinOpenApiQuotaGetAsync(req);
+
+        var originColor = Console.ForegroundColor;
+        if (res.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+        {
+            _sysCacheService.Remove($"WxAccessToken_{_wechatOptions.WxOpenAppId}");
+            Console.ForegroundColor = ConsoleColor.Red;
+            Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信小程序令牌 无效");
+        }
+        else
+        {
+            Console.ForegroundColor = ConsoleColor.Magenta;
+            Console.WriteLine("【" + DateTime.Now + "】" + _wechatOptions.WxOpenAppId + " 微信小程序令牌 有效");
+        }
+        Console.ForegroundColor = originColor;
+    }
+
+    /// <summary>
+    /// 获取微信JS接口临时票据jsapi_ticket
+    /// </summary>
+    /// <returns></returns>
+    public async Task<string> TryGetWechatJsApiTicketAsync()
+    {
+        if (!_sysCacheService.ExistKey($"WxJsApiTicket_{_wechatOptions.WechatAppId}") || string.IsNullOrEmpty(_sysCacheService.Get<string>($"WxJsApiTicket_{_wechatOptions.WechatAppId}")))
+        {
+            var accessToken = await TryGetWechatAccessTokenAsync();
+            var client = CreateWechatClient();
+            var request = new CgibinTicketGetTicketRequest()
+            {
+                AccessToken = accessToken
+            };
+            var response = await client.ExecuteCgibinTicketGetTicketAsync(request);
+            if (!response.IsSuccessful())
+                throw Oops.Oh(response.ErrorMessage + " " + response.ErrorCode);
+            _sysCacheService.Set($"WxJsApiTicket_{_wechatOptions.WechatAppId}", response.Ticket, TimeSpan.FromSeconds(response.ExpiresIn - 60));
+        }
+        return _sysCacheService.Get<string>($"WxJsApiTicket_{_wechatOptions.WechatAppId}");
+    }
 }

+ 7 - 1
Admin.NET/Admin.NET.Core/Update/AutoVersionUpdate.cs

@@ -1,4 +1,10 @@
-#if NET9_0_OR_GREATER
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+#if NET9_0_OR_GREATER
 
 using Microsoft.AspNetCore.Builder;
 using XiHan.Framework.Utils.Logging;

+ 1 - 0
Admin.NET/Admin.NET.Core/Utils/ComputerUtil.cs

@@ -282,6 +282,7 @@ public class MemoryMetrics
     /// CPU使用率%
     /// </summary>
     public List<string> CpuRates { get; set; }
+
     public string CpuRate { get; set; }
 
     /// <summary>

+ 4 - 3
Admin.NET/Admin.NET.Core/Utils/FileHelper.cs

@@ -62,6 +62,7 @@ public static class FileHelper
             CopyDirectory(directory, dest, overwrite);
         }
     }
+
     /// <summary>
     /// 在文件倒数第lastIndex个identifier前插入内容(备份原文件)
     /// </summary>
@@ -73,7 +74,7 @@ public static class FileHelper
     public static async Task InsertsStringAtSpecifiedLocationInFile(string filePath, string insertContent, char identifier, int lastIndex, bool createBackup = false)
     {
         // 参数校验
-        if (lastIndex  < 1) throw new ArgumentOutOfRangeException(nameof(lastIndex));
+        if (lastIndex < 1) throw new ArgumentOutOfRangeException(nameof(lastIndex));
         if (identifier == 0) throw new ArgumentException("标识符不能为空字符");
 
         if (!File.Exists(filePath))
@@ -86,8 +87,8 @@ public static class FileHelper
             File.Copy(filePath, backupPath, true);
         }
 
-        using var reader  = new StreamReader(filePath, Encoding.UTF8);
-        var       content = await reader.ReadToEndAsync();
+        using var reader = new StreamReader(filePath, Encoding.UTF8);
+        var content = await reader.ReadToEndAsync();
         reader.Close();
         // 逆向查找算法
         int index = content.LastIndexOf(identifier);

+ 5 - 5
Admin.NET/Admin.NET.Test/Admin.NET.Test.csproj

@@ -12,11 +12,11 @@
     </PropertyGroup>
 
     <ItemGroup>
-      <PackageReference Include="Furion.Xunit" Version="4.9.7.59" />
-      <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
-      <PackageReference Include="Selenium.Support" Version="4.32.0" />
-      <PackageReference Include="Selenium.WebDriver" Version="4.32.0" />
-      <PackageReference Include="Selenium.WebDriver.MSEdgeDriver" Version="136.0.3240.50" />
+      <PackageReference Include="Furion.Xunit" Version="4.9.7.74" />
+      <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
+      <PackageReference Include="Selenium.Support" Version="4.33.0" />
+      <PackageReference Include="Selenium.WebDriver" Version="4.33.0" />
+      <PackageReference Include="Selenium.WebDriver.MSEdgeDriver" Version="136.0.3240.76" />
       <PackageReference Include="xunit.assert" Version="2.9.3" />
     </ItemGroup>
 

+ 1 - 1
Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj

@@ -11,7 +11,7 @@
 
   <ItemGroup>
     <PackageReference Include="IGeekFan.AspNetCore.Knife4jUI" Version="0.0.16" />
-    <PackageReference Include="System.Security.Cryptography.Pkcs" Version="9.0.4" />
+    <PackageReference Include="System.Security.Cryptography.Pkcs" Version="9.0.5" />
   </ItemGroup>
 
   <ItemGroup>

+ 6 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Entity/DingTalkRoleUser.cs

@@ -1,3 +1,9 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
 namespace Admin.NET.Plugin.DingTalk;
 
 /// <summary>

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Job/SyncDingTalkRoleJob.cs

@@ -1,4 +1,10 @@
-using Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+using Admin.NET.Plugin.DingTalk;
 using Furion.Schedule;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleListOutput.cs

@@ -1,4 +1,10 @@
-namespace Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Plugin.DingTalk;
 
 public class DingTalkRoleListOutput
 {

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleListResult.cs

@@ -1,4 +1,10 @@
-namespace Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Plugin.DingTalk;
 
 public class DingTalkRoleListResult
 {

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleResult.cs

@@ -1,4 +1,10 @@
-namespace Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Plugin.DingTalk;
 
 public class DingTalkRoleResult
 {

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleSimplelistOutput.cs

@@ -1,4 +1,10 @@
-namespace Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Plugin.DingTalk;
 
 public class DingTalkRoleSimplelistOutput
 {

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleSimplelistResult.cs

@@ -1,4 +1,10 @@
-namespace Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Plugin.DingTalk;
 
 public class DingTalkRoleSimplelistResult
 {

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/GetDingTalkCurrentRoleListInput.cs

@@ -1,4 +1,10 @@
-namespace Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Plugin.DingTalk;
 
 public class GetDingTalkCurrentRoleListInput
 {

+ 7 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/GetDingTalkCurrentRoleSimplelistInput.cs

@@ -1,4 +1,10 @@
-namespace Admin.NET.Plugin.DingTalk;
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Plugin.DingTalk;
 
 public class GetDingTalkCurrentRoleSimplelistInput
 {

+ 2 - 2
Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj

@@ -25,8 +25,8 @@
 
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="3.3.0" />
-    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.13.0" />
-    <PackageReference Include="Rezero.Api" Version="1.8.12" />
+    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.14.0" />
+    <PackageReference Include="Rezero.Api" Version="1.8.20" />
   </ItemGroup>
 
   <ItemGroup>

+ 38 - 23
Web/package.json

@@ -2,7 +2,7 @@
 	"name": "admin.net",
 	"type": "module",
 	"version": "2.4.33",
-	"lastBuildTime": "2025.05.04",
+	"lastBuildTime": "2025.05.25",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
 	"author": "zuohuaijun",
 	"license": "MIT",
@@ -19,12 +19,12 @@
 	"dependencies": {
 		"@element-plus/icons-vue": "^2.3.1",
 		"@logicflow/core": "^2.0.13",
-		"@logicflow/extension": "^2.0.17",
+		"@logicflow/extension": "^2.0.18",
 		"@microsoft/signalr": "^8.0.7",
 		"@vue-office/docx": "^1.6.3",
 		"@vue-office/excel": "^1.7.14",
 		"@vue-office/pdf": "^2.0.10",
-		"@vueuse/core": "^13.1.0",
+		"@vueuse/core": "^13.2.0",
 		"@wangeditor/editor": "^5.1.23",
 		"@wangeditor/editor-for-vue": "^5.1.12",
 		"animate.css": "^4.1.1",
@@ -35,17 +35,17 @@
 		"echarts": "^5.6.0",
 		"echarts-gl": "^2.0.9",
 		"echarts-wordcloud": "^2.1.0",
-		"element-plus": "^2.9.9",
+		"element-plus": "^2.9.11",
 		"ezuikit-js": "^8.1.9-beta.3",
 		"js-cookie": "^3.0.5",
 		"js-table2excel": "^1.1.2",
 		"json-editor-vue": "^0.18.1",
 		"jsplumb": "^2.15.6",
 		"lodash-es": "^4.17.21",
-		"md-editor-v3": "^5.5.0",
+		"md-editor-v3": "^5.6.0",
 		"mitt": "^3.0.1",
 		"monaco-editor": "^0.52.2",
-		"mqtt": "^5.12.0",
+		"mqtt": "^5.13.0",
 		"nprogress": "^0.2.0",
 		"pinia": "^3.0.2",
 		"print-js": "^1.6.0",
@@ -56,15 +56,15 @@
 		"screenfull": "^6.0.2",
 		"sm-crypto-v2": "^1.11.0",
 		"sortablejs": "^1.15.6",
-		"splitpanes": "^4.0.3",
+		"splitpanes": "^4.0.4",
 		"vcrontab-3": "^3.3.22",
 		"vform3-builds": "^3.0.10",
-		"vue": "^3.5.13",
+		"vue": "^3.5.14",
 		"vue-clipboard3": "^2.0.0",
 		"vue-demi": "^0.14.10",
 		"vue-draggable-plus": "^0.6.0",
 		"vue-grid-layout": "3.0.0-beta1",
-		"vue-i18n": "^11.1.3",
+		"vue-i18n": "^11.1.4",
 		"vue-json-pretty": "^2.4.0",
 		"vue-plugin-hiprint": "^0.0.60",
 		"vue-router": "^4.5.1",
@@ -74,40 +74,55 @@
 	},
 	"devDependencies": {
 		"@eslint/eslintrc": "^3.3.1",
-		"@eslint/js": "^9.26.0",
+		"@eslint/js": "^9.27.0",
 		"@plugin-web-update-notification/vite": "^2.0.0",
 		"@types/lodash-es": "^4.17.12",
-		"@types/node": "^22.15.3",
+		"@types/node": "^22.15.21",
 		"@types/nprogress": "^0.2.3",
 		"@types/sortablejs": "^1.15.8",
-		"@typescript-eslint/eslint-plugin": "^8.32.0",
-		"@typescript-eslint/parser": "^8.32.0",
-		"@vitejs/plugin-vue": "^5.2.3",
-		"@vitejs/plugin-vue-jsx": "^4.1.2",
-		"@vue/compiler-sfc": "^3.5.13",
+		"@typescript-eslint/eslint-plugin": "^8.32.1",
+		"@typescript-eslint/parser": "^8.32.1",
+		"@vitejs/plugin-vue": "^5.2.4",
+		"@vitejs/plugin-vue-jsx": "^4.2.0",
+		"@vue/compiler-sfc": "^3.5.14",
 		"code-inspector-plugin": "^0.20.10",
-		"eslint": "^9.26.0",
+		"eslint": "^9.27.0",
 		"eslint-plugin-vue": "^10.1.0",
 		"globals": "^16.1.0",
 		"less": "^4.3.0",
 		"prettier": "^3.5.3",
-		"rollup-plugin-visualizer": "^5.14.0",
-		"sass": "^1.87.0",
-		"terser": "^5.39.0",
+		"rollup-plugin-visualizer": "^6.0.0",
+		"sass": "^1.89.0",
+		"terser": "^5.39.2",
 		"typescript": "^5.8.3",
-		"vite": "^6.3.4",
+		"vite": "^6.3.5",
 		"vite-plugin-cdn-import": "^1.0.1",
-		"vite-plugin-compression2": "^1.3.3",
+		"vite-plugin-compression2": "^1.4.0",
 		"vite-plugin-vue-setup-extend": "^0.4.0",
 		"vue-eslint-parser": "^10.1.3"
 	},
+	"pnpm": {
+		"onlyBuiltDependencies": [
+			"@vue-office/docx",
+			"@vue-office/excel",
+			"@vue-office/pdf"
+		],
+		"ignoredBuiltDependencies": [
+			"@parcel/watcher",
+			"core-js",
+			"es5-ext",
+			"esbuild",
+			"json-editor-vue",
+			"vue-demi"
+		]
+	},
 	"browserslist": [
 		"> 1%",
 		"last 2 versions",
 		"not dead"
 	],
 	"engines": {
-		"node": ">=16.0.0",
+		"node": ">=18.0.0",
 		"npm": ">= 7.0.0"
 	},
 	"keywords": [