From 1ddd1094f635bdc69e1e236353aa77d5b400f007 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期二, 05 八月 2025 16:46:39 +0800
Subject: [PATCH] feat:用户信息

---
 FlexJobApi.User.Application/FlexJobApi.User.Application.xml                         |   66 +
 FlexJobApi.Core/Models/User/Roles/Queries/GetRoleUserInfosQuery.cs                  |   45 
 FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.cs          |   87 +
 FlexJobApi.User.Application/Roles/Commands/SetRoleUserInfosCommandHandler.cs        |   44 
 FlexJobApi.Core/Models/User/UserInfos/Queries/GetUserInfoRolesQuery.cs              |   53 
 FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs   |   35 
 FlexJobApi.Core/Enums/Common/EnumUserInfoStatus.cs                                  |   27 
 FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoRolesCommand.cs           |   31 
 FlexJobApi.Core/Models/User/Roles/Commands/SetRoleUserInfosCommand.cs               |   31 
 FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.Designer.cs | 2178 ++++++++++++++++++++++++++++++++++++++++
 FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs                          |    5 
 FlexJobApi.User.Application/Roles/Queries/GetRoleUserInfosQueryHandler.cs           |   59 +
 FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs         |   87 +
 FlexJobApi.Core/Entities/Users/UserInfo.cs                                          |   10 
 FlexJobApi.Core/Entities/Users/Role.cs                                              |    6 
 FlexJobApi.User.Application/Auths/Queries/GetCurrentLogierMenusQueryHandler.cs      |   64 +
 FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs  |   60 +
 FlexJobApi.User.Application/UserInfos/Queries/GetUserInfoRolesQueryHandler.cs       |   58 +
 FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs                   |   31 
 FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoStatusCommand.cs          |   31 
 FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs                   |    2 
 FlexJobApi.Core/FlexJobApi.Core.xml                                                 |  155 ++
 FlexJobApi.Core/Enums/Common/EnumResourceController.cs                              |    7 
 FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs          |   19 
 24 files changed, 3,177 insertions(+), 14 deletions(-)

diff --git a/FlexJobApi.Core/Entities/Users/Role.cs b/FlexJobApi.Core/Entities/Users/Role.cs
index 54ac0a2..c7ba6ce 100644
--- a/FlexJobApi.Core/Entities/Users/Role.cs
+++ b/FlexJobApi.Core/Entities/Users/Role.cs
@@ -16,6 +16,7 @@
         {
             RoleMenus = [];
             RoleResources = [];
+            UserInfoRoles = [];
         }
 
         /// <summary>
@@ -59,5 +60,10 @@
         /// 瑙掕壊鎺ュ彛
         /// </summary>
         public List<RoleResource> RoleResources { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛瑙掕壊
+        /// </summary>
+        public List<UserInfoRole> UserInfoRoles { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Entities/Users/UserInfo.cs b/FlexJobApi.Core/Entities/Users/UserInfo.cs
index b413c16..2869593 100644
--- a/FlexJobApi.Core/Entities/Users/UserInfo.cs
+++ b/FlexJobApi.Core/Entities/Users/UserInfo.cs
@@ -138,6 +138,16 @@
         /// </summary>
         public int? Weight { get; set; }
 
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        public EnumUserInfoStatus Status { get; set; }
+
         public IEnumerable<UserInfo> HasData(DbContext dbContext, Type dbContextLocator)
         {
             return new List<UserInfo>
diff --git a/FlexJobApi.Core/Enums/Common/EnumResourceController.cs b/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
index b3968dc..333c7e7 100644
--- a/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
+++ b/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
@@ -35,6 +35,11 @@
         /// 鐢ㄦ埛瑙掕壊
         /// </summary>
         [ResourceController(Service = EnumResourceService.User)]
-        Role
+        Role,
+        /// <summary>
+        /// 鐢ㄦ埛淇℃伅
+        /// </summary>
+        [ResourceController(Service = EnumResourceService.User)]
+        UserInfo
     }
 }
diff --git a/FlexJobApi.Core/Enums/Common/EnumUserInfoStatus.cs b/FlexJobApi.Core/Enums/Common/EnumUserInfoStatus.cs
new file mode 100644
index 0000000..a72e7f9
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Common/EnumUserInfoStatus.cs
@@ -0,0 +1,27 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鐢ㄦ埛淇℃伅鐘舵��
+    /// </summary>
+    public enum EnumUserInfoStatus
+    {
+        /// <summary>
+        /// 姝e父
+        /// </summary>
+        Normal = 10,
+        /// <summary>
+        /// 鍐荤粨
+        /// </summary>
+        Freeze = 20,
+        /// <summary>
+        /// 绂佺敤
+        /// </summary>
+        Disabled = 100,
+    }
+}
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 4d7b06a..eb35731 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -974,6 +974,11 @@
             瑙掕壊鎺ュ彛
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.Role.UserInfoRoles">
+            <summary>
+            鐢ㄦ埛瑙掕壊
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.RoleMenu">
             <summary>
             瑙掕壊鑿滃崟
@@ -1242,6 +1247,16 @@
         <member name="P:FlexJobApi.Core.UserInfo.Weight">
             <summary>
             浣撻噸
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.UserInfo.Remark">
+            <summary>
+            澶囨敞
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.UserInfo.Status">
+            <summary>
+            鐘舵��
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.UserInfoBankCard">
@@ -1614,6 +1629,11 @@
             鐢ㄦ埛瑙掕壊
             </summary>
         </member>
+        <member name="F:FlexJobApi.Core.EnumResourceController.UserInfo">
+            <summary>
+            鐢ㄦ埛淇℃伅
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.EnumResourceMethod">
             <summary>
             璧勬簮璇锋眰鏂瑰紡
@@ -1662,6 +1682,26 @@
         <member name="F:FlexJobApi.Core.EnumSmsAccess.AliyunSms">
             <summary>
             闃块噷浜戠煭淇�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.EnumUserInfoStatus">
+            <summary>
+            鐢ㄦ埛淇℃伅鐘舵��
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumUserInfoStatus.Normal">
+            <summary>
+            姝e父
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumUserInfoStatus.Freeze">
+            <summary>
+            鍐荤粨
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumUserInfoStatus.Disabled">
+            <summary>
+            绂佺敤
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.EnumBillingMethod">
@@ -2924,6 +2964,21 @@
             璧勬簮
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.SetRoleUserCommand">
+            <summary>
+            璁剧疆瑙掕壊鐢ㄦ埛
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SetRoleUserCommand.RoleId">
+            <summary>
+            瑙掕壊Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SetRoleUserCommand.UserInfoIds">
+            <summary>
+            鐢ㄦ埛Id
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.GetRoleQuery">
             <summary>
             鏌ヨ瑙掕壊璇︽儏
@@ -3049,11 +3104,111 @@
             鏁版嵁鏉冮檺
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetRolesQueryResultItem.UserCount">
+            <summary>
+            鐢ㄦ埛鏁伴噺
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.GetRolesQueryResultItem.Remark">
             <summary>
             澶囨敞
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.GetRoleUsersQuery">
+            <summary>
+            鏌ヨ瑙掕壊鐢ㄦ埛鍒楄〃
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetRoleUsersQuery.RoleId">
+            <summary>
+            瑙掕壊Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetRoleUsersQueryResultItem.Id">
+            <summary>
+            Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetRoleUsersQueryResultItem.Name">
+            <summary>
+            濮撳悕
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetRoleUsersQueryResultItem.UserName">
+            <summary>
+            鐢ㄦ埛鍚�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetRoleUsersQueryResultItem.IsChecked">
+            <summary>
+            鏄惁閫変腑
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetOperationUserInfosQuery">
+            <summary>
+            鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetOperationUserInfosQueryResultItem">
+            <summary>
+            鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹�-缁撴灉-椤�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItem.Id">
+            <summary>
+            Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItem.Name">
+            <summary>
+            濮撳悕
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItem.UserName">
+            <summary>
+            鐢ㄦ埛鍚�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItem.PhoneNumber">
+            <summary>
+            鎵嬫満鍙�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItem.Remark">
+            <summary>
+            澶囨敞
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItem.Roles">
+            <summary>
+            瑙掕壊
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItem.Status">
+            <summary>
+            鐘舵��
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetOperationUserInfosQueryResultItemRole">
+            <summary>
+            鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹�-缁撴灉-椤�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItemRole.UserInfoId">
+            <summary>
+            鐢ㄦ埛Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItemRole.Id">
+            <summary>
+            瑙掕壊Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetOperationUserInfosQueryResultItemRole.Name">
+            <summary>
+            鍚嶇О
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.AliyunOptions">
             <summary>
             闃块噷浜戦厤缃�
diff --git a/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs b/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs
index 6a103ca..9eeef3a 100644
--- a/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs
+++ b/FlexJobApi.Core/Models/User/Auths/Queries/GetAliyunOSSAcsQuery.cs
@@ -10,7 +10,7 @@
     /// <summary>
     /// 鑾峰彇闃块噷浜慜SS鎺堟潈淇℃伅
     /// </summary>
-    [Resource([EnumResourceController.Auth])]
+    [Resource([EnumResourceController.Auth], AllowAnonymous = true)]
     public class GetAliyunOSSAcsQuery : IRequest<GetAliyunOSSAcsQueryResult>
     {
     }
diff --git a/FlexJobApi.Core/Models/User/Roles/Commands/SetRoleUserInfosCommand.cs b/FlexJobApi.Core/Models/User/Roles/Commands/SetRoleUserInfosCommand.cs
new file mode 100644
index 0000000..0619df5
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/Roles/Commands/SetRoleUserInfosCommand.cs
@@ -0,0 +1,31 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 璁剧疆瑙掕壊鐢ㄦ埛
+    /// </summary>
+    [Resource([EnumResourceController.Role])]
+    public class SetRoleUserInfosCommand : IRequest<int>
+    {
+        public SetRoleUserInfosCommand()
+        {
+            UserInfoIds = [];
+        }
+
+        /// <summary>
+        /// 瑙掕壊Id
+        /// </summary>
+        public Guid RoleId { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        public List<Guid> UserInfoIds { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/User/Roles/Queries/GetRoleUserInfosQuery.cs b/FlexJobApi.Core/Models/User/Roles/Queries/GetRoleUserInfosQuery.cs
new file mode 100644
index 0000000..528cff6
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/Roles/Queries/GetRoleUserInfosQuery.cs
@@ -0,0 +1,45 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏌ヨ瑙掕壊鐢ㄦ埛鍒楄〃
+    /// </summary>
+    [Resource([EnumResourceController.Role])]
+    public class GetRoleUserInfosQuery : IRequest<List<GetRoleUserInfosQueryResultItem>>
+    {
+        /// <summary>
+        /// 瑙掕壊Id
+        /// </summary>
+        public Guid RoleId { get; set; }
+    }
+
+    public class GetRoleUserInfosQueryResultItem
+    {
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 濮撳悕
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛鍚�
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 鏄惁閫変腑
+        /// </summary>
+        public bool IsChecked { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
index 4eebf5e..4ade891 100644
--- a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
+++ b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs
@@ -61,6 +61,11 @@
         public EnumRoleWebApiDataPower DataPower { get; set; }
 
         /// <summary>
+        /// 鐢ㄦ埛鏁伴噺
+        /// </summary>
+        public int UserCount { get; set; }
+
+        /// <summary>
         /// 澶囨敞
         /// </summary>
         public string Remark { get; set; }
diff --git a/FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoRolesCommand.cs b/FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoRolesCommand.cs
new file mode 100644
index 0000000..e695467
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoRolesCommand.cs
@@ -0,0 +1,31 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 璁剧疆鐢ㄦ埛淇℃伅瑙掕壊
+    /// </summary>
+    [Resource([EnumResourceController.UserInfo])]
+    public class SetUserInfoRolesCommand : IRequest<int>
+    {
+        public SetUserInfoRolesCommand()
+        {
+            RoleIds = [];
+        }
+
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        public Guid UserInfoId { get; set; }
+
+        /// <summary>
+        /// 瑙掕壊Id
+        /// </summary>
+        public List<Guid> RoleIds { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoStatusCommand.cs b/FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoStatusCommand.cs
new file mode 100644
index 0000000..2a4a822
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/UserInfos/Commands/SetUserInfoStatusCommand.cs
@@ -0,0 +1,31 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 璁剧疆鐢ㄦ埛淇℃伅鐘舵��
+    /// </summary>
+    [Resource([EnumResourceController.UserInfo])]
+    public class SetUserInfoStatusCommand : IRequest<int>
+    {
+        public SetUserInfoStatusCommand()
+        {
+            Ids = [];
+        }
+
+        /// <summary>
+        /// Id
+        /// </summary>
+        public List<Guid> Ids { get; set; }
+
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        public EnumUserInfoStatus Status { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs
new file mode 100644
index 0000000..bc00d81
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs
@@ -0,0 +1,87 @@
+锘縰sing MediatR;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹�
+    /// </summary>
+    [Resource([EnumResourceController.UserInfo])]
+    public class GetOperationUserInfosQuery : PagedListQuery<PagedListQueryResult<GetOperationUserInfosQueryResultItem>, GetOperationUserInfosQueryResultItem>, IRequest<PagedListQueryResult<GetOperationUserInfosQueryResultItem>>
+    {
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹�-缁撴灉-椤�
+    /// </summary>
+    public class GetOperationUserInfosQueryResultItem
+    {
+        public GetOperationUserInfosQueryResultItem()
+        {
+            Roles = [];
+        }
+
+        /// <summary>
+        /// Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 濮撳悕
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛鍚�
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 鎵嬫満鍙�
+        /// </summary>
+        public string PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 瑙掕壊
+        /// </summary>
+        public List<GetOperationUserInfosQueryResultItemRole> Roles { get; set; }
+
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        public EnumUserInfoStatus Status { get; set; }
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹�-缁撴灉-椤�
+    /// </summary>
+    public class GetOperationUserInfosQueryResultItemRole
+    {
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        [JsonIgnore]
+        public Guid UserInfoId { get; set; }
+
+        /// <summary>
+        /// 瑙掕壊Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/User/UserInfos/Queries/GetUserInfoRolesQuery.cs b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetUserInfoRolesQuery.cs
new file mode 100644
index 0000000..0129d0f
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetUserInfoRolesQuery.cs
@@ -0,0 +1,53 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏌ヨ鐢ㄦ埛瑙掕壊鍒楄〃
+    /// </summary>
+    [Resource([EnumResourceController.UserInfo])]
+    public class GetUserInfoRolesQuery : IRequest<List<GetUserInfoRolesQueryResultItem>>
+    {
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        public Guid UserInfoId { get; set; }
+
+        /// <summary>
+        /// 瀹㈡埛绔被鍨�
+        /// </summary>
+        public EnumClientType ClientType { get; set; }
+    }
+
+
+    /// <summary>
+    /// 鏌ヨ鐢ㄦ埛瑙掕壊鍒楄〃
+    /// </summary>
+    public class GetUserInfoRolesQueryResultItem
+    {
+        /// <summary>
+        /// 瑙掕壊Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 鏄惁閫変腑
+        /// </summary>
+        public bool IsChecked { get; set; }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.Designer.cs b/FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.Designer.cs
new file mode 100644
index 0000000..05e4505
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.Designer.cs
@@ -0,0 +1,2178 @@
+锘�// <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("20250805082824_UpdateUser0805")]
+    partial class UpdateUser0805
+    {
+        /// <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<int>("DataPower")
+                        .HasColumnType("int")
+                        .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<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<int>("UserType")
+                        .HasColumnType("int")
+                        .HasComment("鐢ㄦ埛绫诲瀷");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Role", t =>
+                        {
+                            t.HasComment("瑙掕壊");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("MenuId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鑿滃崟Id");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瑙掕壊Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("MenuId");
+
+                    b.HasIndex("RoleId");
+
+                    b.ToTable("RoleMenu", t =>
+                        {
+                            t.HasComment("瑙掕壊鑿滃崟");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleResource", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<int>("DataPower")
+                        .HasColumnType("int")
+                        .HasComment("鏁版嵁鏉冮檺");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("ResourceId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璧勬簮Id");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瑙掕壊Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ResourceId");
+
+                    b.HasIndex("RoleId");
+
+                    b.ToTable("RoleResource", t =>
+                        {
+                            t.HasComment("瑙掕壊璧勬簮");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Address")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("浠诲姟鍦扮偣璇︾粏鍦板潃");
+
+                    b.Property<int>("AgeMaxLimit")
+                        .HasColumnType("int")
+                        .HasComment("骞撮緞鑼冨洿澶�");
+
+                    b.Property<int>("AgeMinLimit")
+                        .HasColumnType("int")
+                        .HasComment("骞撮緞鑼冨洿鏈�灏�");
+
+                    b.Property<DateTime>("BeginTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("浠诲姟寮�濮嬫椂闂�");
+
+                    b.Property<int>("BillingMethod")
+                        .HasColumnType("int")
+                        .HasComment("璁¤垂鏂瑰紡");
+
+                    b.Property<Guid>("CityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟鍦扮偣鎵�灞炲尯鍩烮d");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<DateTime>("EndTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("浠诲姟缁撴潫鏃堕棿");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浼佷笟Id");
+
+                    b.Property<int>("GenderLimit")
+                        .HasColumnType("int")
+                        .HasComment("鎬у埆瑕佹眰");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("浠诲姟鍚嶇О");
+
+                    b.Property<decimal>("ServiceFee")
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("鏈嶅姟璐�");
+
+                    b.Property<int>("SettlementCycle")
+                        .HasColumnType("int")
+                        .HasComment("缁撶畻鏂瑰紡");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CityId");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.ToTable("TaskInfo", t =>
+                        {
+                            t.HasComment("浠诲姟淇℃伅");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("BenefitId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("绂忓埄Id");
+
+                    b.Property<Guid>("BenefitId1")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟Id");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("BenefitId");
+
+                    b.HasIndex("BenefitId1");
+
+                    b.ToTable("TaskInfoBenefit", t =>
+                        {
+                            t.HasComment("浠诲姟绂忓埄");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟Id");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<Guid?>("TypeId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功绫诲瀷Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.HasIndex("TypeId");
+
+                    b.ToTable("TaskInfoCredentialLimit");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<int>("HireStatus")
+                        .HasColumnType("int")
+                        .HasComment("褰曠敤鐘舵��");
+
+                    b.Property<DateTime?>("HireTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("褰曠敤鏃堕棿");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int?>("SignContractStatus")
+                        .HasColumnType("int")
+                        .HasComment("绛剧害鐘舵��");
+
+                    b.Property<DateTime?>("SignContractTime")
+                        .HasColumnType("datetime2")
+                        .HasComment("绛剧害鏃堕棿");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浠诲姟Id");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("TaskInfoUser", t =>
+                        {
+                            t.HasComment("浠诲姟鐢ㄦ埛淇℃伅");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("AvatarId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("澶村儚Id");
+
+                    b.Property<string>("BankCard")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("閾惰鍗″彿");
+
+                    b.Property<Guid?>("BankCardImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("閾惰鍗$収鐗嘔d");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<string>("Identity")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("韬唤璇佸彿");
+
+                    b.Property<Guid?>("IdentityBackImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("韬唤璇佸浗寰介潰Id");
+
+                    b.Property<Guid?>("IdentityImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("韬唤璇佷汉鍍忛潰Id");
+
+                    b.Property<bool>("IsCheckPhoneNumber")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁宸叉牎楠屾墜鏈哄彿");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsReal")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁瀹炲悕");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("濮撳悕");
+
+                    b.Property<string>("Password")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("瀵嗙爜");
+
+                    b.Property<string>("PhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)")
+                        .HasComment("鎵嬫満鍙�");
+
+                    b.Property<int?>("RealAccess")
+                        .HasColumnType("int")
+                        .HasComment("瀹炲悕閫氶亾");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<string>("UserName")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("鐢ㄦ埛鍚�");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("AvatarId");
+
+                    b.HasIndex("BankCardImgId");
+
+                    b.HasIndex("IdentityBackImgId");
+
+                    b.HasIndex("IdentityImgId");
+
+                    b.ToTable("UserAuth", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛");
+                        });
+
+                    b.HasData(
+                        new
+                        {
+                            Id = new Guid("11111111-1111-1111-1111-111111111111"),
+                            CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)),
+                            IsCheckPhoneNumber = false,
+                            IsDeleted = false,
+                            IsReal = false,
+                            Name = "绠$悊鍛�",
+                            Password = "iEYggKrMhQ3ASUGLobra1w==:fn/DsMJUbD9FGpvBvR3moMpMPptdxzZlourPVhU479I=",
+                            Sort = 0,
+                            UserName = "system"
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfo", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("甯搁┗鍩庡競Id");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<Guid?>("EducationalBackgroundId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瀛﹀巻Id");
+
+                    b.Property<Guid?>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("浼佷笟Id");
+
+                    b.Property<int?>("FreeTime")
+                        .HasColumnType("int")
+                        .HasComment("绌洪棽鏃堕棿");
+
+                    b.Property<int?>("Height")
+                        .HasColumnType("int")
+                        .HasComment("韬珮");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int?>("JobSeekingStatus")
+                        .HasColumnType("int")
+                        .HasComment("姹傝亴鐘舵��");
+
+                    b.Property<int>("Level")
+                        .HasColumnType("int")
+                        .HasComment("绾у埆");
+
+                    b.Property<Guid?>("PersonalIdentityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("韬唤Id");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("鐘舵��");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("鐢ㄦ埛绫诲瀷");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserAuthId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛Id");
+
+                    b.Property<int?>("Weight")
+                        .HasColumnType("int")
+                        .HasComment("浣撻噸");
+
+                    b.Property<string>("WorkExperience")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("宸ヤ綔缁忛獙");
+
+                    b.Property<string>("WorkSeniority")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("宸ヤ綔璧勫巻");
+
+                    b.Property<string>("WxmpOpenId")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("寰俊寮�鏀綢d");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CityId");
+
+                    b.HasIndex("EducationalBackgroundId");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("PersonalIdentityId");
+
+                    b.HasIndex("UserAuthId");
+
+                    b.ToTable("UserInfo", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅");
+                        });
+
+                    b.HasData(
+                        new
+                        {
+                            Id = new Guid("11111111-1111-1111-1111-111111111112"),
+                            CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)),
+                            IsDeleted = false,
+                            Level = 999,
+                            Sort = 0,
+                            Status = 0,
+                            Type = 100,
+                            UserAuthId = new Guid("11111111-1111-1111-1111-111111111111")
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoBankCard", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Bank")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("寮�鎴疯");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("閾惰鍗″彿");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<string>("PhoneNumber")
+                        .IsRequired()
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)")
+                        .HasComment("閾惰棰勭暀鎵嬫満鍙�");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoBankCard", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛閾惰鍗′俊鎭�");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoCredential", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("BackImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功鍙嶉潰鐓х墖Id");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)")
+                        .HasComment("璇佷功缂栧彿");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<DateTime>("EndDate")
+                        .HasColumnType("datetime2")
+                        .HasComment("缁撴潫鏃ユ湡");
+
+                    b.Property<Guid>("ImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功姝i潰鐓х墖Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<bool>("IsForever")
+                        .HasColumnType("bit")
+                        .HasComment("姘镐箙璇佷功");
+
+                    b.Property<string>("IssueUnit")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("鍙戣瘉鍗曚綅");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<DateTime>("StartDate")
+                        .HasColumnType("datetime2")
+                        .HasComment("寮�濮嬫棩鏈�");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<Guid?>("TypeId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("璇佷功绫诲瀷Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("BackImgId");
+
+                    b.HasIndex("ImgId");
+
+                    b.HasIndex("TypeId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoCredential", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅璧勬牸璇佷功");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoDepartment", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<Guid>("DepartmentId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("閮ㄩ棬Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DepartmentId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoDepartment", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅閮ㄩ棬");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoExpectJob", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("PersonalIdentityId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈熸湜宀椾綅Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("PersonalIdentityId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoExpectJob", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅鏈熸湜宀椾綅");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoPhoto", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<Guid>("ImgId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐓х墖Id");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ImgId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoPhoto", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅鐢熸椿鐓�");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoRole", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鍒涘缓鎿嶄綔浜�");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("鏄惁鍒犻櫎");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("瑙掕壊Id");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int")
+                        .HasComment("鎺掑簭");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("璺熻釜Id");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鏈�鍚庢洿鏂版搷浣滀汉");
+
+                    b.Property<Guid>("UserInfoId")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("鐢ㄦ埛淇℃伅Id");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RoleId");
+
+                    b.HasIndex("UserInfoId");
+
+                    b.ToTable("UserInfoRole", t =>
+                        {
+                            t.HasComment("鐢ㄦ埛淇℃伅瑙掕壊");
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("Departments")
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Department", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryCategory", "Category")
+                        .WithMany()
+                        .HasForeignKey("CategoryId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Category");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityBackImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityBackImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "LicenseImage")
+                        .WithMany()
+                        .HasForeignKey("LicenseImageId");
+
+                    b.Navigation("IdentityBackImg");
+
+                    b.Navigation("IdentityImg");
+
+                    b.Navigation("LicenseImage");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.FileVirtualPath", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileStore", "Store")
+                        .WithMany()
+                        .HasForeignKey("StoreId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Store");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Menu", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Menu", "Menu")
+                        .WithMany()
+                        .HasForeignKey("MenuId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("RoleMenus")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Menu");
+
+                    b.Navigation("Role");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleResource", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Resource", "Resource")
+                        .WithMany()
+                        .HasForeignKey("ResourceId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("RoleResources")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Resource");
+
+                    b.Navigation("Role");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "City")
+                        .WithMany()
+                        .HasForeignKey("CityId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany()
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("City");
+
+                    b.Navigation("Enterprise");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("Benefits")
+                        .HasForeignKey("BenefitId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Benefit")
+                        .WithMany()
+                        .HasForeignKey("BenefitId1")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Benefit");
+
+                    b.Navigation("TaskInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("CredentialLimits")
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Type")
+                        .WithMany()
+                        .HasForeignKey("TypeId");
+
+                    b.Navigation("TaskInfo");
+
+                    b.Navigation("Type");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany()
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany()
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("TaskInfo");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "Avatar")
+                        .WithMany()
+                        .HasForeignKey("AvatarId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "BankCardImg")
+                        .WithMany()
+                        .HasForeignKey("BankCardImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityBackImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityBackImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityImg")
+                        .WithMany()
+                        .HasForeignKey("IdentityImgId");
+
+                    b.Navigation("Avatar");
+
+                    b.Navigation("BankCardImg");
+
+                    b.Navigation("IdentityBackImg");
+
+                    b.Navigation("IdentityImg");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfo", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "City")
+                        .WithMany()
+                        .HasForeignKey("CityId");
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "EducationalBackground")
+                        .WithMany()
+                        .HasForeignKey("EducationalBackgroundId");
+
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("UserInfos")
+                        .HasForeignKey("EnterpriseId");
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "PersonalIdentity")
+                        .WithMany()
+                        .HasForeignKey("PersonalIdentityId");
+
+                    b.HasOne("FlexJobApi.Core.UserAuth", "UserAuth")
+                        .WithMany("UserInfos")
+                        .HasForeignKey("UserAuthId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("City");
+
+                    b.Navigation("EducationalBackground");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("PersonalIdentity");
+
+                    b.Navigation("UserAuth");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoBankCard", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany()
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoCredential", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "BackImg")
+                        .WithMany()
+                        .HasForeignKey("BackImgId");
+
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "Img")
+                        .WithMany()
+                        .HasForeignKey("ImgId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Type")
+                        .WithMany()
+                        .HasForeignKey("TypeId");
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoCredentials")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("BackImg");
+
+                    b.Navigation("Img");
+
+                    b.Navigation("Type");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoDepartment", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Department", "Department")
+                        .WithMany()
+                        .HasForeignKey("DepartmentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoDepartments")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Department");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoExpectJob", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "PersonalIdentity")
+                        .WithMany()
+                        .HasForeignKey("PersonalIdentityId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoExpectJobs")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("PersonalIdentity");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoPhoto", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.FileVirtualPath", "Img")
+                        .WithMany()
+                        .HasForeignKey("ImgId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany()
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Img");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfoRole", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("UserInfoRoles")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo")
+                        .WithMany("UserInfoRoles")
+                        .HasForeignKey("UserInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Role");
+
+                    b.Navigation("UserInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.Navigation("Departments");
+
+                    b.Navigation("UserInfos");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Role", b =>
+                {
+                    b.Navigation("RoleMenus");
+
+                    b.Navigation("RoleResources");
+
+                    b.Navigation("UserInfoRoles");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.Navigation("Benefits");
+
+                    b.Navigation("CredentialLimits");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.Navigation("UserInfos");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserInfo", b =>
+                {
+                    b.Navigation("UserInfoCredentials");
+
+                    b.Navigation("UserInfoDepartments");
+
+                    b.Navigation("UserInfoExpectJobs");
+
+                    b.Navigation("UserInfoRoles");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.cs b/FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.cs
new file mode 100644
index 0000000..0fe6191
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250805082824_UpdateUser0805.cs
@@ -0,0 +1,87 @@
+锘縰sing System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace FlexJobApi.Database.Migrations.Migrations
+{
+    /// <inheritdoc />
+    public partial class UpdateUser0805 : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<string>(
+                name: "Remark",
+                table: "UserInfo",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "澶囨敞");
+
+            migrationBuilder.AddColumn<int>(
+                name: "Status",
+                table: "UserInfo",
+                type: "int",
+                nullable: false,
+                defaultValue: 0,
+                comment: "鐘舵��");
+
+            migrationBuilder.AlterColumn<string>(
+                name: "Remark",
+                table: "Role",
+                type: "nvarchar(max)",
+                nullable: true,
+                comment: "澶囨敞",
+                oldClrType: typeof(string),
+                oldType: "nvarchar(max)",
+                oldNullable: true);
+
+            migrationBuilder.AlterColumn<int>(
+                name: "DataPower",
+                table: "Role",
+                type: "int",
+                nullable: false,
+                comment: "鏁版嵁鏉冮檺",
+                oldClrType: typeof(int),
+                oldType: "int");
+
+            migrationBuilder.UpdateData(
+                table: "UserInfo",
+                keyColumn: "Id",
+                keyValue: new Guid("11111111-1111-1111-1111-111111111112"),
+                columns: new[] { "Remark", "Status" },
+                values: new object[] { null, 0 });
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "Remark",
+                table: "UserInfo");
+
+            migrationBuilder.DropColumn(
+                name: "Status",
+                table: "UserInfo");
+
+            migrationBuilder.AlterColumn<string>(
+                name: "Remark",
+                table: "Role",
+                type: "nvarchar(max)",
+                nullable: true,
+                oldClrType: typeof(string),
+                oldType: "nvarchar(max)",
+                oldNullable: true,
+                oldComment: "澶囨敞");
+
+            migrationBuilder.AlterColumn<int>(
+                name: "DataPower",
+                table: "Role",
+                type: "int",
+                nullable: false,
+                oldClrType: typeof(int),
+                oldType: "int",
+                oldComment: "鏁版嵁鏉冮檺");
+        }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
index 92d7f88..45ae60d 100644
--- a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
+++ b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
@@ -722,7 +722,8 @@
                         .HasComment("鍒涘缓鎿嶄綔浜�");
 
                     b.Property<int>("DataPower")
-                        .HasColumnType("int");
+                        .HasColumnType("int")
+                        .HasComment("鏁版嵁鏉冮檺");
 
                     b.Property<bool>("IsDeleted")
                         .HasColumnType("bit")
@@ -739,7 +740,8 @@
                         .HasComment("鍚嶇О");
 
                     b.Property<string>("Remark")
-                        .HasColumnType("nvarchar(max)");
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
 
                     b.Property<int>("Sort")
                         .HasColumnType("int")
@@ -1310,9 +1312,17 @@
                         .HasColumnType("uniqueidentifier")
                         .HasComment("韬唤Id");
 
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("澶囨敞");
+
                     b.Property<int>("Sort")
                         .HasColumnType("int")
                         .HasComment("鎺掑簭");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("鐘舵��");
 
                     b.Property<string>("TraceId")
                         .HasColumnType("nvarchar(max)")
@@ -1375,6 +1385,7 @@
                             IsDeleted = false,
                             Level = 999,
                             Sort = 0,
+                            Status = 0,
                             Type = 100,
                             UserAuthId = new Guid("11111111-1111-1111-1111-111111111111")
                         });
@@ -2089,7 +2100,7 @@
             modelBuilder.Entity("FlexJobApi.Core.UserInfoRole", b =>
                 {
                     b.HasOne("FlexJobApi.Core.Role", "Role")
-                        .WithMany()
+                        .WithMany("UserInfoRoles")
                         .HasForeignKey("RoleId")
                         .OnDelete(DeleteBehavior.Cascade)
                         .IsRequired();
@@ -2132,6 +2143,8 @@
                     b.Navigation("RoleMenus");
 
                     b.Navigation("RoleResources");
+
+                    b.Navigation("UserInfoRoles");
                 });
 
             modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
diff --git a/FlexJobApi.User.Application/Auths/Queries/GetCurrentLogierMenusQueryHandler.cs b/FlexJobApi.User.Application/Auths/Queries/GetCurrentLogierMenusQueryHandler.cs
new file mode 100644
index 0000000..f531070
--- /dev/null
+++ b/FlexJobApi.User.Application/Auths/Queries/GetCurrentLogierMenusQueryHandler.cs
@@ -0,0 +1,64 @@
+锘縰sing FlexJobApi.Core;
+using Furion;
+using Furion.DatabaseAccessor;
+using Mapster;
+using MediatR;
+using Microsoft.AspNetCore.Http;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application
+{
+    /// <summary>
+    /// 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛鑿滃崟
+    /// </summary>
+    public class GetCurrentLogierMenusQueryHandler(
+            IRepository<Menu> repMenu,
+            IRepository<RoleMenu> repRoleMenu,
+            IRepository<UserInfoRole> repUserInfoRole
+        )
+        : IRequestHandler<GetCurrentLogierMenusQuery, List<GetMenusQueryResultItem>>
+    {
+        private readonly IRepository<Menu> repMenu = repMenu;
+        private readonly IRepository<RoleMenu> repRoleMenu = repRoleMenu;
+        private readonly IRepository<UserInfoRole> repUserInfoRole = repUserInfoRole;
+
+        /// <inheritdoc/>
+        public async Task<List<GetMenusQueryResultItem>> Handle(GetCurrentLogierMenusQuery request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var all = await (from m in repMenu.AsQueryable().AsNoTracking()
+                             join rm in repRoleMenu.AsQueryable().AsNoTracking() on m.Id equals rm.MenuId
+                             join ur in repUserInfoRole.AsQueryable().AsNoTracking() on rm.RoleId equals ur.RoleId
+                             where ur.UserInfoId == logier.UserInfoId
+                             && (m.Type == EnumMenuType.Menu || m.Type == EnumMenuType.Page || m.Type == EnumMenuType.Modal)
+                             select m).ProjectToType<GetMenusQueryResultItem>().ToListAsync();
+            var models = all.Where(it => it.ParentId == null).ToList();
+            LoopChildrens(models, all, []);
+            return models;
+        }
+
+        /// <summary>
+        /// 閫掑綊璧嬪�间笅绾ц彍鍗�
+        /// </summary>
+        /// <param name="models"></param>
+        /// <param name="all"></param>
+        /// <param name="roleMenuIds"></param>
+        private void LoopChildrens(List<GetMenusQueryResultItem> models, List<GetMenusQueryResultItem> all, List<Guid> roleMenuIds)
+        {
+            foreach (var item in models)
+            {
+                item.IsChecked = roleMenuIds.Contains(item.Id);
+                item.Children = all.Where(it => it.ParentId == item.Id).ToList();
+                if (item.Children.IsNotNull())
+                {
+                    LoopChildrens(item.Children, all, roleMenuIds);
+                }
+            }
+        }
+    }
+}
diff --git a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
index c3be773..80160c1 100644
--- a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
+++ b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
@@ -25,6 +25,27 @@
         <member name="M:FlexJobApi.User.Application.GetAliyunOSSAcsQueryHandler.Handle(FlexJobApi.Core.GetAliyunOSSAcsQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
+        <member name="T:FlexJobApi.User.Application.GetCurrentLogierMenusQueryHandler">
+            <summary>
+            鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛鑿滃崟
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.GetCurrentLogierMenusQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Menu},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.RoleMenu},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfoRole})">
+            <summary>
+            鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛鑿滃崟
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.GetCurrentLogierMenusQueryHandler.Handle(FlexJobApi.Core.GetCurrentLogierMenusQuery,System.Threading.CancellationToken)">
+            <inheritdoc/>
+        </member>
+        <member name="M:FlexJobApi.User.Application.GetCurrentLogierMenusQueryHandler.LoopChildrens(System.Collections.Generic.List{FlexJobApi.Core.GetMenusQueryResultItem},System.Collections.Generic.List{FlexJobApi.Core.GetMenusQueryResultItem},System.Collections.Generic.List{System.Guid})">
+            <summary>
+            閫掑綊璧嬪�间笅绾ц彍鍗�
+            </summary>
+            <param name="models"></param>
+            <param name="all"></param>
+            <param name="roleMenuIds"></param>
+        </member>
         <member name="F:FlexJobApi.User.Application.EnumUserErrorCodeType.u1000">
             <summary>
             璐﹀彿鎴栧瘑鐮佷笉瀛樺湪
@@ -245,6 +266,19 @@
         <member name="M:FlexJobApi.User.Application.SaveRoleCommandHandler.Handle(FlexJobApi.Core.SaveRoleCommand,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
+        <member name="T:FlexJobApi.User.Application.SetRoleUserCommandHandler">
+            <summary>
+            璁剧疆瑙掕壊鐢ㄦ埛
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.SetRoleUserCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfoRole})">
+            <summary>
+            璁剧疆瑙掕壊鐢ㄦ埛
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.SetRoleUserCommandHandler.Handle(FlexJobApi.Core.SetRoleUserCommand,System.Threading.CancellationToken)">
+            <inheritdoc/>
+        </member>
         <member name="T:FlexJobApi.User.Application.GetRoleQueryHandler">
             <summary>
             鑾峰彇瑙掕壊璇︽儏
@@ -262,16 +296,42 @@
             <summary>
             鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
             </summary>
-            <param name="rep"></param>
+            <param name="repRole"></param>
         </member>
-        <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Role})">
+        <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Role},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfoRole})">
             <summary>
             鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
             </summary>
-            <param name="rep"></param>
+            <param name="repRole"></param>
         </member>
         <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.Handle(FlexJobApi.Core.GetRolesQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
+        <member name="T:FlexJobApi.User.Application.GetRoleUsersQueryHandler">
+            <summary>
+            鏌ヨ瑙掕壊鐢ㄦ埛鍒楄〃
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.GetRoleUsersQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Role},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfo},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfoRole})">
+            <summary>
+            鏌ヨ瑙掕壊鐢ㄦ埛鍒楄〃
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.GetRoleUsersQueryHandler.Handle(FlexJobApi.Core.GetRoleUsersQuery,System.Threading.CancellationToken)">
+            <inheritdoc/>
+        </member>
+        <member name="T:FlexJobApi.User.Application.GetOperationUserInfosQueryHandler">
+            <summary>
+            鑾峰彇杩愯惀绔敤鎴峰垎椤靛垪琛�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.GetOperationUserInfosQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfo},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfoRole})">
+            <summary>
+            鑾峰彇杩愯惀绔敤鎴峰垎椤靛垪琛�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.User.Application.GetOperationUserInfosQueryHandler.Handle(FlexJobApi.Core.GetOperationUserInfosQuery,System.Threading.CancellationToken)">
+            <inheritdoc/>
+        </member>
     </members>
 </doc>
diff --git a/FlexJobApi.User.Application/Roles/Commands/SetRoleUserInfosCommandHandler.cs b/FlexJobApi.User.Application/Roles/Commands/SetRoleUserInfosCommandHandler.cs
new file mode 100644
index 0000000..f8edf74
--- /dev/null
+++ b/FlexJobApi.User.Application/Roles/Commands/SetRoleUserInfosCommandHandler.cs
@@ -0,0 +1,44 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application
+{
+    /// <summary>
+    /// 璁剧疆瑙掕壊鐢ㄦ埛
+    /// </summary>
+    public class SetRoleUserInfosCommandHandler(
+            IRepository<UserInfoRole> rep
+        ) : IRequestHandler<SetRoleUserInfosCommand, int>
+    {
+        private readonly IRepository<UserInfoRole> rep = rep;
+
+        /// <inheritdoc/>
+        public async Task<int> Handle(SetRoleUserInfosCommand request, CancellationToken cancellationToken)
+        {
+            var entities = await rep.AsQueryable()
+                .Where(it =>
+                    it.RoleId == request.RoleId
+                    && request.UserInfoIds.Contains(it.UserInfoId))
+                .ToListAsync(cancellationToken);
+            var removes = entities.Where(it => !request.UserInfoIds.Contains(it.UserInfoId)).ToList();
+            if (removes.Any()) await rep.DeleteAsync(removes, cancellationToken);
+            var adds = request.UserInfoIds
+                .Where(it => !entities.Any(e => e.UserInfoId == it))
+                .Select(it => new UserInfoRole
+                {
+                    RoleId = request.RoleId,
+                    UserInfoId = it
+                })
+                .ToList();
+            if (adds.Any()) await rep.InsertAsync(adds, cancellationToken);
+            return removes.Count + adds.Count;
+        }
+    }
+}
diff --git a/FlexJobApi.User.Application/Roles/Queries/GetRoleUserInfosQueryHandler.cs b/FlexJobApi.User.Application/Roles/Queries/GetRoleUserInfosQueryHandler.cs
new file mode 100644
index 0000000..454ccc8
--- /dev/null
+++ b/FlexJobApi.User.Application/Roles/Queries/GetRoleUserInfosQueryHandler.cs
@@ -0,0 +1,59 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using Furion.FriendlyException;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application
+{
+    /// <summary>
+    /// 鏌ヨ瑙掕壊鐢ㄦ埛鍒楄〃
+    /// </summary>
+    public class GetRoleUserInfosQueryHandler(
+            IRepository<Role> repRole,
+            IRepository<UserInfo> repUserInfo,
+            IRepository<UserInfoRole> repUserInfoRole
+        ) : IRequestHandler<GetRoleUserInfosQuery, List<GetRoleUserInfosQueryResultItem>>
+    {
+        private readonly IRepository<Role> repRole = repRole;
+        private readonly IRepository<UserInfo> repUserInfo = repUserInfo;
+        private readonly IRepository<UserInfoRole> repUserInfoRole = repUserInfoRole;
+
+        /// <inheritdoc/>
+        public async Task<List<GetRoleUserInfosQueryResultItem>> Handle(GetRoleUserInfosQuery request, CancellationToken cancellationToken)
+        {
+            var role = await repRole.AsQueryable().AsNoTracking()
+                .Where(it => it.Id == request.RoleId)
+                .Select(it => new
+                {
+                    it.UserType,
+                })
+                .FirstOrDefaultAsync(cancellationToken);
+            if (role == null) throw Oops.Oh(EnumErrorCodeType.s404, "璇ヨ鑹�");
+            var userInfoIds = await repUserInfoRole.AsQueryable().AsNoTracking()
+                .Where(it => it.RoleId == request.RoleId)
+                .Select(it => it.UserInfoId)
+                .ToListAsync(cancellationToken);
+            var userInfos = await repUserInfo.AsQueryable().AsNoTracking()
+                .Include(it => it.UserAuth)
+                .Where(it => it.Type == role.UserType)
+                .Select(it => new GetRoleUserInfosQueryResultItem
+                {
+                    Id = it.Id,
+                    Name = it.UserAuth.Name,
+                    UserName = it.UserAuth.UserName,
+                })
+                .ToListAsync(cancellationToken);
+            foreach (var userInfo in userInfos)
+            {
+                userInfo.IsChecked = userInfoIds.Contains(userInfo.Id);
+            }
+            return userInfos;
+        }
+    }
+}
diff --git a/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs b/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs
index 7ecb4e0..92ba664 100644
--- a/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs
+++ b/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs
@@ -14,17 +14,19 @@
     /// <summary>
     /// 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃
     /// </summary>
-    /// <param name="rep"></param>
+    /// <param name="repRole"></param>
     public class GetRolesQueryHandler(
-            IRepository<Role> rep
+            IRepository<Role> repRole,
+            IRepository<UserInfoRole> repUserInfoRole
         ) : IRequestHandler<GetRolesQuery, PagedListQueryResult<GetRolesQueryResultItem>>
     {
-        private readonly IRepository<Role> rep = rep;
+        private readonly IRepository<Role> repRole = repRole;
+        private readonly IRepository<UserInfoRole> repUserInfoRole = repUserInfoRole;
 
         /// <inheritdoc/>
-        public Task<PagedListQueryResult<GetRolesQueryResultItem>> Handle(GetRolesQuery request, CancellationToken cancellationToken)
+        public async Task<PagedListQueryResult<GetRolesQueryResultItem>> Handle(GetRolesQuery request, CancellationToken cancellationToken)
         {
-            var q = rep.AsQueryable().AsNoTracking();
+            var q = repRole.AsQueryable().AsNoTracking();
             if (request.UserType.HasValue)
             {
                 q = q.Where(it => it.UserType == request.UserType);
@@ -33,10 +35,27 @@
             {
                 q = q.Where(it => it.ClientType == request.ClientType);
             }
-            var result = q
+            var result = await q
                 .ProjectToType<GetRolesQueryResultItem>()
                 .ToPagedListAsync(request.PageModel, cancellationToken);
 
+            if (result.Data.Any())
+            {
+                var ids = result.Data.DistinctSelect(it => it.Id);
+                var userInfoRoles = await repUserInfoRole.AsQueryable().AsNoTracking()
+                    .Where(it => ids.Contains(it.RoleId))
+                    .Select(it => new
+                    {
+                        it.UserInfoId,
+                        it.RoleId
+                    })
+                    .ToListAsync();
+                foreach (var item in result.Data)
+                {
+                    item.UserCount = userInfoRoles.Count(it => it.RoleId == item.Id);
+                }
+            }
+
             return result;
         }
     }
diff --git a/FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs b/FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs
new file mode 100644
index 0000000..d91b776
--- /dev/null
+++ b/FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs
@@ -0,0 +1,35 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application.UserInfos.Commands
+{
+    /// <summary>
+    /// 璁剧疆鐢ㄦ埛淇℃伅鐘舵��
+    /// </summary>
+    public class SetUserInfoStatusCommandHandler(
+            IRepository<UserInfo> rep
+        ) : IRequestHandler<SetUserInfoStatusCommand, int>
+    {
+        private readonly IRepository<UserInfo> rep = rep;
+
+        /// <inheritdoc/>
+        public async Task<int> Handle(SetUserInfoStatusCommand request, CancellationToken cancellationToken)
+        {
+            var entities = await rep.AsQueryable()
+                .Where(it => request.Ids.Contains(it.Id) && it.Status != request.Status)
+                .ToListAsync(cancellationToken);
+            foreach (var entity in entities)
+            {
+                entity.Status = request.Status;
+            }
+            return entities.Count;
+        }
+    }
+}
diff --git a/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs b/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs
new file mode 100644
index 0000000..6aa9360
--- /dev/null
+++ b/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs
@@ -0,0 +1,60 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application
+{
+    /// <summary>
+    /// 鑾峰彇杩愯惀绔敤鎴峰垎椤靛垪琛�
+    /// </summary>
+    public class GetOperationUserInfosQueryHandler(
+            IRepository<UserInfo> repUser,
+            IRepository<UserInfoRole> repUserInfoRole
+        ) : IRequestHandler<GetOperationUserInfosQuery, PagedListQueryResult<GetOperationUserInfosQueryResultItem>>
+    {
+        private readonly IRepository<UserInfo> repUser = repUser;
+        private readonly IRepository<UserInfoRole> repUserInfoRole = repUserInfoRole;
+
+        /// <inheritdoc/>
+        public async Task<PagedListQueryResult<GetOperationUserInfosQueryResultItem>> Handle(GetOperationUserInfosQuery request, CancellationToken cancellationToken)
+        {
+            var result = await repUser.AsQueryable().AsNoTracking()
+                .OrderByDescending(it => it.Level).ThenByDescending(it => it.CreatedTime)
+                .Where(it => it.Type == EnumUserType.Operation)
+                .Select(it => new GetOperationUserInfosQueryResultItem
+                {
+                    Id = it.Id,
+                    Name = it.UserAuth.Name,
+                    UserName = it.UserAuth.UserName,
+                    PhoneNumber = it.UserAuth.PhoneNumber,
+                    Remark = it.Remark
+                })
+                .ToPagedListAsync(request.PageModel, cancellationToken);
+            if (result.Data.Any())
+            {
+                var ids = result.Data.DistinctSelect(it => it.Id);
+                var userRoles = await repUserInfoRole.AsQueryable().AsNoTracking()
+                    .Include(it => it.Role)
+                    .Where(it => ids.Contains(it.UserInfoId))
+                    .Select(it => new GetOperationUserInfosQueryResultItemRole
+                    {
+                        UserInfoId = it.UserInfoId,
+                        Id = it.RoleId,
+                        Name = it.Role.Name
+                    })
+                    .ToListAsync(cancellationToken);
+                foreach (var item in result.Data)
+                {
+                    item.Roles = userRoles.Where(it => it.UserInfoId == item.Id).ToList();
+                }
+            }
+            return result;
+        }
+    }
+}
diff --git a/FlexJobApi.User.Application/UserInfos/Queries/GetUserInfoRolesQueryHandler.cs b/FlexJobApi.User.Application/UserInfos/Queries/GetUserInfoRolesQueryHandler.cs
new file mode 100644
index 0000000..4fe2aed
--- /dev/null
+++ b/FlexJobApi.User.Application/UserInfos/Queries/GetUserInfoRolesQueryHandler.cs
@@ -0,0 +1,58 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using Furion.FriendlyException;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application
+{
+    /// <summary>
+    /// 鏌ヨ鐢ㄦ埛瑙掕壊鍒楄〃
+    /// </summary>
+    public class GetUserInfoRolesQueryHandler(
+            IRepository<Role> repRole,
+            IRepository<UserInfo> repUserInfo,
+            IRepository<UserInfoRole> repUserInfoRole
+        ) : IRequestHandler<GetUserInfoRolesQuery, List<GetUserInfoRolesQueryResultItem>>
+    {
+        private readonly IRepository<Role> repRole = repRole;
+        private readonly IRepository<UserInfo> repUserInfo = repUserInfo;
+        private readonly IRepository<UserInfoRole> repUserInfoRole = repUserInfoRole;
+
+        /// <inheritdoc/>
+        public async Task<List<GetUserInfoRolesQueryResultItem>> Handle(GetUserInfoRolesQuery request, CancellationToken cancellationToken)
+        {
+            var userInfo = await repUserInfo.AsQueryable().AsNoTracking()
+                .Where(it => it.Id == request.UserInfoId)
+                .Select(it => new
+                {
+                    it.Type,
+                })
+                .FirstOrDefaultAsync(cancellationToken);
+            if (userInfo == null) throw Oops.Oh(EnumErrorCodeType.s404, "璇ョ敤鎴蜂俊鎭�");
+            var roleIds = await repUserInfoRole.AsQueryable().AsNoTracking()
+                .Where(it => it.UserInfoId == request.UserInfoId)
+                .Select(it => it.RoleId)
+                .ToListAsync(cancellationToken);
+            var roles = await repRole.AsQueryable().AsNoTracking()
+                .Where(it => it.UserType == userInfo.Type && it.ClientType == request.ClientType)
+                .Select(it => new GetUserInfoRolesQueryResultItem
+                {
+                    Id = it.Id,
+                    Name = it.Name,
+                    Remark = it.Remark,
+                })
+                .ToListAsync(cancellationToken);
+            foreach (var role in roles)
+            {
+                role.IsChecked = roleIds.Contains(role.Id);
+            }
+            return roles;
+        }
+    }
+}

--
Gitblit v1.9.1