diff --git a/frontend/src/stores/admin-api-key.ts b/frontend/src/stores/admin-api-key.ts new file mode 100644 index 0000000..15a7dd1 --- /dev/null +++ b/frontend/src/stores/admin-api-key.ts @@ -0,0 +1,85 @@ +import { api } from '@/utils/request' +import type { PaginatedData, ApiKeyRecord, AdminApiKeyFilters } from '@/types/api' + +export const useAdminApiKeyStore = defineStore('admin-api-key', () => { + const keys = ref([]) + const loading = ref(false) + const pagination = reactive({ + page: 1, + per_page: 15, + total: 0, + }) + const filters = reactive({ + user_id: undefined, + enabled: undefined, + }) + + async function fetchAllKeys() { + loading.value = true + try { + const data = await api.get>('/api/v1/admin/api-keys', { + page: pagination.page, + per_page: pagination.per_page, + user_id: filters.user_id, + enabled: filters.enabled, + }) + keys.value = data.items + pagination.total = data.total + pagination.page = data.page + } catch (err: unknown) { + const msg = err instanceof Error ? err.message : '获取 API Key 列表失败' + message.error(msg) + } finally { + loading.value = false + } + } + + async function toggleKey(id: number, enabled: boolean) { + try { + await api.patch(`/api/v1/admin/api-keys/${id}/toggle`, { enabled }) + await fetchAllKeys() + } catch (err: unknown) { + const msg = err instanceof Error ? err.message : '操作失败' + message.error(msg) + } + } + + async function deleteKey(id: number) { + try { + await api.delete(`/api/v1/admin/api-keys/${id}`) + await fetchAllKeys() + message.success('已删除') + } catch (err: unknown) { + const msg = err instanceof Error ? err.message : '删除失败' + message.error(msg) + } + } + + async function toggleUserApiKeyEnabled(userId: number, enabled: boolean) { + try { + await api.patch(`/api/v1/users/${userId}/api-key-enabled`, { enabled }) + await fetchAllKeys() + } catch (err: unknown) { + const msg = err instanceof Error ? err.message : '操作失败' + message.error(msg) + } + } + + function resetFilters() { + filters.user_id = undefined + filters.enabled = undefined + pagination.page = 1 + } + + return { + keys, + loading, + pagination, + filters, + fetchAllKeys, + toggleKey, + deleteKey, + toggleUserApiKeyEnabled, + resetFilters, + } +}) diff --git a/frontend/src/types/api.ts b/frontend/src/types/api.ts index 77f59c5..4d6a3bd 100644 --- a/frontend/src/types/api.ts +++ b/frontend/src/types/api.ts @@ -328,6 +328,11 @@ export interface ApiKeyCreateResult { api_key: ApiKeyRecord } +export interface AdminApiKeyFilters { + user_id: number | undefined + enabled: boolean | undefined +} + /** 业务异常 */ export class ApiError extends Error { code: number