Преглед изворни кода

Merge commit 'refs/pull/292/head' of https://gitee.com/zuohuaijun/Admin.NET into next

zuohuaijun пре 3 година
родитељ
комит
04e31f2e27

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

@@ -24,6 +24,7 @@
     <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="3.2.0" />
     <PackageReference Include="Furion.Pure" Version="3.2.0" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.6.4" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.5" />
     <PackageReference Include="MySql.Data" Version="8.0.29" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.5" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.13.0" />

+ 28 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -2350,6 +2350,34 @@
             logo显示
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.NewtonsoftJsonSerializerProvider">
+            <summary>
+            自定义序列化提供器Newtonsoft
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.NewtonsoftJsonSerializerProvider.Serialize(System.Object,System.Object)">
+            <summary>        
+            序列化对象        
+            </summary>        
+            <param name="value"></param>        
+            <param name="jsonSerializerOptions"></param>        
+            <returns></returns>        
+        </member>
+        <member name="M:Admin.NET.Core.NewtonsoftJsonSerializerProvider.Deserialize``1(System.String,System.Object)">
+            <summary>        
+            反序列化字符串        
+            </summary>        
+            <typeparam name="T"></typeparam>        
+            <param name="json"></param>        
+            <param name="jsonSerializerOptions"></param>        
+            <returns></returns>        
+        </member>
+        <member name="M:Admin.NET.Core.NewtonsoftJsonSerializerProvider.GetSerializerOptions">
+            <summary>        
+            返回读取全局配置的 JSON 选项        
+            </summary>        
+            <returns></returns>        
+        </member>
         <member name="T:Admin.NET.Core.ObjectExtension">
             <summary>
             对象拓展类

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

@@ -39,7 +39,7 @@
     "WorkerId": 5 // 取值范围0~63,默认1
   },
   "Upload": {
-    "Path": "Upload",
+    "Path": "upload/{yyyy}/{MM}/{dd}", //文件上传目录
     "MaxSize": 1048576,
     "ContentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif", "image/bmp", "text/plain", "application/pdf", "application/msword", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ]
   },

+ 44 - 0
Admin.NET/Admin.NET.Core/Extension/NewtonsoftJsonSerializerProvider .cs

@@ -0,0 +1,44 @@
+using Furion;
+using Furion.DependencyInjection;
+using Furion.JsonSerialization;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+
+namespace Admin.NET.Core
+{
+    /// <summary>
+    /// 自定义序列化提供器Newtonsoft
+    /// </summary>
+    public class NewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ISingleton
+    {
+        /// <summary>        
+        /// 序列化对象        
+        /// </summary>        
+        /// <param name="value"></param>        
+        /// <param name="jsonSerializerOptions"></param>        
+        /// <returns></returns>        
+        public string Serialize(object value, object jsonSerializerOptions = null)
+        {
+            return JsonConvert.SerializeObject(value, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings);
+        }
+        /// <summary>        
+        /// 反序列化字符串        
+        /// </summary>        
+        /// <typeparam name="T"></typeparam>        
+        /// <param name="json"></param>        
+        /// <param name="jsonSerializerOptions"></param>        
+        /// <returns></returns>        
+        public T Deserialize<T>(string json, object jsonSerializerOptions = null)
+        {
+            return JsonConvert.DeserializeObject<T>(json, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings);
+        }
+        /// <summary>        
+        /// 返回读取全局配置的 JSON 选项        
+        /// </summary>        
+        /// <returns></returns>        
+        public object GetSerializerOptions()
+        {
+            return App.GetOptions<MvcNewtonsoftJsonOptions>()?.SerializerSettings;
+        }
+    }
+}

+ 7 - 0
Admin.NET/Admin.NET.Core/Filter/RequestActionFilter.cs

@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Controllers;
 using Microsoft.AspNetCore.Mvc.Filters;
 using System.Diagnostics;
+using System.Linq;
 using System.Security.Claims;
 using System.Threading.Tasks;
 using UAParser;
@@ -27,6 +28,12 @@ namespace Admin.NET.Core
 
         public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
         {
+            //判断是否需有禁用操作日志属性
+            if (context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(NotLogAttribute)))
+            {
+                await next();
+                return;
+            }
             var sw = new Stopwatch();
             sw.Start();
             var actionContext = await next();

+ 11 - 1
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -8,10 +8,13 @@ using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using OnceMi.AspNetCore.OSS;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.IO;
+using System.Linq;
 using System.Text;
+using System.Text.RegularExpressions;
 using System.Threading.Tasks;
 using System.Web;
 
@@ -160,7 +163,14 @@ namespace Admin.NET.Core.Service
         {
             if (file == null) throw Oops.Oh(ErrorCodeEnum.D8000);
 
-            string path = _uploadOptions.Path;
+            var path = _uploadOptions.Path;
+            Regex reg = new Regex(@"(\{.+?})");
+            var match = reg.Matches(path);
+            match.ToList().ForEach(a =>
+            {
+                var str = DateTime.Now.ToString(a.ToString().Substring(1, a.Length - 2));
+                path = path.Replace(a.ToString(), str);
+            });
 
             if (!_uploadOptions.ContentType.Contains(file.ContentType))
                 throw Oops.Oh(ErrorCodeEnum.D8001);

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/log/SysExLogService.cs

@@ -24,6 +24,7 @@ namespace Admin.NET.Core.Service
         /// </summary>
         /// <returns></returns>
         [HttpGet("/sysExLog/pageList")]
+        [NotLog]
         public async Task<SqlSugarPagedList<SysLogEx>> GetExLogList([FromQuery] PageLogInput input)
         {
             return await _sysExLogRep.AsQueryable()

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/log/SysOpLogService.cs

@@ -24,6 +24,7 @@ namespace Admin.NET.Core.Service
         /// </summary>
         /// <returns></returns>
         [HttpGet("/sysOpLog/pageList")]
+        [NotLog]
         public async Task<SqlSugarPagedList<SysLogOp>> GetOpLogList([FromQuery] PageLogInput input)
         {
             return await _sysOpLogRep.AsQueryable()

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/log/SysVisLogService.cs

@@ -24,6 +24,7 @@ namespace Admin.NET.Core.Service
         /// </summary>
         /// <returns></returns>
         [HttpGet("/sysVisLog/pageList")]
+        [NotLog]
         public async Task<SqlSugarPagedList<SysLogVis>> GetVisLogList([FromQuery] PageLogInput input)
         {
             return await _sysVisLogRep.AsQueryable()

+ 14 - 7
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -77,16 +77,23 @@ namespace Admin.NET.Core
                         // 打印SQL语句
                         dbProvider.Aop.OnLogExecuting = (sql, pars) =>
                         {
-                            if (sql.StartsWith("SELECT"))
-                                Console.ForegroundColor = ConsoleColor.Green;
-                            if (sql.StartsWith("UPDATE") || sql.StartsWith("INSERT"))
-                                Console.ForegroundColor = ConsoleColor.White;
-                            if (sql.StartsWith("DELETE"))
-                                Console.ForegroundColor = ConsoleColor.Blue;
+                            //if (sql.StartsWith("SELECT"))
+                            //    Console.ForegroundColor = ConsoleColor.Green;
+                            //if (sql.StartsWith("UPDATE") || sql.StartsWith("INSERT"))
+                            //    Console.ForegroundColor = ConsoleColor.White;
+                            //if (sql.StartsWith("DELETE"))
+                            //    Console.ForegroundColor = ConsoleColor.Blue;
 
-                            Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
+                            //Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                             App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                         };
+                        dbProvider.Aop.OnError = (ex) =>
+                        {
+                            Console.ForegroundColor = ConsoleColor.Red;
+                            var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value));
+                            Console.WriteLine($"{ex.Message}{Environment.NewLine}{ex.Sql}{Environment.NewLine}{pars}{Environment.NewLine}");
+                            App.PrintToMiniProfiler("SqlSugar", "Error", $"{ex.Message}{Environment.NewLine}{ex.Sql}{pars}{Environment.NewLine}");
+                        };
 
                         // 数据审计
                         dbProvider.Aop.DataExecuting = (oldValue, entityInfo) =>

+ 2 - 2
Admin.NET/Admin.NET.Core/Util/AdminResultProvider.cs

@@ -93,7 +93,7 @@ namespace Admin.NET.Core
             return new AdminResult<object>
             {
                 Code = statusCode,
-                Message = JSON.Serialize(errors),
+                Message = errors,
                 Result = data,
                 Type = succeeded ? "success" : "error",
                 Extras = UnifyContext.Take(),
@@ -121,7 +121,7 @@ namespace Admin.NET.Core
         /// <summary>
         /// 错误信息
         /// </summary>
-        public string Message { get; set; }
+        public object Message { get; set; }
 
         /// <summary>
         /// 数据

+ 14 - 10
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -4,6 +4,8 @@ using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
 using OnceMi.AspNetCore.OSS;
 using Serilog;
 using System.Text.Encodings.Web;
@@ -38,16 +40,18 @@ namespace Admin.NET.Web.Core
             services.AddTaskScheduler();
 
             services.AddControllersWithViews()
-                .AddMvcFilter<RequestActionFilter>()
-                .AddJsonOptions(options =>
-                {
-                    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 响应驼峰命名
-                    options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 忽略大小写
-                    options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; // 忽略循环引用
-                    options.JsonSerializerOptions.Converters.AddDateFormatString("yyyy-MM-dd HH:mm:ss"); // 时间格式化
-                    options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); // 中文编码
-                })
-                .AddInjectWithUnifyResult<AdminResultProvider>();
+               .AddMvcFilter<RequestActionFilter>()
+               .AddNewtonsoftJson(options =>
+               {
+                    // 首字母小写(驼峰样式)
+                   options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
+                    // 时间格式化
+                   options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
+                    // 忽略循环引用
+                   options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
+                    // 忽略空值
+                    // options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
+               }).AddInjectWithUnifyResult<AdminResultProvider>();
 
             // 注册日志事件订阅者(支持自定义消息队列组件)
             services.AddEventBus(builder =>

+ 1 - 1
Vben2/index.html

@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html lang="en" id="htmlRoot">
+<html lang="zh-CN" id="htmlRoot">
   <head>
     <meta charset="UTF-8" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />

+ 4 - 4
Vben2/src/api/sys/upload.ts

@@ -3,7 +3,7 @@ import { defHttp } from '/@/utils/http/axios';
 import { UploadFileParams } from '/#/axios';
 import { useGlobSetting } from '/@/hooks/setting';
 
-const { uploadUrl = '' } = useGlobSetting();
+const { apiUrl = '' } = useGlobSetting();
 
 /**
  * @description: Upload interface
@@ -14,7 +14,7 @@ export function uploadApi(
 ) {
   return defHttp.uploadFile<UploadApiResult>(
     {
-      url: uploadUrl,
+      url: apiUrl,
       onUploadProgress,
     },
     params,
@@ -28,7 +28,7 @@ export function uploadFileApi(
 ) {
   return defHttp.uploadFile<UploadApiResult>(
     {
-      url: uploadUrl + '/sysFile/upload',
+      url: apiUrl + '/sysFile/upload',
       onUploadProgress,
     },
     params,
@@ -42,7 +42,7 @@ export function uploadFileApi_sign(
 ) {
   return defHttp.uploadFile<UploadApiResult>(
     {
-      url: uploadUrl + '/personSign/import',
+      url: apiUrl + '/personSign/import',
       onUploadProgress,
     },
     params,

+ 1 - 1
Vben2/src/utils/http/axios/index.ts

@@ -238,7 +238,7 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
           // 接口拼接地址
           urlPrefix: urlPrefix,
           //  是否加入时间戳
-          joinTime: true,
+          joinTime: false,
           // 忽略重复请求
           ignoreCancelToken: true,
           // 是否携带token