From 4cdf6bade8cbb5033b02467375e0a30e12e24b34 Mon Sep 17 00:00:00 2001 From: Chaos Date: Tue, 2 Dec 2025 11:45:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(app):=20=E5=AE=9E=E7=8E=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复用户列表分页参数获取错误的问题 - 添加搜索和角色筛选功能 - 实现批量删除和封禁用户操作 - 优化页面布局和样式 - 添加调试日志输出 - 更新图标资源库 - 修复API客户端请求头传递问题 - 调整侧边栏导航样式和结构 - 减少模拟数据加载时间 - 添加COOKIE常量引用 --- src/lib/api/httpClient.ts | 5 +- src/lib/api/services/roleService.ts | 2 +- src/lib/api/services/userService.ts | 24 +- src/lib/components/icon/Sprite.svelte | 49 +-- .../components/layout/app/AppSidebar.svelte | 136 +++---- src/lib/components/table/UsersTable.svelte | 361 ++++++------------ src/lib/types/icon-ids.ts | 6 +- src/routes/app/+layout.svelte | 9 +- .../app/settings/auth/users/+page.server.ts | 5 +- .../app/settings/auth/users/+page.svelte | 157 ++++++-- 10 files changed, 344 insertions(+), 410 deletions(-) diff --git a/src/lib/api/httpClient.ts b/src/lib/api/httpClient.ts index 4086328..ef60050 100644 --- a/src/lib/api/httpClient.ts +++ b/src/lib/api/httpClient.ts @@ -1,8 +1,9 @@ import { ofetch, type FetchOptions, type SearchParameters } from 'ofetch'; import { log } from '$lib/log'; +import { COOKIE_TOKEN_KEY } from '$lib/components/constants/cookiesConstants.ts'; // 1. 定义更安全的类型,替代 any -type QueryParams = SearchParameters; // 使用 ofetch 内置的查询参数类型,或者自定义 Record +type QueryParams = SearchParameters; type RequestBody = Record | FormData | unknown[]; // 替代 any,使用 unknown export interface ApiResult { @@ -19,12 +20,14 @@ const client = ofetch.create({ onRequest({ options, request }) { log.debug(`[API] ${options.method} ${request}`, { body: options.body as unknown, // 类型断言为 unknown 避免隐式 any + headers: options.headers, query: options.query }); }, onResponseError({ request, response }) { log.error(`[API] Error ${request}`, { status: response.status, + headers: response.headers, data: response._data as unknown }); } diff --git a/src/lib/api/services/roleService.ts b/src/lib/api/services/roleService.ts index 727deec..8d03e44 100644 --- a/src/lib/api/services/roleService.ts +++ b/src/lib/api/services/roleService.ts @@ -5,7 +5,7 @@ import { log } from '$lib/log.ts'; export const roleService = { getRolesOptions: async (token:string) => { - const response = await api.get('/roles/options', {headers: {Authorization: `${token}`}}); + const response = await api.get('/roles/options',undefined, {headers: {Authorization: `${token}`}}); if (response.code != 200 || !response.data){ log.error(response.msg); throw new Error(response.msg); diff --git a/src/lib/api/services/userService.ts b/src/lib/api/services/userService.ts index 7e0b3d1..1e6d0d0 100644 --- a/src/lib/api/services/userService.ts +++ b/src/lib/api/services/userService.ts @@ -1,29 +1,31 @@ import { api } from '$lib/api/httpClient.ts'; import type { UserProfile } from '$lib/types/user.ts'; import type { PageResult } from '$lib/types/dataTable.ts'; +import { type SearchParameters } from 'ofetch'; + +// 1. 定义更安全的类型,替代 any +type QueryParams = SearchParameters; export const userService = { getUserProfile: async (token:string) => { - const response = await api.get('/users/me', {headers: {Authorization: `${token}`}}); + const response = await api.get('/users/me',undefined, {headers: {Authorization: `${token}`}}); if (response.code != 200 || !response.data){ throw new Error(response.msg); } return response.data; }, getAllUsers: async ({ page, size,token , keyword, roleId}: { page: number, size: number, token:string , keyword?: string, roleId?: number}) => { - const formData = new FormData(); - formData.append('pageNum', page.toString()); - formData.append('pageSize', size.toString()); - if ( keyword){ - formData.append('keyword', keyword); - } - if ( roleId){ - formData.append('roleId', roleId.toString()); - } + + const params: QueryParams= { + pageNum: page, + pageSize: size, + ...(keyword && { keyword }), + ...(roleId && { roleId }) + } ; const response = await api.get>( '/users', + params, { - body: formData, headers: {Authorization: `${token}`} }); if (response.code != 200 || !response.data){ diff --git a/src/lib/components/icon/Sprite.svelte b/src/lib/components/icon/Sprite.svelte index 62af56e..f79d739 100644 --- a/src/lib/components/icon/Sprite.svelte +++ b/src/lib/components/icon/Sprite.svelte @@ -1,5 +1,5 @@ @@ -56,39 +56,6 @@ - @@ -120,14 +87,14 @@ - - - - + - - - + + + + + + \ No newline at end of file diff --git a/src/lib/components/layout/app/AppSidebar.svelte b/src/lib/components/layout/app/AppSidebar.svelte index d50e87f..fb06888 100644 --- a/src/lib/components/layout/app/AppSidebar.svelte +++ b/src/lib/components/layout/app/AppSidebar.svelte @@ -123,77 +123,79 @@ let menuItems = $derived(computeNavState(rawNavItems, page.url.pathname, expandedIds)); -
- -
-
- 12312 -
- -