TheRegister.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using AI.Platform.Page.Common;
  2. using AI.Platform.Service.Common;
  3. using AI.Platform.Core;
  4. using AI.Platform.Core.Util;
  5. using AI.Platform.Web.Components;
  6. using Microsoft.AspNetCore.Authentication.Cookies;
  7. using Microsoft.AspNetCore.Components.Authorization;
  8. using Microsoft.AspNetCore.Identity;
  9. using Microsoft.AspNetCore.Mvc.ApplicationModels;
  10. using Microsoft.AspNetCore.StaticFiles;
  11. using Microsoft.OpenApi.Models;
  12. using System.Reflection;
  13. namespace AI.Platform.Web.Common;
  14. public static class TheRegister
  15. {
  16. /// <summary>
  17. /// 注册配置
  18. /// </summary>
  19. /// <param name="builder"></param>
  20. /// <returns></returns>
  21. public static WebApplicationBuilder? RegistService(this WebApplicationBuilder? builder)
  22. {
  23. var configuration = builder.Configuration;
  24. // Add services to the container.
  25. builder.Services.AddRazorComponents()
  26. .AddInteractiveServerComponents();
  27. builder.Services.AddConfiguration();
  28. builder.Services.AddLocalLog();
  29. builder.Services.AddSqlSugar();
  30. builder.Services.AddRedis();
  31. builder.Services.AddAntDesign();
  32. builder.Services.AddInteractiveStringLocalizer();
  33. builder.Services.AddLocalization();
  34. builder.Services.AddHttpContextAccessor();
  35. builder.Services.AddCors(options =>
  36. {
  37. options.AddPolicy("Policy", policy =>
  38. {
  39. policy.AllowAnyOrigin()
  40. .AllowAnyMethod()
  41. .AllowAnyHeader();
  42. });
  43. });
  44. builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  45. .AddCookie(options =>
  46. {
  47. options.LoginPath = "/account/login"; // 登录页路径
  48. options.AccessDeniedPath = "/error/404"; // 未授权页路径
  49. options.SlidingExpiration = true; // 滑动过期
  50. });
  51. builder.Services.AddRazorPages();
  52. builder.Services.AddServerSideBlazor();
  53. builder.Services.AddAuthorization();
  54. builder.Services.Configure<ProSettings>(Setting.GetSection("ThemeSettings"));
  55. Global.SystemName = Setting.Get<string>("ThemeSettings:Title");
  56. builder.Services.AddControllers().AddNewtonsoftJson();//不加该注册,api传参易报错
  57. builder.Services.AddEndpointsApiExplorer();
  58. builder.Services.AddSwaggerGen(options =>
  59. {
  60. typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
  61. {
  62. //获取枚举值上的特性
  63. var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
  64. options.SwaggerDoc(f.Name, new Microsoft.OpenApi.Models.OpenApiInfo
  65. {
  66. Title = info?.Title,
  67. Version = info?.Version,
  68. Description = info?.Description
  69. });
  70. });
  71. options.SwaggerDoc("all", new Microsoft.OpenApi.Models.OpenApiInfo
  72. {
  73. Title = "全部"
  74. });
  75. options.DocInclusionPredicate((docName, apiDescription) =>
  76. {
  77. if (docName != "all")
  78. {
  79. return apiDescription.GroupName == docName;
  80. }
  81. return true;
  82. });
  83. options.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme()
  84. {
  85. Description = "请输入正确的Token格式:Bearer token",
  86. Name = "Authorization",
  87. In = Microsoft.OpenApi.Models.ParameterLocation.Header,
  88. Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey,
  89. BearerFormat = "JWT",
  90. Scheme = "Bearer"
  91. });
  92. //options.DocInclusionPredicate((docName, description) => true);
  93. options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement() {
  94. {
  95. new OpenApiSecurityScheme
  96. {
  97. Reference = new OpenApiReference()
  98. {
  99. Type = ReferenceType.SecurityScheme,
  100. Id = "Bearer"
  101. }
  102. },
  103. new string[]{ }
  104. }
  105. });
  106. var baseDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
  107. var xmlFile = System.AppDomain.CurrentDomain.FriendlyName + ".xml";
  108. var xmlPath = Path.Combine(baseDirectory, xmlFile);
  109. options.IncludeXmlComments(xmlPath);
  110. });
  111. //将类库中razor注册到应用中
  112. builder.Services.AddAssembly();
  113. builder.Services.AddDynamicController<ServiceLocalSelectController, ServiceActionRouteFactory>();
  114. //builder.Services.AddCascadingAuthenticationState();
  115. //builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();
  116. builder.Services.AddScoped<CustomAuthenticationStateProvider>();
  117. builder.Services.AddScoped<AuthenticationStateProvider>(implementationFactory => implementationFactory.GetRequiredService<CustomAuthenticationStateProvider>());
  118. // 注册 Blazored.LocalStorage 服务
  119. builder.Services.AddBlazoredLocalStorage();
  120. builder.Services.AddSingleton<INotificationService, NotificationService>();
  121. return builder;
  122. }
  123. /// <summary>
  124. /// 注册应用
  125. /// </summary>
  126. /// <param name="builder"></param>
  127. /// <returns></returns>
  128. public static WebApplicationBuilder? RegistApp(this WebApplicationBuilder? builder)
  129. {
  130. var app = builder.Build();
  131. // Configure the HTTP request pipeline.
  132. if (!app.Environment.IsDevelopment())
  133. {
  134. app.UseExceptionHandler("/Error", createScopeForErrors: true);
  135. }
  136. app.UseStatusCodePagesWithReExecute("/error/{0}");
  137. app.UseSwagger();
  138. app.UseSwaggerUI(options =>
  139. {
  140. //遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
  141. typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
  142. {
  143. //获取枚举值上的特性
  144. var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
  145. options.SwaggerEndpoint($"/swagger/{f.Name}/swagger.json", info != null ? info.Title : f.Name);
  146. });
  147. options.SwaggerEndpoint("/swagger/all/swagger.json", "全部");
  148. });
  149. app.UseStaticFiles();
  150. app.UseCors("Policy");
  151. app.UseDynamicWebApi();
  152. app.UseHttpsRedirection();
  153. app.UseRouting();
  154. app.UseAuthentication();
  155. app.UseAuthorization();
  156. app.UseAntiforgery();
  157. app.MapRazorComponents<App>()
  158. .AddInteractiveServerRenderMode();
  159. app.MapControllers();
  160. app.Run();
  161. return builder;
  162. }
  163. private static FileExtensionContentTypeProvider GetFileExtensionContentTypeProvider()
  164. {
  165. var provider = new FileExtensionContentTypeProvider();
  166. provider.Mappings[".iec"] = "application/octet-stream";
  167. provider.Mappings[".patch"] = "application/octet-stream";
  168. provider.Mappings[".apk"] = "application/vnd.android.package-archive";
  169. provider.Mappings[".pem"] = "application/x-x509-user-cert";
  170. provider.Mappings[".gzip"] = "application/x-gzip";
  171. provider.Mappings[".7zip"] = "application/zip";
  172. provider.Mappings[".jpg2"] = "image/jp2";
  173. provider.Mappings[".et"] = "application/kset";
  174. provider.Mappings[".dps"] = "application/ksdps";
  175. provider.Mappings[".cdr"] = "application/x-coreldraw";
  176. provider.Mappings[".shtml"] = "text/html";
  177. provider.Mappings[".php"] = "application/x-httpd-php";
  178. provider.Mappings[".php3"] = "application/x-httpd-php";
  179. provider.Mappings[".php4"] = "application/x-httpd-php";
  180. provider.Mappings[".phtml"] = "application/x-httpd-php";
  181. provider.Mappings[".pcd"] = "image/x-photo-cd";
  182. provider.Mappings[".bcmap"] = "application/octet-stream";
  183. provider.Mappings[".properties"] = "application/octet-stream";
  184. provider.Mappings[".m3u8"] = "application/x-mpegURL";
  185. return provider;
  186. }
  187. }
  188. internal class ServiceLocalSelectController : ISelectController
  189. {
  190. public bool IsController(Type type)
  191. {
  192. return type.IsPublic && type.GetCustomAttribute<DynamicControllerAttribute>() != null;
  193. }
  194. }
  195. internal class ServiceActionRouteFactory : IActionRouteFactory
  196. {
  197. public string CreateActionRouteModel(string areaName, string controllerName, ActionModel action)
  198. {
  199. var controllerType = action.ActionMethod.DeclaringType;
  200. var serviceAttribute = controllerType.GetCustomAttribute<DynamicControllerAttribute>();
  201. var _controllerName = serviceAttribute.ServiceName == string.Empty ? controllerName.Replace("Service", "") : serviceAttribute.ServiceName.Replace("Service", "");
  202. return $"api/{_controllerName.Replace("Service", "")}/{action.ActionName.Replace("Async", "")}";
  203. }
  204. }