feat: 将数据库结构同步和种子数据初始化作为命令行开关 (#78)

This commit is contained in:
nsnail 2024-01-05 16:08:50 +08:00 committed by GitHub
parent 22628e79ca
commit 05ed3d3746
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 129 additions and 57 deletions

View File

@ -4,4 +4,4 @@ EXPOSE 8080
RUN apt update RUN apt update
RUN apt install -y redis RUN apt install -y redis
COPY ./dist/backend/NetAdmin.BizServer.Host/bin/Release/net8.0/publish . COPY ./dist/backend/NetAdmin.BizServer.Host/bin/Release/net8.0/publish .
ENTRYPOINT redis-server --daemonize yes && dotnet NetAdmin.BizServer.Host.dll ENTRYPOINT redis-server --daemonize yes && dotnet NetAdmin.BizServer.Host.dll -is

View File

@ -42,7 +42,7 @@ docker run -p 8080:8080 nsnail/netadmin
``` ```
4. 运行后端WebApi 4. 运行后端WebApi
``` shell ``` 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程序 5. 体验WebApi程序
- 浏览器打开 http://localhost:5010 将看到SwaggerKnife4jUI界面 - 浏览器打开 http://localhost:5010 将看到SwaggerKnife4jUI界面

View File

@ -0,0 +1,21 @@
using Spectre.Console.Cli;
namespace NetAdmin.BizServer.Host;
/// <summary>
/// 命令行参数
/// </summary>
public sealed class CommandLineArgs : CommandSettings
{
/// <summary>
/// 插入种子数据
/// </summary>
[CommandOption("-i|--insert-seed-data")]
public bool InsertSeedData { get; set; }
/// <summary>
/// 同步数据库结构
/// </summary>
[CommandOption("-s|--sync-structure")]
public bool SyncStructure { get; set; }
}

View File

@ -15,10 +15,11 @@ public static class ServiceCollectionExtensions
/// <summary> /// <summary>
/// 添加 FreeSql /// 添加 FreeSql
/// </summary> /// </summary>
public static IServiceCollection AddFreeSql(this IServiceCollection me) public static IServiceCollection AddFreeSqlWithArgs(this IServiceCollection me)
{ {
return me.AddFreeSql( // 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<IFieldOwner>( // _ = freeSql.GlobalFilter.ApplyOnlyIf<IFieldOwner>( //
Chars.FLG_GLOBAL_FILTER_DATA Chars.FLG_GLOBAL_FILTER_DATA

View File

@ -10,6 +10,14 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"InitDB": {
"commandName": "Project",
"dotnetRunMessages": true,
"commandLineArgs": "-is",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
} }
} }
} }

View File

@ -1,25 +1,26 @@
using NetAdmin.BizServer.Host;
using NetAdmin.BizServer.Host.Extensions; using NetAdmin.BizServer.Host.Extensions;
using NetAdmin.Host.Extensions; using NetAdmin.Host.Extensions;
using NetAdmin.Host.Middlewares; using NetAdmin.Host.Middlewares;
using Spectre.Console.Cli;
using ValidationResult = Spectre.Console.ValidationResult;
#if !DEBUG #if !DEBUG
using Prometheus; using Prometheus;
#endif #endif
namespace NetAdmin.BizServer.Host; NetAdmin.Host.Startup.Entry<Startup>(args);
namespace NetAdmin.BizServer.Host
{
/// <summary> /// <summary>
/// 启动类 /// 启动类
/// </summary> /// </summary>
public sealed class Startup : NetAdmin.Host.Startup public sealed class Startup : NetAdmin.Host.Startup, ICommand<CommandLineArgs>
{ {
/// <summary> /// <summary>
/// 程序入口 /// 命令行参数
/// </summary> /// </summary>
public static void Main(string[] args) public static CommandLineArgs Args { get; private set; }
{
ShowBanner();
_ = Serve.Run(RunOptions.Default.WithArgs(args));
}
/// <summary> /// <summary>
/// 配置应用程序中间件 /// 配置应用程序中间件
@ -56,7 +57,7 @@ public sealed class Startup : NetAdmin.Host.Startup
.AddJwt() // 添加 Jwt 授权处理器 .AddJwt() // 添加 Jwt 授权处理器
.AddSnowflake() // 添加雪花编号生成器 .AddSnowflake() // 添加雪花编号生成器
.AddEventBus() // 添加事件总线 .AddEventBus() // 添加事件总线
.AddFreeSql() // 添加 freeSql .AddFreeSqlWithArgs() // 添加 freeSql
.AddRemoteRequest() // 添加远程请求 .AddRemoteRequest() // 添加远程请求
.AddCorsAccessor() // 添加支持跨域访问 .AddCorsAccessor() // 添加支持跨域访问
.AddContextUser() // 添加上下文用户 .AddContextUser() // 添加上下文用户
@ -68,4 +69,29 @@ public sealed class Startup : NetAdmin.Host.Startup
.AddDefaultApiResultHandler() // 添加默认的API结果处理程序 .AddDefaultApiResultHandler() // 添加默认的API结果处理程序
; ;
} }
/// <inheritdoc />
#pragma warning disable ASA001
public Task<int> Execute(CommandContext context, CommandLineArgs settings)
#pragma warning restore ASA001
{
Args = settings;
_ = Serve.Run(RunOptions.Default.WithArgs(context.Remaining.Raw.ToArray()));
return Task.FromResult(0);
}
/// <inheritdoc />
#pragma warning disable ASA001
public Task<int> Execute(CommandContext context, CommandSettings settings)
#pragma warning restore ASA001
{
return Execute(context, (settings as CommandLineArgs)!);
}
/// <inheritdoc />
public ValidationResult Validate(CommandContext context, CommandSettings settings)
{
return ValidationResult.Success();
}
}
} }

View File

@ -5,7 +5,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="IGeekFan.AspNetCore.Knife4jUI.NS" Condition="'$(Configuration)' == 'Debug'" Version="0.0.15-ns2"/> <PackageReference Include="IGeekFan.AspNetCore.Knife4jUI.NS" Condition="'$(Configuration)' == 'Debug'" Version="0.0.15-ns2"/>
<PackageReference Include="Spectre.Console.NS" Version="0.45.1-preview.0.124"/> <PackageReference Include="Spectre.Console.Cli.NS" Version="0.45.1-preview.0.124"/>
<PackageReference Include="prometheus-net.AspNetCore" Condition="'$(Configuration)' != 'Debug'" Version="8.1.0"/> <PackageReference Include="prometheus-net.AspNetCore" Condition="'$(Configuration)' != 'Debug'" Version="8.1.0"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,4 +1,5 @@
using Spectre.Console; using Spectre.Console;
using Spectre.Console.Cli;
namespace NetAdmin.Host; namespace NetAdmin.Host;
@ -7,6 +8,21 @@ namespace NetAdmin.Host;
/// </summary> /// </summary>
public abstract class Startup : AppStartup public abstract class Startup : AppStartup
{ {
/// <summary>
/// 程序入口
/// </summary>
public static void Entry<T>(IEnumerable<string> args, Action<IConfigurator> commandConfig = null)
where T : class, ICommand
{
ShowBanner();
var app = new CommandApp<T>();
if (commandConfig != null) {
app.Configure(commandConfig);
}
_ = app.Run(args);
}
/// <summary> /// <summary>
/// 打印Banner /// 打印Banner
/// </summary> /// </summary>