用户管理增加查找筛选
后台用户列表此前仅分页,数据量大时无法定位用户。 - 后端:List 新增 ListQuery(关键词 + 状态),抽出 applyUserFilter 对总数与列表查询统一加筛选;关键词为纯数字时同时按用户 ID 精确匹配, 否则按手机号/昵称模糊匹配 - 前端:AdminUsersView 新增筛选栏(关键词:手机号/昵称/用户ID, 状态:正常/已冻结/已禁用),回车/清空/选择即查,查询重置到第 1 页 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
e75a39b03a
commit
a88008f783
@@ -1,7 +1,8 @@
|
||||
<script setup lang="ts">
|
||||
import { readError } from '@/shared/utils/error'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { ref } from 'vue'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { reactive, ref } from 'vue'
|
||||
|
||||
import {
|
||||
fetchAdminUsers,
|
||||
@@ -9,6 +10,7 @@ import {
|
||||
setAdminUserDepositFreeQuota,
|
||||
unfreezeAdminUser,
|
||||
type AdminUserItem,
|
||||
type AdminUserQuery,
|
||||
} from '@/features/admin/api/adminUsers'
|
||||
import { centToYuan, formatCent, yuanToCent } from '@/shared/utils/money'
|
||||
import { useAdminPaginatedTable } from '@/features/admin/composables/useAdminPaginatedTable'
|
||||
@@ -22,6 +24,11 @@ const quotaUser = ref<AdminUserItem | null>(null)
|
||||
const freezeReason = ref('')
|
||||
const quotaAmount = ref(0)
|
||||
|
||||
const filters = reactive<AdminUserQuery>({
|
||||
keyword: '',
|
||||
status: '',
|
||||
})
|
||||
|
||||
const {
|
||||
loading,
|
||||
data: users,
|
||||
@@ -30,9 +37,20 @@ const {
|
||||
currentPageSize,
|
||||
load: loadUsers,
|
||||
} = useAdminPaginatedTable<AdminUserItem>({
|
||||
fetchFn: fetchAdminUsers,
|
||||
fetchFn: (page, pageSize) => fetchAdminUsers(page, pageSize, filters),
|
||||
})
|
||||
|
||||
function queryUsers() {
|
||||
currentPage.value = 1
|
||||
void loadUsers()
|
||||
}
|
||||
|
||||
function resetFilters() {
|
||||
filters.keyword = ''
|
||||
filters.status = ''
|
||||
queryUsers()
|
||||
}
|
||||
|
||||
function openFreeze(row: AdminUserItem) {
|
||||
activeUser.value = row
|
||||
freezeReason.value = ''
|
||||
@@ -102,7 +120,41 @@ function moneyCent(value: number | string | undefined) {
|
||||
<el-button @click="loadUsers">刷新</el-button>
|
||||
</div>
|
||||
|
||||
<el-table v-loading="loading" class="table-panel" :data="users">
|
||||
<div class="user-filter-bar">
|
||||
<el-form inline @submit.prevent>
|
||||
<el-form-item label="关键词">
|
||||
<el-input
|
||||
v-model="filters.keyword"
|
||||
clearable
|
||||
placeholder="手机号 / 昵称 / 用户ID"
|
||||
style="width: 220px"
|
||||
@keyup.enter="queryUsers"
|
||||
@clear="queryUsers"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-select
|
||||
v-model="filters.status"
|
||||
clearable
|
||||
placeholder="全部状态"
|
||||
style="width: 140px"
|
||||
@change="queryUsers"
|
||||
>
|
||||
<el-option label="正常" value="active" />
|
||||
<el-option label="已冻结" value="frozen" />
|
||||
<el-option label="已禁用" value="disabled" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" :icon="Search" :loading="loading" @click="queryUsers"
|
||||
>查询</el-button
|
||||
>
|
||||
<el-button @click="resetFilters">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<el-table v-loading="loading" class="table-panel" :data="users" empty-text="未找到匹配的用户">
|
||||
<el-table-column prop="id" label="用户ID" width="80" />
|
||||
<el-table-column prop="nickname" label="昵称" min-width="130" />
|
||||
<el-table-column prop="phone" label="手机号" min-width="130" />
|
||||
@@ -209,3 +261,16 @@ function moneyCent(value: number | string | undefined) {
|
||||
</el-dialog>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.user-filter-bar {
|
||||
margin-bottom: 16px;
|
||||
padding: 16px 16px 0;
|
||||
border-radius: 8px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.user-filter-bar :deep(.el-form-item) {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user