This commit is contained in:
2025-10-05 16:44:01 +08:00
parent de21261b1b
commit 68a14aad28
2 changed files with 31 additions and 5 deletions

View File

@@ -86,9 +86,10 @@ export function getUserList(
limit = 10, limit = 10,
type = "", type = "",
keyword: string, keyword: string,
orderBy = "",
) { ) {
return http.get("admin/user", { return http.get("admin/user", {
params: { paging: true, offset, limit, keyword, type }, params: { paging: true, offset, limit, keyword, type, order_by: orderBy },
}) })
} }

View File

@@ -22,12 +22,14 @@ const message = useMessage()
interface UserQuery { interface UserQuery {
keyword: string keyword: string
type: string type: string
orderBy: string
} }
// 使用分页 composable // 使用分页 composable
const { query } = usePagination<UserQuery>({ const { query, clearQuery } = usePagination<UserQuery>({
keyword: useRouteQuery("keyword", "").value, keyword: useRouteQuery("keyword", "").value,
type: useRouteQuery("type", "").value, type: useRouteQuery("type", "").value,
orderBy: useRouteQuery("orderBy", "").value,
}) })
const total = ref(0) const total = ref(0)
@@ -39,6 +41,12 @@ const adminOptions = [
{ label: "管理员", value: USER_TYPE.ADMIN }, { label: "管理员", value: USER_TYPE.ADMIN },
{ label: "超级管理员", value: USER_TYPE.SUPER_ADMIN }, { label: "超级管理员", value: USER_TYPE.SUPER_ADMIN },
] ]
const sortOptions = [
{ label: "默认排序", value: "" },
{ label: "最近登录", value: "-last_login" },
{ label: "最早登录", value: "last_login" },
]
const [create, toggleCreate] = useToggle(false) const [create, toggleCreate] = useToggle(false)
const password = ref("") const password = ref("")
const userIDs = ref<DataTableRowKey[]>([]) const userIDs = ref<DataTableRowKey[]>([])
@@ -112,7 +120,13 @@ const problemPermissionOptions: SelectOption[] = [
async function listUsers() { async function listUsers() {
if (query.page < 1) query.page = 1 if (query.page < 1) query.page = 1
const offset = (query.page - 1) * query.limit const offset = (query.page - 1) * query.limit
const res = await getUserList(offset, query.limit, query.type, query.keyword) const res = await getUserList(
offset,
query.limit,
query.type,
query.keyword,
query.orderBy,
)
total.value = res.data.total total.value = res.data.total
users.value = res.data.results users.value = res.data.results
} }
@@ -208,7 +222,7 @@ onMounted(listUsers)
watchDebounced(() => query.keyword, listUsers, { debounce: 500, maxWait: 1000 }) watchDebounced(() => query.keyword, listUsers, { debounce: 500, maxWait: 1000 })
// 监听其他查询条件变化 // 监听其他查询条件变化
watch(() => [query.page, query.limit, query.type], listUsers) watch(() => [query.page, query.limit, query.type, query.orderBy], listUsers)
</script> </script>
<template> <template>
@@ -231,6 +245,12 @@ watch(() => [query.page, query.limit, query.type], listUsers)
确定删除选中的用户吗删除后无法恢复 确定删除选中的用户吗删除后无法恢复
</n-popconfirm> </n-popconfirm>
<n-flex align="center"> <n-flex align="center">
<n-select
v-model:value="query.orderBy"
:options="sortOptions"
placeholder="排序方式"
style="width: 120px"
/>
<n-select <n-select
v-model:value="query.type" v-model:value="query.type"
:options="adminOptions" :options="adminOptions"
@@ -238,7 +258,12 @@ watch(() => [query.page, query.limit, query.type], listUsers)
style="width: 120px" style="width: 120px"
/> />
<div> <div>
<n-input style="width: 200px" v-model:value="query.keyword" /> <n-input
style="width: 200px"
v-model:value="query.keyword"
clearable
@clear="clearQuery"
/>
</div> </div>
</n-flex> </n-flex>
</n-flex> </n-flex>