From e442c964b402d014b401e10f15eb4103560720f4 Mon Sep 17 00:00:00 2001 From: damon Date: Sat, 20 Jan 2024 00:14:58 +0800 Subject: [PATCH 1/3] =?UTF-8?q?Client=E5=8F=82=E6=95=B0=E7=A7=BB=E5=88=B0u?= =?UTF-8?q?rl=EF=BC=88WASM=E4=B8=8D=E6=94=AF=E6=8C=81=E5=9C=A8web=20Socket?= =?UTF-8?q?=20client=E4=B8=AD=E6=B7=BB=E5=8A=A0=E8=AF=B7=E6=B1=82=E5=A4=B4?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/HttpConfigurationClient.cs | 20 ++++++++++++++----- .../Clients/SocketConfigurationClient.cs | 14 ++++++------- .../Controllers/EventStreamController.cs | 16 +++++++-------- .../Controllers/WebSocketController.cs | 15 +++++++------- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/Source/Starfish.Client/Clients/HttpConfigurationClient.cs b/Source/Starfish.Client/Clients/HttpConfigurationClient.cs index fd6e110..3ec32da 100644 --- a/Source/Starfish.Client/Clients/HttpConfigurationClient.cs +++ b/Source/Starfish.Client/Clients/HttpConfigurationClient.cs @@ -4,13 +4,23 @@ internal class HttpConfigurationClient : IConfigurationClient { private readonly HttpClient _httpClient = new(); + private readonly string _team; + private readonly string _app; + private readonly string _secret; + private readonly string _env; + public HttpConfigurationClient(Uri host, string team, string app, string secret, string env) { _httpClient.BaseAddress = host; - _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.Team, team); - _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.App, app); - _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.Secret, secret); - _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.Env, env); + _team = team; + _app = app; + _secret = secret; + _env = env; + + // _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.Team, team); + // _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.App, app); + // _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.Secret, secret); + // _httpClient.DefaultRequestHeaders.Add(Constants.RequestHeaders.Env, env); } public async Task GetConfigurationAsync(Action dataAction, CancellationToken cancellationToken = default) @@ -20,7 +30,7 @@ public async Task GetConfigurationAsync(Action dataAction, Cancella try { attempts++; - using var request = new HttpRequestMessage(HttpMethod.Get, "es"); + using var request = new HttpRequestMessage(HttpMethod.Get, $"es?team={_team}&app={_app}&secret={_secret}&env={_env}"); var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken); diff --git a/Source/Starfish.Client/Clients/SocketConfigurationClient.cs b/Source/Starfish.Client/Clients/SocketConfigurationClient.cs index c06ea6c..e62d47b 100644 --- a/Source/Starfish.Client/Clients/SocketConfigurationClient.cs +++ b/Source/Starfish.Client/Clients/SocketConfigurationClient.cs @@ -7,20 +7,20 @@ internal class SocketConfigurationClient : IConfigurationClient private readonly ClientWebSocket _client = new(); private readonly Uri _uri; - public SocketConfigurationClient(Uri host,string team, string app, string secret, string env) + public SocketConfigurationClient(Uri host, string team, string app, string secret, string env) { - _uri = new Uri($"{host.AbsoluteUri}ws"); - _client.Options.SetRequestHeader(Constants.RequestHeaders.Team, team); - _client.Options.SetRequestHeader(Constants.RequestHeaders.App, app); - _client.Options.SetRequestHeader(Constants.RequestHeaders.Secret, secret); - _client.Options.SetRequestHeader(Constants.RequestHeaders.Env, env); + _uri = new Uri($"{host.AbsoluteUri}ws?team={team}&app={app}&secret={secret}&env={env}"); + // _client.Options.SetRequestHeader(Constants.RequestHeaders.Team, team); + // _client.Options.SetRequestHeader(Constants.RequestHeaders.App, app); + // _client.Options.SetRequestHeader(Constants.RequestHeaders.Secret, secret); + // _client.Options.SetRequestHeader(Constants.RequestHeaders.Env, env); } public async Task GetConfigurationAsync(Action dataAction, CancellationToken cancellationToken = default) { var attempts = 0; - RUN: + RUN: try { attempts++; diff --git a/Source/Starfish.Webapi/Controllers/EventStreamController.cs b/Source/Starfish.Webapi/Controllers/EventStreamController.cs index ddb2fb0..57b2642 100644 --- a/Source/Starfish.Webapi/Controllers/EventStreamController.cs +++ b/Source/Starfish.Webapi/Controllers/EventStreamController.cs @@ -31,15 +31,15 @@ public EventStreamController(ConnectionContainer container, ILoggerFactory logge /// /// [Route("/es")] - public async Task HandleAsync() + public async Task HandleAsync(string team, string app, string secret, string env) { - var appId = await AuthAsync(); - var environment = HttpContext.Request.Headers[Constants.RequestHeaders.Env]; + var appId = await AuthAsync(team, app, secret); + //var environment = HttpContext.Request.Headers[Constants.RequestHeaders.Env]; Response.Headers.Append(HeaderNames.ContentType, "text/event-stream"); Response.Headers.Append(HeaderNames.Connection, "close"); try { - var connection = _container.GetOrAdd(appId, environment, HttpContext.Connection.Id); + var connection = _container.GetOrAdd(appId, env, HttpContext.Connection.Id); while (await connection.Channel.Reader.WaitToReadAsync(HttpContext.RequestAborted)) { @@ -65,14 +65,14 @@ public async Task HandleAsync() finally { Response.Body.Close(); - _container.Remove(appId, environment, HttpContext.Connection.Id); + _container.Remove(appId, env, HttpContext.Connection.Id); } } - private Task AuthAsync() + private Task AuthAsync(string team, string app, string secret) { - var app = HttpContext.Request.Headers[Constants.RequestHeaders.App]; - var secret = HttpContext.Request.Headers[Constants.RequestHeaders.Secret]; + // var app = HttpContext.Request.Headers[Constants.RequestHeaders.App]; + // var secret = HttpContext.Request.Headers[Constants.RequestHeaders.Secret]; var service = HttpContext.RequestServices.GetRequiredService(); return service.AuthorizeAsync(app, secret, HttpContext.RequestAborted); diff --git a/Source/Starfish.Webapi/Controllers/WebSocketController.cs b/Source/Starfish.Webapi/Controllers/WebSocketController.cs index 33ba263..b820748 100644 --- a/Source/Starfish.Webapi/Controllers/WebSocketController.cs +++ b/Source/Starfish.Webapi/Controllers/WebSocketController.cs @@ -29,22 +29,21 @@ public WebSocketController(ConnectionContainer container) /// /// [Route("/ws")] - public async Task Handle() + public async Task HandleAsync(string team, string app, string secret, string env) { if (HttpContext.WebSockets.IsWebSocketRequest) { - var appId = await AuthAsync(); + var appId = await AuthAsync(team, app, secret); using var socket = await HttpContext.WebSockets.AcceptWebSocketAsync(); - var environment = HttpContext.Request.Headers[Constants.RequestHeaders.Env]; - var connection = _container.GetOrAdd(appId, environment, HttpContext.Connection.Id); + var connection = _container.GetOrAdd(appId, env, HttpContext.Connection.Id); await Task.WhenAny(MonitorChannelAsync(connection.Channel, socket), MonitorClientAsync(socket)); await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); - _container.Remove(appId, environment, HttpContext.Connection.Id); + _container.Remove(appId, env, HttpContext.Connection.Id); } else { @@ -92,10 +91,10 @@ async Task MonitorClientAsync(WebSocket webSocket) } } - private Task AuthAsync() + private Task AuthAsync(string team, string app, string secret) { - var app = HttpContext.Request.Headers[Constants.RequestHeaders.App]; - var secret = HttpContext.Request.Headers[Constants.RequestHeaders.Secret]; + // var app = HttpContext.Request.Headers[Constants.RequestHeaders.App]; + // var secret = HttpContext.Request.Headers[Constants.RequestHeaders.Secret]; var service = HttpContext.RequestServices.GetRequiredService(); return service.AuthorizeAsync(app, secret, HttpContext.RequestAborted); From f717ca4916055729ff82a82c3be2d00ab5323559 Mon Sep 17 00:00:00 2001 From: damon Date: Sat, 20 Jan 2024 00:16:09 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=AE=8C=E5=96=84=20?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=8F=82=E6=95=B0=E7=9A=84page/size=E6=94=B9?= =?UTF-8?q?=E4=B8=BAskip=E5=92=8Ccount?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contracts/IAppsApplicationService.cs | 6 +-- .../Contracts/ILogsApplicationService.cs | 6 +-- .../Contracts/ISettingApplicationService.cs | 6 +-- .../Contracts/ITeamApplicationService.cs | 2 +- .../Contracts/IUserApplicationService.cs | 6 +-- .../Implements/AppsApplicationService.cs | 6 +-- .../Implements/LogsApplicationService.cs | 4 +- .../Implements/SettingApplicationService.cs | 6 +-- .../Implements/TeamApplicationService.cs | 4 +- .../Implements/UserApplicationService.cs | 4 +- .../Subscribers/LoggingEventSubscriber.cs | 36 ++++++++++++++++ .../Domain/Repositories/ISettingRepository.cs | 2 +- .../Properties/Resources.resx | 11 +++-- .../Properties/Resources.zh-CN.resx | 11 +++-- .../Repositories/SettingRepository.cs | 5 ++- ...earchUseCase.cs => AppInfoQueryUseCase.cs} | 40 ++++++++--------- .../UseCases/Identity/UserQueryUseCase.cs | 37 ++++++++++++++-- .../UseCases/Logging/LogsQueryUseCase.cs | 36 +++++++++------- .../Setting/GetSettingItemListUseCase.cs | 32 +++++++++++--- .../UseCases/Team/TeamQueryUseCase.cs | 43 ++++++++++++++++--- Source/Starfish.Webapi/Constants.cs | 8 +++- .../Controllers/AppsController.cs | 8 ++-- .../Controllers/LogsController.cs | 8 ++-- .../Controllers/SettingController.cs | 8 ++-- .../Controllers/TeamController.cs | 20 ++++----- .../Controllers/UserController.cs | 8 ++-- .../Starfish.Webapp/Layout/MainLayout.razor | 5 +-- Source/Starfish.Webapp/Pages/Apps/Index.razor | 33 ++++++++------ .../Starfish.Webapp/Pages/Logging/Index.razor | 6 +-- .../Starfish.Webapp/Pages/Setting/Index.razor | 4 +- .../Starfish.Webapp/Pages/Team/Detail.razor | 27 ++++++++---- Source/Starfish.Webapp/Pages/Team/Index.razor | 4 +- Source/Starfish.Webapp/Pages/User/Index.razor | 4 +- .../Starfish.Webapp/Rest/Defines/IAppsApi.cs | 2 +- .../Starfish.Webapp/Rest/Defines/ILogsApi.cs | 2 +- .../Rest/Defines/ISettingApi.cs | 2 +- .../Starfish.Webapp/Rest/Defines/ITeamApi.cs | 2 +- .../Starfish.Webapp/Rest/Defines/IUserApi.cs | 2 +- Source/Starfish.Webapp/Seedwork/Constants.cs | 3 +- 39 files changed, 305 insertions(+), 154 deletions(-) rename Source/Starfish.Service/UseCases/Apps/{AppInfoSearchUseCase.cs => AppInfoQueryUseCase.cs} (51%) diff --git a/Source/Starfish.Service/Application/Contracts/IAppsApplicationService.cs b/Source/Starfish.Service/Application/Contracts/IAppsApplicationService.cs index 4fb92e1..468d0f5 100644 --- a/Source/Starfish.Service/Application/Contracts/IAppsApplicationService.cs +++ b/Source/Starfish.Service/Application/Contracts/IAppsApplicationService.cs @@ -12,11 +12,11 @@ public interface IAppsApplicationService : IApplicationService /// 获取符合条件的应用列表 /// /// 查询条件 - /// 页码 - /// 数量 + /// 页码 + /// 数量 /// /// - Task> SearchAsync(AppInfoCriteria criteria, int page, int size, CancellationToken cancellationToken = default); + Task> QueryAsync(AppInfoCriteria criteria, int skip, int count, CancellationToken cancellationToken = default); /// /// 获取符合条件的应用数量 diff --git a/Source/Starfish.Service/Application/Contracts/ILogsApplicationService.cs b/Source/Starfish.Service/Application/Contracts/ILogsApplicationService.cs index b9a18e7..dadf5c8 100644 --- a/Source/Starfish.Service/Application/Contracts/ILogsApplicationService.cs +++ b/Source/Starfish.Service/Application/Contracts/ILogsApplicationService.cs @@ -12,11 +12,11 @@ public interface ILogsApplicationService : IApplicationService /// 搜索日志 /// /// - /// - /// + /// + /// /// /// - Task> QueryAsync(OperateLogCriteria criteria, int page, int size, CancellationToken cancellationToken = default); + Task> QueryAsync(OperateLogCriteria criteria, int skip, int count, CancellationToken cancellationToken = default); /// /// 查询日志数量 diff --git a/Source/Starfish.Service/Application/Contracts/ISettingApplicationService.cs b/Source/Starfish.Service/Application/Contracts/ISettingApplicationService.cs index 60effc8..e039b65 100644 --- a/Source/Starfish.Service/Application/Contracts/ISettingApplicationService.cs +++ b/Source/Starfish.Service/Application/Contracts/ISettingApplicationService.cs @@ -13,11 +13,11 @@ public interface ISettingApplicationService : IApplicationService /// /// /// - /// - /// + /// + /// /// /// - Task> GetItemListAsync(long appId, string environment, int page, int size, CancellationToken cancellationToken = default); + Task> GetItemListAsync(long appId, string environment, int skip, int count, CancellationToken cancellationToken = default); /// /// 获取配置项数量 diff --git a/Source/Starfish.Service/Application/Contracts/ITeamApplicationService.cs b/Source/Starfish.Service/Application/Contracts/ITeamApplicationService.cs index 1e776b8..2b68004 100644 --- a/Source/Starfish.Service/Application/Contracts/ITeamApplicationService.cs +++ b/Source/Starfish.Service/Application/Contracts/ITeamApplicationService.cs @@ -5,7 +5,7 @@ namespace Nerosoft.Starfish.Application; public interface ITeamApplicationService : IApplicationService { - Task> QueryAsync(TeamCriteria criteria, int page, int size, CancellationToken cancellationToken = default); + Task> QueryAsync(TeamCriteria criteria, int skip, int count, CancellationToken cancellationToken = default); Task CountAsync(TeamCriteria criteria, CancellationToken cancellationToken = default); diff --git a/Source/Starfish.Service/Application/Contracts/IUserApplicationService.cs b/Source/Starfish.Service/Application/Contracts/IUserApplicationService.cs index 38142d7..27ff1b8 100644 --- a/Source/Starfish.Service/Application/Contracts/IUserApplicationService.cs +++ b/Source/Starfish.Service/Application/Contracts/IUserApplicationService.cs @@ -29,11 +29,11 @@ public interface IUserApplicationService : IApplicationService /// 查询符合条件的用户列表 /// /// - /// + /// /// - /// + /// /// - Task> SearchAsync(UserCriteria criteria, int page, int size, CancellationToken cancellationToken = default); + Task> QueryAsync(UserCriteria criteria, int skip, int count, CancellationToken cancellationToken = default); /// /// 查询符合条件的用户数量 diff --git a/Source/Starfish.Service/Application/Implements/AppsApplicationService.cs b/Source/Starfish.Service/Application/Implements/AppsApplicationService.cs index d559bce..50aa196 100644 --- a/Source/Starfish.Service/Application/Implements/AppsApplicationService.cs +++ b/Source/Starfish.Service/Application/Implements/AppsApplicationService.cs @@ -11,10 +11,10 @@ namespace Nerosoft.Starfish.Application; public class AppsApplicationService : BaseApplicationService, IAppsApplicationService { /// - public Task> SearchAsync(AppInfoCriteria criteria, int page, int size, CancellationToken cancellationToken = default) + public Task> QueryAsync(AppInfoCriteria criteria, int skip, int count, CancellationToken cancellationToken = default) { - var input = new AppInfoSearchInput(criteria, page, size); - var useCase = LazyServiceProvider.GetRequiredService(); + var input = new AppInfoQueryInput(criteria, skip, count); + var useCase = LazyServiceProvider.GetRequiredService(); return useCase.ExecuteAsync(input, cancellationToken) .ContinueWith(task => task.Result.Result, cancellationToken); } diff --git a/Source/Starfish.Service/Application/Implements/LogsApplicationService.cs b/Source/Starfish.Service/Application/Implements/LogsApplicationService.cs index 06b533b..99bb812 100644 --- a/Source/Starfish.Service/Application/Implements/LogsApplicationService.cs +++ b/Source/Starfish.Service/Application/Implements/LogsApplicationService.cs @@ -10,10 +10,10 @@ namespace Nerosoft.Starfish.Application; public class LogsApplicationService : BaseApplicationService, ILogsApplicationService { /// - public Task> QueryAsync(OperateLogCriteria criteria, int page, int size, CancellationToken cancellationToken = default) + public Task> QueryAsync(OperateLogCriteria criteria, int skip, int count, CancellationToken cancellationToken = default) { var useCase = LazyServiceProvider.GetService(); - return useCase.ExecuteAsync(new LogsQueryUseCaseInput(criteria, page, size), cancellationToken) + return useCase.ExecuteAsync(new LogsQueryUseCaseInput(criteria, skip, count), cancellationToken) .ContinueWith(task => task.Result.Logs, cancellationToken); } diff --git a/Source/Starfish.Service/Application/Implements/SettingApplicationService.cs b/Source/Starfish.Service/Application/Implements/SettingApplicationService.cs index 7feb0b9..02af483 100644 --- a/Source/Starfish.Service/Application/Implements/SettingApplicationService.cs +++ b/Source/Starfish.Service/Application/Implements/SettingApplicationService.cs @@ -12,10 +12,10 @@ namespace Nerosoft.Starfish.Application; public class SettingApplicationService : BaseApplicationService, ISettingApplicationService { /// - public Task> GetItemListAsync(long appId, string environment, int page, int size, CancellationToken cancellationToken = default) + public Task> GetItemListAsync(long appId, string environment, int skip, int count, CancellationToken cancellationToken = default) { var useCase = LazyServiceProvider.GetRequiredService(); - var input = new GetSettingItemListInput(appId, environment, page, size); + var input = new GetSettingItemListInput(appId, environment, skip, count); return useCase.ExecuteAsync(input, cancellationToken) .ContinueWith(t => t.Result.Result, cancellationToken); } @@ -88,7 +88,7 @@ public Task GetSettingRawAsync(long appId, string environment, Cancellat public Task GetItemsInTextAsync(long appId, string environment, string type, CancellationToken cancellationToken = default) { var parser = LazyServiceProvider.GetRequiredService().GetNamedService(type.ToLower(CultureInfo.CurrentCulture)); - return GetItemListAsync(appId, environment, 1, int.MaxValue, cancellationToken) + return GetItemListAsync(appId, environment, 0, int.MaxValue, cancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(cancellationToken); diff --git a/Source/Starfish.Service/Application/Implements/TeamApplicationService.cs b/Source/Starfish.Service/Application/Implements/TeamApplicationService.cs index 0f7a896..dd0d365 100644 --- a/Source/Starfish.Service/Application/Implements/TeamApplicationService.cs +++ b/Source/Starfish.Service/Application/Implements/TeamApplicationService.cs @@ -6,10 +6,10 @@ namespace Nerosoft.Starfish.Application; public class TeamApplicationService : BaseApplicationService, ITeamApplicationService { - public Task> QueryAsync(TeamCriteria criteria, int page, int size, CancellationToken cancellationToken = default) + public Task> QueryAsync(TeamCriteria criteria, int skip, int count, CancellationToken cancellationToken = default) { var userCase = LazyServiceProvider.GetService(); - var input = new TeamQueryInput(criteria, page, size); + var input = new TeamQueryInput(criteria, skip, count); return userCase.ExecuteAsync(input, cancellationToken) .ContinueWith(task => task.Result.Result, cancellationToken); } diff --git a/Source/Starfish.Service/Application/Implements/UserApplicationService.cs b/Source/Starfish.Service/Application/Implements/UserApplicationService.cs index b353d75..58f0bf8 100644 --- a/Source/Starfish.Service/Application/Implements/UserApplicationService.cs +++ b/Source/Starfish.Service/Application/Implements/UserApplicationService.cs @@ -27,10 +27,10 @@ public Task UpdateAsync(int id, UserUpdateDto data, CancellationToken cancellati } /// - public Task> SearchAsync(UserCriteria criteria, int page, int size, CancellationToken cancellationToken = default) + public Task> QueryAsync(UserCriteria criteria, int skip, int count, CancellationToken cancellationToken = default) { var useCase = LazyServiceProvider.GetService(); - var input = new UserSearchInput(criteria, page, size); + var input = new UserSearchInput(criteria, skip, count); return useCase.ExecuteAsync(input, cancellationToken) .ContinueWith(task => task.Result.Result, cancellationToken); } diff --git a/Source/Starfish.Service/Application/Subscribers/LoggingEventSubscriber.cs b/Source/Starfish.Service/Application/Subscribers/LoggingEventSubscriber.cs index 7c804e5..30239bd 100644 --- a/Source/Starfish.Service/Application/Subscribers/LoggingEventSubscriber.cs +++ b/Source/Starfish.Service/Application/Subscribers/LoggingEventSubscriber.cs @@ -131,6 +131,40 @@ public Task HandleAsync(AppInfoDisableEvent @event, MessageContext context, Canc return _bus.SendAsync(command, new SendOptions { RequestTraceId = context.RequestTraceId }, null, cancellationToken); } + [Subscribe] + public Task HandleAsync(AppInfoSecretChangedEvent @event, MessageContext context, CancellationToken cancellationToken = default) + { + var aggregate = @event.GetAggregate(); + var command = new OperateLogCreateCommand + { + Module = "apps", + Type = "secret", + Description = string.Format(Resources.IDS_MESSAGE_LOGS_APPS_RESET_SECRET, aggregate.Code, aggregate.Name), + OperateTime = DateTime.Now, + RequestTraceId = context.RequestTraceId, + UserName = context.User?.Identity?.Name + }; + + return _bus.SendAsync(command, new SendOptions { RequestTraceId = context.RequestTraceId }, null, cancellationToken); + } + + [Subscribe] + public Task HandleAsync(AppInfoUpdatedEvent @event, MessageContext context, CancellationToken cancellationToken = default) + { + var aggregate = @event.GetAggregate(); + var command = new OperateLogCreateCommand + { + Module = "apps", + Type = "update", + Description = string.Format(Resources.IDS_MESSAGE_LOGS_APPS_UPDATE, aggregate.Code, aggregate.Name), + OperateTime = DateTime.Now, + RequestTraceId = context.RequestTraceId, + UserName = context.User?.Identity?.Name + }; + + return _bus.SendAsync(command, new SendOptions { RequestTraceId = context.RequestTraceId }, null, cancellationToken); + } + /// /// 处理配置节点创建事件 /// @@ -196,4 +230,6 @@ public Task HandleAsync(SettingPublishedEvent @event, MessageContext context, Ca }; return _bus.SendAsync(command, new SendOptions { RequestTraceId = context.RequestTraceId }, null, cancellationToken); } + + } \ No newline at end of file diff --git a/Source/Starfish.Service/Domain/Repositories/ISettingRepository.cs b/Source/Starfish.Service/Domain/Repositories/ISettingRepository.cs index 1fff0f4..a4b006b 100644 --- a/Source/Starfish.Service/Domain/Repositories/ISettingRepository.cs +++ b/Source/Starfish.Service/Domain/Repositories/ISettingRepository.cs @@ -16,7 +16,7 @@ public interface ISettingRepository : IBaseRepository GetAsync(long appId, string environment, bool tracking, string[] properties, CancellationToken cancellationToken = default); - Task> GetItemListAsync(long id, string environment, int page, int size, CancellationToken cancellationToken = default); + Task> GetItemListAsync(long id, string environment, int skip, int count, CancellationToken cancellationToken = default); Task GetItemCountAsync(long id, string environment, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/Source/Starfish.Service/Properties/Resources.resx b/Source/Starfish.Service/Properties/Resources.resx index e6435a9..af7dd8e 100644 --- a/Source/Starfish.Service/Properties/Resources.resx +++ b/Source/Starfish.Service/Properties/Resources.resx @@ -192,11 +192,11 @@ Invalid app status. - - Page must be greater than 0. + + The query parameter 'count' must be greater than 0. - - Page size must be greater than 0. + + The query parameter 'skip' can not be a negative number. The password is not correct. @@ -300,6 +300,9 @@ Enable app {0}({1}). + + Reset app secret {0}({1}). + Update app {0}({1}). diff --git a/Source/Starfish.Service/Properties/Resources.zh-CN.resx b/Source/Starfish.Service/Properties/Resources.zh-CN.resx index 75120e3..1df030a 100644 --- a/Source/Starfish.Service/Properties/Resources.zh-CN.resx +++ b/Source/Starfish.Service/Properties/Resources.zh-CN.resx @@ -192,11 +192,11 @@ 无效的应用状态。 - - 页码必须大于0。 + + 请求参数'count'必须大于0。 - - 数量必须大于0。 + + 请求参数'skip'不能是负数。 密码不正确。 @@ -321,4 +321,7 @@ 更新配置,[应用]:{0},[环境]:{1}。 + + 重置应用密钥 {0}({1})。 + \ No newline at end of file diff --git a/Source/Starfish.Service/Repository/Repositories/SettingRepository.cs b/Source/Starfish.Service/Repository/Repositories/SettingRepository.cs index 354109d..7a3797d 100644 --- a/Source/Starfish.Service/Repository/Repositories/SettingRepository.cs +++ b/Source/Starfish.Service/Repository/Repositories/SettingRepository.cs @@ -38,7 +38,7 @@ public Task GetAsync(long appId, string environment, bool tracking, str return GetAsync(predicate, tracking, properties, cancellationToken); } - public Task> GetItemListAsync(long id, string environment, int page, int size, CancellationToken cancellationToken = default) + public Task> GetItemListAsync(long id, string environment, int skip, int count, CancellationToken cancellationToken = default) { ISpecification[] specifications = [ @@ -52,7 +52,8 @@ public Task> GetItemListAsync(long id, string environment, int .AsQueryable() .Include(t => t.Setting); return query.Where(predicate) - .Paginate(page, size) + .Skip(skip) + .Take(count) .ToListAsync(cancellationToken); } diff --git a/Source/Starfish.Service/UseCases/Apps/AppInfoSearchUseCase.cs b/Source/Starfish.Service/UseCases/Apps/AppInfoQueryUseCase.cs similarity index 51% rename from Source/Starfish.Service/UseCases/Apps/AppInfoSearchUseCase.cs rename to Source/Starfish.Service/UseCases/Apps/AppInfoQueryUseCase.cs index af73cb5..39a83f5 100644 --- a/Source/Starfish.Service/UseCases/Apps/AppInfoSearchUseCase.cs +++ b/Source/Starfish.Service/UseCases/Apps/AppInfoQueryUseCase.cs @@ -10,69 +10,69 @@ namespace Nerosoft.Starfish.UseCases; /// /// 应用信息搜索用例接口 /// -public interface IAppInfoSearchUseCase : IUseCase; +public interface IAppInfoQueryUseCase : IUseCase; /// /// 应用信息搜索用例输入 /// /// -/// -/// -public record AppInfoSearchInput(AppInfoCriteria Criteria, int Page, int Size) : IUseCaseInput; +/// +/// +public record AppInfoQueryInput(AppInfoCriteria Criteria, int Skip, int Count) : IUseCaseInput; /// /// 应用信息搜索用例输出 /// /// -public record AppInfoSearchOutput(List Result) : IUseCaseOutput; +public record AppInfoQueryOutput(List Result) : IUseCaseOutput; /// /// 应用信息搜索用例 /// -public class AppInfoSearchUseCase : IAppInfoSearchUseCase +public class AppInfoQueryUseCase : IAppInfoQueryUseCase { private readonly IAppInfoRepository _repository; - private readonly UserPrincipal _user; + private readonly UserPrincipal _identity; /// /// 构造函数 /// /// - /// + /// /// - public AppInfoSearchUseCase(IAppInfoRepository repository, UserPrincipal user) + public AppInfoQueryUseCase(IAppInfoRepository repository, UserPrincipal identity) { _repository = repository; - _user = user; + _identity = identity; } /// - public Task ExecuteAsync(AppInfoSearchInput input, CancellationToken cancellationToken = default) + public Task ExecuteAsync(AppInfoQueryInput input, CancellationToken cancellationToken = default) { - if (input.Page <= 0) + if (input.Skip < 0) { - throw new BadRequestException(Resources.IDS_ERROR_PAGE_NUMBER_MUST_GREATER_THAN_0); + throw new BadRequestException(Resources.IDS_ERROR_PARAM_SKIP_CANNOT_BE_NEGATIVE); } - if (input.Size <= 0) + if (input.Count <= 0) { - throw new BadRequestException(Resources.IDS_ERROR_PAGE_SIZE_MUST_GREATER_THAN_0); + throw new BadRequestException(Resources.IDS_ERROR_PARAM_COUNT_MUST_GREATER_THAN_0); } - if (!_user.IsAuthenticated) + if (!_identity.IsAuthenticated) { throw new AuthenticationException(); } var predicate = input.Criteria.GetSpecification().Satisfy(); - return _repository.FindAsync(predicate, Permission, input.Page, input.Size, cancellationToken) - .ContinueWith(task => new AppInfoSearchOutput(task.Result.ProjectedAsCollection()), cancellationToken); + return _repository.FindAsync(predicate, Permission, input.Skip, input.Count, cancellationToken) + .ContinueWith(task => new AppInfoQueryOutput(task.Result.ProjectedAsCollection()), cancellationToken); IQueryable Permission(IQueryable query) { - if (!_user.IsInRole("SA")) + if (!_identity.IsInRole("SA")) { - var userId = _user.GetUserIdOfInt32(); + var userId = _identity.GetUserIdOfInt32(); var teamQuery = _repository.Context.Set(); query = from app in query join member in teamQuery on app.TeamId equals member.TeamId diff --git a/Source/Starfish.Service/UseCases/Identity/UserQueryUseCase.cs b/Source/Starfish.Service/UseCases/Identity/UserQueryUseCase.cs index 1f77584..ac95232 100644 --- a/Source/Starfish.Service/UseCases/Identity/UserQueryUseCase.cs +++ b/Source/Starfish.Service/UseCases/Identity/UserQueryUseCase.cs @@ -1,5 +1,7 @@ -using Microsoft.EntityFrameworkCore; +using System.Security.Authentication; +using Microsoft.EntityFrameworkCore; using Nerosoft.Euonia.Application; +using Nerosoft.Euonia.Claims; using Nerosoft.Starfish.Domain; using Nerosoft.Starfish.Repository; using Nerosoft.Starfish.Transit; @@ -10,28 +12,55 @@ public interface IUserQueryUseCase : IUseCase public record UserSearchOutput(List Result) : IUseCaseOutput; -public record UserSearchInput(UserCriteria Criteria, int Page, int Size) : IUseCaseInput; +public record UserSearchInput(UserCriteria Criteria, int Skip, int Count) : IUseCaseInput; public class UserQueryUseCase : IUserQueryUseCase { private readonly IUserRepository _repository; + private readonly UserPrincipal _identity; - public UserQueryUseCase(IUserRepository repository) + public UserQueryUseCase(IUserRepository repository, UserPrincipal identity) { _repository = repository; + _identity = identity; } public Task ExecuteAsync(UserSearchInput input, CancellationToken cancellationToken = default) { + if (input.Skip < 0) + { + throw new BadRequestException(Resources.IDS_ERROR_PARAM_SKIP_CANNOT_BE_NEGATIVE); + } + + if (input.Count <= 0) + { + throw new BadRequestException(Resources.IDS_ERROR_PARAM_COUNT_MUST_GREATER_THAN_0); + } + + if (!_identity.IsAuthenticated) + { + throw new AuthenticationException(); + } + + if (!_identity.IsInRole("SA")) + { + throw new UnauthorizedAccessException(); + } + var specification = input.Criteria.GetSpecification(); var predicate = specification.Satisfy(); - return _repository.FindAsync(predicate, query => query.Include(nameof(User.Roles)).OrderByDescending(t => t.Id), input.Page, input.Size, cancellationToken) + return _repository.FindAsync(predicate, Collator, input.Skip, input.Count, cancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(cancellationToken); var result = task.Result.ProjectedAsCollection(); return new UserSearchOutput(result); }, cancellationToken); + + static IQueryable Collator(IQueryable query) + { + return query.Include(nameof(User.Roles)).OrderByDescending(t => t.Id); + } } } \ No newline at end of file diff --git a/Source/Starfish.Service/UseCases/Logging/LogsQueryUseCase.cs b/Source/Starfish.Service/UseCases/Logging/LogsQueryUseCase.cs index 9e48bde..d0020c5 100644 --- a/Source/Starfish.Service/UseCases/Logging/LogsQueryUseCase.cs +++ b/Source/Starfish.Service/UseCases/Logging/LogsQueryUseCase.cs @@ -1,4 +1,5 @@ -using Nerosoft.Euonia.Application; +using System.Security.Authentication; +using Nerosoft.Euonia.Application; using Nerosoft.Euonia.Claims; using Nerosoft.Starfish.Domain; using Nerosoft.Starfish.Repository; @@ -17,9 +18,9 @@ public interface ILogsQueryUseCase : IUseCase /// -/// -/// -public record LogsQueryUseCaseInput(OperateLogCriteria Criteria, int Page, int Size) : IUseCaseInput; +/// +/// +public record LogsQueryUseCaseInput(OperateLogCriteria Criteria, int Skip, int Count) : IUseCaseInput; /// /// 日志搜索用例输出 @@ -33,42 +34,47 @@ public record LogsQueryUseCaseOutput(List Logs) : IUseCaseOutput; public class LogsQueryUseCase : ILogsQueryUseCase { private readonly IOperateLogRepository _repository; - private readonly UserPrincipal _user; + private readonly UserPrincipal _identity; /// /// 构造函数 /// /// - /// - public LogsQueryUseCase(IOperateLogRepository repository, UserPrincipal user) + /// + public LogsQueryUseCase(IOperateLogRepository repository, UserPrincipal identity) { _repository = repository; - _user = user; + _identity = identity; } /// public async Task ExecuteAsync(LogsQueryUseCaseInput input, CancellationToken cancellationToken = default) { - if (input.Page <= 0) + if (input.Skip < 0) { - throw new BadRequestException(Resources.IDS_ERROR_PAGE_NUMBER_MUST_GREATER_THAN_0); + throw new BadRequestException(Resources.IDS_ERROR_PARAM_SKIP_CANNOT_BE_NEGATIVE); } - if (input.Size <= 0) + if (input.Count <= 0) { - throw new BadRequestException(Resources.IDS_ERROR_PAGE_SIZE_MUST_GREATER_THAN_0); + throw new BadRequestException(Resources.IDS_ERROR_PARAM_COUNT_MUST_GREATER_THAN_0); + } + + if (!_identity.IsAuthenticated) + { + throw new AuthenticationException(); } var specification = input.Criteria.GetSpecification(); - if (!_user.IsInRole("SA")) + if (!_identity.IsInRole("SA")) { - specification &= OperateLogSpecification.UserNameEquals(_user.Username); + specification &= OperateLogSpecification.UserNameEquals(_identity.Username); } var predicate = specification.Satisfy(); - var entities = await _repository.FindAsync(predicate, Collator, input.Page, input.Size, cancellationToken); + var entities = await _repository.FindAsync(predicate, Collator, input.Skip, input.Count, cancellationToken); var items = entities.ProjectedAsCollection(); return new LogsQueryUseCaseOutput(items); diff --git a/Source/Starfish.Service/UseCases/Setting/GetSettingItemListUseCase.cs b/Source/Starfish.Service/UseCases/Setting/GetSettingItemListUseCase.cs index d3bae85..5ad383a 100644 --- a/Source/Starfish.Service/UseCases/Setting/GetSettingItemListUseCase.cs +++ b/Source/Starfish.Service/UseCases/Setting/GetSettingItemListUseCase.cs @@ -1,4 +1,6 @@ -using Nerosoft.Euonia.Application; +using System.Security.Authentication; +using Nerosoft.Euonia.Application; +using Nerosoft.Euonia.Claims; using Nerosoft.Starfish.Domain; using Nerosoft.Starfish.Transit; @@ -20,9 +22,9 @@ public record GetSettingItemListOutput(List Result) : IUseCaseOu /// /// /// -/// -/// -public record GetSettingItemListInput(long Id, string Environment, int Page, int Size) : IUseCaseInput; +/// +/// +public record GetSettingItemListInput(long Id, string Environment, int Skip, int Count) : IUseCaseInput; /// /// 获取符合条件的配置列表用例 @@ -30,20 +32,38 @@ public record GetSettingItemListInput(long Id, string Environment, int Page, int public class GetSettingItemListUseCase : IGetSettingItemListUseCase { private readonly ISettingRepository _repository; + private readonly UserPrincipal _identity; /// /// 构造函数 /// /// - public GetSettingItemListUseCase(ISettingRepository repository) + /// + public GetSettingItemListUseCase(ISettingRepository repository, UserPrincipal identity) { _repository = repository; + _identity = identity; } /// public Task ExecuteAsync(GetSettingItemListInput input, CancellationToken cancellationToken = default) { - return _repository.GetItemListAsync(input.Id, input.Environment, input.Page, input.Size, cancellationToken) + if (input.Skip < 0) + { + throw new BadRequestException(Resources.IDS_ERROR_PARAM_SKIP_CANNOT_BE_NEGATIVE); + } + + if (input.Count <= 0) + { + throw new BadRequestException(Resources.IDS_ERROR_PARAM_COUNT_MUST_GREATER_THAN_0); + } + + if (!_identity.IsAuthenticated) + { + throw new AuthenticationException(); + } + + return _repository.GetItemListAsync(input.Id, input.Environment, input.Skip, input.Count, cancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(cancellationToken); diff --git a/Source/Starfish.Service/UseCases/Team/TeamQueryUseCase.cs b/Source/Starfish.Service/UseCases/Team/TeamQueryUseCase.cs index 0eea0a8..4fa5fc8 100644 --- a/Source/Starfish.Service/UseCases/Team/TeamQueryUseCase.cs +++ b/Source/Starfish.Service/UseCases/Team/TeamQueryUseCase.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using System.Security.Authentication; +using Microsoft.EntityFrameworkCore; using Nerosoft.Euonia.Application; using Nerosoft.Euonia.Claims; using Nerosoft.Starfish.Domain; @@ -9,7 +10,7 @@ namespace Nerosoft.Starfish.UseCases; public interface ITeamQueryUseCase : IUseCase; -public record TeamQueryInput(TeamCriteria Criteria, int Page, int Size) : IUseCaseInput; +public record TeamQueryInput(TeamCriteria Criteria, int Skip, int Count) : IUseCaseInput; public record TeamQueryOutput(List Result) : IUseCaseOutput; @@ -26,20 +27,50 @@ public TeamQueryUseCase(ITeamRepository repository, UserPrincipal identity) public Task ExecuteAsync(TeamQueryInput input, CancellationToken cancellationToken = default) { - var specification = input.Criteria.GetSpecification(); - if (!_identity.IsInRole("SA")) + if (input.Skip < 0) + { + throw new BadRequestException(Resources.IDS_ERROR_PARAM_SKIP_CANNOT_BE_NEGATIVE); + } + + if (input.Count <= 0) { - specification &= TeamSpecification.HasMember(_identity.GetUserIdOfInt32()); + throw new BadRequestException(Resources.IDS_ERROR_PARAM_COUNT_MUST_GREATER_THAN_0); } + if (!_identity.IsAuthenticated) + { + throw new AuthenticationException(); + } + + var specification = input.Criteria.GetSpecification(); + var predicate = specification.Satisfy(); - return _repository.FindAsync(predicate, query => query.Include(nameof(Team.Members)).OrderByDescending(t => t.Id), input.Page, input.Size, cancellationToken) + return _repository.FindAsync(predicate, Permission, input.Skip, input.Count, cancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(cancellationToken); var result = task.Result.ProjectedAsCollection(); return new TeamQueryOutput(result); }, cancellationToken); + + IQueryable Permission(IQueryable query) + { + if (!_identity.IsInRole("SA")) + { + var userId = _identity.GetUserIdOfInt32(); + + var memberQuery = _repository.Context.Set(); + query = from team in query + join member in memberQuery on team.Id equals member.TeamId + where member.UserId == userId + select team; + } + + { + } + + return query.OrderByDescending(t => t.Id); + } } } \ No newline at end of file diff --git a/Source/Starfish.Webapi/Constants.cs b/Source/Starfish.Webapi/Constants.cs index 466c6ee..b74e8ff 100644 --- a/Source/Starfish.Webapi/Constants.cs +++ b/Source/Starfish.Webapi/Constants.cs @@ -2,11 +2,17 @@ internal class Constants { - public class RequestHeaders + public static class RequestHeaders { public const string Team = "starfish-team"; public const string App = "starfish-app"; public const string Secret = "starfish-secret"; public const string Env = "starfish-env"; } + + public static class Query + { + public const int Skip = 0; + public const int Count = 20; + } } \ No newline at end of file diff --git a/Source/Starfish.Webapi/Controllers/AppsController.cs b/Source/Starfish.Webapi/Controllers/AppsController.cs index c1b3d62..bf71b4a 100644 --- a/Source/Starfish.Webapi/Controllers/AppsController.cs +++ b/Source/Starfish.Webapi/Controllers/AppsController.cs @@ -28,14 +28,14 @@ public AppsController(IAppsApplicationService service) /// 搜索应用信息 /// /// - /// - /// + /// + /// /// [HttpGet] [Produces>] - public async Task SearchAsync([FromQuery] AppInfoCriteria criteria, int page = 1, int size = 10) + public async Task SearchAsync([FromQuery] AppInfoCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count) { - var result = await _service.SearchAsync(criteria, page, size, HttpContext.RequestAborted); + var result = await _service.QueryAsync(criteria, skip, count, HttpContext.RequestAborted); return Ok(result); } diff --git a/Source/Starfish.Webapi/Controllers/LogsController.cs b/Source/Starfish.Webapi/Controllers/LogsController.cs index 0d8e623..bfe1c9f 100644 --- a/Source/Starfish.Webapi/Controllers/LogsController.cs +++ b/Source/Starfish.Webapi/Controllers/LogsController.cs @@ -28,14 +28,14 @@ public LogsController(ILogsApplicationService service) /// 列表查询 /// /// 查询条件 - /// 页码,起始值为1。 - /// 数量 + /// 页码,起始值为1。 + /// 数量 /// 符合条件的日志列表 [HttpGet] [Produces>] - public async Task QueryAsync([FromQuery] OperateLogCriteria criteria, int page = 1, int size = 10) + public async Task QueryAsync([FromQuery] OperateLogCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count) { - var result = await _service.QueryAsync(criteria, page, size); + var result = await _service.QueryAsync(criteria, skip, count); return Ok(result); } diff --git a/Source/Starfish.Webapi/Controllers/SettingController.cs b/Source/Starfish.Webapi/Controllers/SettingController.cs index 1756b26..8e10ba5 100644 --- a/Source/Starfish.Webapi/Controllers/SettingController.cs +++ b/Source/Starfish.Webapi/Controllers/SettingController.cs @@ -30,13 +30,13 @@ public SettingController(ISettingApplicationService service) /// /// 应用Id /// 应用环境 - /// - /// + /// + /// /// /// [HttpGet("item")] [Produces(typeof(List))] - public async Task GetItemListAsync(long id, string environment, int page = 1, int size = 20, [FromHeader(Name = "x-format")] string format = null) + public async Task GetItemListAsync(long id, string environment, int skip = Constants.Query.Skip, int count = Constants.Query.Count, [FromHeader(Name = "x-format")] string format = null) { switch (format) { @@ -47,7 +47,7 @@ public async Task GetItemListAsync(long id, string environment, i var json = await _service.GetItemsInTextAsync(id, environment, "json", HttpContext.RequestAborted); return Ok(json); default: - var result = await _service.GetItemListAsync(id, environment, page, size, HttpContext.RequestAborted); + var result = await _service.GetItemListAsync(id, environment, skip, count, HttpContext.RequestAborted); return Ok(result); } } diff --git a/Source/Starfish.Webapi/Controllers/TeamController.cs b/Source/Starfish.Webapi/Controllers/TeamController.cs index 67becad..9eac61c 100644 --- a/Source/Starfish.Webapi/Controllers/TeamController.cs +++ b/Source/Starfish.Webapi/Controllers/TeamController.cs @@ -28,14 +28,14 @@ public TeamController(ITeamApplicationService service) /// 搜索团队 /// /// - /// - /// + /// + /// /// [HttpGet] [Produces(typeof(List))] - public async Task QueryAsync([FromQuery] TeamCriteria criteria, int page = 1, int size = 10) + public async Task QueryAsync([FromQuery] TeamCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count) { - var result = await _service.QueryAsync(criteria, page, size, HttpContext.RequestAborted); + var result = await _service.QueryAsync(criteria, skip, count, HttpContext.RequestAborted); return Ok(result); } @@ -52,11 +52,11 @@ public async Task CountAsync([FromQuery] TeamCriteria criteria) return Ok(result); } - /// - /// 获取团队详情 - /// - /// - /// + /// + /// 获取团队详情 + /// + /// + /// [HttpGet("{id:int}")] [Produces(typeof(TeamDetailDto))] public async Task GetAsync(int id) @@ -64,7 +64,7 @@ public async Task GetAsync(int id) var result = await _service.GetAsync(id, HttpContext.RequestAborted); return Ok(result); } - + /// /// 创建团队 /// diff --git a/Source/Starfish.Webapi/Controllers/UserController.cs b/Source/Starfish.Webapi/Controllers/UserController.cs index 00304c9..8743087 100644 --- a/Source/Starfish.Webapi/Controllers/UserController.cs +++ b/Source/Starfish.Webapi/Controllers/UserController.cs @@ -28,14 +28,14 @@ public UserController(IUserApplicationService service) /// 查询用户列表 /// /// - /// - /// + /// + /// /// [HttpGet] [Produces(typeof(List))] - public async Task QueryAsync([FromQuery] UserCriteria criteria, int page = 1, int size = 10) + public async Task QueryAsync([FromQuery] UserCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count) { - var result = await _service.SearchAsync(criteria, page, size, HttpContext.RequestAborted); + var result = await _service.QueryAsync(criteria, skip, count, HttpContext.RequestAborted); return Ok(result); } diff --git a/Source/Starfish.Webapp/Layout/MainLayout.razor b/Source/Starfish.Webapp/Layout/MainLayout.razor index e3885e0..aef4046 100644 --- a/Source/Starfish.Webapp/Layout/MainLayout.razor +++ b/Source/Starfish.Webapp/Layout/MainLayout.razor @@ -33,10 +33,7 @@ @(Resources.IDS_MENU_TEXT_USER) } @(Resources.IDS_MENU_TEXT_TEAM) - @if (Identity?.IsInRole("SA") == true) - { - @(Resources.IDS_MENU_TEXT_LOGS) - } + @(Resources.IDS_MENU_TEXT_LOGS) diff --git a/Source/Starfish.Webapp/Pages/Apps/Index.razor b/Source/Starfish.Webapp/Pages/Apps/Index.razor index ac25c4b..b3bac48 100644 --- a/Source/Starfish.Webapp/Pages/Apps/Index.razor +++ b/Source/Starfish.Webapp/Pages/Apps/Index.razor @@ -3,6 +3,7 @@ @attribute [Authorize] @inject IDialogService DialogService +@inject IToastService ToastService @inject NavigationManager Navigation @inject IAppsApi Api @@ -53,7 +54,7 @@ private GridItemsProvider _provider; - private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.DefaultSize }; + private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.Count }; private AppInfoCriteria Criteria { get; } = new(); @@ -70,7 +71,7 @@ List items = null; var tasks = new List { - Api.QueryAsync(Criteria, request.StartIndex + 1, Pagination.ItemsPerPage, request.CancellationToken) + Api.QueryAsync(Criteria, request.StartIndex, Pagination.ItemsPerPage, request.CancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(request.CancellationToken); @@ -113,19 +114,27 @@ private async Task OnDeleteClicked(long id, string name) { - var message = string.Format(Resources.IDS_APPS_INDEX_REMOVE_CONFIRMATION_MESSAGE, name); - var confirmation = await DialogService.ShowConfirmationAsync(message, primaryText: Resources.IDS_COMMON_YES, secondaryText: Resources.IDS_COMMON_NO, title: Resources.IDS_APPS_INDEX_REMOVE_CONFIRMATION_TITLE); + var confirmationMessage = string.Format(Resources.IDS_APPS_INDEX_REMOVE_CONFIRMATION_MESSAGE, name); + var confirmation = await DialogService.ShowConfirmationAsync(confirmationMessage, primaryText: Resources.IDS_COMMON_YES, secondaryText: Resources.IDS_COMMON_NO, title: Resources.IDS_APPS_INDEX_REMOVE_CONFIRMATION_TITLE); var result = await confirmation.Result; if (!result.Cancelled) { - await Api.DeleteAsync(id) - .ContinueWith(task => - { - task.WaitAndUnwrapException(); - task.Result.EnsureSuccess(); - }); - await Pagination.SetCurrentPageIndexAsync(0); - } + try + { + await Api.DeleteAsync(id) + .ContinueWith(task => + { + task.WaitAndUnwrapException(); + task.Result.EnsureSuccess(); + }); + await Pagination.SetCurrentPageIndexAsync(0); + } + catch (Exception exception) + { + var message = exception.GetPromptMessage(); + ToastService.ShowError(message); + } + } } private async Task OnResetSecretClicked(long id) diff --git a/Source/Starfish.Webapp/Pages/Logging/Index.razor b/Source/Starfish.Webapp/Pages/Logging/Index.razor index 2f21146..62492a7 100644 --- a/Source/Starfish.Webapp/Pages/Logging/Index.razor +++ b/Source/Starfish.Webapp/Pages/Logging/Index.razor @@ -1,6 +1,6 @@ @page "/logs" -@attribute [Authorize(Roles = "SA")] +@attribute [Authorize] @inject ILogsApi LogsApi @inject IDialogService DialogService @@ -47,7 +47,7 @@ @code { private GridItemsProvider _provider; - private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.DefaultSize }; + private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.Count }; private OperateLogCriteria Criteria { get; } = new(); @@ -65,7 +65,7 @@ List items = null; var tasks = new List { - LogsApi.QueryAsync(Criteria, request.StartIndex / Constants.Query.DefaultSize + 1, Pagination.ItemsPerPage, request.CancellationToken) + LogsApi.QueryAsync(Criteria, request.StartIndex, Pagination.ItemsPerPage, request.CancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(request.CancellationToken); diff --git a/Source/Starfish.Webapp/Pages/Setting/Index.razor b/Source/Starfish.Webapp/Pages/Setting/Index.razor index ee16a43..f72c107 100644 --- a/Source/Starfish.Webapp/Pages/Setting/Index.razor +++ b/Source/Starfish.Webapp/Pages/Setting/Index.razor @@ -99,7 +99,7 @@ private GridItemsProvider _provider; - private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.DefaultSize }; + private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.Count }; private int Total { get; set; } @@ -123,7 +123,7 @@ List items = null; var tasks = new List { - SettingApi.GetItemListAsync(Id, Environment, request.StartIndex + 1, Pagination.ItemsPerPage, request.CancellationToken) + SettingApi.GetItemListAsync(Id, Environment, request.StartIndex, Pagination.ItemsPerPage, request.CancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(request.CancellationToken); diff --git a/Source/Starfish.Webapp/Pages/Team/Detail.razor b/Source/Starfish.Webapp/Pages/Team/Detail.razor index 66a97dd..6978ec2 100644 --- a/Source/Starfish.Webapp/Pages/Team/Detail.razor +++ b/Source/Starfish.Webapp/Pages/Team/Detail.razor @@ -3,6 +3,7 @@ @inject ITeamApi TeamApi @inject IAppsApi AppsApi @inject IDialogService DialogService +@inject IToastService ToastService @(Resources.IDS_MENU_TEXT_HOME) @@ -153,15 +154,23 @@ var result = await confirmation.Result; if (!result.Cancelled) { - await TeamApi.RemoveMemberAsync(Id, [userId]) - .ContinueWith(task => - { - task.WaitAndUnwrapException(); - task.Result.EnsureSuccess(); - }); - await LoadMembersAsync(); - StateHasChanged(); - } + try + { + await TeamApi.RemoveMemberAsync(Id, [userId]) + .ContinueWith(task => + { + task.WaitAndUnwrapException(); + task.Result.EnsureSuccess(); + }); + await LoadMembersAsync(); + StateHasChanged(); + } + catch (Exception exception) + { + var message = exception.GetPromptMessage(); + ToastService.ShowError(message); + } + } } private async Task OnAppendMemberClicked() diff --git a/Source/Starfish.Webapp/Pages/Team/Index.razor b/Source/Starfish.Webapp/Pages/Team/Index.razor index 461059e..9e98282 100644 --- a/Source/Starfish.Webapp/Pages/Team/Index.razor +++ b/Source/Starfish.Webapp/Pages/Team/Index.razor @@ -51,7 +51,7 @@ private GridItemsProvider _provider; - private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.DefaultSize }; + private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.Count }; private TeamCriteria Criteria { get; } = new(); @@ -68,7 +68,7 @@ List items = null; var tasks = new List { - Api.QueryAsync(Criteria, request.StartIndex + 1, Pagination.ItemsPerPage, request.CancellationToken) + Api.QueryAsync(Criteria, request.StartIndex, Pagination.ItemsPerPage, request.CancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(request.CancellationToken); diff --git a/Source/Starfish.Webapp/Pages/User/Index.razor b/Source/Starfish.Webapp/Pages/User/Index.razor index e7c0ff6..2e89b1c 100644 --- a/Source/Starfish.Webapp/Pages/User/Index.razor +++ b/Source/Starfish.Webapp/Pages/User/Index.razor @@ -47,7 +47,7 @@ @code { private GridItemsProvider _provider; - private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.DefaultSize }; + private PaginationState Pagination { get; } = new() { ItemsPerPage = Constants.Query.Count }; private UserCriteria Criteria { get; } = new(); @@ -60,7 +60,7 @@ List items = null; var tasks = new List { - Api.SearchAsync(Criteria, request.StartIndex + 1, Pagination.ItemsPerPage, request.CancellationToken) + Api.SearchAsync(Criteria, request.StartIndex, Pagination.ItemsPerPage, request.CancellationToken) .ContinueWith(task => { task.WaitAndUnwrapException(request.CancellationToken); diff --git a/Source/Starfish.Webapp/Rest/Defines/IAppsApi.cs b/Source/Starfish.Webapp/Rest/Defines/IAppsApi.cs index bbd04da..92db88b 100644 --- a/Source/Starfish.Webapp/Rest/Defines/IAppsApi.cs +++ b/Source/Starfish.Webapp/Rest/Defines/IAppsApi.cs @@ -6,7 +6,7 @@ namespace Nerosoft.Starfish.Webapp.Rest; internal interface IAppsApi { [Get("/api/apps")] - Task>> QueryAsync([Query] AppInfoCriteria criteria, int page, int size, CancellationToken cancellationToken = default); + Task>> QueryAsync([Query] AppInfoCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count, CancellationToken cancellationToken = default); [Get("/api/apps/count")] Task> CountAsync([Query] AppInfoCriteria criteria, CancellationToken cancellationToken = default); diff --git a/Source/Starfish.Webapp/Rest/Defines/ILogsApi.cs b/Source/Starfish.Webapp/Rest/Defines/ILogsApi.cs index 5ea8165..f2c1a1e 100644 --- a/Source/Starfish.Webapp/Rest/Defines/ILogsApi.cs +++ b/Source/Starfish.Webapp/Rest/Defines/ILogsApi.cs @@ -6,7 +6,7 @@ namespace Nerosoft.Starfish.Webapp.Rest; internal interface ILogsApi { [Get("/api/logs")] - Task>> QueryAsync([Query] OperateLogCriteria criteria, int page = 1, int size = 20, CancellationToken cancellationToken = default); + Task>> QueryAsync([Query] OperateLogCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count, CancellationToken cancellationToken = default); [Get("/api/logs/count")] Task> CountAsync([Query] OperateLogCriteria criteria, CancellationToken cancellationToken = default); diff --git a/Source/Starfish.Webapp/Rest/Defines/ISettingApi.cs b/Source/Starfish.Webapp/Rest/Defines/ISettingApi.cs index 44289ef..540bc2a 100644 --- a/Source/Starfish.Webapp/Rest/Defines/ISettingApi.cs +++ b/Source/Starfish.Webapp/Rest/Defines/ISettingApi.cs @@ -7,7 +7,7 @@ internal interface ISettingApi { [Get("/api/apps/{id}/setting/{environment}/item")] [Headers("x-format: application/json")] - Task>> GetItemListAsync(long id, string environment, int page, int size, CancellationToken cancellationToken = default); + Task>> GetItemListAsync(long id, string environment, int skip = Constants.Query.Skip, int count = Constants.Query.Count, CancellationToken cancellationToken = default); [Get("/api/apps/{id}/setting/{environment}/item/count")] Task> GetItemCountAsync(long id, string environment, CancellationToken cancellationToken = default); diff --git a/Source/Starfish.Webapp/Rest/Defines/ITeamApi.cs b/Source/Starfish.Webapp/Rest/Defines/ITeamApi.cs index 9e0460a..530ea0b 100644 --- a/Source/Starfish.Webapp/Rest/Defines/ITeamApi.cs +++ b/Source/Starfish.Webapp/Rest/Defines/ITeamApi.cs @@ -6,7 +6,7 @@ namespace Nerosoft.Starfish.Webapp.Rest; internal interface ITeamApi { [Get("/api/team")] - Task>> QueryAsync([Query] TeamCriteria criteria, int page, int size, CancellationToken cancellationToken = default); + Task>> QueryAsync([Query] TeamCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count, CancellationToken cancellationToken = default); [Get("/api/team/count")] Task> CountAsync([Query] TeamCriteria criteria, CancellationToken cancellationToken = default); diff --git a/Source/Starfish.Webapp/Rest/Defines/IUserApi.cs b/Source/Starfish.Webapp/Rest/Defines/IUserApi.cs index 64183f6..bae57fe 100644 --- a/Source/Starfish.Webapp/Rest/Defines/IUserApi.cs +++ b/Source/Starfish.Webapp/Rest/Defines/IUserApi.cs @@ -6,7 +6,7 @@ namespace Nerosoft.Starfish.Webapp.Rest; internal interface IUserApi { [Get("/api/user")] - Task>> SearchAsync([Query] UserCriteria criteria, int page, int size, CancellationToken cancellationToken = default); + Task>> SearchAsync([Query] UserCriteria criteria, int skip = Constants.Query.Skip, int count = Constants.Query.Count, CancellationToken cancellationToken = default); [Get("/api/user/count")] Task> CountAsync([Query] UserCriteria criteria, CancellationToken cancellationToken = default); diff --git a/Source/Starfish.Webapp/Seedwork/Constants.cs b/Source/Starfish.Webapp/Seedwork/Constants.cs index 987ec21..7d1a9a5 100644 --- a/Source/Starfish.Webapp/Seedwork/Constants.cs +++ b/Source/Starfish.Webapp/Seedwork/Constants.cs @@ -10,7 +10,8 @@ public static class LocalStorage public static class Query { - public const int DefaultSize = 20; + public const int Skip = 0; + public const int Count = 20; } public static class Setting From a3072eba31bf1a5543dadfbec208fe9c00bfce0d Mon Sep 17 00:00:00 2001 From: damon Date: Sat, 20 Jan 2024 22:25:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=B9=81=E4=BD=93?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...rces.zh-CN.resx => Resources.zh-Hans.resx} | 0 .../IDictionaryApplicationService.cs | 7 - .../DictionaryApplicationService.cs | 39 --- .../Properties/Resources.resx | 23 +- ...rces.zh-CN.resx => Resources.zh-Hans.resx} | 35 +-- .../Properties/Resources.zh-Hant.resx | 286 ++++++++++++++++++ .../Controllers/DictionaryController.cs | 12 - ...rces.zh-CN.resx => Resources.zh-Hans.resx} | 54 ++-- 8 files changed, 321 insertions(+), 135 deletions(-) rename Source/Starfish.Client/Properties/{Resources.zh-CN.resx => Resources.zh-Hans.resx} (100%) rename Source/Starfish.Service/Properties/{Resources.zh-CN.resx => Resources.zh-Hans.resx} (93%) create mode 100644 Source/Starfish.Service/Properties/Resources.zh-Hant.resx rename Source/Starfish.Webapp/Properties/{Resources.zh-CN.resx => Resources.zh-Hans.resx} (100%) diff --git a/Source/Starfish.Client/Properties/Resources.zh-CN.resx b/Source/Starfish.Client/Properties/Resources.zh-Hans.resx similarity index 100% rename from Source/Starfish.Client/Properties/Resources.zh-CN.resx rename to Source/Starfish.Client/Properties/Resources.zh-Hans.resx diff --git a/Source/Starfish.Service/Application/Contracts/IDictionaryApplicationService.cs b/Source/Starfish.Service/Application/Contracts/IDictionaryApplicationService.cs index dbc3c84..4daf6e0 100644 --- a/Source/Starfish.Service/Application/Contracts/IDictionaryApplicationService.cs +++ b/Source/Starfish.Service/Application/Contracts/IDictionaryApplicationService.cs @@ -28,11 +28,4 @@ public interface IDictionaryApplicationService : IApplicationService /// /// Task> GetDatabaseTypeItemsAsync(CancellationToken cancellationToken = default); - - /// - /// 获取可用的配置节点类型列表 - /// - /// - /// - Task> GetSettingItemTypeItemsAsync(CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/Source/Starfish.Service/Application/Implements/DictionaryApplicationService.cs b/Source/Starfish.Service/Application/Implements/DictionaryApplicationService.cs index a321ba9..96afdbd 100644 --- a/Source/Starfish.Service/Application/Implements/DictionaryApplicationService.cs +++ b/Source/Starfish.Service/Application/Implements/DictionaryApplicationService.cs @@ -105,43 +105,4 @@ public Task> GetDatabaseTypeItemsAsync(CancellationToken }; return Task.FromResult(items); } - - /// - public Task> GetSettingItemTypeItemsAsync(CancellationToken cancellationToken = default) - { - var items = new List - { - new() - { - Name = nameof(SettingItemType.Root), - Description = Resources.IDS_ENUM_SETTING_ITEM_TYPE_ROOT - }, - new() - { - Name = nameof(SettingItemType.Array), - Description = Resources.IDS_ENUM_SETTING_ITEM_TYPE_ARRAY - }, - new() - { - Name = nameof(SettingItemType.Object), - Description = Resources.IDS_ENUM_SETTING_ITEM_TYPE_OBJECT - }, - new() - { - Name = nameof(SettingItemType.String), - Description = Resources.IDS_ENUM_SETTING_ITEM_TYPE_STRING - }, - new() - { - Name = nameof(SettingItemType.Number), - Description = Resources.IDS_ENUM_SETTING_ITEM_TYPE_NUMBER - }, - new() - { - Name = nameof(SettingItemType.Boolean), - Description = Resources.IDS_ENUM_SETTING_ITEM_TYPE_BOOLEAN - } - }; - return Task.FromResult(items); - } } \ No newline at end of file diff --git a/Source/Starfish.Service/Properties/Resources.resx b/Source/Starfish.Service/Properties/Resources.resx index af7dd8e..10e1a50 100644 --- a/Source/Starfish.Service/Properties/Resources.resx +++ b/Source/Starfish.Service/Properties/Resources.resx @@ -136,7 +136,7 @@ User Acceptance Testing - Super administrator + System administrator Disabled @@ -144,27 +144,6 @@ Enabled - - Array - - - Boolean - - - Number - - - Object - - - Referer - - - Root - - - String - Disabled diff --git a/Source/Starfish.Service/Properties/Resources.zh-CN.resx b/Source/Starfish.Service/Properties/Resources.zh-Hans.resx similarity index 93% rename from Source/Starfish.Service/Properties/Resources.zh-CN.resx rename to Source/Starfish.Service/Properties/Resources.zh-Hans.resx index 1df030a..4b2eb0c 100644 --- a/Source/Starfish.Service/Properties/Resources.zh-CN.resx +++ b/Source/Starfish.Service/Properties/Resources.zh-Hans.resx @@ -136,7 +136,7 @@ 用户验收测试 - 超级管理员 + 系统管理员 禁用 @@ -144,27 +144,6 @@ 启用 - - 集合 - - - 布尔 - - - 数字 - - - 对象 - - - 引用 - - - 根节点 - - - 字符串 - 禁用 @@ -181,7 +160,7 @@ 应用唯一编码不可用。 - 应用信息不存在,[Id]:{0}。 + 应用不存在,[Id]:{0}。 密钥不符合规则。 @@ -202,10 +181,10 @@ 密码不正确。 - Token已失效。 + 刷新令牌已过期。 - 无效的Token。 + 刷新令牌无效。 Token不能为空。 @@ -300,6 +279,9 @@ 启用应用 {0}({1})。 + + 重置应用密钥 {0}({1})。 + 更新应用 {0}({1})。 @@ -321,7 +303,4 @@ 更新配置,[应用]:{0},[环境]:{1}。 - - 重置应用密钥 {0}({1})。 - \ No newline at end of file diff --git a/Source/Starfish.Service/Properties/Resources.zh-Hant.resx b/Source/Starfish.Service/Properties/Resources.zh-Hant.resx new file mode 100644 index 0000000..e210119 --- /dev/null +++ b/Source/Starfish.Service/Properties/Resources.zh-Hant.resx @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 開發環境 + + + 性能評估測試 + + + 生產環境 + + + 模擬測試 + + + 系統整合測試 + + + 用戶驗收測試 + + + 系統管理員 + + + 停用 + + + 啟用 + + + 停用 + + + 待發表 + + + 已發表 + + + 應用程式唯一代碼不能為空。 + + + 應用程式唯一代碼不可用。 + + + 應用程式不存在,[Id]:{0}。 + + + 密鑰不符合規則。 + + + 需要應用程式密鑰。 + + + 應用程式狀態無效。 + + + 請求參數“count”必須大於0。 + + + 請求參數“skip”不能為負數。 + + + 密碼不正確。 + + + 刷新令牌已過期。 + + + 刷新令牌無效。 + + + 刷新令牌不能為空。 + + + 不支援資料格式“{0}”。 + + + 資料格式不能為空。 + + + 設置已停用,[應用程式]:{0},[環境]:{1}。 + + + 設置重複,[應用程式]:{0},[環境]:{1}。 + + + 設置項目“{0}”已經存在。 + + + 設置項目“{0}”不存在。 + + + 設定不存在,[應用程式]:{0},[環境]:{1}。 + + + 沒有待發布的設定。 + + + 版本號碼“{0}”已存在。 + + + 團隊不存在,[Id]:{0}。 + + + 僅允許團隊負責人新增/移除團隊成員。 + + + 僅允許團隊負責人更新資訊。 + + + 不能移除團隊負責人。 + + + 用戶Id(s)不能為空。 + + + 不支援的緩存提供者“{0}”。 + + + 不支援的資料庫提供者“{0}”。 + + + 不支援的服務總線提供者“{0}”。 + + + 電子郵件“{0}”不可用。 + + + 用戶被鎖定。 + + + 預留帳號不允許設定角色。 + + + 預留帳號不允許刪除。 + + + 用戶不存在,[Id]:{0}。 + + + 密碼長度必須為8-32個字符,至少包含1個大寫字母,1個小寫字母。 + + + 密碼不能為空。 + + + 用戶名或密碼錯誤。 + + + 用戶名“{0}”不可用。 + + + 新增應用程式 {0}({1})。 + + + 刪除應用程式 {0}({1})。 + + + 停用應用程式 {0}({1})。 + + + 啟用應用程式 {0}({1})。 + + + 重設應用程式密鑰 {0}({1})。 + + + 更新應用程式 {0}({1})。 + + + 用戶身份驗證失敗。 + + + 用戶身份驗證成功。 + + + 建立設置,[應用程式]:{0},[環境]:{1}。 + + + 刪除設置,[應用程式]:{0},[環境]:{1}。 + + + 發佈設置,[應用程式]:{0},[環境]:{1}。 + + + 更新設置,[應用程式]:{0},[環境]:{1}。 + + \ No newline at end of file diff --git a/Source/Starfish.Webapi/Controllers/DictionaryController.cs b/Source/Starfish.Webapi/Controllers/DictionaryController.cs index 8661a4d..8546a10 100644 --- a/Source/Starfish.Webapi/Controllers/DictionaryController.cs +++ b/Source/Starfish.Webapi/Controllers/DictionaryController.cs @@ -59,16 +59,4 @@ public async Task GetDatabaseTypeItemsAsync() var result = await _service.GetDatabaseTypeItemsAsync(); return Ok(result); } - - /// - /// 获取支持的配置节点类型列表 - /// - /// - [HttpGet("setting-item-type")] - [Produces>] - public async Task GetSettingItemTypeItemsAsync() - { - var result = await _service.GetSettingItemTypeItemsAsync(); - return Ok(result); - } } \ No newline at end of file diff --git a/Source/Starfish.Webapp/Properties/Resources.zh-CN.resx b/Source/Starfish.Webapp/Properties/Resources.zh-Hans.resx similarity index 100% rename from Source/Starfish.Webapp/Properties/Resources.zh-CN.resx rename to Source/Starfish.Webapp/Properties/Resources.zh-Hans.resx index c34ff4d..ef249f9 100644 --- a/Source/Starfish.Webapp/Properties/Resources.zh-CN.resx +++ b/Source/Starfish.Webapp/Properties/Resources.zh-Hans.resx @@ -252,6 +252,33 @@ 用户名登录 + + 日志详情 + + + 日志内容 + + + 错误信息 + + + 模块 + + + 操作时间 + + + 请求识别Id + + + 类型 + + + 用户名 + + + 查看详情 + 日志内容 @@ -456,31 +483,4 @@ 用户名 - - 查看详情 - - - 日志详情 - - - 日志内容 - - - 错误信息 - - - 模块 - - - 操作时间 - - - 类型 - - - 用户名 - - - 请求识别Id - \ No newline at end of file