From 0b036e9d67ffdf7a07c772606009f02744e6a3c3 Mon Sep 17 00:00:00 2001 From: tk Date: Mon, 9 Dec 2024 19:36:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20=E5=88=86=E7=BB=84=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/ICrudModule.cs | 5 + .../Services/Tpl/ExampleService.cs | 15 ++ .../NetAdmin.Cache/Tpl/ExampleCache.cs | 6 + .../DbMaps/Dependency/ImmutableEntity.cs | 2 +- .../DbMaps/Sys/Sys_LoginLog.cs | 18 +-- .../Dto/Sys/LoginLog/ExportLoginLogRsp.cs | 2 +- .../Dto/Sys/LoginLog/QueryLoginLogRsp.cs | 18 +-- .../NetAdmin.Domain/Events/SqlCommandEvent.cs | 4 +- .../Controllers/Tpl/ExampleController.cs | 9 ++ .../Modules/Sys/IApiModule.cs | 5 + .../Modules/Sys/IDicModule.cs | 5 + .../Modules/Sys/IDocModule.cs | 5 + .../Modules/Sys/IJobModule.cs | 5 + ...ysComponent.Application.csproj.DotSettings | 3 + .../Services/Sys/ApiService.cs | 23 +++ .../Services/Sys/ConfigService.cs | 15 ++ .../Services/Sys/DeptService.cs | 15 ++ .../Services/Sys/DevService.cs | 5 + .../Services/Sys/DicCatalogService.cs | 17 ++- .../Services/Sys/DicContentService.cs | 15 ++ .../Services/Sys/DicService.cs | 7 + .../Services/Sys/DocCatalogService.cs | 17 ++- .../Services/Sys/DocContentService.cs | 15 ++ .../Services/Sys/DocService.cs | 7 + .../Services/Sys/JobRecordService.cs | 15 ++ .../Services/Sys/JobService.cs | 22 +++ .../Services/Sys/LoginLogService.cs | 15 ++ .../Services/Sys/MenuService.cs | 15 ++ .../Services/Sys/RequestLogDetailService.cs | 16 +++ .../Services/Sys/RequestLogService.cs | 15 ++ .../Services/Sys/RoleService.cs | 15 ++ .../Services/Sys/SiteMsgDeptService.cs | 15 ++ .../Services/Sys/SiteMsgFlagService.cs | 15 ++ .../Services/Sys/SiteMsgRoleService.cs | 15 ++ .../Services/Sys/SiteMsgService.cs | 15 ++ .../Services/Sys/SiteMsgUserService.cs | 15 ++ .../Services/Sys/UserProfileService.cs | 50 ++++++- .../Services/Sys/UserService.cs | 17 +++ .../Services/Sys/VerifyCodeService.cs | 15 ++ .../Sys/ApiCache.cs | 12 ++ .../Sys/ConfigCache.cs | 6 + .../Sys/DeptCache.cs | 6 + .../Sys/DicCache.cs | 6 + .../Sys/DicCatalogCache.cs | 6 + .../Sys/DicContentCache.cs | 6 + .../Sys/DocCache.cs | 6 + .../Sys/DocCatalogCache.cs | 6 + .../Sys/DocContentCache.cs | 6 + .../Sys/JobCache.cs | 12 ++ .../Sys/JobRecordCache.cs | 6 + .../Sys/LoginLogCache.cs | 6 + .../Sys/MenuCache.cs | 6 + .../Sys/RequestLogCache.cs | 6 + .../Sys/RequestLogDetailCache.cs | 6 + .../Sys/RoleCache.cs | 6 + .../Sys/SiteMsgCache.cs | 6 + .../Sys/SiteMsgDeptCache.cs | 6 + .../Sys/SiteMsgFlagCache.cs | 6 + .../Sys/SiteMsgRoleCache.cs | 6 + .../Sys/SiteMsgUserCache.cs | 6 + .../Sys/UserCache.cs | 6 + .../Sys/UserProfileCache.cs | 6 + .../Sys/VerifyCodeCache.cs | 6 + .../Controllers/Sys/ApiController.cs | 17 +++ .../Controllers/Sys/ConfigController.cs | 8 ++ .../Controllers/Sys/DeptController.cs | 8 ++ .../Controllers/Sys/DicController.cs | 8 ++ .../Controllers/Sys/DocController.cs | 8 ++ .../Controllers/Sys/JobController.cs | 16 +++ .../Controllers/Sys/LoginLogController.cs | 8 ++ .../Controllers/Sys/MenuController.cs | 9 ++ .../Controllers/Sys/RequestLogController.cs | 8 ++ .../Controllers/Sys/RoleController.cs | 8 ++ .../Controllers/Sys/SiteMsgController.cs | 8 ++ .../Controllers/Sys/UserController.cs | 8 ++ .../Controllers/Sys/VerifyCodeController.cs | 9 ++ src/backend/UnitTests/Sys/ApiTests.cs | 40 ++++-- src/backend/UnitTests/Sys/ConfigTests.cs | 10 ++ src/backend/UnitTests/Sys/DeptTests.cs | 10 ++ src/backend/UnitTests/Sys/DicTests.cs | 11 ++ src/backend/UnitTests/Sys/DocTests.cs | 11 ++ src/backend/UnitTests/Sys/JobTests.cs | 20 +++ src/backend/UnitTests/Sys/LoginLogTests.cs | 10 ++ src/backend/UnitTests/Sys/MenuTests.cs | 10 ++ src/backend/UnitTests/Sys/RequestLogTests.cs | 10 ++ src/backend/UnitTests/Sys/RoleTests.cs | 10 ++ src/backend/UnitTests/Sys/SiteMsgTests.cs | 10 ++ src/backend/UnitTests/Sys/UserTests.cs | 11 ++ src/backend/UnitTests/Sys/VerifyCodeTests.cs | 10 ++ src/frontend/admin/src/api/sys/api.js | 11 ++ src/frontend/admin/src/api/sys/config.js | 11 ++ src/frontend/admin/src/api/sys/dept.js | 11 ++ src/frontend/admin/src/api/sys/dic.js | 11 ++ src/frontend/admin/src/api/sys/doc.js | 11 ++ src/frontend/admin/src/api/sys/job.js | 22 +++ src/frontend/admin/src/api/sys/loginlog.js | 11 ++ src/frontend/admin/src/api/sys/requestlog.js | 11 ++ src/frontend/admin/src/api/sys/role.js | 11 ++ src/frontend/admin/src/api/sys/sitemsg.js | 11 ++ src/frontend/admin/src/api/sys/user.js | 11 ++ .../admin/src/assets/icons/Country.vue | 7 + .../admin/src/assets/icons/DeviceLog.vue | 7 + .../admin/src/assets/icons/NickName.vue | 7 + .../admin/src/assets/icons/Telegram.vue | 7 + src/frontend/admin/src/assets/icons/index.js | 6 +- .../admin/src/components/naSearch/index.vue | 13 +- .../src/components/scSelectFilter/index.vue | 19 +-- .../admin/src/components/scTable/index.vue | 4 +- src/frontend/admin/src/config/appConfig.js | 2 +- src/frontend/admin/src/config/iconSelect.js | 2 +- src/frontend/admin/src/config/index.js | 2 +- src/frontend/admin/src/locales/lang/en.js | 3 +- src/frontend/admin/src/locales/lang/zh-cn.js | 3 +- src/frontend/admin/src/router/systemRouter.js | 11 +- src/frontend/admin/src/style/app.scss | 16 +++ src/frontend/admin/src/utils/tool.js | 6 + .../admin/src/views/profile/account/index.vue | 2 +- .../admin/src/views/profile/index.vue | 7 +- .../admin/src/views/profile/token/index.vue | 51 +++++++ .../admin/src/views/sys/cache/index.vue | 2 +- .../admin/src/views/sys/config/index.vue | 37 +++-- .../admin/src/views/sys/dept/index.vue | 37 +++-- .../admin/src/views/sys/dic/list/index.vue | 37 ++++- .../admin/src/views/sys/doc/list/index.vue | 50 ++++++- .../admin/src/views/sys/job/all/index.vue | 94 ++++++++---- .../admin/src/views/sys/job/record/index.vue | 87 ++++++++++-- .../admin/src/views/sys/log/login/index.vue | 124 ++++++++++++++-- .../src/views/sys/log/operation/index.vue | 134 +++++++++++++++--- .../admin/src/views/sys/msg/index.vue | 39 +++-- .../admin/src/views/sys/role/index.vue | 106 +++++++++++--- .../admin/src/views/sys/user/index.vue | 35 +++-- 131 files changed, 1813 insertions(+), 236 deletions(-) create mode 100644 src/backend/NetAdmin/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj.DotSettings create mode 100644 src/frontend/admin/src/assets/icons/Country.vue create mode 100644 src/frontend/admin/src/assets/icons/DeviceLog.vue create mode 100644 src/frontend/admin/src/assets/icons/NickName.vue create mode 100644 src/frontend/admin/src/assets/icons/Telegram.vue create mode 100644 src/frontend/admin/src/views/profile/token/index.vue diff --git a/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs b/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs index 41ed7ff1..9dd729c8 100644 --- a/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs +++ b/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs @@ -30,6 +30,11 @@ public interface ICrudModule Task CountAsync(QueryReq req); + /// + /// 实体分组计数 + /// + Task, int>>> CountByAsync(QueryReq req); + /// /// 创建实体 /// diff --git a/src/backend/NetAdmin/NetAdmin.Application/Services/Tpl/ExampleService.cs b/src/backend/NetAdmin/NetAdmin.Application/Services/Tpl/ExampleService.cs index c3e4eeb9..60edca34 100644 --- a/src/backend/NetAdmin/NetAdmin.Application/Services/Tpl/ExampleService.cs +++ b/src/backend/NetAdmin/NetAdmin.Application/Services/Tpl/ExampleService.cs @@ -31,6 +31,21 @@ public sealed class ExampleService(BasicRepository rpo) // return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Tpl_Example).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateExampleReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.Cache/Tpl/ExampleCache.cs b/src/backend/NetAdmin/NetAdmin.Cache/Tpl/ExampleCache.cs index a52db568..36b76893 100644 --- a/src/backend/NetAdmin/NetAdmin.Cache/Tpl/ExampleCache.cs +++ b/src/backend/NetAdmin/NetAdmin.Cache/Tpl/ExampleCache.cs @@ -21,6 +21,12 @@ public sealed class ExampleCache(IDistributedCache cache, IExampleService servic return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateExampleReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs index 09d5ed74..91d1429e 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs @@ -25,7 +25,7 @@ public abstract record ImmutableEntity : LiteImmutableEntity, IFieldCreate [Column(CanUpdate = false, Position = -1)] [CsvIgnore] [JsonIgnore] - public long? CreatedUserId { get; init; } + public virtual long? CreatedUserId { get; init; } /// /// 创建者用户名 diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_LoginLog.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_LoginLog.cs index 29b2b499..d669efeb 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_LoginLog.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_LoginLog.cs @@ -39,7 +39,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column] [CsvIgnore] [JsonIgnore] - public virtual int Duration { get; protected init; } + public virtual int Duration { get; init; } /// /// 程序响应码 @@ -47,7 +47,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column] [CsvIgnore] [JsonIgnore] - public virtual ErrorCodes ErrorCode { get; protected init; } + public virtual ErrorCodes ErrorCode { get; init; } /// /// HTTP状态码 @@ -63,7 +63,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] [CsvIgnore] [JsonIgnore] - public virtual string LoginUserName { get; protected init; } + public virtual string LoginUserName { get; init; } /// /// 拥有者 @@ -95,7 +95,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column(DbType = Chars.FLGL_DB_FIELD_TYPE_VARCHAR_MAX)] [CsvIgnore] [JsonIgnore] - public virtual string RequestBody { get; protected init; } + public virtual string RequestBody { get; init; } /// /// 请求头信息 @@ -103,7 +103,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column(DbType = Chars.FLGL_DB_FIELD_TYPE_VARCHAR_MAX)] [CsvIgnore] [JsonIgnore] - public virtual string RequestHeaders { get; protected init; } + public virtual string RequestHeaders { get; init; } /// /// 请求地址 @@ -111,7 +111,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] [CsvIgnore] [JsonIgnore] - public virtual string RequestUrl { get; protected init; } + public virtual string RequestUrl { get; init; } /// /// 响应内容 @@ -119,7 +119,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column(DbType = Chars.FLGL_DB_FIELD_TYPE_VARCHAR_MAX)] [CsvIgnore] [JsonIgnore] - public virtual string ResponseBody { get; protected init; } + public virtual string ResponseBody { get; init; } /// /// 响应头 @@ -127,7 +127,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column(DbType = Chars.FLGL_DB_FIELD_TYPE_VARCHAR_MAX)] [CsvIgnore] [JsonIgnore] - public virtual string ResponseHeaders { get; protected init; } + public virtual string ResponseHeaders { get; init; } /// /// 服务器IP @@ -135,5 +135,5 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel [Column] [CsvIgnore] [JsonIgnore] - public virtual int? ServerIp { get; protected init; } + public virtual int? ServerIp { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/ExportLoginLogRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/ExportLoginLogRsp.cs index 639ec1a5..ef5e00cb 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/ExportLoginLogRsp.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/ExportLoginLogRsp.cs @@ -47,7 +47,7 @@ public sealed record ExportLoginLogRsp : QueryLoginLogRsp [CsvIgnore(false)] [CsvIndex(2)] [CsvName(nameof(Ln.登录名))] - public override string LoginUserName { get; protected init; } + public override string LoginUserName { get; init; } /// [CsvIgnore] diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/QueryLoginLogRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/QueryLoginLogRsp.cs index e8725e9f..d085d5b6 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/QueryLoginLogRsp.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/LoginLog/QueryLoginLogRsp.cs @@ -30,11 +30,11 @@ public record QueryLoginLogRsp : Sys_LoginLog /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override int Duration { get; protected init; } + public override int Duration { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override ErrorCodes ErrorCode { get; protected init; } + public override ErrorCodes ErrorCode { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] @@ -46,32 +46,32 @@ public record QueryLoginLogRsp : Sys_LoginLog /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string LoginUserName { get; protected init; } + public override string LoginUserName { get; init; } /// public new virtual QueryUserRsp Owner { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string RequestBody { get; protected init; } + public override string RequestBody { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string RequestHeaders { get; protected init; } + public override string RequestHeaders { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string RequestUrl { get; protected init; } + public override string RequestUrl { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string ResponseBody { get; protected init; } + public override string ResponseBody { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string ResponseHeaders { get; protected init; } + public override string ResponseHeaders { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override int? ServerIp { get; protected init; } + public override int? ServerIp { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Events/SqlCommandEvent.cs b/src/backend/NetAdmin/NetAdmin.Domain/Events/SqlCommandEvent.cs index 8d2c6e73..2938cc87 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Events/SqlCommandEvent.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Events/SqlCommandEvent.cs @@ -20,10 +20,10 @@ public abstract record SqlCommandEvent : DataAbstraction, IEventSource public CancellationToken CancellationToken { get; init; } /// - public DateTime CreatedTime { get; protected init; } + public DateTime CreatedTime { get; init; } /// - public string EventId { get; protected init; } + public string EventId { get; init; } /// public object Payload { get; init; } diff --git a/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs b/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs index 971c6066..17f0ef63 100644 --- a/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs +++ b/src/backend/NetAdmin/NetAdmin.Host/Controllers/Tpl/ExampleController.cs @@ -31,6 +31,15 @@ public sealed class ExampleController(IExampleCache cache) : ControllerBase + /// 示例分组计数 + /// + [NonAction] + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建示例 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs index 3a3fdf0c..4e6ed80f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs @@ -11,6 +11,11 @@ public interface IApiModule : ICrudModule { + /// + /// 平面查询接口 + /// + public Task> PlainQueryAsync(QueryReq req); + /// /// 同步接口 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs index 5c954f92..00e8c370 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs @@ -18,6 +18,11 @@ public interface IDicModule /// Task BulkDeleteContentAsync(BulkReq req); + /// + /// 字典内容分组计数 + /// + Task, int>>> ContentCountByAsync(QueryReq req); + /// /// 创建字典目录 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDocModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDocModule.cs index 10c12b73..1a890768 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDocModule.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IDocModule.cs @@ -18,6 +18,11 @@ public interface IDocModule /// Task BulkDeleteContentAsync(BulkReq req); + /// + /// 文档内容分组计数 + /// + Task, int>>> ContentCountByAsync(QueryReq req); + /// /// 创建文档分类 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IJobModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IJobModule.cs index 13b5b96a..84fe7e21 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IJobModule.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IJobModule.cs @@ -53,6 +53,11 @@ public interface IJobModule : ICrudModule Task> PagedQueryRecordAsync(PagedQueryReq req); + /// + /// 作业记录分组计数 + /// + Task, int>>> RecordCountByAsync(QueryReq req); + /// /// 设置计划作业启用状态 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj.DotSettings b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj.DotSettings new file mode 100644 index 00000000..bd65a568 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj.DotSettings @@ -0,0 +1,3 @@ + + True + \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs index bd659969..aff7ffc0 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs @@ -24,6 +24,21 @@ public sealed class ApiService( return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Api).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public Task CreateAsync(CreateApiReq req) { @@ -73,6 +88,14 @@ public sealed class ApiService( throw new NotImplementedException(); } + /// + public async Task> PlainQueryAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter).ToListAsync().ConfigureAwait(false); + return ret.Adapt>(); + } + /// public async Task> QueryAsync(QueryReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs index 24d88e38..afa3ab4a 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs @@ -28,6 +28,21 @@ public sealed class ConfigService(BasicRepository rpo) // return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Config).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateConfigReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs index fa5e372c..624363d0 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs @@ -28,6 +28,21 @@ public sealed class DeptService(BasicRepository rpo) // return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Dept).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// /// Parent_department_does_not_exist public async Task CreateAsync(CreateDeptReq req) diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs index 52555274..aebf9601 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs @@ -71,6 +71,11 @@ public sealed class DevService(IApiService apiService) : ServiceBase , Path.Combine(dtoDir, $"Create{req.ModuleName}Req.cs"), typeAbbr) .ConfigureAwait(false); + // EditReq + await WriteCodeFileAsync(req, Path.Combine(tplDataDir, "Dto", "Tpl", "Example", "EditExampleReq.cs") + , Path.Combine(dtoDir, $"Edit{req.ModuleName}Req.cs"), typeAbbr) + .ConfigureAwait(false); + // QueryReq await WriteCodeFileAsync(req, Path.Combine(tplDataDir, "Dto", "Tpl", "Example", "QueryExampleReq.cs") , Path.Combine(dtoDir, $"Query{req.ModuleName}Req.cs"), typeAbbr) diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs index 00f20ad2..fecd0d16 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs @@ -28,6 +28,21 @@ public sealed class DicCatalogService(BasicRepository rpo) return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_DicCatalog).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// /// The_parent_node_does_not_exist public async Task CreateAsync(CreateDicCatalogReq req) @@ -61,7 +76,7 @@ public sealed class DicCatalogService(BasicRepository rpo) return #if DBTYPE_SQLSERVER (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); - #else + #else await UpdateAsync(req).ConfigureAwait(false) > 0 ? await GetAsync(new QueryDicCatalogReq { Id = req.Id }).ConfigureAwait(false) : null; #endif } diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs index 8301db35..61241265 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs @@ -28,6 +28,21 @@ public sealed class DicContentService(BasicRepository rpo) return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_DicContent).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// /// Dictionary_directory_does_not_exist public async Task CreateAsync(CreateDicContentReq req) diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs index 0c050860..d63c57f0 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs @@ -21,6 +21,13 @@ public sealed class DicService(IDicCatalogService catalogService, IDicContentSer return contentService.BulkDeleteAsync(req); } + /// + public Task, int>>> ContentCountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return contentService.CountByAsync(req); + } + /// public Task CreateCatalogAsync(CreateDicCatalogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs index edec5a1e..bfc0de34 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs @@ -28,6 +28,21 @@ public sealed class DocCatalogService(BasicRepository rpo) return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_DocCatalog).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// /// The_parent_node_does_not_exist public async Task CreateAsync(CreateDocCatalogReq req) @@ -62,7 +77,7 @@ public sealed class DocCatalogService(BasicRepository rpo) return #if DBTYPE_SQLSERVER (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); - #else + #else await UpdateAsync(req).ConfigureAwait(false) > 0 ? await GetAsync(new QueryDocCatalogReq { Id = req.Id }).ConfigureAwait(false) : null; #endif } diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs index e4427524..ed4dd900 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs @@ -32,6 +32,21 @@ public sealed class DocContentService(BasicRepository rpo) return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_DocContent).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// /// Doctionary_directory_does_not_exist public async Task CreateAsync(CreateDocContentReq req) diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocService.cs index bdfdcfc3..b341196f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocService.cs @@ -21,6 +21,13 @@ public sealed class DocService(IDocCatalogService catalogService, IDocContentSer return contentService.BulkDeleteAsync(req); } + /// + public Task, int>>> ContentCountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return contentService.CountByAsync(req); + } + /// public Task CreateCatalogAsync(CreateDocCatalogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs index 2a7654a0..6ad537d6 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs @@ -29,6 +29,21 @@ public sealed class JobRecordService(BasicRepository rpo) / return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_JobRecord).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateJobRecordReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs index fea57269..5d8395e4 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs @@ -33,6 +33,21 @@ public sealed class JobService(BasicRepository rpo, IJobRecordSer return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Job).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public Task CountRecordAsync(QueryReq req) { @@ -265,6 +280,13 @@ public sealed class JobService(BasicRepository rpo, IJobRecordSer return ret.Adapt>(); } + /// + public Task, int>>> RecordCountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return jobRecordService.CountByAsync(req); + } + /// public async Task ReleaseStuckTaskAsync() { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs index 2b7e5f61..990795b1 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs @@ -28,6 +28,21 @@ public sealed class LoginLogService(BasicRepository rpo) // return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_LoginLog).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateLoginLogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs index 565d301a..f5a77614 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs @@ -28,6 +28,21 @@ public sealed class MenuService(BasicRepository rpo, IUserServic return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Menu).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateMenuReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs index 9010ca65..609671a2 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs @@ -28,6 +28,22 @@ public sealed class RequestLogDetailService(BasicRepository + public async Task, int>>> CountByAsync( + QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_RequestLogDetail).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateRequestLogDetailReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs index baf2b132..747fc584 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs @@ -30,6 +30,21 @@ public sealed class RequestLogService(BasicRepository rpo, return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_RequestLog).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateRequestLogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs index 67f09fe2..7d8f6840 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs @@ -28,6 +28,21 @@ public sealed class RoleService(BasicRepository rpo) // return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Role).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateRoleReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs index ccaa6d71..94f79dda 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs @@ -28,6 +28,21 @@ public sealed class SiteMsgDeptService(BasicRepository rp return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_SiteMsgDept).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateSiteMsgDeptReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs index 7508a6d8..85518c8c 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs @@ -28,6 +28,21 @@ public sealed class SiteMsgFlagService(BasicRepository rp return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_SiteMsgFlag).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateSiteMsgFlagReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs index d1898ad9..b1c2a931 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs @@ -28,6 +28,21 @@ public sealed class SiteMsgRoleService(BasicRepository rp return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_SiteMsgRole).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateSiteMsgRoleReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs index 63e2a8a5..c915078d 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs @@ -32,6 +32,21 @@ public sealed class SiteMsgService(BasicRepository rpo, Conte return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_SiteMsg).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateSiteMsgReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs index 7549eba9..0573235c 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs @@ -28,6 +28,21 @@ public sealed class SiteMsgUserService(BasicRepository rp return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_SiteMsgUser).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateSiteMsgUserReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs index 26150a6e..dde4a459 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs @@ -44,7 +44,22 @@ public sealed class UserProfileService(BasicRepository rp public Task CountAsync(QueryReq req) { req.ThrowIfInvalid(); - return QueryInternal(req).WithNoLockNoWait().CountAsync(); + return QueryInternalComplex(req).WithNoLockNoWait().CountAsync(); + } + + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_UserProfile).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); } /// @@ -71,7 +86,7 @@ public sealed class UserProfileService(BasicRepository rp return #if DBTYPE_SQLSERVER (await UpdateReturnListAsync(req.Adapt()).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); - #else + #else await UpdateAsync(req.Adapt()).ConfigureAwait(false) > 0 ? await GetAsync(new QueryUserProfileReq { Id = req.Id }).ConfigureAwait(false) : null; @@ -89,7 +104,9 @@ public sealed class UserProfileService(BasicRepository rp public async Task GetAsync(QueryUserProfileReq req) { req.ThrowIfInvalid(); - var ret = await QueryInternal(new QueryReq { Filter = req, Order = Orders.None }).ToOneAsync().ConfigureAwait(false); + var ret = await QueryInternalComplex(new QueryReq { Filter = req, Order = Orders.None }) + .ToOneAsync() + .ConfigureAwait(false); return ret.Adapt(); } @@ -104,7 +121,7 @@ public sealed class UserProfileService(BasicRepository rp public async Task> PagedQueryAsync(PagedQueryReq req) { req.ThrowIfInvalid(); - var list = await QueryInternal(req) + var list = await QueryInternalComplex(req) .Page(req.Page, req.PageSize) .WithNoLockNoWait() .Count(out var total) @@ -131,7 +148,7 @@ public sealed class UserProfileService(BasicRepository rp public async Task> QueryAsync(QueryReq req) { req.ThrowIfInvalid(); - var ret = await QueryInternal(req) + var ret = await QueryInternalComplex(req) .WithNoLockNoWait() .Take(req.Count) .ToListAsync((a, b, c, d, e) => new { @@ -164,7 +181,28 @@ public sealed class UserProfileService(BasicRepository rp return UpdateAsync(req, [nameof(req.AppConfig)], null, a => a.Id == UserToken.Id, null, true); } - private ISelect QueryInternal(QueryReq req) + private ISelect QueryInternal(QueryReq req) + { + var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); + + // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault + switch (req.Order) { + case Orders.None: + return ret; + case Orders.Random: + return ret.OrderByRandom(); + } + + ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); + if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.Id); + } + + return ret; + } + + private ISelect QueryInternalComplex( + QueryReq req) { #pragma warning disable CA1305,IDE0072 var ret = Rpo.Orm.Select() diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs index c98a3161..84c87123 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs @@ -72,6 +72,23 @@ public sealed class UserService( #pragma warning restore VSTHRD103 } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + #pragma warning disable S6966 + var ret = await QueryInternal(req with { Order = Orders.None }) + #pragma warning restore S6966 + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_User).GetProperty(y)!.GetValue(x.Key)!.ToString()) + , x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateUserReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs index 4db09d43..73985d27 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs @@ -32,6 +32,21 @@ public sealed class VerifyCodeService(BasicRepository rpo, return QueryInternal(req).WithNoLockNoWait().CountAsync(); } + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y, y => typeof(Sys_VerifyCode).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + /// public async Task CreateAsync(CreateVerifyCodeReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs index ebba06db..41015815 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs @@ -18,6 +18,12 @@ public sealed class ApiCache(IDistributedCache cache, IApiService service) // return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateApiReq req) { @@ -54,6 +60,12 @@ public sealed class ApiCache(IDistributedCache cache, IApiService service) // return Service.PagedQueryAsync(req); } + /// + public Task> PlainQueryAsync(QueryReq req) + { + return Service.PlainQueryAsync(req); + } + /// public Task> QueryAsync(QueryReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs index 16a84355..3a876cde 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs @@ -18,6 +18,12 @@ public sealed class ConfigCache(IDistributedCache cache, IConfigService service) return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateConfigReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs index f80b17b5..610c4dd4 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs @@ -18,6 +18,12 @@ public sealed class DeptCache(IDistributedCache cache, IDeptService service) // return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateDeptReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCache.cs index 33d81f53..0e2fae1a 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCache.cs @@ -19,6 +19,12 @@ public sealed class DicCache(IDistributedCache cache, IDicService service) // return Service.BulkDeleteContentAsync(req); } + /// + public Task, int>>> ContentCountByAsync(QueryReq req) + { + return Service.ContentCountByAsync(req); + } + /// public Task CreateCatalogAsync(CreateDicCatalogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs index fbc3e9cd..09d7ca8b 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs @@ -18,6 +18,12 @@ public sealed class DicCatalogCache(IDistributedCache cache, IDicCatalogService return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateDicCatalogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs index 82488fb0..e68a5046 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs @@ -18,6 +18,12 @@ public sealed class DicContentCache(IDistributedCache cache, IDicContentService return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateDicContentReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCache.cs index a88979f3..b1c3631d 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCache.cs @@ -19,6 +19,12 @@ public sealed class DocCache(IDistributedCache cache, IDocService service) // return Service.BulkDeleteContentAsync(req); } + /// + public Task, int>>> ContentCountByAsync(QueryReq req) + { + return Service.ContentCountByAsync(req); + } + /// public Task CreateCatalogAsync(CreateDocCatalogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs index e8bc8773..cd4a12b3 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs @@ -18,6 +18,12 @@ public sealed class DocCatalogCache(IDistributedCache cache, IDocCatalogService return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateDocCatalogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs index ec167019..0de569d7 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs @@ -18,6 +18,12 @@ public sealed class DocContentCache(IDistributedCache cache, IDocContentService return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateDocContentReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs index 7ea5484a..b1cf5885 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs @@ -19,6 +19,12 @@ public sealed class JobCache(IDistributedCache cache, IJobService service) : Dis return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CountRecordAsync(QueryReq req) { @@ -127,6 +133,12 @@ public sealed class JobCache(IDistributedCache cache, IJobService service) : Dis return Service.QueryAsync(req); } + /// + public Task, int>>> RecordCountByAsync(QueryReq req) + { + return Service.RecordCountByAsync(req); + } + /// public Task SetEnabledAsync(SetJobEnabledReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs index 89d29a53..3c951195 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs @@ -18,6 +18,12 @@ public sealed class JobRecordCache(IDistributedCache cache, IJobRecordService se return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateJobRecordReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs index 79e1736b..8c46a485 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs @@ -18,6 +18,12 @@ public sealed class LoginLogCache(IDistributedCache cache, ILoginLogService serv return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateLoginLogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs index a2b96a0e..e54198dc 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs @@ -18,6 +18,12 @@ public sealed class MenuCache(IDistributedCache cache, IMenuService service) // return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateMenuReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs index f9185e75..35a8d2c1 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs @@ -31,6 +31,12 @@ public sealed class RequestLogCache(IDistributedCache cache, IRequestLogService #endif } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateRequestLogReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs index e3724b91..23d2c002 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs @@ -18,6 +18,12 @@ public sealed class RequestLogDetailCache(IDistributedCache cache, IRequestLogDe return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateRequestLogDetailReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs index 27eeb387..1c3ef106 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs @@ -18,6 +18,12 @@ public sealed class RoleCache(IDistributedCache cache, IRoleService service) // return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateRoleReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs index ede4599d..c12d2556 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs @@ -19,6 +19,12 @@ public sealed class SiteMsgCache(IDistributedCache cache, ISiteMsgService servic return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs index 373cda0f..f69560be 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs @@ -18,6 +18,12 @@ public sealed class SiteMsgDeptCache(IDistributedCache cache, ISiteMsgDeptServic return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgDeptReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs index d06de2c4..f4471e6c 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs @@ -18,6 +18,12 @@ public sealed class SiteMsgFlagCache(IDistributedCache cache, ISiteMsgFlagServic return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgFlagReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs index e159f80a..f4b7497c 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs @@ -18,6 +18,12 @@ public sealed class SiteMsgRoleCache(IDistributedCache cache, ISiteMsgRoleServic return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgRoleReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs index 245d8a34..32a326f9 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs @@ -18,6 +18,12 @@ public sealed class SiteMsgUserCache(IDistributedCache cache, ISiteMsgUserServic return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateSiteMsgUserReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs index 41015c64..970bf0d4 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs @@ -31,6 +31,12 @@ public sealed class UserCache(IDistributedCache cache, IUserService service, IVe return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateUserReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs index 818e82f3..8630606f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs @@ -18,6 +18,12 @@ public sealed class UserProfileCache(IDistributedCache cache, IUserProfileServic return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateUserProfileReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs index 90e98ce1..1d0ac382 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs @@ -18,6 +18,12 @@ public sealed class VerifyCodeCache(IDistributedCache cache, IVerifyCodeService return Service.CountAsync(req); } + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + /// public Task CreateAsync(CreateVerifyCodeReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs index 7d6756d2..143f9b94 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs @@ -27,6 +27,15 @@ public sealed class ApiController(IApiCache cache) : ControllerBase + /// 接口分组计数 + /// + [NonAction] + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建接口 /// @@ -83,6 +92,14 @@ public sealed class ApiController(IApiCache cache) : ControllerBase + /// 平面查询接口 + /// + public Task> PlainQueryAsync(QueryReq req) + { + return Cache.PlainQueryAsync(req); + } + /// /// 查询接口 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs index 786215ae..d08648cd 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs @@ -26,6 +26,14 @@ public sealed class ConfigController(IConfigCache cache) : ControllerBase + /// 配置分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建配置 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs index ddcce045..9e6f9a36 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs @@ -26,6 +26,14 @@ public sealed class DeptController(IDeptCache cache) : ControllerBase + /// 部门分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建部门 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs index ee6a32fb..82117f98 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs @@ -28,6 +28,14 @@ public sealed class DicController(IDicCache cache) : ControllerBase + /// 字典内容分组计数 + /// + public Task, int>>> ContentCountByAsync(QueryReq req) + { + return Cache.ContentCountByAsync(req); + } + /// /// 创建字典目录 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DocController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DocController.cs index 89316155..dfba293f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DocController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DocController.cs @@ -28,6 +28,14 @@ public sealed class DocController(IDocCache cache) : ControllerBase + /// 文档内容分组计数 + /// + public Task, int>>> ContentCountByAsync(QueryReq req) + { + return Cache.ContentCountByAsync(req); + } + /// /// 创建文档分类 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs index f8ca5ea3..54cbc78c 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs @@ -28,6 +28,14 @@ public sealed class JobController(IJobCache cache) : ControllerBase + /// 计划作业分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 作业记录计数 /// @@ -151,6 +159,14 @@ public sealed class JobController(IJobCache cache) : ControllerBase + /// 作业记录分组计数 + /// + public Task, int>>> RecordCountByAsync(QueryReq req) + { + return Cache.RecordCountByAsync(req); + } + /// /// 启用/禁用作业 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs index 642e3a86..422d4b98 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs @@ -26,6 +26,14 @@ public sealed class LoginLogController(ILoginLogCache cache) : ControllerBase + /// 登录日志分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建登录日志 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs index 2eab5227..85e2d434 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs @@ -26,6 +26,15 @@ public sealed class MenuController(IMenuCache cache) : ControllerBase + /// 菜单分组计数 + /// + [NonAction] + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建菜单 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs index e7d7afd8..55523645 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs @@ -28,6 +28,14 @@ public sealed class RequestLogController(IRequestLogCache cache) : ControllerBas return Cache.CountAsync(req); } + /// + /// 请求日志分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建请求日志 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs index 95fa6063..7cb7657e 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs @@ -26,6 +26,14 @@ public sealed class RoleController(IRoleCache cache) : ControllerBase + /// 角色分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建角色 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs index e9ea4a71..580923c8 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs @@ -27,6 +27,14 @@ public sealed class SiteMsgController(ISiteMsgCache cache) : ControllerBase + /// 站内信分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建站内信 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs index bfab91da..694567b2 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs @@ -46,6 +46,14 @@ public sealed class UserController(IUserCache cache, IConfigCache configCache) : return Cache.CountAsync(req); } + /// + /// 用户分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建用户 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs index c44c34c0..3166f208 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs @@ -27,6 +27,15 @@ public sealed class VerifyCodeController(IVerifyCodeCache cache, ICaptchaCache c return Cache.CountAsync(req); } + /// + /// 验证码分组计数 + /// + [NonAction] + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + /// /// 创建验证码 /// diff --git a/src/backend/UnitTests/Sys/ApiTests.cs b/src/backend/UnitTests/Sys/ApiTests.cs index c447d2ac..a3d48879 100644 --- a/src/backend/UnitTests/Sys/ApiTests.cs +++ b/src/backend/UnitTests/Sys/ApiTests.cs @@ -15,7 +15,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task BulkDeleteAsync(BulkReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -25,7 +25,17 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task CountAsync(QueryReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -35,7 +45,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task CreateAsync(CreateApiReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -45,7 +55,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task DeleteAsync(DelReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -55,7 +65,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task EditAsync(EditApiReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -65,7 +75,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task ExportAsync(QueryReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -75,7 +85,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task GetAsync(QueryApiReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -85,7 +95,17 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task> PagedQueryAsync(PagedQueryReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + + /// + [InlineData(default)] + [Theory] + public async Task> PlainQueryAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -95,7 +115,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Theory] public async Task> QueryAsync(QueryReq req) { - var rsp = await PostJsonAsync(typeof(DeptController), req); + var rsp = await PostJsonAsync(typeof(ApiController), req); Assert.True(rsp.IsSuccessStatusCode); return default; } @@ -104,7 +124,7 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel [Fact] public async Task SyncAsync() { - var rsp = await PostJsonAsync(typeof(DeptController)); + var rsp = await PostJsonAsync(typeof(ApiController)); Assert.True(rsp.IsSuccessStatusCode); } } \ No newline at end of file diff --git a/src/backend/UnitTests/Sys/ConfigTests.cs b/src/backend/UnitTests/Sys/ConfigTests.cs index 8db646b3..ffdae0b4 100644 --- a/src/backend/UnitTests/Sys/ConfigTests.cs +++ b/src/backend/UnitTests/Sys/ConfigTests.cs @@ -30,6 +30,16 @@ public class ConfigTests(WebTestApplicationFactory factory, ITestOutput return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(ConfigController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/DeptTests.cs b/src/backend/UnitTests/Sys/DeptTests.cs index ba0034be..0eca9c68 100644 --- a/src/backend/UnitTests/Sys/DeptTests.cs +++ b/src/backend/UnitTests/Sys/DeptTests.cs @@ -30,6 +30,16 @@ public class DeptTests(WebTestApplicationFactory factory, ITestOutputHe return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(DeptController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/DicTests.cs b/src/backend/UnitTests/Sys/DicTests.cs index dbcc5aac..2cb2ed95 100644 --- a/src/backend/UnitTests/Sys/DicTests.cs +++ b/src/backend/UnitTests/Sys/DicTests.cs @@ -31,6 +31,17 @@ public class DicTests(WebTestApplicationFactory factory, ITestOutputHel return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> ContentCountByAsync( + QueryReq req) + { + var rsp = await PostJsonAsync(typeof(DicController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/DocTests.cs b/src/backend/UnitTests/Sys/DocTests.cs index 0ac0c76f..f11b4f28 100644 --- a/src/backend/UnitTests/Sys/DocTests.cs +++ b/src/backend/UnitTests/Sys/DocTests.cs @@ -31,6 +31,17 @@ public class DocTests(WebTestApplicationFactory factory, ITestOutputHel return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> ContentCountByAsync( + QueryReq req) + { + var rsp = await PostJsonAsync(typeof(DocController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/JobTests.cs b/src/backend/UnitTests/Sys/JobTests.cs index 93828902..437ae88b 100644 --- a/src/backend/UnitTests/Sys/JobTests.cs +++ b/src/backend/UnitTests/Sys/JobTests.cs @@ -32,6 +32,16 @@ public class JobTests(WebTestApplicationFactory factory, ITestOutputHel return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(JobController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] @@ -181,6 +191,16 @@ public class JobTests(WebTestApplicationFactory factory, ITestOutputHel return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> RecordCountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(JobController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/LoginLogTests.cs b/src/backend/UnitTests/Sys/LoginLogTests.cs index 50acd7f4..c58fba98 100644 --- a/src/backend/UnitTests/Sys/LoginLogTests.cs +++ b/src/backend/UnitTests/Sys/LoginLogTests.cs @@ -30,6 +30,16 @@ public class LoginLogTests(WebTestApplicationFactory factory, ITestOutp return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(LoginLogController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/MenuTests.cs b/src/backend/UnitTests/Sys/MenuTests.cs index dd60d46f..3953c873 100644 --- a/src/backend/UnitTests/Sys/MenuTests.cs +++ b/src/backend/UnitTests/Sys/MenuTests.cs @@ -30,6 +30,16 @@ public class MenuTests(WebTestApplicationFactory factory, ITestOutputHe return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(MenuTests), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/RequestLogTests.cs b/src/backend/UnitTests/Sys/RequestLogTests.cs index 713ad900..e425b7bc 100644 --- a/src/backend/UnitTests/Sys/RequestLogTests.cs +++ b/src/backend/UnitTests/Sys/RequestLogTests.cs @@ -31,6 +31,16 @@ public class RequestLogTests(WebTestApplicationFactory factory, ITestOu return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(RequestLogController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/RoleTests.cs b/src/backend/UnitTests/Sys/RoleTests.cs index 67eea035..85ad7f51 100644 --- a/src/backend/UnitTests/Sys/RoleTests.cs +++ b/src/backend/UnitTests/Sys/RoleTests.cs @@ -30,6 +30,16 @@ public class RoleTests(WebTestApplicationFactory factory, ITestOutputHe return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(RoleController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/SiteMsgTests.cs b/src/backend/UnitTests/Sys/SiteMsgTests.cs index 7a84d49c..935cdc97 100644 --- a/src/backend/UnitTests/Sys/SiteMsgTests.cs +++ b/src/backend/UnitTests/Sys/SiteMsgTests.cs @@ -31,6 +31,16 @@ public class SiteMsgTests(WebTestApplicationFactory factory, ITestOutpu return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(SiteMsgController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/UserTests.cs b/src/backend/UnitTests/Sys/UserTests.cs index d70e674e..acace4b1 100644 --- a/src/backend/UnitTests/Sys/UserTests.cs +++ b/src/backend/UnitTests/Sys/UserTests.cs @@ -57,6 +57,17 @@ public class UserTests(WebTestApplicationFactory factory, ITestOutputHe return default; } + /// + [InlineData(default)] + [Theory] + [TestPriority(100400)] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(UserController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/backend/UnitTests/Sys/VerifyCodeTests.cs b/src/backend/UnitTests/Sys/VerifyCodeTests.cs index cd00098a..4d5383f4 100644 --- a/src/backend/UnitTests/Sys/VerifyCodeTests.cs +++ b/src/backend/UnitTests/Sys/VerifyCodeTests.cs @@ -30,6 +30,16 @@ public class VerifyCodeTests(WebTestApplicationFactory factory, ITestOu return default; } + /// + [InlineData(default)] + [Theory] + public async Task, int>>> CountByAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(VerifyCodeController), req); + Assert.True(rsp.IsSuccessStatusCode); + return default; + } + /// [InlineData(default)] [Theory] diff --git a/src/frontend/admin/src/api/sys/api.js b/src/frontend/admin/src/api/sys/api.js index 19a83f78..b9276610 100644 --- a/src/frontend/admin/src/api/sys/api.js +++ b/src/frontend/admin/src/api/sys/api.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 平面查询接口 + */ + plainQuery: { + url: `${config.API_URL}/api/sys/api/plain.query`, + name: `平面查询接口`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 查询接口 */ diff --git a/src/frontend/admin/src/api/sys/config.js b/src/frontend/admin/src/api/sys/config.js index 65a43084..6bcbbf18 100644 --- a/src/frontend/admin/src/api/sys/config.js +++ b/src/frontend/admin/src/api/sys/config.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 配置分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/config/count.by`, + name: `配置分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建配置 */ diff --git a/src/frontend/admin/src/api/sys/dept.js b/src/frontend/admin/src/api/sys/dept.js index 2ea448f4..d5331e3c 100644 --- a/src/frontend/admin/src/api/sys/dept.js +++ b/src/frontend/admin/src/api/sys/dept.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 部门分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/dept/count.by`, + name: `部门分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建部门 */ diff --git a/src/frontend/admin/src/api/sys/dic.js b/src/frontend/admin/src/api/sys/dic.js index 81f3e7fb..40636a58 100644 --- a/src/frontend/admin/src/api/sys/dic.js +++ b/src/frontend/admin/src/api/sys/dic.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 字典内容分组计数 + */ + contentCountBy: { + url: `${config.API_URL}/api/sys/dic/content.count.by`, + name: `字典内容分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建字典目录 */ diff --git a/src/frontend/admin/src/api/sys/doc.js b/src/frontend/admin/src/api/sys/doc.js index a63bc840..94b63a9b 100644 --- a/src/frontend/admin/src/api/sys/doc.js +++ b/src/frontend/admin/src/api/sys/doc.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 文档内容分组计数 + */ + contentCountBy: { + url: `${config.API_URL}/api/sys/doc/content.count.by`, + name: `文档内容分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建文档分类 */ diff --git a/src/frontend/admin/src/api/sys/job.js b/src/frontend/admin/src/api/sys/job.js index 611c8cdc..cd52273f 100644 --- a/src/frontend/admin/src/api/sys/job.js +++ b/src/frontend/admin/src/api/sys/job.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 计划作业分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/job/count.by`, + name: `计划作业分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 作业记录计数 */ @@ -192,6 +203,17 @@ export default { }, }, + /** + * 作业记录分组计数 + */ + recordCountBy: { + url: `${config.API_URL}/api/sys/job/record.count.by`, + name: `作业记录分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 启用/禁用作业 */ diff --git a/src/frontend/admin/src/api/sys/loginlog.js b/src/frontend/admin/src/api/sys/loginlog.js index 4a978f8b..50d9efbf 100644 --- a/src/frontend/admin/src/api/sys/loginlog.js +++ b/src/frontend/admin/src/api/sys/loginlog.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 登录日志分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/login.log/count.by`, + name: `登录日志分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建登录日志 */ diff --git a/src/frontend/admin/src/api/sys/requestlog.js b/src/frontend/admin/src/api/sys/requestlog.js index 3f1f5fc4..74e68138 100644 --- a/src/frontend/admin/src/api/sys/requestlog.js +++ b/src/frontend/admin/src/api/sys/requestlog.js @@ -16,6 +16,17 @@ export default { }, }, + /** + * 请求日志分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/request.log/count.by`, + name: `请求日志分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 导出请求日志 */ diff --git a/src/frontend/admin/src/api/sys/role.js b/src/frontend/admin/src/api/sys/role.js index 60292279..de189cb1 100644 --- a/src/frontend/admin/src/api/sys/role.js +++ b/src/frontend/admin/src/api/sys/role.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 角色分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/role/count.by`, + name: `角色分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建角色 */ diff --git a/src/frontend/admin/src/api/sys/sitemsg.js b/src/frontend/admin/src/api/sys/sitemsg.js index 9abe04f9..d5fed316 100644 --- a/src/frontend/admin/src/api/sys/sitemsg.js +++ b/src/frontend/admin/src/api/sys/sitemsg.js @@ -27,6 +27,17 @@ export default { }, }, + /** + * 站内信分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/site.msg/count.by`, + name: `站内信分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建站内信 */ diff --git a/src/frontend/admin/src/api/sys/user.js b/src/frontend/admin/src/api/sys/user.js index 2b3b6d89..929ebb52 100644 --- a/src/frontend/admin/src/api/sys/user.js +++ b/src/frontend/admin/src/api/sys/user.js @@ -38,6 +38,17 @@ export default { }, }, + /** + * 用户分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/user/count.by`, + name: `用户分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 创建用户 */ diff --git a/src/frontend/admin/src/assets/icons/Country.vue b/src/frontend/admin/src/assets/icons/Country.vue new file mode 100644 index 00000000..a0f80972 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Country.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/DeviceLog.vue b/src/frontend/admin/src/assets/icons/DeviceLog.vue new file mode 100644 index 00000000..1e1b8974 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/DeviceLog.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/NickName.vue b/src/frontend/admin/src/assets/icons/NickName.vue new file mode 100644 index 00000000..e4f450b3 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/NickName.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Telegram.vue b/src/frontend/admin/src/assets/icons/Telegram.vue new file mode 100644 index 00000000..b9a64456 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Telegram.vue @@ -0,0 +1,7 @@ + \ 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 f8b69bc3..991395eb 100644 --- a/src/frontend/admin/src/assets/icons/index.js +++ b/src/frontend/admin/src/assets/icons/index.js @@ -71,4 +71,8 @@ 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' -export { default as Archive } from './Archive.vue' \ No newline at end of file +export { default as Archive } from './Archive.vue' +export { default as DeviceLog } from './DeviceLog.vue' +export { default as NickName } from './NickName.vue' +export { default as Telegram } from './Telegram.vue' +export { default as Country } from './Country.vue' \ No newline at end of file diff --git a/src/frontend/admin/src/components/naSearch/index.vue b/src/frontend/admin/src/components/naSearch/index.vue index 0c453943..709fdf00 100644 --- a/src/frontend/admin/src/components/naSearch/index.vue +++ b/src/frontend/admin/src/components/naSearch/index.vue @@ -250,17 +250,6 @@ export default { return [start, end] }, }, - { - text: this.$t('最近一年'), - value: () => { - const start = new Date() - start.setHours(0, 0, 0, 0) - start.setFullYear(start.getFullYear() - 1) - const end = new Date() - end.setHours(0, 0, 0, 0) - return [start, end] - }, - }, ], options: [ { @@ -493,7 +482,7 @@ export default { async reSearch(sec) { const newParam = JSON.parse(this.aceEditorValue) this.vue.$refs.table.tableParams = newParam - this.vue.$refs.table.upData() + await this.vue.$refs.table.upData() await this.$nextTick() this.vue.$refs.table.tableParams = this.vue.query this.$emit('reSearch', newParam) diff --git a/src/frontend/admin/src/components/scSelectFilter/index.vue b/src/frontend/admin/src/components/scSelectFilter/index.vue index 76fbae67..c7222c33 100644 --- a/src/frontend/admin/src/components/scSelectFilter/index.vue +++ b/src/frontend/admin/src/components/scSelectFilter/index.vue @@ -24,10 +24,13 @@ - + {{ option.label }} - {{ option.label }} @@ -54,12 +57,12 @@ export default { } }, watch: { - data(val) { - val.forEach((item) => { - this.selected[item.key] = - this.selectedValues[item.key] || (Array.isArray(item.options) && item.options.length) ? [item.options[0].value] : [] - }) - }, + // data(val) { + // val.forEach((item) => { + // this.selected[item.key] = + // this.selectedValues[item.key] || (Array.isArray(item.options) && item.options.length) ? [item.options[0].value] : [] + // }) + // }, }, computed: { selectedString() { diff --git a/src/frontend/admin/src/components/scTable/index.vue b/src/frontend/admin/src/components/scTable/index.vue index f373d50b..521df0cf 100644 --- a/src/frontend/admin/src/components/scTable/index.vue +++ b/src/frontend/admin/src/components/scTable/index.vue @@ -520,11 +520,11 @@ export default { this.loading = false }, //更新数据 合并上一次params - upData(params = null, page = 1) { + async upData(params = null, page = 1) { this.currentPage = page this.$refs.scTable.clearSelection() Object.assign(this.tableParams, params || {}) - this.getData() + await this.getData() }, //重载数据 替换params reload(params, page = 1) { diff --git a/src/frontend/admin/src/config/appConfig.js b/src/frontend/admin/src/config/appConfig.js index c8edeb76..b3b4236b 100644 --- a/src/frontend/admin/src/config/appConfig.js +++ b/src/frontend/admin/src/config/appConfig.js @@ -5,5 +5,5 @@ export default { //标题 //APP_NAME: "标题", //接口地址,如遇跨域需使用nginx代理 - //API_URL: import.meta.env.VITE_API_URL, + API_URL: import.meta.env.VITE_API_URL, } \ No newline at end of file diff --git a/src/frontend/admin/src/config/iconSelect.js b/src/frontend/admin/src/config/iconSelect.js index 3f9302c0..5fc2b78c 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","sc-icon-Mobile","sc-icon-Email","sc-icon-SmsCode","sc-icon-MailCode","sc-icon-Archive"],"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","sc-icon-Archive","sc-icon-DeviceLog","sc-icon-NickName","sc-icon-Telegram","sc-icon-Country"],"name":"扩展"}]} \ No newline at end of file diff --git a/src/frontend/admin/src/config/index.js b/src/frontend/admin/src/config/index.js index 7f747f29..65b2d5f3 100644 --- a/src/frontend/admin/src/config/index.js +++ b/src/frontend/admin/src/config/index.js @@ -14,7 +14,7 @@ const DEFAULT_CONFIG = { API_URL: '', //请求超时 - TIMEOUT: 10000, + TIMEOUT: 60 * 60 * 1000, //追加其他头 HEADERS: {}, diff --git a/src/frontend/admin/src/locales/lang/en.js b/src/frontend/admin/src/locales/lang/en.js index ea7d17e5..a9968852 100644 --- a/src/frontend/admin/src/locales/lang/en.js +++ b/src/frontend/admin/src/locales/lang/en.js @@ -272,7 +272,7 @@ export default { 请选择月份: 'Please select a month', 请选择类型: 'Please select a type', 请选择通知类型: 'Please select a notification type', - 账号信息: 'Account information', + 基本资料: 'Basic Profile', 路径: 'Path', 路由地址: 'Routing address', 身高: 'Height', @@ -356,7 +356,6 @@ export default { 最近一月: 'Last month', 最近三月: 'Last 3 months', 最近六月: 'Last 6 months', - 最近一年: 'Last year', 查看: 'View', 编辑: 'Edit', 删除: 'Delete', diff --git a/src/frontend/admin/src/locales/lang/zh-cn.js b/src/frontend/admin/src/locales/lang/zh-cn.js index 3f618692..5d03b0b7 100644 --- a/src/frontend/admin/src/locales/lang/zh-cn.js +++ b/src/frontend/admin/src/locales/lang/zh-cn.js @@ -272,7 +272,7 @@ export default { 请选择月份: '请选择月份', 请选择类型: '请选择类型', 请选择通知类型: '请选择通知类型', - 账号信息: '账号信息', + 基本资料: '基本资料', 路径: '路径', 路由地址: '路由地址', 身高: '身高', @@ -355,7 +355,6 @@ export default { 最近一月: '最近一月', 最近三月: '最近三月', 最近六月: '最近六月', - 最近一年: '最近一年', 查看: '查看', 编辑: '编辑', 删除: '删除', diff --git a/src/frontend/admin/src/router/systemRouter.js b/src/frontend/admin/src/router/systemRouter.js index 2740ab4a..dcf27b95 100644 --- a/src/frontend/admin/src/router/systemRouter.js +++ b/src/frontend/admin/src/router/systemRouter.js @@ -12,7 +12,7 @@ const routes = [ path: '/profile', component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile'), meta: { - title: '账号信息', + title: '基本资料', }, children: [ { @@ -33,7 +33,14 @@ const routes = [ path: '/profile/account', component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/account/index.vue'), meta: { - title: '账号信息', + title: '基本资料', + }, + }, + { + path: '/profile/token', + component: () => import(/* webpackChunkName: "userRegister" */ '@/views/profile/token/index.vue'), + meta: { + title: '授权信息', }, }, { diff --git a/src/frontend/admin/src/style/app.scss b/src/frontend/admin/src/style/app.scss index d00bcc7d..0c5a5ab4 100644 --- a/src/frontend/admin/src/style/app.scss +++ b/src/frontend/admin/src/style/app.scss @@ -2,6 +2,7 @@ :root { --na-color-primary: #21a675; } + #app, body, html { @@ -540,9 +541,11 @@ textarea { .justify-content-center { justify-content: center; } + .justify-content-right { justify-content: right; } + .font-monospace { font-family: 'Lucida Console', 'Microsoft YaHei', monospace; } @@ -605,9 +608,22 @@ textarea { .color-secondary { color: var(--el-text-color-secondary); } + .color-primary { color: var(--el-text-color-primary); } + .color-regular { color: var(--el-text-color-regular); +} + +.el-header.el-header-statistics { + height: auto; + padding: 1rem 1rem 0 1rem; + display: block; +} + +.el-header.el-header-select-filter { + height: auto; + padding: 0 1rem } \ No newline at end of file diff --git a/src/frontend/admin/src/utils/tool.js b/src/frontend/admin/src/utils/tool.js index aaf16cb5..ae06417e 100644 --- a/src/frontend/admin/src/utils/tool.js +++ b/src/frontend/admin/src/utils/tool.js @@ -251,6 +251,12 @@ tool.groupSeparator = function (num) { tool.unicodeDecode = function (str) { return str.replace(/\\u([0-9a-fA-F]{4})/g, (match, grp) => String.fromCharCode(parseInt(grp, 16))) } +// 高亮关键词 +tool.highLightKeywords = function (str) { + return str + .replace(new RegExp('(Body)', 'gi'), '$1') + .replace(new RegExp('(http(s?)://.*?),', 'gi'), '$1') +} // 属性排序 tool.sortProperties = function (obj) { const sortedKeys = Object.keys(obj).sort() diff --git a/src/frontend/admin/src/views/profile/account/index.vue b/src/frontend/admin/src/views/profile/account/index.vue index 0020fb34..88fd6c12 100644 --- a/src/frontend/admin/src/views/profile/account/index.vue +++ b/src/frontend/admin/src/views/profile/account/index.vue @@ -1,5 +1,5 @@