diff --git a/.gitignore b/.gitignore index bbd88c0..02f9e1c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ Logs/ node_modules/ -*.lscache \ No newline at end of file +*.lscache +/src/SimpleAdmin.Api/wwwroot/ diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..d24302d --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,6 @@ + + + + 8.0.5.12 + + diff --git a/SimpleAdmin.sln b/SimpleAdmin.sln index a5b3729..41c7569 100644 --- a/SimpleAdmin.sln +++ b/SimpleAdmin.sln @@ -10,11 +10,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "items", "items", "{BE5132AD NuGet.Config = NuGet.Config SPEC.md = SPEC.md 开发复刻说明.md = 开发复刻说明.md - oms表结构与接口设计2026040802.md = oms表结构与接口设计2026040802.md .gitignore = .gitignore .dockerignore = .dockerignore oms表结构与接口设计20260427.md = oms表结构与接口设计20260427.md db.sql = db.sql + Directory.Build.props = Directory.Build.props EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAdmin.Api", "src\SimpleAdmin.Api\SimpleAdmin.Api.csproj", "{229ED167-9ECC-4736-8DFB-522EEA8FF680}" diff --git a/SimpleAdmin.sln.DotSettings.user b/SimpleAdmin.sln.DotSettings.user index 2664039..39396e3 100644 --- a/SimpleAdmin.sln.DotSettings.user +++ b/SimpleAdmin.sln.DotSettings.user @@ -19,6 +19,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from &lt;src&gt;\&lt;SimpleAdmin.Api.IntegrationTests&gt;" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <Project Location="D:\my\itfx\admin\src\SimpleAdmin.Api.IntegrationTests" Presentation="&lt;src&gt;\&lt;SimpleAdmin.Api.IntegrationTests&gt;" /> </SessionState> \ No newline at end of file diff --git a/src/Oms.Application/Oms.Application.csproj b/src/Oms.Application/Oms.Application.csproj index 4d03535..3a58643 100644 --- a/src/Oms.Application/Oms.Application.csproj +++ b/src/Oms.Application/Oms.Application.csproj @@ -16,9 +16,9 @@ - - - + + + diff --git a/src/Oms.Application/Services/Customers/CustomerService.cs b/src/Oms.Application/Services/Customers/CustomerService.cs index 6cd6db4..ffb35da 100644 --- a/src/Oms.Application/Services/Customers/CustomerService.cs +++ b/src/Oms.Application/Services/Customers/CustomerService.cs @@ -23,9 +23,9 @@ public class CustomerService : ApplicationService private ICustomerRepository CustomerRepository => LazyServiceProvider.GetRequiredService(); - private IUserService UserService => LazyServiceProvider.GetRequiredService(); + private UserService UserService => LazyServiceProvider.GetRequiredService(); - private IRoleService RoleService => LazyServiceProvider.GetRequiredService(); + private RoleService RoleService => LazyServiceProvider.GetRequiredService(); private FakeRbacDbContext RbacDbContext => LazyServiceProvider.GetRequiredService(); diff --git a/src/Oms.Domain/Oms.Domain.csproj b/src/Oms.Domain/Oms.Domain.csproj index 860c3c1..fa492f4 100644 --- a/src/Oms.Domain/Oms.Domain.csproj +++ b/src/Oms.Domain/Oms.Domain.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/src/Oms.Domain/OmsDomainModule.cs b/src/Oms.Domain/OmsDomainModule.cs index b602f53..a63cf51 100644 --- a/src/Oms.Domain/OmsDomainModule.cs +++ b/src/Oms.Domain/OmsDomainModule.cs @@ -3,7 +3,7 @@ using Fake.Modularity; namespace Oms.Domain; -[DependsOn(typeof(FakeDomainDrivenDesignModule))] +[DependsOn(typeof(FakeDddDomainModule))] public class OmsDomainModule : FakeModule { } diff --git a/src/Oms.SqlSugarCore/Oms.SqlSugarCore.csproj b/src/Oms.SqlSugarCore/Oms.SqlSugarCore.csproj index 50482d6..a5d7bcc 100644 --- a/src/Oms.SqlSugarCore/Oms.SqlSugarCore.csproj +++ b/src/Oms.SqlSugarCore/Oms.SqlSugarCore.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/SimpleAdmin.Api/Auth/AuthService.cs b/src/SimpleAdmin.Api/Auth/AuthService.cs index 26a2f10..d86a777 100644 --- a/src/SimpleAdmin.Api/Auth/AuthService.cs +++ b/src/SimpleAdmin.Api/Auth/AuthService.cs @@ -2,7 +2,6 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using Fake.Application; using Fake.Domain.Exceptions; -using Fake.Helpers; using Fake.Rbac.Application.Dtos.Auth; using Fake.Rbac.Application.Dtos.Menu; using Fake.Rbac.Application.Dtos.User; @@ -11,10 +10,8 @@ using Fake.Rbac.Application.Services; using Fake.Rbac.Domain.Managers; using Fake.Rbac.Domain.UserAggregate; using Fake.Rbac.Infrastructure; -using Fake.Security.Claims; +using Fake.Users; using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Oms.Application.Shared; @@ -33,8 +30,8 @@ namespace SimpleAdmin.Api.Auth; [ApiExplorerSettings(GroupName = "RBAC")] public class AuthService( AccountManager accountManager, - IUserService userService, - IMenuService menuService, + UserService userService, + MenuService menuService, IJwtService jwtService, IUserRepository userRepository, IWebHostEnvironment webHostEnvironment, @@ -43,6 +40,8 @@ public class AuthService( ICustomerRepository customerRepository) : ApplicationService { + private Guid CurrentUserGuid => CurrentUser.FindClaimValueOrNull(ClaimTypes.NameIdentifier)!.To(); + /// /// 用户或客户登录。 /// @@ -116,12 +115,10 @@ public class AuthService( if (IsCustomerPrincipal()) { - var currentUserId = CurrentUser.Id ?? throw new UnauthorizedAccessException("用户未登录"); - return await BuildAdminUserInfoAsync(currentUserId, cancellationToken); + return await BuildAdminUserInfoAsync(CurrentUserGuid, cancellationToken); } - var userId = CurrentUser.Id ?? throw new UnauthorizedAccessException("用户未登录"); - return await BuildAdminUserInfoAsync(userId, cancellationToken); + return await BuildAdminUserInfoAsync(CurrentUserGuid, cancellationToken); } /// @@ -138,9 +135,8 @@ public class AuthService( await ChangeCustomerPasswordAsync(input.OldPassword, input.NewPassword, cancellationToken); return; } - - var userId = CurrentUser.Id ?? throw new UnauthorizedAccessException("用户未登录"); - await accountManager.UpdatePasswordAsync(userId, input.OldPassword, input.NewPassword, cancellationToken); + + await accountManager.UpdatePasswordAsync(CurrentUserGuid, input.OldPassword, input.NewPassword, cancellationToken); } /// @@ -154,7 +150,7 @@ public class AuthService( { EnsureAdminPrincipal(); - var userId = CurrentUser.Id ?? throw new UnauthorizedAccessException("用户未登录"); + var userId = CurrentUserGuid; var user = await userRepository.FirstAsync(u => u.Id == userId, cancellationToken: cancellationToken); user.Update(input.Name, input.Email); await userRepository.UpdateAsync(user, cancellationToken: cancellationToken); @@ -173,7 +169,7 @@ public class AuthService( { EnsureAdminPrincipal(); - var userId = CurrentUser.Id ?? throw new UnauthorizedAccessException("用户未登录"); + var userId = CurrentUserGuid; if (file == null || file.Length == 0) { throw new DomainException("请选择要上传的文件"); @@ -415,7 +411,7 @@ public class AuthService( return new CustomerPrincipalContext { - PrincipalId = CurrentUser.Id ?? throw new UnauthorizedAccessException("客户未登录"), + PrincipalId = CurrentUserGuid, Customer = customer, DisplayName = customer.WechatNickname ?? customer.CustomerName, AccountCode = customer.CustomerCode, diff --git a/src/SimpleAdmin.Api/Auth/CustomerRoleSeedContributor.cs b/src/SimpleAdmin.Api/Auth/CustomerRoleSeedContributor.cs index 3218882..9272773 100644 --- a/src/SimpleAdmin.Api/Auth/CustomerRoleSeedContributor.cs +++ b/src/SimpleAdmin.Api/Auth/CustomerRoleSeedContributor.cs @@ -4,7 +4,7 @@ using Fake.Rbac.Application.Services; namespace SimpleAdmin.Api.Auth; -public class CustomerRoleSeedContributor(IRoleService roleService) : IDataSeedContributor +public class CustomerRoleSeedContributor(RoleService roleService) : IDataSeedContributor { public const string CustomerRoleCode = "Customer"; public const string CustomerRoleName = "客户"; diff --git a/src/SimpleAdmin.Api/SimpleAdmin.Api.csproj b/src/SimpleAdmin.Api/SimpleAdmin.Api.csproj index 5cf9166..61ff6fe 100644 --- a/src/SimpleAdmin.Api/SimpleAdmin.Api.csproj +++ b/src/SimpleAdmin.Api/SimpleAdmin.Api.csproj @@ -6,21 +6,13 @@ enable Linux - - - + - - - - - - - - - - .dockerignore - + + + + + diff --git a/src/SimpleAdmin.Api/SimpleAdminApiModule.cs b/src/SimpleAdmin.Api/SimpleAdminApiModule.cs index 99380a5..064ac66 100644 --- a/src/SimpleAdmin.Api/SimpleAdminApiModule.cs +++ b/src/SimpleAdmin.Api/SimpleAdminApiModule.cs @@ -4,12 +4,14 @@ using Fake.Modularity; using Fake.Rbac.Application; using Fake.Rbac.Infrastructure; using Fake.AspNetCore.Auditing; -using Fake.AspNetCore.Mvc; +using Fake.AspNetCore.Authentication; +using Fake.AspNetCore.ExceptionHandling; +using Fake.AspNetCore.Newtonsoft; +using Fake.AspNetCore.Swagger; using Fake.FeiShu; using Fake.Security.Claims; using Fake.Serilog; using Microsoft.AspNetCore.HttpOverrides; -using Microsoft.Extensions.Logging; using Oms.Application; using Oms.SqlSugarCore; using SimpleAdmin.Api.Auth; @@ -53,6 +55,9 @@ public class SimpleAdminApiModule : FakeModule settings.TypePredicate = type => type != typeof(Fake.Rbac.Application.Services.AuthService); }); }); + + //Json格式化全局处理 + context.Services.AddFakeNewtonsoft(); services.AddFakeAspNetCoreAuditing(); diff --git a/src/SimpleAdmin.Api/SimpleJwtService.cs b/src/SimpleAdmin.Api/SimpleJwtService.cs index b1cc2fd..adfe75f 100644 --- a/src/SimpleAdmin.Api/SimpleJwtService.cs +++ b/src/SimpleAdmin.Api/SimpleJwtService.cs @@ -14,7 +14,7 @@ namespace SimpleAdmin.Api; /// 自定义simple-admin auth jwt service /// [Dependency(Replace = true)] -public class SimpleJwtService(IOptions jwtOptions, IUserService userService, FakeRbacDbContext rbacDbContext) +public class SimpleJwtService(IOptions jwtOptions, UserService userService, FakeRbacDbContext rbacDbContext) : JwtService(jwtOptions, userService) { public override async Task> GenerateClaimsByUserIdAsync(Guid userId, @@ -28,6 +28,7 @@ public class SimpleJwtService(IOptions jwtOptions, IUserService user { claims.RemoveAll(x => x.Type == FakeClaimTypes.UserId); claims.Add(new Claim(FakeClaimTypes.UserId, mapId.Value.ToString())); + claims.Add(new Claim(ClaimTypes.NameIdentifier, userId.ToString())); } return claims;