From 1759ab1a7d3e536eb812dcfbf5a7c8792ed28b2e Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期一, 11 八月 2025 09:04:29 +0800 Subject: [PATCH] feat:简历开发 --- FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs | 129 +++++++++++------------------------------- 1 files changed, 34 insertions(+), 95 deletions(-) diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs index 0bf57e6..139d6ff 100644 --- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs +++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Routing; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; @@ -36,87 +37,6 @@ /// </summary> public static class ResourceUtils { - /// <summary> - /// 鍙戦�丠TTP璇锋眰 - /// </summary> - /// <typeparam name="TRequest"></typeparam> - /// <typeparam name="TResponse"></typeparam> - /// <param name="request"></param> - /// <returns></returns> - public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(TRequest request) - where TRequest : class, new() - { - var requestTypeFullName = typeof(TRequest).FullName; - var resource = await Db.GetRepository<Resource>().AsQueryable().AsNoTracking() - .Where(it => !it.IsExpired && it.RequestTypeFullName == requestTypeFullName) - .FirstOrDefaultAsync(); - var domain = await GetHealthyServiceDomain(resource); - var httpRemoteService = App.GetRequiredService<IHttpRemoteService>(); - var token = App.HttpContext.Request.Headers["Authorization"].ToString(); - var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString(); - TResponse response; - switch (resource.Method) - { - case EnumResourceMethod.Get: - response = await httpRemoteService.GetAsAsync<TResponse>( - $"{domain}{resource.Route}", - it => - it.WithQueryParameters(request) - .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) - .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); - break; - case EnumResourceMethod.Post: - response = await httpRemoteService.PostAsAsync<TResponse>( - $"{domain}{resource.Route}", - it => - it.SetJsonContent(request) - .WithHeader("Authorization", token) - .WithHeader("X-Authorization", refreshToken)); - break; - case EnumResourceMethod.Put: - response = await httpRemoteService.PutAsAsync<TResponse>( - $"{domain}{resource.Route}", - it => - it.SetJsonContent(request) - .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) - .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); - break; - case EnumResourceMethod.Delete: - response = await httpRemoteService.DeleteAsAsync<TResponse>( - $"{domain}{resource.Route}", - it => - it.SetJsonContent(request) - .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) - .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); - break; - default: - throw Oops.Oh(EnumErrorCodeType.s400, $"涓嶆敮鎸佽姹傛柟寮弡resource.Method}"); - } - return response; - } - - /// <summary> - /// 鑾峰彇鍋ュ悍鏈嶅姟鍩熷悕 - /// </summary> - /// <param name="resource"></param> - /// <returns></returns> - public static async Task<string> GetHealthyServiceDomain(Resource resource) - { - var client = App.GetRequiredService<IConsulClient>(); - var queryResult = await client.Health.Service(resource.ServiceName, null, true); - if (queryResult.StatusCode != System.Net.HttpStatusCode.OK) - throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}"); - - var domains = queryResult.Response - .Select(s => $"http://{s.Service.Address}:{s.Service.Port}") - .ToList(); - if (domains.IsNull()) - throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}"); - // 杞閫夋嫨瀹炰緥 - int randomIndex = new Random().Next(domains.Count); - return domains[randomIndex]; - } - /// <summary> /// 鐢熸垚鍔ㄦ�佹帶鍒跺櫒 /// </summary> @@ -181,13 +101,13 @@ model.ResponseTypeName = responseType.GetCSharpFriendlyName(); model.ResponseTypeFullName = responseType.FullName; } - - models.Add(model); + + await App.GetRequiredService<IDistributedCache>().SetStringAsync($"ResourceModel|{model.RequestTypeFullName}", model.ToJson()); } } - var resources = await SaveResourcesAsync(models, traceId, rep); + var resources = await SaveResourcesAsync(models, rep); DynamicControllersHotPlug(resources, provider); @@ -201,7 +121,7 @@ /// <param name="traceId"></param> /// <param name="rep"></param> /// <returns></returns> - private static async Task<List<Resource>> SaveResourcesAsync(List<ResourceModel> models, string traceId, IRepository<Resource> rep = null) + private static async Task<List<Resource>> SaveResourcesAsync(List<ResourceModel> models, IRepository<Resource> rep = null) { rep = rep ?? Db.GetRepository<Resource>(); var resources = await rep.AsQueryable() @@ -213,22 +133,32 @@ if (resource == null) { resource = new Resource(); + resource.Id = IDGen.NextID(); + resource.CreatedTime = DateTimeOffset.Now; model.Adapt(resource); await rep.InsertAsync(resource); resources.Add(resource); } else { - model.Adapt(resource); - await rep.UpdateAsync(resource); + var resourceBakModel = new ResourceModel(); + resource.Adapt(resourceBakModel); + resourceBakModel.TraceId = model.TraceId; + resourceBakModel.DynamicAssemblyName = model.DynamicAssemblyName; + if (resourceBakModel.ToJson() != model.ToJson()) + { + model.Adapt(resource); + resource.UpdatedTime = DateTimeOffset.Now; + await rep.UpdateAsync(resource); + } } } - var expiredResources = resources.Where(it => it.TraceId != traceId).ToList(); + var expiredResources = resources.Where(it => !models.Any(m => m.Route == it.Route && m.Method == it.Method)).ToList(); foreach (var expiredResource in expiredResources) { - expiredResource.IsExpired = true; - await rep.UpdateAsync(expiredResource); + resources.Remove(expiredResource); + await rep.DeleteAsync(expiredResource); } return resources.Where(it => !it.IsExpired).ToList(); @@ -276,9 +206,10 @@ code += $@" [AllowAnonymous]"; } + var result = resource.ResponseTypeName.IsNull() ? "Task" : $"Task<{resource.ResponseTypeName}>"; code += $@" [Http{resource.Method}] - public Task<{resource.ResponseTypeName}> {resource.ActionName}({resource.RequestTypeName} request) + public {result} {resource.ActionName}({resource.RequestTypeName} request) {{ return mediator.Send(request); }} @@ -286,10 +217,18 @@ }} }} "; - var dynamicAssembly = App.CompileCSharpClassCode(code); - provider.AddAssembliesWithNotifyChanges(dynamicAssembly); - var dynamicAssemblyName = dynamicAssembly.GetName().Name; - resource.DynamicAssemblyName = dynamicAssemblyName; + try + { + var dynamicAssembly = App.CompileCSharpClassCode(code); + provider.AddAssembliesWithNotifyChanges(dynamicAssembly); + var dynamicAssemblyName = dynamicAssembly.GetName().Name; + resource.DynamicAssemblyName = dynamicAssemblyName; + } + catch (Exception ex) + { + Console.WriteLine(code); + throw; + } } } -- Gitblit v1.9.1