1
0
zhontai 2 лет назад
Родитель
Сommit
7ab42898f5
26 измененных файлов с 0 добавлено и 1744 удалено
  1. 0 37
      src/platform/ZhonTai.Admin.Core/Aop/AopHelper.cs
  2. 0 46
      src/platform/ZhonTai.Admin.Core/Attributes/ValidateInputAttribute.cs
  3. 0 59
      src/platform/ZhonTai.Admin.Core/Attributes/ValidatePermissionAttribute.cs
  4. 0 22
      src/platform/ZhonTai.Admin.Core/Attributes/VersionRouteAttribute.cs
  5. 0 18
      src/platform/ZhonTai.Admin.Core/Auth/IPermissionHandler.cs
  6. 0 74
      src/platform/ZhonTai.Admin.Core/Auth/ResponseAuthenticationHandler.cs
  7. 0 16
      src/platform/ZhonTai.Admin.Core/BaseController.cs
  8. 0 550
      src/platform/ZhonTai.Admin.Core/BaseStartup.cs
  9. 0 166
      src/platform/ZhonTai.Admin.Core/Db/DBServiceCollectionExtensions.cs
  10. 0 18
      src/platform/ZhonTai.Admin.Core/Enums/ApiVersion.cs
  11. 0 46
      src/platform/ZhonTai.Admin.Core/Enums/StatusCodes.cs
  12. 0 43
      src/platform/ZhonTai.Admin.Core/Extensions/RateLimitServiceCollectionExtensions.cs
  13. 0 35
      src/platform/ZhonTai.Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs
  14. 0 62
      src/platform/ZhonTai.Admin.Core/Filters/ControllerExceptionFilter.cs
  15. 0 31
      src/platform/ZhonTai.Admin.Core/Filters/ControllerLogFilter.cs
  16. 0 35
      src/platform/ZhonTai.Admin.Core/Filters/EnumSchemaFilter.cs
  17. 0 52
      src/platform/ZhonTai.Admin.Core/Filters/ValidateInputFilter.cs
  18. 0 73
      src/platform/ZhonTai.Admin.Core/HostBuilderProvider.cs
  19. 0 65
      src/platform/ZhonTai.Admin.Core/Logs/ApiHelper.cs
  20. 0 19
      src/platform/ZhonTai.Admin.Core/Logs/ILogHandler.cs
  21. 0 73
      src/platform/ZhonTai.Admin.Core/Logs/LogHandler.cs
  22. 0 29
      src/platform/ZhonTai.Admin.Core/RegisterModules/ControllerModule.cs
  23. 0 43
      src/platform/ZhonTai.Admin.Core/RegisterModules/RepositoryModule.cs
  24. 0 64
      src/platform/ZhonTai.Admin.Core/RegisterModules/ServiceModule.cs
  25. 0 44
      src/platform/ZhonTai.Admin.Core/RegisterModules/SingleInstanceModule.cs
  26. 0 24
      src/platform/ZhonTai.Admin.Core/ZhonTai.Admin.Core.csproj

+ 0 - 37
src/platform/ZhonTai.Admin.Core/Aop/AopHelper.cs

@@ -1,37 +0,0 @@
-using Castle.DynamicProxy;
-using System;
-using System.Reflection;
-using System.Threading.Tasks;
-
-namespace ZhonTai.Admin.Core.Aop
-{
-    public class AopHelper
-    {
-        public static async Task<T> ExecuteGenericMethod<T>(Task<T> returnValue, Action<T> callBackAction, Action<Exception> exceptionAction, Action finallyAction)
-        {
-            try
-            {
-                var result = await returnValue;
-                callBackAction?.Invoke(result);
-                return result;
-            }
-            catch (Exception ex)
-            {
-                exceptionAction?.Invoke(ex);
-                return default;
-            }
-            finally
-            {
-                finallyAction?.Invoke();
-            }
-        }
-
-        public static object CallGenericMethod(IInvocation invocation, Action<object> callBackAction, Action<Exception> exceptionAction, Action finallyAction)
-        {
-            return typeof(AopHelper)
-            .GetMethod("ExecuteGenericMethod", BindingFlags.Public | BindingFlags.Static)
-            .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0])
-            .Invoke(null, new object[] { invocation.ReturnValue, callBackAction, exceptionAction, finallyAction });
-        }
-    }
-}

+ 0 - 46
src/platform/ZhonTai.Admin.Core/Attributes/ValidateInputAttribute.cs

@@ -1,46 +0,0 @@
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.AspNetCore.Mvc.ModelBinding;
-using Microsoft.Extensions.Logging;
-using System;
-using System.Linq;
-using System.Text;
-using ZhonTai.Common.Domain.Dto;
-
-namespace ZhonTai.Admin.Core.Attributes
-{
-    /// <summary>
-    /// 输入模型验证
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
-    public class ValidateInputAttribute : ActionFilterAttribute
-    {
-        public override void OnResultExecuting(ResultExecutingContext context)
-        {
-            if (!context.ModelState.IsValid)
-            {
-                try
-                {
-                    var logger = (ILogger<ValidateInputAttribute>)context.HttpContext.RequestServices.GetService(typeof(ILogger<ValidateInputAttribute>));
-                    var errors = context.ModelState
-                   .Where(m => m.Value.ValidationState == ModelValidationState.Invalid)
-                   .Select(m =>
-                   {
-                       var sb = new StringBuilder();
-                       sb.AppendFormat("{0}:", m.Key);
-                       sb.Append(m.Value.Errors.Select(n => n.ErrorMessage).Aggregate((x, y) => x + ";" + y));
-                       return sb.ToString();
-                   })
-                   .Aggregate((x, y) => x + "|" + y);
-                    logger.LogError(errors);
-                    context.Result = new JsonResult(ResultOutput.NotOk(errors));
-                }
-                catch
-                {
-                    context.Result = new StatusCodeResult(StatusCodes.Status500InternalServerError);
-                }
-            }
-        }
-    }
-}

+ 0 - 59
src/platform/ZhonTai.Admin.Core/Attributes/ValidatePermissionAttribute.cs

@@ -1,59 +0,0 @@
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.Extensions.DependencyInjection;
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using ZhonTai.Admin.Core.Auth;
-using ZhonTai.Common.Auth;
-using ZhonTai.Common.Attributes;
-
-namespace ZhonTai.Admin.Core.Attributes
-{
-    /// <summary>
-    /// 启用权限验证
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
-    public class ValidatePermissionAttribute : AuthorizeAttribute, IAuthorizationFilter, IAsyncAuthorizationFilter
-    {
-        private async Task PermissionAuthorization(AuthorizationFilterContext context)
-        {
-            //排除匿名访问
-            if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(AllowAnonymousAttribute)))
-                return;
-
-            //登录验证
-            var user = context.HttpContext.RequestServices.GetService<IUser>();
-            if (user == null || !(user?.Id > 0))
-            {
-                context.Result = new ChallengeResult();
-                return;
-            }
-
-            //排除登录接口
-            if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(LoginAttribute)))
-                return;
-
-            //权限验证
-            var httpMethod = context.HttpContext.Request.Method;
-            var api = context.ActionDescriptor.AttributeRouteInfo.Template;
-            var permissionHandler = context.HttpContext.RequestServices.GetService<IPermissionHandler>();
-            var isValid = await permissionHandler.ValidateAsync(api, httpMethod);
-            if (!isValid)
-            {
-                context.Result = new ForbidResult();
-            }
-        }
-
-        public async void OnAuthorization(AuthorizationFilterContext context)
-        {
-            await PermissionAuthorization(context);
-        }
-
-        public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
-        {
-            await PermissionAuthorization(context);
-        }
-    }
-}

+ 0 - 22
src/platform/ZhonTai.Admin.Core/Attributes/VersionRouteAttribute.cs

@@ -1,22 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.ApiExplorer;
-using System;
-using ZhonTai.Admin.Core.Enums;
-
-namespace ZhonTai.Admin.Core.Attributes
-{
-    /// <summary>
-    /// 自定义路由 /api/{version}/[area]/[controler]/[action]
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
-    public class VersionRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider
-    {
-        public string GroupName { get; set; }
-
-        public VersionRouteAttribute(ApiVersion version = ApiVersion.V2, string action = "[action]")
-            : base($"/api/{version}/[area]/[controller]/{action}")
-        {
-            GroupName = version.ToString();
-        }
-    }
-}

+ 0 - 18
src/platform/ZhonTai.Admin.Core/Auth/IPermissionHandler.cs

@@ -1,18 +0,0 @@
-using System.Threading.Tasks;
-
-namespace ZhonTai.Admin.Core.Auth
-{
-    /// <summary>
-    /// 权限处理接口
-    /// </summary>
-    public interface IPermissionHandler
-    {
-        /// <summary>
-        /// 权限验证
-        /// </summary>
-        /// <param name="api"></param>
-        /// <param name="httpMethod"></param>
-        /// <returns></returns>
-        Task<bool> ValidateAsync(string api, string httpMethod);
-    }
-}

+ 0 - 74
src/platform/ZhonTai.Admin.Core/Auth/ResponseAuthenticationHandler.cs

@@ -1,74 +0,0 @@
-using Microsoft.AspNetCore.Authentication;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Serialization;
-using System;
-using System.Text.Encodings.Web;
-using System.Threading.Tasks;
-using ZhonTai.Common.Extensions;
-using StatusCodes = ZhonTai.Admin.Core.Enums.StatusCodes;
-
-namespace ZhonTai.Admin.Core.Auth
-{
-    /// <summary>
-    /// 响应认证处理器
-    /// </summary>
-    public class ResponseAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
-    {
-        public ResponseAuthenticationHandler(
-            IOptionsMonitor<AuthenticationSchemeOptions> options,
-            ILoggerFactory logger,
-            UrlEncoder encoder,
-            ISystemClock clock
-        ) : base(options, logger, encoder, clock)
-        {
-        }
-
-        protected override Task<AuthenticateResult> HandleAuthenticateAsync()
-        {
-            throw new NotImplementedException();
-        }
-
-        protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
-        {
-            Response.ContentType = "application/json";
-            Response.StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status401Unauthorized;
-            await Response.WriteAsync(JsonConvert.SerializeObject(
-                new ResponseStatusData
-                {
-                    Code = StatusCodes.Status401Unauthorized,
-                    Msg = StatusCodes.Status401Unauthorized.ToDescription()
-                },
-                new JsonSerializerSettings()
-                {
-                    ContractResolver = new CamelCasePropertyNamesContractResolver()
-                }
-            ));
-        }
-
-        protected override async Task HandleForbiddenAsync(AuthenticationProperties properties)
-        {
-            Response.ContentType = "application/json";
-            Response.StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status403Forbidden;
-            await Response.WriteAsync(JsonConvert.SerializeObject(
-                new ResponseStatusData
-                {
-                    Code = StatusCodes.Status403Forbidden,
-                    Msg = StatusCodes.Status403Forbidden.ToDescription()
-                },
-                new JsonSerializerSettings()
-                {
-                    ContractResolver = new CamelCasePropertyNamesContractResolver()
-                }
-            ));
-        }
-    }
-
-    public class ResponseStatusData
-    {
-        public StatusCodes Code { get; set; } = StatusCodes.Status1Ok;
-        public string Msg { get; set; }
-    }
-}

+ 0 - 16
src/platform/ZhonTai.Admin.Core/BaseController.cs

@@ -1,16 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using ZhonTai.Admin.Core.Attributes;
-
-namespace ZhonTai.Admin.Core
-{
-    /// <summary>
-    /// 基础控制器
-    /// </summary>
-    [Route("api/[area]/[controller]/[action]")]
-    [ApiController]
-    [ValidatePermission]
-    [ValidateInput]
-    public abstract class BaseController : ControllerBase
-    {
-    }
-}

+ 0 - 550
src/platform/ZhonTai.Admin.Core/BaseStartup.cs

@@ -1,550 +0,0 @@
-using AspNetCoreRateLimit;
-using Autofac;
-using IdentityServer4.AccessTokenValidation;
-using Microsoft.AspNetCore.Authentication;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.DependencyModel;
-using Microsoft.IdentityModel.Tokens;
-using Microsoft.OpenApi.Models;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Serialization;
-using System;
-using System.Collections.Generic;
-using System.IdentityModel.Tokens.Jwt;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using Mapster;
-using Yitter.IdGenerator;
-//using FluentValidation;
-//using FluentValidation.AspNetCore;
-using ZhonTai.Admin.Core.Auth;
-using ZhonTai.Common.Auth;
-using ZhonTai.Tools.Cache;
-using ZhonTai.Common.Configs;
-using ZhonTai.Common.Consts;
-using ZhonTai.Common.Helpers;
-using ZhonTai.Admin.Core.Db;
-using ZhonTai.Admin.Core.Enums;
-using ZhonTai.Admin.Core.Extensions;
-using ZhonTai.Admin.Core.Filters;
-using ZhonTai.Admin.Core.Logs;
-using ZhonTai.Admin.Core.RegisterModules;
-using MapsterMapper;
-using StackExchange.Profiling;
-using System.IO;
-using ZhonTai.Tools.DynamicApi;
-using Microsoft.OpenApi.Any;
-using Microsoft.AspNetCore.Mvc.Controllers;
-using ZhonTai.Admin.Core.Attributes;
-using Microsoft.AspNetCore.Cors;
-using ZhonTai.ApiUI;
-
-namespace ZhonTai.Admin.Core
-{
-    public abstract class BaseStartup
-    {
-        protected static string basePath => AppContext.BaseDirectory;
-        protected readonly IConfiguration _configuration;
-        protected readonly IHostEnvironment _env;
-        protected readonly ConfigHelper _configHelper;
-        protected readonly AppConfig _appConfig;
-        protected const string DefaultCorsPolicyName = "AllowPolicy";
-
-        public BaseStartup(IConfiguration configuration, IWebHostEnvironment env)
-        {
-            _configuration = configuration;
-            _env = env;
-            _configHelper = new ConfigHelper();
-            _appConfig = _configHelper.Get<AppConfig>("appconfig", env.EnvironmentName) ?? new AppConfig();
-        }
-
-        /// <summary>
-        /// 配置服务
-        /// </summary>
-        /// <param name="services"></param>
-        public virtual void ConfigureServices(IServiceCollection services)
-        {
-            //雪花漂移算法
-            YitIdHelper.SetIdGenerator(new IdGeneratorOptions(1) { WorkerIdBitLength = 6 });
-
-            //权限处理
-            services.AddScoped<IPermissionHandler, PermissionHandler>();
-
-            // ClaimType不被更改
-            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
-
-            //用户信息
-            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
-            if (_appConfig.IdentityServer.Enable)
-            {
-                //is4
-                services.TryAddSingleton<IUser, UserIdentiyServer>();
-            }
-            else
-            {
-                //jwt
-                services.TryAddSingleton<IUser, User>();
-            }
-
-            //添加数据库
-            services.AddDbAsync(_env).Wait();
-
-            //添加IdleBus单例
-            var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", _env.EnvironmentName);
-            var timeSpan = dbConfig.IdleTime > 0 ? TimeSpan.FromMinutes(dbConfig.IdleTime) : TimeSpan.MaxValue;
-            IdleBus<IFreeSql> ib = new IdleBus<IFreeSql>(timeSpan);
-            services.AddSingleton(ib);
-            //数据库配置
-            services.AddSingleton(dbConfig);
-
-            //应用配置
-            services.AddSingleton(_appConfig);
-
-            //上传配置
-            var uploadConfig = _configHelper.Load("uploadconfig", _env.EnvironmentName, true);
-            services.Configure<UploadConfig>(uploadConfig);
-
-            #region Mapster 映射配置
-
-            Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries
-                .Where(a => a.Name.StartsWith("ZhonTai"))
-                .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
-            services.AddScoped<IMapper>(sp => new Mapper());
-            TypeAdapterConfig.GlobalSettings.Scan(assemblies);
-
-            #endregion Mapster 映射配置
-
-            #region Cors 跨域
-            services.AddCors(options =>
-            {
-                options.AddPolicy(DefaultCorsPolicyName, policy =>
-                {
-                    var hasOrigins = _appConfig.CorUrls?.Length > 0;
-                    if (hasOrigins)
-                    {
-                        policy.WithOrigins(_appConfig.CorUrls);
-                    }
-                    else
-                    {
-                        policy.AllowAnyOrigin();
-                    }
-                    policy
-                    .AllowAnyHeader()
-                    .AllowAnyMethod();
-
-                    if (hasOrigins)
-                    {
-                        policy.AllowCredentials();
-                    }
-                });
-
-                //允许任何源访问Api策略,使用时在控制器或者接口上增加特性[EnableCors(AdminConsts.AllowAnyPolicyName)]
-                options.AddPolicy(AdminConsts.AllowAnyPolicyName, policy =>
-                {
-                    policy
-                    .AllowAnyOrigin()
-                    .AllowAnyHeader()
-                    .AllowAnyMethod();
-                });
-
-                /*
-                //浏览器会发起2次请求,使用OPTIONS发起预检请求,第二次才是api异步请求
-                options.AddPolicy("All", policy =>
-                {
-                    policy
-                    .AllowAnyOrigin()
-                    .SetPreflightMaxAge(new TimeSpan(0, 10, 0))
-                    .AllowAnyHeader()
-                    .AllowAnyMethod();
-                });
-                */
-            });
-
-            #endregion Cors 跨域
-
-            #region 身份认证授权
-
-            var jwtConfig = _configHelper.Get<JwtConfig>("jwtconfig", _env.EnvironmentName);
-            services.TryAddSingleton(jwtConfig);
-
-            if (_appConfig.IdentityServer.Enable)
-            {
-                //is4
-                services.AddAuthentication(options =>
-                {
-                    options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
-                    options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401
-                    options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler);    //403
-                })
-                .AddJwtBearer(options =>
-                {
-                    options.Authority = _appConfig.IdentityServer.Url;
-                    options.RequireHttpsMetadata = false;
-                    options.Audience = "admin.server.api";
-                })
-                .AddScheme<AuthenticationSchemeOptions, ResponseAuthenticationHandler>(nameof(ResponseAuthenticationHandler), o => { });
-            }
-            else
-            {
-                //jwt
-                services.AddAuthentication(options =>
-                {
-                    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
-                    options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401
-                    options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler);    //403
-                })
-                .AddJwtBearer(options =>
-                {
-                    options.TokenValidationParameters = new TokenValidationParameters
-                    {
-                        ValidateIssuer = true,
-                        ValidateAudience = true,
-                        ValidateLifetime = true,
-                        ValidateIssuerSigningKey = true,
-                        ValidIssuer = jwtConfig.Issuer,
-                        ValidAudience = jwtConfig.Audience,
-                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SecurityKey)),
-                        ClockSkew = TimeSpan.Zero
-                    };
-                })
-                .AddScheme<AuthenticationSchemeOptions, ResponseAuthenticationHandler>(nameof(ResponseAuthenticationHandler), o => { });
-            }
-
-            #endregion 身份认证授权
-
-            #region Swagger Api文档
-
-            if (_env.IsDevelopment() || _appConfig.Swagger.Enable)
-            {
-                services.AddSwaggerGen(options =>
-                {
-                    typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>
-                    {
-                        options.SwaggerDoc(version, new OpenApiInfo
-                        {
-                            Version = version,
-                            Title = "ZhonTai.Admin.Host"
-                        });
-                        //c.OrderActionsBy(o => o.RelativePath);
-                    });
-
-                    options.SchemaFilter<EnumSchemaFilter>();
-
-                    options.CustomOperationIds(apiDesc =>
-                    {
-                        var controllerAction = apiDesc.ActionDescriptor as ControllerActionDescriptor;
-                        return controllerAction.ControllerName + "-" + controllerAction.ActionName;
-                    });
-
-                    options.ResolveConflictingActions(apiDescription => apiDescription.First());
-                    options.CustomSchemaIds(x => x.FullName);
-                    options.DocInclusionPredicate((docName, description) => true);
-
-                    string[] xmlFiles = Directory.GetFiles(basePath, "*.xml");
-                    if (xmlFiles.Length > 0)
-                    {
-                        foreach (var xmlFile in xmlFiles)
-                        {
-                            options.IncludeXmlComments(xmlFile, true);
-                        }
-                    }
-
-                    var server = new OpenApiServer()
-                    {
-                        Url = _appConfig.Swagger.Url,
-                        Description = ""
-                    };
-                    server.Extensions.Add("extensions", new OpenApiObject
-                    {
-                        ["copyright"] = new OpenApiString(_appConfig.ApiUI.Footer.Content)
-                    });
-                    options.AddServer(server);
-
-                    #region 添加设置Token的按钮
-
-                    if (_appConfig.IdentityServer.Enable)
-                    {
-                        //添加Jwt验证设置
-                        options.AddSecurityRequirement(new OpenApiSecurityRequirement()
-                        {
-                            {
-                                new OpenApiSecurityScheme
-                                {
-                                    Reference = new OpenApiReference
-                                    {
-                                        Id = "oauth2",
-                                        Type = ReferenceType.SecurityScheme
-                                    }
-                                },
-                                new List<string>()
-                            }
-                        });
-
-                        //统一认证
-                        options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
-                        {
-                            Type = SecuritySchemeType.OAuth2,
-                            Description = "oauth2登录授权",
-                            Flows = new OpenApiOAuthFlows
-                            {
-                                Implicit = new OpenApiOAuthFlow
-                                {
-                                    AuthorizationUrl = new Uri($"{_appConfig.IdentityServer.Url}/connect/authorize"),
-                                    Scopes = new Dictionary<string, string>
-                                    {
-                                        { "admin.server.api", "admin后端api" }
-                                    }
-                                }
-                            }
-                        });
-                    }
-                    else
-                    {
-                        //添加Jwt验证设置
-                        options.AddSecurityRequirement(new OpenApiSecurityRequirement()
-                        {
-                            {
-                                new OpenApiSecurityScheme
-                                {
-                                    Reference = new OpenApiReference
-                                    {
-                                        Id = "Bearer",
-                                        Type = ReferenceType.SecurityScheme
-                                    }
-                                },
-                                new List<string>()
-                            }
-                        });
-
-                        options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
-                        {
-                            Description = "Value: Bearer {token}",
-                            Name = "Authorization",
-                            In = ParameterLocation.Header,
-                            Type = SecuritySchemeType.ApiKey
-                        });
-                    }
-
-                    #endregion 添加设置Token的按钮
-                });
-            }
-
-            #endregion Swagger Api文档
-
-            #region 操作日志
-
-            if (_appConfig.Log.Operation)
-            {
-                services.AddScoped<ILogHandler, LogHandler>();
-            }
-
-            #endregion 操作日志
-
-            #region 控制器
-
-            services.AddControllers(options =>
-            {
-                options.Filters.Add<ControllerExceptionFilter>();
-                options.Filters.Add<ValidateInputFilter>();
-                options.Filters.Add<ValidatePermissionAttribute>();
-                if (_appConfig.Log.Operation)
-                {
-                    options.Filters.Add<ControllerLogFilter>();
-                }
-                //禁止去除ActionAsync后缀
-                //options.SuppressAsyncSuffixInActionNames = false;
-            })
-            //.AddFluentValidation(config =>
-            //{
-            //    var assembly = Assembly.LoadFrom(Path.Combine(basePath, "ZhonTai.Admin.Host.dll"));
-            //    config.RegisterValidatorsFromAssembly(assembly);
-            //})
-            .AddNewtonsoftJson(options =>
-            {
-                //忽略循环引用
-                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
-                //使用驼峰 首字母小写
-                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
-                //设置时间格式
-                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
-            })
-            .AddControllersAsServices();
-
-            #endregion 控制器
-
-            services.AddHttpClient();
-
-            #region 缓存
-
-            var cacheConfig = _configHelper.Get<CacheConfig>("cacheconfig", _env.EnvironmentName);
-            if (cacheConfig.Type == CacheType.Redis)
-            {
-                var csredis = new CSRedis.CSRedisClient(cacheConfig.Redis.ConnectionString);
-                RedisHelper.Initialization(csredis);
-                services.AddSingleton<ICacheTool, RedisCacheTool>();
-            }
-            else
-            {
-                services.AddMemoryCache();
-                services.AddSingleton<ICacheTool, MemoryCacheTool>();
-            }
-
-            #endregion 缓存
-
-            #region IP限流
-
-            if (_appConfig.RateLimit)
-            {
-                services.AddIpRateLimit(_configuration, cacheConfig);
-            }
-
-            #endregion IP限流
-
-            //阻止NLog接收状态消息
-            services.Configure<ConsoleLifetimeOptions>(opts => opts.SuppressStatusMessages = true);
-
-            //性能分析
-            if (_appConfig.MiniProfiler)
-            {
-                services.AddMiniProfiler();
-            }
-
-            //动态api
-            services.AddDynamicApi(options =>
-            {
-                Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries
-                .Where(a => a.Name.EndsWith("Service"))
-                .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
-                options.AddAssemblyOptions(assemblies);
-            });
-        }
-
-        /// <summary>
-        /// 配置容器
-        /// </summary>
-        /// <param name="builder"></param>
-        /// <exception cref="Exception"></exception>
-        public virtual void ConfigureContainer(ContainerBuilder builder)
-        {
-            #region AutoFac IOC容器
-            try
-            {
-                // 控制器注入
-                builder.RegisterModule(new ControllerModule());
-
-                // 单例注入
-                builder.RegisterModule(new SingleInstanceModule());
-
-                // 仓储注入
-                builder.RegisterModule(new RepositoryModule());
-
-                // 服务注入
-                builder.RegisterModule(new ServiceModule(_appConfig));
-            }
-            catch (Exception ex)
-            {
-                throw new Exception(ex.Message + "\n" + ex.InnerException);
-            }
-
-            #endregion AutoFac IOC容器
-        }
-
-        /// <summary>
-        /// 配置中间件
-        /// </summary>
-        /// <param name="app"></param>
-        public virtual void Configure(IApplicationBuilder app)
-        {
-            #region app配置
-
-            //IP限流
-            if (_appConfig.RateLimit)
-            {
-                app.UseIpRateLimiting();
-            }
-
-            //性能分析
-            if (_appConfig.MiniProfiler)
-            {
-                app.UseMiniProfiler();
-            }
-
-            //异常
-            app.UseExceptionHandler("/Error");
-
-            //静态文件
-            app.UseDefaultFiles();
-            app.UseStaticFiles();
-            app.UseUploadConfig();
-
-            //路由
-            app.UseRouting();
-
-            //跨域
-            app.UseCors(DefaultCorsPolicyName);
-
-            //认证
-            app.UseAuthentication();
-
-            //授权
-            app.UseAuthorization();
-
-            //配置端点
-            app.UseEndpoints(endpoints =>
-            {
-                endpoints.MapControllers();
-            });
-
-            #endregion app配置
-
-            #region Swagger Api文档
-            if (_env.IsDevelopment() || _appConfig.Swagger.Enable)
-            {
-                app.UseSwagger();
-                app.UseSwaggerUI(c =>
-                {
-                    typeof(ApiVersion).GetEnumNames().OrderByDescending(e => e).ToList().ForEach(version =>
-                    {
-                        c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"ZhonTai.Admin.Host {version}");
-                    });
-                    c.RoutePrefix = "";//直接根目录访问,如果是IIS发布可以注释该语句,并打开launchSettings.launchUrl
-                    c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None);//折叠Api
-                    //c.DefaultModelsExpandDepth(-1);//不显示Models
-                    if (_appConfig.MiniProfiler)
-                    {
-                        c.InjectJavascript("/swagger/mini-profiler.js?v=4.2.22");
-                    }
-                });
-            }
-            #endregion Swagger Api文档
-
-            if (_env.IsDevelopment() || _appConfig.ApiUI.Enable)
-            {
-                app.UseApiUI(options =>
-                {
-                    options.RoutePrefix = "swagger";
-                    typeof(ApiVersion).GetEnumNames().OrderByDescending(e => e).ToList().ForEach(version =>
-                    {
-                        options.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"ZhonTai.Host {version}");
-                    });
-                });
-            }
-
-            //数据库日志
-            //var log = LogManager.GetLogger("db");
-            //var ei = new LogEventInfo(LogLevel.Error, "", "错误信息");
-            //ei.Properties["id"] = YitIdHelper.NextId();
-            //log.Log(ei);
-
-
-        }
-    }
-}

+ 0 - 166
src/platform/ZhonTai.Admin.Core/Db/DBServiceCollectionExtensions.cs

@@ -1,166 +0,0 @@
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using System;
-using System.Threading.Tasks;
-using FreeSql;
-using ZhonTai.Common.Auth;
-using ZhonTai.Common.Domain.Entities;
-using ZhonTai.Common.Configs;
-using ZhonTai.Common.Dbs;
-using ZhonTai.Common.Helpers;
-using ZhonTai.Common.Domain;
-using StackExchange.Profiling;
-
-namespace ZhonTai.Admin.Core.Db
-{
-    public static class DBServiceCollectionExtensions
-    {
-        /// <summary>
-        /// 添加数据库
-        /// </summary>
-        /// <param name="services"></param>
-        /// <param name="env"></param>
-        public async static Task AddDbAsync(this IServiceCollection services, IHostEnvironment env)
-        {
-            services.AddScoped<MyUnitOfWorkManager>();
-
-            var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", env.EnvironmentName);
-
-            //创建数据库
-            if (dbConfig.CreateDb)
-            {
-                await DbHelper.CreateDatabaseAsync(dbConfig);
-            }
-
-            #region FreeSql
-
-            var freeSqlBuilder = new FreeSqlBuilder()
-                    .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString)
-                    .UseAutoSyncStructure(false)
-                    .UseLazyLoading(false)
-                    .UseNoneCommandParameter(true);
-
-            #region 监听所有命令
-
-            if (dbConfig.MonitorCommand)
-            {
-                freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
-                {
-                    //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
-                    Console.WriteLine($"{cmd.CommandText}\r\n");
-                });
-            }
-
-            #endregion 监听所有命令
-
-            var fsql = freeSqlBuilder.Build();
-            fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
-
-            //配置实体
-            var appConfig = new ConfigHelper().Get<AppConfig>("appconfig", env.EnvironmentName);
-            DbHelper.ConfigEntity(fsql, appConfig);
-
-            #region 初始化数据库
-
-            //同步结构
-            if (dbConfig.SyncStructure)
-            {
-                DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
-            }
-
-            var user = services.BuildServiceProvider().GetService<IUser>();
-
-            #region 审计数据
-
-            //计算服务器时间
-            var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
-            var timeOffset = DateTime.UtcNow.Subtract(serverTime);
-            DbHelper.TimeOffset = timeOffset;
-            fsql.Aop.AuditValue += (s, e) =>
-            {
-                DbHelper.AuditValue(e, timeOffset, user);
-            };
-
-            #endregion 审计数据
-
-            //同步数据
-            if (dbConfig.SyncData)
-            {
-                await DbHelper.SyncDataAsync(fsql, dbConfig, appConfig);
-            }
-
-            #endregion 初始化数据库
-
-            //生成数据
-            if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
-            {
-                await DbHelper.GenerateDataAsync(fsql, appConfig);
-            }
-
-            #region 监听Curd操作
-
-            if (dbConfig.Curd)
-            {
-                fsql.Aop.CurdBefore += (s, e) =>
-                {
-                    if (appConfig.MiniProfiler)
-                    {
-                        MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
-                    }
-                    Console.WriteLine($"{e.Sql}\r\n");
-                };
-                fsql.Aop.CurdAfter += (s, e) =>
-                {
-                    if (appConfig.MiniProfiler)
-                    {
-                        MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
-                    }
-                    Console.WriteLine($"{e.Sql}\r\n");
-                };
-            }
-
-            #endregion 监听Curd操作
-
-            if (appConfig.Tenant)
-            {
-                fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
-            }
-
-            #endregion FreeSql
-
-            services.AddSingleton(fsql);
-
-            //导入多数据库
-            if (null != dbConfig.Dbs)
-            {
-                foreach (var multiDb in dbConfig.Dbs)
-                {
-                    switch (multiDb.Name)
-                    {
-                        case nameof(MySqlDb):
-                            var mdb = CreateMultiDbBuilder(multiDb).Build<MySqlDb>();
-                            services.AddSingleton(mdb);
-                            break;
-
-                        default:
-                            break;
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// 创建多数据库构建器
-        /// </summary>
-        /// <param name="multiDb"></param>
-        /// <returns></returns>
-        private static FreeSqlBuilder CreateMultiDbBuilder(MultiDb multiDb)
-        {
-            return new FreeSqlBuilder()
-            .UseConnectionString(multiDb.Type, multiDb.ConnectionString)
-            .UseAutoSyncStructure(false)
-            .UseLazyLoading(false)
-            .UseNoneCommandParameter(true);
-        }
-    }
-}

+ 0 - 18
src/platform/ZhonTai.Admin.Core/Enums/ApiVersion.cs

@@ -1,18 +0,0 @@
-namespace ZhonTai.Admin.Core.Enums
-{
-    /// <summary>
-    /// 接口版本
-    /// </summary>
-    public enum ApiVersion
-    {
-        /// <summary>
-        /// V1 版本
-        /// </summary>
-        V1 = 1,
-
-        /// <summary>
-        /// V2 版本
-        /// </summary>
-        V2 = 2,
-    }
-}

+ 0 - 46
src/platform/ZhonTai.Admin.Core/Enums/StatusCodes.cs

@@ -1,46 +0,0 @@
-using System.ComponentModel;
-
-namespace ZhonTai.Admin.Core.Enums
-{
-    /// <summary>
-    /// 状态码枚举
-    /// </summary>
-    public enum StatusCodes
-    {
-        /// <summary>
-        /// 操作失败
-        /// </summary>
-        [Description("操作失败")]
-        Status0NotOk = 0,
-
-        /// <summary>
-        /// 操作成功
-        /// </summary>
-        [Description("操作成功")]
-        Status1Ok = 1,
-
-        /// <summary>
-        /// 未登录(需要重新登录)
-        /// </summary>
-        [Description("未登录")]
-        Status401Unauthorized = 401,
-
-        /// <summary>
-        /// 权限不足
-        /// </summary>
-        [Description("权限不足")]
-        Status403Forbidden = 403,
-
-        /// <summary>
-        /// 资源不存在
-        /// </summary>
-        [Description("资源不存在")]
-        Status404NotFound = 404,
-
-        /// <summary>
-        /// 系统内部错误(非业务代码里显式抛出的异常,例如由于数据不正确导致空指针异常、数据库异常等等)
-        /// </summary>
-        [Description("系统内部错误")]
-        Status500InternalServerError = 500
-    }
-}

+ 0 - 43
src/platform/ZhonTai.Admin.Core/Extensions/RateLimitServiceCollectionExtensions.cs

@@ -1,43 +0,0 @@
-using AspNetCoreRateLimit;
-using Microsoft.Extensions.Caching.Distributed;
-using Microsoft.Extensions.Caching.Redis;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-using ZhonTai.Tools.Cache;
-
-namespace ZhonTai.Admin.Core.Extensions
-{
-    public static class RateLimitServiceCollectionExtensions
-    {
-        /// <summary>
-        /// 添加Ip限流
-        /// </summary>
-        /// <param name="services"></param>
-        /// <param name="configuration"></param>
-        /// <param name="cacheConfig"></param>
-        public static void AddIpRateLimit(this IServiceCollection services, IConfiguration configuration, CacheConfig cacheConfig)
-        {
-            #region IP限流
-
-            services.Configure<IpRateLimitOptions>(configuration.GetSection("IpRateLimiting"));
-            services.Configure<IpRateLimitPolicies>(configuration.GetSection("IpRateLimitPolicies"));
-
-            if (cacheConfig.TypeRateLimit == CacheType.Redis)
-            {
-                //redis
-                var redisRateLimit = new CSRedis.CSRedisClient(cacheConfig.Redis.ConnectionStringRateLimit);
-                services.AddSingleton<IDistributedCache>(new CSRedisCache(redisRateLimit));
-                services.AddDistributedRateLimiting();
-            }
-            else
-            {
-                //内存
-                services.AddMemoryCache();
-                services.AddInMemoryRateLimiting();
-            }
-            services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
-
-            #endregion IP限流
-        }
-    }
-}

+ 0 - 35
src/platform/ZhonTai.Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs

@@ -1,35 +0,0 @@
-using Microsoft.AspNetCore.Builder;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.FileProviders;
-using Microsoft.Extensions.Options;
-using System.IO;
-using ZhonTai.Common.Configs;
-
-namespace ZhonTai.Admin.Core.Extensions
-{
-    public static class UploadConfigApplicationBuilderExtensions
-    {
-        private static void UseFileUploadConfig(IApplicationBuilder app, FileUploadConfig config)
-        {
-            if (!Directory.Exists(config.UploadPath))
-            {
-                Directory.CreateDirectory(config.UploadPath);
-            }
-
-            app.UseStaticFiles(new StaticFileOptions()
-            {
-                RequestPath = config.RequestPath,
-                FileProvider = new PhysicalFileProvider(config.UploadPath)
-            });
-        }
-
-        public static IApplicationBuilder UseUploadConfig(this IApplicationBuilder app)
-        {
-            var uploadConfig = app.ApplicationServices.GetRequiredService<IOptions<UploadConfig>>();
-            UseFileUploadConfig(app, uploadConfig.Value.Avatar);
-            UseFileUploadConfig(app, uploadConfig.Value.Document);
-
-            return app;
-        }
-    }
-}

+ 0 - 62
src/platform/ZhonTai.Admin.Core/Filters/ControllerExceptionFilter.cs

@@ -1,62 +0,0 @@
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using System.Threading.Tasks;
-using ZhonTai.Common.Extensions;
-using ZhonTai.Common.Domain.Dto;
-
-namespace ZhonTai.Admin.Core.Filters
-{
-    /// <summary>
-    /// 控制器异常处理
-    /// </summary>
-    public class ControllerExceptionFilter : IExceptionFilter, IAsyncExceptionFilter
-    {
-        private readonly IWebHostEnvironment _env;
-        private readonly ILogger<ControllerExceptionFilter> _logger;
-
-        public ControllerExceptionFilter(IWebHostEnvironment env, ILogger<ControllerExceptionFilter> logger)
-        {
-            _env = env;
-            _logger = logger;
-        }
-
-        public void OnException(ExceptionContext context)
-        {
-            if (context.ExceptionHandled == false)
-            {
-                string message;
-                if (_env.IsProduction())
-                {
-                    message = Enums.StatusCodes.Status500InternalServerError.ToDescription();
-                }
-                else
-                {
-                    message = context.Exception.Message;
-                }
-
-                _logger.LogError(context.Exception, "");
-                var data = ResultOutput.NotOk(message);
-                context.Result = new InternalServerErrorResult(data);
-            }
-
-            context.ExceptionHandled = true;
-        }
-
-        public Task OnExceptionAsync(ExceptionContext context)
-        {
-            OnException(context);
-            return Task.CompletedTask;
-        }
-    }
-
-    public class InternalServerErrorResult : ObjectResult
-    {
-        public InternalServerErrorResult(object value) : base(value)
-        {
-            StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError;
-        }
-    }
-}

+ 0 - 31
src/platform/ZhonTai.Admin.Core/Filters/ControllerLogFilter.cs

@@ -1,31 +0,0 @@
-using Microsoft.AspNetCore.Mvc.Filters;
-using System.Linq;
-using System.Threading.Tasks;
-using ZhonTai.Common.Attributes;
-using ZhonTai.Admin.Core.Logs;
-
-namespace ZhonTai.Admin.Core.Filters
-{
-    /// <summary>
-    /// 控制器操作日志记录
-    /// </summary>
-    public class ControllerLogFilter : IAsyncActionFilter
-    {
-        private readonly ILogHandler _logHandler;
-
-        public ControllerLogFilter(ILogHandler logHandler)
-        {
-            _logHandler = logHandler;
-        }
-
-        public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
-        {
-            if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(NoOprationLogAttribute)))
-            {
-                return next();
-            }
-
-            return _logHandler.LogAsync(context, next);
-        }
-    }
-}

+ 0 - 35
src/platform/ZhonTai.Admin.Core/Filters/EnumSchemaFilter.cs

@@ -1,35 +0,0 @@
-using Microsoft.OpenApi.Any;
-using Microsoft.OpenApi.Models;
-using Swashbuckle.AspNetCore.SwaggerGen;
-using System;
-using System.Linq;
-using System.Reflection;
-using ZhonTai.Common.Extensions;
-
-namespace ZhonTai.Admin.Core.Filters
-{
-    public class EnumSchemaFilter : ISchemaFilter
-    {
-        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
-        {
-            //CommonUtils.GetProperyCommentBySummary
-            var type = context.Type;
-            if (type.IsEnum)
-            {
-                var items = Enum.GetValues(type).Cast<Enum>()
-                .Where(m => !m.ToString().Equals("Null")).Select(x =>
-                $"{x.ToDescription()}={((int)type.InvokeMember(x.ToString(), BindingFlags.GetField, null, null, null))}").ToList();
-
-                if (items?.Count > 0)
-                {
-                    string description = string.Join(",", items);
-                    schema.Extensions.Add("extensions", new OpenApiObject
-                    {
-                        ["description"] = new OpenApiString(description)
-                    });
-                    schema.Description = string.IsNullOrEmpty(schema.Description) ? description : $"{schema.Description}:{description}";
-                }
-            }
-        }
-    }
-}

+ 0 - 52
src/platform/ZhonTai.Admin.Core/Filters/ValidateInputFilter.cs

@@ -1,52 +0,0 @@
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.AspNetCore.Mvc.ModelBinding;
-using Microsoft.Extensions.Logging;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using ZhonTai.Common.Domain.Dto;
-
-namespace ZhonTai.Admin.Core.Filters
-{
-    /// <summary>
-    /// 输入模型验证过滤器
-    /// </summary>
-    public class ValidateInputFilter : IAsyncActionFilter
-    {
-        public ValidateInputFilter()
-        {
-        }
-
-        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
-        {
-            if (!context.ModelState.IsValid)
-            {
-                try
-                {
-                    var logger = (ILogger<ValidateInputFilter>)context.HttpContext.RequestServices.GetService(typeof(ILogger<ValidateInputFilter>));
-                    var errors = context.ModelState
-                    .Where(m => m.Value.ValidationState == ModelValidationState.Invalid)
-                    .Select(m =>
-                    {
-                        var sb = new StringBuilder();
-                        sb.AppendFormat("{0}:", m.Key);
-                        sb.Append(m.Value.Errors.Select(n => n.ErrorMessage).Aggregate((x, y) => x + ";" + y));
-                        return sb.ToString();
-                    })
-                    .Aggregate((x, y) => x + "|" + y);
-                    logger.LogError(errors);
-                    context.Result = new JsonResult(ResultOutput.NotOk(errors));
-                }
-                catch
-                {
-                    context.Result = new StatusCodeResult(StatusCodes.Status500InternalServerError);
-                }
-                return;
-            }
-            
-            await next();
-        }
-    }
-}

+ 0 - 73
src/platform/ZhonTai.Admin.Core/HostBuilderProvider.cs

@@ -1,73 +0,0 @@
-using Autofac.Extensions.DependencyInjection;
-using System;
-using Microsoft.Extensions.Logging;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Configuration;
-using NLog;
-using NLog.Web;
-using LogLevel = Microsoft.Extensions.Logging.LogLevel;
-using ZhonTai.Common.Configs;
-using ZhonTai.Common.Helpers;
-
-namespace ZhonTai.Admin.Core
-{
-    public class HostBuilderProvider
-    {
-        private AppConfig appConfig = new ConfigHelper().Get<AppConfig>("appconfig") ?? new AppConfig();
-
-        public void Run<T>(string[] args) where T : BaseStartup
-        {
-            var logger = LogManager.GetCurrentClassLogger();
-            try
-            {
-                Console.WriteLine(" launching...");
-                var host = CreateHostBuilder<T>(args).Build();
-                Console.WriteLine($"\r\n {string.Join("\r\n ", appConfig.Urls)}\r\n");
-                host.Run();
-            }
-            catch (Exception ex)
-            {
-                logger.Error(ex, "Stopped program because of exception");
-            }
-            finally
-            {
-                LogManager.Shutdown();
-            }
-        }
-
-        public IHostBuilder CreateHostBuilder<T>(string[] args) where T : BaseStartup
-        {
-            //使用logconfig.json配置,默认使用nlog.config
-            //var logConfig = new ConfigHelper().Load("logconfig", reloadOnChange: true).GetSection("nLog");
-            //LogManager.Configuration = new NLogLoggingConfiguration(logConfig);
-
-            return Host.CreateDefaultBuilder(args)
-            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
-            .ConfigureWebHostDefaults(webBuilder =>
-            {
-                webBuilder
-                //.UseEnvironment(Environments.Production)
-                .UseStartup<T>()
-                .ConfigureAppConfiguration((host, config) =>
-                {
-                    if (appConfig.RateLimit)
-                    {
-                        config.AddJsonFile("./configs/ratelimitconfig.json", optional: false, reloadOnChange: true);
-                        if (host.HostingEnvironment.EnvironmentName.NotNull())
-                        {
-                            config.AddJsonFile($"./configs/ratelimitconfig.{host.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
-                        }
-                    }
-                })
-                .UseUrls(appConfig.Urls);
-            })
-            .ConfigureLogging(logging =>
-            {
-                logging.ClearProviders();
-                logging.SetMinimumLevel(LogLevel.Trace);
-            })
-            .UseNLog();
-        }
-    }
-}

+ 0 - 65
src/platform/ZhonTai.Admin.Core/Logs/ApiHelper.cs

@@ -1,65 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using ZhonTai.Common.Attributes;
-using ZhonTai.Admin.Domain.Api;
-
-namespace ZhonTai.Admin.Core.Logs
-{
-    /// <summary>
-    /// Api帮助类
-    /// </summary>
-    [SingleInstance]
-    public class ApiHelper
-    {
-        private List<ApiHelperDto> _apis;
-        private static readonly object _lockObject = new object();
-
-        private readonly IApiRepository _apiRepository;
-        public ApiHelper(IApiRepository apiRepository)
-        {
-            _apiRepository = apiRepository;
-        }
-
-        public List<ApiHelperDto> GetApis()
-        {
-            if (_apis != null && _apis.Any())
-                return _apis;
-
-            lock (_lockObject)
-            {
-                if (_apis != null && _apis.Any())
-                    return _apis;
-
-                _apis = new List<ApiHelperDto>();
-
-                var apis = _apiRepository.Select.ToList(a => new { a.Id, a.ParentId, a.Label, a.Path });
-
-                foreach (var api in apis)
-                {
-                    var parentLabel = apis.FirstOrDefault(a => a.Id == api.ParentId)?.Label;
-
-                    _apis.Add(new ApiHelperDto
-                    {
-                        Label = parentLabel.NotNull() ? $"{parentLabel} / {api.Label}" : api.Label,
-                        Path = api.Path?.ToLower().Trim('/')
-                    });
-                }
-
-                return _apis;
-            }
-        }
-    }
-
-    public class ApiHelperDto
-    {
-        /// <summary>
-        /// 接口名称
-        /// </summary>
-        public string Label { get; set; }
-
-        /// <summary>
-        /// 接口地址
-        /// </summary>
-        public string Path { get; set; }
-    }
-}

+ 0 - 19
src/platform/ZhonTai.Admin.Core/Logs/ILogHandler.cs

@@ -1,19 +0,0 @@
-using Microsoft.AspNetCore.Mvc.Filters;
-using System.Threading.Tasks;
-
-namespace ZhonTai.Admin.Core.Logs
-{
-    /// <summary>
-    /// 操作日志处理接口
-    /// </summary>
-    public interface ILogHandler
-    {
-        /// <summary>
-        /// 写操作日志
-        /// </summary>
-        /// <param name="context"></param>
-        /// <param name="next"></param>
-        /// <returns></returns>
-        Task LogAsync(ActionExecutingContext context, ActionExecutionDelegate next);
-    }
-}

+ 0 - 73
src/platform/ZhonTai.Admin.Core/Logs/LogHandler.cs

@@ -1,73 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.Extensions.Logging;
-using ZhonTai.Common.Domain.Dto;
-using ZhonTai.Admin.Service.OprationLog;
-using ZhonTai.Admin.Service.OprationLog.Dto;
-
-//using Newtonsoft.Json;
-
-namespace ZhonTai.Admin.Core.Logs
-{
-    /// <summary>
-    /// 操作日志处理
-    /// </summary>
-    public class LogHandler : ILogHandler
-    {
-        private readonly ILogger _logger;
-        private readonly ApiHelper _apiHelper;
-        private readonly IOprationLogService _oprationLogService;
-
-        public LogHandler(
-            ILogger<LogHandler> logger,
-            ApiHelper apiHelper,
-            IOprationLogService oprationLogService
-        )
-        {
-            _logger = logger;
-            _apiHelper = apiHelper;
-            _oprationLogService = oprationLogService;
-        }
-
-        public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelegate next)
-        {
-            var sw = new Stopwatch();
-            sw.Start();
-            var actionExecutedContext = await next();
-            sw.Stop();
-
-            //操作参数
-            //var args = JsonConvert.SerializeObject(context.ActionArguments);
-            //操作结果
-            //var result = JsonConvert.SerializeObject(actionResult?.Value);
-
-            try
-            {
-                var input = new OprationLogAddInput
-                {
-                    ApiMethod = context.HttpContext.Request.Method.ToLower(),
-                    ApiPath = context.ActionDescriptor.AttributeRouteInfo.Template.ToLower(),
-                    ElapsedMilliseconds = sw.ElapsedMilliseconds
-                };
-
-                if (actionExecutedContext.Result is ObjectResult result && result.Value is IResultOutput res)
-                {
-                    input.Status = res.Success;
-                    input.Msg = res.Msg;
-                }
-
-                input.ApiLabel = _apiHelper.GetApis().FirstOrDefault(a => a.Path == input.ApiPath)?.Label;
-
-                await _oprationLogService.AddAsync(input);
-            }
-            catch (Exception ex)
-            {
-                _logger.LogError("操作日志插入异常:{@ex}", ex);
-            }
-        }
-    }
-}

+ 0 - 29
src/platform/ZhonTai.Admin.Core/RegisterModules/ControllerModule.cs

@@ -1,29 +0,0 @@
-
-using Autofac;
-using Microsoft.AspNetCore.Mvc;
-using System.Linq;
-using System.Reflection;
-using Module = Autofac.Module;
-
-namespace ZhonTai.Admin.Core.RegisterModules
-{
-    public class ControllerModule : Module
-    {
-        /// <summary>
-        /// 控制器注入
-        /// </summary>
-        public ControllerModule()
-        {
-        }
-
-        protected override void Load(ContainerBuilder builder)
-        {
-            var controllerTypes = Assembly.GetExecutingAssembly().GetExportedTypes()
-            .Where(type => typeof(ControllerBase).IsAssignableFrom(type))
-            .ToArray();
-
-            // 配置所有控制器均支持属性注入
-            builder.RegisterTypes(controllerTypes).PropertiesAutowired();
-        }
-    }
-}

+ 0 - 43
src/platform/ZhonTai.Admin.Core/RegisterModules/RepositoryModule.cs

@@ -1,43 +0,0 @@
-
-using System.Linq;
-using System.Reflection;
-using Autofac;
-using Module = Autofac.Module;
-using ZhonTai.Common.Domain;
-using ZhonTai.Common.Domain.Repositories;
-using Microsoft.Extensions.DependencyModel;
-
-namespace ZhonTai.Admin.Core.RegisterModules
-{
-    public class RepositoryModule : Module
-    {
-        private readonly string _assemblySuffixName;
-
-        /// <summary>
-        /// 仓储注入
-        /// </summary>
-        /// <param name="assemblySuffixName">程序集后缀名</param>
-        public RepositoryModule(string assemblySuffixName = "Repository")
-        {
-            _assemblySuffixName = assemblySuffixName;
-        }
-
-        protected override void Load(ContainerBuilder builder)
-        {
-            //仓储
-            Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries
-                .Where(a => a.Name.EndsWith(_assemblySuffixName))
-                .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
-
-            builder.RegisterAssemblyTypes(assemblies)
-            .Where(a => a.Name.EndsWith(_assemblySuffixName))
-            .AsImplementedInterfaces()
-            .InstancePerLifetimeScope()
-            .PropertiesAutowired();// 属性注入
-
-            //泛型注入
-            builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepositoryBase<>)).InstancePerLifetimeScope();
-            builder.RegisterGeneric(typeof(RepositoryBase<,>)).As(typeof(IRepositoryBase<,>)).InstancePerLifetimeScope();
-        }
-    }
-}

+ 0 - 64
src/platform/ZhonTai.Admin.Core/RegisterModules/ServiceModule.cs

@@ -1,64 +0,0 @@
-using Autofac;
-using Autofac.Extras.DynamicProxy;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
-using Module = Autofac.Module;
-using ZhonTai.Common.Domain;
-using ZhonTai.Common.Configs;
-using Microsoft.Extensions.DependencyModel;
-
-namespace ZhonTai.Admin.Core.RegisterModules
-{
-    public class ServiceModule : Module
-    {
-        private readonly AppConfig _appConfig;
-        private readonly string _assemblySuffixName;
-
-        /// <summary>
-        /// 服务注入
-        /// </summary>
-        /// <param name="appConfig">AppConfig</param>
-        /// <param name="assemblySuffixName">程序集后缀名</param>
-        public ServiceModule(AppConfig appConfig, string assemblySuffixName = "Service")
-        {
-            _appConfig = appConfig;
-            _assemblySuffixName = assemblySuffixName;
-        }
-
-        protected override void Load(ContainerBuilder builder)
-        {
-            //事务拦截
-            var interceptorServiceTypes = new List<Type>();
-            if (_appConfig.Aop.Transaction)
-            {
-                builder.RegisterType<TransactionInterceptor>();
-                builder.RegisterType<TransactionAsyncInterceptor>();
-                interceptorServiceTypes.Add(typeof(TransactionInterceptor));
-            }
-
-            //服务
-            Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries
-                .Where(a => a.Name.EndsWith(_assemblySuffixName))
-                .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
-
-            //服务接口实例
-            builder.RegisterAssemblyTypes(assemblies)
-            .Where(a => a.Name.EndsWith(_assemblySuffixName))
-            .AsImplementedInterfaces()
-            .InstancePerLifetimeScope()
-            .PropertiesAutowired()// 属性注入
-            .InterceptedBy(interceptorServiceTypes.ToArray())
-            .EnableInterfaceInterceptors();
-
-            //服务实例
-            builder.RegisterAssemblyTypes(assemblies)
-            .Where(a => a.Name.EndsWith(_assemblySuffixName))
-            .InstancePerLifetimeScope()
-            .PropertiesAutowired()// 属性注入
-            .InterceptedBy(interceptorServiceTypes.ToArray())
-            .EnableClassInterceptors();
-        }
-    }
-}

+ 0 - 44
src/platform/ZhonTai.Admin.Core/RegisterModules/SingleInstanceModule.cs

@@ -1,44 +0,0 @@
-using Autofac;
-using Microsoft.Extensions.DependencyModel;
-using System.Linq;
-using System.Reflection;
-using Module = Autofac.Module;
-using ZhonTai.Common.Attributes;
-
-namespace ZhonTai.Admin.Core.RegisterModules
-{
-    public class SingleInstanceModule : Module
-    {
-        private readonly string _assemblyPrefixName;
-
-        /// <summary>
-        /// 单例注入
-        /// </summary>
-        /// <param name="assemblyPrefixName">程序集前缀名</param>
-        public SingleInstanceModule(string assemblyPrefixName = "ZhonTai")
-        {
-            _assemblyPrefixName = assemblyPrefixName;
-        }
-
-        protected override void Load(ContainerBuilder builder)
-        {
-            // 获得要注入的程序集
-            Assembly[] assemblies = DependencyContext.Default.RuntimeLibraries
-                .Where(a => a.Name.StartsWith(_assemblyPrefixName))
-                .Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
-
-            //无接口注入单例
-            builder.RegisterAssemblyTypes(assemblies)
-            .Where(t => t.GetCustomAttribute<SingleInstanceAttribute>() != null)
-            .SingleInstance()
-            .PropertiesAutowired();
-
-            //有接口注入单例
-            builder.RegisterAssemblyTypes(assemblies)
-            .Where(t => t.GetCustomAttribute<SingleInstanceAttribute>() != null)
-            .AsImplementedInterfaces()
-            .SingleInstance()
-            .PropertiesAutowired();
-        }
-    }
-}

+ 0 - 24
src/platform/ZhonTai.Admin.Core/ZhonTai.Admin.Core.csproj

@@ -1,24 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-	<PropertyGroup>
-		<Description>中台Admin接口共享库</Description>
-	</PropertyGroup>
-	
-	<ItemGroup>
-		<PackageReference Include="AspNetCoreRateLimit" Version="4.0.1" />
-		<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
-		<PackageReference Include="Caching.CSRedis" Version="3.6.60" />
-		<PackageReference Include="FluentValidation.AspNetCore" Version="10.3.4" />
-		<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
-		<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.0" />
-		<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.0" />
-		<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="6.0.0" />
-		<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
-		<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
-		<PackageReference Include="Mapster" Version="7.2.0" />
-	</ItemGroup>
-	
-	<ItemGroup>
-	  <ProjectReference Include="..\ZhonTai.ApiUI\ZhonTai.ApiUI.csproj" />
-	  <ProjectReference Include="..\ZhonTai.Tools\ZhonTai.Tools.csproj" />
-	</ItemGroup>
-</Project>