From 05ed3d3746aa274a0f88f7afadfea12a3c8a80ff Mon Sep 17 00:00:00 2001 From: nsnail Date: Fri, 5 Jan 2024 16:08:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20=E5=B0=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E7=BB=93=E6=9E=84=E5=90=8C=E6=AD=A5=E5=92=8C=E7=A7=8D?= =?UTF-8?q?=E5=AD=90=E6=95=B0=E6=8D=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E5=91=BD=E4=BB=A4=E8=A1=8C=E5=BC=80=E5=85=B3=20(#78)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- README.md | 2 +- .../CommandLineArgs.cs | 21 +++ .../Extensions/ServiceCollectionExtensions.cs | 5 +- .../Properties/launchSettings.json | 8 ++ .../NetAdmin.BizServer.Host/Startup.cs | 130 +++++++++++------- .../NetAdmin.Host/NetAdmin.Host.csproj | 2 +- src/backend/NetAdmin.Host/Startup.cs | 16 +++ 8 files changed, 129 insertions(+), 57 deletions(-) create mode 100644 src/backend/NetAdmin.BizServer.Host/CommandLineArgs.cs diff --git a/Dockerfile b/Dockerfile index 1975c6d5..9a9527ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,4 @@ EXPOSE 8080 RUN apt update RUN apt install -y redis COPY ./dist/backend/NetAdmin.BizServer.Host/bin/Release/net8.0/publish . -ENTRYPOINT redis-server --daemonize yes && dotnet NetAdmin.BizServer.Host.dll \ No newline at end of file +ENTRYPOINT redis-server --daemonize yes && dotnet NetAdmin.BizServer.Host.dll -is \ No newline at end of file diff --git a/README.md b/README.md index edbfdc65..118b40ad 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ docker run -p 8080:8080 nsnail/netadmin ``` 4. 运行后端WebApi ``` shell - dotnet run --project ./src/backend/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj --urls http://[::]:5010 + dotnet run --project ./src/backend/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj --urls http://[::]:5010 -is ``` 5. 体验WebApi程序 - 浏览器打开 http://localhost:5010 ,将看到Swagger(Knife4jUI)界面 diff --git a/src/backend/NetAdmin.BizServer.Host/CommandLineArgs.cs b/src/backend/NetAdmin.BizServer.Host/CommandLineArgs.cs new file mode 100644 index 00000000..2495666d --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/CommandLineArgs.cs @@ -0,0 +1,21 @@ +using Spectre.Console.Cli; + +namespace NetAdmin.BizServer.Host; + +/// +/// 命令行参数 +/// +public sealed class CommandLineArgs : CommandSettings +{ + /// + /// 插入种子数据 + /// + [CommandOption("-i|--insert-seed-data")] + public bool InsertSeedData { get; set; } + + /// + /// 同步数据库结构 + /// + [CommandOption("-s|--sync-structure")] + public bool SyncStructure { get; set; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs b/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs index 34ee7eee..11b78fe9 100644 --- a/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs +++ b/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs @@ -15,10 +15,11 @@ public static class ServiceCollectionExtensions /// /// 添加 FreeSql /// - public static IServiceCollection AddFreeSql(this IServiceCollection me) + public static IServiceCollection AddFreeSqlWithArgs(this IServiceCollection me) { return me.AddFreeSql( // - FreeSqlInitMethods.SyncStructure | FreeSqlInitMethods.InsertSeedData, freeSql => { + (Startup.Args.SyncStructure ? FreeSqlInitMethods.SyncStructure : FreeSqlInitMethods.None) | + (Startup.Args.InsertSeedData ? FreeSqlInitMethods.InsertSeedData : FreeSqlInitMethods.None), freeSql => { // 数据权限过滤器 _ = freeSql.GlobalFilter.ApplyOnlyIf( // Chars.FLG_GLOBAL_FILTER_DATA diff --git a/src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json b/src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json index 64222a4e..7b410e7b 100644 --- a/src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json +++ b/src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json @@ -10,6 +10,14 @@ "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } + }, + "InitDB": { + "commandName": "Project", + "dotnetRunMessages": true, + "commandLineArgs": "-is", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } } } } \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/Startup.cs b/src/backend/NetAdmin.BizServer.Host/Startup.cs index a5f26ce1..083fc2d5 100644 --- a/src/backend/NetAdmin.BizServer.Host/Startup.cs +++ b/src/backend/NetAdmin.BizServer.Host/Startup.cs @@ -1,71 +1,97 @@ +using NetAdmin.BizServer.Host; using NetAdmin.BizServer.Host.Extensions; using NetAdmin.Host.Extensions; using NetAdmin.Host.Middlewares; +using Spectre.Console.Cli; +using ValidationResult = Spectre.Console.ValidationResult; #if !DEBUG using Prometheus; #endif -namespace NetAdmin.BizServer.Host; +NetAdmin.Host.Startup.Entry(args); -/// -/// 启动类 -/// -public sealed class Startup : NetAdmin.Host.Startup +namespace NetAdmin.BizServer.Host { /// - /// 程序入口 + /// 启动类 /// - public static void Main(string[] args) + public sealed class Startup : NetAdmin.Host.Startup, ICommand { - ShowBanner(); - _ = Serve.Run(RunOptions.Default.WithArgs(args)); - } + /// + /// 命令行参数 + /// + public static CommandLineArgs Args { get; private set; } - /// - /// 配置应用程序中间件 - /// - public void Configure(IApplicationBuilder app) - { - _ = app // - .UseRealIp() // 使用RealIp中间件,用于获取真实客户端IP地址 - .EnableBuffering() // 启用请求体缓冲,允许多次读取请求体 - .UseMiddleware() // 使用RequestAuditMiddleware中间件,执行请求审计 - #if DEBUG - .UseOpenApiSkin() // 使用OpenApiSkin中间件(仅在调试模式下),提供Swagger UI皮肤 - #else + /// + /// 配置应用程序中间件 + /// + public void Configure(IApplicationBuilder app) + { + _ = app // + .UseRealIp() // 使用RealIp中间件,用于获取真实客户端IP地址 + .EnableBuffering() // 启用请求体缓冲,允许多次读取请求体 + .UseMiddleware() // 使用RequestAuditMiddleware中间件,执行请求审计 + #if DEBUG + .UseOpenApiSkin() // 使用OpenApiSkin中间件(仅在调试模式下),提供Swagger UI皮肤 + #else .UseVueAdmin() // 托管管理后台,仅在非调试模式下 .UseHttpMetrics() // 使用HttpMetrics中间件,启用HTTP性能监控 - #endif - .UseInject(string.Empty) // 使用Inject中间件,Furion脚手架的依赖注入支持 - .UseUnifyResultStatusCodes() // 使用UnifyResultStatusCodes中间件,用于统一处理结果状态码 - .UseCorsAccessor() // 使用CorsAccessor中间件,启用跨域资源共享(CORS)支持 - .UseRouting() // 使用Routing中间件,配置路由映射 - .UseAuthentication() // 使用Authentication中间件,启用身份验证 - .UseAuthorization() // 使用Authorization中间件,启用授权 - .UseMiddleware() // 使用RemoveNullNodeMiddleware中间件,删除JSON中的空节点 - .UseEndpoints(); // 配置端点以处理请求 - } + #endif + .UseInject(string.Empty) // 使用Inject中间件,Furion脚手架的依赖注入支持 + .UseUnifyResultStatusCodes() // 使用UnifyResultStatusCodes中间件,用于统一处理结果状态码 + .UseCorsAccessor() // 使用CorsAccessor中间件,启用跨域资源共享(CORS)支持 + .UseRouting() // 使用Routing中间件,配置路由映射 + .UseAuthentication() // 使用Authentication中间件,启用身份验证 + .UseAuthorization() // 使用Authorization中间件,启用授权 + .UseMiddleware() // 使用RemoveNullNodeMiddleware中间件,删除JSON中的空节点 + .UseEndpoints(); // 配置端点以处理请求 + } - /// - /// 配置服务容器 - /// - public void ConfigureServices(IServiceCollection services) - { - _ = services.AddConsoleFormatter() // 添加控制台日志模板 - .AddAllOptions() // 添加配置项 - .AddJwt() // 添加 Jwt 授权处理器 - .AddSnowflake() // 添加雪花编号生成器 - .AddEventBus() // 添加事件总线 - .AddFreeSql() // 添加 freeSql - .AddRemoteRequest() // 添加远程请求 - .AddCorsAccessor() // 添加支持跨域访问 - .AddContextUser() // 添加上下文用户 - .AddRedisCache() // 添加 Redis 缓存 + /// + /// 配置服务容器 + /// + public void ConfigureServices(IServiceCollection services) + { + _ = services.AddConsoleFormatter() // 添加控制台日志模板 + .AddAllOptions() // 添加配置项 + .AddJwt() // 添加 Jwt 授权处理器 + .AddSnowflake() // 添加雪花编号生成器 + .AddEventBus() // 添加事件总线 + .AddFreeSqlWithArgs() // 添加 freeSql + .AddRemoteRequest() // 添加远程请求 + .AddCorsAccessor() // 添加支持跨域访问 + .AddContextUser() // 添加上下文用户 + .AddRedisCache() // 添加 Redis 缓存 - // IMvcBuilder - .AddControllers() // 添加控制器 - .AddJsonSerializer(true) // 添加JSON序列化器,并设置显示枚举名而非数字枚举值 - .AddDefaultApiResultHandler() // 添加默认的API结果处理程序 - ; + // IMvcBuilder + .AddControllers() // 添加控制器 + .AddJsonSerializer(true) // 添加JSON序列化器,并设置显示枚举名而非数字枚举值 + .AddDefaultApiResultHandler() // 添加默认的API结果处理程序 + ; + } + + /// + #pragma warning disable ASA001 + public Task Execute(CommandContext context, CommandLineArgs settings) + #pragma warning restore ASA001 + { + Args = settings; + _ = Serve.Run(RunOptions.Default.WithArgs(context.Remaining.Raw.ToArray())); + return Task.FromResult(0); + } + + /// + #pragma warning disable ASA001 + public Task Execute(CommandContext context, CommandSettings settings) + #pragma warning restore ASA001 + { + return Execute(context, (settings as CommandLineArgs)!); + } + + /// + public ValidationResult Validate(CommandContext context, CommandSettings settings) + { + return ValidationResult.Success(); + } } } \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/NetAdmin.Host.csproj b/src/backend/NetAdmin.Host/NetAdmin.Host.csproj index 9e1430dc..e6a75d24 100644 --- a/src/backend/NetAdmin.Host/NetAdmin.Host.csproj +++ b/src/backend/NetAdmin.Host/NetAdmin.Host.csproj @@ -5,7 +5,7 @@ - + \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Startup.cs b/src/backend/NetAdmin.Host/Startup.cs index e48c321d..ce1c84d0 100644 --- a/src/backend/NetAdmin.Host/Startup.cs +++ b/src/backend/NetAdmin.Host/Startup.cs @@ -1,4 +1,5 @@ using Spectre.Console; +using Spectre.Console.Cli; namespace NetAdmin.Host; @@ -7,6 +8,21 @@ namespace NetAdmin.Host; /// public abstract class Startup : AppStartup { + /// + /// 程序入口 + /// + public static void Entry(IEnumerable args, Action commandConfig = null) + where T : class, ICommand + { + ShowBanner(); + var app = new CommandApp(); + if (commandConfig != null) { + app.Configure(commandConfig); + } + + _ = app.Run(args); + } + /// /// 打印Banner ///