feat(admin): 用户管理新增分组列、分组筛选与专属分组一键替换

- 新增分组列:展示用户的专属/公开分组,支持 hover 查看详情
- 新增分组筛选:下拉选择或模糊搜索分组名过滤用户
- 专属分组替换:点击专属分组弹出操作菜单,选择目标分组后
  自动授予新分组权限、迁移绑定的 Key、移除旧分组权限
- 后端新增 POST /admin/users/:id/replace-group 端点,事务内
  完成分组替换并失效认证缓存
This commit is contained in:
QTom
2026-03-18 23:28:11 +08:00
parent 0236b97d49
commit ba7d2aecbb
29 changed files with 594 additions and 9 deletions

View File

@@ -21,6 +21,7 @@ export async function list(
status?: 'active' | 'disabled'
role?: 'admin' | 'user'
search?: string
group_name?: string // fuzzy filter by allowed group name
attributes?: Record<number, string> // attributeId -> value
include_subscriptions?: boolean
},
@@ -35,6 +36,7 @@ export async function list(
status: filters?.status,
role: filters?.role,
search: filters?.search,
group_name: filters?.group_name,
include_subscriptions: filters?.include_subscriptions
}
@@ -223,6 +225,25 @@ export async function getUserBalanceHistory(
return data
}
/**
* Replace user's exclusive group
* @param userId - User ID
* @param oldGroupId - Current group ID to replace
* @param newGroupId - New group ID to replace with
* @returns Number of migrated keys
*/
export async function replaceGroup(
userId: number,
oldGroupId: number,
newGroupId: number
): Promise<{ migrated_keys: number }> {
const { data } = await apiClient.post<{ migrated_keys: number }>(
`/admin/users/${userId}/replace-group`,
{ old_group_id: oldGroupId, new_group_id: newGroupId }
)
return data
}
export const usersAPI = {
list,
getById,
@@ -234,7 +255,8 @@ export const usersAPI = {
toggleStatus,
getUserApiKeys,
getUserUsageStats,
getUserBalanceHistory
getUserBalanceHistory,
replaceGroup
}
export default usersAPI