From 71d0c92a63f1e26c6ba9634413083de1acaf916c Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期三, 06 八月 2025 11:18:29 +0800
Subject: [PATCH] feat:数据字典类别开发

---
 FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs                         |   57 
 FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs                                         |    2 
 FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs                                    |  252 ++-
 FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs                                    |   24 
 FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs                                        |    8 
 FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs                                            |   16 
 FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs          |  130 +
 FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs                              |    2 
 FlexJobApi.Core/Entities/Users/Role.cs                                                  |    2 
 FlexJobApi.Core/Utils/DbUtils/DbUtils.cs                                                |  118 +
 FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs    |    2 
 FlexJobApi.Core/Entities/Common/DictionaryData.cs                                       |    2 
 FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs      |    4 
 FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs                                            |   39 
 FlexJobApi.Core/FlexJobApi.Core.xml                                                     |  377 +++-
 FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs | 2231 +++++++++++++++++++++++++++++++++
 FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs                             |   23 
 FlexJobApi.Database.Migrations/REDEME.MD                                                |    2 
 FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs            |   46 
 FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs         |   72 +
 FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs    |   17 
 FlexJobApi.User.Application/FlexJobApi.User.Application.xml                             |   25 
 FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs          |    4 
 FlexJobApi.Core/settings.json                                                           |    7 
 FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs                         |    5 
 FlexJobApi.Core/Entities/Common/Resource.cs                                             |   42 
 FlexJobApi.Core/Enums/Common/EnumResourceService.cs                                     |    4 
 FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs        |    7 
 FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs                |   14 
 FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs              |   54 
 FlexJobApi.Core/Entities/Users/Department.cs                                            |    2 
 FlexJobApi.Application/FlexJobApi.Application.xml                                       |   81 
 FlexJobApi.Core/Entities/Users/Menu.cs                                                  |    2 
 FlexJobApi.Core/Interfaces/IIsDisabled.cs                                               |   19 
 FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs             |    2 
 /dev/null                                                                               |   50 
 FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs                  |    2 
 FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs      |   32 
 FlexJobApi.Core/FlexJobApiCoreStartup.cs                                                |   12 
 FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs                       |   35 
 FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs |   17 
 FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs        |   42 
 FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs                                   |   27 
 FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs              |   33 
 FlexJobApi.Core/FlexJobApi.Core.csproj                                                  |    1 
 FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs             |    8 
 46 files changed, 3,605 insertions(+), 348 deletions(-)

diff --git a/FlexJobApi.Application/Dictionaries/Commands/DeleteDictionaryCategoryCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/DeleteDictionaryCategoryCommandHandler.cs
deleted file mode 100644
index a430922..0000000
--- a/FlexJobApi.Application/Dictionaries/Commands/DeleteDictionaryCategoryCommandHandler.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-锘縰sing FlexJobApi.Core;
-using MediatR;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Application
-{
-    /// <summary>
-    /// 鍒犻櫎瀛楀吀绫诲埆
-    /// </summary>
-    public class DeleteDictionaryCategoryCommandHandler : IRequestHandler<DeleteDictionaryCategoryCommand, int>
-    {
-        public async Task<int> Handle(DeleteDictionaryCategoryCommand request, CancellationToken cancellationToken)
-        {
-            return await DbUtils.DeleteData<DictionaryCategory>(request, null, cancellationToken);
-        }
-    }
-}
diff --git a/FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs
new file mode 100644
index 0000000..ec0ca8a
--- /dev/null
+++ b/FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs
@@ -0,0 +1,42 @@
+锘縰sing FlexJobApi.Core;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Application
+{
+    /// <summary>
+    /// 瀛楀吀绫诲埆鍛戒护澶勭悊鍣�
+    /// </summary>
+    public class DictionaryCategoryCommandHandler :
+        IRequestHandler<DeleteDictionaryCategoryCommand, int>,
+        IRequestHandler<SaveDictionaryCategoryCommand, Guid>
+    {
+        /// <summary>
+        /// 鍒犻櫎鏁版嵁瀛楀吀绫诲埆
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<int> Handle(DeleteDictionaryCategoryCommand request, CancellationToken cancellationToken)
+        {
+            return DbUtils.DeleteData<DictionaryCategory>(request, null, cancellationToken);
+        }
+
+        /// <summary>
+        /// 淇濆瓨鏁版嵁瀛楀吀绫诲埆
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<Guid> Handle(SaveDictionaryCategoryCommand request, CancellationToken cancellationToken)
+        {
+            return request.SaveData<DictionaryCategory, SaveDictionaryCategoryCommand>(
+                 (q, e, r) => q.Any(it => it.Id != request.Id && it.Code == request.Code),
+                 cancellationToken);
+        }
+    }
+}
diff --git a/FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs
new file mode 100644
index 0000000..a480570
--- /dev/null
+++ b/FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs
@@ -0,0 +1,46 @@
+锘縰sing FlexJobApi.Core;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Application
+{
+    /// <summary>
+    /// 鏁版嵁瀛楀吀鍛戒护澶勭悊鍣�
+    /// </summary>
+    public class DictionaryDataCommandHandler :
+        IRequestHandler<SaveDictionaryDataCommand, Guid>,
+        IRequestHandler<SetDictionaryDataIsDisabledCommand, int>
+
+    {
+        /// <summary>
+        /// 淇濆瓨鏁版嵁瀛楀吀
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<Guid> Handle(SaveDictionaryDataCommand request, CancellationToken cancellationToken)
+        {
+            return request.SaveData<DictionaryData, SaveDictionaryDataCommand>(
+                (q, e, r) => q.Any(it =>
+                    it.CategoryId == request.CategoryId
+                    && it.ParentId == request.ParentId
+                    && it.Code == request.Code
+                    && it.Content == request.Content), cancellationToken);
+        }
+
+        /// <summary>
+        /// 璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<int> Handle(SetDictionaryDataIsDisabledCommand request, CancellationToken cancellationToken)
+        {
+            return request.SetIsDisable<DictionaryData>(cancellationToken: cancellationToken);
+        }
+    }
+}
diff --git a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryCategoryCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryCategoryCommandHandler.cs
deleted file mode 100644
index 2e85eb0..0000000
--- a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryCategoryCommandHandler.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-锘縰sing FlexJobApi.Core;
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Application
-{
-    /// <summary>
-    /// 淇濆瓨瀛楀吀绫诲埆
-    /// </summary>
-    public class SaveDictionaryCategoryCommandHandler : IRequestHandler<SaveDictionaryCategoryCommand, Guid>
-    {
-        public Task<Guid> Handle(SaveDictionaryCategoryCommand request, CancellationToken cancellationToken)
-        {
-            return request.SaveData<DictionaryCategory, SaveDictionaryCategoryCommand>(
-                 (q, e, r) => q.Any(it => it.Id != request.Id && it.Code == request.Code),
-                 cancellationToken);
-        }
-    }
-}
diff --git a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryDataCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryDataCommandHandler.cs
deleted file mode 100644
index 6fc0fe4..0000000
--- a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryDataCommandHandler.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-锘縰sing FlexJobApi.Core;
-using MediatR;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Application
-{
-    /// <summary>
-    /// 淇濆瓨瀛楀吀鏁版嵁
-    /// </summary>
-    public class SaveDictionaryDataCommandHandler : IRequestHandler<SaveDictionaryDataCommand, Guid>
-    {
-        public Task<Guid> Handle(SaveDictionaryDataCommand request, CancellationToken cancellationToken)
-        {
-            return request.SaveData<DictionaryData, SaveDictionaryDataCommand>(
-                (q, e, r) => q.Any(it =>
-                    it.CategoryId == request.CategoryId
-                    && it.ParentId == request.ParentId
-                    && it.Code == request.Code
-                    && it.Content == request.Content), cancellationToken);
-        }
-    }
-}
diff --git a/FlexJobApi.Application/Dictionaries/Commands/SetDictionaryDataIsDisabledCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/SetDictionaryDataIsDisabledCommandHandler.cs
deleted file mode 100644
index 56b9506..0000000
--- a/FlexJobApi.Application/Dictionaries/Commands/SetDictionaryDataIsDisabledCommandHandler.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-锘縰sing FlexJobApi.Core;
-using Furion.DatabaseAccessor;
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Application
-{
-    /// <summary>
-    /// 璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤
-    /// </summary>
-    public class SetDictionaryDataIsDisabledCommandHandler(
-            IRepository<DictionaryData> rep
-        ) : IRequestHandler<SetDictionaryDataIsDisabledCommand, int>
-    {
-        private readonly IRepository<DictionaryData> rep = rep;
-
-        public async Task<int> Handle(SetDictionaryDataIsDisabledCommand request, CancellationToken cancellationToken)
-        {
-            var entities = await rep.AsQueryable()
-                .Where(it => request.Ids.Contains(it.Id) && it.IsDisabled != request.IsDisabled)
-                .ToListAsync();
-            foreach (var entity in entities)
-            {
-                entity.IsDisabled = request.IsDisabled;
-            }
-            return entities.Count;
-        }
-    }
-}
diff --git a/FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs
new file mode 100644
index 0000000..79d4f86
--- /dev/null
+++ b/FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs
@@ -0,0 +1,72 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using Mapster;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Application
+{
+    /// <summary>
+    /// 鏁版嵁瀛楀吀绫诲埆鏌ヨ澶勭悊鍣�
+    /// </summary>
+    public class DictionaryCategoriesQueryHandler(
+            IRepository<DictionaryCategory> rep
+        ) : IRequestHandler<GetDictionaryCategoriesQuery, PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>>,
+            IRequestHandler<GetDictionaryCategorySelectQuery, List<SelectQueryResultItem<Guid>>>
+    {
+        private readonly IRepository<DictionaryCategory> rep = rep;
+
+        /// <summary>
+        /// 鏌ヨ鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>> Handle(GetDictionaryCategoriesQuery request, CancellationToken cancellationToken)
+        {
+            return request.PageModel.ToPagedListAsync<DictionaryCategory, GetDictionaryCategoriesQueryResultItem>(
+                q =>
+                {
+                    q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime);
+                    if (request.Keywords.IsNotNull())
+                    {
+                        q = q.Where(it =>
+                            it.Code.Contains(request.Keywords) ||
+                            it.Name.Contains(request.Keywords) ||
+                            it.Remark.Contains(request.Keywords));
+                    }
+                    return q;
+                }, cancellationToken: cancellationToken);
+        }
+
+        /// <summary>
+        /// 鏌ヨ鏁版嵁瀛楀吀绫诲埆閫夋嫨鍣ㄦ暟鎹�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<List<SelectQueryResultItem<Guid>>> Handle(GetDictionaryCategorySelectQuery request, CancellationToken cancellationToken)
+        {
+            var items = rep.AsQueryable().AsNoTracking()
+                .Select(it => new SelectQueryResultItem<Guid>
+                {
+                    Value = it.Id,
+                    Label = it.Name,
+                    Data = new
+                    {
+                        it.Id,
+                        it.Name,
+                        it.Remark,
+                        it.FieldNames
+                    }
+                })
+                .ToListAsync(cancellationToken);
+            return items;
+        }
+    }
+}
diff --git a/FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs
new file mode 100644
index 0000000..aedfaf2
--- /dev/null
+++ b/FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs
@@ -0,0 +1,54 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using Mapster;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Application
+{
+    /// <summary>
+    /// 鏁版嵁瀛楀吀鏌ヨ澶勭悊鍣�
+    /// </summary>
+    public class DictionaryDatasQueryHandler(
+            IRepository<DictionaryData> rep
+        ) : IRequestHandler<GetDictionaryDatasQuery, PagedListQueryResult<GetDictionaryDatasQueryResultItem>>
+    {
+        private readonly IRepository<DictionaryData> rep = rep;
+
+        /// <summary>
+        /// 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<PagedListQueryResult<GetDictionaryDatasQueryResultItem>> Handle(GetDictionaryDatasQuery request, CancellationToken cancellationToken)
+        {
+            return request.PageModel.ToPagedListAsync<DictionaryData, GetDictionaryDatasQueryResultItem>(
+                q =>
+                {
+                    q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime);
+                    if (request.CategoryId.HasValue)
+                    {
+                        q = q.Where(it => it.CategoryId == request.CategoryId);
+                    }
+                    if (request.Keywords.IsNotNull())
+                    {
+                        q = q.Where(it =>
+                            it.Code.Contains(request.Keywords)
+                            || it.Content.Contains(request.Keywords)
+                            || it.Field1.Contains(request.Keywords)
+                            || it.Field2.Contains(request.Keywords)
+                            || it.Field3.Contains(request.Keywords)
+                            || it.Field4.Contains(request.Keywords)
+                            || it.Field5.Contains(request.Keywords));
+                    }
+                    return q;
+                }, cancellationToken: cancellationToken);
+        }
+    }
+}
diff --git a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryCategoriesQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryCategoriesQueryHandler.cs
deleted file mode 100644
index 814b83b..0000000
--- a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryCategoriesQueryHandler.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-锘縰sing FlexJobApi.Core;
-using Furion.DatabaseAccessor;
-using Mapster;
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Application
-{
-    /// <summary>
-    /// 鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
-    /// </summary>
-    public class GetDictionaryCategoriesQueryHandler(
-            IRepository<DictionaryCategory> rep
-        ) : IRequestHandler<GetDictionaryCategoriesQuery, PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>>
-    {
-        private readonly IRepository<DictionaryCategory> rep = rep;
-
-        public async Task<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>> Handle(GetDictionaryCategoriesQuery request, CancellationToken cancellationToken)
-        {
-            var q = rep.AsQueryable().AsNoTracking()
-                .OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime)
-                .AsQueryable();
-            if (request.Keywords.IsNotNull())
-            {
-                q = q.Where(it =>
-                    it.Code.Contains(request.Keywords) ||
-                    it.Name.Contains(request.Keywords) ||
-                    it.Remark.Contains(request.Keywords));
-            }
-            var result = await q
-                .ProjectToType<GetDictionaryCategoriesQueryResultItem>()
-                .ToPagedListAsync(request.PageModel, cancellationToken);
-            return result;
-        }
-    }
-}
diff --git a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs
deleted file mode 100644
index 0d0b8ca..0000000
--- a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-锘縰sing FlexJobApi.Core;
-using Furion.DatabaseAccessor;
-using Mapster;
-using MediatR;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Application
-{
-    /// <summary>
-    /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
-    /// </summary>
-    public class GetDictionaryDatasQueryHandler(
-            IRepository<DictionaryData> rep
-        ) : IRequestHandler<GetDictionaryDatasQuery, PagedListQueryResult<GetDictionaryDatasQueryResultItem>>
-    {
-        private readonly IRepository<DictionaryData> rep = rep;
-
-        public async Task<PagedListQueryResult<GetDictionaryDatasQueryResultItem>> Handle(GetDictionaryDatasQuery request, CancellationToken cancellationToken)
-        {
-            var q = rep.AsQueryable().AsNoTracking()
-                .OrderBy(it => it.Sort).ThenByDescending(it => it.CreatedTime)
-                .Where(it => it.CategoryId == request.CategoryId);
-            if (request.Keywords.IsNotNull())
-            {
-                q = q.Where(it =>
-                    it.Code.Contains(request.Keywords)
-                    || it.Content.Contains(request.Keywords)
-                    || it.Field1.Contains(request.Keywords)
-                    || it.Field2.Contains(request.Keywords)
-                    || it.Field3.Contains(request.Keywords)
-                    || it.Field4.Contains(request.Keywords)
-                    || it.Field5.Contains(request.Keywords));
-            }
-            var result = await q
-                .ProjectToType<GetDictionaryDatasQueryResultItem>()
-                .ToPagedListAsync(request.PageModel, cancellationToken);
-            return result;
-        }
-    }
-}
diff --git a/FlexJobApi.Application/FlexJobApi.Application.xml b/FlexJobApi.Application/FlexJobApi.Application.xml
index f671789..f6795e1 100644
--- a/FlexJobApi.Application/FlexJobApi.Application.xml
+++ b/FlexJobApi.Application/FlexJobApi.Application.xml
@@ -4,50 +4,83 @@
         <name>FlexJobApi.Application</name>
     </assembly>
     <members>
-        <member name="T:FlexJobApi.Application.DeleteDictionaryCategoryCommandHandler">
+        <member name="T:FlexJobApi.Application.DictionaryCategoryCommandHandler">
             <summary>
-            鍒犻櫎瀛楀吀绫诲埆
+            瀛楀吀绫诲埆鍛戒护澶勭悊鍣�
             </summary>
         </member>
-        <member name="T:FlexJobApi.Application.SaveDictionaryCategoryCommandHandler">
+        <member name="M:FlexJobApi.Application.DictionaryCategoryCommandHandler.Handle(FlexJobApi.Core.DeleteDictionaryCategoryCommand,System.Threading.CancellationToken)">
             <summary>
-            淇濆瓨瀛楀吀绫诲埆
+            鍒犻櫎鏁版嵁瀛楀吀绫诲埆
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.Application.DictionaryCategoryCommandHandler.Handle(FlexJobApi.Core.SaveDictionaryCategoryCommand,System.Threading.CancellationToken)">
+            <summary>
+            淇濆瓨鏁版嵁瀛楀吀绫诲埆
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="T:FlexJobApi.Application.DictionaryDataCommandHandler">
+            <summary>
+            鏁版嵁瀛楀吀鍛戒护澶勭悊鍣�
             </summary>
         </member>
-        <member name="T:FlexJobApi.Application.SaveDictionaryDataCommandHandler">
+        <member name="M:FlexJobApi.Application.DictionaryDataCommandHandler.Handle(FlexJobApi.Core.SaveDictionaryDataCommand,System.Threading.CancellationToken)">
             <summary>
-            淇濆瓨瀛楀吀鏁版嵁
+            淇濆瓨鏁版嵁瀛楀吀
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.Application.DictionaryDataCommandHandler.Handle(FlexJobApi.Core.SetDictionaryDataIsDisabledCommand,System.Threading.CancellationToken)">
+            <summary>
+            璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="T:FlexJobApi.Application.DictionaryCategoriesQueryHandler">
+            <summary>
+            鏁版嵁瀛楀吀绫诲埆鏌ヨ澶勭悊鍣�
             </summary>
         </member>
-        <member name="T:FlexJobApi.Application.SetDictionaryDataIsDisabledCommandHandler">
+        <member name="M:FlexJobApi.Application.DictionaryCategoriesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryCategory})">
             <summary>
-            璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤
+            鏁版嵁瀛楀吀绫诲埆鏌ヨ澶勭悊鍣�
             </summary>
         </member>
-        <member name="M:FlexJobApi.Application.SetDictionaryDataIsDisabledCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryData})">
+        <member name="M:FlexJobApi.Application.DictionaryCategoriesQueryHandler.Handle(FlexJobApi.Core.GetDictionaryCategoriesQuery,System.Threading.CancellationToken)">
             <summary>
-            璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤
+            鏌ヨ鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="T:FlexJobApi.Application.DictionaryDatasQueryHandler">
+            <summary>
+            鏁版嵁瀛楀吀鏌ヨ澶勭悊鍣�
             </summary>
         </member>
-        <member name="T:FlexJobApi.Application.GetDictionaryCategoriesQueryHandler">
+        <member name="M:FlexJobApi.Application.DictionaryDatasQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryData})">
             <summary>
-            鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
+            鏁版嵁瀛楀吀鏌ヨ澶勭悊鍣�
             </summary>
         </member>
-        <member name="M:FlexJobApi.Application.GetDictionaryCategoriesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryCategory})">
+        <member name="M:FlexJobApi.Application.DictionaryDatasQueryHandler.Handle(FlexJobApi.Core.GetDictionaryDatasQuery,System.Threading.CancellationToken)">
             <summary>
-            鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
+            鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁
             </summary>
-        </member>
-        <member name="T:FlexJobApi.Application.GetDictionaryDatasQueryHandler">
-            <summary>
-            鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.Application.GetDictionaryDatasQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryData})">
-            <summary>
-            鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
-            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
         </member>
     </members>
 </doc>
diff --git a/FlexJobApi.Core/Entities/Common/DictionaryData.cs b/FlexJobApi.Core/Entities/Common/DictionaryData.cs
index 1e3bb31..a89e7d8 100644
--- a/FlexJobApi.Core/Entities/Common/DictionaryData.cs
+++ b/FlexJobApi.Core/Entities/Common/DictionaryData.cs
@@ -13,7 +13,7 @@
     /// <summary>
     /// 瀛楀吀鏁版嵁
     /// </summary>
-    public class DictionaryData : CommonEntity, IEntityTypeBuilder<DictionaryData>
+    public class DictionaryData : CommonEntity, IEntityTypeBuilder<DictionaryData>, IIsDisabled
     {
         public DictionaryData()
         {
diff --git a/FlexJobApi.Core/Entities/Common/Resource.cs b/FlexJobApi.Core/Entities/Common/Resource.cs
index 2756c99..8e4354c 100644
--- a/FlexJobApi.Core/Entities/Common/Resource.cs
+++ b/FlexJobApi.Core/Entities/Common/Resource.cs
@@ -13,16 +13,44 @@
     public class Resource : CommonEntity, IDbAuditLogIgnore
     {
         /// <summary>
+        /// 搴旂敤鍚嶇О
+        /// </summary>
+        public string ApplicationName { get; set; }
+
+        /// <summary>
+        /// 鍔ㄦ�佺▼搴忛泦鍚嶇О
+        /// </summary>
+        public string DynamicAssemblyName { get; set; }
+
+        /// <summary>
+        /// 鏈嶅姟
+        /// </summary>
+        public EnumResourceService Service { get; set; }
+
+        /// <summary>
+        /// 鏈嶅姟鍚嶇О
+        /// </summary>
+        public string ServiceName { get; set; }
+
+        /// <summary>
         /// 鎺у埗鍣�
         /// </summary>
-        [Required]
         public EnumResourceController Controller { get; set; }
+
+        /// <summary>
+        /// 鎺у埗鍣ㄦ憳瑕�
+        /// </summary>
+        public string ControllerSummary { get; set; }
 
         /// <summary>
         /// 濮旀墭鍚嶇О
         /// </summary>
-        [Required]
         public string ActionName { get; set; }
+
+        /// <summary>
+        /// 濮旀墭鎽樿
+        /// </summary>
+        public string ActionSummary { get; set; }
 
         /// <summary>
         /// 缂栧彿
@@ -37,11 +65,21 @@
         public string Name { get; set; }
 
         /// <summary>
+        /// 蹇界暐鏉冮檺
+        /// </summary>
+        public bool AllowAnonymous { get; set; }
+
+        /// <summary>
         /// 璇锋眰鏂瑰紡
         /// </summary>
         public EnumResourceMethod Method { get; set; }
 
         /// <summary>
+        /// 璺敱鍖哄煙
+        /// </summary>
+        public string RouteArea { get; set; }
+
+        /// <summary>
         /// 璺敱
         /// </summary>
         [Required]
diff --git a/FlexJobApi.Core/Entities/Users/Department.cs b/FlexJobApi.Core/Entities/Users/Department.cs
index 31178f4..7a9fdcc 100644
--- a/FlexJobApi.Core/Entities/Users/Department.cs
+++ b/FlexJobApi.Core/Entities/Users/Department.cs
@@ -13,7 +13,7 @@
     /// <summary>
     /// 閮ㄩ棬
     /// </summary>
-    public class Department : CommonEntity, IEntityTypeBuilder<Department>
+    public class Department : CommonEntity, IEntityTypeBuilder<Department>, IIsDisabled
     {
         public Department()
         {
diff --git a/FlexJobApi.Core/Entities/Users/Menu.cs b/FlexJobApi.Core/Entities/Users/Menu.cs
index 6012d3f..fae1628 100644
--- a/FlexJobApi.Core/Entities/Users/Menu.cs
+++ b/FlexJobApi.Core/Entities/Users/Menu.cs
@@ -13,7 +13,7 @@
     /// <summary>
     /// 鑿滃崟
     /// </summary>
-    public class Menu : CommonEntity, IEntityTypeBuilder<Menu>
+    public class Menu : CommonEntity, IEntityTypeBuilder<Menu>, IIsDisabled
     {
         public Menu()
         {
diff --git a/FlexJobApi.Core/Entities/Users/Role.cs b/FlexJobApi.Core/Entities/Users/Role.cs
index 8890d19..af3775f 100644
--- a/FlexJobApi.Core/Entities/Users/Role.cs
+++ b/FlexJobApi.Core/Entities/Users/Role.cs
@@ -10,7 +10,7 @@
     /// <summary>
     /// 瑙掕壊
     /// </summary>
-    public class Role : CommonEntity
+    public class Role : CommonEntity, IIsDisabled
     {
         public Role()
         {
diff --git a/FlexJobApi.Core/Enums/Common/EnumResourceService.cs b/FlexJobApi.Core/Enums/Common/EnumResourceService.cs
index f458e9a..a89a6fe 100644
--- a/FlexJobApi.Core/Enums/Common/EnumResourceService.cs
+++ b/FlexJobApi.Core/Enums/Common/EnumResourceService.cs
@@ -15,12 +15,12 @@
         /// <summary>
         /// 涓绘湇鍔�
         /// </summary>
-        [ResourceService(ApplicationName = "FlexJobApi.Application", RouteArea = "main")]
+        [ResourceService(ApplicationName = "FlexJobApi.Application", RouteArea = "main", ServiceName = "Local_FlexJobApi")]
         Main,
         /// <summary>
         /// 鐢ㄦ埛鏈嶅姟
         /// </summary>
-        [ResourceService(ApplicationName = "FlexJobApi.User.Application", RouteArea = "user")]
+        [ResourceService(ApplicationName = "FlexJobApi.User.Application", RouteArea = "user", ServiceName = "Local_FlexJobApi")]
         User
     }
 }
diff --git a/FlexJobApi.Core/FlexJobApi.Core.csproj b/FlexJobApi.Core/FlexJobApi.Core.csproj
index a658ceb..d1ed9c8 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.csproj
+++ b/FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -18,6 +18,7 @@
 
 	<ItemGroup>
 		<PackageReference Include="aliyun-net-sdk-core" Version="1.5.6" />
+		<PackageReference Include="Consul" Version="1.7.14.8" />
 		<PackageReference Include="Furion" Version="4.9.7.106" />
 		<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.106" />
 		<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.106" />
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index f941017..17d0d80 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -249,14 +249,44 @@
             璧勬簮
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.Resource.ApplicationName">
+            <summary>
+            搴旂敤鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Resource.DynamicAssemblyName">
+            <summary>
+            鍔ㄦ�佺▼搴忛泦鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Resource.Service">
+            <summary>
+            鏈嶅姟
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Resource.ServiceName">
+            <summary>
+            鏈嶅姟鍚嶇О
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.Resource.Controller">
             <summary>
             鎺у埗鍣�
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.Resource.ControllerSummary">
+            <summary>
+            鎺у埗鍣ㄦ憳瑕�
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.Resource.ActionName">
             <summary>
             濮旀墭鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Resource.ActionSummary">
+            <summary>
+            濮旀墭鎽樿
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.Resource.Code">
@@ -269,9 +299,19 @@
             鍚嶇О
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.Resource.AllowAnonymous">
+            <summary>
+            蹇界暐鏉冮檺
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.Resource.Method">
             <summary>
             璇锋眰鏂瑰紡
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Resource.RouteArea">
+            <summary>
+            璺敱鍖哄煙
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.Resource.Route">
@@ -2074,6 +2114,16 @@
             杩愯惀
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.IIsDisabled">
+            <summary>
+            鏄惁宸茬鐢�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.IIsDisabled.IsDisabled">
+            <summary>
+            鏄惁宸茬鐢�
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.IPhysicalDeletion">
             <summary>
             鐗╃悊鍒犻櫎
@@ -2081,12 +2131,12 @@
         </member>
         <member name="T:FlexJobApi.Core.DeleteDictionaryCategoryCommand">
             <summary>
-            鍒犻櫎瀛楀吀绫诲埆
+            鍒犻櫎鏁版嵁瀛楀吀绫诲埆
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.SaveDictionaryCategoryCommand">
             <summary>
-            淇濆瓨瀛楀吀绫诲埆
+            淇濆瓨鏁版嵁瀛楀吀绫诲埆
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.SaveDictionaryCategoryCommand.Code">
@@ -2111,7 +2161,7 @@
         </member>
         <member name="T:FlexJobApi.Core.SaveDictionaryDataCommand">
             <summary>
-            淇濆瓨瀛楀吀鏁版嵁
+            淇濆瓨鏁版嵁瀛楀吀
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.SaveDictionaryDataCommand.CategoryId">
@@ -2171,27 +2221,22 @@
         </member>
         <member name="T:FlexJobApi.Core.SetDictionaryDataIsDisabledCommand">
             <summary>
-            璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.SetDictionaryDataIsDisabledCommand.Ids">
-            <summary>
-            Id
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.SetDictionaryDataIsDisabledCommand.IsDisabled">
-            <summary>
-            鏄惁绂佺敤
+            璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.GetDictionaryCategoriesQuery">
             <summary>
-            鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
+            鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.GetDictionaryCategoriesQuery.Keywords">
             <summary>
             鍏抽敭瀛�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetDictionaryCategoriesQueryResultItem">
+            <summary>
+            鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-椤�
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.GetDictionaryCategoriesQueryResultItem.Id">
@@ -2221,7 +2266,7 @@
         </member>
         <member name="T:FlexJobApi.Core.GetDictionaryDatasQuery">
             <summary>
-            鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
+            鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.GetDictionaryDatasQuery.CategoryId">
@@ -2236,7 +2281,7 @@
         </member>
         <member name="T:FlexJobApi.Core.GetDictionaryDatasQueryResultItem">
             <summary>
-            鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃-缁撴灉-琛屾暟鎹�
+            鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-琛屾暟鎹�
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.GetDictionaryDatasQueryResultItem.Id">
@@ -3745,6 +3790,37 @@
             鏁版嵁搴撳伐鍏�
             </summary>
         </member>
+        <member name="M:FlexJobApi.Core.DbUtils.ToPagedListAsync``2(FlexJobApi.Core.PagedListQueryPageModel,System.Func{System.Linq.IQueryable{``0},System.Linq.IQueryable{``0}},System.Linq.Expressions.Expression{System.Func{``0,``1}},System.Threading.CancellationToken)">
+            <summary>
+            鏌ヨ鍒嗛〉鍒楄〃鏁版嵁
+            </summary>
+            <typeparam name="TEntity"></typeparam>
+            <typeparam name="TItem"></typeparam>
+            <param name="page"></param>
+            <param name="query"></param>
+            <param name="selector"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.Core.DbUtils.OrderBy``1(System.Linq.IQueryable{``0},System.Collections.Generic.List{FlexJobApi.Core.PagedListQueryPageModelOrderInput})">
+            <summary>
+            鎺掑簭
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="q"></param>
+            <param name="orders"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.Core.DbUtils.SetIsDisable``1(FlexJobApi.Core.SetIsDisabledCommand,System.Func{System.Linq.IQueryable{``0},System.Linq.IQueryable{``0}},System.Threading.CancellationToken)">
+            <summary>
+            璁剧疆鏄惁绂佺敤
+            </summary>
+            <typeparam name="TEntity"></typeparam>
+            <param name="request"></param>
+            <param name="query"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="M:FlexJobApi.Core.DbUtils.DeleteData``1(FlexJobApi.Core.DeleteDataCommand,System.Func{System.Linq.IQueryable{``0},System.Linq.IQueryable{``0}},System.Threading.CancellationToken)">
             <summary>
             鍒犻櫎鏁版嵁
@@ -3786,9 +3862,102 @@
             鍒犻櫎鍛戒护
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.PagedListQuery`2">
+            <summary>
+            鏌ヨ鍒嗛〉鍒楄〃
+            </summary>
+            <typeparam name="TResult"></typeparam>
+            <typeparam name="TItem"></typeparam>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQuery`2.PageModel">
+            <summary>
+            鍒嗛〉淇℃伅
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.PagedListQueryPageModel">
+            <summary>
+            鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Rows">
+            <summary>
+            琛屾暟
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Page">
+            <summary>
+            椤电爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryPageModel.OrderInput">
+            <summary>
+            鎺掑簭
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.PagedListQueryPageModelOrderInput">
+            <summary>
+            鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅-鎺掑簭淇℃伅
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Property">
+            <summary>
+            灞炴��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Order">
+            <summary>
+            鎺掑簭
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.PagedListQueryResult`1">
+            <summary>
+            鏌ヨ鍒嗛〉鍒楄〃-缁撴灉
+            </summary>
+            <typeparam name="TItem"></typeparam>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryResult`1.PageModel">
+            <summary>
+            鍒嗛〉淇℃伅
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryResult`1.Data">
+            <summary>
+            鏁版嵁
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.PagedListQueryResultPageModel">
+            <summary>
+            鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalCount">
+            <summary>
+            鎬绘暟
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalPage">
+            <summary>
+            椤垫暟
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.SaveDataCommand">
             <summary>
             淇濆瓨鏁版嵁鍛戒护
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveDataCommand.Id">
+            <summary>
+            Id
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.SetIsDisabledCommand">
+            <summary>
+            璁剧疆鏄惁宸茬鐢ㄥ懡浠�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SetIsDisabledCommand.IsDisabled">
+            <summary>
+            鏄惁宸茬鐢�
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.EnumModel.Name">
@@ -3866,6 +4035,15 @@
             <typeparam name="T"></typeparam>
             <param name="model"></param>
             <param name="name"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.Core.EnumUtils.GetCustomAttribute``2(``0)">
+            <summary>
+            鑾峰彇鑷畾涔夌壒鎬�
+            </summary>
+            <typeparam name="TEnum"></typeparam>
+            <typeparam name="TAttribute"></typeparam>
+            <param name="enum"></param>
             <returns></returns>
         </member>
         <member name="T:FlexJobApi.Core.EventBusServiceComponent">
@@ -4080,103 +4258,6 @@
             </summary>
             <returns></returns>
         </member>
-        <member name="T:FlexJobApi.Core.PagedListQuery`2">
-            <summary>
-            鏌ヨ鍒嗛〉鍒楄〃
-            </summary>
-            <typeparam name="TResult"></typeparam>
-            <typeparam name="TItem"></typeparam>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQuery`2.PageModel">
-            <summary>
-            鍒嗛〉淇℃伅
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.PagedListQueryPageModel">
-            <summary>
-            鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Rows">
-            <summary>
-            琛屾暟
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Page">
-            <summary>
-            椤电爜
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryPageModel.OrderInput">
-            <summary>
-            鎺掑簭
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.PagedListQueryPageModelOrderInput">
-            <summary>
-            鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅-鎺掑簭淇℃伅
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Property">
-            <summary>
-            灞炴��
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Order">
-            <summary>
-            鎺掑簭
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.PagedListQueryResult`1">
-            <summary>
-            鏌ヨ鍒嗛〉鍒楄〃-缁撴灉
-            </summary>
-            <typeparam name="TItem"></typeparam>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryResult`1.PageModel">
-            <summary>
-            鍒嗛〉淇℃伅
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryResult`1.Data">
-            <summary>
-            鏁版嵁
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.PagedListQueryResultPageModel">
-            <summary>
-            鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalCount">
-            <summary>
-            鎬绘暟
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalPage">
-            <summary>
-            椤垫暟
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.Core.PagedListUtils.ToPagedListAsync``1(System.Linq.IQueryable{``0},FlexJobApi.Core.PagedListQueryPageModel,System.Threading.CancellationToken)">
-            <summary>
-            鏌ヨ鍒嗛〉鍒楄〃鏁版嵁
-            </summary>
-            <typeparam name="TItem"></typeparam>
-            <param name="q"></param>
-            <param name="page"></param>
-            <param name="cancellationToken"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.Core.PagedListUtils.OrderBy``1(System.Linq.IQueryable{``0},System.Collections.Generic.List{FlexJobApi.Core.PagedListQueryPageModelOrderInput})">
-            <summary>
-            鎺掑簭
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="q"></param>
-            <param name="orders"></param>
-            <returns></returns>
-        </member>
         <member name="P:FlexJobApi.Core.ResourceModel.TraceId">
             <summary>
             璺熻釜Id
@@ -4187,9 +4268,19 @@
             搴旂敤鍚嶇О
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.ResourceModel.RouteArea">
+        <member name="P:FlexJobApi.Core.ResourceModel.DynamicAssemblyName">
             <summary>
-            璺敱鍖哄煙
+            鍔ㄦ�佺▼搴忛泦鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.Service">
+            <summary>
+            鏈嶅姟
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.ServiceName">
+            <summary>
+            鏈嶅姟鍚嶇О
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.ResourceModel.Controller">
@@ -4205,6 +4296,11 @@
         <member name="P:FlexJobApi.Core.ResourceModel.ActionName">
             <summary>
             濮旀墭鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.ActionSummary">
+            <summary>
+            濮旀墭鎽樿
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.ResourceModel.Code">
@@ -4225,6 +4321,11 @@
         <member name="P:FlexJobApi.Core.ResourceModel.Method">
             <summary>
             璇锋眰鏂瑰紡
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.RouteArea">
+            <summary>
+            璺敱鍖哄煙
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.ResourceModel.Route">
@@ -4297,16 +4398,60 @@
             璺敱鍖哄煙
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.ResourceServiceAttribute.ServiceName">
+            <summary>
+            鏈嶅姟鍚嶇О
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.ResourceUtils">
             <summary>
             璧勬簮宸ュ叿
             </summary>
         </member>
+        <member name="M:FlexJobApi.Core.ResourceUtils.SendHttpAsync``2(``0)">
+            <summary>
+            鍙戦�丠TTP璇锋眰
+            </summary>
+            <typeparam name="TRequest"></typeparam>
+            <typeparam name="TResponse"></typeparam>
+            <param name="request"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.Core.ResourceUtils.GetHealthyServiceDomain(FlexJobApi.Core.Resource)">
+            <summary>
+            鑾峰彇鍋ュ悍鏈嶅姟鍩熷悕
+            </summary>
+            <param name="resource"></param>
+            <returns></returns>
+        </member>
         <member name="M:FlexJobApi.Core.ResourceUtils.BuildDynamicControllersAsync">
             <summary>
             鐢熸垚鍔ㄦ�佹帶鍒跺櫒
             </summary>
         </member>
+        <member name="M:FlexJobApi.Core.ResourceUtils.SaveResourcesAsync(System.Collections.Generic.List{FlexJobApi.Core.ResourceModel},System.String,Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Resource})">
+            <summary>
+            淇濆瓨璧勬簮
+            </summary>
+            <param name="models"></param>
+            <param name="traceId"></param>
+            <param name="rep"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.Core.ResourceUtils.DynamicControllersHotPlug(System.Collections.Generic.List{FlexJobApi.Core.Resource},Furion.DynamicApiController.IDynamicApiRuntimeChangeProvider)">
+            <summary>
+            鍔ㄦ�佹帶鍒跺櫒鐑彃
+            </summary>
+            <param name="resources"></param>
+            <param name="provider"></param>
+        </member>
+        <member name="M:FlexJobApi.Core.ResourceUtils.DynamicControllerHotPluck(FlexJobApi.Core.Resource,Furion.DynamicApiController.IDynamicApiRuntimeChangeProvider)">
+            <summary>
+            鍔ㄦ�佹帶鍒跺櫒鐑嫈
+            </summary>
+            <param name="resource"></param>
+            <param name="provider"></param>
+        </member>
         <member name="M:FlexJobApi.Core.ResourceUtils.GetCSharpFriendlyName(System.Type)">
             <summary>
             鑾峰彇C#鍙嬪ソ鍚嶇О
diff --git a/FlexJobApi.Core/FlexJobApiCoreStartup.cs b/FlexJobApi.Core/FlexJobApiCoreStartup.cs
index c913fe3..cc2c31d 100644
--- a/FlexJobApi.Core/FlexJobApiCoreStartup.cs
+++ b/FlexJobApi.Core/FlexJobApiCoreStartup.cs
@@ -1,4 +1,5 @@
-锘縰sing Furion;
+锘縰sing Consul;
+using Furion;
 using Furion.EventBus;
 using MediatR;
 using Microsoft.AspNetCore.Builder;
@@ -19,6 +20,8 @@
     {
         public void ConfigureServices(IServiceCollection services)
         {
+            services.AddHealthChecks();
+
             services.AddConsoleFormatter(options =>
             {
                 options.WithTraceId = true;
@@ -42,6 +45,10 @@
             });
 
             services.AddConfigurableOptions<AliyunOptions>();
+
+            services.AddHttpRemote();
+
+            services.AddComponent<ConsulServiceComponent>();
 
             services.AddComponent<EventBusServiceComponent>();
 
@@ -106,8 +113,11 @@
             app.UseEndpoints(endpoints =>
             {
                 endpoints.MapControllers();
+                endpoints.MapHealthChecks("/healthz");
             });
 
+            app.UseComponent<ConsulApplicationComponent>(env);
+
             //lifetime.ApplicationStarted.Register(async () =>
             //{
             //    await ResourceUtils.BuildDynamicControllersAsync();
diff --git a/FlexJobApi.Core/Interfaces/IIsDisabled.cs b/FlexJobApi.Core/Interfaces/IIsDisabled.cs
new file mode 100644
index 0000000..aedab8a
--- /dev/null
+++ b/FlexJobApi.Core/Interfaces/IIsDisabled.cs
@@ -0,0 +1,19 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏄惁宸茬鐢�
+    /// </summary>
+    public interface IIsDisabled
+    {
+        /// <summary>
+        /// 鏄惁宸茬鐢�
+        /// </summary>
+        bool IsDisabled { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs
index 5099239..2cef291 100644
--- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs
@@ -8,7 +8,7 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 鍒犻櫎瀛楀吀绫诲埆
+    /// 鍒犻櫎鏁版嵁瀛楀吀绫诲埆
     /// </summary>
     [Resource([EnumResourceController.Dictionary])]
     public class DeleteDictionaryCategoryCommand : DeleteDataCommand, IRequest<int>
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs
index 113fc40..999f4da 100644
--- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs
@@ -9,10 +9,10 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 淇濆瓨瀛楀吀绫诲埆
+    /// 淇濆瓨鏁版嵁瀛楀吀绫诲埆
     /// </summary>
     [Resource([EnumResourceController.Dictionary])]
-    public class SaveDictionaryCategoryCommand : SaveDataCommand, IRequest<Guid>
+    public class SaveDictionaryCategoryCommand : SaveDataCommand
     {
         /// <summary>
         /// 缂栧彿
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs
index 55c42d1..759dcfe 100644
--- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs
@@ -9,10 +9,10 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 淇濆瓨瀛楀吀鏁版嵁
+    /// 淇濆瓨鏁版嵁瀛楀吀
     /// </summary>
     [Resource([EnumResourceController.Dictionary])]
-    public class SaveDictionaryDataCommand : SaveDataCommand, IRequest<Guid>
+    public class SaveDictionaryDataCommand : SaveDataCommand
     {
         /// <summary>
         /// 绫诲埆Id
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs
index 37cf0d2..7c44111 100644
--- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs
@@ -8,24 +8,11 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤
+    /// 璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤
     /// </summary>
     [Resource([EnumResourceController.Dictionary])]
-    public class SetDictionaryDataIsDisabledCommand : IRequest<int>
+    public class SetDictionaryDataIsDisabledCommand : SetIsDisabledCommand
     {
-        public SetDictionaryDataIsDisabledCommand()
-        {
-            Ids = [];
-        }
 
-        /// <summary>
-        /// Id
-        /// </summary>
-        public List<Guid> Ids { get; set; }
-
-        /// <summary>
-        /// 鏄惁绂佺敤
-        /// </summary>
-        public bool IsDisabled { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs
index a1a7a37..a0f5619 100644
--- a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs
@@ -9,10 +9,10 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
+    /// 鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁
     /// </summary>
     [Resource([EnumResourceController.Dictionary])]
-    public class GetDictionaryCategoriesQuery : PagedListQuery<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>, GetDictionaryCategoriesQueryResultItem>, IRequest<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>>
+    public class GetDictionaryCategoriesQuery : PagedListQuery<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>, GetDictionaryCategoriesQueryResultItem>
     {
         /// <summary>
         /// 鍏抽敭瀛�
@@ -20,6 +20,9 @@
         public string Keywords { get; set; }
     }
 
+    /// <summary>
+    /// 鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-椤�
+    /// </summary>
     public class GetDictionaryCategoriesQueryResultItem
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs
new file mode 100644
index 0000000..e739ef3
--- /dev/null
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs
@@ -0,0 +1,17 @@
+锘縰sing MediatR;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏌ヨ鏁版嵁瀛楀吀绫诲埆閫夋嫨鍣ㄦ暟鎹�
+    /// </summary>
+    public class GetDictionaryCategorySelectQuery : SelectQuery<Guid>
+    {
+    }
+}
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs
index 0f82192..24345b6 100644
--- a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs
@@ -9,15 +9,15 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
+    /// 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁
     /// </summary>
     [Resource([EnumResourceController.Dictionary])]
-    public class GetDictionaryDatasQuery : PagedListQuery<PagedListQueryResult<GetDictionaryDatasQueryResultItem>, GetDictionaryDatasQueryResultItem> , IRequest<PagedListQueryResult<GetDictionaryDatasQueryResultItem>>
+    public class GetDictionaryDatasQuery : PagedListQuery<PagedListQueryResult<GetDictionaryDatasQueryResultItem>, GetDictionaryDatasQueryResultItem>
     {
         /// <summary>
         /// 绫诲埆Id
         /// </summary>
-        public Guid CategoryId { get; set; }
+        public Guid? CategoryId { get; set; }
 
         /// <summary>
         /// 鍏抽敭瀛�
@@ -26,7 +26,7 @@
     }
 
     /// <summary>
-    /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃-缁撴灉-琛屾暟鎹�
+    /// 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-琛屾暟鎹�
     /// </summary>
     public class GetDictionaryDatasQueryResultItem
     {
diff --git a/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs b/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs
index 9ff08a9..739cb0c 100644
--- a/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs
+++ b/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs
@@ -12,7 +12,7 @@
     /// 鏌ヨ浼佷笟淇℃伅鍒嗛〉鍒楄〃鏁版嵁
     /// </summary>
     [Resource([EnumResourceController.Enterprise])]
-    public class GetEnterprisesQuery : PagedListQuery<PagedListQueryResult<GetEnterprisesQueryResultItem>, GetEnterprisesQueryResultItem>, IRequest<PagedListQueryResult<GetEnterprisesQueryResultItem>>
+    public class GetEnterprisesQuery : PagedListQuery<PagedListQueryResult<GetEnterprisesQueryResultItem>, GetEnterprisesQueryResultItem>
     {
         /// <summary>
         /// 鍏抽敭瀛�
diff --git a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
index e96931f..4231a99 100644
--- a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
+++ b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
@@ -12,7 +12,7 @@
     /// 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
     /// </summary>
     [Resource([EnumResourceController.Role])]
-    public class GetRolesQuery : PagedListQuery<PagedListQueryResult<GetRolesQueryResultItem>, GetRolesQueryResultItem>, IRequest<PagedListQueryResult<GetRolesQueryResultItem>>
+    public class GetRolesQuery : PagedListQuery<PagedListQueryResult<GetRolesQueryResultItem>, GetRolesQueryResultItem>
     {
         /// <summary>
         /// 鐢ㄦ埛绫诲瀷
diff --git a/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs
index e5952ce..81a2457 100644
--- a/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs
+++ b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs
@@ -13,7 +13,7 @@
     /// 鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹�
     /// </summary>
     [Resource([EnumResourceController.UserInfo])]
-    public class GetOperationUserInfosQuery : PagedListQuery<PagedListQueryResult<GetOperationUserInfosQueryResultItem>, GetOperationUserInfosQueryResultItem>, IRequest<PagedListQueryResult<GetOperationUserInfosQueryResultItem>>
+    public class GetOperationUserInfosQuery : PagedListQuery<PagedListQueryResult<GetOperationUserInfosQueryResultItem>, GetOperationUserInfosQueryResultItem>
     {
         /// <summary>
         /// 鍏抽敭瀛�
diff --git a/FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs b/FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs
new file mode 100644
index 0000000..ef0a383
--- /dev/null
+++ b/FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs
@@ -0,0 +1,57 @@
+锘縰sing Consul;
+using Furion;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    public class ConsulApplicationComponent : IApplicationComponent
+    {
+        public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext)
+        {
+            var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>();
+            var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>();
+
+            // 鏈嶅姟閰嶇疆锛堜粠appsettings.json璇诲彇锛�
+            var serviceName = App.Configuration["Consul:ServiceName"] ?? "UnknownService";
+            var serviceHost = App.Configuration["Consul:ServiceIP"] ?? "localhost";
+            var servicePort = int.Parse(App.Configuration["Consul:ServicePort"]); // 鎴栫洿鎺ョ敤鍚姩绔彛
+
+            // 鏈嶅姟鍞竴ID锛堥伩鍏嶅悓涓�鏈嶅姟澶氬疄渚嬪啿绐侊級
+            var serviceId = $"{serviceName}-{serviceHost}-{servicePort}";
+
+            // 鏈嶅姟娉ㄥ唽淇℃伅
+            var registration = new AgentServiceRegistration
+            {
+                ID = serviceId,
+                Name = serviceName,
+                Address = serviceHost,
+                Port = servicePort,
+                // 鍋ュ悍妫�鏌ラ厤缃�
+                Check = new AgentServiceCheck
+                {
+                    HTTP = $"http://{serviceHost}:{servicePort}{App.Configuration["Consul:ServiceHealthCheck"]}",
+                    Interval = TimeSpan.FromSeconds(10),
+                    Timeout = TimeSpan.FromSeconds(5),
+                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(30)
+                }
+            };
+
+            // 娉ㄥ唽鏈嶅姟
+            consulClient.Agent.ServiceRegister(registration).Wait();
+
+            // 搴旂敤鍋滄鏃舵敞閿�鏈嶅姟
+            lifetime.ApplicationStopping.Register(() =>
+            {
+                consulClient.Agent.ServiceDeregister(serviceId).Wait();
+            });
+        }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs b/FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs
new file mode 100644
index 0000000..95b7d88
--- /dev/null
+++ b/FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs
@@ -0,0 +1,23 @@
+锘縰sing Consul;
+using Furion;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    public class ConsulServiceComponent : IServiceComponent
+    {
+        public void Load(IServiceCollection services, ComponentContext componentContext)
+        {
+            services.AddSingleton<IConsulClient, ConsulClient>(p => new ConsulClient(config =>
+            {
+                var address = App.Configuration["Consul:Address"] ?? "http://localhost:8500";
+                config.Address = new Uri(address);
+            }));
+        }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
index ecaf344..e6a1389 100644
--- a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
+++ b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
@@ -25,6 +25,124 @@
     public static class DbUtils
     {
         /// <summary>
+        /// 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁
+        /// </summary>
+        /// <typeparam name="TEntity"></typeparam>
+        /// <typeparam name="TItem"></typeparam>
+        /// <param name="page"></param>
+        /// <param name="query"></param>
+        /// <param name="selector"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public static async Task<PagedListQueryResult<TItem>> ToPagedListAsync<TEntity, TItem>(
+            this PagedListQueryPageModel page, 
+            Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null,
+            Expression<Func<TEntity, TItem>> selector = null,
+            CancellationToken cancellationToken = default)
+            where TEntity : CommonEntity, new()
+            where TItem : class, new()
+        {
+            var rep = Db.GetRepository<TEntity>();
+            var q = rep.AsQueryable().AsNoTracking();
+            if (query != null) q = query(q);
+            q = q.OrderBy(page.OrderInput);
+            var s = selector == null
+                ? q.ProjectToType<TItem>()
+                : q.Select(selector);
+            var pagedList = await s.ToPagedListAsync(page.Page, page.Rows, cancellationToken);
+            var result = new PagedListQueryResult<TItem>();
+            result.PageModel = page.Adapt<PagedListQueryResultPageModel>();
+            result.PageModel.TotalCount = pagedList.TotalCount;
+            result.PageModel.TotalPage = pagedList.TotalPages;
+            result.Data = pagedList.Items.ToList();
+            return result;
+        }
+
+        /// <summary>
+        /// 鎺掑簭
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="q"></param>
+        /// <param name="orders"></param>
+        /// <returns></returns>
+        public static IQueryable<T> OrderBy<T>(this IQueryable<T> q, List<PagedListQueryPageModelOrderInput> orders)
+        {
+            if (orders.IsNull()) return q;
+
+            var entityType = typeof(T);
+            int index = 0;
+
+            var props = entityType.GetProperties();
+            foreach (var order in orders)
+            {
+                if (string.IsNullOrEmpty(order.Property)) continue;
+
+                // 鑾峰彇鎺掑簭瀛楁鐨勫睘鎬т俊鎭�
+                var propertyInfo = props.FirstOrDefault(it => it.Name.Equals(order.Property, StringComparison.OrdinalIgnoreCase));
+                if (propertyInfo == null) throw Oops.Oh(EnumErrorCodeType.s404, $"璇ユ帓搴忓瓧娈祘order.Property}");
+
+                // 鍒涘缓琛ㄨ揪寮忔爲
+                var parameter = Expression.Parameter(entityType, "x");
+                var propertyAccess = Expression.Property(parameter, propertyInfo);
+                var lambda = Expression.Lambda(propertyAccess, parameter);
+
+                string methodName;
+                if (index == 0)
+                {
+                    // 棣栨鎺掑簭
+                    methodName = order.Order == EnumPagedListOrder.Asc
+                        ? "OrderBy"
+                        : "OrderByDescending";
+                }
+                else
+                {
+                    // 浜屾鍙婁互鍚庢帓搴�
+                    methodName = order.Order == EnumPagedListOrder.Asc
+                        ? "ThenBy"
+                        : "ThenByDescending";
+                }
+
+                // 璋冪敤鐩稿簲鐨勬帓搴忔柟娉�
+                var resultExpression = Expression.Call(
+                    typeof(Queryable),
+                    methodName,
+                    [entityType, propertyInfo.PropertyType],
+                    q.Expression,
+                    Expression.Quote(lambda)
+                );
+
+                q = q.Provider.CreateQuery<T>(resultExpression);
+                index++;
+            }
+
+            return q;
+        }
+
+        /// <summary>
+        /// 璁剧疆鏄惁绂佺敤
+        /// </summary>
+        /// <typeparam name="TEntity"></typeparam>
+        /// <param name="request"></param>
+        /// <param name="query"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public static async Task<int> SetIsDisable<TEntity>(this SetIsDisabledCommand request, Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null, CancellationToken cancellationToken = default)
+            where TEntity : CommonEntity, IIsDisabled, new()
+        {
+            var rep = Db.GetRepository<TEntity>();
+            var q = rep.AsQueryable();
+            if (query != null) q = query(q);
+            var entities = await q
+                .Where(it => request.Ids.Contains(it.Id) && it.IsDisabled != request.IsDisabled)
+                .ToListAsync();
+            foreach (var entity in entities)
+            {
+                entity.IsDisabled = request.IsDisabled;
+            }
+            return entities.Count;
+        }
+
+        /// <summary>
         /// 鍒犻櫎鏁版嵁
         /// </summary>
         /// <typeparam name="TEntity"></typeparam>
diff --git a/FlexJobApi.Core/Utils/PagedListUtils/PagedListQuery.cs b/FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs
similarity index 96%
rename from FlexJobApi.Core/Utils/PagedListUtils/PagedListQuery.cs
rename to FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs
index 6ae8a7e..f2c1b66 100644
--- a/FlexJobApi.Core/Utils/PagedListUtils/PagedListQuery.cs
+++ b/FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs
@@ -12,7 +12,7 @@
     /// </summary>
     /// <typeparam name="TResult"></typeparam>
     /// <typeparam name="TItem"></typeparam>
-    public abstract class PagedListQuery<TResult, TItem>
+    public abstract class PagedListQuery<TResult, TItem> : IRequest<TResult>
         where TResult : PagedListQueryResult<TItem>, new()
         where TItem : class, new()
     {
diff --git a/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs b/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs
index 2dbcbc8..03f70b2 100644
--- a/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs
+++ b/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs
@@ -1,4 +1,5 @@
-锘縰sing System;
+锘縰sing MediatR;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -9,8 +10,11 @@
     /// <summary>
     /// 淇濆瓨鏁版嵁鍛戒护
     /// </summary>
-    public abstract class SaveDataCommand
+    public abstract class SaveDataCommand : IRequest<Guid>
     {
+        /// <summary>
+        /// Id
+        /// </summary>
         public Guid? Id { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs b/FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs
new file mode 100644
index 0000000..6fdefaa
--- /dev/null
+++ b/FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs
@@ -0,0 +1,39 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 閫夋嫨鍣ㄦ煡璇�
+    /// </summary>
+    /// <typeparam name="TValue"></typeparam>
+    public class SelectQuery<TValue> : IRequest<List<SelectQueryResultItem<TValue>>>
+    {
+
+    }
+
+    /// <summary>
+    /// 閫夋嫨鍣ㄦ煡璇�-缁撴灉-椤�
+    /// </summary>
+    public class SelectQueryResultItem<TValue>
+    {
+        /// <summary>
+        /// 鍊�
+        /// </summary>
+        public TValue Value { get; set; }
+
+        /// <summary>
+        /// 鏍囩
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 鏁版嵁
+        /// </summary>
+        public object Data { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs b/FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs
new file mode 100644
index 0000000..74a3d69
--- /dev/null
+++ b/FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs
@@ -0,0 +1,27 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 璁剧疆鏄惁宸茬鐢ㄥ懡浠�
+    /// </summary>
+    public abstract class SetIsDisabledCommand : IRequest<int>, IIsDisabled
+    {
+        protected SetIsDisabledCommand()
+        {
+            Ids = [];
+        }
+
+        public List<Guid> Ids { get; set; }
+
+        /// <summary>
+        /// 鏄惁宸茬鐢�
+        /// </summary>
+        public bool IsDisabled { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs b/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs
index 5421781..fcd9ac2 100644
--- a/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs
+++ b/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs
@@ -1,6 +1,7 @@
 锘縰sing System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -97,5 +98,20 @@
                .Select(it => it.Enum)
                .FirstOrDefault();
         }
+
+        /// <summary>
+        /// 鑾峰彇鑷畾涔夌壒鎬�
+        /// </summary>
+        /// <typeparam name="TEnum"></typeparam>
+        /// <typeparam name="TAttribute"></typeparam>
+        /// <param name="enum"></param>
+        /// <returns></returns>
+        public static TAttribute GetCustomAttribute<TEnum, TAttribute>(this TEnum @enum)
+            where TEnum : struct
+            where TAttribute : Attribute
+        {
+
+            return typeof(TEnum).GetMember(@enum.ToString())[0].GetCustomAttribute<TAttribute>();
+        }
     }
 }
diff --git a/FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs b/FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs
deleted file mode 100644
index 402f2aa..0000000
--- a/FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-锘縰sing Furion.DatabaseAccessor;
-using Furion.FriendlyException;
-using Mapster;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Reflection;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Core
-{
-    public static class PagedListUtils
-    {
-        /// <summary>
-        /// 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁
-        /// </summary>
-        /// <typeparam name="TItem"></typeparam>
-        /// <param name="q"></param>
-        /// <param name="page"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public static async Task<PagedListQueryResult<TItem>> ToPagedListAsync<TItem>(this IQueryable<TItem> q, PagedListQueryPageModel page, CancellationToken cancellationToken = default)
-            where TItem : class, new()
-        {
-            var pagedList = await q
-                .OrderBy(page.OrderInput)
-                .ToPagedListAsync(page.Page, page.Rows, cancellationToken);
-            var result = new PagedListQueryResult<TItem>();
-            result.PageModel = page.Adapt<PagedListQueryResultPageModel>();
-            result.PageModel.TotalCount = pagedList.TotalCount;
-            result.PageModel.TotalPage = pagedList.TotalPages;
-            result.Data = pagedList.Items.ToList();
-            return result;
-        }
-
-        /// <summary>
-        /// 鎺掑簭
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="q"></param>
-        /// <param name="orders"></param>
-        /// <returns></returns>
-        public static IQueryable<T> OrderBy<T>(this IQueryable<T> q, List<PagedListQueryPageModelOrderInput> orders)
-        {
-            if (orders.IsNull()) return q;
-
-            var entityType = typeof(T);
-            int index = 0;
-
-            var props = entityType.GetProperties();
-            foreach (var order in orders)
-            {
-                if (string.IsNullOrEmpty(order.Property)) continue;
-
-                // 鑾峰彇鎺掑簭瀛楁鐨勫睘鎬т俊鎭�
-                var propertyInfo = props.FirstOrDefault(it => it.Name.Equals(order.Property, StringComparison.OrdinalIgnoreCase));
-                if (propertyInfo == null) throw Oops.Oh(EnumErrorCodeType.s404, $"璇ユ帓搴忓瓧娈祘order.Property}");
-
-                // 鍒涘缓琛ㄨ揪寮忔爲
-                var parameter = Expression.Parameter(entityType, "x");
-                var propertyAccess = Expression.Property(parameter, propertyInfo);
-                var lambda = Expression.Lambda(propertyAccess, parameter);
-
-                string methodName;
-                if (index == 0)
-                {
-                    // 棣栨鎺掑簭
-                    methodName = order.Order == EnumPagedListOrder.Asc
-                        ? "OrderBy"
-                        : "OrderByDescending";
-                }
-                else
-                {
-                    // 浜屾鍙婁互鍚庢帓搴�
-                    methodName = order.Order == EnumPagedListOrder.Asc
-                        ? "ThenBy"
-                        : "ThenByDescending";
-                }
-
-                // 璋冪敤鐩稿簲鐨勬帓搴忔柟娉�
-                var resultExpression = Expression.Call(
-                    typeof(Queryable),
-                    methodName,
-                    [entityType, propertyInfo.PropertyType],
-                    q.Expression,
-                    Expression.Quote(lambda)
-                );
-
-                q = q.Provider.CreateQuery<T>(resultExpression);
-                index++;
-            }
-
-            return q;
-        }
-    }
-}
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs
index 2c94af3..e1e113d 100644
--- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs
@@ -20,9 +20,19 @@
         public string ApplicationName { get; set; }
 
         /// <summary>
-        /// 璺敱鍖哄煙
+        /// 鍔ㄦ�佺▼搴忛泦鍚嶇О
         /// </summary>
-        public string RouteArea { get; set; }
+        public string DynamicAssemblyName { get; set; }
+
+        /// <summary>
+        /// 鏈嶅姟
+        /// </summary>
+        public EnumResourceService Service { get; set; }
+
+        /// <summary>
+        /// 鏈嶅姟鍚嶇О
+        /// </summary>
+        public string ServiceName { get; set; }
 
         /// <summary>
         /// 鎺у埗鍣�
@@ -38,6 +48,11 @@
         /// 濮旀墭鍚嶇О
         /// </summary>
         public string ActionName { get; set; }
+
+        /// <summary>
+        /// 濮旀墭鎽樿
+        /// </summary>
+        public string ActionSummary { get; set; }
 
         /// <summary>
         /// 缂栧彿
@@ -60,6 +75,11 @@
         public EnumResourceMethod Method { get; set; }
 
         /// <summary>
+        /// 璺敱鍖哄煙
+        /// </summary>
+        public string RouteArea { get; set; }
+
+        /// <summary>
         /// 璺敱
         /// </summary>
         public string Route { get; set; }
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs
index 2578882..3be7424 100644
--- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs
@@ -60,5 +60,10 @@
         /// 璺敱鍖哄煙
         /// </summary>
         public string RouteArea { get; set; }
+
+        /// <summary>
+        /// 鏈嶅姟鍚嶇О
+        /// </summary>
+        public string ServiceName { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
index 79e9361..0bf57e6 100644
--- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
@@ -1,8 +1,11 @@
-锘縰sing Furion;
+锘縰sing Consul;
+using Furion;
 using Furion.DatabaseAccessor;
+using Furion.DataEncryption;
 using Furion.DistributedIDGenerator;
 using Furion.DynamicApiController;
 using Furion.FriendlyException;
+using Furion.HttpRemote;
 using Mapster;
 using MediatR;
 using Microsoft.AspNetCore.Mvc;
@@ -14,12 +17,17 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Diagnostics;
 using System.Linq;
+using System.Net.Http;
+using System.Net.Http.Headers;
 using System.Reflection;
+using System.Resources;
 using System.Text;
 using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading.Tasks;
+using static System.Collections.Specialized.BitVector32;
 
 namespace FlexJobApi.Core
 {
@@ -29,6 +37,87 @@
     public static class ResourceUtils
     {
         /// <summary>
+        /// 鍙戦�丠TTP璇锋眰
+        /// </summary>
+        /// <typeparam name="TRequest"></typeparam>
+        /// <typeparam name="TResponse"></typeparam>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(TRequest request)
+            where TRequest : class, new()
+        {
+            var requestTypeFullName = typeof(TRequest).FullName;
+            var resource = await Db.GetRepository<Resource>().AsQueryable().AsNoTracking()
+                .Where(it => !it.IsExpired && it.RequestTypeFullName == requestTypeFullName)
+                .FirstOrDefaultAsync();
+            var domain = await GetHealthyServiceDomain(resource);
+            var httpRemoteService = App.GetRequiredService<IHttpRemoteService>();
+            var token = App.HttpContext.Request.Headers["Authorization"].ToString();
+            var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString();
+            TResponse response;
+            switch (resource.Method)
+            {
+                case EnumResourceMethod.Get:
+                    response = await httpRemoteService.GetAsAsync<TResponse>(
+                        $"{domain}{resource.Route}",
+                        it =>
+                            it.WithQueryParameters(request)
+                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
+                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
+                    break;
+                case EnumResourceMethod.Post:
+                    response = await httpRemoteService.PostAsAsync<TResponse>(
+                        $"{domain}{resource.Route}",
+                        it =>
+                            it.SetJsonContent(request)
+                            .WithHeader("Authorization", token)
+                            .WithHeader("X-Authorization", refreshToken));
+                    break;
+                case EnumResourceMethod.Put:
+                    response = await httpRemoteService.PutAsAsync<TResponse>(
+                        $"{domain}{resource.Route}",
+                        it =>
+                            it.SetJsonContent(request)
+                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
+                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
+                    break;
+                case EnumResourceMethod.Delete:
+                    response = await httpRemoteService.DeleteAsAsync<TResponse>(
+                        $"{domain}{resource.Route}",
+                        it =>
+                            it.SetJsonContent(request)
+                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
+                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
+                    break;
+                default:
+                    throw Oops.Oh(EnumErrorCodeType.s400, $"涓嶆敮鎸佽姹傛柟寮弡resource.Method}");
+            }
+            return response;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍋ュ悍鏈嶅姟鍩熷悕
+        /// </summary>
+        /// <param name="resource"></param>
+        /// <returns></returns>
+        public static async Task<string> GetHealthyServiceDomain(Resource resource)
+        {
+            var client = App.GetRequiredService<IConsulClient>();
+            var queryResult = await client.Health.Service(resource.ServiceName, null, true);
+            if (queryResult.StatusCode != System.Net.HttpStatusCode.OK)
+                throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}");
+
+            var domains = queryResult.Response
+                .Select(s => $"http://{s.Service.Address}:{s.Service.Port}")
+                .ToList();
+            if (domains.IsNull())
+                throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}");
+            // 杞閫夋嫨瀹炰緥
+            int randomIndex = new Random().Next(domains.Count);
+            return domains[randomIndex];
+        }
+
+        /// <summary>
         /// 鐢熸垚鍔ㄦ�佹帶鍒跺櫒
         /// </summary>
         public static async Task BuildDynamicControllersAsync()
@@ -36,15 +125,15 @@
             var traceId = App.GetTraceId() ?? IDGen.NextID().ToString();
             var scopeFactory = App.GetService<IServiceScopeFactory>();
             var serviceScope = scopeFactory.CreateScope();
-            var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<Resource>>();
             var provider = serviceScope.ServiceProvider.GetRequiredService<IDynamicApiRuntimeChangeProvider>();
+            var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<Resource>>();
             var xmlDoc = await XmlDocUtils.GetXmlDocAsync();
             var enumWebApiMethods = await EnumUtils.GetModel<EnumResourceMethod>();
             var resourceControllers = await EnumUtils.GetModel<EnumResourceController>();
-            var requests = App.Assemblies.SelectMany(it => it.GetTypes()).Where(it => typeof(IBaseRequest).IsAssignableFrom(it)).ToList();
-            var resources = await rep.AsQueryable()
-                .Where(it => !it.IsExpired)
-                .ToListAsync();
+            var requests = App.Assemblies
+                .SelectMany(it => it.GetTypes())
+                .Where(it => !it.IsAbstract && typeof(IBaseRequest).IsAssignableFrom(it))
+                .ToList();
             var models = new List<ResourceModel>();
             foreach (var request in requests)
             {
@@ -53,25 +142,21 @@
 
                 foreach (var controller in resourceAttribute.Controllers)
                 {
-                    var resourceController = controller.GetType().GetMember(controller.ToString())[0].GetCustomAttribute<ResourceControllerAttribute>();
-                    var resourceService = resourceController.Service.GetType().GetMember(resourceController.Service.ToString())[0].GetCustomAttribute<ResourceServiceAttribute>();
+                    var requestXmlDoc = await request.GetXmlDocMemberAsync(xmlDoc);
+                    var resourceController = controller.GetCustomAttribute<EnumResourceController, ResourceControllerAttribute>();
+                    var resourceService = resourceController.Service.GetCustomAttribute<EnumResourceService, ResourceServiceAttribute>();
 
                     var model = new ResourceModel();
                     model.TraceId = traceId;
                     model.ApplicationName = resourceService.ApplicationName;
-                    model.RouteArea = resourceService.RouteArea;
-                    var name = request.Name;
-                    name = Regex.Replace(name, @"(Command|Query)$", "", RegexOptions.None);
-                    model.ActionName = name;
-                    model.Route = $"/api/{resourceService.RouteArea ?? "main"}/{controller}/{name}";
-                    var requestXmlDoc = await request.GetXmlDocMemberAsync(xmlDoc);
-                    model.Code = requestXmlDoc.Name;
                     model.Controller = controller;
                     model.ControllerSummary = resourceControllers.GetDescription(controller);
-                    if (controller == EnumResourceController.Role)
-                    {
-                        Console.WriteLine();
-                    }
+                    model.ActionName = Regex.Replace(request.Name, @"(Command|Query)$", "", RegexOptions.None);
+                    model.ActionSummary = requestXmlDoc?.Summary;
+                    model.Service = resourceController.Service;
+                    model.ServiceName = resourceService.ServiceName;
+                    model.RouteArea = resourceService.RouteArea;
+                    model.Route = $"/api/{resourceService.RouteArea ?? "main"}/{controller}/{model.ActionName}";
                     model.Method =
                         request.BaseType?.IsGenericType == true && request.BaseType.GetGenericTypeDefinition() == typeof(PagedListQuery<,>)
                         ? EnumResourceMethod.Post
@@ -84,7 +169,8 @@
                         : new List<string> { "Delete", "Remove ", "Clear" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase))
                         ? EnumResourceMethod.Delete
                         : EnumResourceMethod.Post;
-                    model.Name = requestXmlDoc?.Summary;
+                    model.Code = requestXmlDoc?.Name;
+                    model.Name = $"{model.ControllerSummary}-{model.ActionSummary}";
                     model.AllowAnonymous = resourceAttribute.AllowAnonymous;
                     model.RequestTypeName = request.Name;
                     model.RequestTypeFullName = request.FullName;
@@ -96,21 +182,45 @@
                         model.ResponseTypeFullName = responseType.FullName;
                     }
 
-                    var resource = resources.FirstOrDefault(it => it.Route == model.Route && it.Method == model.Method);
-                    if (resource == null)
-                    {
-                        resource = new Resource();
-                        model.Adapt(resource);
-                        await rep.InsertAsync(resource);
-                        resources.Add(resource);
-                    }
-                    else
-                    {
-                        model.Adapt(resource);
-                        await rep.UpdateAsync(resource);
-                    }
 
                     models.Add(model);
+                }
+            }
+
+            var resources = await SaveResourcesAsync(models, traceId, rep);
+
+            DynamicControllersHotPlug(resources, provider);
+
+            await rep.SaveNowAsync();
+        }
+
+        /// <summary>
+        /// 淇濆瓨璧勬簮
+        /// </summary>
+        /// <param name="models"></param>
+        /// <param name="traceId"></param>
+        /// <param name="rep"></param>
+        /// <returns></returns>
+        private static async Task<List<Resource>> SaveResourcesAsync(List<ResourceModel> models, string traceId, IRepository<Resource> rep = null)
+        {
+            rep = rep ?? Db.GetRepository<Resource>();
+            var resources = await rep.AsQueryable()
+                .Where(it => !it.IsExpired)
+                .ToListAsync();
+            foreach (var model in models)
+            {
+                var resource = resources.FirstOrDefault(it => it.Route == model.Route && it.Method == model.Method);
+                if (resource == null)
+                {
+                    resource = new Resource();
+                    model.Adapt(resource);
+                    await rep.InsertAsync(resource);
+                    resources.Add(resource);
+                }
+                else
+                {
+                    model.Adapt(resource);
+                    await rep.UpdateAsync(resource);
                 }
             }
 
@@ -121,21 +231,18 @@
                 await rep.UpdateAsync(expiredResource);
             }
 
-            var controllers = models
-                .GroupBy(it => new
-                {
-                    it.Controller,
-                    it.ControllerSummary,
-                    it.ApplicationName,
-                    it.RouteArea
-                })
-                .Select(it => new
-                {
-                    it.Key,
-                    Actions = it.ToList()
-                })
-                .ToList();
-            foreach (var controller in controllers)
+            return resources.Where(it => !it.IsExpired).ToList();
+        }
+
+        /// <summary>
+        /// 鍔ㄦ�佹帶鍒跺櫒鐑彃
+        /// </summary>
+        /// <param name="resources"></param>
+        /// <param name="provider"></param>
+        public static void DynamicControllersHotPlug(List<Resource> resources, IDynamicApiRuntimeChangeProvider provider = null)
+        {
+            provider = provider ?? App.GetRequiredService<IDynamicApiRuntimeChangeProvider>();
+            foreach (var resource in resources)
             {
                 var code = $@"
 using FlexJobApi.Core;
@@ -149,46 +256,53 @@
 using System.Collections.Generic;
 using System.ComponentModel;
 
-namespace {controller.Key.ApplicationName}
+namespace {resource.ApplicationName}.{resource.Controller}.{resource.ActionName}Request
 {{
     /// <summary>
-    /// {controller.Key.ControllerSummary}
+    /// {resource.ControllerSummary}
     /// </summary>
-    [Route(""api/{controller.Key.RouteArea}/[controller]"")]
-    public class {controller.Key.Controller}AppService(IMediator mediator) : IDynamicApiController
+    [Route(""api/{resource.RouteArea}/[controller]"")]
+    public class {resource.Controller}AppService(IMediator mediator) : IDynamicApiController
     {{
-        private readonly IMediator mediator = mediator;";
-                foreach (var action in controller.Actions)
-                {
-                    code += $@"
+        private readonly IMediator mediator = mediator;
 
         /// <summary>
-        /// {action.Name}
+        /// {resource.ActionSummary}
         /// </summary>
         /// <param name=""request""></param>
         /// <returns></returns>";
-                    if (action.AllowAnonymous)
-                    {
-                        code += $@"
-        [AllowAnonymous]";
-                    }
+                if (resource.AllowAnonymous)
+                {
                     code += $@"
-        [Http{action.Method}]
-        public Task<{action.ResponseTypeName}> {action.ActionName}({action.RequestTypeName} request)
+        [AllowAnonymous]";
+                }
+                code += $@"
+        [Http{resource.Method}]
+        public Task<{resource.ResponseTypeName}> {resource.ActionName}({resource.RequestTypeName} request)
         {{
             return mediator.Send(request);
         }}
-";
-                }
-                code += $@"
+
     }}
 }}
 ";
                 var dynamicAssembly = App.CompileCSharpClassCode(code);
                 provider.AddAssembliesWithNotifyChanges(dynamicAssembly);
+                var dynamicAssemblyName = dynamicAssembly.GetName().Name;
+                resource.DynamicAssemblyName = dynamicAssemblyName;
             }
 
-            await rep.SaveNowAsync();
+        }
+
+        /// <summary>
+        /// 鍔ㄦ�佹帶鍒跺櫒鐑嫈
+        /// </summary>
+        /// <param name="resource"></param>
+        /// <param name="provider"></param>
+        public static void DynamicControllerHotPluck(Resource resource, IDynamicApiRuntimeChangeProvider provider = null)
+        {
+            provider = provider ?? App.GetRequiredService<IDynamicApiRuntimeChangeProvider>();
+            provider.RemoveAssembliesWithNotifyChanges(resource.DynamicAssemblyName);
         }
 
         /// <summary>
@@ -196,7 +310,7 @@
         /// </summary>
         /// <param name="type"></param>
         /// <returns></returns>
-        public static string GetCSharpFriendlyName(this Type type)
+        private static string GetCSharpFriendlyName(this Type type)
         {
             // 澶勭悊鍙┖绫诲瀷
             if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
diff --git a/FlexJobApi.Core/settings.json b/FlexJobApi.Core/settings.json
index 1d3e7c9..90a659b 100644
--- a/FlexJobApi.Core/settings.json
+++ b/FlexJobApi.Core/settings.json
@@ -51,6 +51,13 @@
     }
   },
   "SupplierPassword": "qwe321",
+  "Consul": {
+    "Address": "http://localhost:8500/",
+    "ServiceName": "Local_FlexJobApi",
+    "ServiceIP": "localhost",
+    "ServicePort": 53780,
+    "ServiceHealthCheck": "/healthz"
+  },
   "DistributedCache": {
     "Access": "Redis",
     "Configuration": "118.178.252.28:5390,password=Bole123!"
diff --git a/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs
new file mode 100644
index 0000000..e4a1872
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs
@@ -0,0 +1,2231 @@
+锘�// <auto-generated />
+using System;
+using FlexJobApi.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace FlexJobApi.Database.Migrations.Migrations
+{
+    [DbContext(typeof(DefaultDbContext))]
+    [Migration("20250806024717_UpdateResource0806")]
+    partial class UpdateResource0806
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浼佷笟Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁绂佺敤");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍚嶇О");
+
+                    b.Property<Guid?>("ParentId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("涓婄骇Id");
+
+                    b.Property<string>("Path")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("閮ㄩ棬璺緞");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("ParentId");
+
+                    b.ToTable("Department", t =>
+                        {
+                            t.HasComment("閮ㄩ棬");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryCategory", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("缂栧彿");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("FieldNames")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀛楁鍚嶏紙閫楀彿闅斿紑锛�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("鍚嶇О");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("DictionaryCategory", t =>
+                        {
+                            t.HasComment("瀛楀吀绫诲埆");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("CategoryId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("绫诲埆Id");
+
+                    b.Property<string>("Code")
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("缂栧彿");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鏄剧ず鍐呭");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("Field1")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀛楁1");
+
+                    b.Property<string>("Field2")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀛楁2");
+
+                    b.Property<string>("Field3")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀛楁3");
+
+                    b.Property<string>("Field4")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀛楁4");
+
+                    b.Property<string>("Field5")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀛楁5");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁绂佺敤");
+
+                    b.Property<Guid?>("ParentId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("涓婄骇Id");
+
+                    b.Property<string>("Path")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀛楀吀璺緞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CategoryId");
+
+                    b.HasIndex("ParentId");
+
+                    b.ToTable("DictionaryData", t =>
+                        {
+                            t.HasComment("瀛楀吀鏁版嵁");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("BankCard")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉閾惰鍗″彿");
+
+                    b.Property<Guid?>("BankCardImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉閾惰鍗$収鐗嘔d");
+
+                    b.Property<string>("ContactNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)")
+                        .HasComment("鑱旂郴鐢佃瘽");
+
+                    b.Property<string>("Contacts")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("鑱旂郴浜�");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("EnterpriseName")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("浼佷笟鍏ㄧО");
+
+                    b.Property<int?>("EnterpriseRealMethod")
+                        .HasColumnType("int")
+                        .HasComment("浼佷笟璁よ瘉鏂瑰紡");
+
+                    b.Property<string>("Identity")
+                        .HasMaxLength(18)
+                        .HasColumnType("nvarchar(18)")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉韬唤璇佸彿");
+
+                    b.Property<Guid?>("IdentityBackImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉韬唤璇佸浗寰介潰Id");
+
+                    b.Property<Guid?>("IdentityImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉韬唤璇佷汉鍍忛潰Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsReal")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁瀹炲悕");
+
+                    b.Property<string>("LegalPerson")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("娉曚汉濮撳悕");
+
+                    b.Property<Guid?>("LicenseImageId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("钀ヤ笟鎵х収鐓х墖Id");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉濮撳悕");
+
+                    b.Property<int?>("PersonalRealMethod")
+                        .HasColumnType("int")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉瀹炲悕鏂瑰紡");
+
+                    b.Property<string>("PhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)")
+                        .HasComment("娉曚汉鎴栫粡鍔炰汉鎵嬫満鍙�");
+
+                    b.Property<bool?>("Proxy")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁濮旀墭缁忓姙浜�");
+
+                    b.Property<string>("ProxyPowerAttorneyUrl")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("浼佷笟鎺堟潈涔�");
+
+                    b.Property<int?>("RealAccess")
+                        .HasColumnType("int")
+                        .HasComment("瀹炲悕閫氶亾");
+
+                    b.Property<string>("SocietyCreditCode")
+                        .IsRequired()
+                        .HasMaxLength(18)
+                        .HasColumnType("nvarchar(18)")
+                        .HasComment("缁熶竴绀句細淇$敤浠g爜");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("IdentityBackImgId");
+
+                    b.HasIndex("IdentityImgId");
+
+                    b.HasIndex("LicenseImageId");
+
+                    b.ToTable("Enterprise", t =>
+                        {
+                            t.HasComment("浼佷笟");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.FileStore", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("AbsolutePath")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("缁濆璺緞");
+
+                    b.Property<int>("Access")
+                        .HasColumnType("int")
+                        .HasComment("閫氶亾");
+
+                    b.Property<string>("ContentType")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("鍐呭绫诲瀷");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("Extension")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("鎵╁睍鍚�");
+
+                    b.Property<int>("FileType")
+                        .HasColumnType("int")
+                        .HasComment("鏂囦欢绫诲瀷");
+
+                    b.Property<string>("Hash")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍝堝笇");
+
+                    b.Property<int?>("ImageHeight")
+                        .HasColumnType("int")
+                        .HasComment("楂樺害锛堝儚绱狅級");
+
+                    b.Property<int?>("ImageWidth")
+                        .HasColumnType("int")
+                        .HasComment("瀹藉害锛堝儚绱狅級");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<long>("Length")
+                        .HasColumnType("bigint")
+                        .HasComment("鏂囦欢澶у皬锛堝瓧鑺傦級");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍚嶇О");
+
+                    b.Property<string>("RelativePath")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鐩稿璺緞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("FileStore", t =>
+                        {
+                            t.HasComment("鏂囦欢瀛樺偍");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.FileVirtualPath", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍚嶇О");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<Guid>("StoreId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏂囦欢瀛樺偍Id");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<string>("VirtualPath")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("铏氭嫙璺緞");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("StoreId");
+
+                    b.ToTable("FileVirtualPath", t =>
+                        {
+                            t.HasComment("鏂囦欢铏氭嫙璺緞");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("ClientType")
+                        .HasColumnType("int")
+                        .HasComment("瀹㈡埛绔被鍨�");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("缂栧彿");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("Group")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�");
+
+                    b.Property<string>("Icon")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍥炬爣");
+
+                    b.Property<bool>("IsCache")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁缂撳瓨");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁绂佺敤");
+
+                    b.Property<string>("Location")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("浣嶇疆锛堢敤浜庢寜閽級");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("鍚嶇О");
+
+                    b.Property<Guid?>("ParentId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("涓婄骇Id");
+
+                    b.Property<string>("Path")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鑿滃崟璺緞");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("绫诲瀷");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<string>("Url")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("閾炬帴鍦板潃");
+
+                    b.Property<int>("UserType")
+                        .HasColumnType("int")
+                        .HasComment("鐢ㄦ埛绫诲瀷");
+
+                    b.Property<int>("VisitLevel")
+                        .HasColumnType("int")
+                        .HasComment("璁块棶绾у埆");
+
+                    b.Property<string>("Width")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ParentId");
+
+                    b.ToTable("Menu", t =>
+                        {
+                            t.HasComment("鑿滃崟");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Resource", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("ActionName")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("濮旀墭鍚嶇О");
+
+                    b.Property<string>("ActionSummary")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("濮旀墭鎽樿");
+
+                    b.Property<bool>("AllowAnonymous")
+                        .HasColumnType("bit")
+                        .HasComment("蹇界暐鏉冮檺");
+
+                    b.Property<string>("ApplicationName")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("搴旂敤鍚嶇О");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("缂栧彿");
+
+                    b.Property<int>("Controller")
+                        .HasColumnType("int")
+                        .HasComment("鎺у埗鍣�");
+
+                    b.Property<string>("ControllerSummary")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鎺у埗鍣ㄦ憳瑕�");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("DynamicAssemblyName")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍔ㄦ�佺▼搴忛泦鍚嶇О");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsExpired")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁宸茶繃鏈�");
+
+                    b.Property<int>("Method")
+                        .HasColumnType("int")
+                        .HasComment("璇锋眰鏂瑰紡");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍚嶇О");
+
+                    b.Property<string>("RequestTypeFullName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璇锋眰绫诲瀷鍏ㄥ悕");
+
+                    b.Property<string>("RequestTypeName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璇锋眰绫诲瀷鍚嶇О");
+
+                    b.Property<string>("ResponseTypeFullName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍝嶅簲绫诲瀷鍏ㄥ悕");
+
+                    b.Property<string>("ResponseTypeName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍝嶅簲绫诲瀷鍚嶇О");
+
+                    b.Property<string>("Route")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺敱");
+
+                    b.Property<string>("RouteArea")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺敱鍖哄煙");
+
+                    b.Property<int>("Service")
+                        .HasColumnType("int")
+                        .HasComment("鏈嶅姟");
+
+                    b.Property<string>("ServiceName")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鏈嶅姟鍚嶇О");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Resource", t =>
+                        {
+                            t.HasComment("璧勬簮");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Role", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("ClientType")
+                        .HasColumnType("int")
+                        .HasComment("瀹㈡埛绔被鍨�");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<int>("DataPower")
+                        .HasColumnType("int")
+                        .HasComment("鏁版嵁鏉冮檺");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁绂佺敤");
+
+                    b.Property<int>("MinLevel")
+                        .HasColumnType("int")
+                        .HasComment("鏈�浣庣骇鍒�");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("鍚嶇О");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<int>("UserType")
+                        .HasColumnType("int")
+                        .HasComment("鐢ㄦ埛绫诲瀷");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Role", t =>
+                        {
+                            t.HasComment("瑙掕壊");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("MenuId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鑿滃崟Id");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瑙掕壊Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("MenuId");
+
+                    b.HasIndex("RoleId");
+
+                    b.ToTable("RoleMenu", t =>
+                        {
+                            t.HasComment("瑙掕壊鑿滃崟");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleResource", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<int>("DataPower")
+                        .HasColumnType("int")
+                        .HasComment("鏁版嵁鏉冮檺");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("ResourceId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璧勬簮Id");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瑙掕壊Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ResourceId");
+
+                    b.HasIndex("RoleId");
+
+                    b.ToTable("RoleResource", t =>
+                        {
+                            t.HasComment("瑙掕壊璧勬簮");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Address")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("浠诲姟鍦扮偣璇︾粏鍦板潃");
+
+                    b.Property<int>("AgeMaxLimit")
+                        .HasColumnType("int")
+                        .HasComment("骞撮緞鑼冨洿澶�");
+
+                    b.Property<int>("AgeMinLimit")
+                        .HasColumnType("int")
+                        .HasComment("骞撮緞鑼冨洿鏈�灏�");
+
+                    b.Property<DateTime>("BeginTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("浠诲姟寮�濮嬫椂闂�");
+
+                    b.Property<int>("BillingMethod")
+                        .HasColumnType("int")
+                        .HasComment("璁¤垂鏂瑰紡");
+
+                    b.Property<Guid>("CityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟鍦扮偣鎵�灞炲尯鍩烮d");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<DateTime>("EndTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("浠诲姟缁撴潫鏃堕棿");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浼佷笟Id");
+
+                    b.Property<int>("GenderLimit")
+                        .HasColumnType("int")
+                        .HasComment("鎬у埆瑕佹眰");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("浠诲姟鍚嶇О");
+
+                    b.Property<decimal>("ServiceFee")
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("鏈嶅姟璐�");
+
+                    b.Property<int>("SettlementCycle")
+                        .HasColumnType("int")
+                        .HasComment("缁撶畻鏂瑰紡");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CityId");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.ToTable("TaskInfo", t =>
+                        {
+                            t.HasComment("浠诲姟淇℃伅");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("BenefitId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("绂忓埄Id");
+
+                    b.Property<Guid>("BenefitId1")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟Id");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("BenefitId");
+
+                    b.HasIndex("BenefitId1");
+
+                    b.ToTable("TaskInfoBenefit", t =>
+                        {
+                            t.HasComment("浠诲姟绂忓埄");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟Id");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<Guid?>("TypeId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功绫诲瀷Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.HasIndex("TypeId");
+
+                    b.ToTable("TaskInfoCredentialLimit");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<int>("HireStatus")
+                        .HasColumnType("int")
+                        .HasComment("褰曠敤鐘舵��");
+
+                    b.Property<DateTime?>("HireTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("褰曠敤鏃堕棿");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int?>("SignContractStatus")
+                        .HasColumnType("int")
+                        .HasComment("绛剧害鐘舵��");
+
+                    b.Property<DateTime?>("SignContractTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("绛剧害鏃堕棿");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟Id");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("TaskInfoUser", t =>
+                        {
+                            t.HasComment("浠诲姟鐢ㄦ埛淇℃伅");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("AvatarId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("澶村儚Id");
+
+                    b.Property<string>("BankCard")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("閾惰鍗″彿");
+
+                    b.Property<Guid?>("BankCardImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("閾惰鍗$収鐗嘔d");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("Identity")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("韬唤璇佸彿");
+
+                    b.Property<Guid?>("IdentityBackImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("韬唤璇佸浗寰介潰Id");
+
+                    b.Property<Guid?>("IdentityImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("韬唤璇佷汉鍍忛潰Id");
+
+                    b.Property<bool>("IsCheckPhoneNumber")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁宸叉牎楠屾墜鏈哄彿");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsReal")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁瀹炲悕");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("濮撳悕");
+
+                    b.Property<string>("Password")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀵嗙爜");
+
+                    b.Property<string>("PhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)")
+                        .HasComment("鎵嬫満鍙�");
+
+                    b.Property<int?>("RealAccess")
+                        .HasColumnType("int")
+                        .HasComment("瀹炲悕閫氶亾");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<string>("UserName")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("鐢ㄦ埛鍚�");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("AvatarId");
+
+                    b.HasIndex("BankCardImgId");
+
+                    b.HasIndex("IdentityBackImgId");
+
+                    b.HasIndex("IdentityImgId");
+
+                    b.ToTable("UserAuth", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛");
+                        });
+
+                    b.HasData(
+                        new
+                        {
+                            Id = new Guid("11111111-1111-1111-1111-111111111111"),
+                            CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)),
+                            IsCheckPhoneNumber = false,
+                            IsDeleted = false,
+                            IsReal = false,
+                            Name = "绠$悊鍛�",
+                            Password = "iEYggKrMhQ3ASUGLobra1w==:fn/DsMJUbD9FGpvBvR3moMpMPptdxzZlourPVhU479I=",
+                            Sort = 0,
+                            UserName = "system"
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfo", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("甯搁┗鍩庡競Id");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<Guid?>("EducationalBackgroundId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瀛﹀巻Id");
+
+                    b.Property<Guid?>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浼佷笟Id");
+
+                    b.Property<int?>("FreeTime")
+                        .HasColumnType("int")
+                        .HasComment("绌洪棽鏃堕棿");
+
+                    b.Property<int?>("Height")
+                        .HasColumnType("int")
+                        .HasComment("韬珮");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int?>("JobSeekingStatus")
+                        .HasColumnType("int")
+                        .HasComment("姹傝亴鐘舵��");
+
+                    b.Property<int>("Level")
+                        .HasColumnType("int")
+                        .HasComment("绾у埆");
+
+                    b.Property<Guid?>("PersonalIdentityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("韬唤Id");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("鐘舵��");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("鐢ㄦ埛绫诲瀷");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserAuthId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛Id");
+
+                    b.Property<int?>("Weight")
+                        .HasColumnType("int")
+                        .HasComment("浣撻噸");
+
+                    b.Property<string>("WorkExperience")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("宸ヤ綔缁忛獙");
+
+                    b.Property<string>("WorkSeniority")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("宸ヤ綔璧勫巻");
+
+                    b.Property<string>("WxmpOpenId")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("寰俊寮�鏀綢d");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CityId");
+
+                    b.HasIndex("EducationalBackgroundId");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("PersonalIdentityId");
+
+                    b.HasIndex("UserAuthId");
+
+                    b.ToTable("UserInfo", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅");
+                        });
+
+                    b.HasData(
+                        new
+                        {
+                            Id = new Guid("11111111-1111-1111-1111-111111111112"),
+                            CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)),
+                            IsDeleted = false,
+                            Level = 999,
+                            Sort = 0,
+                            Status = 0,
+                            Type = 100,
+                            UserAuthId = new Guid("11111111-1111-1111-1111-111111111111")
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoBankCard", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Bank")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("寮�鎴疯");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("閾惰鍗″彿");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<string>("PhoneNumber")
+                        .IsRequired()
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)")
+                        .HasComment("閾惰棰勭暀鎵嬫満鍙�");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoBankCard", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛閾惰鍗′俊鎭�");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoCredential", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("BackImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功鍙嶉潰鐓х墖Id");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("璇佷功缂栧彿");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<DateTime>("EndDate")
+                        .HasColumnType("datetime2")
+                        .HasComment("缁撴潫鏃ユ湡");
+
+                    b.Property<Guid>("ImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功姝i潰鐓х墖Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsForever")
+                        .HasColumnType("bit")
+                        .HasComment("姘镐箙璇佷功");
+
+                    b.Property<string>("IssueUnit")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍙戣瘉鍗曚綅");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnType("datetime2")
+                        .HasComment("寮�濮嬫棩鏈�");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<Guid?>("TypeId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功绫诲瀷Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("BackImgId");
+
+                    b.HasIndex("ImgId");
+
+                    b.HasIndex("TypeId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoCredential", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅璧勬牸璇佷功");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoDepartment", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<Guid>("DepartmentId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("閮ㄩ棬Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DepartmentId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoDepartment", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅閮ㄩ棬");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoExpectJob", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("PersonalIdentityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈熸湜宀椾綅Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("PersonalIdentityId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoExpectJob", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅鏈熸湜宀椾綅");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoPhoto", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<Guid>("ImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐓х墖Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ImgId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoPhoto", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅鐢熸椿鐓�");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoRole", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瑙掕壊Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RoleId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoRole", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅瑙掕壊");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("Departments")
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Department", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryCategory", "Category")
+                        .WithMany()
+                        .HasForeignKey("CategoryId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Category");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityBackImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityBackImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "LicenseImage")
+                        .WithMany()
+                        .HasForeignKey("LicenseImageId");
+
+                    b.Navigation("IdentityBackImg");
+
+                    b.Navigation("IdentityImg");
+
+                    b.Navigation("LicenseImage");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.FileVirtualPath", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileStore", "Store")
+                        .WithMany()
+                        .HasForeignKey("StoreId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Store");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Menu", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Menu", "Menu")
+                        .WithMany()
+                        .HasForeignKey("MenuId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("RoleMenus")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Menu");
+
+                    b.Navigation("Role");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleResource", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Resource", "Resource")
+                        .WithMany()
+                        .HasForeignKey("ResourceId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("RoleResources")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Resource");
+
+                    b.Navigation("Role");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "City")
+                        .WithMany()
+                        .HasForeignKey("CityId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany()
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("City");
+
+                    b.Navigation("Enterprise");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("Benefits")
+                        .HasForeignKey("BenefitId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Benefit")
+                        .WithMany()
+                        .HasForeignKey("BenefitId1")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Benefit");
+
+                    b.Navigation("TaskInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("CredentialLimits")
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Type")
+                        .WithMany()
+                        .HasForeignKey("TypeId");
+
+                    b.Navigation("TaskInfo");
+
+                    b.Navigation("Type");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany()
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany()
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("TaskInfo");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "Avatar")
+                        .WithMany()
+                        .HasForeignKey("AvatarId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "BankCardImg")
+                        .WithMany()
+                        .HasForeignKey("BankCardImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityBackImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityBackImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityImgId");
+
+                    b.Navigation("Avatar");
+
+                    b.Navigation("BankCardImg");
+
+                    b.Navigation("IdentityBackImg");
+
+                    b.Navigation("IdentityImg");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfo", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "City")
+                        .WithMany()
+                        .HasForeignKey("CityId");
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "EducationalBackground")
+                        .WithMany()
+                        .HasForeignKey("EducationalBackgroundId");
+
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("UserInfos")
+                        .HasForeignKey("EnterpriseId");
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "PersonalIdentity")
+                        .WithMany()
+                        .HasForeignKey("PersonalIdentityId");
+
+                    b.HasOne("FlexJobApi.Core.UserAuth", "UserAuth")
+                        .WithMany("UserInfos")
+                        .HasForeignKey("UserAuthId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("City");
+
+                    b.Navigation("EducationalBackground");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("PersonalIdentity");
+
+                    b.Navigation("UserAuth");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoBankCard", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany()
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoCredential", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "BackImg")
+                        .WithMany()
+                        .HasForeignKey("BackImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "Img")
+                        .WithMany()
+                        .HasForeignKey("ImgId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Type")
+                        .WithMany()
+                        .HasForeignKey("TypeId");
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoCredentials")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("BackImg");
+
+                    b.Navigation("Img");
+
+                    b.Navigation("Type");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoDepartment", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Department", "Department")
+                        .WithMany()
+                        .HasForeignKey("DepartmentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoDepartments")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Department");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoExpectJob", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "PersonalIdentity")
+                        .WithMany()
+                        .HasForeignKey("PersonalIdentityId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoExpectJobs")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("PersonalIdentity");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoPhoto", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "Img")
+                        .WithMany()
+                        .HasForeignKey("ImgId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany()
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Img");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoRole", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("UserInfoRoles")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoRoles")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Role");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.Navigation("Departments");
+
+                    b.Navigation("UserInfos");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Role", b =>
+                {
+                    b.Navigation("RoleMenus");
+
+                    b.Navigation("RoleResources");
+
+                    b.Navigation("UserInfoRoles");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.Navigation("Benefits");
+
+                    b.Navigation("CredentialLimits");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.Navigation("UserInfos");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfo", b =>
+                {
+                    b.Navigation("UserInfoCredentials");
+
+                    b.Navigation("UserInfoDepartments");
+
+                    b.Navigation("UserInfoExpectJobs");
+
+                    b.Navigation("UserInfoRoles");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs
new file mode 100644
index 0000000..654a953
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs
@@ -0,0 +1,130 @@
+锘縰sing Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace FlexJobApi.Database.Migrations.Migrations
+{
+    /// <inheritdoc />
+    public partial class UpdateResource0806 : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AlterColumn<string>(
+                name: "ActionName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "濮旀墭鍚嶇О",
+                oldClrType: typeof(string),
+                oldType: "nvarchar(max)",
+                oldComment: "濮旀墭鍚嶇О");
+
+            migrationBuilder.AddColumn<string>(
+                name: "ActionSummary",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "濮旀墭鎽樿");
+
+            migrationBuilder.AddColumn<bool>(
+                name: "AllowAnonymous",
+                table: "Resource",
+                type: "bit",
+                nullable: false,
+                defaultValue: false,
+                comment: "蹇界暐鏉冮檺");
+
+            migrationBuilder.AddColumn<string>(
+                name: "ApplicationName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "搴旂敤鍚嶇О");
+
+            migrationBuilder.AddColumn<string>(
+                name: "ControllerSummary",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "鎺у埗鍣ㄦ憳瑕�");
+
+            migrationBuilder.AddColumn<string>(
+                name: "DynamicAssemblyName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "鍔ㄦ�佺▼搴忛泦鍚嶇О");
+
+            migrationBuilder.AddColumn<string>(
+                name: "RouteArea",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "璺敱鍖哄煙");
+
+            migrationBuilder.AddColumn<int>(
+                name: "Service",
+                table: "Resource",
+                type: "int",
+                nullable: false,
+                defaultValue: 0,
+                comment: "鏈嶅姟");
+
+            migrationBuilder.AddColumn<string>(
+                name: "ServiceName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "鏈嶅姟鍚嶇О");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "ActionSummary",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "AllowAnonymous",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "ApplicationName",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "ControllerSummary",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "DynamicAssemblyName",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "RouteArea",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "Service",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "ServiceName",
+                table: "Resource");
+
+            migrationBuilder.AlterColumn<string>(
+                name: "ActionName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: false,
+                defaultValue: "",
+                comment: "濮旀墭鍚嶇О",
+                oldClrType: typeof(string),
+                oldType: "nvarchar(max)",
+                oldNullable: true,
+                oldComment: "濮旀墭鍚嶇О");
+        }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
index 18c4892..2b196b6 100644
--- a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
+++ b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
@@ -637,9 +637,20 @@
                         .HasColumnType("uniqueidentifier");
 
                     b.Property<string>("ActionName")
-                        .IsRequired()
                         .HasColumnType("nvarchar(max)")
                         .HasComment("濮旀墭鍚嶇О");
+
+                    b.Property<string>("ActionSummary")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("濮旀墭鎽樿");
+
+                    b.Property<bool>("AllowAnonymous")
+                        .HasColumnType("bit")
+                        .HasComment("蹇界暐鏉冮檺");
+
+                    b.Property<string>("ApplicationName")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("搴旂敤鍚嶇О");
 
                     b.Property<string>("Code")
                         .IsRequired()
@@ -650,12 +661,20 @@
                         .HasColumnType("int")
                         .HasComment("鎺у埗鍣�");
 
+                    b.Property<string>("ControllerSummary")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鎺у埗鍣ㄦ憳瑕�");
+
                     b.Property<DateTimeOffset>("CreatedTime")
                         .HasColumnType("datetimeoffset");
 
                     b.Property<Guid?>("CreatedUserInfoId")
                         .HasColumnType("uniqueidentifier")
                         .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("DynamicAssemblyName")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍔ㄦ�佺▼搴忛泦鍚嶇О");
 
                     b.Property<bool>("IsDeleted")
                         .HasColumnType("bit")
@@ -699,6 +718,18 @@
                         .HasColumnType("nvarchar(max)")
                         .HasComment("璺敱");
 
+                    b.Property<string>("RouteArea")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺敱鍖哄煙");
+
+                    b.Property<int>("Service")
+                        .HasColumnType("int")
+                        .HasComment("鏈嶅姟");
+
+                    b.Property<string>("ServiceName")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鏈嶅姟鍚嶇О");
+
                     b.Property<int>("Sort")
                         .HasColumnType("int")
                         .HasComment("鎺掑簭");
diff --git a/FlexJobApi.Database.Migrations/REDEME.MD b/FlexJobApi.Database.Migrations/REDEME.MD
index 0d380c7..2f3d2ab 100644
--- a/FlexJobApi.Database.Migrations/REDEME.MD
+++ b/FlexJobApi.Database.Migrations/REDEME.MD
@@ -1,7 +1,7 @@
 -------------------------------主数据库---------------------------------------
 
 新增迁移文件
-dotnet ef migrations add UpdateRole0805 -s "../FlexJobApi.Web.Entry" -c DefaultDbContext
+dotnet ef migrations add UpdateResource0806 -s "../FlexJobApi.Web.Entry" -c DefaultDbContext
 
 删除迁移文件
 dotnet ef migrations remove -s "../FlexJobApi.Web.Entry" -c DefaultDbContext
diff --git a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
index 4d13375..577984f 100644
--- a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
+++ b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
@@ -310,12 +310,14 @@
             鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
             </summary>
             <param name="repRole"></param>
+            <param name="repUserInfoRole"></param>
         </member>
         <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Role},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfoRole})">
             <summary>
             鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
             </summary>
             <param name="repRole"></param>
+            <param name="repUserInfoRole"></param>
         </member>
         <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.Handle(FlexJobApi.Core.GetRolesQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
@@ -333,18 +335,23 @@
         <member name="M:FlexJobApi.User.Application.GetRoleUserInfosQueryHandler.Handle(FlexJobApi.Core.GetRoleUserInfosQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
-        <member name="T:FlexJobApi.User.Application.UserInfos.Commands.SetUserInfoStatusCommandHandler">
+        <member name="T:FlexJobApi.User.Application.UserInfos.Commands.UserInfoCommandHandler">
+            <summary>
+            鐢ㄦ埛淇℃伅鍛戒护澶勭悊鍣�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.UserInfos.Commands.UserInfoCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfo})">
+            <summary>
+            鐢ㄦ埛淇℃伅鍛戒护澶勭悊鍣�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.UserInfos.Commands.UserInfoCommandHandler.Handle(FlexJobApi.Core.SetUserInfoStatusCommand,System.Threading.CancellationToken)">
             <summary>
             璁剧疆鐢ㄦ埛淇℃伅鐘舵��
             </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.UserInfos.Commands.SetUserInfoStatusCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfo})">
-            <summary>
-            璁剧疆鐢ㄦ埛淇℃伅鐘舵��
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.UserInfos.Commands.SetUserInfoStatusCommandHandler.Handle(FlexJobApi.Core.SetUserInfoStatusCommand,System.Threading.CancellationToken)">
-            <inheritdoc/>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
         </member>
         <member name="T:FlexJobApi.User.Application.GetOperationUserInfosQueryHandler">
             <summary>
diff --git a/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs b/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs
index 895ddf3..84cbf3b 100644
--- a/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs
+++ b/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs
@@ -15,6 +15,7 @@
     /// 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
     /// </summary>
     /// <param name="repRole"></param>
+    /// <param name="repUserInfoRole"></param>
     public class GetRolesQueryHandler(
             IRepository<Role> repRole,
             IRepository<UserInfoRole> repUserInfoRole
@@ -26,22 +27,24 @@
         /// <inheritdoc/>
         public async Task<PagedListQueryResult<GetRolesQueryResultItem>> Handle(GetRolesQuery request, CancellationToken cancellationToken)
         {
-            var q = repRole.AsQueryable().AsNoTracking();
-            if (request.UserType.HasValue)
-            {
-                q = q.Where(it => it.UserType == request.UserType);
-            }
-            if (request.ClientType.HasValue)
-            {
-                q = q.Where(it => it.ClientType == request.ClientType);
-            }
-            if (request.Keywords.IsNotNull())
-            {
-                q = q.Where(it => it.Name.Contains(request.Keywords) || it.Remark.Contains(request.Keywords));
-            }
-            var result = await q
-                .ProjectToType<GetRolesQueryResultItem>()
-                .ToPagedListAsync(request.PageModel, cancellationToken);
+            var result = await request.PageModel.ToPagedListAsync<Role, GetRolesQueryResultItem>(
+                q =>
+                {
+                    q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime);
+                    if (request.UserType.HasValue)
+                    {
+                        q = q.Where(it => it.UserType == request.UserType);
+                    }
+                    if (request.ClientType.HasValue)
+                    {
+                        q = q.Where(it => it.ClientType == request.ClientType);
+                    }
+                    if (request.Keywords.IsNotNull())
+                    {
+                        q = q.Where(it => it.Name.Contains(request.Keywords) || it.Remark.Contains(request.Keywords));
+                    }
+                    return q;
+                }, cancellationToken: cancellationToken);
 
             if (result.Data.Any())
             {
diff --git a/FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs b/FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs
similarity index 71%
rename from FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs
rename to FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs
index d91b776..8734b0f 100644
--- a/FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs
+++ b/FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs
@@ -11,15 +11,21 @@
 namespace FlexJobApi.User.Application.UserInfos.Commands
 {
     /// <summary>
-    /// 璁剧疆鐢ㄦ埛淇℃伅鐘舵��
+    /// 鐢ㄦ埛淇℃伅鍛戒护澶勭悊鍣�
     /// </summary>
-    public class SetUserInfoStatusCommandHandler(
+    public class UserInfoCommandHandler(
             IRepository<UserInfo> rep
-        ) : IRequestHandler<SetUserInfoStatusCommand, int>
+        ) : 
+        IRequestHandler<SetUserInfoStatusCommand, int>
     {
         private readonly IRepository<UserInfo> rep = rep;
 
-        /// <inheritdoc/>
+        /// <summary>
+        /// 璁剧疆鐢ㄦ埛淇℃伅鐘舵��
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
         public async Task<int> Handle(SetUserInfoStatusCommand request, CancellationToken cancellationToken)
         {
             var entities = await rep.AsQueryable()
diff --git a/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs b/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs
index 333ab4c..44c2d5e 100644
--- a/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs
+++ b/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs
@@ -24,27 +24,29 @@
         /// <inheritdoc/>
         public async Task<PagedListQueryResult<GetOperationUserInfosQueryResultItem>> Handle(GetOperationUserInfosQuery request, CancellationToken cancellationToken)
         {
-            var q = repUser.AsQueryable().AsNoTracking()
-                .OrderByDescending(it => it.Level).ThenByDescending(it => it.CreatedTime)
-                .Where(it => it.Type == EnumUserType.Operation);
-            if (request.Keywords.IsNotNull())
-            {
-                q = q.Where(it => 
-                    it.UserAuth.Name.Contains(request.Keywords)
-                    || it.UserAuth.UserName.Contains(request.Keywords)
-                    || it.UserAuth.PhoneNumber.Contains(request.Keywords)
-                    || it.Remark.Contains(request.Keywords));
-            }
-            var result = await q
-                .Select(it => new GetOperationUserInfosQueryResultItem
+            var result = await request.PageModel.ToPagedListAsync<UserInfo, GetOperationUserInfosQueryResultItem>(
+                q =>
+                {
+                    q = q.OrderByDescending(it => it.Level).ThenByDescending(it => it.CreatedTime)
+                        .Where(it => it.Type == EnumUserType.Operation);
+                    if (request.Keywords.IsNotNull())
+                    {
+                        q = q.Where(it =>
+                            it.UserAuth.Name.Contains(request.Keywords)
+                            || it.UserAuth.UserName.Contains(request.Keywords)
+                            || it.UserAuth.PhoneNumber.Contains(request.Keywords)
+                            || it.Remark.Contains(request.Keywords));
+                    }
+                    return q;
+                },
+                it => new GetOperationUserInfosQueryResultItem
                 {
                     Id = it.Id,
                     Name = it.UserAuth.Name,
                     UserName = it.UserAuth.UserName,
                     PhoneNumber = it.UserAuth.PhoneNumber,
                     Remark = it.Remark
-                })
-                .ToPagedListAsync(request.PageModel, cancellationToken);
+                }, cancellationToken);
             if (result.Data.Any())
             {
                 var ids = result.Data.DistinctSelect(it => it.Id);
diff --git a/FlexJobApi.User.Web.Entry/Startup.cs b/FlexJobApi.User.Web.Entry/Startup.cs
deleted file mode 100644
index 2ff8fc6..0000000
--- a/FlexJobApi.User.Web.Entry/Startup.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-锘縰sing FlexJobApi.Core;
-using Furion;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-
-namespace FlexJobApi.User.Web.Core;
-
-[AppStartup(4)]
-public class Startup : AppStartup
-{
-    public void ConfigureServices(IServiceCollection services)
-    {
-        services.AddJwt<JwtHandler>(enableGlobalAuthorize: true);
-
-        services.AddCorsAccessor();
-
-        services.AddControllers()
-                .AddFriendlyException()
-                .AddDataValidation()
-                .AddInjectWithUnifyResult<FriendlyResultProvider>();
-    }
-
-    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
-    {
-        if (env.IsDevelopment())
-        {
-            app.UseDeveloperExceptionPage();
-        }
-
-        app.UseUnifyResultStatusCodes();
-
-        app.UseHttpsRedirection();
-
-        app.UseRouting();
-
-        app.UseCorsAccessor();
-
-        app.UseAuthentication();
-        app.UseAuthorization();
-
-        app.UseInject(string.Empty);
-
-        app.UseEndpoints(endpoints =>
-        {
-            endpoints.MapControllers();
-        });
-    }
-}

--
Gitblit v1.9.1