feat: 初始化后台管理模块与基础业务框架
1. 新增依赖注入生命周期标记接口、基础仓储与管理员仓储实现 2. 新增管理员认证与用户服务接口,补充认证相关DTO 3. 重构实体审计字段命名,统一Created/UpdatedAt规范 4. 新增大量业务实体类与API版本枚举配置 5. 集成Autofac依赖注入、JWT自动刷新与跨域配置 6. 替换原有微信小程序与旧认证服务为后台管理系统架构 7. 完善Swagger文档配置与项目基础部署配置
This commit is contained in:
@ -1,38 +1,98 @@
|
||||
using Autofac;
|
||||
using Autofac.Extensions.DependencyInjection;
|
||||
using BCrypt.Net;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.OpenApi;
|
||||
using QYZH.InteractiveMagazine.Common.Extensions;
|
||||
using QYZH.InteractiveMagazine.Infrastructure.Extensions;
|
||||
using QYZH.InteractiveMagazine.Infrastructure.Middleware;
|
||||
using QYZH.InteractiveMagazine.Models.Entity;
|
||||
using QYZH.InteractiveMagazine.Models.Enum;
|
||||
using QYZH.InteractiveMagazine.Repository;
|
||||
using Serilog;
|
||||
using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
using Swashbuckle.AspNetCore.SwaggerUI;
|
||||
using QYZH.InteractiveMagazine.Infrastructure.Autofacs;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// autofac注入 允许使用autofac作为DI容器
|
||||
builder.UseAutofac();
|
||||
|
||||
// 配置Serilog
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.ReadFrom.Configuration(builder.Configuration)
|
||||
.Enrich.FromLogContext()
|
||||
.WriteTo.Console()
|
||||
.CreateLogger();
|
||||
|
||||
builder.Host.UseSerilog();
|
||||
|
||||
// 注册服务
|
||||
builder.Services.AddControllers();
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
// 基础设施服务注册(JWT、Redis、RabbitMQ)
|
||||
// 跨域配置
|
||||
builder.AddCorsRegister();
|
||||
|
||||
// 注册 Swagger 文档
|
||||
builder.Services.AddSwaggerGen(option =>
|
||||
{
|
||||
var xmlFile = $"{AppDomain.CurrentDomain.FriendlyName}.xml";
|
||||
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
|
||||
var modelXml = Path.Combine(AppContext.BaseDirectory, $"QYZH.InteractiveMagazine.Models.xml");
|
||||
|
||||
|
||||
Enum.GetValues<ApiVersionEnum>().ToList().ForEach(version =>
|
||||
{
|
||||
// 配置文档信息
|
||||
option.SwaggerDoc(version.ToString(), new OpenApiInfo
|
||||
{
|
||||
Title = AppDomain.CurrentDomain.FriendlyName,
|
||||
Version = "互动期刊接口文档",
|
||||
Description = $"{version.GetDescription()}接口,Last Modify Time:{new FileInfo(xmlPath).LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")}"
|
||||
});
|
||||
});
|
||||
// 配置接口路径排序
|
||||
option.OrderActionsBy(o => o.RelativePath);
|
||||
|
||||
if (File.Exists(xmlPath))
|
||||
option.IncludeXmlComments(xmlPath, true);
|
||||
if (File.Exists(modelXml))
|
||||
option.IncludeXmlComments(modelXml, true);
|
||||
|
||||
option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
|
||||
{
|
||||
Description = "请输入 Token,格式为 Bearer Token",
|
||||
Name = "Authorization",
|
||||
In = ParameterLocation.Header,
|
||||
Type = SecuritySchemeType.ApiKey,
|
||||
BearerFormat = "JWT",
|
||||
Scheme = "Bearer"
|
||||
});
|
||||
|
||||
|
||||
// 过滤文档/路径/方法筛选接口的响应结果
|
||||
option.DocInclusionPredicate((docName, apiDesc) =>
|
||||
{
|
||||
// 方式 1:将接口的 [ApiExplorerSettings(GroupName = "xxx")] 特性匹配
|
||||
if (!apiDesc.TryGetMethodInfo(out var methodInfo)) return false;
|
||||
var groupName = methodInfo.DeclaringType?
|
||||
.GetCustomAttributes(true)
|
||||
.OfType<ApiExplorerSettingsAttribute>()
|
||||
.FirstOrDefault()?
|
||||
.GroupName;
|
||||
|
||||
// 匹配当前文档(分组)则显示
|
||||
return groupName == docName;
|
||||
});
|
||||
});
|
||||
|
||||
builder.Services.AddInfrastructureServices(builder.Configuration);
|
||||
|
||||
// 注册中间件
|
||||
builder.Services.AddTransient<GlobalExceptionMiddleware>();
|
||||
builder.Services.AddTransient<OperationLogMiddleware>();
|
||||
|
||||
// 注册业务服务
|
||||
builder.Services.AddScoped<QYZH.InteractiveMagazine.IService.IAuthService, QYZH.InteractiveMagazine.Service.AuthService>();
|
||||
builder.Services.AddScoped<QYZH.InteractiveMagazine.IService.IWeChatMiniProgramService, QYZH.InteractiveMagazine.Service.WeChatMiniProgramService>();
|
||||
|
||||
// 初始化SqlSugar
|
||||
SqlSugarDbContext.Init(builder.Configuration);
|
||||
|
||||
|
||||
// 添加CORS
|
||||
builder.Services.AddCors(options =>
|
||||
{
|
||||
@ -46,19 +106,27 @@ builder.Services.AddCors(options =>
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// 配置HTTP请求管道
|
||||
if (app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI();
|
||||
app.UseSwaggerUI(c =>
|
||||
{
|
||||
// 根据版本名称倒序 遍历展示
|
||||
Enum.GetValues<ApiVersionEnum>().OrderBy(e => e).ToList().ForEach(version =>
|
||||
{
|
||||
c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"{version.GetDescription()}接口");
|
||||
});
|
||||
c.DocExpansion(DocExpansion.None); // ->修改界面打开时自动折叠
|
||||
});
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
app.UseCors("AllowAll");
|
||||
app.UseMiddleware<GlobalExceptionMiddleware>();
|
||||
app.UseMiddleware<OperationLogMiddleware>();
|
||||
app.UseMiddleware<JwtAutoRefreshMiddleware>();
|
||||
app.UseAuthentication();
|
||||
app.UseAuthorization();
|
||||
app.MapControllers();
|
||||
|
||||
app.Run();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user