2828 AdminGroupListSchema ,
2929 AdminGroupPermissionSchema ,
3030 AdminUserPageSchema ,
31+ AdminUserSchema ,
3132 CreateGroupSchema ,
3233 GroupBaseSchema ,
3334 GroupIdWithPermissionIdListSchema ,
34- GroupQuerySearchSchema ,
3535 UpdateUserInfoSchema ,
3636)
37- from app .util . page import get_page_from_query
37+ from app .schema import QueryPageSchema
3838
3939admin_api = Blueprint ("admin" , __name__ )
4040
@@ -60,78 +60,70 @@ def permissions():
6060 tags = ["管理员" ],
6161 security = [AuthorizationBearerSecurity ],
6262 resp = DocResponse (r = AdminUserPageSchema ),
63- before = GroupQuerySearchSchema .offset_handler ,
63+ before = QueryPageSchema .offset_handler ,
6464)
65- def get_admin_users (query : GroupQuerySearchSchema ):
65+ def get_admin_users (query : QueryPageSchema ):
6666 """
67- 查询所有用户
67+ 查询所有用户及其所属组信息
6868 """
69- # 根据筛选条件和分页,获取 用户id 与 用户组id 的一对多 数据
70- # 过滤root 分组
69+ # 获取 符合条件的 用户id 数量 ,过滤root 分组
7170 query_root_group_id = db .session .query (manager .group_model .id ).filter (
7271 manager .group_model .level == GroupLevelEnum .ROOT .value
7372 )
74- _user_groups_list = db .session .query (
75- manager .user_group_model .user_id .label ("user_id" ),
76- func .group_concat (manager .user_group_model .group_id ).label ("group_ids" ),
77- ).filter (~ manager .user_group_model .group_id .in_ (query_root_group_id ))
78- if g .group_id :
79- _user_groups_list = _user_groups_list .filter (
80- manager .user_group_model .group_id == g .group_id
81- )
82- user_groups_list = (
83- _user_groups_list .group_by (manager .user_group_model .user_id )
73+ # 获取符合条件的用户总量
74+ total = (
75+ db .session .query (func .count (func .distinct (manager .user_group_model .user_id )))
76+ .filter (~ manager .user_group_model .group_id .in_ (query_root_group_id ))
77+ .scalar ()
78+ )
79+ # 获取当前分页条件下查询到的非Root组的用户id
80+ current_page_user_ids = (
81+ db .session .query (manager .user_group_model .user_id )
82+ .filter (~ manager .user_group_model .group_id .in_ (query_root_group_id ))
83+ .group_by (manager .user_group_model .user_id )
8484 .offset (g .offset )
8585 .limit (g .count )
86- .all ()
8786 )
88-
89- # 获取 符合条件的 用户id 数量
90- # 过滤root 分组
91- _total = db .session .query (
92- func .count (func .distinct (manager .user_group_model .user_id ))
93- ).filter (~ manager .user_group_model .group_id .in_ (query_root_group_id ))
94- if g .group_id :
95- _total = _total .filter (manager .user_group_model .group_id == g .group_id )
96- total = _total .scalar ()
97-
98- # 获取本次需要返回的用户的数据
99- user_ids = [x .user_id for x in user_groups_list ]
100- users = manager .user_model .query .filter (manager .user_model .id .in_ (user_ids )).all ()
101- user_dict = dict ()
102- for user in users :
103- user .groups = list ()
104- user ._fields .append ("groups" )
105- user_dict [user .id ] = user
106-
107- # 使用用户组来过滤,则不需要补全用户组信息
108- if not g .group_id :
109- # 拿到本次请求返回用户的所有 用户组 id List
110- group_ids = [
111- int (i )
112- for i in set ().union (* (x .group_ids .split ("," ) for x in user_groups_list ))
113- ]
114- # 获取本次需要返回的用户组的数据
115- groups = manager .group_model .query .filter (
116- manager .group_model .id .in_ (group_ids )
117- ).all ()
118- group_dict = dict ()
119- for group in groups :
120- group_dict [group .id ] = group
121- items = []
122-
123- # 根据 用户与用户组 一对多的关系, 补全用户的用户组详细信息
124- for user_id , group_ids in user_groups_list :
125- group_id_list = [int (gid ) for gid in group_ids .split ("," )]
126- groups = [group_dict [group_id ] for group_id in group_id_list ]
127- user_dict [user_id ].groups = groups
128- items .append (user_dict [user_id ])
129-
130- total_page = math .ceil (total / g .count )
131- page = get_page_from_query ()
132- return AdminUserPageSchema (
133- count = g .count , total = total , total_page = total_page , page = page , items = users
87+ # 获取用户的基本信息
88+ current_page_users = manager .user_model .query .filter (
89+ manager .user_model .id .in_ (current_page_user_ids )
90+ ).all ()
91+ # 获取需要填充分组的基本信息
92+ current_groups = manager .group_model .query .filter (
93+ manager .group_model .id .in_ (
94+ db .session .query (manager .user_group_model .group_id )
95+ .filter (manager .user_group_model .user_id .in_ (current_page_user_ids ))
96+ .group_by (manager .user_group_model .group_id )
97+ )
98+ ).all ()
99+ # 获取这些用户和分组的多对多关联关系
100+ user_group_relations = (
101+ db .session .query (manager .user_group_model )
102+ .filter (manager .user_group_model .user_id .in_ (current_page_user_ids ))
103+ .all ()
134104 )
105+ # 根据关联关系拼装的items数据结构
106+ items = [
107+ AdminUserSchema (
108+ email = user .email , groups = list (), id = user .id , username = user .username
109+ )
110+ for user in current_page_users
111+ ]
112+ # 填充分组信息
113+ for item in items :
114+ for ug in user_group_relations :
115+ if ug .user_id == item .id :
116+ for group in current_groups :
117+ if ug .group_id == group .id :
118+ item .groups .append (group )
119+
120+ return {
121+ "items" : items ,
122+ "count" : g .count ,
123+ "page" : g .page ,
124+ "total" : total ,
125+ "total_page" : math .ceil (total / g .count ),
126+ }
135127
136128
137129@admin_api .route ("/user/<int:uid>/password" , methods = ["PUT" ])
0 commit comments