From a84de73b7dcca11ee13ea7a7021f3823b577c961 Mon Sep 17 00:00:00 2001 From: luolan <2667210109@qq.com> Date: Fri, 4 Apr 2025 12:02:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asg_form/Program.cs | 213 ++++++++++++++------------------------------ 1 file changed, 67 insertions(+), 146 deletions(-) diff --git a/asg_form/Program.cs b/asg_form/Program.cs index a6bc14c..0246bb1 100644 --- a/asg_form/Program.cs +++ b/asg_form/Program.cs @@ -9,59 +9,38 @@ using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.FileProviders; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Mirai.Net.Sessions; -using Mirai.Net.Sessions.Http.Managers; using MrHuo.OAuth; using MrHuo.OAuth.Github; using MrHuo.OAuth.Microsoft; using Scalar.AspNetCore; using System; -using System.Data; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Reflection; using System.Text; using Zack.EventBus; - - - - - - - Console.WriteLine("\n _____ _________ ________ \n / _ \\ / _____// _____/ \n / /_\\ \\ \\_____ \\/ \\ ___ \n/ | \\/ \\ \\_\\ \\\n\\____|__ /_______ /\\______ /\n \\/ \\/ \\/ \n__________ __ ___________ .___\n\\______ \\_____ ____ | | __\\_ _____/ ____ __| _/\n | | _/\\__ \\ _/ ___\\| |/ / | __)_ / \\ / __ | \n | | \\ / __ \\\\ \\___| < | \\ | \\/ /_/ | \n |______ /(____ /\\___ >__|_ \\/_______ /___| /\\____ | \n \\/ \\/ \\/ \\/ \\/ \\/ \\/ "); + var builder = WebApplication.CreateBuilder(args); -//builder.AddServiceDefaults(); - -// Add services to the container. - - +// 添加控制器服务 builder.Services.AddControllers(); -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); - -builder.Services.AddSignalR(); +// 配置Swagger/OpenAPI builder.Services.AddSwaggerGen(c => { - c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo + c.SwaggerDoc("v1", new OpenApiInfo { Title = "ASG 赛事官网-后端API文档", Version = "V 1.9.7", Description = "这是由罗澜使用ASP.NET.Core开发的ASG赛事组后端系统,包括官网和后台管理系统。使用 sqlserver作为数据库,identity框架进行账号控制。", }); var file = Path.Combine(AppContext.BaseDirectory, "ASG后端.xml"); - var path = Path.Combine(AppContext.BaseDirectory, file); - c.IncludeXmlComments(path, true); + c.IncludeXmlComments(file, true); c.OrderActionsBy(o => o.RelativePath); - var scheme = new OpenApiSecurityScheme() + var scheme = new OpenApiSecurityScheme { Description = "Authorization header. \r\nExample: 'Bearer 12345abcdef'", Reference = new OpenApiReference @@ -75,34 +54,29 @@ builder.Services.AddSwaggerGen(c => Type = SecuritySchemeType.ApiKey, }; c.AddSecurityDefinition("Authorization", scheme); - var requirement = new OpenApiSecurityRequirement(); - requirement[scheme] = new List(); - c.AddSecurityRequirement(requirement); + c.AddSecurityRequirement(new OpenApiSecurityRequirement + { + [scheme] = new List() + }); }); - - -string[] urls = new[] { "https://idvasg.cn", "https://nocdn.idvasg.cn", "http://localhost:8080", "https://commentary.idvasg.cn", "https://admin.idvasg.cn", "https://www.idvasg.cn" }; +// 配置CORS策略 builder.Services.AddCors(options => -options.AddDefaultPolicy(builder => builder.WithOrigins(urls) -.AllowAnyMethod().AllowAnyHeader().AllowCredentials())); + options.AddDefaultPolicy(policy => + policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials())); - - -IServiceCollection services = builder.Services; - - - -services.AddDbContext(opt => +// 配置数据库上下文 +builder.Services.AddDbContext(opt => { string connStr = @"Host=172.30.121.91;Port=2345;Database=postgres;Username=asg;Password=luolan12323;"; opt.UseNpgsql(connStr); }); -//services.AddHostedService(); - -services.AddDataProtection(); -services.AddIdentityCore(options => +// 配置身份验证和授权 +builder.Services.AddIdentityCore(options => { options.Password.RequireDigit = false; options.Password.RequireLowercase = false; @@ -112,115 +86,78 @@ services.AddIdentityCore(options => options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider; options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider; }); -var idBuilder = new IdentityBuilder(typeof(User), typeof(Role), services); -idBuilder.AddEntityFrameworkStores() +new IdentityBuilder(typeof(User), typeof(Role), builder.Services) + .AddEntityFrameworkStores() .AddDefaultTokenProviders() .AddRoleManager>() .AddUserManager>(); +// 配置JWT身份验证 +builder.Services.Configure(builder.Configuration.GetSection("JWT")); +builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(x => + { + var jwtOpt = builder.Configuration.GetSection("JWT").Get(); + byte[] keyBytes = Encoding.UTF8.GetBytes(jwtOpt.SigningKey); + x.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = false, + ValidateAudience = false, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(keyBytes) + }; + }); +// 配置OAuth +builder.Services.AddSingleton(new GithubOAuth(OAuthConfig.LoadFrom(builder.Configuration, "oauth:github"))); +builder.Services.AddSingleton(new MicrosoftOAuth(OAuthConfig.LoadFrom(builder.Configuration, "oauth:microsoft"))); +// 添加Application Insights +builder.Services.AddApplicationInsightsTelemetry(); - -builder.Services.AddControllers(); -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); -//add error 处理器 +// 配置全局异常处理过滤器 builder.Services.Configure(options => { options.Filters.Add(); }); - - -services.Configure(builder.Configuration.GetSection("JWT")); -services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) -.AddJwtBearer(x => -{ - var jwtOpt = builder.Configuration.GetSection("JWT").Get(); - byte[] keyBytes = Encoding.UTF8.GetBytes(jwtOpt.SigningKey); - var secKey = new SymmetricSecurityKey(keyBytes); - x.TokenValidationParameters = new() - { - ValidateIssuer = false, - ValidateAudience = false, - ValidateLifetime = true, - ValidateIssuerSigningKey = true, - IssuerSigningKey = secKey - }; -}); -services.AddSingleton(new GithubOAuth(OAuthConfig.LoadFrom(builder.Configuration, "oauth:github"))); -services.AddSingleton(new MicrosoftOAuth(OAuthConfig.LoadFrom(builder.Configuration, "oauth:microsoft"))); - -builder.Services.AddApplicationInsightsTelemetry(); - - +// 构建应用程序 var app = builder.Build(); -//app.MapDefaultEndpoints(); + +// 使用中间件 app.UseCors(); -// Configure the HTTP request pipeline. - app.UseSwagger(); -//app.UseSwaggerUI(); -app.MapScalarApiReference(options => -{ - options.WithOpenApiRoutePattern("/swagger/v1/swagger.json"); - // or - options.OpenApiRoutePattern = "/swagger/v1/swagger.json"; -}); - app.UseStaticFiles(); AppContext.SetSwitch("System.Drawing.EnableUnixSupport", true); +// 注册静态资源 +void RegisterStaticFiles(string folderName, string requestPath) +{ + string folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, folderName); + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + app.UseStaticFiles(new StaticFileOptions + { + FileProvider = new PhysicalFileProvider(folderPath), + RequestPath = requestPath + }); +} -//发布时服务器注册静态资源 -string fileUpload = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "loge"); -if (!Directory.Exists(fileUpload)) -{ Directory.CreateDirectory(fileUpload); } -app.UseStaticFiles(new StaticFileOptions -{ - FileProvider = new PhysicalFileProvider(fileUpload), - RequestPath = "/loge" -}); +RegisterStaticFiles("loge", "/loge"); +RegisterStaticFiles("video", "/video"); +RegisterStaticFiles("doc", "/doc"); +RegisterStaticFiles("excel", "/excel"); -//发布时服务器注册静态资源 -string fileUpload1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "video"); -if (!Directory.Exists(fileUpload1)) -{ Directory.CreateDirectory(fileUpload1); } -app.UseStaticFiles(new StaticFileOptions -{ - FileProvider = new PhysicalFileProvider(fileUpload1), - RequestPath = "/video" -}); -//发布时服务器注册静态资源 -string fileUpload2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "doc"); -if (!Directory.Exists(fileUpload2)) -{ Directory.CreateDirectory(fileUpload2 + "/rule"); } -app.UseStaticFiles(new StaticFileOptions -{ - FileProvider = new PhysicalFileProvider(fileUpload2), - RequestPath = "/doc" -}); -string fileUpload5 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "excel"); -if (!Directory.Exists(fileUpload5)) -{ Directory.CreateDirectory(fileUpload5); } -app.UseStaticFiles(new StaticFileOptions -{ - FileProvider = new PhysicalFileProvider(fileUpload5), - RequestPath = "/excel" -}); app.UseAuthentication(); app.UseAuthorization(); - app.MapHub("/room"); app.UseResponseCaching(); app.MapControllers(); - - - -//新开一个线程,显示当前时间 +// 启动Flandre机器人线程 new Thread(o => { try @@ -231,17 +168,10 @@ new Thread(o => ContentRootPath = AppDomain.CurrentDomain.BaseDirectory }); - - - // 安装一个适配器,并添加在这里。 - // builder.Adapters.Add(new YourAdapter()); builder1.Adapters.AddOneBot(builder1.Configuration.GetSection("Adapters:OneBot")); builder1.Plugins.Add(); var app1 = builder1.Build(); - // 添加内置中间件。 - // 这些中间件保证 Flandre 的正常运转。你也可以加入自己的中间件,并灵活调整其顺序。 app1.UseCommandSession(); - // app.UseMiddleware(async (ctx, next) => { /* ... */ }); app1.UseCommandParser(); app1.UseCommandInvoker(); runbot.runbotr = app1.Bots.First(); @@ -249,17 +179,8 @@ new Thread(o => } catch (Exception ex) { - //输出详细全部信息 - Console.WriteLine(ex.ToString()); - - } - - - - - + } }) { IsBackground = true }.Start(); - app.Run(); \ No newline at end of file