From 5eb1587e4d1a75953afb179ddfffe5c41ad75dac Mon Sep 17 00:00:00 2001 From: zuohuaijun Date: Thu, 15 May 2025 00:25:13 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=98=8E1=E3=80=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=9B=B8=E5=85=B3=20=202=E3=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=B8=8A=E4=BC=A0=E5=A4=B4=E5=83=8F=E5=92=8C=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=20=203=E3=80=81=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin.NET.Core/Admin.NET.Core.csproj | 16 +++++----- .../Job/WechatAccessTokenCheckJob.cs | 31 ------------------- .../Service/File/SysFileService.cs | 4 +-- .../Service/Wechat/SysWechatService.cs | 21 ++----------- .../Service/Wechat/SysWxOpenService.cs | 8 ++--- .../Service/Wechat/WechatApiHttpClient.cs | 2 +- .../Admin.NET.Web.Core.csproj | 2 +- .../Admin.NET.Plugin.ReZero.csproj | 2 +- Web/package.json | 16 +++++----- Web/src/views/system/onlineUser/signalR.ts | 3 +- 10 files changed, 27 insertions(+), 78 deletions(-) delete mode 100644 Admin.NET/Admin.NET.Core/Job/WechatAccessTokenCheckJob.cs diff --git a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj index 038d92d7..2a9910d0 100644 --- a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj +++ b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj @@ -28,14 +28,14 @@ - - - + + + - + @@ -56,7 +56,7 @@ - + @@ -76,9 +76,9 @@ - - - + + + diff --git a/Admin.NET/Admin.NET.Core/Job/WechatAccessTokenCheckJob.cs b/Admin.NET/Admin.NET.Core/Job/WechatAccessTokenCheckJob.cs deleted file mode 100644 index 70528980..00000000 --- a/Admin.NET/Admin.NET.Core/Job/WechatAccessTokenCheckJob.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -namespace Admin.NET.Core; - -/// -/// 微信AccessToken有效性检查作业任务 -/// -[JobDetail("job_WechatAccessTokenCheckJob", Description = "微信AccessToken有效性检查", GroupName = "default", Concurrent = false)] -[PeriodSeconds(60, TriggerId = "trigger_WechatAccessTokenCheckJob", Description = "微信AccessToken有效性检查", RunOnStart = true)] -public class WechatAccessTokenCheckJob : IJob -{ - private readonly IServiceScopeFactory _scopeFactory; - - public WechatAccessTokenCheckJob(IServiceScopeFactory scopeFactory) - { - _scopeFactory = scopeFactory; - } - - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) - { - using var serviceScope = _scopeFactory.CreateScope(); - - var wechatApiClientFactory = serviceScope.ServiceProvider.GetService(); - await wechatApiClientFactory.CheckWechatAccessTokenAsync(); - await wechatApiClientFactory.CheckWxOpenAccessTokenAsync(); - } -} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs b/Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs index 8fce845b..36e70802 100644 --- a/Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs +++ b/Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs @@ -310,13 +310,13 @@ public class SysFileService : IDynamicApiController, ITransient var sysUserRep = _sysFileRep.ChangeRepository>(); var user = await sysUserRep.GetByIdAsync(_userManager.UserId); + await sysUserRep.UpdateAsync(u => new SysUser() { Avatar = sysFile.Url }, u => u.Id == user.Id); // 删除已有头像文件 if (!string.IsNullOrWhiteSpace(user.Avatar)) { var fileId = Path.GetFileNameWithoutExtension(user.Avatar); await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) }); } - await sysUserRep.UpdateAsync(u => new SysUser() { Avatar = sysFile.Url }, u => u.Id == user.Id); return sysFile; } @@ -332,13 +332,13 @@ public class SysFileService : IDynamicApiController, ITransient var sysUserRep = _sysFileRep.ChangeRepository>(); var user = await sysUserRep.GetByIdAsync(_userManager.UserId); + await sysUserRep.UpdateAsync(u => new SysUser() { Signature = sysFile.Url }, u => u.Id == user.Id); // 删除已有电子签名文件 if (!string.IsNullOrWhiteSpace(user.Signature) && user.Signature.EndsWith(".png")) { var fileId = Path.GetFileNameWithoutExtension(user.Signature); await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) }); } - await sysUserRep.UpdateAsync(u => new SysUser() { Signature = sysFile.Url }, u => u.Id == user.Id); return sysFile; } diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs index 4711501b..f8ae94f1 100644 --- a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs @@ -16,18 +16,15 @@ public class SysWechatService : IDynamicApiController, ITransient private readonly SysConfigService _sysConfigService; private readonly WechatApiClientFactory _wechatApiClientFactory; private readonly WechatApiClient _wechatApiClient; - private readonly SysCacheService _sysCacheService; public SysWechatService(SqlSugarRepository sysOAuthUserRep, SysConfigService sysConfigService, - WechatApiClientFactory wechatApiClientFactory, - SysCacheService sysCacheService) + WechatApiClientFactory wechatApiClientFactory) { _sysOAuthUserRep = sysOAuthUserRep; _sysConfigService = sysConfigService; _wechatApiClientFactory = wechatApiClientFactory; _wechatApiClient = wechatApiClientFactory.CreateWechatClient(); - _sysCacheService = sysCacheService; } /// @@ -198,20 +195,6 @@ public class SysWechatService : IDynamicApiController, ITransient /// private async Task GetCgibinToken() { - // 先从缓存中取 AccessToken - var wx_accessToken = _sysCacheService.Get("sys_wx_accessToken"); - if (!string.IsNullOrWhiteSpace(wx_accessToken)) - { - return wx_accessToken; - } - - // 若缓存没有则从微信公众号重新获取 AccessToken - var reqCgibinToken = new CgibinTokenRequest(); - var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken); - if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功) - throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode); - - _sysCacheService.Set("sys_wx_accessToken", resCgibinToken.AccessToken, TimeSpan.FromSeconds(resCgibinToken.ExpiresIn)); // 缓存 AccessToken - return resCgibinToken.AccessToken; + return await _wechatApiClientFactory.TryGetWechatAccessTokenAsync(); } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs index 6be91517..ce0678f7 100644 --- a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs @@ -16,6 +16,7 @@ public class SysWxOpenService : IDynamicApiController, ITransient private readonly SysConfigService _sysConfigService; private readonly WechatApiClient _wechatApiClient; private readonly SysFileService _sysFileService; + private readonly WechatApiClientFactory _wechatApiClientFactory; public SysWxOpenService(SqlSugarRepository sysOAuthUserRep, SysConfigService sysConfigService, @@ -26,6 +27,7 @@ public class SysWxOpenService : IDynamicApiController, ITransient _sysConfigService = sysConfigService; _wechatApiClient = wechatApiClientFactory.CreateWxOpenClient(); _sysFileService = sysFileService; + _wechatApiClientFactory = wechatApiClientFactory; } /// @@ -416,10 +418,6 @@ public class SysWxOpenService : IDynamicApiController, ITransient /// private async Task GetCgibinToken() { - var reqCgibinToken = new CgibinTokenRequest(); - var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken); - if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功) - throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode); - return resCgibinToken.AccessToken; + return await _wechatApiClientFactory.TryGetWxOpenAccessTokenAsync(); } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs index cb7bb696..d7c77054 100644 --- a/Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs @@ -132,7 +132,7 @@ public partial class WechatApiClientFactory : ISingleton var req = new CgibinOpenApiQuotaGetRequest { - AccessToken = await TryGetWxOpenAccessTokenAsync(), + AccessToken = await TryGetWechatAccessTokenAsync(), CgiPath = "/cgi-bin/token" }; var client = CreateWechatClient(); diff --git a/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj index de625f1e..9b526235 100644 --- a/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj +++ b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj @@ -12,7 +12,7 @@ - + diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj index aebf3b39..51b64004 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj @@ -26,7 +26,7 @@ - + diff --git a/Web/package.json b/Web/package.json index b7489885..8f0bebfe 100644 --- a/Web/package.json +++ b/Web/package.json @@ -2,7 +2,7 @@ "name": "admin.net.pro", "type": "module", "version": "2.4.33", - "lastBuildTime": "2025.05.12", + "lastBuildTime": "2025.05.15", "description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架", "author": "zuohuaijun", "license": "MIT", @@ -25,7 +25,7 @@ "@vue-office/docx": "^1.6.2", "@vue-office/excel": "^1.7.14", "@vue-office/pdf": "^2.0.9", - "@vueuse/core": "^13.1.0", + "@vueuse/core": "^13.2.0", "@vxe-ui/plugin-export-xlsx": "^4.2.1", "@vxe-ui/plugin-render-element": "^4.0.11", "@wangeditor/editor": "^5.1.23", @@ -80,8 +80,8 @@ "vue-signature-pad": "^3.0.2", "vue3-flag-icons": "^0.0.3", "vue3-tree-org": "^4.2.2", - "vxe-pc-ui": "^4.6.4", - "vxe-table": "^4.13.25", + "vxe-pc-ui": "^4.6.8", + "vxe-table": "^4.13.28", "xe-utils": "^3.7.4", "xlsx-js-style": "^1.2.0" }, @@ -89,11 +89,11 @@ "@iconify/vue": "^5.0.0", "@plugin-web-update-notification/vite": "^2.0.0", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.17.46", + "@types/node": "^20.17.47", "@types/nprogress": "^0.2.3", "@types/sortablejs": "^1.15.8", - "@typescript-eslint/eslint-plugin": "^8.32.0", - "@typescript-eslint/parser": "^8.32.0", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", "@vitejs/plugin-vue": "^5.2.4", "@vitejs/plugin-vue-jsx": "^4.1.2", "@vue/compiler-sfc": "^3.5.13", @@ -106,7 +106,7 @@ "prettier": "^3.5.3", "rollup-plugin-visualizer": "^5.14.0", "sass": "^1.88.0", - "terser": "^5.39.0", + "terser": "^5.39.1", "typescript": "^5.8.3", "vite": "^6.3.5", "vite-plugin-cdn-import": "^1.0.1", diff --git a/Web/src/views/system/onlineUser/signalR.ts b/Web/src/views/system/onlineUser/signalR.ts index c9f1699a..fe9e33f4 100644 --- a/Web/src/views/system/onlineUser/signalR.ts +++ b/Web/src/views/system/onlineUser/signalR.ts @@ -41,9 +41,8 @@ connection.onreconnecting(() => { connection.onreconnected(() => { console.log('重连成功'); }); - +// 用户列表 connection.on('OnlineUserList', () => {}); - // 接收消息 connection.on('ReceiveMessage', (message: any) => { var tmpMsg = `
${message.message}

`;