From 356c47fb0ea1a642784e85c82833141d065bc4bc Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期二, 05 八月 2025 09:22:25 +0800
Subject: [PATCH] feat:动态控制器开发

---
 FlexJobApi.User.Application/Resources/Queries/GetResourcesQueryHandler.cs           |    2 
 FlexJobApi.User.Application/Roles/RoleAppService.cs                                 |  124 
 FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs                                |  251 +++
 FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs                                |   41 
 FlexJobApi.Core/Models/User/Roles/Commands/SaveRoleCommand.cs                       |    1 
 FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs                                        |   16 
 FlexJobApi.User.Application/Resources/ResourceAppService.cs                         |   66 
 FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs                          |    1 
 FlexJobApi.User.Application/Menus/MenuAppService.cs                                 |  176 +-
 FlexJobApi.User.Application/Auths/AuthAppService.cs                                 |   77 
 FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs                                   |    5 
 FlexJobApi.Core/Models/User/Menus/Commands/SetMenuSwitchCommand.cs                  |    1 
 FlexJobApi.Core/Enums/Common/EnumResourceMethod.cs                                  |    4 
 FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuFieldCommand.cs                  |    1 
 FlexJobApi.Core/FlexJobApi.Core.xml                                                 |  352 +++-
 FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuButtonCommand.cs                 |    1 
 FlexJobApi.Core/Models/User/Resources/Queries/GetResourceFieldsQuery.cs             |    1 
 FlexJobApi.Core/Models/User/Resources/Queries/GetResourcesQuery.cs                  |   10 
 FlexJobApi.Core/Enums/Common/EnumResourceController.cs                              |   40 
 FlexJobApi.Database.Migrations/Migrations/20250804152934_UpdateResource.Designer.cs | 2159 +++++++++++++++++++++++++++++++++
 FlexJobApi.User.Application/FlexJobApi.User.Application.xml                         |  147 --
 FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs                     |   64 
 FlexJobApi.Core/Utils/ResourceUtils/BuildDynamicControllersHostedService.cs         |   23 
 FlexJobApi.Database.Migrations/Migrations/20250804152934_UpdateResource.cs          |   78 +
 FlexJobApi.Core/Entities/Common/Resource.cs                                         |   24 
 FlexJobApi.Core/Enums/Common/EnumResourceService.cs                                 |   26 
 FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs       |    4 
 FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuCommand.cs                       |    4 
 FlexJobApi.Core/Models/User/Menus/Queries/GetMenuQuery.cs                           |    3 
 FlexJobApi.Application/Dictionaries/DictionaryAppService.cs                         |   50 
 FlexJobApi.Application/FlexJobApi.Application.xml                                   |   17 
 FlexJobApi.Core/Models/User/Menus/Commands/DeleteMenuCommand.cs                     |    1 
 FlexJobApi.User.Application/Menus/Queries/GetMenuQueryHandler.cs                    |    1 
 /dev/null                                                                           |   12 
 FlexJobApi.Core/FlexJobApiCoreStartup.cs                                            |    9 
 FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs                   |    1 
 FlexJobApi.Core/Models/User/Menus/Queries/GetMenusQuery.cs                          |    1 
 FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs                   |    1 
 FlexJobApi.Core/Models/User/Auths/Commands/PasswordLoginCommand.cs                  |    1 
 FlexJobApi.Core/Models/User/Roles/Queries/GetRoleQuery.cs                           |    1 
 FlexJobApi.Core/Models/User/Roles/Commands/DeleteRoleCommand.cs                     |    1 
 FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs          |   82 
 FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs         |   11 
 43 files changed, 3,252 insertions(+), 639 deletions(-)

diff --git a/FlexJobApi.Application/Dictionaries/DictionaryAppService.cs b/FlexJobApi.Application/Dictionaries/DictionaryAppService.cs
index 77900de..f56d20c 100644
--- a/FlexJobApi.Application/Dictionaries/DictionaryAppService.cs
+++ b/FlexJobApi.Application/Dictionaries/DictionaryAppService.cs
@@ -1,27 +1,27 @@
-锘縰sing FlexJobApi.Core;
-using Furion.DynamicApiController;
-using MediatR;
-using Microsoft.AspNetCore.Mvc;
+锘�//using FlexJobApi.Core;
+//using Furion.DynamicApiController;
+//using MediatR;
+//using Microsoft.AspNetCore.Mvc;
 
-namespace FlexJobApi.Application
-{
-    /// <summary>
-    /// 鏁版嵁瀛楀吀
-    /// </summary>
-    [Route("api/main/[controller]")]
-    public class DictionaryAppService(IMediator mediator) : IDynamicApiController
-    {
-        private readonly IMediator mediator = mediator;
+//namespace FlexJobApi.Application
+//{
+//    /// <summary>
+//    /// 鏁版嵁瀛楀吀
+//    /// </summary>
+//    [Route("api/main/[controller]")]
+//    public class DictionaryAppService(IMediator mediator) : IDynamicApiController
+//    {
+//        private readonly IMediator mediator = mediator;
 
-        /// <summary>
-        /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        [HttpPost]
-        public Task<GetDictionaryDatasQueryResult> GetDictionaryDatas([FromBody] GetDictionaryDatasQuery query)
-        {
-            return mediator.Send(query);
-        }
-    }
-}
+//        /// <summary>
+//        /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        [HttpPost]
+//        public Task<PagedListQueryResult<GetDictionaryDatasQueryResultItem>> GetDictionaryDatas([FromBody] GetDictionaryDatasQuery query)
+//        {
+//            return mediator.Send(query);
+//        }
+//    }
+//}
diff --git a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs
index cfa4f72..006fffe 100644
--- a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs
+++ b/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs
@@ -11,9 +11,9 @@
     /// <summary>
     /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
     /// </summary>
-    public class GetDictionaryDatasQueryHandler : IRequestHandler<GetDictionaryDatasQuery, GetDictionaryDatasQueryResult>
+    public class GetDictionaryDatasQueryHandler : IRequestHandler<GetDictionaryDatasQuery, PagedListQueryResult<GetDictionaryDatasQueryResultItem>>
     {
-        public Task<GetDictionaryDatasQueryResult> Handle(GetDictionaryDatasQuery request, CancellationToken cancellationToken)
+        public Task<PagedListQueryResult<GetDictionaryDatasQueryResultItem>> Handle(GetDictionaryDatasQuery request, CancellationToken cancellationToken)
         {
             throw new NotImplementedException();
         }
diff --git a/FlexJobApi.Application/FlexJobApi.Application.xml b/FlexJobApi.Application/FlexJobApi.Application.xml
index ccec683..705ed9b 100644
--- a/FlexJobApi.Application/FlexJobApi.Application.xml
+++ b/FlexJobApi.Application/FlexJobApi.Application.xml
@@ -4,23 +4,6 @@
         <name>FlexJobApi.Application</name>
     </assembly>
     <members>
-        <member name="T:FlexJobApi.Application.DictionaryAppService">
-            <summary>
-            鏁版嵁瀛楀吀
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.Application.DictionaryAppService.#ctor(MediatR.IMediator)">
-            <summary>
-            鏁版嵁瀛楀吀
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.Application.DictionaryAppService.GetDictionaryDatas(FlexJobApi.Core.GetDictionaryDatasQuery)">
-            <summary>
-            鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
-        </member>
         <member name="T:FlexJobApi.Application.GetDictionaryDatasQueryHandler">
             <summary>
             鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
diff --git a/FlexJobApi.Core/Entities/Common/Resource.cs b/FlexJobApi.Core/Entities/Common/Resource.cs
index 01de32d..2756c99 100644
--- a/FlexJobApi.Core/Entities/Common/Resource.cs
+++ b/FlexJobApi.Core/Entities/Common/Resource.cs
@@ -13,10 +13,16 @@
     public class Resource : CommonEntity, IDbAuditLogIgnore
     {
         /// <summary>
-        /// 寰湇鍔�
+        /// 鎺у埗鍣�
         /// </summary>
         [Required]
-        public string Service { get; set; }
+        public EnumResourceController Controller { get; set; }
+
+        /// <summary>
+        /// 濮旀墭鍚嶇О
+        /// </summary>
+        [Required]
+        public string ActionName { get; set; }
 
         /// <summary>
         /// 缂栧彿
@@ -33,7 +39,7 @@
         /// <summary>
         /// 璇锋眰鏂瑰紡
         /// </summary>
-        public EnumWebApiMethod Method { get; set; }
+        public EnumResourceMethod Method { get; set; }
 
         /// <summary>
         /// 璺敱
@@ -48,12 +54,24 @@
         public string RequestTypeName { get; set; }
 
         /// <summary>
+        /// 璇锋眰绫诲瀷鍏ㄥ悕
+        /// </summary>
+        [Required]
+        public string RequestTypeFullName { get; set; }
+
+        /// <summary>
         /// 鍝嶅簲绫诲瀷鍚嶇О
         /// </summary>
         [Required]
         public string ResponseTypeName { get; set; }
 
         /// <summary>
+        /// 鍝嶅簲绫诲瀷鍏ㄥ悕
+        /// </summary>
+        [Required]
+        public string ResponseTypeFullName { get; set; }
+
+        /// <summary>
         /// 鏄惁宸茶繃鏈�
         /// </summary>
         public bool IsExpired { get; set; }
diff --git a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs
index 1b7f374..fa3d72d 100644
--- a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs
+++ b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs
@@ -35,5 +35,10 @@
         /// </summary>
         [ErrorCodeItemMetadata("璇0}涓嶅彲淇敼")]
         s410 = 410,
+        /// <summary>
+        /// 绯荤粺寮傚父锛岃鑱旂郴绠$悊鍛�
+        /// </summary>
+        [ErrorCodeItemMetadata("绯荤粺寮傚父锛岃鑱旂郴绠$悊鍛�")]
+        s500 = 500,
     }
 }
diff --git a/FlexJobApi.Core/Enums/Common/EnumResourceController.cs b/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
new file mode 100644
index 0000000..b3968dc
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
@@ -0,0 +1,40 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 璧勬簮鎺у埗鍣�
+    /// </summary>
+    public enum EnumResourceController
+    {
+        /// <summary>
+        /// 鏁版嵁瀛楀吀
+        /// </summary>
+        [ResourceController(Service = EnumResourceService.Main)]
+        Dictionary,
+        /// <summary>
+        /// 鐢ㄦ埛璁よ瘉
+        /// </summary>
+        [ResourceController(Service = EnumResourceService.User)]
+        Auth,
+        /// <summary>
+        /// 鐢ㄦ埛鑿滃崟
+        /// </summary>
+        [ResourceController(Service = EnumResourceService.User)]
+        Menu,
+        /// <summary>
+        /// 鐢ㄦ埛璧勬簮
+        /// </summary>
+        [ResourceController(Service = EnumResourceService.User)]
+        Resource,
+        /// <summary>
+        /// 鐢ㄦ埛瑙掕壊
+        /// </summary>
+        [ResourceController(Service = EnumResourceService.User)]
+        Role
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Common/EnumWebApiMethod.cs b/FlexJobApi.Core/Enums/Common/EnumResourceMethod.cs
similarity index 89%
rename from FlexJobApi.Core/Enums/Common/EnumWebApiMethod.cs
rename to FlexJobApi.Core/Enums/Common/EnumResourceMethod.cs
index 896ddb9..db975c6 100644
--- a/FlexJobApi.Core/Enums/Common/EnumWebApiMethod.cs
+++ b/FlexJobApi.Core/Enums/Common/EnumResourceMethod.cs
@@ -7,9 +7,9 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 鎺ュ彛璇锋眰鏂瑰紡
+    /// 璧勬簮璇锋眰鏂瑰紡
     /// </summary>
-    public enum EnumWebApiMethod
+    public enum EnumResourceMethod
     {
         /// <summary>
         /// 鏌ヨ
diff --git a/FlexJobApi.Core/Enums/Common/EnumResourceService.cs b/FlexJobApi.Core/Enums/Common/EnumResourceService.cs
new file mode 100644
index 0000000..f458e9a
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Common/EnumResourceService.cs
@@ -0,0 +1,26 @@
+锘縰sing Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 璧勬簮鏈嶅姟
+    /// </summary>
+    public enum EnumResourceService
+    {
+        /// <summary>
+        /// 涓绘湇鍔�
+        /// </summary>
+        [ResourceService(ApplicationName = "FlexJobApi.Application", RouteArea = "main")]
+        Main,
+        /// <summary>
+        /// 鐢ㄦ埛鏈嶅姟
+        /// </summary>
+        [ResourceService(ApplicationName = "FlexJobApi.User.Application", RouteArea = "user")]
+        User
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Common/EnumWebApiAccess.cs b/FlexJobApi.Core/Enums/Common/EnumWebApiAccess.cs
deleted file mode 100644
index cb18fd1..0000000
--- a/FlexJobApi.Core/Enums/Common/EnumWebApiAccess.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Core
-{
-    /// <summary>
-    /// 鎺ュ彛閫氶亾
-    /// </summary>
-    public enum EnumWebApiAccess
-    {
-        User = 10,
-    }
-}
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index db1dfaa..b331637 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -239,9 +239,14 @@
             璧勬簮
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Resource.Service">
+        <member name="P:FlexJobApi.Core.Resource.Controller">
             <summary>
-            寰湇鍔�
+            鎺у埗鍣�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Resource.ActionName">
+            <summary>
+            濮旀墭鍚嶇О
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.Resource.Code">
@@ -269,9 +274,19 @@
             璇锋眰绫诲瀷鍚嶇О
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.Resource.RequestTypeFullName">
+            <summary>
+            璇锋眰绫诲瀷鍏ㄥ悕
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.Resource.ResponseTypeName">
             <summary>
             鍝嶅簲绫诲瀷鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Resource.ResponseTypeFullName">
+            <summary>
+            鍝嶅簲绫诲瀷鍏ㄥ悕
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.Resource.IsExpired">
@@ -1559,6 +1574,76 @@
             RabbitMQ
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.EnumResourceController">
+            <summary>
+            璧勬簮鎺у埗鍣�
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceController.Dictionary">
+            <summary>
+            鏁版嵁瀛楀吀
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceController.Auth">
+            <summary>
+            鐢ㄦ埛璁よ瘉
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceController.Menu">
+            <summary>
+            鐢ㄦ埛鑿滃崟
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceController.Resource">
+            <summary>
+            鐢ㄦ埛璧勬簮
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceController.Role">
+            <summary>
+            鐢ㄦ埛瑙掕壊
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.EnumResourceMethod">
+            <summary>
+            璧勬簮璇锋眰鏂瑰紡
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceMethod.Get">
+            <summary>
+            鏌ヨ
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceMethod.Post">
+            <summary>
+            鎻愪氦
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceMethod.Put">
+            <summary>
+            淇敼
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceMethod.Delete">
+            <summary>
+            鍒犻櫎
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.EnumResourceService">
+            <summary>
+            璧勬簮鏈嶅姟
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceService.Main">
+            <summary>
+            涓绘湇鍔�
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumResourceService.User">
+            <summary>
+            鐢ㄦ埛鏈嶅姟
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.EnumSmsAccess">
             <summary>
             鐭俊閫氶亾
@@ -1567,36 +1652,6 @@
         <member name="F:FlexJobApi.Core.EnumSmsAccess.AliyunSms">
             <summary>
             闃块噷浜戠煭淇�
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.EnumWebApiAccess">
-            <summary>
-            鎺ュ彛閫氶亾
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.EnumWebApiMethod">
-            <summary>
-            鎺ュ彛璇锋眰鏂瑰紡
-            </summary>
-        </member>
-        <member name="F:FlexJobApi.Core.EnumWebApiMethod.Get">
-            <summary>
-            鏌ヨ
-            </summary>
-        </member>
-        <member name="F:FlexJobApi.Core.EnumWebApiMethod.Post">
-            <summary>
-            鎻愪氦
-            </summary>
-        </member>
-        <member name="F:FlexJobApi.Core.EnumWebApiMethod.Put">
-            <summary>
-            淇敼
-            </summary>
-        </member>
-        <member name="F:FlexJobApi.Core.EnumWebApiMethod.Delete">
-            <summary>
-            鍒犻櫎
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.EnumBillingMethod">
@@ -1922,11 +1977,6 @@
         <member name="T:FlexJobApi.Core.GetDictionaryDatasQuery">
             <summary>
             鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.GetDictionaryDatasQueryResult">
-            <summary>
-            鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃-缁撴灉
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.GetDictionaryDatasQueryResultItem">
@@ -2309,287 +2359,287 @@
             鏄惁缂撳瓨锛坣ull鏃朵笉鏇存柊锛�
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.Models.GetMenuQuery">
+        <member name="T:FlexJobApi.Core.GetMenuQuery">
             <summary>
             鏌ヨ鑿滃崟璇︽儏
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQuery.Id">
+        <member name="P:FlexJobApi.Core.GetMenuQuery.Id">
             <summary>
             Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQuery.RoleId">
+        <member name="P:FlexJobApi.Core.GetMenuQuery.RoleId">
             <summary>
             瑙掕壊Id
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.Models.GetMenuQueryResult">
+        <member name="T:FlexJobApi.Core.GetMenuQueryResult">
             <summary>
             鏌ヨ鑿滃崟璇︽儏-缁撴灉
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Id">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Id">
             <summary>
             Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.IsChecked">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.IsChecked">
             <summary>
             鏄惁閫夋嫨锛堢敤鎴疯鑹叉巿鏉冿級
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.UserType">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.UserType">
             <summary>
             鐢ㄦ埛绫诲瀷
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.ClientType">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.ClientType">
             <summary>
             瀹㈡埛绔被鍨�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.ParentId">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.ParentId">
             <summary>
             涓婄骇Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Path">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Path">
             <summary>
             鑿滃崟璺緞
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Code">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Code">
             <summary>
             缂栧彿
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Name">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Name">
             <summary>
             鍚嶇О
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Type">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Type">
             <summary>
             绫诲瀷
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.VisitLevel">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.VisitLevel">
             <summary>
             璁块棶绾у埆
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Icon">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Icon">
             <summary>
             鍥炬爣
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Url">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Url">
             <summary>
             閾炬帴鍦板潃
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.IsDisabled">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.IsDisabled">
             <summary>
             鏄惁绂佺敤
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.IsCache">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.IsCache">
             <summary>
             鏄惁缂撳瓨
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Sort">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Sort">
             <summary>
             鎺掑簭
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Remark">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Remark">
             <summary>
             澶囨敞
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Groups">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResult.Groups">
             <summary>
             鍒嗙粍
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.Models.GetMenuQueryResultGroup">
+        <member name="T:FlexJobApi.Core.GetMenuQueryResultGroup">
             <summary>
             鏌ヨ鑿滃崟璇︽儏-缁撴灉-鍒嗙粍
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultGroup.Group">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultGroup.Group">
             <summary>
             鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultGroup.ButtonLocations">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultGroup.ButtonLocations">
             <summary>
             鎸夐挳浣嶇疆
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultGroup.Fields">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultGroup.Fields">
             <summary>
             瀛楁
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.Models.GetMenuQueryResultButtonLocation">
+        <member name="T:FlexJobApi.Core.GetMenuQueryResultButtonLocation">
             <summary>
             鏌ヨ鑿滃崟璇︽儏-缁撴灉-鎸夐挳浣嶇疆
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButtonLocation.Location">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButtonLocation.Location">
             <summary>
             浣嶇疆锛堢敤浜庢寜閽級
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButtonLocation.Buttons">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButtonLocation.Buttons">
             <summary>
             鎸夐挳
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.Models.GetMenuQueryResultButton">
+        <member name="T:FlexJobApi.Core.GetMenuQueryResultButton">
             <summary>
             鏌ヨ鑿滃崟璇︽儏-缁撴灉-鎸夐挳椤�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Id">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.Id">
             <summary>
             Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.IsChecked">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.IsChecked">
             <summary>
             鏄惁閫夋嫨锛堢敤鎴疯鑹叉巿鏉冿級
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Code">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.Code">
             <summary>
             缂栧彿
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Name">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.Name">
             <summary>
             鍚嶇О
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Icon">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.Icon">
             <summary>
             鍥炬爣
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Width">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.Width">
             <summary>
             瀹藉害锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Sort">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.Sort">
             <summary>
             鎺掑簭
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Remark">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultButton.Remark">
             <summary>
             澶囨敞
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.Models.GetMenuQueryResultField">
+        <member name="T:FlexJobApi.Core.GetMenuQueryResultField">
             <summary>
             鏌ヨ鑿滃崟璇︽儏-缁撴灉-瀛楁椤�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.Id">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultField.Id">
             <summary>
             Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.IsChecked">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultField.IsChecked">
             <summary>
             鏄惁閫夋嫨锛堢敤鎴疯鑹叉巿鏉冿級
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.Code">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultField.Code">
             <summary>
             缂栧彿
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.Name">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultField.Name">
             <summary>
             鍚嶇О
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.Width">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultField.Width">
             <summary>
             瀹藉害锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.Sort">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultField.Sort">
             <summary>
             鎺掑簭
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.Remark">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultField.Remark">
             <summary>
             澶囨敞
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.Models.GetMenuQueryResultItem">
+        <member name="T:FlexJobApi.Core.GetMenuQueryResultItem">
             <summary>
             鏌ヨ鑿滃崟璇︽儏-缁撴灉-椤�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Id">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Id">
             <summary>
             Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.IsChecked">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.IsChecked">
             <summary>
             鏄惁閫夋嫨锛堢敤鎴疯鑹叉巿鏉冿級
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Code">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Code">
             <summary>
             缂栧彿
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Name">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Name">
             <summary>
             鍚嶇О
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Type">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Type">
             <summary>
             绫诲瀷
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Icon">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Icon">
             <summary>
             鍥炬爣
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Group">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Group">
             <summary>
             鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Location">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Location">
             <summary>
             浣嶇疆锛堢敤浜庢寜閽級
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Width">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Width">
             <summary>
             瀹藉害锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Sort">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Sort">
             <summary>
             鎺掑簭
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Remark">
+        <member name="P:FlexJobApi.Core.GetMenuQueryResultItem.Remark">
             <summary>
             澶囨敞
             </summary>
@@ -2722,11 +2772,6 @@
         <member name="T:FlexJobApi.Core.GetResourcesQuery">
             <summary>
             鑾峰彇璧勬簮鍒楄〃
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.GetResourcesQuery.Service">
-            <summary>
-            寰湇鍔�
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.GetResourcesQuery.Method">
@@ -3137,6 +3182,15 @@
             <param name="type"></param>
             <returns></returns>
         </member>
+        <member name="M:FlexJobApi.Core.EnumUtils.GetDescription``1(FlexJobApi.Core.EnumModel{``0},``0)">
+            <summary>
+            鑾峰彇鎻忚堪
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="model"></param>
+            <param name="t"></param>
+            <returns></returns>
+        </member>
         <member name="M:FlexJobApi.Core.EnumUtils.GetEnum``1(FlexJobApi.Core.EnumModel{``0},System.String)">
             <summary>
             鑾峰彇鏋氫妇
@@ -3460,9 +3514,29 @@
             璺熻釜Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.ResourceModel.Service">
+        <member name="P:FlexJobApi.Core.ResourceModel.ApplicationName">
             <summary>
-            寰湇鍔�
+            搴旂敤鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.RouteArea">
+            <summary>
+            璺敱鍖哄煙
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.Controller">
+            <summary>
+            鎺у埗鍣�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.ControllerSummary">
+            <summary>
+            鎺у埗鍣ㄦ憳瑕�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.ActionName">
+            <summary>
+            濮旀墭鍚嶇О
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.ResourceModel.Code">
@@ -3473,6 +3547,11 @@
         <member name="P:FlexJobApi.Core.ResourceModel.Name">
             <summary>
             鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.AllowAnonymous">
+            <summary>
+            蹇界暐鏉冮檺
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.ResourceModel.Method">
@@ -3490,9 +3569,64 @@
             璇锋眰绫诲瀷鍚嶇О
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.RequestTypeFullName">
+            <summary>
+            璇锋眰绫诲瀷鍏ㄥ悕
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.ResourceModel.ResponseTypeName">
             <summary>
             鍝嶅簲绫诲瀷鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceModel.ResponseTypeFullName">
+            <summary>
+            鍝嶅簲绫诲瀷鍏ㄥ悕
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.ResourceAttribute">
+            <summary>
+            璧勬簮鐗规��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceAttribute.Controllers">
+            <summary>
+            璧勬簮鎺у埗鍣�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceAttribute.AllowAnonymous">
+            <summary>
+            蹇界暐鏉冮檺
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceAttribute.Method">
+            <summary>
+            璇锋眰鏂瑰紡
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.ResourceControllerAttribute">
+            <summary>
+            璧勬簮鎺у埗鍣ㄧ壒鎬�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceControllerAttribute.Service">
+            <summary>
+            鏈嶅姟
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.ResourceServiceAttribute">
+            <summary>
+            璧勬簮鏈嶅姟鐗规��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceServiceAttribute.ApplicationName">
+            <summary>
+            搴旂敤鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ResourceServiceAttribute.RouteArea">
+            <summary>
+            璺敱鍖哄煙
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.ResourceUtils">
@@ -3500,11 +3634,16 @@
             璧勬簮宸ュ叿
             </summary>
         </member>
-        <member name="M:FlexJobApi.Core.ResourceUtils.BuildWebApis(System.Threading.CancellationToken)">
+        <member name="M:FlexJobApi.Core.ResourceUtils.BuildDynamicControllersAsync">
             <summary>
-            鐢熸垚璧勬簮
+            鐢熸垚鍔ㄦ�佹帶鍒跺櫒
             </summary>
-            <param name="cancellationToken"></param>
+        </member>
+        <member name="M:FlexJobApi.Core.ResourceUtils.GetCSharpFriendlyName(System.Type)">
+            <summary>
+            鑾峰彇C#鍙嬪ソ鍚嶇О
+            </summary>
+            <param name="type"></param>
             <returns></returns>
         </member>
         <member name="T:FlexJobApi.Core.StringUtils">
@@ -3618,5 +3757,10 @@
             璇0}涓嶅彲淇敼
             </summary>
         </member>
+        <member name="F:FlexJobApi.User.Application.EnumErrorCodeType.s500">
+            <summary>
+            绯荤粺寮傚父锛岃鑱旂郴绠$悊鍛�
+            </summary>
+        </member>
     </members>
 </doc>
diff --git a/FlexJobApi.Core/FlexJobApiCoreStartup.cs b/FlexJobApi.Core/FlexJobApiCoreStartup.cs
index f52f125..c913fe3 100644
--- a/FlexJobApi.Core/FlexJobApiCoreStartup.cs
+++ b/FlexJobApi.Core/FlexJobApiCoreStartup.cs
@@ -50,6 +50,7 @@
             services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(App.Assemblies.ToArray()));
 
             services.AddHostedService<XmlDocBuildHostedService>();
+            services.AddHostedService<BuildDynamicControllersHostedService>();
 
             services.AddJwt<JwtHandler>(enableGlobalAuthorize: true);
 
@@ -107,10 +108,10 @@
                 endpoints.MapControllers();
             });
 
-            lifetime.ApplicationStarted.Register(async () =>
-            {
-                await ResourceUtils.BuildWebApis();
-            });
+            //lifetime.ApplicationStarted.Register(async () =>
+            //{
+            //    await ResourceUtils.BuildDynamicControllersAsync();
+            //});
         }
     }
 }
diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs
index 583155d..f157ece 100644
--- a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs
+++ b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs
@@ -10,16 +10,9 @@
     /// <summary>
     /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃
     /// </summary>
-    public class GetDictionaryDatasQuery : PagedListQuery<GetDictionaryDatasQueryResult, GetDictionaryDatasQueryResultItem> , IRequest<GetDictionaryDatasQueryResult>
+    [Resource([EnumResourceController.Dictionary])]
+    public class GetDictionaryDatasQuery : PagedListQuery<PagedListQueryResult<GetDictionaryDatasQueryResultItem>, GetDictionaryDatasQueryResultItem> , IRequest<PagedListQueryResult<GetDictionaryDatasQueryResultItem>>
     {
-    }
-
-    /// <summary>
-    /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃-缁撴灉
-    /// </summary>
-    public class GetDictionaryDatasQueryResult : PagedListQueryResult<GetDictionaryDatasQueryResultItem>
-    {
-
     }
 
     /// <summary>
diff --git a/FlexJobApi.Core/Models/User/Auths/Commands/PasswordLoginCommand.cs b/FlexJobApi.Core/Models/User/Auths/Commands/PasswordLoginCommand.cs
index abc5183..d425e82 100644
--- a/FlexJobApi.Core/Models/User/Auths/Commands/PasswordLoginCommand.cs
+++ b/FlexJobApi.Core/Models/User/Auths/Commands/PasswordLoginCommand.cs
@@ -12,6 +12,7 @@
     /// <summary>
     /// 瀵嗙爜鐧诲綍
     /// </summary>
+    [Resource([EnumResourceController.Auth], AllowAnonymous = true)]
     public class PasswordLoginCommand : IRequest<PasswordLoginCommandCallback>
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs b/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs
index 628cc0b..6a103ca 100644
--- a/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs
+++ b/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 鑾峰彇闃块噷浜慜SS鎺堟潈淇℃伅
     /// </summary>
+    [Resource([EnumResourceController.Auth])]
     public class GetAliyunOSSAcsQuery : IRequest<GetAliyunOSSAcsQueryResult>
     {
     }
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/DeleteMenuCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/DeleteMenuCommand.cs
index 28ca271..13ce439 100644
--- a/FlexJobApi.Core/Models/User/Menus/Commands/DeleteMenuCommand.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/DeleteMenuCommand.cs
@@ -11,6 +11,7 @@
     /// <summary>
     /// 鍒犻櫎鑿滃崟
     /// </summary>
+    [Resource([EnumResourceController.Menu])]
     public class DeleteMenuCommand : DeleteCommand, IRequest<int>
     {
 
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuButtonCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuButtonCommand.cs
index e2c8279..77bc812 100644
--- a/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuButtonCommand.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuButtonCommand.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 淇濆瓨鑿滃崟鎸夐挳
     /// </summary>
+    [Resource([EnumResourceController.Menu])]
     public class SaveMenuButtonCommand : IRequest<Guid>
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuCommand.cs
index b9fc1dc..200d8da 100644
--- a/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuCommand.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuCommand.cs
@@ -1,5 +1,4 @@
-锘縰sing FlexJobApi.Core.Models;
-using MediatR;
+锘縰sing MediatR;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
@@ -12,6 +11,7 @@
     /// <summary>
     /// 淇濆瓨鑿滃崟
     /// </summary>
+    [Resource([EnumResourceController.Menu])]
     public class SaveMenuCommand : IRequest<Guid>
     {
         public SaveMenuCommand()
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuFieldCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuFieldCommand.cs
index d856536..a5d35cd 100644
--- a/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuFieldCommand.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuFieldCommand.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 淇濆瓨鑿滃崟瀛楁
     /// </summary>
+    [Resource([EnumResourceController.Menu])]
     public class SaveMenuFieldCommand : IRequest<Guid>
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/SetMenuSwitchCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/SetMenuSwitchCommand.cs
index 404ff97..de74653 100644
--- a/FlexJobApi.Core/Models/User/Menus/Commands/SetMenuSwitchCommand.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/SetMenuSwitchCommand.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 璁剧疆鑿滃崟鍒囨崲淇℃伅
     /// </summary>
+    [Resource([EnumResourceController.Menu])]
     public class SetMenuSwitchCommand : IRequest<int>
     {
         public SetMenuSwitchCommand()
diff --git a/FlexJobApi.Core/Models/User/Menus/Queries/GetMenuQuery.cs b/FlexJobApi.Core/Models/User/Menus/Queries/GetMenuQuery.cs
index 700b2da..02eb706 100644
--- a/FlexJobApi.Core/Models/User/Menus/Queries/GetMenuQuery.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Queries/GetMenuQuery.cs
@@ -6,11 +6,12 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace FlexJobApi.Core.Models
+namespace FlexJobApi.Core
 {
     /// <summary>
     /// 鏌ヨ鑿滃崟璇︽儏
     /// </summary>
+    [Resource([EnumResourceController.Menu])]
     public class GetMenuQuery : IRequest<GetMenuQueryResult>
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Models/User/Menus/Queries/GetMenusQuery.cs b/FlexJobApi.Core/Models/User/Menus/Queries/GetMenusQuery.cs
index d7db2d6..9055eae 100644
--- a/FlexJobApi.Core/Models/User/Menus/Queries/GetMenusQuery.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Queries/GetMenusQuery.cs
@@ -12,6 +12,7 @@
     /// <summary>
     /// 鏌ヨ鑿滃崟鍒楄〃
     /// </summary>
+    [Resource([EnumResourceController.Menu])]
     public class GetMenusQuery : IRequest<List<GetMenusQueryResultItem>>
     {
         public GetMenusQuery()
diff --git a/FlexJobApi.Core/Models/User/Resources/Queries/GetResourceFieldsQuery.cs b/FlexJobApi.Core/Models/User/Resources/Queries/GetResourceFieldsQuery.cs
index 6911507..f6d2917 100644
--- a/FlexJobApi.Core/Models/User/Resources/Queries/GetResourceFieldsQuery.cs
+++ b/FlexJobApi.Core/Models/User/Resources/Queries/GetResourceFieldsQuery.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 鑾峰彇璧勬簮瀛楁
     /// </summary>
+    [Resource([EnumResourceController.Resource])]
     public class GetResourceFieldsQuery : IRequest<List<GetResourceFieldsQueryResultItem>>
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Models/User/Resources/Queries/GetResourcesQuery.cs b/FlexJobApi.Core/Models/User/Resources/Queries/GetResourcesQuery.cs
index ad8c621..2e2993f 100644
--- a/FlexJobApi.Core/Models/User/Resources/Queries/GetResourcesQuery.cs
+++ b/FlexJobApi.Core/Models/User/Resources/Queries/GetResourcesQuery.cs
@@ -11,17 +11,13 @@
     /// <summary>
     /// 鑾峰彇璧勬簮鍒楄〃
     /// </summary>
+    [Resource([EnumResourceController.Resource])]
     public class GetResourcesQuery : IRequest<List<GetResourcesQueryResultItem>>
     {
         /// <summary>
-        /// 寰湇鍔�
-        /// </summary>
-        public string Service { get; set; }
-
-        /// <summary>
         /// 璇锋眰鏂瑰紡
         /// </summary>
-        public EnumWebApiMethod? Method { get; set; }
+        public EnumResourceMethod? Method { get; set; }
 
         /// <summary>
         /// 鍏抽敭瀛�
@@ -67,7 +63,7 @@
         /// <summary>
         /// 璇锋眰鏂瑰紡
         /// </summary>
-        public EnumWebApiMethod Method { get; set; }
+        public EnumResourceMethod Method { get; set; }
 
         /// <summary>
         /// 璺敱
diff --git a/FlexJobApi.Core/Models/User/Roles/Commands/DeleteRoleCommand.cs b/FlexJobApi.Core/Models/User/Roles/Commands/DeleteRoleCommand.cs
index 4aaadfa..98a987c 100644
--- a/FlexJobApi.Core/Models/User/Roles/Commands/DeleteRoleCommand.cs
+++ b/FlexJobApi.Core/Models/User/Roles/Commands/DeleteRoleCommand.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 鍒犻櫎瑙掕壊
     /// </summary>
+    [Resource([EnumResourceController.Role])]
     public class DeleteRoleCommand : DeleteCommand, IRequest<int>
     {
 
diff --git a/FlexJobApi.Core/Models/User/Roles/Commands/SaveRoleCommand.cs b/FlexJobApi.Core/Models/User/Roles/Commands/SaveRoleCommand.cs
index 45452a1..5b498c5 100644
--- a/FlexJobApi.Core/Models/User/Roles/Commands/SaveRoleCommand.cs
+++ b/FlexJobApi.Core/Models/User/Roles/Commands/SaveRoleCommand.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 淇濆瓨瑙掕壊
     /// </summary>
+    [Resource([EnumResourceController.Role])]
     public class SaveRoleCommand : IRequest<Guid>
     {
         public SaveRoleCommand()
diff --git a/FlexJobApi.Core/Models/User/Roles/Queries/GetRoleQuery.cs b/FlexJobApi.Core/Models/User/Roles/Queries/GetRoleQuery.cs
index bb9ba7b..3ff55a0 100644
--- a/FlexJobApi.Core/Models/User/Roles/Queries/GetRoleQuery.cs
+++ b/FlexJobApi.Core/Models/User/Roles/Queries/GetRoleQuery.cs
@@ -10,6 +10,7 @@
     /// <summary>
     /// 鏌ヨ瑙掕壊璇︽儏
     /// </summary>
+    [Resource([EnumResourceController.Role])]
     public class GetRoleQuery : IRequest<GetRoleQueryResult>
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
index 3ab3171..f46a790 100644
--- a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
+++ b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
@@ -11,6 +11,7 @@
     /// <summary>
     /// 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
     /// </summary>
+    [Resource([EnumResourceController.Role])]
     public class GetRolesQuery : PagedListQuery<PagedListQueryResult<GetRolesQueryResultItem>, GetRolesQueryResultItem>, IRequest<PagedListQueryResult<GetRolesQueryResultItem>>
     {
         /// <summary>
diff --git a/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs b/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs
index b7448be..5421781 100644
--- a/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs
+++ b/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs
@@ -67,6 +67,22 @@
         }
 
         /// <summary>
+        /// 鑾峰彇鎻忚堪
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="model"></param>
+        /// <param name="t"></param>
+        /// <returns></returns>
+        public static string GetDescription<T>(this EnumModel<T> model, T t)
+            where T : struct
+        {
+            return model.Items
+                .Where(it => it.Enum.Equals(t))
+                .Select(it => it.Description)
+                .FirstOrDefault();
+        }
+
+        /// <summary>
         /// 鑾峰彇鏋氫妇
         /// </summary>
         /// <typeparam name="T"></typeparam>
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/BuildDynamicControllersHostedService.cs b/FlexJobApi.Core/Utils/ResourceUtils/BuildDynamicControllersHostedService.cs
new file mode 100644
index 0000000..5f46d5d
--- /dev/null
+++ b/FlexJobApi.Core/Utils/ResourceUtils/BuildDynamicControllersHostedService.cs
@@ -0,0 +1,23 @@
+锘縰sing Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    public class BuildDynamicControllersHostedService : IHostedService
+    {
+        public Task StartAsync(CancellationToken cancellationToken)
+        {
+            return ResourceUtils.BuildDynamicControllersAsync();
+        }
+
+        public Task StopAsync(CancellationToken cancellationToken)
+        {
+            return Task.CompletedTask;
+        }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/DynamicControllerProvider.cs b/FlexJobApi.Core/Utils/ResourceUtils/DynamicControllerProvider.cs
deleted file mode 100644
index 60e6d04..0000000
--- a/FlexJobApi.Core/Utils/ResourceUtils/DynamicControllerProvider.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FlexJobApi.Core
-{
-    public class DynamicControllerProvider
-    {
-    }
-}
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs
index d334aad..2c94af3 100644
--- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs
@@ -15,9 +15,29 @@
         public string TraceId { get; set; }
 
         /// <summary>
-        /// 寰湇鍔�
+        /// 搴旂敤鍚嶇О
         /// </summary>
-        public string Service { get; set; }
+        public string ApplicationName { get; set; }
+
+        /// <summary>
+        /// 璺敱鍖哄煙
+        /// </summary>
+        public string RouteArea { get; set; }
+
+        /// <summary>
+        /// 鎺у埗鍣�
+        /// </summary>
+        public EnumResourceController Controller { get; set; }
+
+        /// <summary>
+        /// 鎺у埗鍣ㄦ憳瑕�
+        /// </summary>
+        public string ControllerSummary { get; set; }
+
+        /// <summary>
+        /// 濮旀墭鍚嶇О
+        /// </summary>
+        public string ActionName { get; set; }
 
         /// <summary>
         /// 缂栧彿
@@ -30,9 +50,14 @@
         public string Name { get; set; }
 
         /// <summary>
+        /// 蹇界暐鏉冮檺
+        /// </summary>
+        public bool AllowAnonymous { get; set; }
+
+        /// <summary>
         /// 璇锋眰鏂瑰紡
         /// </summary>
-        public EnumWebApiMethod Method { get; set; }
+        public EnumResourceMethod Method { get; set; }
 
         /// <summary>
         /// 璺敱
@@ -45,8 +70,18 @@
         public string RequestTypeName { get; set; }
 
         /// <summary>
+        /// 璇锋眰绫诲瀷鍏ㄥ悕
+        /// </summary>
+        public string RequestTypeFullName { get; set; }
+
+        /// <summary>
         /// 鍝嶅簲绫诲瀷鍚嶇О
         /// </summary>
         public string ResponseTypeName { get; set; }
+
+        /// <summary>
+        /// 鍝嶅簲绫诲瀷鍏ㄥ悕
+        /// </summary>
+        public string ResponseTypeFullName { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs
new file mode 100644
index 0000000..2578882
--- /dev/null
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs
@@ -0,0 +1,64 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 璧勬簮鐗规��
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Class)]
+    public class ResourceAttribute : Attribute
+    {
+        public ResourceAttribute(EnumResourceController[] controllers)
+        {
+            Controllers = controllers;
+        }
+
+        /// <summary>
+        /// 璧勬簮鎺у埗鍣�
+        /// </summary>
+        public EnumResourceController[] Controllers { get; }
+
+        /// <summary>
+        /// 蹇界暐鏉冮檺
+        /// </summary>
+        public bool AllowAnonymous { get; set; }
+
+        /// <summary>
+        /// 璇锋眰鏂瑰紡
+        /// </summary>
+        public EnumResourceMethod? Method { get; set; }
+    }
+
+    /// <summary>
+    /// 璧勬簮鎺у埗鍣ㄧ壒鎬�
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field)]
+    public class ResourceControllerAttribute : Attribute
+    {
+        /// <summary>
+        /// 鏈嶅姟
+        /// </summary>
+        public EnumResourceService Service { get; set; }
+    }
+
+    /// <summary>
+    /// 璧勬簮鏈嶅姟鐗规��
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field)]
+    public class ResourceServiceAttribute : Attribute
+    {
+        /// <summary>
+        /// 搴旂敤鍚嶇О
+        /// </summary>
+        public string ApplicationName { get; set; }
+
+        /// <summary>
+        /// 璺敱鍖哄煙
+        /// </summary>
+        public string RouteArea { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
index c31228c..fb77aa3 100644
--- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
@@ -1,7 +1,11 @@
-锘縰sing Furion;
+锘縰sing FlexJobApi.User.Application;
+using Furion;
 using Furion.DatabaseAccessor;
 using Furion.DistributedIDGenerator;
+using Furion.DynamicApiController;
+using Furion.FriendlyException;
 using Mapster;
+using MediatR;
 using Microsoft.AspNetCore.Mvc.ActionConstraints;
 using Microsoft.AspNetCore.Mvc.Controllers;
 using Microsoft.AspNetCore.Routing;
@@ -10,7 +14,9 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 using System.Text;
+using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -22,63 +28,224 @@
     public static class ResourceUtils
     {
         /// <summary>
-        /// 鐢熸垚璧勬簮
+        /// 鐢熸垚鍔ㄦ�佹帶鍒跺櫒
         /// </summary>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public static async Task BuildWebApis(CancellationToken cancellationToken = default)
+        public static async Task BuildDynamicControllersAsync()
         {
             var traceId = App.GetTraceId() ?? IDGen.NextID().ToString();
             var scopeFactory = App.GetService<IServiceScopeFactory>();
             var serviceScope = scopeFactory.CreateScope();
             var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<Resource>>();
-            var endpointDataSource = App.GetService<EndpointDataSource>();
-            var routeEndpoints = endpointDataSource.Endpoints.OfType<RouteEndpoint>();
+            var provider = serviceScope.ServiceProvider.GetRequiredService<IDynamicApiRuntimeChangeProvider>();
             var xmlDoc = await XmlDocUtils.GetXmlDocAsync();
-            var enumWebApiMethods = await EnumUtils.GetModel<EnumWebApiMethod>();
-            var webApis = await rep.AsQueryable().ToListAsync();
-            foreach (var routeEndpoint in routeEndpoints)
+            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 models = new List<ResourceModel>();
+            foreach (var request in requests)
             {
-                var model = new ResourceModel();
-                model.TraceId = traceId;
-                model.Route = "/" + routeEndpoint.RoutePattern.RawText;
-                var controllerActionDescriptor = routeEndpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
-                var methodInfo = controllerActionDescriptor.MethodInfo;
-                var methodInfoXmlDoc = await controllerActionDescriptor.MethodInfo.GetXmlDocMemberAsync(xmlDoc);
-                var controllerTypeXmlDoc = await methodInfo.DeclaringType?.GetXmlDocMemberAsync();
-                model.Code = methodInfoXmlDoc.Name;
-                model.Service = methodInfo.Module.Name.Split(".")[1];
-                model.Method = enumWebApiMethods.GetEnum((controllerActionDescriptor.ActionConstraints[0] as HttpMethodActionConstraint).HttpMethods.FirstOrDefault());
-                model.Name = $"{controllerTypeXmlDoc?.Summary ?? "娌″啓娉ㄩ噴"}-{methodInfoXmlDoc?.Summary ?? "娌″啓娉ㄩ噴"}";
-                model.RequestTypeName = methodInfo.GetParameters().FirstOrDefault().ParameterType.FullName;
-                var returnType = methodInfo.ReturnType;
-                if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task<>))
-                    returnType = returnType.GetGenericArguments()[0];
-                if (returnType != null && returnType != typeof(Task))
-                    model.ResponseTypeName = methodInfo.ReturnType.FullName;
+                var resourceAttribute = request.GetCustomAttribute<ResourceAttribute>();
+                if (resourceAttribute == null) throw Oops.Oh(EnumErrorCodeType.s404, $"璇风粰璧勬簮{request.Name}鍒嗛厤鏈嶅姟鐗规�esource");
 
-                var webApi = webApis.FirstOrDefault(it => it.Route == model.Route && it.Method == model.Method);
-                if (webApi == null)
+                foreach (var controller in resourceAttribute.Controllers)
                 {
-                    webApi = new Resource();
-                    model.Adapt(webApi);
-                    await rep.InsertAsync(webApi);
-                    webApis.Add(webApi);
-                }
-                else
-                {
-                    model.Adapt(webApi);
-                    await rep.UpdateAsync(webApi);
+                    var resourceController = controller.GetType().GetMember(controller.ToString())[0].GetCustomAttribute<ResourceControllerAttribute>();
+                    var resourceService = resourceController.Service.GetType().GetMember(resourceController.Service.ToString())[0].GetCustomAttribute<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.Method =
+                        request.BaseType?.IsGenericType == true && request.BaseType.GetGenericTypeDefinition() == typeof(PagedListQuery<,>)
+                        ? EnumResourceMethod.Post
+                        : new List<string> { "Post", "Add", "Create", "Insert", "Submit" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase))
+                        ? EnumResourceMethod.Post
+                        : new List<string> { "GetAll", "GetList", "Get", "Find", "Fetch", "Query" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase))
+                        ? EnumResourceMethod.Get
+                        : new List<string> { "Put", "Update ", "Set" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase))
+                        ? EnumResourceMethod.Put
+                        : new List<string> { "Delete", "Remove ", "Clear" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase))
+                        ? EnumResourceMethod.Delete
+                        : EnumResourceMethod.Post;
+                    model.Name = requestXmlDoc?.Summary;
+                    model.AllowAnonymous = resourceAttribute.AllowAnonymous;
+                    model.RequestTypeName = request.Name;
+                    model.RequestTypeFullName = request.FullName;
+                    var iRequestType = request.GetInterface("IRequest`1");
+                    if (iRequestType != null && iRequestType.IsGenericType)
+                    {
+                        var responseType = iRequestType.GenericTypeArguments[0];
+                        model.ResponseTypeName = responseType.GetCSharpFriendlyName();
+                        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 expiredWebApis = webApis.Where(it => it.TraceId != traceId).ToList();
-            foreach (var webApi in expiredWebApis)
+
+            var expiredResources = resources.Where(it => it.TraceId != traceId).ToList();
+            foreach (var expiredResource in expiredResources)
             {
-                webApi.IsExpired = true;
-                await rep.UpdateAsync(webApi);
+                expiredResource.IsExpired = true;
+                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)
+            {
+                var code = $@"
+using FlexJobApi.Core;
+using Furion.DynamicApiController;
+using Furion.FriendlyException;
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+
+namespace {controller.Key.ApplicationName}
+{{
+    /// <summary>
+    /// {controller.Key.ControllerSummary}
+    /// </summary>
+    [Route(""api/{controller.Key.RouteArea}/[controller]"")]
+    public class {controller.Key.Controller}AppService(IMediator mediator) : IDynamicApiController
+    {{
+        private readonly IMediator mediator = mediator;";
+                foreach (var action in controller.Actions)
+                {
+                    code += $@"
+
+        /// <summary>
+        /// {action.Name}
+        /// </summary>
+        /// <param name=""request""></param>
+        /// <returns></returns>";
+                    if (action.AllowAnonymous)
+                    {
+                        code += $@"
+        [AllowAnonymous]";
+                    }
+                    code += $@"
+        [Http{action.Method}]
+        public Task<{action.ResponseTypeName}> {action.ActionName}({action.RequestTypeName} request)
+        {{
+            return mediator.Send(request);
+        }}
+";
+                }
+                code += $@"
+    }}
+}}
+";
+                var dynamicAssembly = App.CompileCSharpClassCode(code);
+                provider.AddAssembliesWithNotifyChanges(dynamicAssembly);
             }
 
             await rep.SaveNowAsync();
         }
+
+        /// <summary>
+        /// 鑾峰彇C#鍙嬪ソ鍚嶇О
+        /// </summary>
+        /// <param name="type"></param>
+        /// <returns></returns>
+        public static string GetCSharpFriendlyName(this Type type)
+        {
+            // 澶勭悊鍙┖绫诲瀷
+            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
+            {
+                Type underlyingType = Nullable.GetUnderlyingType(type)!;
+                return $"{GetCSharpFriendlyName(underlyingType)}?";
+            }
+
+            // 澶勭悊鍩虹绫诲瀷
+            if (type.FullName.IsNotNull())
+            {
+                var baseTypes = new Dictionary<string, string>
+                {
+                    { "System.Byte", "byte" },
+                    { "System.SByte", "sbyte" },
+                    { "System.Int16", "short" },
+                    { "System.UInt16", "ushort" },
+                    { "System.Int32", "int" },
+                    { "System.UInt32", "uint" },
+                    { "System.Int64", "long" },
+                    { "System.UInt64", "ulong" },
+                    { "System.Single", "float" },
+                    { "System.Double", "double" },
+                    { "System.Decimal", "decimal" },
+                    { "System.Char", "char" },
+                    { "System.Boolean", "bool" },
+                    { "System.String", "string" },
+                    { "System.Object", "object" }
+                };
+                if (baseTypes.TryGetValue(type.FullName, out string? friendlyName) && friendlyName.IsNotNull())
+                {
+                    return friendlyName;
+                }
+            }
+
+            // 澶勭悊闈炴硾鍨嬬被鍨�
+            if (!type.IsGenericType)
+            {
+                return type.Name;
+            }
+
+            // 澶勭悊娉涘瀷绫诲瀷
+            string genericTypeName = type.GetGenericTypeDefinition().Name;
+            if (genericTypeName.Contains('`'))
+                genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`'));
+
+            string[] genericArgs = type.GetGenericArguments()
+               .Select(GetCSharpFriendlyName)
+               .ToArray();
+
+            return $"{genericTypeName}<{string.Join(", ", genericArgs)}>";
+        }
     }
 }
diff --git a/FlexJobApi.Database.Migrations/Migrations/20250804152934_UpdateResource.Designer.cs b/FlexJobApi.Database.Migrations/Migrations/20250804152934_UpdateResource.Designer.cs
new file mode 100644
index 0000000..3138dec
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250804152934_UpdateResource.Designer.cs
@@ -0,0 +1,2159 @@
+锘�// <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("20250804152934_UpdateResource")]
+    partial class UpdateResource
+    {
+        /// <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<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<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<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")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("濮旀墭鍚嶇О");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("缂栧彿");
+
+                    b.Property<int>("Controller")
+                        .HasColumnType("int")
+                        .HasComment("鎺у埗鍣�");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .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<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<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("MinLevel")
+                        .HasColumnType("int")
+                        .HasComment("鏈�浣庣骇鍒�");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .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<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<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,
+                            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()
+                        .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");
+                });
+
+            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/20250804152934_UpdateResource.cs b/FlexJobApi.Database.Migrations/Migrations/20250804152934_UpdateResource.cs
new file mode 100644
index 0000000..fb6a961
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250804152934_UpdateResource.cs
@@ -0,0 +1,78 @@
+锘縰sing Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace FlexJobApi.Database.Migrations.Migrations
+{
+    /// <inheritdoc />
+    public partial class UpdateResource : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "Service",
+                table: "Resource");
+
+            migrationBuilder.AddColumn<string>(
+                name: "ActionName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: false,
+                defaultValue: "",
+                comment: "濮旀墭鍚嶇О");
+
+            migrationBuilder.AddColumn<int>(
+                name: "Controller",
+                table: "Resource",
+                type: "int",
+                nullable: false,
+                defaultValue: 0,
+                comment: "鎺у埗鍣�");
+
+            migrationBuilder.AddColumn<string>(
+                name: "RequestTypeFullName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: false,
+                defaultValue: "",
+                comment: "璇锋眰绫诲瀷鍏ㄥ悕");
+
+            migrationBuilder.AddColumn<string>(
+                name: "ResponseTypeFullName",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: false,
+                defaultValue: "",
+                comment: "鍝嶅簲绫诲瀷鍏ㄥ悕");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "ActionName",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "Controller",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "RequestTypeFullName",
+                table: "Resource");
+
+            migrationBuilder.DropColumn(
+                name: "ResponseTypeFullName",
+                table: "Resource");
+
+            migrationBuilder.AddColumn<string>(
+                name: "Service",
+                table: "Resource",
+                type: "nvarchar(max)",
+                nullable: false,
+                defaultValue: "",
+                comment: "寰湇鍔�");
+        }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
index f9ecf14..064da2e 100644
--- a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
+++ b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
@@ -85,7 +85,7 @@
 
                     b.HasIndex("ParentId");
 
-                    b.ToTable("Department", null, t =>
+                    b.ToTable("Department", t =>
                         {
                             t.HasComment("閮ㄩ棬");
                         });
@@ -141,7 +141,7 @@
 
                     b.HasKey("Id");
 
-                    b.ToTable("DictionaryCategory", null, t =>
+                    b.ToTable("DictionaryCategory", t =>
                         {
                             t.HasComment("瀛楀吀绫诲埆");
                         });
@@ -227,7 +227,7 @@
 
                     b.HasIndex("ParentId");
 
-                    b.ToTable("DictionaryData", null, t =>
+                    b.ToTable("DictionaryData", t =>
                         {
                             t.HasComment("瀛楀吀鏁版嵁");
                         });
@@ -350,7 +350,7 @@
 
                     b.HasIndex("LicenseImageId");
 
-                    b.ToTable("Enterprise", null, t =>
+                    b.ToTable("Enterprise", t =>
                         {
                             t.HasComment("浼佷笟");
                         });
@@ -441,7 +441,7 @@
 
                     b.HasKey("Id");
 
-                    b.ToTable("FileStore", null, t =>
+                    b.ToTable("FileStore", t =>
                         {
                             t.HasComment("鏂囦欢瀛樺偍");
                         });
@@ -497,7 +497,7 @@
 
                     b.HasIndex("StoreId");
 
-                    b.ToTable("FileVirtualPath", null, t =>
+                    b.ToTable("FileVirtualPath", t =>
                         {
                             t.HasComment("鏂囦欢铏氭嫙璺緞");
                         });
@@ -606,7 +606,7 @@
 
                     b.HasIndex("ParentId");
 
-                    b.ToTable("Menu", null, t =>
+                    b.ToTable("Menu", t =>
                         {
                             t.HasComment("鑿滃崟");
                         });
@@ -618,10 +618,19 @@
                         .ValueGeneratedOnAdd()
                         .HasColumnType("uniqueidentifier");
 
+                    b.Property<string>("ActionName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("濮旀墭鍚嶇О");
+
                     b.Property<string>("Code")
                         .IsRequired()
                         .HasColumnType("nvarchar(max)")
                         .HasComment("缂栧彿");
+
+                    b.Property<int>("Controller")
+                        .HasColumnType("int")
+                        .HasComment("鎺у埗鍣�");
 
                     b.Property<DateTimeOffset>("CreatedTime")
                         .HasColumnType("datetimeoffset");
@@ -647,10 +656,20 @@
                         .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()
@@ -661,11 +680,6 @@
                         .IsRequired()
                         .HasColumnType("nvarchar(max)")
                         .HasComment("璺敱");
-
-                    b.Property<string>("Service")
-                        .IsRequired()
-                        .HasColumnType("nvarchar(max)")
-                        .HasComment("寰湇鍔�");
 
                     b.Property<int>("Sort")
                         .HasColumnType("int")
@@ -684,7 +698,7 @@
 
                     b.HasKey("Id");
 
-                    b.ToTable("Resource", null, t =>
+                    b.ToTable("Resource", t =>
                         {
                             t.HasComment("璧勬簮");
                         });
@@ -742,7 +756,7 @@
 
                     b.HasKey("Id");
 
-                    b.ToTable("Role", null, t =>
+                    b.ToTable("Role", t =>
                         {
                             t.HasComment("瑙掕壊");
                         });
@@ -794,7 +808,7 @@
 
                     b.HasIndex("RoleId");
 
-                    b.ToTable("RoleMenu", null, t =>
+                    b.ToTable("RoleMenu", t =>
                         {
                             t.HasComment("瑙掕壊鑿滃崟");
                         });
@@ -850,7 +864,7 @@
 
                     b.HasIndex("RoleId");
 
-                    b.ToTable("RoleResource", null, t =>
+                    b.ToTable("RoleResource", t =>
                         {
                             t.HasComment("瑙掕壊璧勬簮");
                         });
@@ -943,7 +957,7 @@
 
                     b.HasIndex("EnterpriseId");
 
-                    b.ToTable("TaskInfo", null, t =>
+                    b.ToTable("TaskInfo", t =>
                         {
                             t.HasComment("浠诲姟淇℃伅");
                         });
@@ -998,7 +1012,7 @@
 
                     b.HasIndex("BenefitId1");
 
-                    b.ToTable("TaskInfoBenefit", null, t =>
+                    b.ToTable("TaskInfoBenefit", t =>
                         {
                             t.HasComment("浠诲姟绂忓埄");
                         });
@@ -1050,7 +1064,7 @@
 
                     b.HasIndex("TypeId");
 
-                    b.ToTable("TaskInfoCredentialLimit", (string)null);
+                    b.ToTable("TaskInfoCredentialLimit");
                 });
 
             modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
@@ -1115,7 +1129,7 @@
 
                     b.HasIndex("UserInfoId");
 
-                    b.ToTable("TaskInfoUser", null, t =>
+                    b.ToTable("TaskInfoUser", t =>
                         {
                             t.HasComment("浠诲姟鐢ㄦ埛淇℃伅");
                         });
@@ -1221,7 +1235,7 @@
 
                     b.HasIndex("IdentityImgId");
 
-                    b.ToTable("UserAuth", null, t =>
+                    b.ToTable("UserAuth", t =>
                         {
                             t.HasComment("鐢ㄦ埛");
                         });
@@ -1342,7 +1356,7 @@
 
                     b.HasIndex("UserAuthId");
 
-                    b.ToTable("UserInfo", null, t =>
+                    b.ToTable("UserInfo", t =>
                         {
                             t.HasComment("鐢ㄦ埛淇℃伅");
                         });
@@ -1418,7 +1432,7 @@
 
                     b.HasIndex("UserInfoId");
 
-                    b.ToTable("UserInfoBankCard", null, t =>
+                    b.ToTable("UserInfoBankCard", t =>
                         {
                             t.HasComment("鐢ㄦ埛閾惰鍗′俊鎭�");
                         });
@@ -1504,7 +1518,7 @@
 
                     b.HasIndex("UserInfoId");
 
-                    b.ToTable("UserInfoCredential", null, t =>
+                    b.ToTable("UserInfoCredential", t =>
                         {
                             t.HasComment("鐢ㄦ埛淇℃伅璧勬牸璇佷功");
                         });
@@ -1556,7 +1570,7 @@
 
                     b.HasIndex("UserInfoId");
 
-                    b.ToTable("UserInfoDepartment", null, t =>
+                    b.ToTable("UserInfoDepartment", t =>
                         {
                             t.HasComment("鐢ㄦ埛淇℃伅閮ㄩ棬");
                         });
@@ -1608,7 +1622,7 @@
 
                     b.HasIndex("UserInfoId");
 
-                    b.ToTable("UserInfoExpectJob", null, t =>
+                    b.ToTable("UserInfoExpectJob", t =>
                         {
                             t.HasComment("鐢ㄦ埛淇℃伅鏈熸湜宀椾綅");
                         });
@@ -1660,7 +1674,7 @@
 
                     b.HasIndex("UserInfoId");
 
-                    b.ToTable("UserInfoPhoto", null, t =>
+                    b.ToTable("UserInfoPhoto", t =>
                         {
                             t.HasComment("鐢ㄦ埛淇℃伅鐢熸椿鐓�");
                         });
@@ -1712,7 +1726,7 @@
 
                     b.HasIndex("UserInfoId");
 
-                    b.ToTable("UserInfoRole", null, t =>
+                    b.ToTable("UserInfoRole", t =>
                         {
                             t.HasComment("鐢ㄦ埛淇℃伅瑙掕壊");
                         });
@@ -1727,7 +1741,7 @@
                         .IsRequired();
 
                     b.HasOne("FlexJobApi.Core.Department", "Parent")
-                        .WithMany("Childrens")
+                        .WithMany("Children")
                         .HasForeignKey("ParentId");
 
                     b.Navigation("Enterprise");
@@ -1744,7 +1758,7 @@
                         .IsRequired();
 
                     b.HasOne("FlexJobApi.Core.DictionaryData", "Parent")
-                        .WithMany("Childrens")
+                        .WithMany("Children")
                         .HasForeignKey("ParentId");
 
                     b.Navigation("Category");
@@ -1787,7 +1801,7 @@
             modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
                 {
                     b.HasOne("FlexJobApi.Core.Menu", "Parent")
-                        .WithMany("Childrens")
+                        .WithMany("Children")
                         .HasForeignKey("ParentId");
 
                     b.Navigation("Parent");
@@ -2087,12 +2101,12 @@
 
             modelBuilder.Entity("FlexJobApi.Core.Department", b =>
                 {
-                    b.Navigation("Childrens");
+                    b.Navigation("Children");
                 });
 
             modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
                 {
-                    b.Navigation("Childrens");
+                    b.Navigation("Children");
                 });
 
             modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
@@ -2104,7 +2118,7 @@
 
             modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
                 {
-                    b.Navigation("Childrens");
+                    b.Navigation("Children");
                 });
 
             modelBuilder.Entity("FlexJobApi.Core.Role", b =>
diff --git a/FlexJobApi.User.Application/Auths/AuthAppService.cs b/FlexJobApi.User.Application/Auths/AuthAppService.cs
index 5eccb25..901ac1b 100644
--- a/FlexJobApi.User.Application/Auths/AuthAppService.cs
+++ b/FlexJobApi.User.Application/Auths/AuthAppService.cs
@@ -1,42 +1,41 @@
-锘縰sing FlexJobApi.Core;
-using Furion.DynamicApiController;
-using Furion.FriendlyException;
-using Furion.SpecificationDocument;
-using MediatR;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
+锘�//using FlexJobApi.Core;
+//using Furion.DynamicApiController;
+//using Furion.FriendlyException;
+//using MediatR;
+//using Microsoft.AspNetCore.Authorization;
+//using Microsoft.AspNetCore.Mvc;
 
-namespace FlexJobApi.User.Application
-{
-    /// <summary>
-    /// 璁よ瘉
-    /// </summary>
-    [Route("api/user/[controller]")]
-    public class AuthAppService(IMediator mediator) : IDynamicApiController
-    {
-        private readonly IMediator mediator = mediator;
+//namespace FlexJobApi.User.Application
+//{
+//    /// <summary>
+//    /// 璁よ瘉
+//    /// </summary>
+//    [Route("api/user/[controller]")]
+//    public class AuthAppService(IMediator mediator) : IDynamicApiController
+//    {
+//        private readonly IMediator mediator = mediator;
 
-        /// <summary>
-        /// 鑾峰彇闃块噷浜慜SS鎺堟潈淇℃伅
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        [AllowAnonymous]
-        public Task<GetAliyunOSSAcsQueryResult> GetAliyunOSSAcs(GetAliyunOSSAcsQuery query)
-        {
-            return mediator.Send(query);
-        }
+//        /// <summary>
+//        /// 鑾峰彇闃块噷浜慜SS鎺堟潈淇℃伅
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        [AllowAnonymous]
+//        public Task<GetAliyunOSSAcsQueryResult> GetAliyunOSSAcs(GetAliyunOSSAcsQuery query)
+//        {
+//            return mediator.Send(query);
+//        }
 
-        /// <summary>
-        /// 瀵嗙爜鐧诲綍
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        [AllowAnonymous]
-        [IfException(ErrorCode = EnumUserErrorCodeType.u1000)]
-        public Task<PasswordLoginCommandCallback> PasswordLogin(PasswordLoginCommand command)
-        {
-            return mediator.Send(command);
-        }
-    }
-}
+//        /// <summary>
+//        /// 瀵嗙爜鐧诲綍
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        [AllowAnonymous]
+//        [IfException(ErrorCode = EnumUserErrorCodeType.u1000)]
+//        public Task<PasswordLoginCommandCallback> PasswordLogin(PasswordLoginCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
+//    }
+//}
diff --git a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
index aca41b0..c3be773 100644
--- a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
+++ b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
@@ -4,30 +4,6 @@
         <name>FlexJobApi.User.Application</name>
     </assembly>
     <members>
-        <member name="T:FlexJobApi.User.Application.AuthAppService">
-            <summary>
-            璁よ瘉
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.AuthAppService.#ctor(MediatR.IMediator)">
-            <summary>
-            璁よ瘉
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.AuthAppService.GetAliyunOSSAcs(FlexJobApi.Core.GetAliyunOSSAcsQuery)">
-            <summary>
-            鑾峰彇闃块噷浜慜SS鎺堟潈淇℃伅
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.AuthAppService.PasswordLogin(FlexJobApi.Core.PasswordLoginCommand)">
-            <summary>
-            瀵嗙爜鐧诲綍
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
-        </member>
         <member name="T:FlexJobApi.User.Application.PasswordLoginCommandHandler">
             <summary>
             瀵嗙爜鐧诲綍
@@ -181,65 +157,6 @@
         <member name="M:FlexJobApi.User.Application.SetMenuSwitchCommandHandler.Handle(FlexJobApi.Core.SetMenuSwitchCommand,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
-        <member name="T:FlexJobApi.User.Application.MenuAppService">
-            <summary>
-            鑿滃崟
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.#ctor(MediatR.IMediator)">
-            <summary>
-            鑿滃崟
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.GetMenus(FlexJobApi.Core.GetMenusQuery)">
-            <summary>
-            鏌ヨ鑿滃崟鍒楄〃
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.GetMenu(FlexJobApi.Core.Models.GetMenuQuery)">
-            <summary>
-            鏌ヨ鑿滃崟璇︽儏
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.SaveMenu(FlexJobApi.Core.SaveMenuCommand)">
-            <summary>
-            淇濆瓨鑿滃崟
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.SaveMenuButton(FlexJobApi.Core.SaveMenuButtonCommand)">
-            <summary>
-            淇濆瓨鑿滃崟鎸夐挳
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.SaveMenuField(FlexJobApi.Core.SaveMenuFieldCommand)">
-            <summary>
-            淇濆瓨鑿滃崟瀛楁
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.SetMenuSwitch(FlexJobApi.Core.SetMenuSwitchCommand)">
-            <summary>
-            璁剧疆鑿滃崟鍒囨崲淇℃伅
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.DeleteMenu(FlexJobApi.Core.DeleteMenuCommand)">
-            <summary>
-            鍒犻櫎鑿滃崟
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
-        </member>
         <member name="T:FlexJobApi.User.Application.Menus.Queries.GetMenuQueryHandler">
             <summary>
             鏌ヨ鑿滃崟璇︽儏
@@ -252,7 +169,7 @@
             </summary>
             <param name="rep"></param>
         </member>
-        <member name="M:FlexJobApi.User.Application.Menus.Queries.GetMenuQueryHandler.Handle(FlexJobApi.Core.Models.GetMenuQuery,System.Threading.CancellationToken)">
+        <member name="M:FlexJobApi.User.Application.Menus.Queries.GetMenuQueryHandler.Handle(FlexJobApi.Core.GetMenuQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
         <member name="T:FlexJobApi.User.Application.GetMenusQueryHandler">
@@ -301,30 +218,6 @@
         </member>
         <member name="M:FlexJobApi.User.Application.GetResourcesQueryHandler.Handle(FlexJobApi.Core.GetResourcesQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
-        </member>
-        <member name="T:FlexJobApi.User.Application.ResourceAppService">
-            <summary>
-            璧勬簮
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.ResourceAppService.#ctor(MediatR.IMediator)">
-            <summary>
-            璧勬簮
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.ResourceAppService.GetResources(FlexJobApi.Core.GetResourcesQuery)">
-            <summary>
-            鑾峰彇璧勬簮鍒楄〃
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.ResourceAppService.GetResourceFields(FlexJobApi.Core.GetResourceFieldsQuery)">
-            <summary>
-            鑾峰彇璧勬簮瀛楁
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
         </member>
         <member name="T:FlexJobApi.User.Application.DeleteRoleCommandHandler">
             <summary>
@@ -379,44 +272,6 @@
         </member>
         <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.Handle(FlexJobApi.Core.GetRolesQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
-        </member>
-        <member name="T:FlexJobApi.User.Application.RoleAppService">
-            <summary>
-            瑙掕壊
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.RoleAppService.#ctor(MediatR.IMediator)">
-            <summary>
-            瑙掕壊
-            </summary>
-        </member>
-        <member name="M:FlexJobApi.User.Application.RoleAppService.GetRoles(FlexJobApi.Core.GetRolesQuery)">
-            <summary>
-            鏌ヨ瑙掕壊鍒楄〃
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.RoleAppService.GetRole(FlexJobApi.Core.GetRoleQuery)">
-            <summary>
-            鏌ヨ瑙掕壊璇︽儏
-            </summary>
-            <param name="query"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.RoleAppService.DeleteRole(FlexJobApi.Core.DeleteRoleCommand)">
-            <summary>
-            鍒犻櫎瑙掕壊
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
-        </member>
-        <member name="M:FlexJobApi.User.Application.RoleAppService.SaveRole(FlexJobApi.Core.SaveRoleCommand)">
-            <summary>
-            淇濆瓨瑙掕壊
-            </summary>
-            <param name="command"></param>
-            <returns></returns>
         </member>
     </members>
 </doc>
diff --git a/FlexJobApi.User.Application/Menus/MenuAppService.cs b/FlexJobApi.User.Application/Menus/MenuAppService.cs
index e58bdc2..7414f82 100644
--- a/FlexJobApi.User.Application/Menus/MenuAppService.cs
+++ b/FlexJobApi.User.Application/Menus/MenuAppService.cs
@@ -1,100 +1,100 @@
-锘縰sing FlexJobApi.Core;
-using FlexJobApi.Core.Models;
-using Furion.DynamicApiController;
-using MediatR;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+锘�//using FlexJobApi.Core;
+//using FlexJobApi.Core.Models;
+//using Furion.DynamicApiController;
+//using MediatR;
+//using Microsoft.AspNetCore.Mvc;
+//using System;
+//using System.Collections.Generic;
+//using System.Linq;
+//using System.Text;
+//using System.Threading.Tasks;
 
-namespace FlexJobApi.User.Application
-{
-    /// <summary>
-    /// 鑿滃崟
-    /// </summary>
-    [Route("api/user/[controller]")]
-    public class MenuAppService(IMediator mediator) : IDynamicApiController
-    {
-        private readonly IMediator mediator = mediator;
+//namespace FlexJobApi.User.Application
+//{
+//    /// <summary>
+//    /// 鑿滃崟
+//    /// </summary>
+//    [Route("api/user/[controller]")]
+//    public class MenuAppService(IMediator mediator) : IDynamicApiController
+//    {
+//        private readonly IMediator mediator = mediator;
 
-        #region 鏌ヨ
+//        #region 鏌ヨ
 
-        /// <summary>
-        /// 鏌ヨ鑿滃崟鍒楄〃
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        public Task<List<GetMenusQueryResultItem>> GetMenus(GetMenusQuery query)
-        {
-            return mediator.Send(query);
-        }
+//        /// <summary>
+//        /// 鏌ヨ鑿滃崟鍒楄〃
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        public Task<List<GetMenusQueryResultItem>> GetMenus(GetMenusQuery query)
+//        {
+//            return mediator.Send(query);
+//        }
 
-        /// <summary>
-        /// 鏌ヨ鑿滃崟璇︽儏
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        public Task<GetMenuQueryResult> GetMenu(GetMenuQuery query)
-        {
-            return mediator.Send(query);
-        }
+//        /// <summary>
+//        /// 鏌ヨ鑿滃崟璇︽儏
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        public Task<GetMenuQueryResult> GetMenu(GetMenuQuery query)
+//        {
+//            return mediator.Send(query);
+//        }
 
-        #endregion
+//        #endregion
 
-        #region 鍐欏叆
+//        #region 鍐欏叆
 
-        /// <summary>
-        /// 淇濆瓨鑿滃崟
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        public Task<Guid> SaveMenu(SaveMenuCommand command)
-        {
-            return mediator.Send(command);
-        }
+//        /// <summary>
+//        /// 淇濆瓨鑿滃崟
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        public Task<Guid> SaveMenu(SaveMenuCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
 
-        /// <summary>
-        /// 淇濆瓨鑿滃崟鎸夐挳
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        public Task<Guid> SaveMenuButton(SaveMenuButtonCommand command)
-        {
-            return mediator.Send(command);
-        }
+//        /// <summary>
+//        /// 淇濆瓨鑿滃崟鎸夐挳
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        public Task<Guid> SaveMenuButton(SaveMenuButtonCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
 
-        /// <summary>
-        /// 淇濆瓨鑿滃崟瀛楁
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        public Task<Guid> SaveMenuField(SaveMenuFieldCommand command)
-        {
-            return mediator.Send(command);
-        }
+//        /// <summary>
+//        /// 淇濆瓨鑿滃崟瀛楁
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        public Task<Guid> SaveMenuField(SaveMenuFieldCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
 
-        /// <summary>
-        /// 璁剧疆鑿滃崟鍒囨崲淇℃伅
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        public Task<int> SetMenuSwitch(SetMenuSwitchCommand command)
-        {
-            return mediator.Send(command);
-        }
+//        /// <summary>
+//        /// 璁剧疆鑿滃崟鍒囨崲淇℃伅
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        public Task<int> SetMenuSwitch(SetMenuSwitchCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
 
-        /// <summary>
-        /// 鍒犻櫎鑿滃崟
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        public Task<int> DeleteMenu(DeleteMenuCommand command)
-        {
-            return mediator.Send(command);
-        }
+//        /// <summary>
+//        /// 鍒犻櫎鑿滃崟
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        public Task<int> DeleteMenu(DeleteMenuCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
 
-        #endregion
-    }
-}
+//        #endregion
+//    }
+//}
diff --git a/FlexJobApi.User.Application/Menus/Queries/GetMenuQueryHandler.cs b/FlexJobApi.User.Application/Menus/Queries/GetMenuQueryHandler.cs
index 6763485..90b739b 100644
--- a/FlexJobApi.User.Application/Menus/Queries/GetMenuQueryHandler.cs
+++ b/FlexJobApi.User.Application/Menus/Queries/GetMenuQueryHandler.cs
@@ -1,5 +1,4 @@
 锘縰sing FlexJobApi.Core;
-using FlexJobApi.Core.Models;
 using Furion.DatabaseAccessor;
 using Furion.FriendlyException;
 using Mapster;
diff --git a/FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs b/FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs
index 09ea343..c19d457 100644
--- a/FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs
+++ b/FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs
@@ -1,5 +1,4 @@
 锘縰sing FlexJobApi.Core;
-using FlexJobApi.Core.Models;
 using Furion.DatabaseAccessor;
 using Mapster;
 using MediatR;
diff --git a/FlexJobApi.User.Application/Resources/Queries/GetResourcesQueryHandler.cs b/FlexJobApi.User.Application/Resources/Queries/GetResourcesQueryHandler.cs
index 16916ad..a18b631 100644
--- a/FlexJobApi.User.Application/Resources/Queries/GetResourcesQueryHandler.cs
+++ b/FlexJobApi.User.Application/Resources/Queries/GetResourcesQueryHandler.cs
@@ -27,8 +27,6 @@
             var q = rep.AsQueryable().AsNoTracking()
                 .OrderBy(it => it.Route)
                 .Where(it => !it.IsExpired);
-            if (request.Service.IsNotNull())
-                q = q.Where(it => it.Service == request.Service);
             if (request.Method.HasValue)
                 q = q.Where(it => it.Method == request.Method);
             if (request.Keywords.IsNotNull())
diff --git a/FlexJobApi.User.Application/Resources/ResourceAppService.cs b/FlexJobApi.User.Application/Resources/ResourceAppService.cs
index dc6a671..a84d71f 100644
--- a/FlexJobApi.User.Application/Resources/ResourceAppService.cs
+++ b/FlexJobApi.User.Application/Resources/ResourceAppService.cs
@@ -1,36 +1,36 @@
-锘縰sing FlexJobApi.Core;
-using Furion.DynamicApiController;
-using MediatR;
-using Microsoft.AspNetCore.Mvc;
+锘�//using FlexJobApi.Core;
+//using Furion.DynamicApiController;
+//using MediatR;
+//using Microsoft.AspNetCore.Mvc;
 
-namespace FlexJobApi.User.Application
-{
-    /// <summary>
-    /// 璧勬簮
-    /// </summary>
-    [Route("api/user/[controller]")]
-    public class ResourceAppService(IMediator mediator) : IDynamicApiController
-    {
-        private readonly IMediator mediator = mediator;
+//namespace FlexJobApi.User.Application
+//{
+//    /// <summary>
+//    /// 璧勬簮
+//    /// </summary>
+//    [Route("api/user/[controller]")]
+//    public class ResourceAppService(IMediator mediator) : IDynamicApiController
+//    {
+//        private readonly IMediator mediator = mediator;
 
-        /// <summary>
-        /// 鑾峰彇璧勬簮鍒楄〃
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        public Task<List<GetResourcesQueryResultItem>> GetResources(GetResourcesQuery query)
-        {
-            return mediator.Send(query);
-        }
+//        /// <summary>
+//        /// 鑾峰彇璧勬簮鍒楄〃
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        public Task<List<GetResourcesQueryResultItem>> GetResources(GetResourcesQuery query)
+//        {
+//            return mediator.Send(query);
+//        }
 
-        /// <summary>
-        /// 鑾峰彇璧勬簮瀛楁
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        public Task<List<GetResourceFieldsQueryResultItem>> GetResourceFields(GetResourceFieldsQuery query)
-        { 
-            return mediator.Send(query);
-        }
-    }
-}
+//        /// <summary>
+//        /// 鑾峰彇璧勬簮瀛楁
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        public Task<List<GetResourceFieldsQueryResultItem>> GetResourceFields(GetResourceFieldsQuery query)
+//        { 
+//            return mediator.Send(query);
+//        }
+//    }
+//}
diff --git a/FlexJobApi.User.Application/Roles/RoleAppService.cs b/FlexJobApi.User.Application/Roles/RoleAppService.cs
index 0caaf22..61c49b5 100644
--- a/FlexJobApi.User.Application/Roles/RoleAppService.cs
+++ b/FlexJobApi.User.Application/Roles/RoleAppService.cs
@@ -1,72 +1,72 @@
-锘縰sing FlexJobApi.Core;
-using Furion.DynamicApiController;
-using MediatR;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
+锘�//using FlexJobApi.Core;
+//using Furion.DynamicApiController;
+//using MediatR;
+//using Microsoft.AspNetCore.Mvc;
+//using System;
+//using System.Collections.Generic;
+//using System.Linq;
+//using System.Text;
+//using System.Threading.Tasks;
+//using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
 
-namespace FlexJobApi.User.Application
-{
-    /// <summary>
-    /// 瑙掕壊
-    /// </summary>
-    [Route("api/user/[controller]")]
-    public class RoleAppService(IMediator mediator) : IDynamicApiController
-    {
-        private readonly IMediator mediator = mediator;
+//namespace FlexJobApi.User.Application
+//{
+//    /// <summary>
+//    /// 瑙掕壊
+//    /// </summary>
+//    [Route("api/user/[controller]")]
+//    public class RoleAppService(IMediator mediator) : IDynamicApiController
+//    {
+//        private readonly IMediator mediator = mediator;
 
-        #region 鏌ヨ
+//        #region 鏌ヨ
 
-        /// <summary>
-        /// 鏌ヨ瑙掕壊鍒楄〃
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        [HttpPost]
-        public Task<PagedListQueryResult<GetRolesQueryResultItem>> GetRoles([FromBody] GetRolesQuery query)
-        {
-            return mediator.Send(query);
-        }
+//        /// <summary>
+//        /// 鏌ヨ瑙掕壊鍒楄〃
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        [HttpPost]
+//        public Task<PagedListQueryResult<GetRolesQueryResultItem>> GetRoles([FromBody] GetRolesQuery query)
+//        {
+//            return mediator.Send(query);
+//        }
 
-        /// <summary>
-        /// 鏌ヨ瑙掕壊璇︽儏
-        /// </summary>
-        /// <param name="query"></param>
-        /// <returns></returns>
-        public Task<GetRoleQueryResult> GetRole(GetRoleQuery query)
-        {
-            return mediator.Send(query);
-        }
+//        /// <summary>
+//        /// 鏌ヨ瑙掕壊璇︽儏
+//        /// </summary>
+//        /// <param name="query"></param>
+//        /// <returns></returns>
+//        public Task<GetRoleQueryResult> GetRole(GetRoleQuery query)
+//        {
+//            return mediator.Send(query);
+//        }
 
-        #endregion
+//        #endregion
 
-        #region 鍐欏叆
+//        #region 鍐欏叆
 
-        /// <summary>
-        /// 鍒犻櫎瑙掕壊
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        public Task<int> DeleteRole(DeleteRoleCommand command)
-        {
-            return mediator.Send(command);
-        }
+//        /// <summary>
+//        /// 鍒犻櫎瑙掕壊
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        public Task<int> DeleteRole(DeleteRoleCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
 
-        /// <summary>
-        /// 淇濆瓨瑙掕壊
-        /// </summary>
-        /// <param name="command"></param>
-        /// <returns></returns>
-        public Task<Guid> SaveRole(SaveRoleCommand command)
-        {
-            return mediator.Send(command);
-        }
+//        /// <summary>
+//        /// 淇濆瓨瑙掕壊
+//        /// </summary>
+//        /// <param name="command"></param>
+//        /// <returns></returns>
+//        public Task<Guid> SaveRole(SaveRoleCommand command)
+//        {
+//            return mediator.Send(command);
+//        }
 
-        #endregion
+//        #endregion
 
-    }
-}
+//    }
+//}

--
Gitblit v1.9.1