perf: User grid api

This commit is contained in:
fit2cloud-chenyw
2025-07-16 21:55:55 +08:00
parent a76ebee61a
commit 98a6bbb92a
3 changed files with 29 additions and 9 deletions
+13 -7
View File
@@ -2,7 +2,7 @@ from typing import Optional
from fastapi import APIRouter, Query
from sqlmodel import func, or_, select, delete as sqlmodel_delete
from apps.system.crud.user import get_db_user, single_delete, user_ws_options
from apps.system.models.system_model import UserWsModel, WorkspaceModel
from apps.system.models.system_model import UserWsModel
from apps.system.models.user import UserModel
from apps.system.schemas.auth import CacheName, CacheNamespace
from apps.system.schemas.system_schema import PwdEditor, UserCreator, UserEditor, UserGrid, UserLanguage, UserWs
@@ -20,7 +20,6 @@ async def user_info(current_user: CurrentUser):
@router.get("/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[UserGrid])
async def pager(
session: SessionDep,
trans: Trans,
pageNum: int,
pageSize: int,
keyword: Optional[str] = Query(None, description="搜索关键字(可选)"),
@@ -35,14 +34,21 @@ async def pager(
stmt = (
select(
UserModel,
func.coalesce(func.string_agg(WorkspaceModel.name, ','), '').label("space_name")
func.coalesce(
func.array_remove(
func.array_agg(UserWsModel.oid),
None
),
[]
).label("oid_list")
#func.coalesce(func.string_agg(WorkspaceModel.name, ','), '').label("space_name")
)
.join(UserWsModel, UserModel.id == UserWsModel.uid, isouter=True)
.join(WorkspaceModel, UserWsModel.oid == WorkspaceModel.id, isouter=True)
#.join(WorkspaceModel, UserWsModel.oid == WorkspaceModel.id, isouter=True)
.where(UserModel.id != 1)
.group_by(UserModel.id)
.order_by(UserModel.create_time)
)
if status is not None:
stmt = stmt.where(UserModel.status == status)
@@ -73,7 +79,7 @@ async def pager(
pagination=pagination,
**filters)
for item in user_page.items:
""" for item in user_page.items:
space_name: str = item['space_name']
if space_name and 'i18n_default_workspace' in space_name:
parts = list(map(
@@ -81,7 +87,7 @@ async def pager(
space_name.split(',')
))
output_str = ','.join(parts)
item['space_name'] = output_str
item['space_name'] = output_str """
return user_page
@router.get("/ws")
+1 -1
View File
@@ -38,7 +38,7 @@ class UserEditor(UserCreator, BaseCreatorDTO):
class UserGrid(UserEditor):
create_time: int
language: str = "zh-CN"
space_name: Optional[str] = None
#space_name: Optional[str] = None
origin: str = ''
+15 -1
View File
@@ -66,7 +66,11 @@
<el-table-column prop="email" :label="$t('user.email')" width="280" />
<!-- <el-table-column prop="phone" :label="$t('user.phone_number')" width="280" /> -->
<!-- <el-table-column prop="user_source" :label="$t('user.user_source')" width="280" /> -->
<el-table-column prop="space_name" :label="$t('user.workspace')" width="280" />
<el-table-column prop="oid_list" :label="$t('user.workspace')" width="280">
<template #default="scope">
<span>{{ formatSpaceName(scope.row.oid_list) }}</span>
</template>
</el-table-column>
<el-table-column prop="create_time" width="180" sortable :label="$t('user.creation_time')">
<template #default="scope">
@@ -646,6 +650,16 @@ const handleCurrentChange = (val: number) => {
state.pageInfo.currentPage = val
search()
}
const formatSpaceName = (row_oid_list: Array<any>) => {
if (!row_oid_list?.length) {
return '-'
}
const wsMap: Record<string, string> = {}
options.value.forEach((option: any) => {
wsMap[option.id] = option.name
})
return row_oid_list.map((id: any) => wsMap[id]).join(',')
}
onMounted(() => {
workspaceList().then((res) => {
options.value = res || []