Przeglądaj źródła

细节优化,增加es对接等

zuohuaijun 3 lat temu
rodzic
commit
10c9aa37e1

+ 2 - 2
Admin.NET/Admin.NET.Application/Service/JobTimer.cs

@@ -21,8 +21,8 @@ public class JobTimer : ISpareTimeWorker
 
         Scoped.Create((_, scope) =>
         {
-            var services = scope.ServiceProvider;
-            var db = services.GetService<ISqlSugarClient>();
+            //var services = scope.ServiceProvider;
+            //var db = services.GetService<ISqlSugarClient>();
 
             // 写日志文件
             Log.Information("【定时器】" + DateTime.Now + "执行次数:" + count);

+ 12 - 0
Admin.NET/Admin.NET.Application/Service/TestService.cs

@@ -1,5 +1,6 @@
 using Admin.NET.Application.Const;
 using Furion.DatabaseAccessor;
+using Furion.FriendlyException;
 using Furion.Localization;
 using Furion.Logging.Extensions;
 using Microsoft.AspNetCore.Authorization;
@@ -38,6 +39,17 @@ public class TestService : IDynamicApiController, ITransient
         return await _testRep.GetListAsync();
     }
 
+    /// <summary>
+    /// 异常测试
+    /// </summary>
+    /// <returns></returns>
+    public void TestException()
+    {
+        throw new Exception("异常");
+
+        throw Oops.Oh("异常").WithData("数据");
+    }
+
     /// <summary>
     /// 事务和工作单元测试
     /// </summary>

+ 8 - 7
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -24,22 +24,23 @@
 
   <ItemGroup>
     <PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" />
-    <PackageReference Include="Caching.CSRedis" Version="3.8.3" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.3.9" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.3.9" />
-    <PackageReference Include="Furion.Pure" Version="4.3.9" />
+    <PackageReference Include="Caching.CSRedis" Version="3.8.668" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.4.0" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.4.0" />
+    <PackageReference Include="Furion.Pure" Version="4.4.0" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.6.4" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.6.4" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.8" />
+    <PackageReference Include="NEST" Version="7.17.4" />
     <PackageReference Include="NETCore.MailKit" Version="2.1.0" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.8" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.16.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.12.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.2.6" />
-    <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.19" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.2.7" />
+    <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.20" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
-    <PackageReference Include="Masuit.Tools.Core" Version="2.5.4" />
+    <PackageReference Include="Masuit.Tools.Core" Version="2.5.4.3" />
   </ItemGroup>
 
   <ItemGroup>

+ 47 - 2
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -3078,11 +3078,21 @@
             清理在线用户定时器---服务启动时自动清空在线用户,防止存在僵尸用户(掉线用户会自动重连)
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.DbLoggingWriter">
+        <member name="T:Admin.NET.Core.DatabaseLoggingWriter">
             <summary>
             数据库日志写入器
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.ElasticSearchLoggingWriter">
+            <summary>
+            ES日志写入器
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.ElasticSearchSetup">
+            <summary>
+            ES服务注册
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.CacheOptions">
             <summary>
             缓存配置选项
@@ -3133,6 +3143,21 @@
             数据库配置集合
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.ElasticSearchOptions">
+            <summary>
+            ElasticSearch配置选项
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.ElasticSearchOptions.ServerUris">
+            <summary>
+            ES地址集合
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.ElasticSearchOptions.DefaultIndex">
+            <summary>
+            默认索引
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.EmailOptions">
             <summary>
             邮件配置选项
@@ -3143,6 +3168,26 @@
             接收人邮箱
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.OAuthOptions">
+            <summary>
+            第三方登录授权配置选项
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.OAuthOptions.Weixin">
+            <summary>
+            微信配置
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.OAuthOptionItem.ClientId">
+            <summary>
+            ClientId
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.OAuthOptionItem.ClientSecret">
+            <summary>
+            ClientSecret
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.OSSProviderOptions">
             <summary>
             对象存储配置选项
@@ -7252,7 +7297,7 @@
             </summary>
             <typeparam name="T"></typeparam>
         </member>
-        <member name="M:Admin.NET.Core.SqlSugarSetup.AddSqlSugarSetup(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
+        <member name="M:Admin.NET.Core.SqlSugarSetup.AddSqlSugar(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
             <summary>
             Sqlsugar 上下文初始化
             </summary>

+ 12 - 1
Admin.NET/Admin.NET.Core/AdminNETConfig.json

@@ -48,7 +48,8 @@
     },
     "FriendlyExceptionSettings": {
         "DefaultErrorMessage": "系统异常,请联系管理员",
-        "ThrowBah": true
+        "ThrowBah": true,
+        "LogError": false // 是否输出异常日志,默认true
     },
     "LocalizationSettings": {
         "SupportedCultures": [ "zh-CN", "en-US" ], // 语言列表
@@ -106,5 +107,15 @@
         "Account": "", // 发件邮箱账号
         "Password": "", // 发件邮箱密码
         "Security": true // 启用SSL和TLS
+    },
+    "OAuth": {
+        "Weixin": {
+            "ClientId": "wxd77174ddc828b65b",
+            "ClientSecret": "6224502b24d31acf8b4e0dc8e482317c"
+        }
+    },
+    "ElasticSearch": {
+        "ServerUris": [ "http://dilon:123456@192.168.1.100:9200" ],
+        "DefaultIndex": "adminnet"
     }
 }

+ 6 - 6
Admin.NET/Admin.NET.Core/Logging/DbLoggingWriter.cs → Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs

@@ -3,12 +3,12 @@
 /// <summary>
 /// 数据库日志写入器
 /// </summary>
-public class DbLoggingWriter : IDatabaseLoggingWriter
+public class DatabaseLoggingWriter : IDatabaseLoggingWriter
 {
     private readonly SqlSugarRepository<SysLogOp> _sysLogOpRep; // 操作日志
     private readonly SqlSugarRepository<SysLogEx> _sysLogExRep; // 异常日志
 
-    public DbLoggingWriter(SqlSugarRepository<SysLogOp> sysLogOpRep,
+    public DatabaseLoggingWriter(SqlSugarRepository<SysLogOp> sysLogOpRep,
         SqlSugarRepository<SysLogEx> sysLogExRep)
     {
         _sysLogOpRep = sysLogOpRep;
@@ -23,9 +23,9 @@ public class DbLoggingWriter : IDatabaseLoggingWriter
             {
                 LogName = logMsg.LogName,
                 LogLevel = logMsg.LogLevel.ToString(),
-                EventId = JSON.Serialize(logMsg.EventId),
+                EventId = logMsg.EventId.Id.ToString(),
                 Message = logMsg.Message,
-                Exception = logMsg.Exception == null ? "" : JSON.Serialize(logMsg.Exception),
+                Exception = logMsg.Exception?.ToString(),
             });
         }
         else
@@ -34,9 +34,9 @@ public class DbLoggingWriter : IDatabaseLoggingWriter
             {
                 LogName = logMsg.LogName,
                 LogLevel = logMsg.LogLevel.ToString(),
-                EventId = JSON.Serialize(logMsg.EventId),
+                EventId = logMsg.EventId.Id.ToString(),
                 Message = logMsg.Message,
-                Exception = logMsg.Exception == null ? "" : JSON.Serialize(logMsg.Exception),
+                Exception = logMsg.Exception?.ToString(),
             });
         }
     }

+ 21 - 0
Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs

@@ -0,0 +1,21 @@
+using Nest;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// ES日志写入器
+/// </summary>
+public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter
+{
+    private readonly ElasticClient _esClient;
+
+    public ElasticSearchLoggingWriter(ElasticClient esClient)
+    {
+        _esClient = esClient;
+    }
+
+    public void Write(LogMessage logMsg, bool flush)
+    {
+        _esClient.IndexDocument(JSON.Serialize(logMsg));
+    }
+}

+ 22 - 0
Admin.NET/Admin.NET.Core/Logging/ElasticSearchSetup.cs

@@ -0,0 +1,22 @@
+using Elasticsearch.Net;
+using Nest;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// ES服务注册
+/// </summary>
+public static class ElasticSearchSetup
+{
+    public static void AddElasticSearch(this IServiceCollection services)
+    {
+        var elkOptions = App.GetOptions<ElasticSearchOptions>();
+
+        var uris = elkOptions.ServerUris.Select(u => new Uri(u));
+        var connectionPool = new SniffingConnectionPool(uris);
+        var settings = new ConnectionSettings(connectionPool).DefaultIndex(elkOptions.DefaultIndex);
+        var client = new ElasticClient(settings);
+
+        services.AddSingleton(client); // 单例注册
+    }
+}

+ 17 - 0
Admin.NET/Admin.NET.Core/Option/ElasticSearchOptions.cs

@@ -0,0 +1,17 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// ElasticSearch配置选项
+/// </summary>
+public sealed class ElasticSearchOptions : IConfigurableOptions
+{
+    /// <summary>
+    /// ES地址集合
+    /// </summary>
+    public List<string> ServerUris { get; set; }
+
+    /// <summary>
+    /// 默认索引
+    /// </summary>
+    public string DefaultIndex { get; set; }
+}

+ 25 - 0
Admin.NET/Admin.NET.Core/Option/OAuthOptions.cs

@@ -0,0 +1,25 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 第三方登录授权配置选项
+/// </summary>
+public sealed class OAuthOptions : IConfigurableOptions
+{
+    /// <summary>
+    /// 微信配置
+    /// </summary>
+    public OAuthOptionItem Weixin { get; set; }
+}
+
+public class OAuthOptionItem
+{
+    /// <summary>
+    /// ClientId
+    /// </summary>
+    public string ClientId { get; set; }
+
+    /// <summary>
+    /// ClientSecret
+    /// </summary>
+    public string ClientSecret { get; set; }
+}

+ 7 - 6
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -74,12 +74,12 @@ public class SysAuthService : IDynamicApiController, ITransient
 
         // 生成刷新Token令牌
         var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, _refreshTokenOptions.ExpiredTime);
-        // 设置刷新Token令牌
+
+        // 设置响应报文头
+        _httpContextAccessor.HttpContext.Response.Headers["access-token"] = accessToken;
         _httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = refreshToken;
 
-        // 登录Swagger
-        _httpContextAccessor.HttpContext.SigninToSwagger(accessToken);
-        // Knife4UI-AfterScript登录脚本
+        // Swagger Knife4UI-AfterScript登录脚本
         // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']);
 
         return new LoginOutput
@@ -159,8 +159,9 @@ public class SysAuthService : IDynamicApiController, ITransient
         if (user == null)
             throw Oops.Oh(ErrorCodeEnum.D1011);
 
-        // 退出Swagger
-        _httpContextAccessor.HttpContext.SignoutToSwagger();
+        // 设置响应报文头
+        _httpContextAccessor.HttpContext.Response.Headers["access-token"] = "invalid_token";
+        _httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = "invalid_token";
 
         // 退出日志
         await _eventPublisher.PublishAsync("Add:VisLog", new SysLogVis

+ 1 - 1
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -8,7 +8,7 @@ public static class SqlSugarSetup
     /// Sqlsugar 上下文初始化
     /// </summary>
     /// <param name="services"></param>
-    public static void AddSqlSugarSetup(this IServiceCollection services)
+    public static void AddSqlSugar(this IServiceCollection services)
     {
         var dbOptions = App.GetOptions<DbConnectionOptions>();
         var configureExternalServices = new ConfigureExternalServices

+ 1 - 1
Admin.NET/Admin.NET.UnitTest/Admin.NET.UnitTest.csproj

@@ -8,7 +8,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Furion.Pure.Xunit" Version="4.3.9" />
+    <PackageReference Include="Furion.Pure.Xunit" Version="4.4.0" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.8" />
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
     <PackageReference Include="xunit" Version="2.4.2" />

+ 1 - 0
Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj

@@ -11,6 +11,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <PackageReference Include="AspNet.Security.OAuth.Weixin" Version="6.0.11" />
     <PackageReference Include="IGeekFan.AspNetCore.Knife4jUI" Version="0.0.12" />
   </ItemGroup>
 

+ 2 - 0
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -25,6 +25,8 @@ public static class ProjectOptions
         services.AddConfigurableOptions<PayCallBackOptions>();
         services.AddConfigurableOptions<CodeGenOptions>();
         services.AddConfigurableOptions<EmailOptions>();
+        services.AddConfigurableOptions<OAuthOptions>();
+        services.AddConfigurableOptions<ElasticSearchOptions>();
         //services.AddConfigurableOptions<IpRateLimitingOptions>();
         //services.AddConfigurableOptions<IpRateLimitPoliciesOptions>();
         //services.AddConfigurableOptions<ClientRateLimitingOptions>();

+ 37 - 2
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -1,6 +1,7 @@
 using Admin.NET.Core;
 using AspNetCoreRateLimit;
 using Furion;
+using Furion.Logging;
 using Furion.SpecificationDocument;
 using IGeekFan.AspNetCore.Knife4jUI;
 using Microsoft.AspNetCore.Builder;
@@ -14,6 +15,7 @@ using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using OnceMi.AspNetCore.OSS;
 using System;
+using System.IO;
 using Yitter.IdGenerator;
 
 namespace Admin.NET.Web.Core;
@@ -25,7 +27,7 @@ public class Startup : AppStartup
         // 配置选项
         services.AddProjectOptions();
         // SqlSugar
-        services.AddSqlSugarSetup();
+        services.AddSqlSugar();
         // JWT
         services.AddJwt<JwtHandler>(enableGlobalAuthorize: true);
         // 允许跨域
@@ -40,6 +42,16 @@ public class Startup : AppStartup
         services.AddMvcFilter<ResultFilter>();
         // 日志监听
         services.AddMonitorLogging();
+        // 第三方授权登录
+        services.AddAuthentication()
+            .AddWeixin(options =>
+            {
+                var opt = App.GetOptions<OAuthOptions>();
+                options.ClientId = opt.Weixin.ClientId;
+                options.ClientSecret = opt.Weixin.ClientSecret;
+            });
+        // ElasticSearch
+        services.AddElasticSearch();
 
         services.AddControllersWithViews()
             .AddAppLocalization()
@@ -115,13 +127,36 @@ public class Startup : AppStartup
                 options.WriteFilter = logMsg => logMsg.LogLevel == logLevel; // 日志级别
                 options.FileSizeLimitBytes = 10 * 1024 * 1024; // 每个文件10M
                 options.MaxRollingFiles = 30; // 只保留30个文件
+                // 输出Json格式,对接阿里云日志、Elastaicsearch第三方日志
+                options.MessageFormat = (logMsg) =>
+                {
+                    return logMsg.WriteArray(writer =>
+                    {
+                        writer.WriteStringValue(DateTime.Now.ToString("o"));
+                        writer.WriteStringValue(logMsg.LogLevel.ToString());
+                        writer.WriteStringValue(logMsg.LogName);
+                        writer.WriteNumberValue(logMsg.EventId.Id);
+                        writer.WriteStringValue(logMsg.Message);
+                        writer.WriteStringValue(logMsg.Exception?.ToString());
+                    });
+                };
+                // 写入失败时启用备用文件
+                options.HandleWriteError = (writeError) =>
+                {
+                    writeError.UseRollbackFileName(Path.GetFileNameWithoutExtension(writeError.CurrentFileName) + "-oops" + Path.GetExtension(writeError.CurrentFileName));
+                };
             });
         });
         // 日志写入数据库
-        services.AddDatabaseLogging<DbLoggingWriter>(options =>
+        services.AddDatabaseLogging<DatabaseLoggingWriter>(options =>
         {
             options.MinimumLevel = LogLevel.Information;
         });
+        //// 日志写入ElasticSearch
+        //services.AddDatabaseLogging<ESLoggingWriter>(options =>
+        //{
+        //    options.MinimumLevel = LogLevel.Information;
+        //});
 
         // 设置雪花Id算法机器码
         YitIdHelper.SetIdGenerator(new IdGeneratorOptions