feat(需求): ①用户管理补「角色」筛选(前端+后端 role 参数) ②软件/数字人版本页补版本号搜索 ③全站 el-select 统一 filterable(分组/所属管理员/角色等大下拉可模糊搜索)

This commit is contained in:
2026-09-06 23:43:00 +08:00
parent 970affec95
commit f00fdcd42a
10 changed files with 115 additions and 25 deletions
@@ -93,7 +93,7 @@ async function create(): Promise<void> {
/>
</el-form-item>
<el-form-item v-if="operatorSuper" label="角色">
<el-select v-model="form.role" style="width: 200px">
<el-select filterable v-model="form.role" style="width: 200px">
<el-option v-for="opt in ROLE_CHOICES" :key="opt.value" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
@@ -295,12 +295,12 @@ onMounted(loadMenus)
<el-input v-model="menuForm.name" placeholder="如:用户管理" />
</el-form-item>
<el-form-item label="菜单类型">
<el-select v-model="menuForm.menuType" style="width: 100%" @change="onMenuTypeChange">
<el-select filterable v-model="menuForm.menuType" style="width: 100%" @change="onMenuTypeChange">
<el-option v-for="opt in MENU_TYPE_OPTIONS" :key="opt.value" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
<el-form-item label="父菜单">
<el-select v-model="menuForm.parentId" clearable placeholder="无(一级菜单)" style="width: 100%">
<el-select filterable v-model="menuForm.parentId" clearable placeholder="无(一级菜单)" style="width: 100%">
<el-option
v-for="node in parentOptions"
:key="node.id"
@@ -139,10 +139,17 @@ onMounted(loadUsers)
</div>
<div v-if="isSuperAdmin" class="form-group" style="min-width: 160px">
<label>所属管理员</label>
<select v-model="filters.createdByAdminId">
<option value="">全部</option>
<option v-for="admin in admins" :key="admin.id" :value="admin.id">{{ admin.username }}</option>
</select>
<el-select v-model="filters.createdByAdminId" class="admin-filter" filterable clearable placeholder="全部" @change="search">
<el-option v-for="admin in admins" :key="admin.id" :label="admin.username" :value="admin.id" />
</el-select>
</div>
<div class="form-group" style="min-width: 140px">
<label>角色</label>
<el-select v-model="filters.role" class="admin-filter" filterable clearable placeholder="全部角色" @change="search">
<el-option label="超级管理员" value="super_admin" />
<el-option label="管理员" value="admin" />
<el-option label="普通账号" value="normal" />
</el-select>
</div>
<button class="btn" type="button" @click="search">查询</button>
</div>
@@ -7,18 +7,20 @@ export interface UserFilterState {
keyword: string
/** 按创建管理员过滤(可选)。 */
createdByAdminId: number | null
/** 角色过滤(''=全部;super_admin/admin/normal)。 */
role: string
page: number
pageSize: number
}
export function createUserFilterState(): UserFilterState {
return { keyword: '', createdByAdminId: null, page: USER_PAGE_MIN_PAGE, pageSize: USER_PAGE_DEFAULT_SIZE }
return { keyword: '', createdByAdminId: null, role: '', page: USER_PAGE_MIN_PAGE, pageSize: USER_PAGE_DEFAULT_SIZE }
}
/** 修改筛选条件时重置回第一页(避免停在可能越界的旧页)。 */
export function withFilterReset(
state: UserFilterState,
next: Partial<Pick<UserFilterState, 'keyword' | 'createdByAdminId'>>,
next: Partial<Pick<UserFilterState, 'keyword' | 'createdByAdminId' | 'role'>>,
): UserFilterState {
return { ...state, ...next, page: USER_PAGE_MIN_PAGE }
}
@@ -36,10 +38,13 @@ export function isFilterActive(state: UserFilterState): boolean {
/** 页面状态 → 查询适配层参数(空关键字不下发)。 */
export function toUserListParams(state: UserFilterState): UserListParams {
const keyword = state.keyword.trim()
return {
const params: UserListParams = {
page: state.page,
pageSize: state.pageSize,
keyword: keyword || undefined,
createdById: state.createdByAdminId,
}
const role = (state.role || '').trim()
if (role) params.role = role
return params
}