mi-assessment/server/MiAssessment/src/MiAssessment.Api/Program.cs
2026-02-04 18:47:50 +08:00

194 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
// 配置 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 =>
{
// 注册基础设施模块
containerBuilder.RegisterModule<InfrastructureModule>();
// 注册服务模块
containerBuilder.RegisterModule<ServiceModule>();
});
// 配置 DbContext
builder.Services.AddDbContext<MiAssessmentDbContext>(options =>
{
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});
// 配置 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<WechatPaySettings>(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<ICacheService>(sp =>
new RedisCacheService(builder.Configuration));
// 添加控制器
builder.Services.AddControllers(options =>
{
// 添加全局异常过滤器
options.Filters.Add<GlobalExceptionFilter>();
});
// 配置 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 <your_token>`\n\n" +
"## 响应格式\n" +
"所有接口返回统一格式:\n" +
"```json\n" +
"{\n" +
" \"status\": 1, // 1=成功, 0=失败, -1=未登录\n" +
" \"msg\": \"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();
}