From c94500ac0cf6e7fa56eb6d4922fa61e43c2821b0 Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Fri, 14 May 2021 16:13:25 +0800 Subject: [PATCH 01/26] =?UTF-8?q?fix=EF=BC=9Aupdate=20the=20log=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LogHelper/Seri/SerilogServer.cs | 6 ++++-- Blog.Core.Extensions/Middlewares/IPLogMildd.cs | 10 +++++----- .../Middlewares/RecordAccessLogsMildd.cs | 10 ++++++---- .../Middlewares/RequRespLogMildd.cs | 18 ++++++++++-------- .../ServiceExtensions/AppConfigSetup.cs | 12 +++++++++++- 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs index 28b0092..72dad73 100644 --- a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs +++ b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs @@ -13,13 +13,15 @@ namespace Blog.Core.Common.LogHelper /// /// /// - public static void WriteLog(string filename, string[] dataParas, bool IsHeader = true) + public static void WriteLog(string filename, string[] dataParas, bool IsHeader = true, string defaultFolder = "") { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .MinimumLevel.Override("Microsoft", LogEventLevel.Error) //.WriteTo.File(Path.Combine($"log/Serilog/{filename}/", ".log"), rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}") - .WriteTo.File(Path.Combine($"log/Serilog/", $"{filename}.log"), rollingInterval: RollingInterval.Infinite, outputTemplate: "{Message}{NewLine}{Exception}") + .WriteTo.File(Path.Combine("log", defaultFolder, $"{filename}.log"), + rollingInterval: RollingInterval.Infinite, + outputTemplate: "{Message}{NewLine}{Exception}") .CreateLogger(); var now = DateTime.Now; diff --git a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs index cf8418f..b8dadba 100644 --- a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs +++ b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs @@ -51,13 +51,13 @@ namespace Blog.Core.Middlewares if (!string.IsNullOrEmpty(requestInfo)) { // 自定义log输出 - Parallel.For(0, 1, e => - { - LogLock.OutSql2Log("RequestIpInfoLog", new string[] { requestInfo + "," }, false); - }); + //Parallel.For(0, 1, e => + //{ + // LogLock.OutSql2Log("RequestIpInfoLog", new string[] { requestInfo + "," }, false); + //}); // 这种方案也行,用的是Serilog - //SerilogServer.WriteLog("RequestIpInfoLog", new string[] { requestInfo + "," }, false); + SerilogServer.WriteLog("RequestIpInfoLog", new string[] { requestInfo + "," }, false); request.Body.Position = 0; } diff --git a/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs b/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs index 3c19dcf..7180b1a 100644 --- a/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs +++ b/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs @@ -102,10 +102,12 @@ namespace Blog.Core.Middlewares // 自定义log输出 var requestInfo = JsonConvert.SerializeObject(userAccessModel); - Parallel.For(0, 1, e => - { - LogLock.OutSql2Log("RecordAccessLogs", new string[] { requestInfo + "," }, false); - }); + //Parallel.For(0, 1, e => + //{ + // LogLock.OutSql2Log("RecordAccessLogs", new string[] { requestInfo + "," }, false); + //}); + + SerilogServer.WriteLog("RecordAccessLogs", new string[] { requestInfo + "," }, false); return Task.CompletedTask; }); diff --git a/Blog.Core.Extensions/Middlewares/RequRespLogMildd.cs b/Blog.Core.Extensions/Middlewares/RequRespLogMildd.cs index 1593a34..fa5a5e3 100644 --- a/Blog.Core.Extensions/Middlewares/RequRespLogMildd.cs +++ b/Blog.Core.Extensions/Middlewares/RequRespLogMildd.cs @@ -91,11 +91,12 @@ namespace Blog.Core.Middlewares if (!string.IsNullOrEmpty(content)) { - Parallel.For(0, 1, e => - { - LogLock.OutSql2Log("RequestResponseLog", new string[] { "Request Data:", content }); + //Parallel.For(0, 1, e => + //{ + // LogLock.OutSql2Log("RequestResponseLog", new string[] { "Request Data:", content }); - }); + //}); + SerilogServer.WriteLog("RequestResponseLog", new string[] { "Request Data:", content }); request.Body.Position = 0; } @@ -112,11 +113,12 @@ namespace Blog.Core.Middlewares if (!string.IsNullOrEmpty(ResponseBody)) { - Parallel.For(0, 1, e => - { - LogLock.OutSql2Log("RequestResponseLog", new string[] { "Response Data:", ResponseBody }); + //Parallel.For(0, 1, e => + //{ + // LogLock.OutSql2Log("RequestResponseLog", new string[] { "Response Data:", ResponseBody }); - }); + //}); + SerilogServer.WriteLog("RequestResponseLog", new string[] { "Response Data:", ResponseBody }); } } } diff --git a/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs b/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs index 0c68dd6..7da1092 100644 --- a/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs +++ b/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs @@ -69,6 +69,16 @@ namespace Blog.Core.Extensions ConsoleHelper.WriteSuccessLine($"Service Log AOP: True"); } + // 开启的中间件日志 + var requestResponseLogOpen = Appsettings.app(new string[] { "Middleware", "RequestResponseLog", "Enabled" }).ObjToBool(); + var ipLogOpen = Appsettings.app(new string[] { "Middleware", "IPLog", "Enabled" }).ObjToBool(); + var recordAccessLogsOpen = Appsettings.app(new string[] { "Middleware", "RecordAccessLogs", "Enabled" }).ObjToBool(); + ConsoleHelper.WriteSuccessLine($"OPEN Log: " + + (requestResponseLogOpen ? "RequestResponseLog √," : "") + + (ipLogOpen ? "IPLog √," : "") + + (recordAccessLogsOpen ? "RecordAccessLogs √," : "") + ); + // 事务AOP if (!Appsettings.app(new string[] { "AppSettings", "TranAOP", "Enabled" }).ObjToBool()) { @@ -118,7 +128,7 @@ namespace Blog.Core.Extensions { ConsoleHelper.WriteSuccessLine($"MiniProfiler: True"); } - + // CORS跨域 if (!Appsettings.app("Startup", "Cors", "EnableAllIPs").ObjToBool()) { From fa6ce50e4258904dabc29657978df91e0269ad1b Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Fri, 14 May 2021 19:25:10 +0800 Subject: [PATCH 02/26] =?UTF-8?q?fix=EF=BC=9Arename=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Blog.Core.Common/Helper/FileHelper.cs | 18 ++++++++++++++++++ Blog.Core.Extensions/Middlewares/IPLogMildd.cs | 12 +++++++++--- .../Middlewares/RecordAccessLogsMildd.cs | 10 ++++++++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Blog.Core.Common/Helper/FileHelper.cs b/Blog.Core.Common/Helper/FileHelper.cs index f2d717a..c07c86e 100644 --- a/Blog.Core.Common/Helper/FileHelper.cs +++ b/Blog.Core.Common/Helper/FileHelper.cs @@ -83,6 +83,24 @@ namespace Blog.Core.Common.Helper return Path.Combine(folderPath, $@"{prefix}_{DateTime.Now.DateToTimeStamp()}.log"); } + public static string GetAvailableFileNameWithPrefixOrderSize(string _contentRoot, string prefix, int size = 1 * 1024 * 1024, string ext = ".log") + { + var folderPath = Path.Combine(_contentRoot, "Log"); + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + + var allFiles = new DirectoryInfo(folderPath); + var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(prefix.ToLower()) && fi.Extension.ToLower() == ext.ToLower() && fi.Length < size).OrderByDescending(d => d.Name).ToList(); + + if (selectFiles.Count > 0) + { + return selectFiles.FirstOrDefault().Name.Replace(".log",""); + } + + return $@"{prefix}_{DateTime.Now.DateToTimeStamp()}"; + } #endregion #region 写文件 diff --git a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs index b8dadba..aa5c426 100644 --- a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs +++ b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs @@ -1,5 +1,7 @@ using Blog.Core.Common; +using Blog.Core.Common.Helper; using Blog.Core.Common.LogHelper; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System; @@ -17,13 +19,16 @@ namespace Blog.Core.Middlewares /// /// private readonly RequestDelegate _next; + private readonly IWebHostEnvironment _environment; + /// /// /// /// - public IPLogMildd(RequestDelegate next) + public IPLogMildd(RequestDelegate next, IWebHostEnvironment environment) { _next = next; + _environment = environment; } public async Task InvokeAsync(HttpContext context) @@ -53,11 +58,12 @@ namespace Blog.Core.Middlewares // 自定义log输出 //Parallel.For(0, 1, e => //{ - // LogLock.OutSql2Log("RequestIpInfoLog", new string[] { requestInfo + "," }, false); + LogLock.OutSql2Log("RequestIpInfoLog", new string[] { requestInfo + "," }, false); //}); // 这种方案也行,用的是Serilog - SerilogServer.WriteLog("RequestIpInfoLog", new string[] { requestInfo + "," }, false); + var logFileName = FileHelper.GetAvailableFileNameWithPrefixOrderSize(_environment.ContentRootPath, "RequestIpInfoLog"); + SerilogServer.WriteLog(logFileName, new string[] { requestInfo + "," }, false); request.Body.Position = 0; } diff --git a/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs b/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs index 7180b1a..4174a45 100644 --- a/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs +++ b/Blog.Core.Extensions/Middlewares/RecordAccessLogsMildd.cs @@ -1,6 +1,8 @@ using Blog.Core.Common; +using Blog.Core.Common.Helper; using Blog.Core.Common.HttpContextUser; using Blog.Core.Common.LogHelper; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; @@ -25,17 +27,19 @@ namespace Blog.Core.Middlewares private readonly RequestDelegate _next; private readonly IUser _user; private readonly ILogger _logger; + private readonly IWebHostEnvironment _environment; private Stopwatch _stopwatch; /// /// /// /// - public RecordAccessLogsMildd(RequestDelegate next, IUser user, ILogger logger) + public RecordAccessLogsMildd(RequestDelegate next, IUser user, ILogger logger, IWebHostEnvironment environment) { _next = next; _user = user; _logger = logger; + _environment = environment; _stopwatch = new Stopwatch(); } @@ -107,7 +111,9 @@ namespace Blog.Core.Middlewares // LogLock.OutSql2Log("RecordAccessLogs", new string[] { requestInfo + "," }, false); //}); - SerilogServer.WriteLog("RecordAccessLogs", new string[] { requestInfo + "," }, false); + var logFileName = FileHelper.GetAvailableFileNameWithPrefixOrderSize(_environment.ContentRootPath, "RecordAccessLogs"); + SerilogServer.WriteLog(logFileName, new string[] { requestInfo + "," }, false); + return Task.CompletedTask; }); From eb08af94b3d45fde0cc06d99f0394bd632a7dcf5 Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Fri, 14 May 2021 21:10:56 +0800 Subject: [PATCH 03/26] Update SerilogServer.cs --- Blog.Core.Common/LogHelper/Seri/SerilogServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs index 72dad73..87c3e22 100644 --- a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs +++ b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs @@ -19,7 +19,7 @@ namespace Blog.Core.Common.LogHelper .MinimumLevel.Debug() .MinimumLevel.Override("Microsoft", LogEventLevel.Error) //.WriteTo.File(Path.Combine($"log/Serilog/{filename}/", ".log"), rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}") - .WriteTo.File(Path.Combine("log", defaultFolder, $"{filename}.log"), + .WriteTo.File(Path.Combine("Log", defaultFolder, $"{filename}.log"), rollingInterval: RollingInterval.Infinite, outputTemplate: "{Message}{NewLine}{Exception}") .CreateLogger(); From c1715afcb03b4d0f5116fe9c8d2fafc34c2f5699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=8C=20=E6=9D=A8?= Date: Fri, 21 May 2021 15:20:32 +0800 Subject: [PATCH 04/26] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=20=E7=AB=8B=E5=8D=B3=E6=89=A7=E8=A1=8C=20=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/TasksQzController.cs | 22 ++++++++++ Blog.Core.Tasks/QuartzNet/ISchedulerCenter.cs | 7 +++ .../QuartzNet/SchedulerCenterServer.cs | 44 +++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/Blog.Core.Api/Controllers/TasksQzController.cs b/Blog.Core.Api/Controllers/TasksQzController.cs index 04d63d0..ce87203 100644 --- a/Blog.Core.Api/Controllers/TasksQzController.cs +++ b/Blog.Core.Api/Controllers/TasksQzController.cs @@ -501,6 +501,28 @@ namespace Blog.Core.Controllers var implementTypes = types.Where(x => x.IsClass).Select(item => new QuartzReflectionViewModel { nameSpace = item.Namespace, nameClass = item.Name, remark = "" }).ToList(); return MessageModel>.Success("获取成功", implementTypes); } + + /// + /// 立即执行任务 + /// + /// + /// + [HttpGet] + public async Task> ExecuteJob(string jobId) + { + var data = new MessageModel(); + + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) + { + return await _schedulerCenter.ExecuteJobAsync(model); + } + else + { + data.msg = "任务不存在"; + } + return data; + } } } diff --git a/Blog.Core.Tasks/QuartzNet/ISchedulerCenter.cs b/Blog.Core.Tasks/QuartzNet/ISchedulerCenter.cs index 6319039..c859854 100644 --- a/Blog.Core.Tasks/QuartzNet/ISchedulerCenter.cs +++ b/Blog.Core.Tasks/QuartzNet/ISchedulerCenter.cs @@ -66,6 +66,13 @@ namespace Blog.Core.Tasks /// string GetTriggerState(string key); + /// + /// 立即执行 一个任务 + /// + /// + /// + Task> ExecuteJobAsync(TasksQz tasksQz); + } } diff --git a/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs b/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs index 623f452..93fa001 100644 --- a/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs +++ b/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs @@ -443,5 +443,49 @@ namespace Blog.Core.Tasks } #endregion + + /// + /// 立即执行 一个任务 + /// + /// + /// + public async Task> ExecuteJobAsync(TasksQz tasksQz) + { + var result = new MessageModel(); + try + { + JobKey jobKey = new JobKey(tasksQz.Id, tasksQz.JobGroup); + + //判断任务是否存在,存在则 触发一次,不存在则先添加一个任务,触发以后再 停止任务 + if (!await _scheduler.Result.CheckExists(jobKey)) + { + //不存在 则 添加一个计划任务 + await AddScheduleJobAsync(tasksQz); + + //触发执行一次 + await _scheduler.Result.TriggerJob(jobKey); + + //停止任务 + await StopScheduleJobAsync(tasksQz); + + result.success = true; + result.msg = $"立即执行计划任务:【{tasksQz.Name}】成功"; + } + else + { + await _scheduler.Result.TriggerJob(jobKey); + result.success = true; + result.msg = $"立即执行计划任务:【{tasksQz.Name}】成功"; + } + } + catch (Exception ex) + { + result.msg = $"立即执行计划任务失败:【{ex.Message}】"; + } + + return result; + } + + } } From 946888490c02009cf492f3fda714083862072dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=8C=20=E6=9D=A8?= Date: Fri, 21 May 2021 15:33:13 +0800 Subject: [PATCH 05/26] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=20=E7=AB=8B=E5=8D=B3=E6=89=A7=E8=A1=8C=20Id=20=E4=B8=BAInt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Blog.Core.Api/Blog.Core.xml | 7 +++++++ Blog.Core.Api/Controllers/TasksQzController.cs | 2 +- Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Blog.Core.Api/Blog.Core.xml b/Blog.Core.Api/Blog.Core.xml index 648902e..e22a384 100644 --- a/Blog.Core.Api/Blog.Core.xml +++ b/Blog.Core.Api/Blog.Core.xml @@ -519,6 +519,13 @@ + + + 立即执行任务 + + + + 类别管理【无权限】 diff --git a/Blog.Core.Api/Controllers/TasksQzController.cs b/Blog.Core.Api/Controllers/TasksQzController.cs index ce87203..ba9b735 100644 --- a/Blog.Core.Api/Controllers/TasksQzController.cs +++ b/Blog.Core.Api/Controllers/TasksQzController.cs @@ -508,7 +508,7 @@ namespace Blog.Core.Controllers /// /// [HttpGet] - public async Task> ExecuteJob(string jobId) + public async Task> ExecuteJob(int jobId) { var data = new MessageModel(); diff --git a/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs b/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs index 93fa001..8c21115 100644 --- a/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs +++ b/Blog.Core.Tasks/QuartzNet/SchedulerCenterServer.cs @@ -454,7 +454,7 @@ namespace Blog.Core.Tasks var result = new MessageModel(); try { - JobKey jobKey = new JobKey(tasksQz.Id, tasksQz.JobGroup); + JobKey jobKey = new JobKey(tasksQz.Id.ToString(), tasksQz.JobGroup); //判断任务是否存在,存在则 触发一次,不存在则先添加一个任务,触发以后再 停止任务 if (!await _scheduler.Result.CheckExists(jobKey)) From b4674f4ace1e000b4dd692cbf9b689e082d9a366 Mon Sep 17 00:00:00 2001 From: cuno92 <58431215+cuno92@users.noreply.github.com> Date: Sat, 22 May 2021 04:56:58 +0000 Subject: [PATCH 06/26] Update English readme link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c5b54c9..9a42483 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Blog.Core -[English](readme-en.md) | 简体中文 +[English](README-en.md) | 简体中文 [![sdk](https://img.shields.io/badge/sdk-5.0.1-d.svg)](#) [![Build status](https://github.com/anjoy8/blog.core/workflows/.NET%20Core/badge.svg)](https://github.com/anjoy8/Blog.Core/actions) [![Build Status](https://dev.azure.com/laozhangisphi/anjoy8/_apis/build/status/anjoy8.Blog.Core?branchName=master)](https://dev.azure.com/laozhangisphi/anjoy8/_build?definitionId=1) [![codecov](https://codecov.io/gh/anjoy8/Blog.Core/branch/master/graph/badge.svg)](https://codecov.io/gh/anjoy8/Blog.Core) [![License MIT](https://img.shields.io/badge/license-Apache-blue.svg?style=flat-square)](https://github.com/anjoy8/Blog.Core/blob/master/LICENSE) [![star this repo](http://githubbadges.com/star.svg?user=anjoy8&repo=blog.core&style=flat)](https://github.com/boennemann/badges) [![fork this repo](http://githubbadges.com/fork.svg?user=anjoy8&repo=blog.core&style=flat)](https://github.com/boennemann/badges/fork) [![博客园](https://img.shields.io/badge/博客园-老张的哲学-brightgreen.svg)](https://www.cnblogs.com/laozhang-is-phi/) From 346fbba46e346037f26506f1db1c067d04917db8 Mon Sep 17 00:00:00 2001 From: ansonzhang <3143422472@qq.com> Date: Sat, 22 May 2021 13:22:49 +0800 Subject: [PATCH 07/26] Update README-en.md --- README-en.md | 121 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 89 insertions(+), 32 deletions(-) diff --git a/README-en.md b/README-en.md index e4e7aa5..e596112 100644 --- a/README-en.md +++ b/README-en.md @@ -1,50 +1,107 @@ [ENGLISH](https://github.com/anjoy8/Blog.Core/blob/master/README-en.md) | [中文版](https://github.com/anjoy8/Blog.Core/blob/master/README.md) -![Logo](https://github.com/anjoy8/Blog.Core/blob/master/Blog.Core/wwwroot/logocore.png) -Build your own front and rear end separation from scratch ". NET Core2.1 Api + Vue 2.0" framework, currently version 2.2, each version see branch. -It's just. Netcore back-end section, Front end section, see my other engineering vue +[![sdk](https://img.shields.io/badge/sdk-5.0.1-d.svg)](#) [![Build status](https://github.com/anjoy8/blog.core/workflows/.NET%20Core/badge.svg)](https://github.com/anjoy8/Blog.Core/actions) [![Build Status](https://dev.azure.com/laozhangisphi/anjoy8/_apis/build/status/anjoy8.Blog.Core?branchName=master)](https://dev.azure.com/laozhangisphi/anjoy8/_build?definitionId=1) [![codecov](https://codecov.io/gh/anjoy8/Blog.Core/branch/master/graph/badge.svg)](https://codecov.io/gh/anjoy8/Blog.Core) [![License MIT](https://img.shields.io/badge/license-Apache-blue.svg?style=flat-square)](https://github.com/anjoy8/Blog.Core/blob/master/LICENSE) [![star this repo](http://githubbadges.com/star.svg?user=anjoy8&repo=blog.core&style=flat)](https://github.com/boennemann/badges) [![fork this repo](http://githubbadges.com/fork.svg?user=anjoy8&repo=blog.core&style=flat)](https://github.com/boennemann/badges/fork) [![Cnblogs](https://img.shields.io/badge/博客园-老张的哲学-brightgreen.svg)](https://www.cnblogs.com/laozhang-is-phi/) -Https://github.com/anjoy8/Blog.Vue -# Give a star!⭐️ +  +  -If you like this project or it helps you, please give star~ (hard Star) -********************************************************* -# Tips: -1. Blog.Core.FrameWork project is a simple implementation of generating files using T4 templates. -If there is an error, you can contact me, -QQ Group: 867095512 -If you don't want to deal with this error, you can uninstall the project first without affecting the overall operation. +
+ + MVP + -2. when the project is executed after downloading, the Redis server needs to be installed, installation and use of the description address: -https://www.cnblogs.com/laozhang-is-phi/p/9554210.html#autoid-5-0-0 + + .netfoundation + +
-3. the system new automated Generation database, and the ability to generate seed data, In the Progrm.cs in the Blog.core layer, cancel the Dbseed.seedasync (mycontext). Wait (); -The comment can be. -4. If you do not want to use Codefirst and seed data, you can use the database table structure SQL file to execute in the database, +Blog.Core is an enterprise-class back-to-back separation framework for.NET Core5.0 API + Vue 2.x + RBAC. +Website: http://apk.neters.club/.doc/ +Has been used by several companies: [click to view list] (https://github.com/anjoy8/Blog.Core/issues/75) + +Project single deployment, concurrent at 400~500, all normal (do not guarantee their own various error writing). +The effect is even better if the load is matched. + + + +  + +### Features and Progress + +Framework module: +- [x] adopts the form of 'warehousing + service + interface' to encapsulate the framework; +- [X] async/await development; +- [x] access to domestic database ORM component - SQLSUGAR, encapsulate database operation; +- [x] support free switching multiple database, MySql/used/Sqlite/Oracle/Postgresql/reach/NPC Jin Cang dreams; +- [x] realize project startup, automatically generate seed data ✨; +- [X] five types of logging, audit/exception/request response/service operation/SQL logging, etc. +- [x] Support for project transaction processing (use CAP if you want to distribute) ✨; +- [x] Design 4 types of AOP facets programming, including: logging, caching, auditing, transaction ✨; +- [x] Support T4 code template, automatically generate code for each layer; +- [x] or use DbFirst one key to create their own project four layer files (support multiple libraries); +- [x] encapsulation ` Blog. Core. Webapi. Template ` project Template, a key ✨ rebuild their projects; +- [x] with multiple front-end cases for reference and reference: blog.vue, blog.admin, nuxt.tbug, blog.mvp. Blazor ✨; +- [x] Uniform Integrated IdentityServer4 Authentication ✨; + +Component module: +- [x] provides Redis for caching; +- [x] API file with Swagger; +- [x] Use Miniprofiler for interface performance analysis ✨; +- [x] uses Automapper to handle object mapping; +- [x] uses Autofac as a dependency injection container and provides batch service injection ✨; +- [x] supports CORS cross-domain; +- [x] encapsulates JWT custom policy authorization; +- [x] uses the Log4Net logging framework and integrates the native iLogger interface for logging; +- [x] using Signalr duplex communication ✨; +- [x] Added iprateLimiting for API current limiting; +- [X] Use Quartz.net for task scheduling (currently single machine multi-task, cluster scheduling is not currently supported); +- [x] Support for database 'read/write separation' and multi-library operations ✨; +- [x] Added Redis Message Queuing ✨; +- [x] new RabbitMQ message queue ✨; +- [x] New EventBus ✨; +- [x] Debugging - Unified Aggregate Payment; +- [] Plan - Data department authority; +-[] plan -es search; + +Micro service module: +- [x] can cooperate with Docker to achieve containerization; +- [x] can cooperate with Jenkins to achieve CI/CD; +- [x] enables service discovery with Consul; +- [x] can cooperate with Ocelot to achieve gateway processing; +- [x] can cooperate with NGINX to achieve load balancing; +- [x] can cooperate with IDS4 certification center; + + +  + +## Give a star! ⭐ ️ +If you like this project or it helps you, please send it to STAR ~ +If your project from the project, please explain a little bit down [https://github.com/anjoy8/Blog.Core/issues/75] (https://github.com/anjoy8/Blog.Core/issues/75), Open source is not easy ✨. + + + +  + +## Official document 📕 + +Still in the process of sorting out, but the basic operations, including how to get started, configure data, connect to DB, and so on + +[the official documentation] (http://apk.neters.club/.doc/) +[Official account important articles + video address](https://mvp.neters.club/) + + + + +  -In the Wwwroot folder under the Blog.core project. -********************************************************* -### Modify Database connection string -1, in the Blog.Core.Repository layer under the Sugar folder under the BaseDBConfig.cs, configure their own strings -``` -public static string connectionstring = File.exists (@ "D:my-filedbCountPsw1.txt")? -File.readalltext (@ "D:my-filedbCountPsw1.txt"). Trim (): "server=.; -Uid=sa;pwd=sa;database=blogdb "; -``` -2, in the Blog.Core.FrameWork layer of the dbhelper.ttinclude, configure their own strings -``` -public static readonly String connectionstring = File.exists (@ "D:my-filedbCountPsw2.txt")? -File.readalltext (@ "D:my-filedbCountPsw2.txt"). Trim (): "server=.; -Uid=sa;pwd=sa;database=blogdb "; -``` ***************************************************** From d4728831fd6112260605f4d40c0e64c34f1606b6 Mon Sep 17 00:00:00 2001 From: ansonzhang <3143422472@qq.com> Date: Sat, 22 May 2021 13:24:49 +0800 Subject: [PATCH 08/26] Update README-en.md --- README-en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README-en.md b/README-en.md index e596112..01efd58 100644 --- a/README-en.md +++ b/README-en.md @@ -66,8 +66,8 @@ Component module: - [x] new RabbitMQ message queue ✨; - [x] New EventBus ✨; - [x] Debugging - Unified Aggregate Payment; -- [] Plan - Data department authority; --[] plan -es search; +- [ ] Plan - Data department authority; +- [ ] plan -es search; Micro service module: - [x] can cooperate with Docker to achieve containerization; From 3bd69c3839d00d763994285b4bec367aaa3eb6b5 Mon Sep 17 00:00:00 2001 From: ansonzhang <3143422472@qq.com> Date: Sat, 22 May 2021 13:26:25 +0800 Subject: [PATCH 09/26] Update README-en.md --- README-en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-en.md b/README-en.md index 01efd58..33d8a74 100644 --- a/README-en.md +++ b/README-en.md @@ -35,7 +35,7 @@ The effect is even better if the load is matched. ### Features and Progress Framework module: -- [x] adopts the form of 'warehousing + service + interface' to encapsulate the framework; +- [x] adopts the form of 'repository + service + interface' to encapsulate the framework; - [X] async/await development; - [x] access to domestic database ORM component - SQLSUGAR, encapsulate database operation; - [x] support free switching multiple database, MySql/used/Sqlite/Oracle/Postgresql/reach/NPC Jin Cang dreams; From 7aae1c6d60eb11bf93dd3f19145b4bf4bb74896f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=81=E9=AA=91?= <1075858260@qq.com> Date: Mon, 31 May 2021 15:16:04 +0800 Subject: [PATCH 10/26] =?UTF-8?q?=E5=8A=A0=E4=BA=86=E4=B8=AABase=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=99=A8=EF=BC=8C=E5=B0=81=E8=A3=85=E4=BA=86=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E8=BF=94=E5=9B=9E=EF=BC=8C=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/BaseApiCpntroller.cs | 86 +++++++++++++ Blog.Core.Api/Controllers/BlogController.cs | 113 +++--------------- Blog.Core.Api/Controllers/LoginController.cs | 45 ++----- 3 files changed, 111 insertions(+), 133 deletions(-) create mode 100644 Blog.Core.Api/Controllers/BaseApiCpntroller.cs diff --git a/Blog.Core.Api/Controllers/BaseApiCpntroller.cs b/Blog.Core.Api/Controllers/BaseApiCpntroller.cs new file mode 100644 index 0000000..d1de099 --- /dev/null +++ b/Blog.Core.Api/Controllers/BaseApiCpntroller.cs @@ -0,0 +1,86 @@ +using Blog.Core.Model; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; + +namespace Blog.Core.Controllers +{ + public class BaseApiCpntroller : Controller + { + + public MessageModel Success(T data, string msg = "成功") + { + return new MessageModel() + { + success = true, + msg = msg, + response = data, + }; + } + + public MessageModel Success(string msg = "成功") + { + return new MessageModel() + { + success = true, + msg = msg, + response = null, + }; + } + + public MessageModel Failed(string msg = "失败", int status = 500) + { + return new MessageModel() + { + success = false, + status = status, + msg = msg, + response = null, + }; + } + + public MessageModel Failed(string msg = "失败", int status = 500) + { + return new MessageModel() + { + success = false, + status = status, + msg = msg, + response = default, + }; + } + + public MessageModel> SuccessPage(int page, int dataCount, List data, int pageCount, string msg = "获取成功") + { + + return new MessageModel>() + { + success = true, + msg = msg, + response = new PageModel() + { + page = page, + dataCount = dataCount, + data = data, + pageCount = pageCount, + } + }; + } + + public MessageModel> SuccessPage(PageModel pageModel, string msg = "获取成功") + { + + return new MessageModel>() + { + success = true, + msg = msg, + response = new PageModel() + { + page = pageModel.page, + dataCount = pageModel.dataCount, + data = pageModel.data, + pageCount = pageModel.pageCount, + } + }; + } + } +} diff --git a/Blog.Core.Api/Controllers/BlogController.cs b/Blog.Core.Api/Controllers/BlogController.cs index f36249f..0eed83d 100644 --- a/Blog.Core.Api/Controllers/BlogController.cs +++ b/Blog.Core.Api/Controllers/BlogController.cs @@ -22,7 +22,7 @@ namespace Blog.Core.Controllers ///
[Produces("application/json")] [Route("api/Blog")] - public class BlogController : ControllerBase + public class BlogController : BaseApiCpntroller { public IBlogArticleServices _blogArticleServices { get; set; } private readonly ILogger _logger; @@ -56,7 +56,7 @@ namespace Blog.Core.Controllers } Expression> whereExpression = a => (a.bcategory == bcategory && a.IsDeleted == false) && ((a.btitle != null && a.btitle.Contains(key)) || (a.bcontent != null && a.bcontent.Contains(key))); - + var testId = await _blogArticleServices.GetBlogDetails(1); var pageModelBlog = await _blogArticleServices.QueryPage(whereExpression, page, intPageSize, " bID desc "); @@ -77,18 +77,7 @@ namespace Blog.Core.Controllers } } - return new MessageModel>() - { - success = true, - msg = "获取成功", - response = new PageModel() - { - page = page, - dataCount = pageModelBlog.dataCount, - data = pageModelBlog.data, - pageCount = pageModelBlog.pageCount, - } - }; + return SuccessPage(pageModelBlog); } @@ -102,12 +91,7 @@ namespace Blog.Core.Controllers [Authorize] public async Task> Get(int id) { - return new MessageModel() - { - msg = "获取成功", - success = true, - response = await _blogArticleServices.GetBlogDetails(id) - }; + return Success(await _blogArticleServices.GetBlogDetails(id)); } @@ -121,12 +105,7 @@ namespace Blog.Core.Controllers public async Task> DetailNuxtNoPer(int id) { _logger.LogInformation("xxxxxxxxxxxxxxxxxxx"); - return new MessageModel() - { - msg = "获取成功", - success = true, - response = await _blogArticleServices.GetBlogDetails(id) - }; + return Success(await _blogArticleServices.GetBlogDetails(id)); } [HttpGet] @@ -156,15 +135,9 @@ namespace Blog.Core.Controllers if (types.IsNotEmptyOrNull()) { var blogs = await _blogArticleServices.Query(d => d.bcategory != null && types.Contains(d.bcategory) && d.IsDeleted == false); - return new MessageModel>() - { - msg = "获取成功", - success = true, - response = blogs - }; + return Success(blogs); } - - return new MessageModel>() { }; + return Success(new List() { }); } [HttpGet] @@ -173,15 +146,9 @@ namespace Blog.Core.Controllers { if (id > 0) { - return new MessageModel() - { - msg = "获取成功", - success = true, - response = await _blogArticleServices.QueryById(id) - }; + return Success(await _blogArticleServices.QueryById(id)); } - - return new MessageModel() { }; + return Success(new BlogArticle()); } /// @@ -198,12 +165,7 @@ namespace Blog.Core.Controllers [CustomRoute(ApiVersions.V2, "Blogtest")] public MessageModel V2_Blogtest() { - return new MessageModel() - { - msg = "获取成功", - success = true, - response = "我是第二版的博客信息" - }; + return Success("我是第二版的博客信息"); } /// @@ -216,22 +178,12 @@ namespace Blog.Core.Controllers [Authorize] public async Task> Post([FromBody] BlogArticle blogArticle) { - var data = new MessageModel(); - blogArticle.bCreateTime = DateTime.Now; blogArticle.bUpdateTime = DateTime.Now; blogArticle.IsDeleted = false; blogArticle.bcategory = "技术博文"; - var id = (await _blogArticleServices.Add(blogArticle)); - data.success = id > 0; - if (data.success) - { - data.response = id.ObjToString(); - data.msg = "添加成功"; - } - - return data; + return id > 0 ? Success(id.ObjToString()) : Failed("添加失败"); } @@ -245,21 +197,11 @@ namespace Blog.Core.Controllers [Authorize(Permissions.Name)] public async Task> AddForMVP([FromBody] BlogArticle blogArticle) { - var data = new MessageModel(); - blogArticle.bCreateTime = DateTime.Now; blogArticle.bUpdateTime = DateTime.Now; blogArticle.IsDeleted = false; - var id = (await _blogArticleServices.Add(blogArticle)); - data.success = id > 0; - if (data.success) - { - data.response = id.ObjToString(); - data.msg = "添加成功"; - } - - return data; + return id > 0 ? Success(id.ObjToString()) : Failed("添加失败"); } /// /// 更新博客信息 @@ -272,7 +214,6 @@ namespace Blog.Core.Controllers [Authorize(Permissions.Name)] public async Task> Put([FromBody] BlogArticle BlogArticle) { - var data = new MessageModel(); if (BlogArticle != null && BlogArticle.bID > 0) { var model = await _blogArticleServices.QueryById(BlogArticle.bID); @@ -285,17 +226,11 @@ namespace Blog.Core.Controllers model.bcontent = BlogArticle.bcontent; model.btraffic = BlogArticle.btraffic; - data.success = await _blogArticleServices.Update(model); - if (data.success) - { - data.msg = "更新成功"; - data.response = BlogArticle?.bID.ObjToString(); - } + if (await _blogArticleServices.Update(model)) + Success(BlogArticle?.bID.ObjToString()); } - } - - return data; + return Failed("更新失败"); } @@ -310,20 +245,13 @@ namespace Blog.Core.Controllers [Route("Delete")] public async Task> Delete(int id) { - var data = new MessageModel(); if (id > 0) { var blogArticle = await _blogArticleServices.QueryById(id); blogArticle.IsDeleted = true; - data.success = await _blogArticleServices.Update(blogArticle); - if (data.success) - { - data.msg = "删除成功"; - data.response = blogArticle?.bID.ObjToString(); - } + return await _blogArticleServices.Update(blogArticle) ? Success(blogArticle?.bID.ObjToString(), "删除成功") : Failed("删除失败"); } - - return data; + return Failed("入参无效"); } /// /// apache jemeter 压力测试 @@ -334,12 +262,7 @@ namespace Blog.Core.Controllers [Route("ApacheTestUpdate")] public async Task> ApacheTestUpdate() { - return new MessageModel() - { - success = true, - msg = "更新成功", - response = await _blogArticleServices.Update(new { bsubmitter = $"laozhang{DateTime.Now.Millisecond}", bID = 1 }) - }; + return Success(await _blogArticleServices.Update(new { bsubmitter = $"laozhang{DateTime.Now.Millisecond}", bID = 1 }), "更新成功"); } } } \ No newline at end of file diff --git a/Blog.Core.Api/Controllers/LoginController.cs b/Blog.Core.Api/Controllers/LoginController.cs index 67cb4ca..686c643 100644 --- a/Blog.Core.Api/Controllers/LoginController.cs +++ b/Blog.Core.Api/Controllers/LoginController.cs @@ -23,7 +23,7 @@ namespace Blog.Core.Controllers [Produces("application/json")] [Route("api/Login")] [AllowAnonymous] - public class LoginController : Controller + public class LoginController : BaseApiCpntroller { readonly ISysUserInfoServices _sysUserInfoServices; readonly IUserRoleServices _userRoleServices; @@ -146,13 +146,7 @@ namespace Blog.Core.Controllers string jwtStr = string.Empty; if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pass)) - { - return new MessageModel() - { - success = false, - msg = "用户名或密码不能为空", - }; - } + return Failed("用户名或密码不能为空"); pass = MD5Helper.MD5Encrypt32(pass); @@ -186,20 +180,11 @@ namespace Blog.Core.Controllers } var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement); - return new MessageModel() - { - success = true, - msg = "获取成功", - response = token - }; + return Success(token, "获取成功"); } else { - return new MessageModel() - { - success = false, - msg = "认证失败", - }; + return Failed("认证失败"); } } @@ -215,13 +200,7 @@ namespace Blog.Core.Controllers string jwtStr = string.Empty; if (string.IsNullOrEmpty(token)) - { - return new MessageModel() - { - success = false, - msg = "token无效,请重新登录!", - }; - } + return Failed("token无效,请重新登录!"); var tokenModel = JwtHelper.SerializeJwt(token); if (tokenModel != null && tokenModel.Uid > 0) { @@ -241,20 +220,10 @@ namespace Blog.Core.Controllers identity.AddClaims(claims); var refreshToken = JwtToken.BuildJwtToken(claims.ToArray(), _requirement); - return new MessageModel() - { - success = true, - msg = "获取成功", - response = refreshToken - }; + return Success(refreshToken, "获取成功"); } } - - return new MessageModel() - { - success = false, - msg = "认证失败!", - }; + return Failed("认证失败!"); } /// From 2b0e432e09982b4ca7707e86f9b11a25f4c3fa0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=81=E9=AA=91?= <1075858260@qq.com> Date: Mon, 31 May 2021 15:19:03 +0800 Subject: [PATCH 11/26] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E9=9D=9E=E6=B3=9B=E5=9E=8B=E7=9A=84MessageModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Blog.Core.Model/MessageModel.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Blog.Core.Model/MessageModel.cs b/Blog.Core.Model/MessageModel.cs index 5fa7f09..09b8536 100644 --- a/Blog.Core.Model/MessageModel.cs +++ b/Blog.Core.Model/MessageModel.cs @@ -71,4 +71,24 @@ return new MessageModel() { msg = msg, response = response, success = success }; } } + + public class MessageModel + { + /// + /// 状态码 + /// + public int status { get; set; } = 200; + /// + /// 操作是否成功 + /// + public bool success { get; set; } = false; + /// + /// 返回信息 + /// + public string msg { get; set; } = ""; + /// + /// 返回数据集合 + /// + public object response { get; set; } + } } From aeba197ce3b52e3686f363873a5b764cd250e03e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=81=E9=AA=91?= <1075858260@qq.com> Date: Mon, 31 May 2021 15:22:17 +0800 Subject: [PATCH 12/26] =?UTF-8?q?=E5=8A=A0=E4=B8=8ANoAction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Blog.Core.Api/Controllers/BaseApiCpntroller.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Blog.Core.Api/Controllers/BaseApiCpntroller.cs b/Blog.Core.Api/Controllers/BaseApiCpntroller.cs index d1de099..92f9db1 100644 --- a/Blog.Core.Api/Controllers/BaseApiCpntroller.cs +++ b/Blog.Core.Api/Controllers/BaseApiCpntroller.cs @@ -6,7 +6,7 @@ namespace Blog.Core.Controllers { public class BaseApiCpntroller : Controller { - + [NonAction] public MessageModel Success(T data, string msg = "成功") { return new MessageModel() @@ -16,7 +16,7 @@ namespace Blog.Core.Controllers response = data, }; } - + [NonAction] public MessageModel Success(string msg = "成功") { return new MessageModel() @@ -26,7 +26,7 @@ namespace Blog.Core.Controllers response = null, }; } - + [NonAction] public MessageModel Failed(string msg = "失败", int status = 500) { return new MessageModel() @@ -37,7 +37,7 @@ namespace Blog.Core.Controllers response = null, }; } - + [NonAction] public MessageModel Failed(string msg = "失败", int status = 500) { return new MessageModel() @@ -48,7 +48,7 @@ namespace Blog.Core.Controllers response = default, }; } - + [NonAction] public MessageModel> SuccessPage(int page, int dataCount, List data, int pageCount, string msg = "获取成功") { @@ -65,7 +65,7 @@ namespace Blog.Core.Controllers } }; } - + [NonAction] public MessageModel> SuccessPage(PageModel pageModel, string msg = "获取成功") { From a5779b801990deae5da870aab1f8f8ba40b8b087 Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Mon, 31 May 2021 18:53:44 +0800 Subject: [PATCH 13/26] config es from serilog --- Blog.Core.Api/Blog.Core.Model.xml | 20 +++++++++++++++++++ Blog.Core.Common/Blog.Core.Common.csproj | 1 + .../LogHelper/Seri/SerilogServer.cs | 10 ++++++++++ 3 files changed, 31 insertions(+) diff --git a/Blog.Core.Api/Blog.Core.Model.xml b/Blog.Core.Api/Blog.Core.Model.xml index 442aff2..ce6dd05 100644 --- a/Blog.Core.Api/Blog.Core.Model.xml +++ b/Blog.Core.Api/Blog.Core.Model.xml @@ -140,6 +140,26 @@ 数据 + + + 状态码 + + + + + 操作是否成功 + + + + + 返回信息 + + + + + 返回数据集合 + + 广告图片 diff --git a/Blog.Core.Common/Blog.Core.Common.csproj b/Blog.Core.Common/Blog.Core.Common.csproj index 5525930..92af018 100644 --- a/Blog.Core.Common/Blog.Core.Common.csproj +++ b/Blog.Core.Common/Blog.Core.Common.csproj @@ -16,6 +16,7 @@ + diff --git a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs index 87c3e22..36d88c2 100644 --- a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs +++ b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs @@ -1,5 +1,6 @@ using Serilog; using Serilog.Events; +using Serilog.Sinks.Elasticsearch; using System; using System.IO; @@ -22,6 +23,15 @@ namespace Blog.Core.Common.LogHelper .WriteTo.File(Path.Combine("Log", defaultFolder, $"{filename}.log"), rollingInterval: RollingInterval.Infinite, outputTemplate: "{Message}{NewLine}{Exception}") + + // 将日志托送到远程ES + // docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d --name ES01 elasticsearch:7.2.0 + //.Enrich.FromLogContext() + //.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://x.xxx.xx.xx:9200/")) + //{ + // AutoRegisterTemplate = true, + //}) + .CreateLogger(); var now = DateTime.Now; From 9fdd250a45d3a90ebaf24c8c2354d922237bac31 Mon Sep 17 00:00:00 2001 From: wuare Date: Tue, 1 Jun 2021 11:08:27 +0800 Subject: [PATCH 14/26] clean up code and formatting --- Blog.Core.Common/Helper/StringHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Blog.Core.Common/Helper/StringHelper.cs b/Blog.Core.Common/Helper/StringHelper.cs index 4c9683e..e77a2ef 100644 --- a/Blog.Core.Common/Helper/StringHelper.cs +++ b/Blog.Core.Common/Helper/StringHelper.cs @@ -83,9 +83,9 @@ namespace Blog.Core.Common.Helper /// /// /// - public static string GetCusLine(string resourceStr,int length) { + public static string GetCusLine(string resourceStr, int length) { string[] arrStr = resourceStr.Split("\r\n"); - return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length+1).Take(length).ToArray()); + return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length + 1).Take(length).ToArray()); } } From 5bb969e1b956ec16beb0c7d21059f00ca1066ffd Mon Sep 17 00:00:00 2001 From: wuare Date: Tue, 1 Jun 2021 11:31:55 +0800 Subject: [PATCH 15/26] fix typo and remove not needed null check --- Blog.Core.Common/Helper/UrlHelper.cs | 2 +- Blog.Core.Common/Helper/UtilConvert.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Blog.Core.Common/Helper/UrlHelper.cs b/Blog.Core.Common/Helper/UrlHelper.cs index 6f54acc..2814ec6 100644 --- a/Blog.Core.Common/Helper/UrlHelper.cs +++ b/Blog.Core.Common/Helper/UrlHelper.cs @@ -5,7 +5,7 @@ /// /// UrlEncode编码 /// - /// url + /// url /// public static string UrlEncode(string url) { return System.Web.HttpUtility.UrlEncode(url, System.Text.Encoding.UTF8); diff --git a/Blog.Core.Common/Helper/UtilConvert.cs b/Blog.Core.Common/Helper/UtilConvert.cs index 0d1b8ee..636e709 100644 --- a/Blog.Core.Common/Helper/UtilConvert.cs +++ b/Blog.Core.Common/Helper/UtilConvert.cs @@ -15,7 +15,7 @@ namespace Blog.Core { int reval = 0; if (thisValue == null) return 0; - if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) + if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) { return reval; } From 711f92d1e6d1dd1b9d6625bcaf0f9cf1f4e4bcbf Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Tue, 1 Jun 2021 11:40:30 +0800 Subject: [PATCH 16/26] Resolve data anomalies in trend charts --- .../Controllers/MonitorController.cs | 41 ++++++------------- Blog.Core.Common/LogHelper/LogLock.cs | 10 ++++- .../Middlewares/IPLogMildd.cs | 2 +- 3 files changed, 22 insertions(+), 31 deletions(-) diff --git a/Blog.Core.Api/Controllers/MonitorController.cs b/Blog.Core.Api/Controllers/MonitorController.cs index d397263..b06af19 100644 --- a/Blog.Core.Api/Controllers/MonitorController.cs +++ b/Blog.Core.Api/Controllers/MonitorController.cs @@ -26,7 +26,7 @@ namespace Blog.Core.Controllers [Route("api/[Controller]/[action]")] [ApiController] [AllowAnonymous] - public class MonitorController : Controller + public class MonitorController : BaseApiCpntroller { private readonly IHubContext _hubContext; private readonly IWebHostEnvironment _env; @@ -48,21 +48,16 @@ namespace Blog.Core.Controllers [HttpGet] public MessageModel Server() { - return new MessageModel() + return Success(new ServerViewModel() { - msg = "获取成功", - success = true, - response = new ServerViewModel() - { - EnvironmentName = _env.EnvironmentName, - OSArchitecture = RuntimeInformation.OSArchitecture.ObjToString(), - ContentRootPath = _env.ContentRootPath, - WebRootPath = _env.WebRootPath, - FrameworkDescription = RuntimeInformation.FrameworkDescription, - MemoryFootprint = (Process.GetCurrentProcess().WorkingSet64 / 1048576).ToString("N2") + " MB", - WorkingTime = DateHelper.TimeSubTract(DateTime.Now, Process.GetCurrentProcess().StartTime) - } - }; + EnvironmentName = _env.EnvironmentName, + OSArchitecture = RuntimeInformation.OSArchitecture.ObjToString(), + ContentRootPath = _env.ContentRootPath, + WebRootPath = _env.WebRootPath, + FrameworkDescription = RuntimeInformation.FrameworkDescription, + MemoryFootprint = (Process.GetCurrentProcess().WorkingSet64 / 1048576).ToString("N2") + " MB", + WorkingTime = DateHelper.TimeSubTract(DateTime.Now, Process.GetCurrentProcess().StartTime) + }); } @@ -77,12 +72,7 @@ namespace Blog.Core.Controllers _hubContext.Clients.All.SendAsync("ReceiveUpdate", LogLock.GetLogData()).Wait(); - return new MessageModel>() - { - msg = "获取成功", - success = true, - response = null - }; + return Success>(null); } @@ -90,12 +80,7 @@ namespace Blog.Core.Controllers [HttpGet] public MessageModel GetRequestApiinfoByWeek() { - return new MessageModel() - { - msg = "获取成功", - success = true, - response = LogLock.RequestApiinfoByWeek() - }; + return Success(LogLock.RequestApiinfoByWeek()); } [HttpGet] @@ -121,7 +106,7 @@ namespace Blog.Core.Controllers } [HttpGet] - public MessageModel GetActiveUsers([FromServices]IWebHostEnvironment environment) + public MessageModel GetActiveUsers([FromServices] IWebHostEnvironment environment) { var accessLogsToday = JsonConvert.DeserializeObject>("[" + LogLock.ReadLog( Path.Combine(environment.ContentRootPath, "Log"), "RecordAccessLogs_", Encoding.UTF8, ReadType.PrefixLatest diff --git a/Blog.Core.Common/LogHelper/LogLock.cs b/Blog.Core.Common/LogHelper/LogLock.cs index deb40e9..adeb0e1 100644 --- a/Blog.Core.Common/LogHelper/LogLock.cs +++ b/Blog.Core.Common/LogHelper/LogLock.cs @@ -318,11 +318,17 @@ namespace Blog.Core.Common.LogHelper jsonBuilder.Append(item.count); jsonBuilder.Append("\","); } - jsonBuilder.Remove(jsonBuilder.Length - 1, 1); + if (apiweeksCurrentWeek.Count > 0) + { + jsonBuilder.Remove(jsonBuilder.Length - 1, 1); + } jsonBuilder.Append("},"); } - jsonBuilder.Remove(jsonBuilder.Length - 1, 1); + if (weeks.Count > 0) + { + jsonBuilder.Remove(jsonBuilder.Length - 1, 1); + } jsonBuilder.Append("]"); //columns.AddRange(apiWeeks.OrderByDescending(d => d.count).Take(8).Select(d => d.url).ToList()); diff --git a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs index aa5c426..8716db9 100644 --- a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs +++ b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs @@ -58,7 +58,7 @@ namespace Blog.Core.Middlewares // 自定义log输出 //Parallel.For(0, 1, e => //{ - LogLock.OutSql2Log("RequestIpInfoLog", new string[] { requestInfo + "," }, false); + // LogLock.OutSql2Log("RequestIpInfoLog", new string[] { requestInfo + "," }, false); //}); // 这种方案也行,用的是Serilog From 90858c46decefa42d147eb97a5ccd2eb67300946 Mon Sep 17 00:00:00 2001 From: wuare Date: Tue, 1 Jun 2021 12:21:55 +0800 Subject: [PATCH 17/26] use string interpolation expression --- Blog.Core.Extensions/AOP/CacheAOPbase.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Blog.Core.Extensions/AOP/CacheAOPbase.cs b/Blog.Core.Extensions/AOP/CacheAOPbase.cs index fb19e14..0479183 100644 --- a/Blog.Core.Extensions/AOP/CacheAOPbase.cs +++ b/Blog.Core.Extensions/AOP/CacheAOPbase.cs @@ -44,7 +44,7 @@ namespace Blog.Core.AOP /// protected static string GetArgumentValue(object arg) { - if (arg is DateTime || arg is DateTime?) + if (arg is DateTime) return ((DateTime)arg).ToString("yyyyMMddHHmmss"); if (!arg.IsNotEmptyOrNull()) @@ -108,7 +108,7 @@ namespace Blog.Core.AOP case ExpressionType.GreaterThanOrEqual: return ">="; default: - throw new Exception(string.Format("不支持{0}此种运算符查找!" + expressiontype)); + throw new Exception($"不支持{expressiontype}此种运算符查找!"); } } @@ -135,7 +135,7 @@ namespace Blog.Core.AOP case "LongCount": return Len(MethodCall, value, expressiontype.Value); default: - throw new Exception(string.Format("不支持{0}方法的查找!", MethodName)); + throw new Exception($"不支持{MethodName}方法的查找!"); } } @@ -155,7 +155,7 @@ namespace Blog.Core.AOP string Name = Argument2.Member.Name; string Operator = Convert.ToBoolean(isTrue) ? "in" : " not in"; string CompName = string.Join(",", SetInPara); - string Result = string.Format("{0} {1} ({2})", Name, Operator, CompName); + string Result = $"{Name} {Operator} ({CompName})"; return Result; } private static string Like(MethodCallExpression expression) @@ -165,9 +165,9 @@ namespace Blog.Core.AOP LambdaExpression lambda = Expression.Lambda(Temp); Delegate fn = lambda.Compile(); var tempValue = Expression.Constant(fn.DynamicInvoke(null), Temp.Type); - string Value = string.Format("%{0}%", tempValue); + string Value = $"%{tempValue}%"; string Name = (expression.Object as MemberExpression).Member.Name; - string Result = string.Format("{0} like {1}", Name, Value); + string Result = $"{Name} like {Value}"; return Result; } @@ -176,7 +176,7 @@ namespace Blog.Core.AOP { object Name = (expression.Arguments[0] as MemberExpression).Member.Name; string Operator = GetOperator(expressiontype); - string Result = string.Format("len({0}){1}{2}", Name, Operator, value.ToString()); + string Result = $"len({Name}){Operator}{value.ToString()}"; return Result; } From b2ccdd84260836d738d1218b56fa9ac368efe292 Mon Sep 17 00:00:00 2001 From: wuare Date: Tue, 1 Jun 2021 13:51:55 +0800 Subject: [PATCH 18/26] remove unused param tag --- Blog.Core.Extensions/Redis/RedisBasketRepository.cs | 1 - Blog.Core.Repository/BASE/BaseRepository.cs | 2 -- Blog.Core.Repository/MongoRepository/MongoDbContext.cs | 3 +-- Blog.Core.Services/BASE/BaseServices.cs | 2 -- Blog.Core.Services/BlogArticleServices.cs | 1 - 5 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Blog.Core.Extensions/Redis/RedisBasketRepository.cs b/Blog.Core.Extensions/Redis/RedisBasketRepository.cs index 0057868..02809bc 100644 --- a/Blog.Core.Extensions/Redis/RedisBasketRepository.cs +++ b/Blog.Core.Extensions/Redis/RedisBasketRepository.cs @@ -154,7 +154,6 @@ namespace Blog.Core.Extensions /// /// 移除并返回存储在该键列表的第一个元素 /// - /// /// /// /// diff --git a/Blog.Core.Repository/BASE/BaseRepository.cs b/Blog.Core.Repository/BASE/BaseRepository.cs index ecbcd81..55fd0e1 100644 --- a/Blog.Core.Repository/BASE/BaseRepository.cs +++ b/Blog.Core.Repository/BASE/BaseRepository.cs @@ -403,7 +403,6 @@ namespace Blog.Core.Repository.Base /// 条件表达式 /// 页码(下标0) /// 页大小 - /// 数据总量 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( @@ -423,7 +422,6 @@ namespace Blog.Core.Repository.Base /// 条件 /// 页码(下标0) /// 页大小 - /// 数据总量 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( diff --git a/Blog.Core.Repository/MongoRepository/MongoDbContext.cs b/Blog.Core.Repository/MongoRepository/MongoDbContext.cs index f6a0d27..29357fe 100644 --- a/Blog.Core.Repository/MongoRepository/MongoDbContext.cs +++ b/Blog.Core.Repository/MongoRepository/MongoDbContext.cs @@ -12,8 +12,7 @@ namespace Blog.Core.Repository.MongoRepository public MongoDbContext() { var client = new MongoClient(Appsettings.app(new string[] { "Mongo", "ConnectionString" })); - if (client != null) - _database = client.GetDatabase(Appsettings.app(new string[] { "Mongo", "Database" })); + _database = client.GetDatabase(Appsettings.app(new string[] { "Mongo", "Database" })); } public IMongoDatabase Db diff --git a/Blog.Core.Services/BASE/BaseServices.cs b/Blog.Core.Services/BASE/BaseServices.cs index ebde1bf..ba55308 100644 --- a/Blog.Core.Services/BASE/BaseServices.cs +++ b/Blog.Core.Services/BASE/BaseServices.cs @@ -269,7 +269,6 @@ namespace Blog.Core.Services.BASE /// 条件表达式 /// 页码(下标0) /// 页大小 - /// 数据总量 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( @@ -292,7 +291,6 @@ namespace Blog.Core.Services.BASE /// 条件 /// 页码(下标0) /// 页大小 - /// 数据总量 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( diff --git a/Blog.Core.Services/BlogArticleServices.cs b/Blog.Core.Services/BlogArticleServices.cs index 512f4fb..f04de9a 100644 --- a/Blog.Core.Services/BlogArticleServices.cs +++ b/Blog.Core.Services/BlogArticleServices.cs @@ -63,7 +63,6 @@ namespace Blog.Core.Services /// /// 获取博客列表 /// - /// /// [Caching(AbsoluteExpiration = 10)] public async Task> GetBlogs() From 5c6260766e5ff59aec8158f1218368ddf77fc74f Mon Sep 17 00:00:00 2001 From: wuare Date: Wed, 2 Jun 2021 10:33:02 +0800 Subject: [PATCH 19/26] Remove unused param tag --- Blog.Core.Services/BlogArticleServices.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Blog.Core.Services/BlogArticleServices.cs b/Blog.Core.Services/BlogArticleServices.cs index 512f4fb..f04de9a 100644 --- a/Blog.Core.Services/BlogArticleServices.cs +++ b/Blog.Core.Services/BlogArticleServices.cs @@ -63,7 +63,6 @@ namespace Blog.Core.Services /// /// 获取博客列表 /// - /// /// [Caching(AbsoluteExpiration = 10)] public async Task> GetBlogs() From ec89745efcab8043588866fa2dcdeae304f797ce Mon Sep 17 00:00:00 2001 From: wuare Date: Wed, 2 Jun 2021 10:57:30 +0800 Subject: [PATCH 20/26] Remove not needed null check return string.Empty if there is no ContentEncoding, so encoding never be null, condition is always true --- Blog.Core.Common/Helper/HttpHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Blog.Core.Common/Helper/HttpHelper.cs b/Blog.Core.Common/Helper/HttpHelper.cs index dd666c9..54d5661 100644 --- a/Blog.Core.Common/Helper/HttpHelper.cs +++ b/Blog.Core.Common/Helper/HttpHelper.cs @@ -50,7 +50,7 @@ namespace Blog.Core.Common.Helper } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; - if (encoding == null || encoding.Length < 1) + if (encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } @@ -75,7 +75,7 @@ namespace Blog.Core.Common.Helper } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; - if (encoding == null || encoding.Length < 1) + if (encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } From 700b70373b7cdff59566bcd180659371ab121b02 Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Fri, 4 Jun 2021 19:28:44 +0800 Subject: [PATCH 21/26] =?UTF-8?q?feat=EF=BC=9Aout=20sql=20log=20to=20conso?= =?UTF-8?q?le?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Blog.Core.Api/Blog.Core.xml | 4 +-- Blog.Core.Api/Controllers/BlogController.cs | 6 ++-- Blog.Core.Api/appsettings.json | 8 +++++- Blog.Core.Common/Helper/ConsoleHelper.cs | 2 +- .../ServiceExtensions/AppConfigSetup.cs | 16 +++++++++-- .../ServiceExtensions/SqlsugarSetup.cs | 28 +++++++++++++++---- .../Controller_Test/BlogController_Should.cs | 2 +- Blog.Core.Tests/appsettings.json | 8 +++++- 8 files changed, 56 insertions(+), 18 deletions(-) diff --git a/Blog.Core.Api/Blog.Core.xml b/Blog.Core.Api/Blog.Core.xml index e22a384..a510a92 100644 --- a/Blog.Core.Api/Blog.Core.xml +++ b/Blog.Core.Api/Blog.Core.xml @@ -9,12 +9,12 @@ 博客管理 - + 构造函数 - + diff --git a/Blog.Core.Api/Controllers/BlogController.cs b/Blog.Core.Api/Controllers/BlogController.cs index 0eed83d..a784187 100644 --- a/Blog.Core.Api/Controllers/BlogController.cs +++ b/Blog.Core.Api/Controllers/BlogController.cs @@ -30,9 +30,9 @@ namespace Blog.Core.Controllers /// /// 构造函数 /// - /// /// - public BlogController(IBlogArticleServices blogArticleServices, ILogger logger) + /// + public BlogController(ILogger logger) { _logger = logger; } @@ -57,8 +57,6 @@ namespace Blog.Core.Controllers Expression> whereExpression = a => (a.bcategory == bcategory && a.IsDeleted == false) && ((a.btitle != null && a.btitle.Contains(key)) || (a.bcontent != null && a.bcontent.Contains(key))); - var testId = await _blogArticleServices.GetBlogDetails(1); - var pageModelBlog = await _blogArticleServices.QueryPage(whereExpression, page, intPageSize, " bID desc "); using (MiniProfiler.Current.Step("获取成功后,开始处理最终数据")) diff --git a/Blog.Core.Api/appsettings.json b/Blog.Core.Api/appsettings.json index 4e3e6ba..ec80e8a 100644 --- a/Blog.Core.Api/appsettings.json +++ b/Blog.Core.Api/appsettings.json @@ -50,7 +50,13 @@ "Enabled": false }, "SqlAOP": { - "Enabled": false + "Enabled": true, + "OutToLogFile": { + "Enabled": false + }, + "OutToConsole": { + "Enabled": true + } }, "Date": "2018-08-28", "SeedDBEnabled": true, //只生成表结构 diff --git a/Blog.Core.Common/Helper/ConsoleHelper.cs b/Blog.Core.Common/Helper/ConsoleHelper.cs index ce953b6..f0faef5 100644 --- a/Blog.Core.Common/Helper/ConsoleHelper.cs +++ b/Blog.Core.Common/Helper/ConsoleHelper.cs @@ -4,7 +4,7 @@ namespace Blog.Core.Common.Helper { public static class ConsoleHelper { - static void WriteColorLine(string str, ConsoleColor color) + public static void WriteColorLine(string str, ConsoleColor color) { ConsoleColor currentForeColor = Console.ForegroundColor; Console.ForegroundColor = color; diff --git a/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs b/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs index 7da1092..8378853 100644 --- a/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs +++ b/Blog.Core.Extensions/ServiceExtensions/AppConfigSetup.cs @@ -90,13 +90,23 @@ namespace Blog.Core.Extensions } // 数据库Sql执行AOP - if (!Appsettings.app(new string[] { "AppSettings", "SqlAOP", "Enabled" }).ObjToBool()) + if (!Appsettings.app(new string[] { "AppSettings", "SqlAOP", "OutToLogFile", "Enabled" }).ObjToBool()) { - Console.WriteLine($"DB Sql AOP: False"); + Console.WriteLine($"DB Sql AOP To LogFile: False"); } else { - ConsoleHelper.WriteSuccessLine($"DB Sql AOP: True"); + ConsoleHelper.WriteSuccessLine($"DB Sql AOP To LogFile: True"); + } + + // Sql执行日志输出到控制台 + if (!Appsettings.app(new string[] { "AppSettings", "SqlAOP", "OutToConsole", "Enabled" }).ObjToBool()) + { + Console.WriteLine($"DB Sql AOP To Console: False"); + } + else + { + ConsoleHelper.WriteSuccessLine($"DB Sql AOP To Console: True"); } // SingnalR发送数据 diff --git a/Blog.Core.Extensions/ServiceExtensions/SqlsugarSetup.cs b/Blog.Core.Extensions/ServiceExtensions/SqlsugarSetup.cs index dcbc1d5..799a80d 100644 --- a/Blog.Core.Extensions/ServiceExtensions/SqlsugarSetup.cs +++ b/Blog.Core.Extensions/ServiceExtensions/SqlsugarSetup.cs @@ -1,5 +1,6 @@ using Blog.Core.Common; using Blog.Core.Common.DB; +using Blog.Core.Common.Helper; using Blog.Core.Common.LogHelper; using Microsoft.Extensions.DependencyInjection; using SqlSugar; @@ -54,14 +55,21 @@ namespace Blog.Core.Extensions { if (Appsettings.app(new string[] { "AppSettings", "SqlAOP", "Enabled" }).ObjToBool()) { - Parallel.For(0, 1, e => + if (Appsettings.app(new string[] { "AppSettings", "SqlAOP", "OutToLogFile", "Enabled" }).ObjToBool()) { - MiniProfiler.Current.CustomTiming("SQL:", GetParas(p) + "【SQL语句】:" + sql); - LogLock.OutSql2Log("SqlLog", new string[] { GetParas(p), "【SQL语句】:" + sql }); + Parallel.For(0, 1, e => + { + MiniProfiler.Current.CustomTiming("SQL:", GetParas(p) + "【SQL语句】:" + sql); + LogLock.OutSql2Log("SqlLog", new string[] { GetParas(p), "【SQL语句】:" + sql }); - }); + }); + } + if (Appsettings.app(new string[] { "AppSettings", "SqlAOP", "OutToConsole", "Enabled" }).ObjToBool()) + { + ConsoleHelper.WriteColorLine(string.Join("\r\n", new string[] { "--------", "【SQL语句】:" + GetWholeSql(p, sql) }), ConsoleColor.DarkCyan); + } } - } + }, }, MoreSettings = new ConnMoreSettings() { @@ -89,6 +97,16 @@ namespace Blog.Core.Extensions }); } + private static string GetWholeSql(SugarParameter[] paramArr, string sql) + { + foreach (var param in paramArr) + { + sql.Replace(param.ParameterName, param.Value.ObjToString()); + } + + return sql; + } + private static string GetParas(SugarParameter[] pars) { string key = "【SQL参数】:"; diff --git a/Blog.Core.Tests/Controller_Test/BlogController_Should.cs b/Blog.Core.Tests/Controller_Test/BlogController_Should.cs index a55b293..fce9f39 100644 --- a/Blog.Core.Tests/Controller_Test/BlogController_Should.cs +++ b/Blog.Core.Tests/Controller_Test/BlogController_Should.cs @@ -27,7 +27,7 @@ namespace Blog.Core.Tests var container = dI_Test.DICollections(); blogArticleServices = container.Resolve(); - blogController = new BlogController(blogArticleServices, mockLogger.Object); + blogController = new BlogController(mockLogger.Object); } [Fact] diff --git a/Blog.Core.Tests/appsettings.json b/Blog.Core.Tests/appsettings.json index 29e1176..a1edb35 100644 --- a/Blog.Core.Tests/appsettings.json +++ b/Blog.Core.Tests/appsettings.json @@ -34,7 +34,13 @@ "Enabled": false }, "SqlAOP": { - "Enabled": false + "Enabled": false, + "OutToLogFile": { + "Enabled": false + }, + "OutToConsole": { + "Enabled": false + } }, "Date": "2018-08-28", "SeedDBEnabled": true, //只生成表结构 From 1083817a5c1d744ecc7cc6ffef1ea8602ec5869e Mon Sep 17 00:00:00 2001 From: ansonzhang <3143422472@qq.com> Date: Tue, 8 Jun 2021 11:08:44 +0800 Subject: [PATCH 22/26] Update README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 9a42483..5045ad4 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,19 @@ Blog.Core 开箱即用的企业级前后端分离【 .NET Core5.0 Api + Vue 2.x 如果你喜欢这个项目或者它帮助你, 请给 Star~ 如果你的项目中借鉴了本项目,请稍微说明下[https://github.com/anjoy8/Blog.Core/issues/75](https://github.com/anjoy8/Blog.Core/issues/75),开源不易✨。 +## 贡献者们 +Thanks goes to these wonderful people ([✨](https://github.com/anjoy8/Blog.Core/graphs/contributors)): + + +| [
anjoy8](https://github.com/anjoy8)
💻📖 💡 | [
hudingwen](https://github.com/hudingwen)
💻 👀 | [
binyly ](https://github.com/binyly)
💻 👀 📖 🤔 | [
wuare ](https://github.com/wuare)
💻 🐛 🤔 | [
skang0401 ](https://github.com/skang0401)
📖| [
Jamnine](https://github.com/Jamnine)
💻 🌍| +| :---: | :---: | :---: | :---: | :---: | :---: | +|[
aion1998 ](https://github.com/aion1998)
🐛|[
RLei123 ](https://github.com/RLei123)
💻|[
cluyun ](https://github.com/cluyun)
🌍|[
blue20171027 ](https://github.com/blue20171027)
💻|[
anewboyz ](https://github.com/anewboyz)
💻|[
jxd728 ](https://github.com/jxd728)
🌍| +|[
wmchuang ](https://github.com/wmchuang)
🌍|[
liuzhenyulive ](https://github.com/liuzhenyulive)
💻|[
JsonBy ](https://github.com/JsonBy)
💻 💡 🤔|[
hsxian ](https://github.com/hsxian)
🌍|[
cuno92 ](https://github.com/cuno92)
📖|[
317447880 ](https://github.com/317447880)
💻| + + +This project follows the [all-contributors](https://github.com/anjoy8/Blog.Core/graphs/contributors) specification. +Contributions of any kind are welcome!   From ddaa020d537acb829c88907897a3b2d39141bb92 Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Fri, 11 Jun 2021 10:23:50 +0800 Subject: [PATCH 23/26] Update IPLogMildd.cs --- Blog.Core.Extensions/Middlewares/IPLogMildd.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs index 8716db9..7062d49 100644 --- a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs +++ b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs @@ -20,6 +20,7 @@ namespace Blog.Core.Middlewares ///
private readonly RequestDelegate _next; private readonly IWebHostEnvironment _environment; + private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(IPLogMildd)); /// /// @@ -61,9 +62,20 @@ namespace Blog.Core.Middlewares // LogLock.OutSql2Log("RequestIpInfoLog", new string[] { requestInfo + "," }, false); //}); - // 这种方案也行,用的是Serilog - var logFileName = FileHelper.GetAvailableFileNameWithPrefixOrderSize(_environment.ContentRootPath, "RequestIpInfoLog"); - SerilogServer.WriteLog(logFileName, new string[] { requestInfo + "," }, false); + try + { + var testLogMatchRequestInfo = JsonConvert.DeserializeObject(requestInfo); + if (testLogMatchRequestInfo != null) + { + var logFileName = FileHelper.GetAvailableFileNameWithPrefixOrderSize(_environment.ContentRootPath, "RequestIpInfoLog"); + SerilogServer.WriteLog(logFileName, new string[] { requestInfo + "," }, false); + } + } + catch (Exception e) + { + log.Error(requestInfo + "\r\n" + e.GetBaseException().ToString()); + } + request.Body.Position = 0; } From 70a419faa8eeb7baa2120ecf846153cd089e9d65 Mon Sep 17 00:00:00 2001 From: ansonzhang <3143422472@qq.com> Date: Sat, 12 Jun 2021 12:16:30 +0800 Subject: [PATCH 24/26] Fixed #195 bug --- .../LogHelper/Seri/SerilogServer.cs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs index 36d88c2..249ab8b 100644 --- a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs +++ b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs @@ -1,4 +1,4 @@ -using Serilog; +using Serilog; using Serilog.Events; using Serilog.Sinks.Elasticsearch; using System; @@ -35,17 +35,20 @@ namespace Blog.Core.Common.LogHelper .CreateLogger(); var now = DateTime.Now; - string logContent = String.Join("\r\n", dataParas); - if (IsHeader) + string logJudge = String.Join("-", dataParas); + if (logJudge != null && logJudge.Length > 20) { - logContent = ( - "--------------------------------\r\n" + - DateTime.Now + "|\r\n" + - String.Join("\r\n", dataParas) + "\r\n" - ); + string logContent = String.Join("\r\n", dataParas); + if (IsHeader) + { + logContent = ( + "--------------------------------\r\n" + + DateTime.Now + "|\r\n" + + String.Join("\r\n", dataParas) + "\r\n" + ); + } + Log.Information(logContent); } - - Log.Information(logContent); Log.CloseAndFlush(); } /// @@ -65,4 +68,4 @@ namespace Blog.Core.Common.LogHelper Log.CloseAndFlush(); } } -} \ No newline at end of file +} From c94a397ffb9f0fca29c654ce19293f13f51a83f2 Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Fri, 25 Jun 2021 23:44:06 +0800 Subject: [PATCH 25/26] =?UTF-8?q?fix=EF=BC=9Alog=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Blog.Core.Common/Helper/JsonHelper.cs | 394 ++++++++++++++++++ .../LogHelper/Seri/SerilogServer.cs | 19 +- .../Middlewares/IPLogMildd.cs | 2 +- 3 files changed, 410 insertions(+), 5 deletions(-) diff --git a/Blog.Core.Common/Helper/JsonHelper.cs b/Blog.Core.Common/Helper/JsonHelper.cs index baf9b10..352cb8e 100644 --- a/Blog.Core.Common/Helper/JsonHelper.cs +++ b/Blog.Core.Common/Helper/JsonHelper.cs @@ -100,5 +100,399 @@ namespace Blog.Core.Common.Helper return st.ToString(); } + + private static bool IsJsonStart(ref string json) + { + if (!string.IsNullOrEmpty(json)) + { + json = json.Trim('\r', '\n', ' '); + if (json.Length > 1) + { + char s = json[0]; + char e = json[json.Length - 1]; + return (s == '{' && e == '}') || (s == '[' && e == ']'); + } + } + return false; + } + public static bool IsJson(string json) + { + int errIndex; + return IsJson(json, out errIndex); + } + public static bool IsJson(string json, out int errIndex) + { + errIndex = 0; + if (IsJsonStart(ref json)) + { + CharState cs = new CharState(); + char c; + for (int i = 0; i < json.Length; i++) + { + c = json[i]; + if (SetCharState(c, ref cs) && cs.childrenStart)//设置关键符号状态。 + { + string item = json.Substring(i); + int err; + int length = GetValueLength(item, true, out err); + cs.childrenStart = false; + if (err > 0) + { + errIndex = i + err; + return false; + } + i = i + length - 1; + } + if (cs.isError) + { + errIndex = i; + return false; + } + } + + return !cs.arrayStart && !cs.jsonStart; + } + return false; + } + + /// + /// 获取值的长度(当Json值嵌套以"{"或"["开头时) + /// + private static int GetValueLength(string json, bool breakOnErr, out int errIndex) + { + errIndex = 0; + int len = 0; + if (!string.IsNullOrEmpty(json)) + { + CharState cs = new CharState(); + char c; + for (int i = 0; i < json.Length; i++) + { + c = json[i]; + if (!SetCharState(c, ref cs))//设置关键符号状态。 + { + if (!cs.jsonStart && !cs.arrayStart)//json结束,又不是数组,则退出。 + { + break; + } + } + else if (cs.childrenStart)//正常字符,值状态下。 + { + int length = GetValueLength(json.Substring(i), breakOnErr, out errIndex);//递归子值,返回一个长度。。。 + cs.childrenStart = false; + cs.valueStart = 0; + //cs.state = 0; + i = i + length - 1; + } + if (breakOnErr && cs.isError) + { + errIndex = i; + return i; + } + if (!cs.jsonStart && !cs.arrayStart)//记录当前结束位置。 + { + len = i + 1;//长度比索引+1 + break; + } + } + } + return len; + } + + /// + /// 设置字符状态(返回true则为关键词,返回false则当为普通字符处理) + /// + private static bool SetCharState(char c, ref CharState cs) + { + cs.CheckIsError(c); + switch (c) + { + case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] + #region 大括号 + if (cs.keyStart <= 0 && cs.valueStart <= 0) + { + cs.keyStart = 0; + cs.valueStart = 0; + if (cs.jsonStart && cs.state == 1) + { + cs.childrenStart = true; + } + else + { + cs.state = 0; + } + cs.jsonStart = true;//开始。 + return true; + } + #endregion + break; + case '}': + #region 大括号结束 + if (cs.keyStart <= 0 && cs.valueStart < 2 && cs.jsonStart) + { + cs.jsonStart = false;//正常结束。 + cs.state = 0; + cs.keyStart = 0; + cs.valueStart = 0; + cs.setDicValue = true; + return true; + } + // cs.isError = !cs.jsonStart && cs.state == 0; + #endregion + break; + case '[': + #region 中括号开始 + if (!cs.jsonStart) + { + cs.arrayStart = true; + return true; + } + else if (cs.jsonStart && cs.state == 1) + { + cs.childrenStart = true; + return true; + } + #endregion + break; + case ']': + #region 中括号结束 + if (cs.arrayStart && !cs.jsonStart && cs.keyStart <= 2 && cs.valueStart <= 0)//[{},333]//这样结束。 + { + cs.keyStart = 0; + cs.valueStart = 0; + cs.arrayStart = false; + return true; + } + #endregion + break; + case '"': + case '\'': + #region 引号 + if (cs.jsonStart || cs.arrayStart) + { + if (cs.state == 0)//key阶段,有可能是数组["aa",{}] + { + if (cs.keyStart <= 0) + { + cs.keyStart = (c == '"' ? 3 : 2); + return true; + } + else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"')) + { + if (!cs.escapeChar) + { + cs.keyStart = -1; + return true; + } + else + { + cs.escapeChar = false; + } + } + } + else if (cs.state == 1 && cs.jsonStart)//值阶段必须是Json开始了。 + { + if (cs.valueStart <= 0) + { + cs.valueStart = (c == '"' ? 3 : 2); + return true; + } + else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"')) + { + if (!cs.escapeChar) + { + cs.valueStart = -1; + return true; + } + else + { + cs.escapeChar = false; + } + } + + } + } + #endregion + break; + case ':': + #region 冒号 + if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0) + { + if (cs.keyStart == 1) + { + cs.keyStart = -1; + } + cs.state = 1; + return true; + } + // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1); + #endregion + break; + case ',': + #region 逗号 //["aa",{aa:12,}] + + if (cs.jsonStart) + { + if (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1) + { + cs.state = 0; + cs.keyStart = 0; + cs.valueStart = 0; + //if (cs.valueStart == 1) + //{ + // cs.valueStart = 0; + //} + cs.setDicValue = true; + return true; + } + } + else if (cs.arrayStart && cs.keyStart <= 2) + { + cs.keyStart = 0; + //if (cs.keyStart == 1) + //{ + // cs.keyStart = -1; + //} + return true; + } + #endregion + break; + case ' ': + case '\r': + case '\n'://[ "a",\r\n{} ] + case '\0': + case '\t': + if (cs.keyStart <= 0 && cs.valueStart <= 0) //cs.jsonStart && + { + return true;//跳过空格。 + } + break; + default: //值开头。。 + if (c == '\\') //转义符号 + { + if (cs.escapeChar) + { + cs.escapeChar = false; + } + else + { + cs.escapeChar = true; + return true; + } + } + else + { + cs.escapeChar = false; + } + if (cs.jsonStart || cs.arrayStart) // Json 或数组开始了。 + { + if (cs.keyStart <= 0 && cs.state == 0) + { + cs.keyStart = 1;//无引号的 + } + else if (cs.valueStart <= 0 && cs.state == 1 && cs.jsonStart)//只有Json开始才有值。 + { + cs.valueStart = 1;//无引号的 + } + } + break; + } + return false; + } + } + /// + /// 字符状态 + /// + public class CharState + { + internal bool jsonStart = false;//以 "{"开始了... + internal bool setDicValue = false;// 可以设置字典值了。 + internal bool escapeChar = false;//以"\"转义符号开始了 + /// + /// 数组开始【仅第一开头才算】,值嵌套的以【childrenStart】来标识。 + /// + internal bool arrayStart = false;//以"[" 符号开始了 + internal bool childrenStart = false;//子级嵌套开始了。 + /// + /// 【0 初始状态,或 遇到“,”逗号】;【1 遇到“:”冒号】 + /// + internal int state = 0; + + /// + /// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 + /// + internal int keyStart = 0; + /// + /// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 + /// + internal int valueStart = 0; + internal bool isError = false;//是否语法错误。 + + internal void CheckIsError(char c)//只当成一级处理(因为GetLength会递归到每一个子项处理) + { + if (keyStart > 1 || valueStart > 1) + { + return; + } + //示例 ["aa",{"bbbb":123,"fff","ddd"}] + switch (c) + { + case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] + isError = jsonStart && state == 0;//重复开始错误 同时不是值处理。 + break; + case '}': + isError = !jsonStart || (keyStart != 0 && state == 0);//重复结束错误 或者 提前结束{"aa"}。正常的有{} + break; + case '[': + isError = arrayStart && state == 0;//重复开始错误 + break; + case ']': + isError = !arrayStart || jsonStart;//重复开始错误 或者 Json 未结束 + break; + case '"': + case '\'': + isError = !(jsonStart || arrayStart); //json 或数组开始。 + if (!isError) + { + //重复开始 [""",{"" "}] + isError = (state == 0 && keyStart == -1) || (state == 1 && valueStart == -1); + } + if (!isError && arrayStart && !jsonStart && c == '\'')//['aa',{}] + { + isError = true; + } + break; + case ':': + isError = !jsonStart || state == 1;//重复出现。 + break; + case ',': + isError = !(jsonStart || arrayStart); //json 或数组开始。 + if (!isError) + { + if (jsonStart) + { + isError = state == 0 || (state == 1 && valueStart > 1);//重复出现。 + } + else if (arrayStart)//["aa,] [,] [{},{}] + { + isError = keyStart == 0 && !setDicValue; + } + } + break; + case ' ': + case '\r': + case '\n'://[ "a",\r\n{} ] + case '\0': + case '\t': + break; + default: //值开头。。 + isError = (!jsonStart && !arrayStart) || (state == 0 && keyStart == -1) || (valueStart == -1 && state == 1);// + break; + } + //if (isError) + //{ + + //} + } } } diff --git a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs index 249ab8b..7cf8718 100644 --- a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs +++ b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs @@ -1,3 +1,4 @@ +using Blog.Core.Common.Helper; using Serilog; using Serilog.Events; using Serilog.Sinks.Elasticsearch; @@ -14,7 +15,7 @@ namespace Blog.Core.Common.LogHelper /// /// /// - public static void WriteLog(string filename, string[] dataParas, bool IsHeader = true, string defaultFolder = "") + public static void WriteLog(string filename, string[] dataParas, bool IsHeader = true, string defaultFolder = "", bool isJudgeJsonFormat = false) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() @@ -35,10 +36,16 @@ namespace Blog.Core.Common.LogHelper .CreateLogger(); var now = DateTime.Now; - string logJudge = String.Join("-", dataParas); - if (logJudge != null && logJudge.Length > 20) + string logContent = String.Join("\r\n", dataParas); + var isJsonFormat = true; + if (isJudgeJsonFormat) + { + var judCont = logContent.Substring(0, logContent.LastIndexOf(",")); + isJsonFormat = JsonHelper.IsJson(judCont); + } + + if (isJsonFormat) { - string logContent = String.Join("\r\n", dataParas); if (IsHeader) { logContent = ( @@ -49,6 +56,10 @@ namespace Blog.Core.Common.LogHelper } Log.Information(logContent); } + else + { + ConsoleHelper.WriteErrorLine(logContent + now.ObjToString()); + } Log.CloseAndFlush(); } /// diff --git a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs index 7062d49..0879166 100644 --- a/Blog.Core.Extensions/Middlewares/IPLogMildd.cs +++ b/Blog.Core.Extensions/Middlewares/IPLogMildd.cs @@ -68,7 +68,7 @@ namespace Blog.Core.Middlewares if (testLogMatchRequestInfo != null) { var logFileName = FileHelper.GetAvailableFileNameWithPrefixOrderSize(_environment.ContentRootPath, "RequestIpInfoLog"); - SerilogServer.WriteLog(logFileName, new string[] { requestInfo + "," }, false); + SerilogServer.WriteLog(logFileName, new string[] { requestInfo + "," }, false, "", true); } } catch (Exception e) From eb7043894e983b9036ce8cbd8094631b034d7673 Mon Sep 17 00:00:00 2001 From: anjoy8 <3143422472@qq.com> Date: Mon, 28 Jun 2021 10:36:33 +0800 Subject: [PATCH 26/26] Update SerilogServer.cs --- Blog.Core.Common/LogHelper/Seri/SerilogServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs index 7cf8718..fcdbfd8 100644 --- a/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs +++ b/Blog.Core.Common/LogHelper/Seri/SerilogServer.cs @@ -58,7 +58,7 @@ namespace Blog.Core.Common.LogHelper } else { - ConsoleHelper.WriteErrorLine(logContent + now.ObjToString()); + Console.WriteLine("【JSON格式异常:】"+logContent + now.ObjToString()); } Log.CloseAndFlush(); }