using Autofac; using Autofac.Extensions.DependencyInjection; using MiAssessment.Api.Filters; using MiAssessment.Core.Mappings; using MiAssessment.Infrastructure.Cache; using MiAssessment.Infrastructure.Modules; using MiAssessment.Model.Data; using MiAssessment.Model.Models.Auth; using MiAssessment.Model.Models.Payment; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Scalar.AspNetCore; using Serilog; using System.Text; // 设置控制台输出编码为 UTF-8,解决中文乱码 Console.OutputEncoding = Encoding.UTF8; Console.InputEncoding = Encoding.UTF8; // 配置 Serilog Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(new ConfigurationBuilder() .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true) .Build()) .CreateLogger(); try { Log.Information("Starting MiAssessment API..."); var builder = WebApplication.CreateBuilder(args); // 使用 Serilog builder.Host.UseSerilog(); // 使用 Autofac 作为依赖注入容器 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Host.ConfigureContainer(containerBuilder => { // 注册基础设施模块 containerBuilder.RegisterModule(); // 注册服务模块 containerBuilder.RegisterModule(); }); // 配置 DbContext(业务库) builder.Services.AddDbContext(options => { options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }); // 配置 AdminConfigReadDbContext(Admin库,只读,用于读取运营配置) builder.Services.AddDbContext(options => { options.UseSqlServer(builder.Configuration.GetConnectionString("AdminConnection")); }); // 配置 JWT 设置 var jwtSettings = new JwtSettings(); builder.Configuration.GetSection("JwtSettings").Bind(jwtSettings); builder.Services.AddSingleton(jwtSettings); // 配置高德地图设置 var amapSettings = new AmapSettings(); builder.Configuration.GetSection("AmapSettings").Bind(amapSettings); builder.Services.AddSingleton(amapSettings); // 配置应用程序设置(测试环境等) var appSettings = new AppSettings(); builder.Configuration.GetSection("AppSettings").Bind(appSettings); builder.Services.AddSingleton(appSettings); // 配置微信支付设置 builder.Services.Configure(builder.Configuration.GetSection("WechatPaySettings")); // 注册 HttpClient 用于微信服务 builder.Services.AddHttpClient(); // 配置 JWT 认证 var key = Encoding.ASCII.GetBytes(jwtSettings.Secret); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = true, ValidIssuer = jwtSettings.Issuer, ValidateAudience = true, ValidAudience = jwtSettings.Audience, ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; }); // 配置 Mapster builder.Services.AddMapsterConfiguration(); // 注册 Redis 缓存服务(通过 Autofac 模块注册,这里添加 IConfiguration) builder.Services.AddSingleton(sp => new RedisCacheService(builder.Configuration)); // 添加控制器 builder.Services.AddControllers(options => { // 添加全局异常过滤器 options.Filters.Add(); }) .AddJsonOptions(options => { // 允许中文直接输出,不转义为 \uXXXX options.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping; }); // 配置 OpenAPI(.NET 10 内置支持) builder.Services.AddOpenApi(options => { // 添加文档信息 options.AddDocumentTransformer((document, context, ct) => { document.Info.Title = "学业邑规划 API"; document.Info.Version = "v1"; document.Info.Description = "学业邑规划小程序API - 提供用户认证、测评管理、订单处理、分销系统等功能\n\n" + "## 认证说明\n" + "大部分接口需要JWT认证,请在请求头中添加:\n" + "`Authorization: Bearer `\n\n" + "## 响应格式\n" + "所有接口返回统一格式:\n" + "```json\n" + "{\n" + " \"code\": 0, // 0=成功, 非0=错误, 401=未登录\n" + " \"message\": \"success\",\n" + " \"data\": {}\n" + "}\n" + "```"; return Task.CompletedTask; }); }); // 配置 CORS(仅开发环境,生产环境由 Nginx 处理) builder.Services.AddCors(options => { options.AddPolicy("Development", policy => { policy.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); var app = builder.Build(); // 使用 OpenAPI 和 Scalar UI app.MapOpenApi(); app.MapScalarApiReference(options => { options.WithTitle("学业邑规划 API"); options.WithDefaultHttpClient(ScalarTarget.CSharp, ScalarClient.HttpClient); }); // 添加根路径重定向到 Scalar 文档 app.MapGet("/", () => Results.Redirect("/scalar/v1")); // 配置 HTTP 请求管道 if (app.Environment.IsDevelopment()) { // 仅开发环境启用 CORS,生产环境由 Nginx 配置 app.UseCors("Development"); } // 使用 Serilog 请求日志 app.UseSerilogRequestLogging(); // 使用路由 app.UseRouting(); // 使用认证和授权 app.UseAuthentication(); app.UseAuthorization(); // 映射控制器 app.MapControllers(); Log.Information("MiAssessment API started successfully"); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "Application terminated unexpectedly"); } finally { Log.CloseAndFlush(); }