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
///