From 3dcb6a1c344ee25e0c1763dcde2fba86fec6ad83 Mon Sep 17 00:00:00 2001 From: chfei Date: Thu, 12 Nov 2026 18:22:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Store.Management.Api/ApiClientOptions.cs | 3 - Source/Store.Management.Api/StoreApiClient.cs | 37 +- .../Transport/ApiTransport.cs | 4 +- .../Store.Management.Api/Users/UserModels.cs | 2 +- .../Controls/DataGridEx/DataGridEx.xaml | 727 +++++++++++------- .../Resources/FrameworkTheme.xaml | 13 +- .../Services/StatusBarService.cs | 44 ++ Source/Store.Management/App.xaml.cs | 2 +- Source/Store.Management/MainWindow.xaml | 45 -- Source/Store.Management/MainWindow.xaml.cs | 29 - .../ViewModels/MainViewModel.Header.cs | 16 + ...vViewModel.cs => MainViewModel.LeftNav.cs} | 29 +- .../ViewModels/MainViewModel.cs | 26 + .../ViewModels/NavItemViewModel.cs | 19 + .../ViewModels/UserManagementPageViewModel.cs | 31 +- .../Views/DataGridTestView.xaml | 4 +- .../Store.Management/Views/LeftNavView.xaml | 3 +- .../Views/MainHeaderView.xaml | 13 + .../Views/MainHeaderView.xaml.cs | 28 + Source/Store.Management/Views/MainWindow.xaml | 107 +++ .../Store.Management/Views/MainWindow.xaml.cs | 29 + .../Views/UserManagementPage.xaml | 79 +- .../Program.cs | 61 +- .../Program.cs | 11 +- 24 files changed, 882 insertions(+), 480 deletions(-) create mode 100644 Source/Store.Management.Framework/Services/StatusBarService.cs delete mode 100644 Source/Store.Management/MainWindow.xaml delete mode 100644 Source/Store.Management/MainWindow.xaml.cs create mode 100644 Source/Store.Management/ViewModels/MainViewModel.Header.cs rename Source/Store.Management/ViewModels/{LeftNavViewModel.cs => MainViewModel.LeftNav.cs} (61%) create mode 100644 Source/Store.Management/ViewModels/MainViewModel.cs create mode 100644 Source/Store.Management/ViewModels/NavItemViewModel.cs create mode 100644 Source/Store.Management/Views/MainHeaderView.xaml create mode 100644 Source/Store.Management/Views/MainHeaderView.xaml.cs create mode 100644 Source/Store.Management/Views/MainWindow.xaml create mode 100644 Source/Store.Management/Views/MainWindow.xaml.cs diff --git a/Source/Store.Management.Api/ApiClientOptions.cs b/Source/Store.Management.Api/ApiClientOptions.cs index 35e35be..0622cfb 100644 --- a/Source/Store.Management.Api/ApiClientOptions.cs +++ b/Source/Store.Management.Api/ApiClientOptions.cs @@ -3,7 +3,6 @@ namespace Store.Management.Api; public sealed class ApiClientOptions { public required Uri BaseUrl { get; init; } - public string Version { get; init; } = "v1"; public TimeSpan Timeout { get; init; } = TimeSpan.FromSeconds(30); internal void Validate() @@ -12,8 +11,6 @@ public sealed class ApiClientOptions (BaseUrl.Scheme != "https" && BaseUrl.Scheme != "http") || !string.IsNullOrEmpty(BaseUrl.UserInfo) || !string.IsNullOrEmpty(BaseUrl.Query) || !string.IsNullOrEmpty(BaseUrl.Fragment)) throw new ArgumentException("BaseUrl 必须是无凭据、查询参数和片段的 HTTP(S) 绝对地址。"); - if (!System.Text.RegularExpressions.Regex.IsMatch(Version, @"^v\d+(\.\d+)?$")) - throw new ArgumentException("Version 格式应为 v1 或 v1.0。"); if (Timeout <= TimeSpan.Zero) throw new ArgumentOutOfRangeException(nameof(Timeout)); } } diff --git a/Source/Store.Management.Api/StoreApiClient.cs b/Source/Store.Management.Api/StoreApiClient.cs index 13629a1..0b493b0 100644 --- a/Source/Store.Management.Api/StoreApiClient.cs +++ b/Source/Store.Management.Api/StoreApiClient.cs @@ -7,23 +7,26 @@ namespace Store.Management.Api; /// 一个服务地址与一个用户会话对应一个实例;在应用容器中注册为单例。 public sealed class StoreApiClient : IDisposable { - public TokenSession Session { get; } = new(); - public ApiTransport Transport { get; } - public AuthApi Auth { get; } - public UserApi Users { get; } + public TokenSession Session { get; } = new(); + public ApiTransport Transport { get; } + public AuthApi Auth { get; } + public UserApi Users { get; } - /// 可选的外部 HTTP 客户端,由调用方管理其生命周期。 - public StoreApiClient(ApiClientOptions options, HttpClient? httpClient = null) - { - ArgumentNullException.ThrowIfNull(options); - Transport = new ApiTransport(options, Session, httpClient); - Auth = new AuthApi(Transport, Session); - Users = new UserApi(Transport); - } + /// 可选的外部 HTTP 客户端,由调用方管理其生命周期。 + public StoreApiClient(ApiClientOptions options, HttpClient? httpClient = null) + { + ArgumentNullException.ThrowIfNull(options); +#if DEBUG + Session.Set("store-local-dev-7f2c9e4a6b814d38a5910e62c4f837bd"); +#endif + Transport = new ApiTransport(options, Session, httpClient); + Auth = new AuthApi(Transport, Session); + Users = new UserApi(Transport); + } - public void Dispose() - { - Session.Clear(); - Transport.Dispose(); - } + public void Dispose() + { + Session.Clear(); + Transport.Dispose(); + } } diff --git a/Source/Store.Management.Api/Transport/ApiTransport.cs b/Source/Store.Management.Api/Transport/ApiTransport.cs index c43367a..1d13667 100644 --- a/Source/Store.Management.Api/Transport/ApiTransport.cs +++ b/Source/Store.Management.Api/Transport/ApiTransport.cs @@ -12,14 +12,12 @@ public sealed class ApiTransport : IDisposable { private readonly RestClient _client; private readonly TokenSession _session; - private readonly string _version; private static readonly JsonSerializerOptions Json = new(JsonSerializerDefaults.Web); internal ApiTransport(ApiClientOptions options, TokenSession session, HttpClient? httpClient) { options.Validate(); _session = session; - _version = options.Version; RestClientOptions settings = new RestClientOptions(new Uri(options.BaseUrl.AbsoluteUri.TrimEnd('/') + "/")) { Timeout = options.Timeout, @@ -47,7 +45,7 @@ public sealed class ApiTransport : IDisposable { throw new ApiException(ApiErrorKind.Unauthorized, "请先登录。", code: 401); } - RestRequest request = new RestRequest($"{_version}/{route}", method); + RestRequest request = new RestRequest($"/{route}", method); if (token is not null) { request.AddHeader("Authorization", $"Bearer {token}"); diff --git a/Source/Store.Management.Api/Users/UserModels.cs b/Source/Store.Management.Api/Users/UserModels.cs index d23bca7..27fc1cf 100644 --- a/Source/Store.Management.Api/Users/UserModels.cs +++ b/Source/Store.Management.Api/Users/UserModels.cs @@ -6,7 +6,7 @@ namespace Store.Management.Api.Users; public sealed class UserSearchRequest : PageRequest { [StringLength(100)] public string? Keyword { get; set; } - public int? GroupId { get; set; } + public int? GroupId { get; set; } [StringLength(20)] public string? ParentUserName { get; set; } } diff --git a/Source/Store.Management.Framework/Controls/DataGridEx/DataGridEx.xaml b/Source/Store.Management.Framework/Controls/DataGridEx/DataGridEx.xaml index 73885b3..bbfa67d 100644 --- a/Source/Store.Management.Framework/Controls/DataGridEx/DataGridEx.xaml +++ b/Source/Store.Management.Framework/Controls/DataGridEx/DataGridEx.xaml @@ -1,17 +1,22 @@  + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:ext="clr-namespace:Store.Management.Framework.Controls" + xmlns:f="clr-namespace:Store.Management.Framework.Controls.Attach;assembly=Store.Management.Framework" + xmlns:local="clr-namespace:Store.Management.Framework.Controls" + xmlns:wpf="MAX.WPF" + xmlns:sys="clr-namespace:System;assembly=mscorlib"> 12 - Microsoft YaHei UI, Segoe UI - - - - - - + + + + + + @@ -449,7 +514,7 @@ - + @@ -466,194 +531,263 @@ - - - - -