FlexJobApi.Core/Utils/JwtUtils/JwtHandler.cs
@@ -1,7 +1,18 @@ using Furion.Authorization; using FlexJobApi.Core.Entities.Common; using Furion; using Furion.Authorization; using Furion.DatabaseAccessor; using Furion.DataEncryption; using Furion.DistributedIDGenerator; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Threading.Tasks; namespace FlexJobApi.Core; @@ -15,7 +26,52 @@ { await AuthorizeHandleAsync(context); } else context.Fail(); else { var resourceLog = new ResourceLog(); resourceLog.CreatedTime = DateTimeOffset.Now; var stopwatch = Stopwatch.StartNew(); var serviceScopeFactory = App.GetService<IServiceScopeFactory>(); var serviceScope = serviceScopeFactory.CreateScope(); var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<ResourceLog, LogDbContextLocator>>(); resourceLog.Id = IDGen.NextID(); resourceLog.TraceId = App.GetTraceId(); resourceLog.Method = EnumUtils.GetEnum<EnumResourceMethod>(httpContext.Request.Method); resourceLog.Domain = $"{httpContext.Request.Scheme}://{httpContext.Request.Host}"; resourceLog.Path = httpContext.Request.Path; resourceLog.ClientIpAddress = httpContext.GetRemoteIpAddressToIPv4(); if (httpContext.Request.ContentType?.Contains("application/json") == true) { httpContext.Request.EnableBuffering(); // 允许多次读取 var body = await new StreamReader(httpContext.Request.Body).ReadToEndAsync(); httpContext.Request.Body.Position = 0; // 重置流位置 resourceLog.Request = body; } else { resourceLog.Request = httpContext.Request.Query.ToJson(); } resourceLog.RequestHeaders = httpContext.Request.Headers.ToJson(); context.Fail(); resourceLog.UpdatedTime = DateTimeOffset.Now; resourceLog.Response = new FriendlyResult<object> { TraceId = resourceLog.TraceId, Code = 401, Success = false, Timestamp = DateTime.Now.ToTimeStamp() }.ToJson(); resourceLog.ResponseHeaders = httpContext.Response.Headers.ToJson(); resourceLog.IsSuccess = false; stopwatch.Stop(); resourceLog.ElapsedMilliseconds = stopwatch.ElapsedMilliseconds; await rep.InsertNowAsync(resourceLog); } } /// <summary> FlexJobApi.Core/Utils/ResourceUtils/ResourceActionFilter.cs
@@ -4,6 +4,7 @@ using Furion.DistributedIDGenerator; using Furion.Schedule; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.DependencyInjection; @@ -48,7 +49,10 @@ var actionContext = await next(); resourceLog.UpdatedTime = DateTimeOffset.Now; resourceLog.Response = actionContext.Result.ToJson(); if (actionContext.Result is JsonResult jsonResult) { resourceLog.Response = jsonResult.Value.ToJson(); } resourceLog.ResponseHeaders = context.HttpContext.Response.Headers.ToJson(); resourceLog.IsSuccess = actionContext.Exception == null; FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -23,12 +23,14 @@ /// 灵工命令处理器 /// </summary> public class EnterpriseEmployeesCommandHandler( IRepository<EnterpriseEmployee> rep IRepository<EnterpriseEmployee> rep, IRepository<User> repUser ) : IRequestHandler<ImportEnterpriseEmployeesCommand, ImportEnterpriseEmployeesCommandResult>, IRequestHandler<EditEnterpriseEmployeeCommand, Guid> { private readonly IRepository<EnterpriseEmployee> rep = rep; private readonly IRepository<User> repUser = repUser; /// <summary> /// 导入灵工信息 @@ -44,6 +46,10 @@ var identities = models.DistinctSelect(it => it.Identity); var enterpriseEmployees = await rep.AsQueryable() .Where(it => it.EnterpriseId == logier.EnterpriseId && identities.Contains(it.Identity)) .ToListAsync(); var userIds = enterpriseEmployees.DistinctSelect(it => it.UserId.HasValue, it => it.UserId!.Value); var users = await repUser.AsQueryable() .Where(it => userIds.Contains(it.Id)) .ToListAsync(); var successList = new List<ImportEnterpriseEmployeesCommandModel>(); foreach (var model in models) @@ -100,11 +106,26 @@ } else { var canUpdate = true; if (enterpriseEmployee.UserId.HasValue) { errors.Add("已报名无法修改信息"); var user = users.FirstOrDefault(it => it.Id == enterpriseEmployee.UserId.Value)!; if (user.IsReal == true) { canUpdate = false; errors.Add("已实名无法修改信息"); } else { user.Name = model.Name; user.ContactPhoneNumber = model.ContactPhoneNumber; user.Gender = model.Gender; user.Birthday = model.Birthday; user.Age = model.Age; await repUser.UpdateAsync(user); } } else if (canUpdate) { enterpriseEmployee.Name = model.Name; enterpriseEmployee.ContactPhoneNumber = model.ContactPhoneNumber; FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -692,7 +692,7 @@ 同步用户命令处理器 </summary> </member> <member name="M:FlexJobApi.UserServer.Application.SyncUserCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise})"> <member name="M:FlexJobApi.UserServer.Application.SyncUserCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Role})"> <summary> 同步用户命令处理器 </summary> FlexJobApi.UserServer.Application/Users/Commands/SyncUserCommandHandler.cs
@@ -65,9 +65,10 @@ await repEnterprise.InsertAsync(enterprise); else await repEnterprise.UpdateAsync(enterprise); var user = await repUser.AsQueryable() .Include(it => it.UserRoles) .Where(it => it.Type == EnumUserType.Enterprise && it.UserName == request.UserName) .Where(it => it.Type == EnumUserType.Enterprise && it.DataSource == request.DataSource && it.DataSourceId == request.DataSourceId) .FirstOrDefaultAsync(cancellationToken); if (user == null) { @@ -78,6 +79,10 @@ { throw Oops.Oh(EnumErrorCodeType.s405, "账号"); } var checkUserNameExist = await repUser.AsQueryable().AsNoTracking() .AnyAsync(it => it.Type == EnumUserType.Enterprise && it.UserName == request.UserName && it.Id != user.Id); if (checkUserNameExist) throw Oops.Oh(EnumErrorCodeType.s405, "账号"); user.EnterpriseId = enterprise.Id; user.Level = 100; user.UserRoles = await repRole.AsQueryable().AsNoTracking() @@ -106,7 +111,7 @@ var user = await repUser.AsQueryable() .Include(it => it.UserRoles) .Include(it => it.UserManageIndustrialParks) .Where(it => it.Type == EnumUserType.Operation && it.UserName == request.UserName) .Where(it => it.Type == EnumUserType.Operation && it.DataSource == request.DataSource && it.DataSourceId == request.DataSourceId) .FirstOrDefaultAsync(cancellationToken); if (user == null) { @@ -114,6 +119,9 @@ user.Type = EnumUserType.Operation; user.Status = EnumUserStatus.Normal; } var checkUserNameExist = await repUser.AsQueryable().AsNoTracking() .AnyAsync(it => it.Type == EnumUserType.Operation && it.UserName == request.UserName && it.Id != user.Id); if (checkUserNameExist) throw Oops.Oh(EnumErrorCodeType.s405, "账号"); request.Adapt(user); user.UserManageIndustrialParks = request.IndustrialParkIds.Select(it => new UserManageIndustrialPark {