mirror of
https://github.com/nsnail/NetAdmin.git
synced 2025-04-22 22:22:51 +08:00
feat: ✨ 将数据库结构同步和种子数据初始化作为命令行开关 (#78)
This commit is contained in:
parent
22628e79ca
commit
05ed3d3746
@ -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
|
||||
ENTRYPOINT redis-server --daemonize yes && dotnet NetAdmin.BizServer.Host.dll -is
|
@ -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)界面
|
||||
|
21
src/backend/NetAdmin.BizServer.Host/CommandLineArgs.cs
Normal file
21
src/backend/NetAdmin.BizServer.Host/CommandLineArgs.cs
Normal 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; }
|
||||
}
|
@ -15,10 +15,11 @@ public static class ServiceCollectionExtensions
|
||||
/// <summary>
|
||||
/// 添加 FreeSql
|
||||
/// </summary>
|
||||
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<IFieldOwner>( //
|
||||
Chars.FLG_GLOBAL_FILTER_DATA
|
||||
|
@ -10,6 +10,14 @@
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"InitDB": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"commandLineArgs": "-is",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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<Startup>(args);
|
||||
|
||||
/// <summary>
|
||||
/// 启动类
|
||||
/// </summary>
|
||||
public sealed class Startup : NetAdmin.Host.Startup
|
||||
namespace NetAdmin.BizServer.Host
|
||||
{
|
||||
/// <summary>
|
||||
/// 程序入口
|
||||
/// 启动类
|
||||
/// </summary>
|
||||
public static void Main(string[] args)
|
||||
public sealed class Startup : NetAdmin.Host.Startup, ICommand<CommandLineArgs>
|
||||
{
|
||||
ShowBanner();
|
||||
_ = Serve.Run(RunOptions.Default.WithArgs(args));
|
||||
}
|
||||
/// <summary>
|
||||
/// 命令行参数
|
||||
/// </summary>
|
||||
public static CommandLineArgs Args { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 配置应用程序中间件
|
||||
/// </summary>
|
||||
public void Configure(IApplicationBuilder app)
|
||||
{
|
||||
_ = app //
|
||||
.UseRealIp() // 使用RealIp中间件,用于获取真实客户端IP地址
|
||||
.EnableBuffering() // 启用请求体缓冲,允许多次读取请求体
|
||||
.UseMiddleware<RequestAuditMiddleware>() // 使用RequestAuditMiddleware中间件,执行请求审计
|
||||
#if DEBUG
|
||||
.UseOpenApiSkin() // 使用OpenApiSkin中间件(仅在调试模式下),提供Swagger UI皮肤
|
||||
#else
|
||||
/// <summary>
|
||||
/// 配置应用程序中间件
|
||||
/// </summary>
|
||||
public void Configure(IApplicationBuilder app)
|
||||
{
|
||||
_ = app //
|
||||
.UseRealIp() // 使用RealIp中间件,用于获取真实客户端IP地址
|
||||
.EnableBuffering() // 启用请求体缓冲,允许多次读取请求体
|
||||
.UseMiddleware<RequestAuditMiddleware>() // 使用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>() // 使用RemoveNullNodeMiddleware中间件,删除JSON中的空节点
|
||||
.UseEndpoints(); // 配置端点以处理请求
|
||||
}
|
||||
#endif
|
||||
.UseInject(string.Empty) // 使用Inject中间件,Furion脚手架的依赖注入支持
|
||||
.UseUnifyResultStatusCodes() // 使用UnifyResultStatusCodes中间件,用于统一处理结果状态码
|
||||
.UseCorsAccessor() // 使用CorsAccessor中间件,启用跨域资源共享(CORS)支持
|
||||
.UseRouting() // 使用Routing中间件,配置路由映射
|
||||
.UseAuthentication() // 使用Authentication中间件,启用身份验证
|
||||
.UseAuthorization() // 使用Authorization中间件,启用授权
|
||||
.UseMiddleware<RemoveNullNodeMiddleware>() // 使用RemoveNullNodeMiddleware中间件,删除JSON中的空节点
|
||||
.UseEndpoints(); // 配置端点以处理请求
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置服务容器
|
||||
/// </summary>
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
{
|
||||
_ = services.AddConsoleFormatter() // 添加控制台日志模板
|
||||
.AddAllOptions() // 添加配置项
|
||||
.AddJwt() // 添加 Jwt 授权处理器
|
||||
.AddSnowflake() // 添加雪花编号生成器
|
||||
.AddEventBus() // 添加事件总线
|
||||
.AddFreeSql() // 添加 freeSql
|
||||
.AddRemoteRequest() // 添加远程请求
|
||||
.AddCorsAccessor() // 添加支持跨域访问
|
||||
.AddContextUser() // 添加上下文用户
|
||||
.AddRedisCache() // 添加 Redis 缓存
|
||||
/// <summary>
|
||||
/// 配置服务容器
|
||||
/// </summary>
|
||||
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结果处理程序
|
||||
;
|
||||
}
|
||||
|
||||
/// <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();
|
||||
}
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<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"/>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,4 +1,5 @@
|
||||
using Spectre.Console;
|
||||
using Spectre.Console.Cli;
|
||||
|
||||
namespace NetAdmin.Host;
|
||||
|
||||
@ -7,6 +8,21 @@ namespace NetAdmin.Host;
|
||||
/// </summary>
|
||||
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>
|
||||
/// 打印Banner
|
||||
/// </summary>
|
||||
|
Loading…
x
Reference in New Issue
Block a user