0
0
xiaoxue 5 жил өмнө
parent
commit
d282a0a289
60 өөрчлөгдсөн 1385 нэмэгдсэн , 219 устгасан
  1. 7 7
      Admin.Core.Common/Admin.Core.Common.csproj
  2. 2 2
      Admin.Core.Common/Auth/IUser.cs
  3. 4 9
      Admin.Core.Common/Auth/User.cs
  4. 82 0
      Admin.Core.Common/Configs/UploadConfig.cs
  5. 31 5
      Admin.Core.Common/Helpers/ConfigHelper.cs
  6. 85 0
      Admin.Core.Common/Helpers/Snowfake.cs
  7. 5 5
      Admin.Core.Model/Admin/ApiEntity.cs
  8. 4 4
      Admin.Core.Model/Admin/DictionaryEntity.cs
  9. 69 0
      Admin.Core.Model/Admin/DocumentEntity.cs
  10. 18 0
      Admin.Core.Model/Admin/DocumentType.cs
  11. 7 7
      Admin.Core.Model/Admin/LogAbstract.cs
  12. 4 5
      Admin.Core.Model/Admin/PermissionEntity.cs
  13. 1 1
      Admin.Core.Model/Admin/RoleEntity.cs
  14. 4 10
      Admin.Core.Model/Admin/UserEntity.cs
  15. 4 4
      Admin.Core.Model/Admin/ViewEntity.cs
  16. 13 0
      Admin.Core.Repository/Admin/Document/DocumentRepository.cs
  17. 9 0
      Admin.Core.Repository/Admin/Document/IDocumentRepository.cs
  18. 1 1
      Admin.Core.Services/Admin/Auth/AuthService.cs
  19. 1 1
      Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs
  20. 167 0
      Admin.Core.Services/Admin/Document/DocumentService.cs
  21. 38 0
      Admin.Core.Services/Admin/Document/IDocumentService.cs
  22. 32 0
      Admin.Core.Services/Admin/Document/Input/DocumentAddGroupInput.cs
  23. 32 0
      Admin.Core.Services/Admin/Document/Input/DocumentAddMenuInput.cs
  24. 26 0
      Admin.Core.Services/Admin/Document/Input/DocumentUpdateContentInput.cs
  25. 16 0
      Admin.Core.Services/Admin/Document/Input/DocumentUpdateGroupInput.cs
  26. 16 0
      Admin.Core.Services/Admin/Document/Input/DocumentUpdateMenuInput.cs
  27. 9 0
      Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs
  28. 8 0
      Admin.Core.Services/Admin/Document/Output/DocumentGetGroupOutput.cs
  29. 9 0
      Admin.Core.Services/Admin/Document/Output/DocumentGetMenuOutput.cs
  30. 42 0
      Admin.Core.Services/Admin/Document/Output/DocumentListOutput.cs
  31. 22 0
      Admin.Core.Services/Admin/Document/_MapConfig.cs
  32. 2 2
      Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs
  33. 2 2
      Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs
  34. 2 2
      Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs
  35. 1 1
      Admin.Core.Services/Admin/OprationLog/OprationLogService.cs
  36. 2 2
      Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs
  37. 1 2
      Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs
  38. 0 6
      Admin.Core.Services/Admin/User/Input/UserAddInput.cs
  39. 2 0
      Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs
  40. 0 6
      Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs
  41. 2 2
      Admin.Core.Services/Admin/User/UserService.cs
  42. 72 7
      Admin.Core/Admin.Core.Model.xml
  43. 139 19
      Admin.Core/Admin.Core.Service.xml
  44. 3 2
      Admin.Core/Admin.Core.csproj
  45. 81 15
      Admin.Core/Admin.Core.xml
  46. 2 2
      Admin.Core/Controllers/Admin/AuthController.cs
  47. 144 0
      Admin.Core/Controllers/Admin/DocumentController.cs
  48. 54 68
      Admin.Core/Controllers/Admin/ImgController.cs
  49. 1 0
      Admin.Core/Db/Data.cs
  50. 0 0
      Admin.Core/Db/Data/data.json
  51. 3 2
      Admin.Core/Db/DbHelper.cs
  52. 5 5
      Admin.Core/Db/ServiceCollectionExtensions.cs
  53. 34 0
      Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs
  54. 2 2
      Admin.Core/Program.cs
  55. 17 7
      Admin.Core/Startup.cs
  56. 5 0
      Admin.Core/configs/dbconfig.json
  57. 4 4
      Admin.Core/configs/jwtconfig.json
  58. 3 0
      Admin.Core/configs/uploadconfig.Development.json
  59. 34 0
      Admin.Core/configs/uploadconfig.json
  60. BIN
      Admin.Core/wwwroot/avatar/avatar.gif

+ 7 - 7
Admin.Core.Common/Admin.Core.Common.csproj

@@ -5,13 +5,13 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="CSRedisCore" Version="3.6.1" />
-    <PackageReference Include="FreeSql" Version="1.4.0-preview20200410" />
-    <PackageReference Include="FreeSql.Provider.MySql" Version="1.4.0-preview20200410" />
-    <PackageReference Include="FreeSql.Provider.Oracle" Version="1.4.0-preview20200410" />
-    <PackageReference Include="FreeSql.Provider.Sqlite" Version="1.4.0-preview20200410" />
-    <PackageReference Include="FreeSql.Provider.SqlServer" Version="1.4.0-preview20200410" />
-    <PackageReference Include="FreeSql.Repository" Version="1.4.0-preview20200410" />
+    <PackageReference Include="CSRedisCore" Version="3.6.2" />
+    <PackageReference Include="FreeSql" Version="1.3.6" />
+    <PackageReference Include="FreeSql.Provider.MySql" Version="1.3.6" />
+    <PackageReference Include="FreeSql.Provider.Oracle" Version="1.3.6" />
+    <PackageReference Include="FreeSql.Provider.Sqlite" Version="1.3.6" />
+    <PackageReference Include="FreeSql.Provider.SqlServer" Version="1.3.6" />
+    <PackageReference Include="FreeSql.Repository" Version="1.3.6" />
     <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.3" />
     <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" />

+ 2 - 2
Admin.Core.Common/Auth/IUser.cs

@@ -16,8 +16,8 @@
         string Name { get; }
 
         /// <summary>
-        /// 姓名
+        /// 昵称
         /// </summary>
-        string RealName { get; }
+        string NickName { get; }
     }
 }

+ 4 - 9
Admin.Core.Common/Auth/User.cs

@@ -49,13 +49,13 @@ namespace Admin.Core.Common.Auth
         }
 
         /// <summary>
-        /// 姓名
+        /// 昵称
         /// </summary>
-        public string RealName
+        public string NickName
         {
             get
             {
-                var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserRealName);
+                var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserNickName);
 
                 if (name != null && name.Value.NotNull())
                 {
@@ -85,11 +85,6 @@ namespace Admin.Core.Common.Auth
         /// <summary>
         /// 姓名
         /// </summary>
-        public const string UserRealName = "rna";
-
-        /// <summary>
-        /// 登录日志Id
-        /// </summary>
-        public const string UserLoginLogId = "llid";
+        public const string UserNickName = "nn";
     }
 }

+ 82 - 0
Admin.Core.Common/Configs/UploadConfig.cs

@@ -0,0 +1,82 @@
+namespace Admin.Core.Common.Configs
+{
+    /// <summary>
+    /// 上传配置
+    /// </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; }
+
+        /// <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; }
+    }
+
+    /// <summary>
+    /// 文档配置
+    /// </summary>
+    public class DocumentConfig
+    {
+        /// <summary>
+        /// 路径
+        /// </summary>
+        public string Path { get; set; }
+
+        /// <summary>
+        /// 请求路径
+        /// </summary>
+        public string RequestPath { get; set; }
+
+        /// <summary>
+        /// 路径格式
+        /// </summary>
+        public string Format { get; set; }
+
+        /// <summary>
+        /// 路径日期格式
+        /// </summary>
+        public string DateTimeFormat { get; set; }
+
+        /// <summary>
+        /// 文件大小 10M = 10 * 1024 * 1024
+        /// </summary>
+        public long Size { get; set; }
+
+        /// <summary>
+        /// 文件格式
+        /// </summary>
+        public string[] ContentType { get; set; }
+    }
+}

+ 31 - 5
Admin.Core.Common/Helpers/ConfigHelper.cs

@@ -1,5 +1,4 @@
-using System;
-using System.IO;
+using System.IO;
 using Microsoft.Extensions.Configuration;
 
 namespace Admin.Core.Common.Helpers
@@ -9,6 +8,17 @@ namespace Admin.Core.Common.Helpers
     /// </summary>
     public class ConfigHelper
     {
+        /* 使用热更新
+        var uploadConfig = new ConfigHelper().Load("uploadconfig", _env.EnvironmentName, true);
+        services.Configure<UploadConfig>(uploadConfig);
+
+        private readonly UploadConfig _uploadConfig;
+        public ImgController(IOptionsMonitor<UploadConfig> uploadConfig)
+        {
+            _uploadConfig = uploadConfig.CurrentValue;
+        }
+        */
+
         /// <summary>
         /// 加载配置文件
         /// </summary>
@@ -18,7 +28,7 @@ namespace Admin.Core.Common.Helpers
         /// <returns></returns>
         public IConfiguration Load(string fileName, string environmentName = "", bool reloadOnChange = false)
         {
-            var filePath = Path.Combine(AppContext.BaseDirectory, "configs");
+            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "configs");
             if (!Directory.Exists(filePath))
                 return null;
 
@@ -38,8 +48,8 @@ namespace Admin.Core.Common.Helpers
         /// 获得配置信息
         /// </summary>
         /// <typeparam name="T">配置信息</typeparam>
-        /// <param name="fileName"></param>
-        /// <param name="environmentName">文件名称</param>
+        /// <param name="fileName">文件名称</param>
+        /// <param name="environmentName">环境名称</param>
         /// <param name="reloadOnChange">自动更新</param>
         /// <returns></returns>
         public T Get<T>(string fileName, string environmentName = "", bool reloadOnChange = false)
@@ -50,5 +60,21 @@ namespace Admin.Core.Common.Helpers
 
             return configuration.Get<T>();
         }
+
+        /// <summary>
+        /// 绑定实例配置信息
+        /// </summary>
+        /// <param name="fileName">文件名称</param>
+        /// <param name="instance">实例配置</param>
+        /// <param name="environmentName">环境名称</param>
+        /// <param name="reloadOnChange">自动更新</param>
+        public void Bind(string fileName, object instance, string environmentName = "", bool reloadOnChange = false)
+        {
+            var configuration = Load(fileName, environmentName, reloadOnChange);
+            if (configuration == null)
+                return;
+
+            configuration.Bind(instance);
+        }
     }
 }

+ 85 - 0
Admin.Core.Common/Helpers/Snowfake.cs

@@ -0,0 +1,85 @@
+using System;
+
+namespace Admin.Core.Common.Helpers
+{
+    public class Snowfake
+    {
+        public static Snowfake Default { get; } = new Snowfake(0);
+
+        //机器ID
+        private static long workerId;
+        private static long twepoch = 687888001020L; //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳
+        private static long sequence = 0L;
+        private static int workerIdBits = 4; //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义)
+        public static long maxWorkerId = -1L ^ -1L << workerIdBits; //最大机器ID
+        private static int sequenceBits = 10; //计数器字节数,10个字节用来保存计数码
+        private static int workerIdShift = sequenceBits; //机器码数据左移位数,就是后面计数器占用的位数
+        private static int timestampLeftShift = sequenceBits + workerIdBits; //时间戳左移动位数就是机器码和计数器总字节数
+        public static long sequenceMask = -1L ^ -1L << sequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成
+        private long lastTimestamp = -1L;
+
+        /// <summary>
+        /// 机器码
+        /// </summary>
+        /// <param name="workerId"></param>
+        public Snowfake(long workerId)
+        {
+            if (workerId > maxWorkerId || workerId < 0)
+                throw new Exception(string.Format("worker Id can't be greater than {0} or less than 0 ", workerId));
+            Snowfake.workerId = workerId;
+        }
+
+        public long nextId()
+        {
+            lock (this)
+            {
+                long timestamp = timeGen();
+                if (lastTimestamp == timestamp)
+                { //同一微妙中生成ID
+                    sequence = (sequence + 1) & sequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限
+                    if (sequence == 0)
+                    {
+                        //一微妙内产生的ID计数已达上限,等待下一微妙
+                        timestamp = tillNextMillis(lastTimestamp);
+                    }
+                }
+                else
+                { //不同微秒生成ID
+                    sequence = 0; //计数清0
+                }
+                if (timestamp < lastTimestamp)
+                { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过
+                    throw new Exception(string.Format("Clock moved backwards.  Refusing to generate id for {0} milliseconds",
+                        lastTimestamp - timestamp));
+                }
+                lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
+                long nextId = (timestamp - twepoch << timestampLeftShift) | workerId << workerIdShift | sequence;
+                return nextId;
+            }
+        }
+
+        /// <summary>
+        /// 获取下一微秒时间戳
+        /// </summary>
+        /// <param name="lastTimestamp"></param>
+        /// <returns></returns>
+        private long tillNextMillis(long lastTimestamp)
+        {
+            long timestamp = timeGen();
+            while (timestamp <= lastTimestamp)
+            {
+                timestamp = timeGen();
+            }
+            return timestamp;
+        }
+
+        /// <summary>
+        /// 生成当前时间戳
+        /// </summary>
+        /// <returns></returns>
+        private long timeGen()
+        {
+            return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
+        }
+    }
+}

+ 5 - 5
Admin.Core.Model/Admin/ApiEntity.cs

@@ -19,31 +19,31 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 接口命名
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string Name { get; set; }
 
         /// <summary>
         /// 接口名称
         /// </summary>
-        [MaxLength(500)]
+        [Column(StringLength = 500)]
         public string Label { get; set; }
 
         /// <summary>
         /// 接口地址
         /// </summary>
-        [MaxLength(500)]
+        [Column(StringLength = 500)]
         public string Path { get; set; }
 
         /// <summary>
         /// 接口提交方法
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string HttpMethods { get; set; }
 
         /// <summary>
         /// 说明
         /// </summary>
-        [MaxLength(500)]
+        [Column(StringLength = 500)]
         public string Description { get; set; }
 
         /// <summary>

+ 4 - 4
Admin.Core.Model/Admin/DictionaryEntity.cs

@@ -7,7 +7,7 @@ namespace Admin.Core.Model.Admin
     /// 数据字典
     /// </summary>
 	[Table(Name = "ad_dictionary")]
-    [Index("uk_role_parentid_name", nameof(ParentId)+","+nameof(Name), true)]
+    [Index("uk_dictionary_parentid_name", nameof(ParentId)+","+nameof(Name), true)]
     public class DictionaryEntity: EntityBase
     {
         /// <summary>
@@ -18,19 +18,19 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 字典名称
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string Name { get; set; }
 
         /// <summary>
         /// 字典编码
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string Code { get; set; }
 
         /// <summary>
         /// 字典值
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string Value { get; set; }
 
         /// <summary>

+ 69 - 0
Admin.Core.Model/Admin/DocumentEntity.cs

@@ -0,0 +1,69 @@
+using System.ComponentModel.DataAnnotations;
+using FreeSql.DataAnnotations;
+
+namespace Admin.Core.Model.Admin
+{
+    /// <summary>
+    /// 文档
+    /// </summary>
+	[Table(Name = "ad_document")]
+    [Index("uk_document_parentid_label", nameof(ParentId) + "," + nameof(Label), true)]
+    public class DocumentEntity : EntityBase
+    {
+        /// <summary>
+        /// 父级节点
+        /// </summary>
+        public long ParentId { get; set; }
+
+        /// <summary>
+        /// 名称
+        /// </summary>
+        [Column(StringLength = 50)]
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 类型
+        /// </summary>
+        [Column(MapType = typeof(int),CanUpdate = false)]
+        public DocumentType Type { get; set; }
+
+        /// <summary>
+        /// 命名
+        /// </summary>
+        [Column(StringLength = 500)]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 内容
+        /// </summary>
+        [Column(StringLength = -1)]
+        public string Content { get; set; }
+
+        /// <summary>
+        /// Html
+        /// </summary>
+        [Column(StringLength = -1)]
+        public string Html { get; set; }
+
+        /// <summary>
+        /// 启用
+        /// </summary>
+		public bool Enabled { get; set; } = true;
+
+        /// <summary>
+        /// 打开组
+        /// </summary>
+        public bool? Opened { get; set; }
+
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int? Sort { get; set; } = 0;
+
+        /// <summary>
+        /// 描述
+        /// </summary>
+        [Column(StringLength = 100)]
+        public string Description { get; set; }
+    }
+}

+ 18 - 0
Admin.Core.Model/Admin/DocumentType.cs

@@ -0,0 +1,18 @@
+
+namespace Admin.Core.Model.Admin
+{
+    /// <summary>
+    /// 文档类型
+    /// </summary>
+    public enum DocumentType
+    {
+        /// <summary>
+        /// 分组
+        /// </summary>
+        Group = 1,
+        /// <summary>
+        /// Markdown文档
+        /// </summary>
+        Markdown = 2
+    }
+}

+ 7 - 7
Admin.Core.Model/Admin/LogAbstract.cs

@@ -9,33 +9,33 @@ namespace Admin.Core.Model.Admin
     public abstract class LogAbstract : EntityAdd
     {
         /// <summary>
-        /// 姓名
+        /// 昵称
         /// </summary>
-        [MaxLength(60)]
-        public string RealName { get; set; }
+        [Column(StringLength = 60)]
+        public string NickName { get; set; }
 
         /// <summary>
         /// IP
         /// </summary>
-        [MaxLength(100)]
+        [Column(StringLength = 100)]
         public string IP { get; set; }
 
         /// <summary>
         /// 浏览器
         /// </summary>
-        [MaxLength(100)]
+        [Column(StringLength = 100)]
         public string Browser { get; set; }
 
         /// <summary>
         /// 操作系统
         /// </summary>
-        [MaxLength(100)]
+        [Column(StringLength = 100)]
         public string Os { get; set; }
 
         /// <summary>
         /// 设备
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string Device { get; set; }
 
         /// <summary>

+ 4 - 5
Admin.Core.Model/Admin/PermissionEntity.cs

@@ -1,5 +1,4 @@
 using System.ComponentModel.DataAnnotations;
-using Admin.Core.Model.Admin;
 using FreeSql.DataAnnotations;
 
 namespace Admin.Core.Model.Admin
@@ -19,7 +18,7 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 权限名称
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string Label { get; set; }
 
         /// <summary>
@@ -43,13 +42,13 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 菜单访问地址
         /// </summary>
-        [MaxLength(500)]
+        [Column(StringLength = 500)]
         public string Path { get; set; }
 
         /// <summary>
         /// 图标
         /// </summary>
-        [MaxLength(100)]
+        [Column(StringLength = 100)]
         public string Icon { get; set; }
 
         /// <summary>
@@ -90,7 +89,7 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 描述
         /// </summary>
-        [MaxLength(100)]
+        [Column(StringLength = 100)]
         public string Description { get; set; }
     }
 }

+ 1 - 1
Admin.Core.Model/Admin/RoleEntity.cs

@@ -21,7 +21,7 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 说明
         /// </summary>
-        [Column(DbType = "varchar(100)")]
+        [Column(StringLength = 200)]
 		public string Description { get; set; }
 
         /// <summary>

+ 4 - 10
Admin.Core.Model/Admin/UserEntity.cs

@@ -15,31 +15,25 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 账号
         /// </summary>
-        [MaxLength(60)]
+        [Column(StringLength = 60)]
         public string UserName { get; set; }
 
         /// <summary>
         /// 密码
         /// </summary>
-        [MaxLength(60)]
+        [Column(StringLength = 60)]
         public string Password { get; set; }
 
-        /// <summary>
-        /// 姓名
-        /// </summary>
-        [MaxLength(60)]
-        public string Name { get; set; }
-
         /// <summary>
         /// 昵称
         /// </summary>
-        [MaxLength(60)]
+        [Column(StringLength = 60)]
         public string NickName { get; set; }
 
         /// <summary>
         /// 头像
         /// </summary>
-        [MaxLength(100)]
+       [Column(StringLength = 100)]
         public string Avatar { get; set; }
 
         /// <summary>

+ 4 - 4
Admin.Core.Model/Admin/ViewEntity.cs

@@ -19,25 +19,25 @@ namespace Admin.Core.Model.Admin
         /// <summary>
         /// 视图命名
         /// </summary>
-        [MaxLength(50)]
+        [Column(StringLength = 50)]
         public string Name { get; set; }
 
         /// <summary>
         /// 视图名称
         /// </summary>
-        [MaxLength(500)]
+        [Column(StringLength = 500)]
         public string Label { get; set; }
 
         /// <summary>
         /// 视图路径
         /// </summary>
-        [MaxLength(500)]
+        [Column(StringLength = 500)]
         public string Path { get; set; }
 
         /// <summary>
         /// 说明
         /// </summary>
-        [MaxLength(500)]
+        [Column(StringLength = 500)]
         public string Description { get; set; }
 
         /// <summary>

+ 13 - 0
Admin.Core.Repository/Admin/Document/DocumentRepository.cs

@@ -0,0 +1,13 @@
+using FreeSql;
+using Admin.Core.Model.Admin;
+using Admin.Core.Common.Auth;
+
+namespace Admin.Core.Repository.Admin
+{
+    public class DocumentRepository : RepositoryBase<DocumentEntity>, IDocumentRepository
+    {
+        public DocumentRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        {
+        }
+    }
+}

+ 9 - 0
Admin.Core.Repository/Admin/Document/IDocumentRepository.cs

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

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

@@ -112,7 +112,7 @@ namespace Admin.Core.Service.Admin.Auth
             var user = await _userRepository.Select.WhereDynamic(_user.Id)
                 .ToOneAsync(m => new {
                     m.NickName,
-                    m.Name,
+                    m.UserName,
                     m.Avatar
                 });
 

+ 1 - 1
Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs

@@ -17,6 +17,6 @@ namespace Admin.Core.Service.Admin.Auth.Output
         /// <summary>
         /// 姓名
         /// </summary>
-        public string Name { get; set; }
+        public string NickName { get; set; }
     }
 }

+ 167 - 0
Admin.Core.Services/Admin/Document/DocumentService.cs

@@ -0,0 +1,167 @@
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using AutoMapper;
+using Admin.Core.Repository.Admin;
+using Admin.Core.Model.Admin;
+using Admin.Core.Model.Output;
+using Admin.Core.Service.Admin.Document.Input;
+using Admin.Core.Service.Admin.Document.Output;
+using Admin.Core.Common.Cache;
+
+
+namespace Admin.Core.Service.Admin.Document
+{	
+	public class DocumentService : IDocumentService
+    {
+        private readonly IMapper _mapper;
+        private readonly ICache _cache;
+        private readonly IDocumentRepository _DocumentRepository;
+
+        public DocumentService(
+            IMapper mapper,
+            ICache cache,
+            IDocumentRepository DocumentRepository
+        )
+        {
+            _mapper = mapper;
+            _cache = cache;
+            _DocumentRepository = DocumentRepository;
+        }
+
+        public async Task<IResponseOutput> GetAsync(long 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);
+            return ResponseOutput.Ok(result);
+        }
+
+        public async Task<IResponseOutput> GetMenuAsync(long 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);
+            return ResponseOutput.Ok(result);
+        }
+
+        public async Task<IResponseOutput> GetListAsync(string key, DateTime? start, DateTime? end)
+        {
+            if (end.HasValue)
+            {
+                end = end.Value.AddDays(1);
+            }
+
+            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)
+                .OrderBy(a => a.Sort)
+                .ToListAsync<DocumentListOutput>();
+
+            return ResponseOutput.Ok(data);
+        }
+
+        public async Task<IResponseOutput> AddGroupAsync(DocumentAddGroupInput input)
+        {
+            var entity = _mapper.Map<DocumentEntity>(input);
+            var id = (await _DocumentRepository.InsertAsync(entity)).Id;
+
+            return ResponseOutput.Ok(id > 0);
+        }
+
+        public async Task<IResponseOutput> AddMenuAsync(DocumentAddMenuInput input)
+        {
+            var entity = _mapper.Map<DocumentEntity>(input);
+            var id = (await _DocumentRepository.InsertAsync(entity)).Id;
+
+            return ResponseOutput.Ok(id > 0);
+        }
+
+        public async Task<IResponseOutput> UpdateGroupAsync(DocumentUpdateGroupInput input)
+        {
+            var result = false;
+            if (input != null && input.Id > 0)
+            {
+                var entity = await _DocumentRepository.GetAsync(input.Id);
+                entity = _mapper.Map(input, entity);
+                result = (await _DocumentRepository.UpdateAsync(entity)) > 0;
+            }
+
+            return ResponseOutput.Result(result);
+        }
+
+        public async Task<IResponseOutput> UpdateMenuAsync(DocumentUpdateMenuInput input)
+        {
+            var result = false;
+            if (input != null && input.Id > 0)
+            {
+                var entity = await _DocumentRepository.GetAsync(input.Id);
+                entity = _mapper.Map(input, entity);
+                result = (await _DocumentRepository.UpdateAsync(entity)) > 0;
+            }
+
+            return ResponseOutput.Result(result);
+        }
+
+        public async Task<IResponseOutput> UpdateContentAsync(DocumentUpdateContentInput input)
+        {
+            var result = false;
+            if (input != null && input.Id > 0)
+            {
+                var entity = await _DocumentRepository.GetAsync(input.Id);
+                entity = _mapper.Map(input, entity);
+                result = (await _DocumentRepository.UpdateAsync(entity)) > 0;
+            }
+
+            return ResponseOutput.Result(result);
+        }
+
+        public async Task<IResponseOutput> DeleteAsync(long id)
+        {
+            var result = false;
+            if (id > 0)
+            {
+                result = (await _DocumentRepository.DeleteAsync(m => m.Id == id)) > 0;
+            }
+
+            return ResponseOutput.Result(result);
+        }
+
+        public async Task<IResponseOutput> SoftDeleteAsync(long id)
+        {
+            var result = await _DocumentRepository.SoftDeleteAsync(id);
+            return ResponseOutput.Result(result);
+        }
+
+        public async Task<IResponseOutput> GetPlainListAsync()
+        {
+            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 });
+
+            var menus = documents
+                .Where(a => (new[] { DocumentType.Group, DocumentType.Markdown }).Contains(a.Type))
+                .Select(a => new
+                {
+                    a.Id,
+                    a.ParentId,
+                    a.Label,
+                    a.Type,
+                    a.Opened
+                });
+
+            return ResponseOutput.Ok(menus);
+        }
+    }
+}

+ 38 - 0
Admin.Core.Services/Admin/Document/IDocumentService.cs

@@ -0,0 +1,38 @@
+
+using System;
+using System.Threading.Tasks;
+using Admin.Core.Model.Output;
+using Admin.Core.Service.Admin.Document.Input;
+
+namespace Admin.Core.Service.Admin.Document
+{
+    public partial interface IDocumentService
+    {
+        Task<IResponseOutput> GetAsync(long id);
+
+        Task<IResponseOutput> GetGroupAsync(long id);
+
+        Task<IResponseOutput> GetMenuAsync(long id);
+
+        Task<IResponseOutput> GetContentAsync(long id);
+
+        Task<IResponseOutput> GetPlainListAsync();
+
+        Task<IResponseOutput> GetListAsync(string key, DateTime? start, DateTime? end);
+
+        Task<IResponseOutput> AddGroupAsync(DocumentAddGroupInput input);
+
+        Task<IResponseOutput> AddMenuAsync(DocumentAddMenuInput input);
+
+        Task<IResponseOutput> UpdateGroupAsync(DocumentUpdateGroupInput input);
+
+        Task<IResponseOutput> UpdateMenuAsync(DocumentUpdateMenuInput input);
+
+        Task<IResponseOutput> UpdateContentAsync(DocumentUpdateContentInput input);
+
+        Task<IResponseOutput> DeleteAsync(long id);
+
+        Task<IResponseOutput> SoftDeleteAsync(long id);
+
+    }
+}

+ 32 - 0
Admin.Core.Services/Admin/Document/Input/DocumentAddGroupInput.cs

@@ -0,0 +1,32 @@
+using Admin.Core.Model.Admin;
+
+namespace Admin.Core.Service.Admin.Document.Input
+{
+    public class DocumentAddGroupInput
+    {
+        /// <summary>
+        /// 만섬쌘듐
+        /// </summary>
+        public int ParentId { get; set; }
+
+        /// <summary>
+        /// 잚謹
+        /// </summary>
+        public DocumentType Type { get; set; }
+
+        /// <summary>
+        /// 츰냔
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 츱츰
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 댔역
+        /// </summary>
+        public bool? Opened { get; set; }
+    }
+}

+ 32 - 0
Admin.Core.Services/Admin/Document/Input/DocumentAddMenuInput.cs

@@ -0,0 +1,32 @@
+using Admin.Core.Model.Admin;
+
+namespace Admin.Core.Service.Admin.Document.Input
+{
+    public class DocumentAddMenuInput
+    {
+        /// <summary>
+        /// 만섬쌘듐
+        /// </summary>
+        public int ParentId { get; set; }
+
+        /// <summary>
+        /// 잚謹
+        /// </summary>
+        public DocumentType Type { get; set; }
+
+        /// <summary>
+        /// 츱츰
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 츰냔
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 綱츠
+        /// </summary>
+        public string Description { get; set; }
+    }
+}

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

@@ -0,0 +1,26 @@
+
+namespace Admin.Core.Service.Admin.Document.Input
+{
+    public class DocumentUpdateContentInput
+    {
+        /// <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; }
+    }
+}

+ 16 - 0
Admin.Core.Services/Admin/Document/Input/DocumentUpdateGroupInput.cs

@@ -0,0 +1,16 @@
+
+namespace Admin.Core.Service.Admin.Document.Input
+{
+    public class DocumentUpdateGroupInput : DocumentAddGroupInput
+    {
+        /// <summary>
+        /// 񅧏
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// °æ±¾
+        /// </summary>
+        public long Version { get; set; }
+    }
+}

+ 16 - 0
Admin.Core.Services/Admin/Document/Input/DocumentUpdateMenuInput.cs

@@ -0,0 +1,16 @@
+
+namespace Admin.Core.Service.Admin.Document.Input
+{
+    public class DocumentUpdateMenuInput : DocumentAddMenuInput
+    {
+        /// <summary>
+        /// 񅧏
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// °æ±¾
+        /// </summary>
+        public long Version { get; set; }
+    }
+}

+ 9 - 0
Admin.Core.Services/Admin/Document/Output/DocumentGetContentOutput.cs

@@ -0,0 +1,9 @@
+
+using Admin.Core.Service.Admin.Document.Input;
+
+namespace Admin.Core.Service.Admin.Document.Output
+{
+    public class DocumentGetContentOutput : DocumentUpdateContentInput
+    {
+    }
+}

+ 8 - 0
Admin.Core.Services/Admin/Document/Output/DocumentGetGroupOutput.cs

@@ -0,0 +1,8 @@
+using Admin.Core.Service.Admin.Document.Input;
+
+namespace Admin.Core.Service.Admin.Document.Output
+{
+    public class DocumentGetGroupOutput : DocumentUpdateGroupInput
+    {
+    }
+}

+ 9 - 0
Admin.Core.Services/Admin/Document/Output/DocumentGetMenuOutput.cs

@@ -0,0 +1,9 @@
+
+using Admin.Core.Service.Admin.Document.Input;
+
+namespace Admin.Core.Service.Admin.Document.Output
+{
+    public class DocumentGetMenuOutput : DocumentUpdateMenuInput
+    {
+    }
+}

+ 42 - 0
Admin.Core.Services/Admin/Document/Output/DocumentListOutput.cs

@@ -0,0 +1,42 @@
+using Admin.Core.Model.Admin;
+
+namespace Admin.Core.Service.Admin.Document.Output
+{
+    public class DocumentListOutput
+    {
+        /// <summary>
+        /// 编号
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 父级节点
+        /// </summary>
+        public int ParentId { get; set; }
+
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 类型
+        /// </summary>
+        public DocumentType Type { get; set; }
+
+        /// <summary>
+        /// 命名
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 描述
+        /// </summary>
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 组打开
+        /// </summary>
+        public bool? Opened { get; set; }
+    }
+}

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

@@ -0,0 +1,22 @@
+using AutoMapper;
+using Admin.Core.Model.Admin;
+using Admin.Core.Service.Admin.Document.Input;
+
+namespace Admin.Core.Service.Admin.Document
+{
+    /// <summary>
+    /// 映射配置
+    /// </summary>
+    public class MapConfig : Profile
+    {
+        public MapConfig()
+        {
+            CreateMap<DocumentAddGroupInput, DocumentEntity>();
+            CreateMap<DocumentAddMenuInput, DocumentEntity>();
+
+            CreateMap<DocumentUpdateGroupInput, DocumentEntity>();
+            CreateMap<DocumentUpdateMenuInput, DocumentEntity>();
+            CreateMap<DocumentUpdateContentInput, DocumentEntity>();
+        }
+    }
+}

+ 2 - 2
Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs

@@ -6,9 +6,9 @@
     public class LoginLogAddInput
     {
         /// <summary>
-        /// 姓名
+        /// 昵称
         /// </summary>
-        public string RealName { get; set; }
+        public string NickName { get; set; }
 
         /// <summary>
         /// IP

+ 2 - 2
Admin.Core.Services/Admin/LoginLog/Output/LoginLogListOutput.cs

@@ -10,9 +10,9 @@ namespace Admin.Core.Service.Admin.LoginLog.Output
         public long Id { get; set; }
 
         /// <summary>
-        /// 姓名
+        /// 昵称
         /// </summary>
-        public string RealName { get; set; }
+        public string NickName { get; set; }
 
         /// <summary>
         /// 创建者

+ 2 - 2
Admin.Core.Services/Admin/OprationLog/Input/OprationLogAddInput.cs

@@ -6,9 +6,9 @@
     public class OprationLogAddInput
     {
         /// <summary>
-        /// 姓名
+        /// 昵称
         /// </summary>
-        public string RealName { get; set; }
+        public string NickName { get; set; }
 
         /// <summary>
         /// 接口名称

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

@@ -62,7 +62,7 @@ namespace Admin.Core.Service.Admin.OprationLog
             input.Device = device;
             input.BrowserInfo = ua;
 
-            input.RealName = _user.RealName;
+            input.NickName = _user.NickName;
             input.IP = IPHelper.GetIP(_context?.HttpContext?.Request);
 
             var entity = _mapper.Map<OprationLogEntity>(input);

+ 2 - 2
Admin.Core.Services/Admin/OprationLog/Output/OprationLogListOutput.cs

@@ -10,9 +10,9 @@ namespace Admin.Core.Service.Admin.OprationLog.Output
         public long Id { get; set; }
 
         /// <summary>
-        /// 姓名
+        /// 昵称
         /// </summary>
-        public string RealName { get; set; }
+        public string NickName { get; set; }
 
         /// <summary>
         /// 创建者

+ 1 - 2
Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs

@@ -1,5 +1,4 @@
-using System;
-using Admin.Core.Model.Admin;
+using Admin.Core.Model.Admin;
 
 namespace Admin.Core.Service.Admin.Permission.Output
 {

+ 0 - 6
Admin.Core.Services/Admin/User/Input/UserAddInput.cs

@@ -20,12 +20,6 @@ namespace Admin.Core.Service.Admin.User.Input
         [Required(ErrorMessage = "请输入密码")]
         public string Password { get; set; }
 
-        /// <summary>
-        /// 姓名
-        /// </summary>
-        [Required(ErrorMessage = "请输入姓名")]
-        public string Name { get; set; }
-
         /// <summary>
         /// 昵称
         /// </summary>

+ 2 - 0
Admin.Core.Services/Admin/User/Input/UserUpdateBasicInput.cs

@@ -1,4 +1,5 @@
 using Admin.Core.Model;
+using System.ComponentModel.DataAnnotations;
 
 namespace Admin.Core.Service.Admin.User.Input
 {
@@ -15,6 +16,7 @@ namespace Admin.Core.Service.Admin.User.Input
         /// <summary>
         /// 昵称
         /// </summary>
+        [Required(ErrorMessage = "请输入昵称")]
         public string NickName { get; set; }
 
         /// <summary>

+ 0 - 6
Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs

@@ -19,12 +19,6 @@ namespace Admin.Core.Service.Admin.User.Input
         [Required(ErrorMessage = "请输入账号")]
         public string UserName { get; set; }
 
-        /// <summary>
-        /// 姓名
-        /// </summary>
-        [Required(ErrorMessage = "请输入姓名")]
-        public string Name { get; set; }
-
         /// <summary>
         /// 昵称
         /// </summary>

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

@@ -60,10 +60,10 @@ namespace Admin.Core.FrameWork.Service.User
 
         public async Task<IResponseOutput> PageAsync(PageInput<UserEntity> input)
         {
-            var key = input.Filter?.Name;
+            var key = input.Filter?.UserName;
 
             var list = await _userRepository.Select
-            .WhereIf(key.NotNull(), a => a.Status >= 0 && (a.UserName.Contains(key) || a.NickName.Contains(key) || a.Name.Contains(key)))
+            .WhereIf(key.NotNull(), a => a.Status >= 0 && (a.UserName.Contains(key) || a.NickName.Contains(key)))
             .Count(out var total)
             .OrderByDescending(true, a => a.Id)
             .IncludeMany(a => a.Roles.Select(b => new RoleEntity{ Name = b.Name }))

+ 72 - 7
Admin.Core/Admin.Core.Model.xml

@@ -89,14 +89,84 @@
             排序
             </summary>
         </member>
+        <member name="T:Admin.Core.Model.Admin.DocumentEntity">
+            <summary>
+            文档
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.ParentId">
+            <summary>
+            父级节点
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Label">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Type">
+            <summary>
+            类型
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Name">
+            <summary>
+            命名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Content">
+            <summary>
+            内容
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Html">
+            <summary>
+            Html
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Opened">
+            <summary>
+            打开组
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Sort">
+            <summary>
+            排序
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.DocumentEntity.Description">
+            <summary>
+            描述
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Model.Admin.DocumentType">
+            <summary>
+            文档类型
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Model.Admin.DocumentType.Group">
+            <summary>
+            分组
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Model.Admin.DocumentType.Markdown">
+            <summary>
+            Markdown文档
+            </summary>
+        </member>
         <member name="T:Admin.Core.Model.Admin.LogAbstract">
             <summary>
             日志
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.LogAbstract.RealName">
+        <member name="P:Admin.Core.Model.Admin.LogAbstract.NickName">
             <summary>
-            姓名
+            昵称
             </summary>
         </member>
         <member name="P:Admin.Core.Model.Admin.LogAbstract.IP">
@@ -339,11 +409,6 @@
             密码
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.UserEntity.Name">
-            <summary>
-            姓名
-            </summary>
-        </member>
         <member name="P:Admin.Core.Model.Admin.UserEntity.NickName">
             <summary>
             昵称

+ 139 - 19
Admin.Core/Admin.Core.Service.xml

@@ -242,7 +242,7 @@
             账号
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Auth.Output.AuthLoginOutput.Name">
+        <member name="P:Admin.Core.Service.Admin.Auth.Output.AuthLoginOutput.NickName">
             <summary>
             姓名
             </summary>
@@ -365,14 +365,144 @@
             映射配置
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddGroupInput.ParentId">
+            <summary>
+            父级节点
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddGroupInput.Type">
+            <summary>
+            类型
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddGroupInput.Label">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddGroupInput.Name">
+            <summary>
+            命名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddGroupInput.Opened">
+            <summary>
+            打开
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddMenuInput.ParentId">
+            <summary>
+            父级节点
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddMenuInput.Type">
+            <summary>
+            类型
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddMenuInput.Name">
+            <summary>
+            命名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddMenuInput.Label">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentAddMenuInput.Description">
+            <summary>
+            说明
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateContentInput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateContentInput.Label">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateContentInput.Content">
+            <summary>
+            内容
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateContentInput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateGroupInput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateGroupInput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateMenuInput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Input.DocumentUpdateMenuInput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.ParentId">
+            <summary>
+            父级节点
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.Label">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.Type">
+            <summary>
+            类型
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.Name">
+            <summary>
+            命名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.Description">
+            <summary>
+            描述
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Document.Output.DocumentListOutput.Opened">
+            <summary>
+            组打开
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Service.Admin.Document.MapConfig">
+            <summary>
+            映射配置
+            </summary>
+        </member>
         <member name="T:Admin.Core.Service.Admin.LoginLog.Input.LoginLogAddInput">
             <summary>
             添加
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.LoginLog.Input.LoginLogAddInput.RealName">
+        <member name="P:Admin.Core.Service.Admin.LoginLog.Input.LoginLogAddInput.NickName">
             <summary>
-            姓名
+            昵称
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.LoginLog.Input.LoginLogAddInput.IP">
@@ -435,9 +565,9 @@
             编号
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.LoginLog.Output.LoginLogListOutput.RealName">
+        <member name="P:Admin.Core.Service.Admin.LoginLog.Output.LoginLogListOutput.NickName">
             <summary>
-            姓名
+            昵称
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.LoginLog.Output.LoginLogListOutput.CreatedUserName">
@@ -495,9 +625,9 @@
             添加
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.OprationLog.Input.OprationLogAddInput.RealName">
+        <member name="P:Admin.Core.Service.Admin.OprationLog.Input.OprationLogAddInput.NickName">
             <summary>
-            姓名
+            昵称
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.OprationLog.Input.OprationLogAddInput.ApiLabel">
@@ -570,9 +700,9 @@
             编号
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.OprationLog.Output.OprationLogListOutput.RealName">
+        <member name="P:Admin.Core.Service.Admin.OprationLog.Output.OprationLogListOutput.NickName">
             <summary>
-            姓名
+            昵称
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.OprationLog.Output.OprationLogListOutput.CreatedUserName">
@@ -935,11 +1065,6 @@
             密码
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.User.Input.UserAddInput.Name">
-            <summary>
-            姓名
-            </summary>
-        </member>
         <member name="P:Admin.Core.Service.Admin.User.Input.UserAddInput.NickName">
             <summary>
             昵称
@@ -1030,11 +1155,6 @@
             账号
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.User.Input.UserUpdateInput.Name">
-            <summary>
-            姓名
-            </summary>
-        </member>
         <member name="P:Admin.Core.Service.Admin.User.Input.UserUpdateInput.NickName">
             <summary>
             昵称

+ 3 - 2
Admin.Core/Admin.Core.csproj

@@ -34,9 +34,9 @@
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.3" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.3" />
     <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.1" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.3" />
 
-    <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.1" />
+    <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.2" />
     <PackageReference Include="NLog" Version="4.7.0" />
   </ItemGroup>
 
@@ -58,6 +58,7 @@
 
   <ItemGroup>
     <Folder Include="Properties\PublishProfiles\" />
+    <Folder Include="wwwroot\" />
   </ItemGroup>
 
   <ProjectExtensions><VisualStudio><UserProperties properties_4launchsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>

+ 81 - 15
Admin.Core/Admin.Core.xml

@@ -218,33 +218,100 @@
             <param name="id"></param>
             <returns></returns>
         </member>
-        <member name="T:Admin.Core.Controllers.Admin.ImgController">
+        <member name="T:Admin.Core.Controllers.Admin.DocumentController">
             <summary>
-            图片管理
+            文档管理
             </summary>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.ImgController.Avatar(Microsoft.AspNetCore.Hosting.IWebHostEnvironment,System.String)">
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.GetList(System.String,System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
             <summary>
-            获取头像
+            查询文档列表
             </summary>
-            <param name="environment"></param>
-            <param name="fileName"></param>
+            <param name="key"></param>
+            <param name="start"></param>
+            <param name="end"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.ImgController.Download(Microsoft.AspNetCore.Hosting.IWebHostEnvironment,System.String)">
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.GetGroup(System.Int64)">
             <summary>
-            下载图片
+            查询单条分组
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.GetMenu(System.Int64)">
+            <summary>
+            查询单条菜单
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.GetContent(System.Int64)">
+            <summary>
+            查询单条文档内容
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.GetPlainList">
+            <summary>
+            查询精简文档列表
             </summary>
-            <param name="environment"></param>
-            <param name="fileName"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Controllers.Admin.ImgController.Upload(Microsoft.AspNetCore.Hosting.IWebHostEnvironment)">
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.AddGroup(Admin.Core.Service.Admin.Document.Input.DocumentAddGroupInput)">
+            <summary>
+            新增分组
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.AddMenu(Admin.Core.Service.Admin.Document.Input.DocumentAddMenuInput)">
+            <summary>
+            新增菜单
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.UpdateGroup(Admin.Core.Service.Admin.Document.Input.DocumentUpdateGroupInput)">
+            <summary>
+            修改分组
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.UpdateMenu(Admin.Core.Service.Admin.Document.Input.DocumentUpdateMenuInput)">
+            <summary>
+            修改菜单
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.UpdateContent(Admin.Core.Service.Admin.Document.Input.DocumentUpdateContentInput)">
+            <summary>
+            修改文档内容
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.DocumentController.SoftDelete(System.Int64)">
+            <summary>
+            删除文档
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Admin.Core.Controllers.Admin.ImgController">
+            <summary>
+            图片管理
+            </summary>
+        </member>
+        <member name="M:Admin.Core.Controllers.Admin.ImgController.AvatarUpload(Microsoft.AspNetCore.Hosting.IWebHostEnvironment,Microsoft.AspNetCore.Http.IFormFile)">
             <summary>
-            上传图片
-            支持多图片上传
+            上传头像
             </summary>
             <param name="environment"></param>
+            <param name="file"></param>
             <returns></returns>
         </member>
         <member name="T:Admin.Core.Controllers.Admin.LoginLogController">
@@ -605,13 +672,12 @@
             <param name="db"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment,Admin.Core.Common.Configs.AppConfig)">
+        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
             <summary>
             添加数据库
             </summary>
             <param name="services"></param>
             <param name="env"></param>
-            <param name="appConfig"></param>
         </member>
         <member name="T:Admin.Core.Enums.ApiVersion">
             <summary>

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

@@ -100,7 +100,7 @@ namespace Admin.Core.Controllers.Admin
             {
                 user = (res as IResponseOutput<AuthLoginOutput>).Data;
                 loginLogAddInput.CreatedUserId = user.Id;
-                loginLogAddInput.RealName = user.Name;
+                loginLogAddInput.NickName = user.NickName;
             }
 
             await _loginLogService.AddAsync(loginLogAddInput);
@@ -116,7 +116,7 @@ namespace Admin.Core.Controllers.Admin
             {
                 new Claim(ClaimAttributes.UserId, user.Id.ToString()),
                 new Claim(ClaimAttributes.UserName, user.UserName),
-                new Claim(ClaimAttributes.UserRealName, user.Name)
+                new Claim(ClaimAttributes.UserNickName, user.NickName)
             }); 
             #endregion
 

+ 144 - 0
Admin.Core/Controllers/Admin/DocumentController.cs

@@ -0,0 +1,144 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Admin.Core.Model.Output;
+using Admin.Core.Service.Admin.Document;
+using Admin.Core.Service.Admin.Document.Input;
+
+namespace Admin.Core.Controllers.Admin
+{
+    /// <summary>
+    /// 文档管理
+    /// </summary>
+    public class DocumentController : AreaController
+    {
+        private readonly IDocumentService _documentServices;
+
+        public DocumentController(IDocumentService documentServices)
+        {
+            _documentServices = documentServices;
+        }
+
+        /// <summary>
+        /// 查询文档列表
+        /// </summary>
+        /// <param name="key"></param>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> GetList(string key, DateTime? start, DateTime? end)
+        {
+            return await _documentServices.GetListAsync(key,start,end);
+        }
+
+        /// <summary>
+        /// 查询单条分组
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> GetGroup(long id)
+        {
+            return await _documentServices.GetGroupAsync(id);
+        }
+
+        /// <summary>
+        /// 查询单条菜单
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> GetMenu(long id)
+        {
+            return await _documentServices.GetMenuAsync(id);
+        }
+
+        /// <summary>
+        /// 查询单条文档内容
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> GetContent(long id)
+        {
+            return await _documentServices.GetContentAsync(id);
+        }
+
+        /// <summary>
+        /// 查询精简文档列表
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> GetPlainList()
+        {
+            return await _documentServices.GetPlainListAsync();
+        }
+
+        /// <summary>
+        /// 新增分组
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IResponseOutput> AddGroup(DocumentAddGroupInput input)
+        {
+            return await _documentServices.AddGroupAsync(input);
+        }
+
+        /// <summary>
+        /// 新增菜单
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IResponseOutput> AddMenu(DocumentAddMenuInput input)
+        {
+            return await _documentServices.AddMenuAsync(input);
+        }
+
+        /// <summary>
+        /// 修改分组
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPut]
+        public async Task<IResponseOutput> UpdateGroup(DocumentUpdateGroupInput input)
+        {
+            return await _documentServices.UpdateGroupAsync(input);
+        }
+
+        /// <summary>
+        /// 修改菜单
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPut]
+        public async Task<IResponseOutput> UpdateMenu(DocumentUpdateMenuInput input)
+        {
+            return await _documentServices.UpdateMenuAsync(input);
+        }
+
+        /// <summary>
+        /// 修改文档内容
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPut]
+        public async Task<IResponseOutput> UpdateContent(DocumentUpdateContentInput input)
+        {
+            return await _documentServices.UpdateContentAsync(input);
+        }
+
+        /// <summary>
+        /// 删除文档
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpDelete]
+        public async Task<IResponseOutput> SoftDelete(long id)
+        {
+            return await _documentServices.SoftDeleteAsync(id);
+        }
+    }
+}

+ 54 - 68
Admin.Core/Controllers/Admin/ImgController.cs

@@ -5,122 +5,108 @@ using System.Threading.Tasks;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using Admin.Core.Model.Output;
 using Admin.Core.Attributes;
+using Admin.Core.Common.Helpers;
+using Admin.Core.Common.Configs;
+using Admin.Core.Common.Auth;
 
 namespace Admin.Core.Controllers.Admin
 {
     /// <summary>
     /// 图片管理
     /// </summary>
-    [Area("Admin")]
-    [Route("api/[area]/[controller]/[action]")]
-    [ApiController]
-    [NoOprationLog]
-    public class ImgController : ControllerBase
+    public class ImgController : AreaController
     {
-        /// <summary>
-        /// 获取头像
-        /// </summary>
-        /// <param name="environment"></param>
-        /// <param name="fileName"></param>
-        /// <returns></returns>
-        [HttpGet]
-        [Route("{fileName}")]
-        public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, string fileName = "")
+        private readonly IUser _user;
+        private readonly UploadConfig _uploadConfig;
+        
+        public ImgController(IUser user, IOptionsMonitor<UploadConfig> uploadConfig)
         {
-            string filepath = Path.Combine(environment.WebRootPath,"avatar", fileName);
-            var stream = System.IO.File.OpenRead(filepath);
-            string fileExt = Path.GetExtension(filepath);
-            var contentTypeProvider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider();
-            var contentType = contentTypeProvider.Mappings[fileExt];
-            var fileDownloadName = Path.GetFileName(filepath);
-
-            return File(stream, contentType, fileDownloadName);
+            _user = user;
+            _uploadConfig = uploadConfig.CurrentValue;
         }
 
+        /*
         /// <summary>
-        /// 下载图片
+        /// 获取头像
         /// </summary>
         /// <param name="environment"></param>
         /// <param name="fileName"></param>
         /// <returns></returns>
         [HttpGet]
         [Route("{fileName}")]
-        public FileStreamResult Download([FromServices]IWebHostEnvironment environment,string fileName = "")
+        [NoOprationLog]
+        [AllowAnonymous]
+        public FileStreamResult Avatar([FromServices]IWebHostEnvironment environment, string fileName = "")
         {
-            string filepath = Path.Combine(environment.WebRootPath, "images", fileName);
-            var stream = System.IO.File.OpenRead(filepath);
-            string fileExt = Path.GetExtension(filepath);
+            string filePath = Path.Combine(environment.WebRootPath,"avatar", fileName);
+            var stream = System.IO.File.OpenRead(filePath);
+            string fileExt = Path.GetExtension(filePath);
             var contentTypeProvider = new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider();
             var contentType = contentTypeProvider.Mappings[fileExt];
-            var fileDownloadName = Path.GetFileName(filepath);
+            var fileDownloadName = Path.GetFileName(filePath);
 
             return File(stream, contentType, fileDownloadName);
         }
+        */
 
         /// <summary>
-        /// 上传图片
-        /// 支持多图片上传
+        /// 上传头像
         /// </summary>
         /// <param name="environment"></param>
+        /// <param name="file"></param>
         /// <returns></returns>
         [HttpPost]
-        public async Task<IResponseOutput> Upload([FromServices]IWebHostEnvironment environment)
+        [Login]
+        public async Task<IResponseOutput> AvatarUpload([FromServices]IWebHostEnvironment environment, IFormFile file)
         {
-            string path = string.Empty;
-            string foldername = "images";
-            IFormFileCollection files = null;
-
-            try
+            if(file == null || file.Length < 1)
             {
-                files = Request.Form.Files;
-            }
-            catch (Exception)
-            {
-                files = null;
+                if (Request.Form.Files != null && Request.Form.Files.Any())
+                {
+                    file = Request.Form.Files[0];
+                }
             }
 
-            if (files == null || !files.Any()) 
+            if (file == null || file.Length < 1)
             {
-                return ResponseOutput.NotOk("请选择上传的文件。");
+                return ResponseOutput.NotOk("请上传头像!");
             }
 
+            var avatar = _uploadConfig.Avatar;
+
             //格式限制
-            var allowType = new string[] { "image/jpg", "image/png", "image/jpeg" };
+            if (!avatar.ContentType.Contains(file.ContentType))
+            {
+                return ResponseOutput.NotOk("图片格式错误");
+            }
 
-            string folderpath = Path.Combine(environment.WebRootPath, foldername);
-            if (!Directory.Exists(folderpath))
+            //大小限制
+            if (!(file.Length <= avatar.Size))
             {
-                Directory.CreateDirectory(folderpath);
+                return ResponseOutput.NotOk("图片过大");
             }
 
-            if (files.Any(c => allowType.Contains(c.ContentType)))
+            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))
             {
-                if (files.Sum(c => c.Length) <= 1024 * 1024 * 4)
-                {
-                    //foreach (var file in files)
-                    var file = files.FirstOrDefault();
-                    string strpath = Path.Combine(foldername, DateTime.Now.ToString("MMddHHmmss") + file.FileName);
-                    path = Path.Combine(environment.WebRootPath, strpath);
+                Directory.CreateDirectory(fullDirectory);
+            }
 
-                    using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
-                    {
-                        await file.CopyToAsync(stream);
-                    }
+            var saveFileName = $"{new Snowfake(0).nextId()}{Path.GetExtension(file.FileName)}";
+            var fullPath = Path.Combine(fullDirectory, saveFileName);
 
-                    return ResponseOutput.Ok(strpath);
-                }
-                else
-                {
-                    return ResponseOutput.NotOk("图片过大");
-                }
-            }
-            else
+            using (var stream = new FileStream(fullPath, FileMode.Create))
             {
-                return ResponseOutput.NotOk("图片格式错误");
+                await file.CopyToAsync(stream);
             }
+
+            return ResponseOutput.Ok(Path.Combine(savePath, saveFileName));
         }
     }
-
 }

+ 1 - 0
Admin.Core/Db/Data.cs

@@ -14,5 +14,6 @@ namespace Admin.Core.Db
         public RoleEntity[] Roles { get; set; }
         public UserRoleEntity[] UserRoles { get; set; }
         public RolePermissionEntity[] RolePermissions { get; set; }
+        public DocumentEntity[] Documents { get; set; }
     }
 }

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
Admin.Core/Db/Data/data.json


+ 3 - 2
Admin.Core/Db/DbHelper.cs

@@ -79,7 +79,8 @@ namespace Admin.Core.Db
                 typeof(UserRoleEntity),
                 typeof(RolePermissionEntity),
                 typeof(OprationLogEntity),
-                typeof(LoginLogEntity)
+                typeof(LoginLogEntity),
+                typeof(DocumentEntity)
             });
             Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n");
         }
@@ -201,6 +202,7 @@ namespace Admin.Core.Db
                 using (var uow = db.CreateUnitOfWork())
                 using (var tran = uow.GetOrBeginTransaction())
                 {
+                    await InitDtData(db, data.Documents, tran, dbConfig);
                     await InitDtData(db, data.Dictionaries, tran, dbConfig);
                     await InitDtData(db, data.Apis, tran, dbConfig);
                     await InitDtData(db, data.Views, tran, dbConfig);
@@ -302,7 +304,6 @@ namespace Admin.Core.Db
                     a.Id,
                     a.UserName,
                     a.Password,
-                    a.Name,
                     a.NickName,
                     a.Avatar,
                     a.Status,

+ 5 - 5
Admin.Core/Db/ServiceCollectionExtensions.cs

@@ -16,8 +16,7 @@ namespace Admin.Core.Db
         /// </summary>
         /// <param name="services"></param>
         /// <param name="env"></param>
-        /// <param name="appConfig"></param>
-        public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig)
+        public async static void AddDb(this IServiceCollection services, IHostEnvironment env)
         {
             var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", env.EnvironmentName);
 
@@ -76,7 +75,10 @@ namespace Admin.Core.Db
             {
                 fsql.Aop.CurdBefore += (s, e) =>
                 {
-                    Console.WriteLine($"{e.Sql}\r\n");
+                    System.Threading.Tasks.Parallel.For(0, 1, body =>
+                    {
+                        Console.WriteLine($"{e.Sql}\r\n");
+                    });
                 };
             }
             #endregion
@@ -126,8 +128,6 @@ namespace Admin.Core.Db
             };
             #endregion
             #endregion
-
-            Console.WriteLine($"{appConfig.Urls}\r\n");
         }
     }
 }

+ 34 - 0
Admin.Core/Extensions/UploadConfigApplicationBuilderExtensions.cs

@@ -0,0 +1,34 @@
+using System.IO;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.DependencyInjection;
+using Admin.Core.Common.Configs;
+using Microsoft.Extensions.FileProviders;
+
+namespace Admin.Core.Extensions
+{
+    public static class UploadConfigApplicationBuilderExtensions
+    {
+        private static void UseAvatar(IApplicationBuilder app, AvatarConfig avatarConfig)
+        {
+            if (!Directory.Exists(avatarConfig.Path))
+            {
+                Directory.CreateDirectory(avatarConfig.Path);
+            }
+
+            app.UseStaticFiles(new StaticFileOptions() 
+            {
+                RequestPath = avatarConfig.RequestPath,
+                FileProvider = new PhysicalFileProvider(avatarConfig.Path)
+            });
+        }
+
+        public static void UseUploadConfig(this IApplicationBuilder app)
+        {
+            var uploadConfig = app.ApplicationServices.GetRequiredService<IOptions<UploadConfig>>();
+            var avatar = uploadConfig.Value.Avatar;
+            UseAvatar(app, avatar);
+        }
+    }
+
+}

+ 2 - 2
Admin.Core/Program.cs

@@ -4,11 +4,11 @@ using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
 using Autofac.Extensions.DependencyInjection;
 using NLog.Web;
-//using NLog;
-//using NLog.Extensions.Logging;
 using Admin.Core.Common.Helpers;
 using LogLevel = Microsoft.Extensions.Logging.LogLevel;
 using Admin.Core.Common.Configs;
+//using NLog;
+//using NLog.Extensions.Logging;
 //using EnvironmentName = Microsoft.AspNetCore.Hosting.EnvironmentName;
 
 namespace Admin.Core

+ 17 - 7
Admin.Core/Startup.cs

@@ -14,7 +14,6 @@ using Microsoft.IdentityModel.Tokens;
 using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection.Extensions;
-using Microsoft.Extensions.PlatformAbstractions;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using Autofac;
@@ -30,17 +29,19 @@ using Admin.Core.Enums;
 using Admin.Core.Filters;
 using Admin.Core.Db;
 using Admin.Core.Common.Cache;
-using PermissionHandler = Admin.Core.Auth.PermissionHandler;
 using Admin.Core.Aop;
 using Admin.Core.Logs;
+using PermissionHandler = Admin.Core.Auth.PermissionHandler;
+using Microsoft.Extensions.Options;
+using Admin.Core.Extensions;
 
 namespace Admin.Core
 {
     public class Startup
     {
         private readonly IHostEnvironment _env;
+        private static string basePath => AppContext.BaseDirectory;
         private readonly AppConfig _appConfig;
-        private static string basePath => PlatformServices.Default.Application.ApplicationBasePath;
 
         public Startup(IWebHostEnvironment env)
         {
@@ -53,6 +54,10 @@ namespace Admin.Core
             services.AddSingleton(_appConfig);
             services.AddSingleton(typeof(ApiHelper));
 
+            //上传配置
+            var uploadConfig = new ConfigHelper().Load("uploadconfig", _env.EnvironmentName, true);
+            services.Configure<UploadConfig>(uploadConfig);
+
             #region AutoMapper 自动映射
             var serviceAssembly = Assembly.Load("Admin.Core.Service");
             services.AddAutoMapper(serviceAssembly);
@@ -188,7 +193,7 @@ namespace Admin.Core
             #endregion
 
             //数据库
-            services.AddDb(_env, _appConfig);
+            services.AddDb(_env);
 
             #region 缓存
             var cacheConfig = new ConfigHelper().Get<CacheConfig>("cacheconfig", _env.EnvironmentName);
@@ -212,7 +217,6 @@ namespace Admin.Core
         public void ConfigureContainer(ContainerBuilder builder)
         {
             #region AutoFac IOC容器
-
             try
             {
                 #region Aop
@@ -247,14 +251,20 @@ namespace Admin.Core
             #endregion
         }
 
-        public void Configure(IApplicationBuilder app, IHostEnvironment env)
+        public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime)
         {
+            //启动事件
+            lifetime.ApplicationStarted.Register(() =>
+            {
+                Console.WriteLine($"{_appConfig.Urls}\r\n");
+            });
+
             #region app配置
             //异常
             app.UseExceptionHandler("/Error");
 
             //静态文件
-            app.UseStaticFiles();
+            app.UseUploadConfig();
 
             //路由
             app.UseRouting();

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

@@ -1,4 +1,9 @@
 {
+  //监听所有操作
+  "monitorCommand": false,
+  //监听Curd操作
+  "curd": false,
+
   //生成数据
   "generateData": false,
 

+ 4 - 4
Admin.Core/configs/jwtconfig.json

@@ -1,10 +1,10 @@
 {
   //发行者
-  "issuer": "http://www.zhontai.com",
+  "issuer": "https://www.admin.zhontai.com",
   //订阅者
-  "audience": "http://www.zhontai.com",
-  //
-  "securityKey": "ertJKl#521*a@790asD&",
+  "audience": "https://www.admin.zhontai.com",
+  //
+  "securityKey": "ertJKl#521*a@790asD&1#",
   //有效期(分钟)
   "expires": 120
 }

+ 3 - 0
Admin.Core/configs/uploadconfig.Development.json

@@ -0,0 +1,3 @@
+{
+
+}

+ 34 - 0
Admin.Core/configs/uploadconfig.json

@@ -0,0 +1,34 @@
+{
+  //头像
+  "avatar": {
+    //路径 D:/upload/admin/avatar
+    "path": "D:/upload/admin/avatar",
+    //请求路径
+    "requestPath": "/upload/admin/avatar",
+
+    //路径日期格式 yyyy/MM/dd
+    "dateTimeFormat": "",
+    //{用户编号}
+    "format": "{0}",
+    //图片大小 1M = 1024 * 1024
+    "size": 1048576,
+    //图片格式
+    "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ]
+  },
+  //文档
+  "document": {
+    //路径 D:/upload/admin/document
+    "path": "D:/upload/admin/document",
+    //请求路径
+    "requestPath": "/images",
+
+    //路径日期格式 yyyy/MM/dd
+    "dateTimeFormat": "",
+    //{文档编号}
+    "format": "{0}",
+    //文件大小 10M = 10 * 1024 * 1024
+    "size": 10485760,
+    //文件格式
+    "contentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif" ]
+  }
+}

BIN
Admin.Core/wwwroot/avatar/avatar.gif


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно