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 @@ - - - - -