From b01b8b24ba574c08ba5605e103ff2ccf15e5830a Mon Sep 17 00:00:00 2001 From: nsnail Date: Wed, 29 May 2024 14:40:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20=E6=A1=86=E6=9E=B6=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=90=8C=E6=AD=A5=20(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- assets/seed-data/Sys_Menu.json | 2 +- assets/seed-data/Sys_RoleApi.json | 20 ++++++++++ build/code.quality.props | 2 +- .../NetAdmin.AdmServer.Tests.csproj | 2 +- .../Services/RedLockerService.cs | 29 ++++++++++++++ .../DataValidation/MobileAttribute.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs | 4 ++ .../NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs | 16 ++++++++ .../DbMaps/Sys/Sys_JobRecord.cs | 16 ++++++++ .../DbMaps/Sys/Sys_RequestLog.cs | 40 ++++++++++++++++++- .../NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs | 4 ++ .../NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs | 12 ++++++ .../NetAdmin.Domain/DbMaps/Sys/Sys_User.cs | 4 ++ .../DbMaps/Sys/Sys_VerifyCode.cs | 4 ++ .../Dto/Sys/User/CheckMobileAvailableReq.cs | 2 +- .../NetAdmin.Domain/NetAdmin.Domain.csproj | 3 ++ .../Middlewares/RequestAuditMiddleware.cs | 7 +++- .../NetAdmin.Infrastructure.csproj | 1 + .../Services/Sys/UserService.cs | 8 ++-- .../NetAdmin.Tests/NetAdmin.Tests.csproj | 4 +- src/frontend/admin/package.json | 18 ++++----- src/frontend/admin/src/assets/icons/Email.vue | 7 ++++ .../admin/src/assets/icons/MailCode.vue | 13 ++++++ .../admin/src/assets/icons/Mobile.vue | 7 ++++ .../admin/src/assets/icons/SmsCode.vue | 23 ++++++----- src/frontend/admin/src/assets/icons/index.js | 7 +++- .../admin/src/components/scTable/index.vue | 2 +- src/frontend/admin/src/config/iconSelect.js | 2 +- .../src/views/home/widgets/components/ver.vue | 2 - 29 files changed, 223 insertions(+), 40 deletions(-) create mode 100644 src/backend/NetAdmin.Application/Services/RedLockerService.cs create mode 100644 src/frontend/admin/src/assets/icons/Email.vue create mode 100644 src/frontend/admin/src/assets/icons/MailCode.vue create mode 100644 src/frontend/admin/src/assets/icons/Mobile.vue diff --git a/assets/seed-data/Sys_Menu.json b/assets/seed-data/Sys_Menu.json index 210b0238..8de79b03 100644 --- a/assets/seed-data/Sys_Menu.json +++ b/assets/seed-data/Sys_Menu.json @@ -6,7 +6,7 @@ "Id": 373837717815301, "Name": "home", "Path": "/home", - "Sort": 100, + "Sort": 999, "Title": "主控面板", "Type": 1 }, diff --git a/assets/seed-data/Sys_RoleApi.json b/assets/seed-data/Sys_RoleApi.json index 41e8e8ac..ff017513 100644 --- a/assets/seed-data/Sys_RoleApi.json +++ b/assets/seed-data/Sys_RoleApi.json @@ -14,5 +14,25 @@ { "ApiId": "api/sys/user", "RoleId": 371729946431493 + }, + { + "ApiId": "api/sys/site.msg/unread.count", + "RoleId": 371729946431493, + }, + { + "ApiId": "api/sys/site.msg", + "RoleId": 371729946431493, + }, + { + "ApiId": "api/sys/site.msg/get.mine", + "RoleId": 371729946431493, + }, + { + "ApiId": "api/sys/site.msg/paged.query.mine", + "RoleId": 371729946431493, + }, + { + "ApiId": "api/sys/site.msg/set.site.msg.status", + "RoleId": 371729946431493, } ] \ No newline at end of file diff --git a/build/code.quality.props b/build/code.quality.props index 0960b406..bdb6e183 100644 --- a/build/code.quality.props +++ b/build/code.quality.props @@ -23,7 +23,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/backend/NetAdmin.AdmServer.Tests/NetAdmin.AdmServer.Tests.csproj b/src/backend/NetAdmin.AdmServer.Tests/NetAdmin.AdmServer.Tests.csproj index 0fa6cfde..aeb8f972 100644 --- a/src/backend/NetAdmin.AdmServer.Tests/NetAdmin.AdmServer.Tests.csproj +++ b/src/backend/NetAdmin.AdmServer.Tests/NetAdmin.AdmServer.Tests.csproj @@ -4,6 +4,6 @@ - + \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/Services/RedLockerService.cs b/src/backend/NetAdmin.Application/Services/RedLockerService.cs new file mode 100644 index 00000000..59a3336b --- /dev/null +++ b/src/backend/NetAdmin.Application/Services/RedLockerService.cs @@ -0,0 +1,29 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Domain.DbMaps.Dependency; +using RedLockNet; + +namespace NetAdmin.Application.Services; + +/// +/// RedLocker Service Base +/// +public abstract class RedLockerService(DefaultRepository rpo, RedLocker redLocker) + : RepositoryService(rpo) + where T1 : EntityBase +{ + /// + /// 获取锁 + /// + /// NetAdminGetLockerException + protected async Task GetLockerAsync(string lockName) + { + // 加锁 + var redLock = await redLocker.RedLockFactory.CreateLockAsync( // + lockName, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_EXPIRY) + , TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_WAIT) + , TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_RETRY)) + .ConfigureAwait(false); + + return redLock.IsAcquired ? redLock : throw new NetAdminGetLockerException(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs index 80b056d9..0f9e85b0 100644 --- a/src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs @@ -12,7 +12,7 @@ public sealed class MobileAttribute : RegexAttribute public MobileAttribute() // : base(Chars.RGX_MOBILE) { - ErrorMessageResourceName = nameof(Ln.手机号码不正确); + ErrorMessageResourceName = nameof(Ln.手机号不正确); ErrorMessageResourceType = typeof(Ln); } } \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs index a5246585..4117c689 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs @@ -61,7 +61,11 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort /// /// 部门描述 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Summary { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs index ee9d9ac6..5bad6d10 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs @@ -68,21 +68,33 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary /// /// 请求体 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string RequestBody { get; init; } /// /// 请求头 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string RequestHeader { get; init; } /// /// 请求的网络地址 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string RequestUrl { get; init; } @@ -94,7 +106,11 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary public virtual JobStatues Status { get; init; } /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Summary { get; init; } diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs index a2368452..21896848 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_JobRecord.cs @@ -48,14 +48,22 @@ public record Sys_JobRecord : LiteImmutableEntity /// /// 请求体 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string RequestBody { get; init; } /// /// 请求头 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string RequestHeader { get; init; } @@ -69,14 +77,22 @@ public record Sys_JobRecord : LiteImmutableEntity /// /// 响应体 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string ResponseBody { get; init; } /// /// 响应头 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string ResponseHeader { get; init; } diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs index dc3275c1..34c0151a 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs @@ -35,14 +35,22 @@ public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient /// /// 创建者来源地址 /// - [Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #if DBTYPE_SQLITE + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public string CreatedReferer { get; init; } /// /// 创建者客户端用户代理 /// - [Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #if DBTYPE_SQLITE + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string CreatedUserAgent { get; init; } @@ -63,14 +71,22 @@ public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient /// /// 异常信息 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Exception { get; init; } /// /// 附加数据 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string ExtraData { get; init; } @@ -91,14 +107,22 @@ public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient /// /// 来源地址 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string ReferUrl { get; init; } /// /// 请求内容 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string RequestBody { get; init; } @@ -112,7 +136,11 @@ public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient /// /// 请求头信息 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string RequestHeaders { get; init; } @@ -126,7 +154,11 @@ public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient /// /// 响应内容 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string ResponseBody { get; init; } @@ -140,7 +172,11 @@ public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient /// /// 响应头 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string ResponseHeaders { get; init; } diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs index 97eb6462..56bc95df 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs @@ -85,7 +85,11 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary /// /// 备注 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Summary { get; init; } diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs index dcf87705..b4d264bc 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs @@ -14,7 +14,11 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary /// /// 消息内容 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Content { get; init; } @@ -55,14 +59,22 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary /// /// 消息摘要 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Summary { get; init; } /// /// 消息主题 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Title { get; init; } diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs index c18aded9..d29be8e1 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs @@ -85,7 +85,11 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister /// /// 描述 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public virtual string Summary { get; init; } diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs index 7e2bb7e4..b8ac0a48 100644 --- a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs @@ -33,7 +33,11 @@ public record Sys_VerifyCode : VersionEntity /// /// 发送报告 /// + #if DBTYPE_SQLITE [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + #else + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_MAX)] + #endif [JsonIgnore] public string Report { get; init; } diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs index ba06098e..d467f50e 100644 --- a/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs @@ -11,6 +11,6 @@ public sealed record CheckMobileAvailableReq : Sys_User /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [Mobile] - [Required(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.手机号码不能为空))] + [Required(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.手机号不能为空))] public override string Mobile { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj b/src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj index f5ca3bd1..3d157497 100644 --- a/src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj +++ b/src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj @@ -1,4 +1,7 @@ + + DBTYPE_SQLITE + diff --git a/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs b/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs index 67797ff6..3fba2bd5 100644 --- a/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs +++ b/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs @@ -24,7 +24,12 @@ public sealed class RequestAuditMiddleware( // 跳过处理的情况: if (!context.Request.Path.StartsWithSegments(_defaultRoutePrefix) // 非api请求 || context.Request.Path.StartsWithSegments(_healthCheckRoutePrefix) // 健康检查 - || context.Request.Method == Chars.FLG_HTTP_METHOD_OPTIONS) { // is options 请求 + || context.Request.Method == Chars.FLG_HTTP_METHOD_OPTIONS // is options 请求 + || (context.Request.ContentType?.StartsWith("multipart/form-data", true, CultureInfo.InvariantCulture) ?? + false) // 文件上传 + #pragma warning disable SA1009 + ) { + #pragma warning restore SA1009 await next(context).ConfigureAwait(false); return; } diff --git a/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj b/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj index 4fdb361d..065173c0 100644 --- a/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj +++ b/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj @@ -8,6 +8,7 @@ + diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs index c4eb9ad4..d7c02805 100644 --- a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs @@ -291,7 +291,7 @@ public sealed class UserService( } if (user.Mobile != req.VerifySmsCodeReq.DestDevice) { - throw new NetAdminInvalidOperationException($"{Ln.手机号码不正确}"); + throw new NetAdminInvalidOperationException($"{Ln.手机号不正确}"); } } @@ -330,17 +330,17 @@ public sealed class UserService( if (!user.Mobile.NullOrEmpty()) { // 已有手机号,需验证旧手机 if (!await verifyCodeService.VerifyAsync(req.OriginVerifySmsCodeReq).ConfigureAwait(false)) { - throw new NetAdminInvalidOperationException($"{Ln.旧手机号码验证码不正确}"); + throw new NetAdminInvalidOperationException($"{Ln.旧手机号验证码不正确}"); } if (user.Mobile != req.OriginVerifySmsCodeReq.DestDevice) { - throw new NetAdminInvalidOperationException($"{Ln.旧手机号码不正确}"); + throw new NetAdminInvalidOperationException($"{Ln.旧手机号不正确}"); } } // 验证新手机号 if (!await verifyCodeService.VerifyAsync(req.NewVerifySmsCodeReq).ConfigureAwait(false)) { - throw new NetAdminInvalidOperationException($"{Ln.新手机号码验证码不正确}"); + throw new NetAdminInvalidOperationException($"{Ln.新手机号验证码不正确}"); } if (await Rpo.UpdateDiy diff --git a/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj b/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj index a88bfb57..dfc9cfb0 100644 --- a/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj +++ b/src/backend/NetAdmin.Tests/NetAdmin.Tests.csproj @@ -3,9 +3,9 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/frontend/admin/package.json b/src/frontend/admin/package.json index e1a4db88..9bd2a78a 100644 --- a/src/frontend/admin/package.json +++ b/src/frontend/admin/package.json @@ -11,14 +11,14 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.1", "@tinymce/tinymce-vue": "^5.1.1", - "ace-builds": "^1.33.1", + "ace-builds": "^1.33.2", "axios": "^1.6.8", "clipboard": "^2.0.11", - "core-js": "^3.37.0", + "core-js": "^3.37.1", "cropperjs": "^1.6.2", "crypto-js": "^4.2.0", "echarts": "^5.5.0", - "element-plus": "^2.7.1", + "element-plus": "^2.7.3", "json-bigint": "^1.0.0", "json5-to-table": "^0.1.8", "markdown-it": "^14.1.0", @@ -29,23 +29,23 @@ "sortablejs": "^1.15.2", "tinymce": "^6.8.3", "vkbeautify": "^0.99.3", - "vue": "^3.4.25", + "vue": "^3.4.27", "vue-i18n": "^9.13.1", "vue-router": "^4.3.2", "vue3-ace-editor": "^2.2.4", "vue3-json-viewer": "^2.2.2", "vuedraggable": "^4.0.3", "vuex": "^4.1.0", - "xgplayer": "^3.0.16", - "xgplayer-hls": "^3.0.16" + "xgplayer": "^3.0.17", + "xgplayer-hls": "^3.0.17" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", "prettier": "^3.2.5", "prettier-plugin-organize-attributes": "^1.0.0", - "sass": "^1.75.0", - "terser": "^5.30.4", - "vite": "^5.2.10" + "sass": "^1.77.2", + "terser": "^5.31.0", + "vite": "^5.2.11" }, "browserslist": [ "> 1%", diff --git a/src/frontend/admin/src/assets/icons/Email.vue b/src/frontend/admin/src/assets/icons/Email.vue new file mode 100644 index 00000000..e3f2b931 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Email.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/MailCode.vue b/src/frontend/admin/src/assets/icons/MailCode.vue new file mode 100644 index 00000000..f28fa142 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/MailCode.vue @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Mobile.vue b/src/frontend/admin/src/assets/icons/Mobile.vue new file mode 100644 index 00000000..4d37c4b2 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Mobile.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/SmsCode.vue b/src/frontend/admin/src/assets/icons/SmsCode.vue index 7b423cf2..a119be93 100644 --- a/src/frontend/admin/src/assets/icons/SmsCode.vue +++ b/src/frontend/admin/src/assets/icons/SmsCode.vue @@ -1,15 +1,16 @@ \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/index.js b/src/frontend/admin/src/assets/icons/index.js index dedc5487..2023f048 100644 --- a/src/frontend/admin/src/assets/icons/index.js +++ b/src/frontend/admin/src/assets/icons/index.js @@ -44,7 +44,6 @@ export { default as Robot } from './Robot.vue' export { default as Role } from './Role.vue' export { default as ScheduledJob } from './ScheduledJob.vue' export { default as Send } from './Send.vue' -export { default as SmsCode } from './SmsCode.vue' export { default as Stats } from './Stats.vue' export { default as Sync } from './Sync.vue' export { default as Task } from './Task.vue' @@ -67,4 +66,8 @@ export { default as Collect } from './Collect.vue' export { default as FreeSql } from './FreeSql.vue' export { default as Performance } from './Performance.vue' export { default as Proxy } from './Proxy.vue' -export { default as ECharts } from './ECharts.vue' \ No newline at end of file +export { default as ECharts } from './ECharts.vue' +export { default as Mobile } from './Mobile.vue' +export { default as Email } from './Email.vue' +export { default as SmsCode } from './SmsCode.vue' +export { default as MailCode } from './MailCode.vue' \ No newline at end of file diff --git a/src/frontend/admin/src/components/scTable/index.vue b/src/frontend/admin/src/components/scTable/index.vue index f32c437e..93c743db 100644 --- a/src/frontend/admin/src/components/scTable/index.vue +++ b/src/frontend/admin/src/components/scTable/index.vue @@ -312,7 +312,7 @@ export default { } catch { return } - await this.vue.deleteRow(this.current.row) + await this.vue.rowDel(this.current.row) return } diff --git a/src/frontend/admin/src/config/iconSelect.js b/src/frontend/admin/src/config/iconSelect.js index 5e433878..6823f1e4 100644 --- a/src/frontend/admin/src/config/iconSelect.js +++ b/src/frontend/admin/src/config/iconSelect.js @@ -1 +1 @@ -export default{"icons":[{"icons":["el-icon-add-location","el-icon-aim","el-icon-alarm-clock","el-icon-apple","el-icon-arrow-down","el-icon-arrow-down-bold","el-icon-arrow-left","el-icon-arrow-left-bold","el-icon-arrow-right","el-icon-arrow-right-bold","el-icon-arrow-up","el-icon-arrow-up-bold","el-icon-avatar","el-icon-back","el-icon-baseball","el-icon-basketball","el-icon-bell","el-icon-bell-filled","el-icon-bicycle","el-icon-bottom","el-icon-bottom-left","el-icon-bottom-right","el-icon-bowl","el-icon-box","el-icon-briefcase","el-icon-brush","el-icon-brush-filled","el-icon-burger","el-icon-calendar","el-icon-camera","el-icon-camera-filled","el-icon-caret-bottom","el-icon-caret-left","el-icon-caret-right","el-icon-caret-top","el-icon-cellphone","el-icon-chat-dot-round","el-icon-chat-dot-square","el-icon-chat-line-round","el-icon-chat-line-square","el-icon-chat-round","el-icon-chat-square","el-icon-check","el-icon-checked","el-icon-cherry","el-icon-chicken","el-icon-circle-check","el-icon-circle-check-filled","el-icon-circle-close","el-icon-circle-close-filled","el-icon-circle-plus","el-icon-circle-plus-filled","el-icon-clock","el-icon-close","el-icon-close-bold","el-icon-cloudy","el-icon-coffee","el-icon-coffee-cup","el-icon-coin","el-icon-cold-drink","el-icon-collection","el-icon-collection-tag","el-icon-comment","el-icon-compass","el-icon-connection","el-icon-coordinate","el-icon-copy-document","el-icon-cpu","el-icon-credit-card","el-icon-crop","el-icon-d-arrow-left","el-icon-d-arrow-right","el-icon-d-caret","el-icon-data-analysis","el-icon-data-board","el-icon-data-line","el-icon-delete","el-icon-delete-filled","el-icon-delete-location","el-icon-dessert","el-icon-discount","el-icon-dish","el-icon-dish-dot","el-icon-document","el-icon-document-add","el-icon-document-checked","el-icon-document-copy","el-icon-document-delete","el-icon-document-remove","el-icon-download","el-icon-drizzling","el-icon-edit","el-icon-edit-pen","el-icon-eleme","el-icon-eleme-filled","el-icon-element-plus","el-icon-expand","el-icon-failed","el-icon-female","el-icon-files","el-icon-film","el-icon-filter","el-icon-finished","el-icon-first-aid-kit","el-icon-flag","el-icon-fold","el-icon-folder","el-icon-folder-add","el-icon-folder-checked","el-icon-folder-delete","el-icon-folder-opened","el-icon-folder-remove","el-icon-food","el-icon-football","el-icon-fork-spoon","el-icon-fries","el-icon-full-screen","el-icon-goblet","el-icon-goblet-full","el-icon-goblet-square","el-icon-goblet-square-full","el-icon-goods","el-icon-goods-filled","el-icon-grape","el-icon-grid","el-icon-guide","el-icon-headset","el-icon-help","el-icon-help-filled","el-icon-hide","el-icon-histogram","el-icon-home-filled","el-icon-hot-water","el-icon-house","el-icon-ice-cream","el-icon-ice-cream-round","el-icon-ice-cream-square","el-icon-ice-drink","el-icon-ice-tea","el-icon-info-filled","el-icon-iphone","el-icon-key","el-icon-knife-fork","el-icon-lightning","el-icon-link","el-icon-list","el-icon-loading","el-icon-location","el-icon-location-filled","el-icon-location-information","el-icon-lock","el-icon-lollipop","el-icon-magic-stick","el-icon-magnet","el-icon-male","el-icon-management","el-icon-map-location","el-icon-medal","el-icon-menu","el-icon-message","el-icon-message-box","el-icon-mic","el-icon-microphone","el-icon-milk-tea","el-icon-minus","el-icon-money","el-icon-monitor","el-icon-moon","el-icon-moon-night","el-icon-more","el-icon-more-filled","el-icon-mostly-cloudy","el-icon-mouse","el-icon-mug","el-icon-mute","el-icon-mute-notification","el-icon-no-smoking","el-icon-notebook","el-icon-notification","el-icon-odometer","el-icon-office-building","el-icon-open","el-icon-operation","el-icon-opportunity","el-icon-orange","el-icon-paperclip","el-icon-partly-cloudy","el-icon-pear","el-icon-phone","el-icon-phone-filled","el-icon-picture","el-icon-picture-filled","el-icon-picture-rounded","el-icon-pie-chart","el-icon-place","el-icon-platform","el-icon-plus","el-icon-pointer","el-icon-position","el-icon-postcard","el-icon-pouring","el-icon-present","el-icon-price-tag","el-icon-printer","el-icon-promotion","el-icon-question-filled","el-icon-rank","el-icon-reading","el-icon-reading-lamp","el-icon-refresh","el-icon-refresh-left","el-icon-refresh-right","el-icon-refrigerator","el-icon-remove","el-icon-remove-filled","el-icon-right","el-icon-scale-to-original","el-icon-school","el-icon-scissor","el-icon-search","el-icon-select","el-icon-sell","el-icon-semi-select","el-icon-service","el-icon-set-up","el-icon-setting","el-icon-share","el-icon-ship","el-icon-shop","el-icon-shopping-bag","el-icon-shopping-cart","el-icon-shopping-cart-full","el-icon-smoking","el-icon-soccer","el-icon-sold-out","el-icon-sort","el-icon-sort-down","el-icon-sort-up","el-icon-stamp","el-icon-star","el-icon-star-filled","el-icon-stopwatch","el-icon-success-filled","el-icon-sugar","el-icon-suitcase","el-icon-sunny","el-icon-sunrise","el-icon-sunset","el-icon-switch","el-icon-switch-button","el-icon-takeaway-box","el-icon-ticket","el-icon-tickets","el-icon-timer","el-icon-toilet-paper","el-icon-tools","el-icon-top","el-icon-top-left","el-icon-top-right","el-icon-trend-charts","el-icon-trophy","el-icon-turn-off","el-icon-umbrella","el-icon-unlock","el-icon-upload","el-icon-upload-filled","el-icon-user","el-icon-user-filled","el-icon-van","el-icon-video-camera","el-icon-video-camera-filled","el-icon-video-pause","el-icon-video-play","el-icon-view","el-icon-wallet","el-icon-wallet-filled","el-icon-warning","el-icon-warning-filled","el-icon-watch","el-icon-watermelon","el-icon-wind-power","el-icon-zoom-in","el-icon-zoom-out"],"name":"默认"},{"icons":["sc-icon-Vue","sc-icon-Code","sc-icon-Wechat","sc-icon-BugFill","sc-icon-BugLine","sc-icon-FileWord","sc-icon-FileExcel","sc-icon-FilePpt","sc-icon-Organization","sc-icon-Upload","sc-icon-Download","sc-icon-Role","sc-icon-Dept","sc-icon-Js","sc-icon-Memory","sc-icon-Dashboard","sc-icon-Api","sc-icon-Code2","sc-icon-Csharp","sc-icon-Dic","sc-icon-Position","sc-icon-Tpl","sc-icon-Demo","sc-icon-Link","sc-icon-Unlink","sc-icon-Send","sc-icon-SmsCode","sc-icon-Meter","sc-icon-Grafana","sc-icon-Elastic","sc-icon-Kibana","sc-icon-Kafka","sc-icon-Resource","sc-icon-Robot","sc-icon-Device","sc-icon-Business","sc-icon-App","sc-icon-App2","sc-icon-Sync","sc-icon-Drone","sc-icon-Gitea","sc-icon-Docker","sc-icon-Task","sc-icon-ProductCategory","sc-icon-Product","sc-icon-Error","sc-icon-Warning","sc-icon-Stats","sc-icon-Log","sc-icon-OperLog","sc-icon-LoginLog","sc-icon-ExLog","sc-icon-Key","sc-icon-OpenDoor","sc-icon-Alert","sc-icon-Device","sc-icon-Task","sc-icon-Resource","sc-icon-Report","sc-icon-Daily","sc-icon-AccountReport","sc-icon-Element","sc-icon-ApiDoc","sc-icon-Help","sc-icon-Version","sc-icon-Home","sc-icon-Exception","sc-icon-Collect","sc-icon-FreeSql","sc-icon-Performance","sc-icon-Proxy","sc-icon-ECharts"],"name":"扩展"}]} \ No newline at end of file +export default{"icons":[{"icons":["el-icon-add-location","el-icon-aim","el-icon-alarm-clock","el-icon-apple","el-icon-arrow-down","el-icon-arrow-down-bold","el-icon-arrow-left","el-icon-arrow-left-bold","el-icon-arrow-right","el-icon-arrow-right-bold","el-icon-arrow-up","el-icon-arrow-up-bold","el-icon-avatar","el-icon-back","el-icon-baseball","el-icon-basketball","el-icon-bell","el-icon-bell-filled","el-icon-bicycle","el-icon-bottom","el-icon-bottom-left","el-icon-bottom-right","el-icon-bowl","el-icon-box","el-icon-briefcase","el-icon-brush","el-icon-brush-filled","el-icon-burger","el-icon-calendar","el-icon-camera","el-icon-camera-filled","el-icon-caret-bottom","el-icon-caret-left","el-icon-caret-right","el-icon-caret-top","el-icon-cellphone","el-icon-chat-dot-round","el-icon-chat-dot-square","el-icon-chat-line-round","el-icon-chat-line-square","el-icon-chat-round","el-icon-chat-square","el-icon-check","el-icon-checked","el-icon-cherry","el-icon-chicken","el-icon-circle-check","el-icon-circle-check-filled","el-icon-circle-close","el-icon-circle-close-filled","el-icon-circle-plus","el-icon-circle-plus-filled","el-icon-clock","el-icon-close","el-icon-close-bold","el-icon-cloudy","el-icon-coffee","el-icon-coffee-cup","el-icon-coin","el-icon-cold-drink","el-icon-collection","el-icon-collection-tag","el-icon-comment","el-icon-compass","el-icon-connection","el-icon-coordinate","el-icon-copy-document","el-icon-cpu","el-icon-credit-card","el-icon-crop","el-icon-d-arrow-left","el-icon-d-arrow-right","el-icon-d-caret","el-icon-data-analysis","el-icon-data-board","el-icon-data-line","el-icon-delete","el-icon-delete-filled","el-icon-delete-location","el-icon-dessert","el-icon-discount","el-icon-dish","el-icon-dish-dot","el-icon-document","el-icon-document-add","el-icon-document-checked","el-icon-document-copy","el-icon-document-delete","el-icon-document-remove","el-icon-download","el-icon-drizzling","el-icon-edit","el-icon-edit-pen","el-icon-eleme","el-icon-eleme-filled","el-icon-element-plus","el-icon-expand","el-icon-failed","el-icon-female","el-icon-files","el-icon-film","el-icon-filter","el-icon-finished","el-icon-first-aid-kit","el-icon-flag","el-icon-fold","el-icon-folder","el-icon-folder-add","el-icon-folder-checked","el-icon-folder-delete","el-icon-folder-opened","el-icon-folder-remove","el-icon-food","el-icon-football","el-icon-fork-spoon","el-icon-fries","el-icon-full-screen","el-icon-goblet","el-icon-goblet-full","el-icon-goblet-square","el-icon-goblet-square-full","el-icon-goods","el-icon-goods-filled","el-icon-grape","el-icon-grid","el-icon-guide","el-icon-headset","el-icon-help","el-icon-help-filled","el-icon-hide","el-icon-histogram","el-icon-home-filled","el-icon-hot-water","el-icon-house","el-icon-ice-cream","el-icon-ice-cream-round","el-icon-ice-cream-square","el-icon-ice-drink","el-icon-ice-tea","el-icon-info-filled","el-icon-iphone","el-icon-key","el-icon-knife-fork","el-icon-lightning","el-icon-link","el-icon-list","el-icon-loading","el-icon-location","el-icon-location-filled","el-icon-location-information","el-icon-lock","el-icon-lollipop","el-icon-magic-stick","el-icon-magnet","el-icon-male","el-icon-management","el-icon-map-location","el-icon-medal","el-icon-menu","el-icon-message","el-icon-message-box","el-icon-mic","el-icon-microphone","el-icon-milk-tea","el-icon-minus","el-icon-money","el-icon-monitor","el-icon-moon","el-icon-moon-night","el-icon-more","el-icon-more-filled","el-icon-mostly-cloudy","el-icon-mouse","el-icon-mug","el-icon-mute","el-icon-mute-notification","el-icon-no-smoking","el-icon-notebook","el-icon-notification","el-icon-odometer","el-icon-office-building","el-icon-open","el-icon-operation","el-icon-opportunity","el-icon-orange","el-icon-paperclip","el-icon-partly-cloudy","el-icon-pear","el-icon-phone","el-icon-phone-filled","el-icon-picture","el-icon-picture-filled","el-icon-picture-rounded","el-icon-pie-chart","el-icon-place","el-icon-platform","el-icon-plus","el-icon-pointer","el-icon-position","el-icon-postcard","el-icon-pouring","el-icon-present","el-icon-price-tag","el-icon-printer","el-icon-promotion","el-icon-question-filled","el-icon-rank","el-icon-reading","el-icon-reading-lamp","el-icon-refresh","el-icon-refresh-left","el-icon-refresh-right","el-icon-refrigerator","el-icon-remove","el-icon-remove-filled","el-icon-right","el-icon-scale-to-original","el-icon-school","el-icon-scissor","el-icon-search","el-icon-select","el-icon-sell","el-icon-semi-select","el-icon-service","el-icon-set-up","el-icon-setting","el-icon-share","el-icon-ship","el-icon-shop","el-icon-shopping-bag","el-icon-shopping-cart","el-icon-shopping-cart-full","el-icon-smoking","el-icon-soccer","el-icon-sold-out","el-icon-sort","el-icon-sort-down","el-icon-sort-up","el-icon-stamp","el-icon-star","el-icon-star-filled","el-icon-stopwatch","el-icon-success-filled","el-icon-sugar","el-icon-suitcase","el-icon-sunny","el-icon-sunrise","el-icon-sunset","el-icon-switch","el-icon-switch-button","el-icon-takeaway-box","el-icon-ticket","el-icon-tickets","el-icon-timer","el-icon-toilet-paper","el-icon-tools","el-icon-top","el-icon-top-left","el-icon-top-right","el-icon-trend-charts","el-icon-trophy","el-icon-turn-off","el-icon-umbrella","el-icon-unlock","el-icon-upload","el-icon-upload-filled","el-icon-user","el-icon-user-filled","el-icon-van","el-icon-video-camera","el-icon-video-camera-filled","el-icon-video-pause","el-icon-video-play","el-icon-view","el-icon-wallet","el-icon-wallet-filled","el-icon-warning","el-icon-warning-filled","el-icon-watch","el-icon-watermelon","el-icon-wind-power","el-icon-zoom-in","el-icon-zoom-out"],"name":"默认"},{"icons":["sc-icon-Vue","sc-icon-Code","sc-icon-Wechat","sc-icon-BugFill","sc-icon-BugLine","sc-icon-FileWord","sc-icon-FileExcel","sc-icon-FilePpt","sc-icon-Organization","sc-icon-Upload","sc-icon-Download","sc-icon-Role","sc-icon-Dept","sc-icon-Js","sc-icon-Memory","sc-icon-Dashboard","sc-icon-Api","sc-icon-Code2","sc-icon-Csharp","sc-icon-Dic","sc-icon-Position","sc-icon-Tpl","sc-icon-Demo","sc-icon-Link","sc-icon-Unlink","sc-icon-Send","sc-icon-SmsCode","sc-icon-Meter","sc-icon-Grafana","sc-icon-Elastic","sc-icon-Kibana","sc-icon-Kafka","sc-icon-Resource","sc-icon-Robot","sc-icon-Device","sc-icon-Business","sc-icon-App","sc-icon-App2","sc-icon-Sync","sc-icon-Drone","sc-icon-Gitea","sc-icon-Docker","sc-icon-Task","sc-icon-ProductCategory","sc-icon-Product","sc-icon-Error","sc-icon-Warning","sc-icon-Stats","sc-icon-Log","sc-icon-OperLog","sc-icon-LoginLog","sc-icon-ExLog","sc-icon-Key","sc-icon-OpenDoor","sc-icon-Alert","sc-icon-Device","sc-icon-Task","sc-icon-Resource","sc-icon-Report","sc-icon-Daily","sc-icon-AccountReport","sc-icon-Element","sc-icon-ApiDoc","sc-icon-Help","sc-icon-Version","sc-icon-Home","sc-icon-Exception","sc-icon-Collect","sc-icon-FreeSql","sc-icon-Performance","sc-icon-Proxy","sc-icon-ECharts","sc-icon-Mobile","sc-icon-Email","sc-icon-SmsCode","sc-icon-MailCode"],"name":"扩展"}]} \ No newline at end of file diff --git a/src/frontend/admin/src/views/home/widgets/components/ver.vue b/src/frontend/admin/src/views/home/widgets/components/ver.vue index 72a76104..17eb5063 100644 --- a/src/frontend/admin/src/views/home/widgets/components/ver.vue +++ b/src/frontend/admin/src/views/home/widgets/components/ver.vue @@ -45,11 +45,9 @@ export default { justify-content: center; align-items: center; } - .main { height: 25rem; } - .wrap { gap: 1rem; }