瀏覽代碼

更新1.1.1版本

xiaoxue 5 年之前
父節點
當前提交
be23072f6b
共有 78 個文件被更改,包括 904 次插入387 次删除
  1. 1 0
      Admin.Core.Common/Admin.Core.Common.csproj
  2. 16 0
      Admin.Core.Common/Configs/AppConfig.cs
  3. 9 37
      Admin.Core.Common/Configs/UploadConfig.cs
  4. 54 0
      Admin.Core.Common/Extensions/EnumExtensions.cs
  5. 1 1
      Admin.Core.Common/Extensions/GuidExtensions.cs
  6. 1 1
      Admin.Core.Common/Extensions/MethodInfoExtensions.cs
  7. 8 0
      Admin.Core.Common/Extensions/StringExtensions.cs
  8. 77 0
      Admin.Core.Common/Files/FileInfo.cs
  9. 81 0
      Admin.Core.Common/Files/FileSize.cs
  10. 31 0
      Admin.Core.Common/Files/FileSizeUnit.cs
  11. 29 0
      Admin.Core.Common/Helpers/StringHelper.cs
  12. 86 0
      Admin.Core.Common/Helpers/UploadHelper.cs
  13. 20 1
      Admin.Core.Common/Helpers/UtilConvert.cs
  14. 13 4
      Admin.Core.Common/Helpers/VerifyCodeHelper.cs
  15. 2 2
      Admin.Core.Common/Input/PageInput.cs
  16. 3 3
      Admin.Core.Common/Output/IResponseOutput.cs
  17. 28 0
      Admin.Core.Common/Output/OptionOutput.cs
  18. 2 2
      Admin.Core.Common/Output/PageOutput.cs
  19. 3 3
      Admin.Core.Common/Output/ResponseOutput.cs
  20. 24 0
      Admin.Core.Model/Admin/DocumentImageEntity.cs
  21. 13 0
      Admin.Core.Repository/Admin/DocumentImage/DocumentImageRepository.cs
  22. 9 0
      Admin.Core.Repository/Admin/DocumentImage/IDocumentImageRepository.cs
  23. 2 2
      Admin.Core.Services/Admin/Api/ApiService.cs
  24. 2 2
      Admin.Core.Services/Admin/Api/IApiService.cs
  25. 5 2
      Admin.Core.Services/Admin/Auth/AuthService.cs
  26. 1 1
      Admin.Core.Services/Admin/Auth/IAuthService.cs
  27. 1 1
      Admin.Core.Services/Admin/Cache/CacheService.cs
  28. 1 1
      Admin.Core.Services/Admin/Cache/ICacheService.cs
  29. 2 2
      Admin.Core.Services/Admin/Dictionary/DictionaryService.cs
  30. 2 2
      Admin.Core.Services/Admin/Dictionary/IDictionaryService.cs
  31. 43 25
      Admin.Core.Services/Admin/Document/DocumentService.cs
  32. 5 1
      Admin.Core.Services/Admin/Document/IDocumentService.cs
  33. 15 0
      Admin.Core.Services/Admin/Document/Input/DocumentAddImageInput.cs
  34. 5 0
      Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs
  35. 17 0
      Admin.Core.Services/Admin/Document/Input/DocumentUploadImageInput.cs
  36. 21 1
      Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs
  37. 1 0
      Admin.Core.Services/Admin/Document/_MapConfig.cs
  38. 2 2
      Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs
  39. 2 2
      Admin.Core.Services/Admin/LoginLog/LoginLogService.cs
  40. 2 2
      Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs
  41. 2 2
      Admin.Core.Services/Admin/OprationLog/OprationLogService.cs
  42. 1 1
      Admin.Core.Services/Admin/Permission/IPermissionService.cs
  43. 1 1
      Admin.Core.Services/Admin/Permission/PermissionService.cs
  44. 2 2
      Admin.Core.Services/Admin/Role/IRoleService.cs
  45. 2 2
      Admin.Core.Services/Admin/Role/RoleService.cs
  46. 2 2
      Admin.Core.Services/Admin/User/IUserService.cs
  47. 3 3
      Admin.Core.Services/Admin/User/UserService.cs
  48. 2 2
      Admin.Core.Services/Admin/View/IViewService.cs
  49. 2 2
      Admin.Core.Services/Admin/View/ViewService.cs
  50. 1 1
      Admin.Core.Tests/Controller.Tests/ApiTest.cs
  51. 15 149
      Admin.Core/Admin.Core.Model.xml
  52. 46 1
      Admin.Core/Admin.Core.Service.xml
  53. 21 7
      Admin.Core/Admin.Core.xml
  54. 7 3
      Admin.Core/Aop/AopHelper.cs
  55. 31 5
      Admin.Core/Aop/TransactionInterceptor.cs
  56. 1 1
      Admin.Core/Attributes/ValidateInputAttribute.cs
  57. 3 2
      Admin.Core/Auth/ResponseAuthenticationHandler.cs
  58. 2 2
      Admin.Core/Controllers/Admin/ApiController.cs
  59. 1 1
      Admin.Core/Controllers/Admin/AuthController.cs
  60. 1 1
      Admin.Core/Controllers/Admin/CacheController.cs
  61. 2 2
      Admin.Core/Controllers/Admin/DictionaryController.cs
  62. 49 2
      Admin.Core/Controllers/Admin/DocumentController.cs
  63. 17 51
      Admin.Core/Controllers/Admin/ImgController.cs
  64. 2 2
      Admin.Core/Controllers/Admin/LoginLogController.cs
  65. 2 2
      Admin.Core/Controllers/Admin/OprationLogController.cs
  66. 1 1
      Admin.Core/Controllers/Admin/PermissionController.cs
  67. 2 2
      Admin.Core/Controllers/Admin/RoleController.cs
  68. 2 2
      Admin.Core/Controllers/Admin/UserController.cs
  69. 2 2
      Admin.Core/Controllers/Admin/ViewController.cs
  70. 0 0
      Admin.Core/Db/Data/data.json
  71. 4 4
      Admin.Core/Db/DbHelper.cs
  72. 7 7
      Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs
  73. 3 2
      Admin.Core/Filters/AdminExceptionFilter.cs
  74. 1 1
      Admin.Core/Logs/ApiHelper.cs
  75. 1 1
      Admin.Core/Logs/LogHandler.cs
  76. 7 3
      Admin.Core/configs/appconfig.json
  77. 1 0
      Admin.Core/configs/dbconfig.json
  78. 15 13
      Admin.Core/configs/uploadconfig.json

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

@@ -9,6 +9,7 @@
     <PackageReference Include="FreeSql" Version="1.4.0" />
     <PackageReference Include="FreeSql.Provider.MySql" Version="1.4.0" />
     <PackageReference Include="FreeSql.Provider.Oracle" Version="1.4.0" />
+    <PackageReference Include="FreeSql.Provider.PostgreSQL" Version="1.4.0" />
     <PackageReference Include="FreeSql.Provider.Sqlite" Version="1.4.0" />
     <PackageReference Include="FreeSql.Provider.SqlServer" Version="1.4.0" />
     <PackageReference Include="FreeSql.Repository" Version="1.4.0" />

+ 16 - 0
Admin.Core.Common/Configs/AppConfig.cs

@@ -24,6 +24,11 @@
         /// 日志配置
         /// </summary>
         public LogConfig Log { get; set; }
+
+        /// <summary>
+        /// 验证码配置
+        /// </summary>
+        public VarifyCodeConfig VarifyCode { get; set; }
     }
 
     /// <summary>
@@ -47,4 +52,15 @@
         /// </summary>
         public bool Operation { get; set; }
     }
+
+    /// <summary>
+    /// 验证码配置
+    /// </summary>
+    public class VarifyCodeConfig
+    {
+        /// <summary>
+        /// 操作日志
+        /// </summary>
+        public string[] Font { get; set; }
+    }
 }

+ 9 - 37
Admin.Core.Common/Configs/UploadConfig.cs

@@ -5,54 +5,26 @@
     /// </summary>
     public class UploadConfig
     {
-        public AvatarConfig Avatar { get; set; }
-        public AvatarConfig Document { get; set; }
-    }
-
-    /// <summary>
-    /// 头像配置
-    /// </summary>
-    public class AvatarConfig
-    {
-        /// <summary>
-        /// 路径
-        /// </summary>
-        public string Path { get; set; }
-
         /// <summary>
-        /// 请求路径
+        /// 头像上传配置
         /// </summary>
-        public string RequestPath { get; set; }
+        public FileUploadConfig Avatar { get; set; }
 
         /// <summary>
-        /// 路径格式
+        /// 文档图片上传配置
         /// </summary>
-        public string Format { get; set; }
-        /// <summary>
-        /// 路径日期格式
-        /// </summary>
-        public string DateTimeFormat { get; set; }
-
-        /// <summary>
-        /// 图片大小 1M = 1024 * 1024
-        /// </summary>
-        public long Size { get; set; }
-
-        /// <summary>
-        /// 图片格式
-        /// </summary>
-        public string[] ContentType { get; set; }
+        public FileUploadConfig Document { get; set; }
     }
 
     /// <summary>
-    /// 文配置
+    /// 文件上传配置
     /// </summary>
-    public class DocumentConfig
+    public class FileUploadConfig
     {
         /// <summary>
-        /// 路径
+        /// 上传路径
         /// </summary>
-        public string Path { get; set; }
+        public string UploadPath { get; set; }
 
         /// <summary>
         /// 请求路径
@@ -72,7 +44,7 @@
         /// <summary>
         /// 文件大小 10M = 10 * 1024 * 1024
         /// </summary>
-        public long Size { get; set; }
+        public long MaxSize { get; set; }
 
         /// <summary>
         /// 最大允许上传个数 -1不限制

+ 54 - 0
Admin.Core.Common/Extensions/EnumExtensions.cs

@@ -0,0 +1,54 @@
+using Admin.Core.Common.Output;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Reflection;
+
+namespace Admin.Core.Common.Extensions
+{
+    public static class EnumExtensions
+    {
+        public static string ToDescription(this Enum item)
+        {
+            string name = item.ToString();
+            var desc = item.GetType().GetField(name)?.GetCustomAttribute<DescriptionAttribute>();
+            return desc?.Description ?? name;
+        }
+
+        public static long ToInt64(this Enum item)
+        {
+            return Convert.ToInt64(item);
+        }
+
+        public static List<OptionOutput> ToList(this Enum value, bool ignoreUnKnown = false)
+        {
+            var enumType = value.GetType();
+
+            if (!enumType.IsEnum)
+                return null;
+
+            return Enum.GetValues(enumType).Cast<Enum>()
+                .Where(m => !ignoreUnKnown || !m.ToString().Equals("UnKnown")).Select(x => new OptionOutput
+                {
+                    Label = x.ToDescription(),
+                    Value = x
+                }).ToList();
+        }
+
+        public static List<OptionOutput> ToList<T>(bool ignoreUnKnown = false)
+        {
+            var enumType = typeof(T);
+
+            if (!enumType.IsEnum)
+                return null;
+
+            return Enum.GetValues(enumType).Cast<Enum>()
+                 .Where(m => !ignoreUnKnown || !m.ToString().Equals("UnKnown")).Select(x => new OptionOutput
+                 {
+                     Label = x.ToDescription(),
+                     Value = x
+                 }).ToList();
+        }
+    }
+}

+ 1 - 1
Admin.Core.Common/Extensions/GuidExtensions.cs

@@ -1,6 +1,6 @@
 using System;
 
-namespace Admin.Core.Extensions
+namespace Admin.Core.Common.Extensions
 {
     public static class GuidExtensions
     {

+ 1 - 1
Admin.Core.Common/Extensions/MethodInfoExtensions.cs

@@ -3,7 +3,7 @@ using System.Linq;
 using System.Reflection;
 using System.Threading.Tasks;
 
-namespace Admin.Core.Extensions
+namespace Admin.Core.Common.Extensions
 {
     public static class MethodInfoExtensions
     {

+ 8 - 0
Admin.Core.Common/Extensions/StringExtensions.cs

@@ -89,5 +89,13 @@ namespace Admin.Core
             var bytes = encoding.GetBytes(s);
             return bytes.ToBase64();
         }
+
+        public static string ToPath(this string s)
+        {
+            if (s.IsNull())
+                return string.Empty;
+
+            return s.Replace(@"\", "/");
+        }
     }
 }

+ 77 - 0
Admin.Core.Common/Files/FileInfo.cs

@@ -0,0 +1,77 @@
+namespace Admin.Core.Common.Files
+{
+    /// <summary>
+    /// 文件信息
+    /// </summary>
+    public class FileInfo
+    {
+        public FileInfo() { }
+
+        /// <summary>
+        /// 初始化文件信息
+        /// </summary>
+        /// <param name="fileName">文件名称</param>
+        /// <param name="size">大小</param>
+        public FileInfo(string fileName, long size = 0L)
+        {
+            FileName = fileName;
+            Size = new FileSize(size);
+            Extension = System.IO.Path.GetExtension(FileName)?.TrimStart('.');
+        }
+
+        /// <summary>
+        /// 上传路径
+        /// </summary>
+        public string UploadPath { get; set; }
+
+        /// <summary>
+        /// 相对路径
+        /// </summary>
+        public string RelativePath { get; set; }
+
+        /// <summary>
+        /// 文件名
+        /// </summary>
+        public string FileName { get; set; }
+
+        /// <summary>
+        /// 保存名
+        /// </summary>
+        public string SaveName { get; set; }
+
+        /// <summary>
+        /// 文件大小
+        /// </summary>
+        public FileSize Size { get; set; }
+
+        /// <summary>
+        /// 扩展名
+        /// </summary>
+        public string Extension { get; set; }
+
+        /// <summary>
+        /// 请求路径
+        /// </summary>
+        public string RequestPath { get; set; }
+
+        /// <summary>
+        /// 文件请求路径
+        /// </summary>
+        public string FileRequestPath => System.IO.Path.Combine(RequestPath, RelativePath, SaveName).ToPath();
+
+        /// <summary>
+        /// 文件相对路径
+        /// </summary>
+        public string FileRelativePath => System.IO.Path.Combine(RelativePath, SaveName).ToPath();
+
+        /// <summary>
+        /// 文件目录
+        /// </summary>
+        public string FileDirectory => System.IO.Path.Combine(UploadPath, RelativePath).ToPath();
+
+        /// <summary>
+        /// 文件路径
+        /// </summary>
+        public string FilePath => System.IO.Path.Combine(UploadPath, RelativePath, SaveName).ToPath();
+    }
+}

+ 81 - 0
Admin.Core.Common/Files/FileSize.cs

@@ -0,0 +1,81 @@
+using Admin.Core.Common.Extensions;
+
+namespace Admin.Core.Common.Files
+{
+    /// <summary>
+    /// 文件大小
+    /// </summary>
+    public struct FileSize
+    {
+        /// <summary>
+        /// 初始化文件大小
+        /// </summary>
+        /// <param name="size">文件大小</param>
+        /// <param name="unit">文件大小单位</param>
+        public FileSize(long size, FileSizeUnit unit = FileSizeUnit.Byte)
+        {
+            switch (unit)
+            {
+                case FileSizeUnit.K:
+                    Size = size * 1024; break;
+                case FileSizeUnit.M:
+                    Size = size * 1024 * 1024; break;
+                case FileSizeUnit.G:
+                    Size = size * 1024 * 1024 * 1024; break;
+                default:
+                    Size = size; break;
+            }
+        }
+
+        /// <summary>
+        /// 文件字节长度
+        /// </summary>
+        public long Size { get; }
+
+        /// <summary>
+        /// 获取文件大小,单位:字节
+        /// </summary>
+        public long GetSize()
+        {
+            return Size;
+        }
+
+        /// <summary>
+        /// 获取文件大小,单位:K
+        /// </summary>
+        public double GetSizeByK()
+        {
+            return (Size / 1024.0).ToDouble(2);
+        }
+
+        /// <summary>
+        /// 获取文件大小,单位:M
+        /// </summary>
+        public double GetSizeByM()
+        {
+            return (Size / 1024.0 / 1024.0).ToDouble(2);
+        }
+
+        /// <summary>
+        /// 获取文件大小,单位:G
+        /// </summary>
+        public double GetSizeByG()
+        {
+            return (Size / 1024.0 / 1024.0 / 1024.0).ToDouble(2);
+        }
+
+        /// <summary>
+        /// 输出描述
+        /// </summary>
+        public override string ToString()
+        {
+            if (Size >= 1024 * 1024 * 1024)
+                return $"{GetSizeByG()} {FileSizeUnit.G.ToDescription()}";
+            if (Size >= 1024 * 1024)
+                return $"{GetSizeByM()} {FileSizeUnit.M.ToDescription()}";
+            if (Size >= 1024)
+                return $"{GetSizeByK()} {FileSizeUnit.K.ToDescription()}";
+            return $"{Size} {FileSizeUnit.Byte.ToDescription()}";
+        }
+    }
+}

+ 31 - 0
Admin.Core.Common/Files/FileSizeUnit.cs

@@ -0,0 +1,31 @@
+using System.ComponentModel;
+
+namespace Admin.Core.Common.Files
+{
+    /// <summary>
+    /// 文件大小单位
+    /// </summary>
+    public enum FileSizeUnit
+    {
+        /// <summary>
+        /// 字节
+        /// </summary>
+        [Description("B")]
+        Byte,
+        /// <summary>
+        /// K字节
+        /// </summary>
+        [Description("KB")]
+        K,
+        /// <summary>
+        /// M字节
+        /// </summary>
+        [Description("MB")]
+        M,
+        /// <summary>
+        /// G字节
+        /// </summary>
+        [Description("GB")]
+        G
+    }
+}

+ 29 - 0
Admin.Core.Common/Helpers/StringHelper.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Text;
+using System.Text.RegularExpressions;
 
 namespace Admin.Core.Common.Helpers
 {
@@ -41,5 +42,33 @@ namespace Admin.Core.Common.Helpers
             }
             return newRandom.ToString();
         }
+
+        public static string Format(string str, object obj)
+        {
+            if (str.IsNull())
+            {
+                return str;
+            }
+            string s = str;
+            if (obj.GetType().Name == "JObject")
+            {
+                foreach (var item in (Newtonsoft.Json.Linq.JObject)obj)
+                {
+                    var k = item.Key.ToString();
+                    var v = item.Value.ToString();
+                    s = Regex.Replace(s, "\\{" + k + "\\}", v, RegexOptions.IgnoreCase);
+                }
+            }
+            else
+            {
+                foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties())
+                {
+                    var xx = p.Name;
+                    var yy = p.GetValue(obj).ToString();
+                    s = Regex.Replace(s, "\\{" + xx + "\\}", yy, RegexOptions.IgnoreCase);
+                }
+            }
+            return s;
+        }
     }
 }

+ 86 - 0
Admin.Core.Common/Helpers/UploadHelper.cs

@@ -0,0 +1,86 @@
+using Admin.Core.Common.Attributes;
+using Admin.Core.Common.Configs;
+using Admin.Core.Common.Output;
+using Microsoft.AspNetCore.Http;
+using System;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using FileInfo = Admin.Core.Common.Files.FileInfo;
+
+namespace Admin.Core.Common.Helpers
+{
+    /// <summary>
+    /// 文件上传帮助类
+    /// </summary>
+    [SingleInstance]
+    public class UploadHelper
+    {
+        /// <summary>
+        /// 上传单文件
+        /// </summary>
+        /// <param name="file"></param>
+        /// <param name="config"></param>
+        /// <param name="args"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<IResponseOutput<FileInfo>> UploadAsync(IFormFile file, FileUploadConfig config, object args, CancellationToken cancellationToken = default)
+        {
+            var res = new ResponseOutput<FileInfo>();
+
+            if (file == null || file.Length < 1)
+            {
+                return res.NotOk("请上传文件!");
+            }
+
+            //格式限制
+            if (!config.ContentType.Contains(file.ContentType))
+            {
+                return res.NotOk("文件格式错误");
+            }
+
+            //大小限制
+            if (!(file.Length <= config.MaxSize))
+            {
+                return res.NotOk("文件过大");
+            }
+
+            var fileInfo = new FileInfo(file.FileName, file.Length)
+            {
+                UploadPath = config.UploadPath,
+                RequestPath = config.RequestPath
+            };
+
+            var dateTimeFormat = config.DateTimeFormat.NotNull() ? DateTime.Now.ToString(config.DateTimeFormat) : "";
+            var format = config.Format.NotNull() ? StringHelper.Format(config.Format, args) : "";
+            fileInfo.RelativePath = Path.Combine(dateTimeFormat, format).ToPath();
+
+            if (!Directory.Exists(fileInfo.FileDirectory))
+            {
+                Directory.CreateDirectory(fileInfo.FileDirectory);
+            }
+
+            fileInfo.SaveName = $"{new Snowfake(0).nextId()}.{fileInfo.Extension}";
+
+            await SaveAsync(file, fileInfo.FilePath, cancellationToken);
+
+            return res.Ok(fileInfo);
+        }
+
+        /// <summary>
+        /// 保存文件
+        /// </summary>
+        /// <param name="file"></param>
+        /// <param name="filePath"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task SaveAsync(IFormFile file, string filePath, CancellationToken cancellationToken = default)
+        {
+            using (var stream = new FileStream(filePath, FileMode.Create))
+            {
+                await file.CopyToAsync(stream, cancellationToken);
+            }
+        }
+    }
+}

+ 20 - 1
Admin.Core.Common/Helpers/UtilConvert.cs

@@ -69,7 +69,26 @@ namespace Admin.Core
             if (thisValue != null) return thisValue.ToString().Trim();
             return errorValue;
         }
-        
+
+        /// <summary>
+        /// 转换成Double/Single
+        /// </summary>
+        /// <param name="s"></param>
+        /// <param name="digits">小数位数</param>
+        /// <returns></returns>
+        public static double ToDouble(this object s, int? digits = null)
+        {
+            if (s == null || s == DBNull.Value)
+                return 0d;
+
+            double.TryParse(s.ToString(), out double result);
+
+            if (digits == null)
+                return result;
+
+            return Math.Round(result, digits.Value);
+        }
+
         public static decimal ToDecimal(this object thisValue)
         {
             decimal reval;

+ 13 - 4
Admin.Core.Common/Helpers/VerifyCodeHelper.cs

@@ -3,12 +3,21 @@ using System.IO;
 using System.Text;
 using System.Drawing;
 using System.Drawing.Imaging;
+using Admin.Core.Common.Attributes;
+using Admin.Core.Common.Configs;
 
 namespace Admin.Core.Common.Helpers
 {
+    [SingleInstance]
     public class VerifyCodeHelper
     {
-        private static string GenerateRandom(int length)
+        private readonly AppConfig _appConfig;
+        public VerifyCodeHelper(AppConfig appConfig)
+        {
+            _appConfig = appConfig;
+        }
+
+        private string GenerateRandom(int length)
         {
             var chars = new StringBuilder();
             //验证码的字符集,去掉了一些容易混淆的字符 
@@ -22,7 +31,7 @@ namespace Admin.Core.Common.Helpers
             return chars.ToString();
         }
 
-        public static byte[] Draw(out string code, int length = 4)
+        public byte[] Draw(out string code, int length = 4)
         {
             int codeW = 110;
             int codeH = 36;
@@ -31,7 +40,7 @@ namespace Admin.Core.Common.Helpers
             //颜色列表,用于验证码、噪线、噪点 
             Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
             //字体列表,用于验证码 
-            string[] font = { "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" };
+            string[] font = _appConfig.VarifyCode.Font;
 
             code = GenerateRandom(length);
 
@@ -73,7 +82,7 @@ namespace Admin.Core.Common.Helpers
             }
         }
 
-        public static string GetBase64String(out string code, int length = 4)
+        public string GetBase64String(out string code, int length = 4)
         {
             return Convert.ToBase64String(Draw(out code, length));
         }

+ 2 - 2
Admin.Core.Model/Input/PageInput.cs → Admin.Core.Common/Input/PageInput.cs

@@ -1,7 +1,7 @@
-namespace Admin.Core.Model.Input
+namespace Admin.Core.Common.Input
 {
     /// <summary>
-    /// 通用分页信息输入
+    /// 分页信息输入
     /// </summary>
     public class PageInput<T>
     {

+ 3 - 3
Admin.Core.Model/Output/IResponseOutput.cs → Admin.Core.Common/Output/IResponseOutput.cs

@@ -1,9 +1,9 @@
 using System.Text.Json.Serialization;
 
-namespace Admin.Core.Model.Output
+namespace Admin.Core.Common.Output
 {
     /// <summary>
-    /// 输出数据接口
+    /// 响应数据输出接口
     /// </summary>
     public interface IResponseOutput
     {
@@ -20,7 +20,7 @@ namespace Admin.Core.Model.Output
     }
 
     /// <summary>
-    /// 响应数据泛型接口
+    /// 响应数据输出泛型接口
     /// </summary>
     /// <typeparam name="T"></typeparam>
     public interface IResponseOutput<T> : IResponseOutput

+ 28 - 0
Admin.Core.Common/Output/OptionOutput.cs

@@ -0,0 +1,28 @@
+namespace Admin.Core.Common.Output
+{
+    /// <summary>
+    /// 下拉选项输出
+    /// </summary>
+    public class OptionOutput
+    {
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 值
+        /// </summary>
+        public object Value { get; set; }
+
+        /// <summary>
+        /// 禁用
+        /// </summary>
+        public bool Disabled { get; set; }
+
+        /// <summary>
+        /// 额外数据
+        /// </summary>
+        public object Data { get; set; }
+    }
+}

+ 2 - 2
Admin.Core.Model/Output/PageOutput.cs → Admin.Core.Common/Output/PageOutput.cs

@@ -1,9 +1,9 @@
 using System.Collections.Generic;
 
-namespace Admin.Core.Model.Output
+namespace Admin.Core.Common.Output
 {
     /// <summary>
-    /// 通用分页信息输出
+    /// 分页信息输出
     /// </summary>
     public class PageOutput<T>
     {

+ 3 - 3
Admin.Core.Model/Output/ResponseOutput.cs → Admin.Core.Common/Output/ResponseOutput.cs

@@ -1,9 +1,9 @@
 using Newtonsoft.Json;
 
-namespace Admin.Core.Model.Output
+namespace Admin.Core.Common.Output
 {
     /// <summary>
-    /// 输出数据
+    /// 响应数据输出
     /// </summary>
     public class ResponseOutput<T> : IResponseOutput<T>
     {
@@ -59,7 +59,7 @@ namespace Admin.Core.Model.Output
     }
 
     /// <summary>
-    /// 输出数据静态类
+    /// 响应数据静态输出
     /// </summary>
     public static partial class ResponseOutput
     {

+ 24 - 0
Admin.Core.Model/Admin/DocumentImageEntity.cs

@@ -0,0 +1,24 @@
+using FreeSql.DataAnnotations;
+
+namespace Admin.Core.Model.Admin
+{
+    /// <summary>
+    /// 文档图片
+    /// </summary>
+	[Table(Name = "ad_document_image")]
+    [Index("uk_document_image_documentid_url", nameof(DocumentId) + "," + nameof(Url), true)]
+    public class DocumentImageEntity: EntityAdd
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public long DocumentId { get; set; }
+        
+        public DocumentEntity Document { get; set; }
+        
+        /// <summary>
+        /// 请求路径
+        /// </summary>
+        public string Url { get; set; }
+    }
+}

+ 13 - 0
Admin.Core.Repository/Admin/DocumentImage/DocumentImageRepository.cs

@@ -0,0 +1,13 @@
+using FreeSql;
+using Admin.Core.Model.Admin;
+using Admin.Core.Common.Auth;
+
+namespace Admin.Core.Repository.Admin
+{
+    public class DocumentImageRepository : RepositoryBase<DocumentImageEntity>, IDocumentImageRepository
+    {
+        public DocumentImageRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
+        {
+        }
+    }
+}

+ 9 - 0
Admin.Core.Repository/Admin/DocumentImage/IDocumentImageRepository.cs

@@ -0,0 +1,9 @@
+
+using Admin.Core.Model.Admin;
+
+namespace Admin.Core.Repository.Admin
+{
+    public partial interface IDocumentImageRepository : IRepositoryBase<DocumentImageEntity>
+    {
+    }
+}

+ 2 - 2
Admin.Core.Services/Admin/Api/ApiService.cs

@@ -2,8 +2,8 @@ using System.Linq;
 using System.Threading.Tasks;
 using System.Collections.Generic;
 using AutoMapper;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.Api.Input;

+ 2 - 2
Admin.Core.Services/Admin/Api/IApiService.cs

@@ -1,7 +1,7 @@
 
-using Admin.Core.Model.Input;
+using Admin.Core.Common.Input;
 using Admin.Core.Service.Admin.Api.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using System.Threading.Tasks;
 

+ 5 - 2
Admin.Core.Services/Admin/Auth/AuthService.cs

@@ -2,7 +2,7 @@ using System;
 using System.Linq;
 using System.Threading.Tasks;
 using Admin.Core.Model.Admin;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Common.Helpers;
 using Admin.Core.Common.Auth;
@@ -18,6 +18,7 @@ namespace Admin.Core.Service.Admin.Auth
         private readonly IUser _user;
         private readonly ICache _cache;
         private readonly IMapper _mapper;
+        private readonly VerifyCodeHelper _verifyCodeHelper;
         private readonly IUserRepository _userRepository;
         private readonly IPermissionRepository _permissionRepository;
         private readonly IRolePermissionRepository _rolePermissionRepository;
@@ -26,6 +27,7 @@ namespace Admin.Core.Service.Admin.Auth
             IUser user,
             ICache cache,
             IMapper mapper,
+            VerifyCodeHelper verifyCodeHelper,
             IUserRepository userRepository,
             IPermissionRepository permissionRepository,
             IRolePermissionRepository rolePermissionRepository
@@ -34,6 +36,7 @@ namespace Admin.Core.Service.Admin.Auth
             _user = user;
             _cache = cache;
             _mapper = mapper;
+            _verifyCodeHelper = verifyCodeHelper;
             _userRepository = userRepository;
             _permissionRepository = permissionRepository;
             _rolePermissionRepository = rolePermissionRepository;
@@ -148,7 +151,7 @@ namespace Admin.Core.Service.Admin.Auth
 
         public async Task<IResponseOutput> GetVerifyCodeAsync(string lastKey)
         {
-            var img = VerifyCodeHelper.GetBase64String(out string code);
+            var img = _verifyCodeHelper.GetBase64String(out string code);
 
             //删除上次缓存的验证码
             if (lastKey.NotNull())

+ 1 - 1
Admin.Core.Services/Admin/Auth/IAuthService.cs

@@ -1,6 +1,6 @@
 
 using System.Threading.Tasks;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Auth.Input;
 
 namespace Admin.Core.Service.Admin.Auth

+ 1 - 1
Admin.Core.Services/Admin/Cache/CacheService.cs

@@ -1,6 +1,6 @@
 using Admin.Core.Common.Auth;
 using Admin.Core.Common.Cache;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Microsoft.Extensions.Logging;
 using System.Collections.Generic;
 using System.ComponentModel;

+ 1 - 1
Admin.Core.Services/Admin/Cache/ICacheService.cs

@@ -1,6 +1,6 @@
 
 
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using System.Threading.Tasks;
 
 namespace Admin.Core.Service.Admin.Cache

+ 2 - 2
Admin.Core.Services/Admin/Dictionary/DictionaryService.cs

@@ -1,7 +1,7 @@
 using System.Threading.Tasks;
 using AutoMapper;
-using Admin.Core.Model.Output;
-using Admin.Core.Model.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Common.Input;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.Dictionary.Input;

+ 2 - 2
Admin.Core.Services/Admin/Dictionary/IDictionaryService.cs

@@ -1,7 +1,7 @@
 using Admin.Core.Model;
 using System.Threading.Tasks;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.Dictionary.Input;
 

+ 43 - 25
Admin.Core.Services/Admin/Document/DocumentService.cs

@@ -4,7 +4,7 @@ using System.Threading.Tasks;
 using AutoMapper;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Model.Admin;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Document.Input;
 using Admin.Core.Service.Admin.Document.Output;
 using Admin.Core.Common.Cache;
@@ -15,42 +15,42 @@ namespace Admin.Core.Service.Admin.Document
 	public class DocumentService : IDocumentService
     {
         private readonly IMapper _mapper;
-        private readonly ICache _cache;
-        private readonly IDocumentRepository _DocumentRepository;
+        private readonly IDocumentRepository _documentRepository;
+        private readonly IDocumentImageRepository _documentImageRepository;
 
         public DocumentService(
             IMapper mapper,
-            ICache cache,
-            IDocumentRepository DocumentRepository
+            IDocumentRepository DocumentRepository,
+            IDocumentImageRepository documentImageRepository
         )
         {
             _mapper = mapper;
-            _cache = cache;
-            _DocumentRepository = DocumentRepository;
+            _documentRepository = DocumentRepository;
+            _documentImageRepository = documentImageRepository;
         }
 
         public async Task<IResponseOutput> GetAsync(long id)
         {
-            var result = await _DocumentRepository.GetAsync(id);
+            var result = await _documentRepository.GetAsync(id);
 
             return ResponseOutput.Ok(result);
         }
 
         public async Task<IResponseOutput> GetGroupAsync(long id)
         {
-            var result = await _DocumentRepository.GetAsync<DocumentGetGroupOutput>(id);
+            var result = await _documentRepository.GetAsync<DocumentGetGroupOutput>(id);
             return ResponseOutput.Ok(result);
         }
 
         public async Task<IResponseOutput> GetMenuAsync(long id)
         {
-            var result = await _DocumentRepository.GetAsync<DocumentGetMenuOutput>(id);
+            var result = await _documentRepository.GetAsync<DocumentGetMenuOutput>(id);
             return ResponseOutput.Ok(result);
         }
 
         public async Task<IResponseOutput> GetContentAsync(long id)
         {
-            var result = await _DocumentRepository.GetAsync<DocumentGetContentOutput>(id);
+            var result = await _documentRepository.GetAsync<DocumentGetContentOutput>(id);
             return ResponseOutput.Ok(result);
         }
 
@@ -61,7 +61,7 @@ namespace Admin.Core.Service.Admin.Document
                 end = end.Value.AddDays(1);
             }
 
-            var data = await _DocumentRepository
+            var data = await _documentRepository
                 .WhereIf(key.NotNull(), a => a.Name.Contains(key) || a.Label.Contains(key))
                 .WhereIf(start.HasValue && end.HasValue, a => a.CreatedTime.Value.BetweenEnd(start.Value, end.Value))
                 .OrderBy(a => a.ParentId)
@@ -71,20 +71,38 @@ namespace Admin.Core.Service.Admin.Document
             return ResponseOutput.Ok(data);
         }
 
+        public async Task<IResponseOutput> GetImageListAsync(long id)
+        {
+            var result = await _documentImageRepository.Select
+                .Where(a => a.DocumentId == id)
+                .OrderByDescending(a=>a.Id)
+                .ToListAsync(a => a.Url);
+
+            return ResponseOutput.Ok(result);
+        }
+
         public async Task<IResponseOutput> AddGroupAsync(DocumentAddGroupInput input)
         {
             var entity = _mapper.Map<DocumentEntity>(input);
-            var id = (await _DocumentRepository.InsertAsync(entity)).Id;
+            var id = (await _documentRepository.InsertAsync(entity)).Id;
 
-            return ResponseOutput.Ok(id > 0);
+            return ResponseOutput.Result(id > 0);
         }
 
         public async Task<IResponseOutput> AddMenuAsync(DocumentAddMenuInput input)
         {
             var entity = _mapper.Map<DocumentEntity>(input);
-            var id = (await _DocumentRepository.InsertAsync(entity)).Id;
+            var id = (await _documentRepository.InsertAsync(entity)).Id;
+
+            return ResponseOutput.Result(id > 0);
+        }
+
+        public async Task<IResponseOutput> AddImageAsync(DocumentAddImageInput input)
+        {
+            var entity = _mapper.Map<DocumentImageEntity>(input);
+            var id = (await _documentImageRepository.InsertAsync(entity)).Id;
 
-            return ResponseOutput.Ok(id > 0);
+            return ResponseOutput.Result(id > 0);
         }
 
         public async Task<IResponseOutput> UpdateGroupAsync(DocumentUpdateGroupInput input)
@@ -92,9 +110,9 @@ namespace Admin.Core.Service.Admin.Document
             var result = false;
             if (input != null && input.Id > 0)
             {
-                var entity = await _DocumentRepository.GetAsync(input.Id);
+                var entity = await _documentRepository.GetAsync(input.Id);
                 entity = _mapper.Map(input, entity);
-                result = (await _DocumentRepository.UpdateAsync(entity)) > 0;
+                result = (await _documentRepository.UpdateAsync(entity)) > 0;
             }
 
             return ResponseOutput.Result(result);
@@ -105,9 +123,9 @@ namespace Admin.Core.Service.Admin.Document
             var result = false;
             if (input != null && input.Id > 0)
             {
-                var entity = await _DocumentRepository.GetAsync(input.Id);
+                var entity = await _documentRepository.GetAsync(input.Id);
                 entity = _mapper.Map(input, entity);
-                result = (await _DocumentRepository.UpdateAsync(entity)) > 0;
+                result = (await _documentRepository.UpdateAsync(entity)) > 0;
             }
 
             return ResponseOutput.Result(result);
@@ -118,9 +136,9 @@ namespace Admin.Core.Service.Admin.Document
             var result = false;
             if (input != null && input.Id > 0)
             {
-                var entity = await _DocumentRepository.GetAsync(input.Id);
+                var entity = await _documentRepository.GetAsync(input.Id);
                 entity = _mapper.Map(input, entity);
-                result = (await _DocumentRepository.UpdateAsync(entity)) > 0;
+                result = (await _documentRepository.UpdateAsync(entity)) > 0;
             }
 
             return ResponseOutput.Result(result);
@@ -131,7 +149,7 @@ namespace Admin.Core.Service.Admin.Document
             var result = false;
             if (id > 0)
             {
-                result = (await _DocumentRepository.DeleteAsync(m => m.Id == id)) > 0;
+                result = (await _documentRepository.DeleteAsync(m => m.Id == id)) > 0;
             }
 
             return ResponseOutput.Result(result);
@@ -139,13 +157,13 @@ namespace Admin.Core.Service.Admin.Document
 
         public async Task<IResponseOutput> SoftDeleteAsync(long id)
         {
-            var result = await _DocumentRepository.SoftDeleteAsync(id);
+            var result = await _documentRepository.SoftDeleteAsync(id);
             return ResponseOutput.Result(result);
         }
 
         public async Task<IResponseOutput> GetPlainListAsync()
         {
-            var documents = await _DocumentRepository.Select
+            var documents = await _documentRepository.Select
                 .OrderBy(a => a.ParentId)
                 .OrderBy(a => a.Sort)
                 .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type, a.Opened });

+ 5 - 1
Admin.Core.Services/Admin/Document/IDocumentService.cs

@@ -1,7 +1,7 @@
 
 using System;
 using System.Threading.Tasks;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Document.Input;
 
 namespace Admin.Core.Service.Admin.Document
@@ -10,6 +10,8 @@ namespace Admin.Core.Service.Admin.Document
     {
         Task<IResponseOutput> GetAsync(long id);
 
+        Task<IResponseOutput> GetImageListAsync(long id);
+
         Task<IResponseOutput> GetGroupAsync(long id);
 
         Task<IResponseOutput> GetMenuAsync(long id);
@@ -24,6 +26,8 @@ namespace Admin.Core.Service.Admin.Document
 
         Task<IResponseOutput> AddMenuAsync(DocumentAddMenuInput input);
 
+        Task<IResponseOutput> AddImageAsync(DocumentAddImageInput input);
+
         Task<IResponseOutput> UpdateGroupAsync(DocumentUpdateGroupInput input);
 
         Task<IResponseOutput> UpdateMenuAsync(DocumentUpdateMenuInput input);

+ 15 - 0
Admin.Core.Services/Admin/Document/Input/DocumentAddImageInput.cs

@@ -0,0 +1,15 @@
+namespace Admin.Core.Service.Admin.Document.Input
+{
+    public class DocumentAddImageInput
+    {
+        /// <summary>
+        /// Óû§Id
+        /// </summary>
+        public long DocumentId { get; set; }
+
+        /// <summary>
+        /// ÇëÇó·¾¶
+        /// </summary>
+        public string Url { get; set; }
+    }
+}

+ 5 - 0
Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs

@@ -18,6 +18,11 @@ namespace Admin.Core.Service.Admin.Document.Input
         /// </summary>
         public string Content { get; set; }
 
+        /// <summary>
+        /// Html
+        /// </summary>
+        public string Html { get; set; }
+
         /// <summary>
         /// °æ±¾
         /// </summary>

+ 17 - 0
Admin.Core.Services/Admin/Document/Input/DocumentUploadImageInput.cs

@@ -0,0 +1,17 @@
+using Microsoft.AspNetCore.Http;
+
+namespace Admin.Core.Service.Admin.Document.Input
+{
+    public class DocumentUploadImageInput
+    {
+        /// <summary>
+        /// ÉÏ´«Îļþ
+        /// </summary>
+        public IFormFile File { get; set; }
+
+        /// <summary>
+        /// Îĵµ±àºÅ
+        /// </summary>
+        public long Id { get; set; }
+    }
+}

+ 21 - 1
Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs

@@ -1,9 +1,29 @@
 
 using Admin.Core.Service.Admin.Document.Input;
+using Newtonsoft.Json;
 
 namespace Admin.Core.Service.Admin.Document.Output
 {
-    public class DocumentGetContentOutput : DocumentUpdateContentInput
+    public class DocumentGetContentOutput
     {
+        /// <summary>
+        /// 񅧏
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// Ãû³Æ
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// ÄÚÈÝ
+        /// </summary>
+        public string Content { get; set; }
+
+        /// <summary>
+        /// °æ±¾
+        /// </summary>
+        public long Version { get; set; }
     }
 }

+ 1 - 0
Admin.Core.Services/Admin/Document/_MapConfig.cs

@@ -13,6 +13,7 @@ namespace Admin.Core.Service.Admin.Document
         {
             CreateMap<DocumentAddGroupInput, DocumentEntity>();
             CreateMap<DocumentAddMenuInput, DocumentEntity>();
+            CreateMap<DocumentAddImageInput, DocumentImageEntity>();
 
             CreateMap<DocumentUpdateGroupInput, DocumentEntity>();
             CreateMap<DocumentUpdateMenuInput, DocumentEntity>();

+ 2 - 2
Admin.Core.Services/Admin/LoginLog/ILoginLogService.cs

@@ -1,6 +1,6 @@
 using System.Threading.Tasks;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.LoginLog.Input;
 

+ 2 - 2
Admin.Core.Services/Admin/LoginLog/LoginLogService.cs

@@ -1,8 +1,8 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Http;
 using AutoMapper;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.LoginLog.Input;

+ 2 - 2
Admin.Core.Services/Admin/OprationLog/IOprationLogService.cs

@@ -1,6 +1,6 @@
 using System.Threading.Tasks;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.OprationLog.Input;
 

+ 2 - 2
Admin.Core.Services/Admin/OprationLog/OprationLogService.cs

@@ -2,8 +2,8 @@ using System.Threading.Tasks;
 using Microsoft.AspNetCore.Http;
 using AutoMapper;
 using Admin.Core.Common.Auth;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.OprationLog.Input;

+ 1 - 1
Admin.Core.Services/Admin/Permission/IPermissionService.cs

@@ -1,7 +1,7 @@
 
 using System;
 using System.Threading.Tasks;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Permission.Input;
 
 namespace Admin.Core.Service.Admin.Permission

+ 1 - 1
Admin.Core.Services/Admin/Permission/PermissionService.cs

@@ -5,7 +5,7 @@ using System.Collections.Generic;
 using AutoMapper;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Model.Admin;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Permission.Input;
 using Admin.Core.Service.Admin.Permission.Output;
 using Admin.Core.Common.Cache;

+ 2 - 2
Admin.Core.Services/Admin/Role/IRoleService.cs

@@ -1,6 +1,6 @@
 using System.Threading.Tasks;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.Role.Input;
 

+ 2 - 2
Admin.Core.Services/Admin/Role/RoleService.cs

@@ -1,8 +1,8 @@
 using System.Threading.Tasks;
 using AutoMapper;
 using Admin.Core.Common.Auth;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.Role.Input;

+ 2 - 2
Admin.Core.Services/Admin/User/IUserService.cs

@@ -1,8 +1,8 @@
 
 using System.Collections.Generic;
 using System.Threading.Tasks;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.User.Input;
 using Admin.Core.Service.Admin.User.Output;

+ 3 - 3
Admin.Core.Services/Admin/User/UserService.cs

@@ -5,8 +5,8 @@ using AutoMapper;
 using Admin.Core.Common.Helpers;
 using Admin.Core.Common.Auth;
 using Admin.Core.Common.Cache;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.User;
@@ -122,7 +122,7 @@ namespace Admin.Core.FrameWork.Service.User
 
             _mapper.Map(input, entity);
             await _userRepository.UpdateAsync(entity);
-            await _userRoleRepository.Where(m => m.UserId == entity.Id).ToDelete().ExecuteAffrowsAsync();
+            await _userRoleRepository.DeleteAsync(a => a.UserId == entity.Id);
             if (input.RoleIds != null && input.RoleIds.Any())
             {
                 var roles = input.RoleIds.Select(d => new UserRoleEntity(entity.Id, d));

+ 2 - 2
Admin.Core.Services/Admin/View/IViewService.cs

@@ -1,7 +1,7 @@
 
 using System.Threading.Tasks;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.View.Input;
 

+ 2 - 2
Admin.Core.Services/Admin/View/ViewService.cs

@@ -2,8 +2,8 @@ using System.Linq;
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using AutoMapper;
-using Admin.Core.Model.Output;
-using Admin.Core.Model.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Common.Input;
 using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.View.Input;

+ 1 - 1
Admin.Core.Tests/Controller.Tests/ApiTest.cs

@@ -2,7 +2,7 @@
 using Moq;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.Api;
-using Admin.Core.Model.Input;
+using Admin.Core.Common.Input;
 using Admin.Core.Controllers.Admin;
 
 namespace Admin.Core.Tests.Controller.Tests

+ 15 - 149
Admin.Core/Admin.Core.Model.xml

@@ -144,6 +144,21 @@
             描述
             </summary>
         </member>
+        <member name="T:Admin.Core.Model.Admin.DocumentImageEntity">
+            <summary>
+            文档图片
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentImageEntity.DocumentId">
+            <summary>
+            用户Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentImageEntity.Url">
+            <summary>
+            请求路径
+            </summary>
+        </member>
         <member name="T:Admin.Core.Model.Admin.DocumentType">
             <summary>
             文档类型
@@ -604,154 +619,5 @@
             版本
             </summary>
         </member>
-        <member name="T:Admin.Core.Model.Input.PageInput`1">
-            <summary>
-            通用分页信息输入类
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Input.PageInput`1.CurrentPage">
-            <summary>
-            当前页标
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Input.PageInput`1.PageSize">
-            <summary>
-            每页大小
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Input.PageInput`1.Filter">
-            <summary>
-            查询条件
-            </summary>
-        </member>
-        <member name="T:Admin.Core.Model.Output.IResponseOutput">
-            <summary>
-            输出数据接口
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.IResponseOutput.Success">
-            <summary>
-            是否成功
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.IResponseOutput.Msg">
-            <summary>
-            消息
-            </summary>
-        </member>
-        <member name="T:Admin.Core.Model.Output.IResponseOutput`1">
-            <summary>
-            响应数据泛型接口
-            </summary>
-            <typeparam name="T"></typeparam>
-        </member>
-        <member name="P:Admin.Core.Model.Output.IResponseOutput`1.Data">
-            <summary>
-            返回数据
-            </summary>
-        </member>
-        <member name="T:Admin.Core.Model.Output.PageOutput`1">
-            <summary>
-            通用分页信息输出类
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.PageOutput`1.Total">
-            <summary>
-            数据总数
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.PageOutput`1.List">
-            <summary>
-            数据
-            </summary>
-        </member>
-        <member name="T:Admin.Core.Model.Output.ResponseOutput`1">
-            <summary>
-            输出数据
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.ResponseOutput`1.Success">
-            <summary>
-            是否成功标记
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.ResponseOutput`1.Code">
-            <summary>
-            状态码
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.ResponseOutput`1.Msg">
-            <summary>
-            消息
-            </summary>
-        </member>
-        <member name="P:Admin.Core.Model.Output.ResponseOutput`1.Data">
-            <summary>
-            数据
-            </summary>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput`1.Ok(`0,System.String)">
-            <summary>
-            成功
-            </summary>
-            <param name="data">数据</param>
-            <param name="msg">消息</param>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput`1.NotOk(System.String,`0)">
-            <summary>
-            失败
-            </summary>
-            <param name="msg">消息</param>
-            <param name="data">数据</param>
-            <returns></returns>
-        </member>
-        <member name="T:Admin.Core.Model.Output.ResponseOutput">
-            <summary>
-            输出数据静态类
-            </summary>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput.Ok``1(``0,System.String)">
-            <summary>
-            成功
-            </summary>
-            <param name="data">数据</param>
-            <param name="msg">消息</param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput.Ok">
-            <summary>
-            成功
-            </summary>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput.NotOk``1(System.String,``0)">
-            <summary>
-            失败
-            </summary>
-            <param name="msg">消息</param>
-            <param name="data">数据</param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput.NotOk(System.String)">
-            <summary>
-            失败
-            </summary>
-            <param name="msg">消息</param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput.Result``1(System.Boolean)">
-            <summary>
-            根据布尔值返回结果
-            </summary>
-            <param name="success"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Model.Output.ResponseOutput.Result(System.Boolean)">
-            <summary>
-            根据布尔值返回结果
-            </summary>
-            <param name="success"></param>
-            <returns></returns>
-        </member>
     </members>
 </doc>

+ 46 - 1
Admin.Core/Admin.Core.Service.xml

@@ -23,7 +23,7 @@
             <param name="key"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Service.Admin.Api.IApiService.PageAsync(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.ApiEntity})">
+        <member name="M:Admin.Core.Service.Admin.Api.IApiService.PageAsync(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.ApiEntity})">
             <summary>
             获得分页
             </summary>
@@ -390,6 +390,16 @@
             打开
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddImageInput.DocumentId">
+            <summary>
+            用户Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddImageInput.Url">
+            <summary>
+            请求路径
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddMenuInput.ParentId">
             <summary>
             父级节点
@@ -430,6 +440,11 @@
             内容
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateContentInput.Html">
+            <summary>
+            Html
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateContentInput.Version">
             <summary>
             版本
@@ -455,6 +470,36 @@
             版本
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUploadImageInput.File">
+            <summary>
+            上传文件
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUploadImageInput.Id">
+            <summary>
+            文档编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentGetContentOutput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentGetContentOutput.Label">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentGetContentOutput.Content">
+            <summary>
+            内容
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentGetContentOutput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.Id">
             <summary>
             编号

+ 21 - 7
Admin.Core/Admin.Core.xml

@@ -79,7 +79,7 @@
             <param name="key"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.ApiController.GetPage(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.ApiEntity})">
+        <member name="M:Admin.Core.Controllers.Admin.ApiController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.ApiEntity})">
             <summary>
             查询分页接口
             </summary>
@@ -190,7 +190,7 @@
             <param name="id"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.DictionaryController.GetPage(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.DictionaryEntity})">
+        <member name="M:Admin.Core.Controllers.Admin.DictionaryController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.DictionaryEntity})">
             <summary>
             查询分页数据字典
             </summary>
@@ -232,6 +232,13 @@
             <param name="end"></param>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.GetImageList(System.Int64)">
+            <summary>
+            查询文档图片列表
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
         <member name="M:Admin.Core.Controllers.Admin.DocumentController.GetGroup(System.Int64)">
             <summary>
             查询单条分组
@@ -301,6 +308,13 @@
             <param name="id"></param>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.UploadImage(Admin.Core.Service.Admin.Document.Input.DocumentUploadImageInput)">
+            <summary>
+            上传文档图片
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.Core.Controllers.Admin.ImgController">
             <summary>
             图片管理
@@ -318,7 +332,7 @@
             登录日志管理
             </summary>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.LoginLogController.GetPage(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.LoginLogEntity})">
+        <member name="M:Admin.Core.Controllers.Admin.LoginLogController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.LoginLogEntity})">
             <summary>
             查询分页登录日志
             </summary>
@@ -330,7 +344,7 @@
             操作日志管理
             </summary>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.OprationLogController.GetPage(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.OprationLogEntity})">
+        <member name="M:Admin.Core.Controllers.Admin.OprationLogController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.OprationLogEntity})">
             <summary>
             查询分页操作日志
             </summary>
@@ -453,7 +467,7 @@
             <param name="id"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.RoleController.GetPage(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.RoleEntity})">
+        <member name="M:Admin.Core.Controllers.Admin.RoleController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.RoleEntity})">
             <summary>
             查询分页角色
             </summary>
@@ -506,7 +520,7 @@
             <param name="id"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.UserController.GetPage(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.UserEntity})">
+        <member name="M:Admin.Core.Controllers.Admin.UserController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.UserEntity})">
             <summary>
             查询分页用户
             </summary>
@@ -574,7 +588,7 @@
             <param name="key"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.ViewController.GetPage(Admin.Core.Model.Input.PageInput{Admin.Core.Model.Admin.ViewEntity})">
+        <member name="M:Admin.Core.Controllers.Admin.ViewController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Admin.ViewEntity})">
             <summary>
             查询分页视图
             </summary>

+ 7 - 3
Admin.Core/Aop/AopHelper.cs

@@ -8,7 +8,7 @@ namespace Admin.Core.Aop
 {
     public class AopHelper
     {
-        public static async Task<T> ExecuteGenericMethod<T>(Task<T> returnValue, Action<T> callBackAction, Action<Exception> exceptionAction)
+        public static async Task<T> ExecuteGenericMethod<T>(Task<T> returnValue, Action<T> callBackAction, Action<Exception> exceptionAction, Action finallyAction)
         {
             try
             {
@@ -21,14 +21,18 @@ namespace Admin.Core.Aop
                 exceptionAction?.Invoke(ex);
                 throw;
             }
+            finally
+            {
+                finallyAction?.Invoke();
+            }
         }
 
-        public static object CallGenericMethod(IInvocation invocation, Action<object> callBackAction, Action<Exception> exceptionAction)
+        public static object CallGenericMethod(IInvocation invocation, Action<object> callBackAction, Action<Exception> exceptionAction, Action finallyAction)
         {
             return typeof(AopHelper)
             .GetMethod("ExecuteGenericMethod", BindingFlags.Public | BindingFlags.Static)
             .MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0])
-            .Invoke(null, new object[] { invocation.ReturnValue, callBackAction, exceptionAction });
+            .Invoke(null, new object[] { invocation.ReturnValue, callBackAction, exceptionAction, finallyAction });
         }
     }
 }

+ 31 - 5
Admin.Core/Aop/TransactionInterceptor.cs

@@ -2,8 +2,8 @@
 using System.Threading.Tasks;
 using Castle.DynamicProxy;
 using FreeSql;
-using Admin.Core.Extensions;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Extensions;
+using Admin.Core.Common.Output;
 using Admin.Core.Common.Attributes;
 
 namespace Admin.Core.Aop
@@ -34,8 +34,20 @@ namespace Admin.Core.Aop
                     {
                         if (invocation.Method.ReturnType == typeof(Task))
                         {
-                            await (Task)invocation.ReturnValue;
-                            _unitOfWork.Commit();
+                            try
+                            {
+                                await (Task)invocation.ReturnValue;
+                                _unitOfWork.Commit();
+                            }
+                            catch (Exception ex)
+                            {
+                                _unitOfWork.Rollback();
+                                throw ex;
+                            }
+                            finally
+                            {
+                                _unitOfWork.Dispose();
+                            }
                         }
                         else
                         {
@@ -53,11 +65,18 @@ namespace Admin.Core.Aop
                                 {
                                     _unitOfWork.Rollback();
                                 }
-                                _unitOfWork.Commit();
+                                else
+                                {
+                                    _unitOfWork.Commit();
+                                }
                             },
                             ex =>
                             {
                                 _unitOfWork.Rollback();
+                            },
+                            ()=>
+                            {
+                                _unitOfWork.Dispose();
                             });
                         }
                     }
@@ -70,6 +89,13 @@ namespace Admin.Core.Aop
                             {
                                 _unitOfWork.Rollback();
                             }
+                            else
+                            {
+                                _unitOfWork.Commit();
+                            }
+                        }
+                        else
+                        {
                             _unitOfWork.Commit();
                         }
                     }

+ 1 - 1
Admin.Core/Attributes/ValidateInputAttribute.cs

@@ -1,6 +1,6 @@
 using System;
 using System.Linq;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Filters;

+ 3 - 2
Admin.Core/Auth/ResponseAuthenticationHandler.cs

@@ -9,6 +9,7 @@ using Microsoft.Extensions.Options;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using StatusCodes = Admin.Core.Enums.StatusCodes;
+using Admin.Core.Common.Extensions;
 
 namespace Admin.Core.Auth
 {
@@ -39,7 +40,7 @@ namespace Admin.Core.Auth
                 new ResponseStatusData
                 {
                     Code = StatusCodes.Status401Unauthorized,
-                    Msg = StatusCodes.Status401Unauthorized.ToDescriptionOrString()
+                    Msg = StatusCodes.Status401Unauthorized.ToDescription()
                 },
                 new JsonSerializerSettings()
                 {
@@ -56,7 +57,7 @@ namespace Admin.Core.Auth
                 new ResponseStatusData
                 {
                     Code = StatusCodes.Status403Forbidden,
-                    Msg = StatusCodes.Status403Forbidden.ToDescriptionOrString()
+                    Msg = StatusCodes.Status403Forbidden.ToDescription()
                 },
                 new JsonSerializerSettings()
                 {

+ 2 - 2
Admin.Core/Controllers/Admin/ApiController.cs

@@ -1,7 +1,7 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.Api;
 using Admin.Core.Service.Admin.Api.Input;

+ 1 - 1
Admin.Core/Controllers/Admin/AuthController.cs

@@ -3,7 +3,7 @@ using System.Security.Claims;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Authorization;
 using Admin.Core.Attributes;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Auth;
 using Admin.Core.Service.Admin.Auth.Input;
 using Admin.Core.Service.Admin.Auth.Output;

+ 1 - 1
Admin.Core/Controllers/Admin/CacheController.cs

@@ -1,6 +1,6 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Cache;
 
 namespace Admin.Core.Controllers.Admin

+ 2 - 2
Admin.Core/Controllers/Admin/DictionaryController.cs

@@ -1,8 +1,8 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
 using Admin.Core.Service.Admin.Dictionary;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.Dictionary.Input;
 

+ 49 - 2
Admin.Core/Controllers/Admin/DocumentController.cs

@@ -1,9 +1,12 @@
 using System;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Document;
 using Admin.Core.Service.Admin.Document.Input;
+using Admin.Core.Common.Configs;
+using Microsoft.Extensions.Options;
+using Admin.Core.Common.Helpers;
 
 namespace Admin.Core.Controllers.Admin
 {
@@ -13,10 +16,18 @@ namespace Admin.Core.Controllers.Admin
     public class DocumentController : AreaController
     {
         private readonly IDocumentService _documentServices;
+        private readonly UploadConfig _uploadConfig;
+        private readonly UploadHelper _uploadHelper;
 
-        public DocumentController(IDocumentService documentServices)
+        public DocumentController(
+            IDocumentService documentServices, 
+            IOptionsMonitor<UploadConfig> uploadConfig,
+            UploadHelper uploadHelper
+        )
         {
             _documentServices = documentServices;
+            _uploadConfig = uploadConfig.CurrentValue;
+            _uploadHelper = uploadHelper;
         }
 
         /// <summary>
@@ -32,6 +43,17 @@ namespace Admin.Core.Controllers.Admin
             return await _documentServices.GetListAsync(key,start,end);
         }
 
+        /// <summary>
+        /// 查询文档图片列表
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> GetImageList(long id)
+        {
+            return await _documentServices.GetImageListAsync(id);
+        }
+
         /// <summary>
         /// 查询单条分组
         /// </summary>
@@ -140,5 +162,30 @@ namespace Admin.Core.Controllers.Admin
         {
             return await _documentServices.SoftDeleteAsync(id);
         }
+
+        /// <summary>
+        /// 上传文档图片
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IResponseOutput> UploadImage([FromForm]DocumentUploadImageInput input)
+        {
+            var config = _uploadConfig.Document;
+            var res = await _uploadHelper.UploadAsync(input.File, config, new { input.Id });
+            if (res.Success)
+            {
+                //保存文档图片
+                var r = await _documentServices.AddImageAsync(new DocumentAddImageInput
+                {
+                    DocumentId = input.Id,
+                    Url = res.Data.FileRequestPath
+                });
+                if(r.Success)
+                return ResponseOutput.Ok(res.Data.FileRequestPath);
+            }
+
+            return ResponseOutput.NotOk("上传失败!");
+        }
     }
 }

+ 17 - 51
Admin.Core/Controllers/Admin/ImgController.cs

@@ -1,11 +1,8 @@
-using System;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Attributes;
 using Admin.Core.Common.Helpers;
 using Admin.Core.Common.Configs;
@@ -20,11 +17,17 @@ namespace Admin.Core.Controllers.Admin
     {
         private readonly IUser _user;
         private readonly UploadConfig _uploadConfig;
-        
-        public ImgController(IUser user, IOptionsMonitor<UploadConfig> uploadConfig)
+        private readonly UploadHelper _uploadHelper;
+
+        public ImgController(
+            IUser user, 
+            IOptionsMonitor<UploadConfig> uploadConfig, 
+            UploadHelper uploadHelper
+        )
         {
             _user = user;
             _uploadConfig = uploadConfig.CurrentValue;
+            _uploadHelper = uploadHelper;
         }
 
         /*
@@ -40,7 +43,7 @@ namespace Admin.Core.Controllers.Admin
         [AllowAnonymous]
         public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, string fileName = "")
         {
-            string filePath = Path.Combine(environment.WebRootPath,"avatar", fileName);
+            string filePath = Path.Combine(environment.WebRootPath,"avatar", fileName).ToPath();
             var stream = System.IO.File.OpenRead(filePath);
             string fileExt = Path.GetExtension(filePath);
             var contentTypeProvider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider();
@@ -58,53 +61,16 @@ namespace Admin.Core.Controllers.Admin
         /// <returns></returns>
         [HttpPost]
         [Login]
-        public async Task<IResponseOutput> AvatarUpload(IFormFile file)
+        public async Task<IResponseOutput> AvatarUpload([FromForm]IFormFile file)
         {
-            if(file == null || file.Length < 1)
-            {
-                if (Request.Form.Files != null && Request.Form.Files.Any())
-                {
-                    file = Request.Form.Files[0];
-                }
-            }
-
-            if (file == null || file.Length < 1)
-            {
-                return ResponseOutput.NotOk("请上传头像!");
-            }
-
-            var avatar = _uploadConfig.Avatar;
-
-            //格式限制
-            if (!avatar.ContentType.Contains(file.ContentType))
-            {
-                return ResponseOutput.NotOk("图片格式错误");
-            }
-
-            //大小限制
-            if (!(file.Length <= avatar.Size))
-            {
-                return ResponseOutput.NotOk("图片过大");
-            }
-
-            var dateTimeFormat = avatar.DateTimeFormat.NotNull() ? DateTime.Now.ToString(avatar.DateTimeFormat) : "";
-            var format = avatar.Format.NotNull() ? string.Format(avatar.Format,_user.Id) : "";
-            var savePath = Path.Combine(dateTimeFormat, format);
-            var fullDirectory = Path.Combine(avatar.Path, savePath);
-            if (!Directory.Exists(fullDirectory))
-            {
-                Directory.CreateDirectory(fullDirectory);
-            }
-
-            var saveFileName = $"{new Snowfake(0).nextId()}{Path.GetExtension(file.FileName)}";
-            var fullPath = Path.Combine(fullDirectory, saveFileName);
-
-            using (var stream = new FileStream(fullPath, FileMode.Create))
+            var config = _uploadConfig.Avatar;
+            var res = await _uploadHelper.UploadAsync(file, config, new { _user.Id });
+            if (res.Success)
             {
-                await file.CopyToAsync(stream);
+                return ResponseOutput.Ok(res.Data.FileRelativePath);
             }
 
-            return ResponseOutput.Ok(Path.Combine(savePath, saveFileName));
+            return ResponseOutput.NotOk("上传失败!");
         }
     }
 }

+ 2 - 2
Admin.Core/Controllers/Admin/LoginLogController.cs

@@ -1,7 +1,7 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.LoginLog;
 

+ 2 - 2
Admin.Core/Controllers/Admin/OprationLogController.cs

@@ -1,7 +1,7 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.OprationLog;
 

+ 1 - 1
Admin.Core/Controllers/Admin/PermissionController.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.Permission;
 using Admin.Core.Service.Admin.Permission.Input;
 

+ 2 - 2
Admin.Core/Controllers/Admin/RoleController.cs

@@ -1,7 +1,7 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.Role;
 using Admin.Core.Service.Admin.Role.Input;

+ 2 - 2
Admin.Core/Controllers/Admin/UserController.cs

@@ -1,7 +1,7 @@
 using System.Threading.Tasks;
 using Admin.Core.Service.Admin.User;
-using Admin.Core.Model.Output;
-using Admin.Core.Model.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Common.Input;
 using Admin.Core.Model.Admin;
 using Admin.Core.Service.Admin.User.Input;
 using Microsoft.AspNetCore.Mvc;

+ 2 - 2
Admin.Core/Controllers/Admin/ViewController.cs

@@ -1,8 +1,8 @@
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
 using Admin.Core.Model.Admin;
-using Admin.Core.Model.Input;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.View;
 using Admin.Core.Service.Admin.View.Input;
 

文件差異過大導致無法顯示
+ 0 - 0
Admin.Core/Db/Data/data.json


+ 4 - 4
Admin.Core/Db/DbHelper.cs

@@ -80,7 +80,8 @@ namespace Admin.Core.Db
                 typeof(RolePermissionEntity),
                 typeof(OprationLogEntity),
                 typeof(LoginLogEntity),
-                typeof(DocumentEntity)
+                typeof(DocumentEntity),
+                typeof(DocumentImageEntity)
             });
             Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n");
         }
@@ -194,8 +195,7 @@ namespace Admin.Core.Db
                 Console.WriteLine("\r\nsync data started");
 
                 db.Aop.AuditValue += SyncDataAuditValue;
-
-                var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json");
+                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath();
                 var jsonData = FileHelper.ReadFile(filePath);
                 var data = JsonConvert.DeserializeObject<Data>(jsonData);
 
@@ -365,7 +365,7 @@ namespace Admin.Core.Db
                 //Formatting.Indented, 
                 settings
                 );
-                var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json");
+                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath();
                 FileHelper.WriteFile(filePath, jsonData);
                 #endregion
 

+ 7 - 7
Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs

@@ -9,25 +9,25 @@ namespace Admin.Core.Extensions
 {
     public static class UploadConfigApplicationBuilderExtensions
     {
-        private static void UseAvatar(IApplicationBuilder app, AvatarConfig avatarConfig)
+        private static void UseFileUploadConfig(IApplicationBuilder app, FileUploadConfig config)
         {
-            if (!Directory.Exists(avatarConfig.Path))
+            if (!Directory.Exists(config.UploadPath))
             {
-                Directory.CreateDirectory(avatarConfig.Path);
+                Directory.CreateDirectory(config.UploadPath);
             }
 
             app.UseStaticFiles(new StaticFileOptions() 
             {
-                RequestPath = avatarConfig.RequestPath,
-                FileProvider = new PhysicalFileProvider(avatarConfig.Path)
+                RequestPath = config.RequestPath,
+                FileProvider = new PhysicalFileProvider(config.UploadPath)
             });
         }
 
         public static void UseUploadConfig(this IApplicationBuilder app)
         {
             var uploadConfig = app.ApplicationServices.GetRequiredService<IOptions<UploadConfig>>();
-            var avatar = uploadConfig.Value.Avatar;
-            UseAvatar(app, avatar);
+            UseFileUploadConfig(app, uploadConfig.Value.Avatar);
+            UseFileUploadConfig(app, uploadConfig.Value.Document);
         }
     }
 

+ 3 - 2
Admin.Core/Filters/AdminExceptionFilter.cs

@@ -3,8 +3,9 @@ using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Filters;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using System.Threading.Tasks;
+using Admin.Core.Common.Extensions;
 
 namespace Admin.Core.Filters
 {
@@ -27,7 +28,7 @@ namespace Admin.Core.Filters
             string message;
             if (_env.IsProduction())
             {
-                message = Enums.StatusCodes.Status500InternalServerError.ToDescriptionOrString();
+                message = Enums.StatusCodes.Status500InternalServerError.ToDescription();
             }
             else
             {

+ 1 - 1
Admin.Core/Logs/ApiHelper.cs

@@ -28,7 +28,7 @@ namespace Admin.Core.Logs
                     return _apis;
 
                 _apis = new List<ApiHelperDto>();
-                var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json");
+                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath();
                 var jsonData = FileHelper.ReadFile(filePath);
                 var apis = JsonConvert.DeserializeObject<Data>(jsonData).Apis;
                 foreach (var api in apis)

+ 1 - 1
Admin.Core/Logs/LogHandler.cs

@@ -1,7 +1,7 @@
 using System.Linq;
 using System.Diagnostics;
 using System.Threading.Tasks;
-using Admin.Core.Model.Output;
+using Admin.Core.Common.Output;
 using Admin.Core.Service.Admin.OprationLog;
 using Admin.Core.Service.Admin.OprationLog.Input;
 using Microsoft.AspNetCore.Mvc.Filters;

+ 7 - 3
Admin.Core/configs/appconfig.json

@@ -1,16 +1,20 @@
 {
-  //Swagger文档
-  "swagger": false,
   //Api地址
   "urls": "http://*:8888",
+  //Swagger文档
+  "swagger": false,
   //面向切面编程
   "aop": {
     //事物
-    "transaction": false
+    "transaction": true
   },
   //日志
   "log": {
     //操作日志
     "operation": true
+  },
+  //验证码
+  "varifyCode": {
+    "font": [ "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" ]
   }
 }

+ 1 - 0
Admin.Core/configs/dbconfig.json

@@ -24,6 +24,7 @@
   //SqlServer "CREATE DATABASE [admindb]"
   "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'",
 
+  //数据库配置 https://github.com/dotnetcore/FreeSql/wiki/入门
   //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11
   "type": 4,
   //连接字符串

+ 15 - 13
Admin.Core/configs/uploadconfig.json

@@ -1,36 +1,38 @@
 {
   //头像
   "avatar": {
-    //路径 D:/upload/admin/avatar
-    "path": "D:/upload/admin/avatar",
+    //上传路径 D:/upload/admin/avatar
+    "uploadPath": "D:/upload/admin/avatar",
     //请求路径
     "requestPath": "/upload/admin/avatar",
 
     //路径日期格式 yyyy/MM/dd
     "dateTimeFormat": "",
     //{用户编号}
-    "format": "{0}",
-    //图片大小 1M = 1024 * 1024
-    "size": 1048576,
+    "format": "{Id}",
+    //图片大小不超过 1M = 1024 * 1024
+    "maxSize": 1048576,
+    //最大允许上传张数,-1不限制
+    "limit": 1,
     //图片格式
     "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ]
   },
-  //文档
+  //文档图片
   "document": {
-    //路径 D:/upload/admin/document
-    "path": "D:/upload/admin/document",
+    //上传路径 D:/upload/admin/document
+    "uploadPath": "D:/upload/admin/document",
     //请求路径
     "requestPath": "/images",
 
     //路径日期格式 yyyy/MM/dd
     "dateTimeFormat": "",
     //{文档编号}
-    "format": "{0}",
-    //文件大小 10M = 10 * 1024 * 1024
-    "size": 10485760,
-    //最大允许上传数,-1不限制
+    "format": "{Id}",
+    //图片大小不超过 10M = 10 * 1024 * 1024
+    "maxSize": 10485760,
+    //最大允许上传数,-1不限制
     "limit": -1,
-    //文件格式
+    //图片格式
     "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ]
   }
 }

部分文件因文件數量過多而無法顯示