From 5b86cd10f893872da68c040adea52953eb25c4a0 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期二, 09 九月 2025 15:08:22 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs | 95 +++++++++++++++++++++++++++++++++++------------ 1 files changed, 71 insertions(+), 24 deletions(-) diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs index 139d6ff..42d58a1 100644 --- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs +++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs @@ -6,6 +6,8 @@ using Furion.DynamicApiController; using Furion.FriendlyException; using Furion.HttpRemote; +using Furion.Logging; +using Furion.Logging.Extensions; using Mapster; using MediatR; using Microsoft.AspNetCore.Mvc; @@ -69,16 +71,17 @@ var model = new ResourceModel(); model.TraceId = traceId; model.ApplicationName = resourceService.ApplicationName; - model.Controller = controller; + model.ControllerName = resourceController.ControllerName; model.ControllerSummary = resourceControllers.GetDescription(controller); model.ActionName = Regex.Replace(request.Name, @"(Command|Query)$", "", RegexOptions.None); model.ActionSummary = requestXmlDoc?.Summary; - model.Service = resourceController.Service; model.ServiceName = resourceService.ServiceName; model.RouteArea = resourceService.RouteArea; - model.Route = $"/api/{resourceService.RouteArea ?? "main"}/{controller}/{model.ActionName}"; + model.Route = $"/api/{resourceService.RouteArea ?? "main"}/{model.ControllerName}/{model.ActionName}"; model.Method = - request.BaseType?.IsGenericType == true && request.BaseType.GetGenericTypeDefinition() == typeof(PagedListQuery<,>) + resourceAttribute.Method != EnumResourceMethod.None + ? resourceAttribute.Method + : request.BaseType?.IsGenericType == true && request.BaseType.GetGenericTypeDefinition() == typeof(PagedListQuery<,>) ? EnumResourceMethod.Post : new List<string> { "Post", "Add", "Create", "Insert", "Submit" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase)) ? EnumResourceMethod.Post @@ -89,6 +92,15 @@ : new List<string> { "Delete", "Remove ", "Clear" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase)) ? EnumResourceMethod.Delete : EnumResourceMethod.Post; + model.FileUpload = resourceAttribute.FileUpload; + if (model.FileUpload) + { + model.IsFromForm = true; + } + else + { + model.IsFromForm = resourceAttribute.IsFromForm; + } model.Code = requestXmlDoc?.Name; model.Name = $"{model.ControllerSummary}-{model.ActionSummary}"; model.AllowAnonymous = resourceAttribute.AllowAnonymous; @@ -172,7 +184,21 @@ public static void DynamicControllersHotPlug(List<Resource> resources, IDynamicApiRuntimeChangeProvider provider = null) { provider = provider ?? App.GetRequiredService<IDynamicApiRuntimeChangeProvider>(); - foreach (var resource in resources) + var controllers = resources + .GroupBy(it => new + { + it.ApplicationName, + it.ControllerName, + it.ControllerSummary, + it.RouteArea + }) + .Select(it => new + { + it.Key, + Actions = it.ToList() + }) + .ToList(); + foreach (var controller in controllers) { var code = $@" using FlexJobApi.Core; @@ -186,47 +212,68 @@ using System.Collections.Generic; using System.ComponentModel; -namespace {resource.ApplicationName}.{resource.Controller}.{resource.ActionName}Request + +namespace {controller.Key.ApplicationName}.{controller.Key.ControllerName} {{ /// <summary> - /// {resource.ControllerSummary} + /// {controller.Key.ControllerSummary} /// </summary> - [Route(""api/{resource.RouteArea}/[controller]"")] - public class {resource.Controller}AppService(IMediator mediator) : IDynamicApiController + [Route(""api/{controller.Key.RouteArea}/[controller]"")] + public class {controller.Key.ControllerName}AppService(IMediator mediator) : IDynamicApiController {{ - private readonly IMediator mediator = mediator; + private readonly IMediator mediator = mediator;"; + + foreach (var action in controller.Actions) + { + var result = action.ResponseTypeName.IsNull() ? "Task" : $"Task<{action.ResponseTypeName}>"; + code += @$" /// <summary> - /// {resource.ActionSummary} + /// {action.ActionSummary} /// </summary> /// <param name=""request""></param> /// <returns></returns>"; - if (resource.AllowAnonymous) - { - code += $@" + if (action.AllowAnonymous) + { + code += $@" [AllowAnonymous]"; - } - var result = resource.ResponseTypeName.IsNull() ? "Task" : $"Task<{resource.ResponseTypeName}>"; - code += $@" - [Http{resource.Method}] - public {result} {resource.ActionName}({resource.RequestTypeName} request) + } + code += $@" + [Http{action.Method}]"; + if (action.FileUpload) + { + code += @" + [Consumes(""multipart/form-data"")]"; + } + code += @$" + public {result} {action.ActionName}("; + if (action.FileUpload || action.IsFromForm) + { + code += "[FromForm] "; + } + code += $@"{action.RequestTypeName} request) {{ return mediator.Send(request); - }} + }}"; + } - }} -}} + code += @" + } +} "; try { var dynamicAssembly = App.CompileCSharpClassCode(code); provider.AddAssembliesWithNotifyChanges(dynamicAssembly); var dynamicAssemblyName = dynamicAssembly.GetName().Name; - resource.DynamicAssemblyName = dynamicAssemblyName; + foreach (var action in controller.Actions) + { + action.DynamicAssemblyName = dynamicAssemblyName; + } } catch (Exception ex) { - Console.WriteLine(code); + code.LogError(ex); throw; } } -- Gitblit v1.9.1