import { ref, computed } from 'vue' import { ElMessage } from 'element-plus' /** * API 请求封装 * @param apiFunc - API 请求函数 * @param options - 配置选项 */ export function useApi( apiFunc: (...args: any[]) => Promise, options: { showError?: boolean showSuccess?: boolean successMessage?: string errorMessage?: string } = {} ) { const { showError = true, showSuccess = false, successMessage, errorMessage } = options const loading = ref(false) const data = ref(null) const error = ref(null) const execute = async (...args: any[]) => { loading.value = true error.value = null try { const response = await apiFunc(...args) if (!response.ok) { throw new Error(`HTTP ${response.status}`) } const result = await response.json() if (result.success || response.ok) { data.value = result if (showSuccess) { ElMessage.success(successMessage || result.message || '操作成功') } return result } else { if (showError) { ElMessage.error(errorMessage || result.message || '操作失败') } throw new Error(result.message || '操作失败') } } catch (err: any) { error.value = err if (showError) { ElMessage.error(errorMessage || err.message || '请求失败') } throw err } finally { loading.value = false } } return { loading: computed(() => loading.value), data: computed(() => data.value), error: computed(() => error.value), execute, } } /** * 简单的 CRUD 操作封装 */ export function useCrud(baseUrl: string) { const API_BASE = baseUrl const fetchList = async (params?: any) => { const query = params ? '?' + new URLSearchParams(params).toString() : '' const response = await fetch(`${API_BASE}${query}`) const result = await response.json() return result } const fetchById = async (id: string) => { const response = await fetch(`${API_BASE}/${id}`) const result = await response.json() return result } const create = async (data: Partial) => { const response = await fetch(API_BASE, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }) const result = await response.json() return result } const update = async (id: string, data: Partial) => { const response = await fetch(`${API_BASE}/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }) const result = await response.json() return result } const remove = async (id: string) => { const response = await fetch(`${API_BASE}/${id}`, { method: 'DELETE', }) return response.ok } return { fetchList, fetchById, create, update, remove, } }