update: 优化api

This commit is contained in:
ctwj
2025-07-21 21:24:50 +08:00
parent c54a78c67f
commit 21e2779d28
18 changed files with 180 additions and 832 deletions

View File

@@ -1,3 +1,6 @@
import { useApiFetch } from './useApiFetch'
import { useUserStore } from '~/stores/user'
// 统一响应解析函数 // 统一响应解析函数
export const parseApiResponse = <T>(response: any): T => { export const parseApiResponse = <T>(response: any): T => {
console.log('parseApiResponse - 原始响应:', response) console.log('parseApiResponse - 原始响应:', response)
@@ -37,700 +40,112 @@ export const parseApiResponse = <T>(response: any): T => {
return response return response
} }
// 使用 $fetch 替代 axios更好地处理 SSR
export const useResourceApi = () => { export const useResourceApi = () => {
const config = useRuntimeConfig() const getResources = (params?: any) => useApiFetch('/resources', { params }).then(parseApiResponse)
const getResource = (id: number) => useApiFetch(`/resources/${id}`).then(parseApiResponse)
const getAuthHeaders = () => { const createResource = (data: any) => useApiFetch('/resources', { method: 'POST', body: data }).then(parseApiResponse)
const userStore = useUserStore() const updateResource = (id: number, data: any) => useApiFetch(`/resources/${id}`, { method: 'PUT', body: data }).then(parseApiResponse)
return userStore.authHeaders const deleteResource = (id: number) => useApiFetch(`/resources/${id}`, { method: 'DELETE' }).then(parseApiResponse)
} const searchResources = (params: any) => useApiFetch('/search', { params }).then(parseApiResponse)
const getResourcesByPan = (panId: number, params?: any) => useApiFetch('/resources', { params: { ...params, pan_id: panId } }).then(parseApiResponse)
const getResources = async (params?: any) => { return { getResources, getResource, createResource, updateResource, deleteResource, searchResources, getResourcesByPan }
const response = await $fetch('/resources', {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getResource = async (id: number) => {
const response = await $fetch(`/resources/${id}`, {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createResource = async (data: any) => {
const response = await $fetch('/resources', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const updateResource = async (id: number, data: any) => {
const response = await $fetch(`/resources/${id}`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deleteResource = async (id: number) => {
const response = await $fetch(`/resources/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const searchResources = async (params: any) => {
const response = await $fetch('/search', {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getResourcesByPan = async (panId: number, params?: any) => {
const response = await $fetch('/resources', {
baseURL: config.public.apiBase,
params: { ...params, pan_id: panId },
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getResources,
getResource,
createResource,
updateResource,
deleteResource,
searchResources,
getResourcesByPan,
}
} }
// 认证相关API
export const useAuthApi = () => { export const useAuthApi = () => {
const config = useRuntimeConfig() const login = (data: any) => useApiFetch('/auth/login', { method: 'POST', body: data }).then(parseApiResponse)
const register = (data: any) => useApiFetch('/auth/register', { method: 'POST', body: data }).then(parseApiResponse)
const login = async (data: any) => { const getProfile = () => {
const response = await $fetch('/auth/login', { const token = typeof window !== 'undefined' ? localStorage.getItem('token') : ''
baseURL: config.public.apiBase, return useApiFetch('/auth/profile', { headers: token ? { Authorization: `Bearer ${token}` } : {} }).then(parseApiResponse)
method: 'POST',
body: data
})
return parseApiResponse(response)
}
const register = async (data: any) => {
const response = await $fetch('/auth/register', {
baseURL: config.public.apiBase,
method: 'POST',
body: data
})
return parseApiResponse(response)
}
const getProfile = async () => {
const token = localStorage.getItem('token')
const response = await $fetch('/auth/profile', {
baseURL: config.public.apiBase,
headers: token ? { Authorization: `Bearer ${token}` } : {}
})
return parseApiResponse(response)
}
return {
login,
register,
getProfile,
} }
return { login, register, getProfile }
} }
// 分类相关API
export const useCategoryApi = () => { export const useCategoryApi = () => {
const config = useRuntimeConfig() const getCategories = () => useApiFetch('/categories').then(parseApiResponse)
const createCategory = (data: any) => useApiFetch('/categories', { method: 'POST', body: data }).then(parseApiResponse)
const getAuthHeaders = () => { const updateCategory = (id: number, data: any) => useApiFetch(`/categories/${id}`, { method: 'PUT', body: data }).then(parseApiResponse)
const userStore = useUserStore() const deleteCategory = (id: number) => useApiFetch(`/categories/${id}`, { method: 'DELETE' }).then(parseApiResponse)
return userStore.authHeaders return { getCategories, createCategory, updateCategory, deleteCategory }
}
const getCategories = async () => {
const response = await $fetch('/categories', {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createCategory = async (data: any) => {
const response = await $fetch('/categories', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const updateCategory = async (id: number, data: any) => {
const response = await $fetch(`/categories/${id}`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deleteCategory = async (id: number) => {
const response = await $fetch(`/categories/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getCategories,
createCategory,
updateCategory,
deleteCategory,
}
} }
// 平台相关API
export const usePanApi = () => { export const usePanApi = () => {
const config = useRuntimeConfig() const getPans = () => useApiFetch('/pans').then(parseApiResponse)
const getPan = (id: number) => useApiFetch(`/pans/${id}`).then(parseApiResponse)
const getAuthHeaders = () => { const createPan = (data: any) => useApiFetch('/pans', { method: 'POST', body: data }).then(parseApiResponse)
const userStore = useUserStore() const updatePan = (id: number, data: any) => useApiFetch(`/pans/${id}`, { method: 'PUT', body: data }).then(parseApiResponse)
return userStore.authHeaders const deletePan = (id: number) => useApiFetch(`/pans/${id}`, { method: 'DELETE' }).then(parseApiResponse)
} return { getPans, getPan, createPan, updatePan, deletePan }
const getPans = async () => {
const response = await $fetch('/pans', {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getPan = async (id: number) => {
const response = await $fetch(`/pans/${id}`, {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createPan = async (data: any) => {
const response = await $fetch('/pans', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const updatePan = async (id: number, data: any) => {
const response = await $fetch(`/pans/${id}`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deletePan = async (id: number) => {
const response = await $fetch(`/pans/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getPans,
getPan,
createPan,
updatePan,
deletePan,
}
} }
// Cookie相关API
export const useCksApi = () => { export const useCksApi = () => {
const config = useRuntimeConfig() const getCks = (params?: any) => useApiFetch('/cks', { params }).then(parseApiResponse)
const getCksByID = (id: number) => useApiFetch(`/cks/${id}`).then(parseApiResponse)
const getAuthHeaders = () => { const createCks = (data: any) => useApiFetch('/cks', { method: 'POST', body: data }).then(parseApiResponse)
const userStore = useUserStore() const updateCks = (id: number, data: any) => useApiFetch(`/cks/${id}`, { method: 'PUT', body: data }).then(parseApiResponse)
return userStore.authHeaders const deleteCks = (id: number) => useApiFetch(`/cks/${id}`, { method: 'DELETE' }).then(parseApiResponse)
} const refreshCapacity = (id: number) => useApiFetch(`/cks/${id}/refresh-capacity`, { method: 'POST' }).then(parseApiResponse)
return { getCks, getCksByID, createCks, updateCks, deleteCks, refreshCapacity }
const getCks = async (params?: any) => {
const response = await $fetch('/cks', {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getCksByID = async (id: number) => {
const response = await $fetch(`/cks/${id}`, {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createCks = async (data: any) => {
const response = await $fetch('/cks', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const updateCks = async (id: number, data: any) => {
const response = await $fetch(`/cks/${id}`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deleteCks = async (id: number) => {
const response = await $fetch(`/cks/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const refreshCapacity = async (id: number) => {
const response = await $fetch(`/cks/${id}/refresh-capacity`, {
baseURL: config.public.apiBase,
method: 'POST',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getCks,
getCksByID,
createCks,
updateCks,
deleteCks,
refreshCapacity,
}
} }
// 标签相关API
export const useTagApi = () => { export const useTagApi = () => {
const config = useRuntimeConfig() const getTags = () => useApiFetch('/tags').then(parseApiResponse)
const getTagsByCategory = (categoryId: number, params?: any) => useApiFetch(`/categories/${categoryId}/tags`, { params }).then(parseApiResponse)
const getAuthHeaders = () => { const getTag = (id: number) => useApiFetch(`/tags/${id}`).then(parseApiResponse)
const userStore = useUserStore() const createTag = (data: any) => useApiFetch('/tags', { method: 'POST', body: data }).then(parseApiResponse)
return userStore.authHeaders const updateTag = (id: number, data: any) => useApiFetch(`/tags/${id}`, { method: 'PUT', body: data }).then(parseApiResponse)
} const deleteTag = (id: number) => useApiFetch(`/tags/${id}`, { method: 'DELETE' }).then(parseApiResponse)
const getResourceTags = (resourceId: number) => useApiFetch(`/resources/${resourceId}/tags`).then(parseApiResponse)
const getTags = async () => { return { getTags, getTagsByCategory, getTag, createTag, updateTag, deleteTag, getResourceTags }
const response = await $fetch('/tags', {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getTagsByCategory = async (categoryId: number, params?: any) => {
const response = await $fetch(`/categories/${categoryId}/tags`, {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getTag = async (id: number) => {
const response = await $fetch(`/tags/${id}`, {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createTag = async (data: any) => {
const response = await $fetch('/tags', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const updateTag = async (id: number, data: any) => {
const response = await $fetch(`/tags/${id}`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deleteTag = async (id: number) => {
const response = await $fetch(`/tags/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getResourceTags = async (resourceId: number) => {
const response = await $fetch(`/resources/${resourceId}/tags`, {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getTags,
getTagsByCategory,
getTag,
createTag,
updateTag,
deleteTag,
getResourceTags,
}
} }
// 待处理资源相关API
export const useReadyResourceApi = () => { export const useReadyResourceApi = () => {
const config = useRuntimeConfig() const getReadyResources = (params?: any) => useApiFetch('/ready-resources', { params }).then(parseApiResponse)
const createReadyResource = (data: any) => useApiFetch('/ready-resources', { method: 'POST', body: data }).then(parseApiResponse)
const getAuthHeaders = () => { const batchCreateReadyResources = (data: any) => useApiFetch('/ready-resources/batch', { method: 'POST', body: data }).then(parseApiResponse)
const userStore = useUserStore() const createReadyResourcesFromText = (text: string) => {
return userStore.authHeaders
}
const getReadyResources = async (params?: any) => {
const response = await $fetch('/ready-resources', {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createReadyResource = async (data: any) => {
const response = await $fetch('/ready-resources', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const batchCreateReadyResources = async (data: any) => {
const response = await $fetch('/ready-resources/batch', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createReadyResourcesFromText = async (text: string) => {
const formData = new FormData() const formData = new FormData()
formData.append('text', text) formData.append('text', text)
return useApiFetch('/ready-resources/text', { method: 'POST', body: formData }).then(parseApiResponse)
const response = await $fetch('/ready-resources/text', {
baseURL: config.public.apiBase,
method: 'POST',
body: formData,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deleteReadyResource = async (id: number) => {
const response = await $fetch(`/ready-resources/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const clearReadyResources = async () => {
const response = await $fetch('/ready-resources', {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getReadyResources,
createReadyResource,
batchCreateReadyResources,
createReadyResourcesFromText,
deleteReadyResource,
clearReadyResources,
} }
const deleteReadyResource = (id: number) => useApiFetch(`/ready-resources/${id}`, { method: 'DELETE' }).then(parseApiResponse)
const clearReadyResources = () => useApiFetch('/ready-resources', { method: 'DELETE' }).then(parseApiResponse)
return { getReadyResources, createReadyResource, batchCreateReadyResources, createReadyResourcesFromText, deleteReadyResource, clearReadyResources }
} }
// 统计相关API
export const useStatsApi = () => { export const useStatsApi = () => {
const config = useRuntimeConfig() const getStats = () => useApiFetch('/stats').then(parseApiResponse)
return { getStats }
const getStats = async () => {
const response = await $fetch('/stats', {
baseURL: config.public.apiBase,
})
return parseApiResponse(response)
}
return {
getStats,
}
} }
// 系统配置相关API
export const useSystemConfigApi = () => { export const useSystemConfigApi = () => {
const config = useRuntimeConfig() const getSystemConfig = () => useApiFetch('/system/config').then(parseApiResponse)
const updateSystemConfig = (data: any) => useApiFetch('/system/config', { method: 'POST', body: data }).then(parseApiResponse)
const getAuthHeaders = () => { return { getSystemConfig, updateSystemConfig }
const userStore = useUserStore()
return userStore.authHeaders
}
const getSystemConfig = async () => {
const response = await $fetch('/system/config', {
baseURL: config.public.apiBase,
// GET接口不需要认证头
})
return parseApiResponse(response)
}
const updateSystemConfig = async (data: any) => {
const authHeaders = getAuthHeaders()
console.log('updateSystemConfig - authHeaders:', authHeaders)
console.log('updateSystemConfig - token exists:', !!authHeaders.Authorization)
const response = await $fetch('/system/config', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: authHeaders as Record<string, string>
})
return parseApiResponse(response)
}
return {
getSystemConfig,
updateSystemConfig,
}
} }
// 热播剧相关API
export const useHotDramaApi = () => { export const useHotDramaApi = () => {
const config = useRuntimeConfig() const getHotDramas = (params?: any) => useApiFetch('/hot-dramas', { params }).then(parseApiResponse)
const createHotDrama = (data: any) => useApiFetch('/hot-dramas', { method: 'POST', body: data }).then(parseApiResponse)
const getAuthHeaders = () => { const updateHotDrama = (id: number, data: any) => useApiFetch(`/hot-dramas/${id}`, { method: 'PUT', body: data }).then(parseApiResponse)
const userStore = useUserStore() const deleteHotDrama = (id: number) => useApiFetch(`/hot-dramas/${id}`, { method: 'DELETE' }).then(parseApiResponse)
return userStore.authHeaders const fetchHotDramas = () => useApiFetch('/hot-dramas/fetch', { method: 'POST' }).then(parseApiResponse)
} return { getHotDramas, createHotDrama, updateHotDrama, deleteHotDrama, fetchHotDramas }
const getHotDramas = async (params?: any) => {
const response = await $fetch('/hot-dramas', {
baseURL: config.public.apiBase,
params,
})
return parseApiResponse(response)
}
const createHotDrama = async (data: any) => {
const response = await $fetch('/hot-dramas', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const updateHotDrama = async (id: number, data: any) => {
const response = await $fetch(`/hot-dramas/${id}`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deleteHotDrama = async (id: number) => {
const response = await $fetch(`/hot-dramas/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const fetchHotDramas = async () => {
const response = await $fetch('/hot-dramas/fetch', {
baseURL: config.public.apiBase,
method: 'POST',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getHotDramas,
createHotDrama,
updateHotDrama,
deleteHotDrama,
fetchHotDramas,
}
} }
// 监控相关API
export const useMonitorApi = () => { export const useMonitorApi = () => {
const config = useRuntimeConfig() const getPerformanceStats = () => useApiFetch('/performance').then(parseApiResponse)
const getSystemInfo = () => useApiFetch('/system/info').then(parseApiResponse)
const getPerformanceStats = async () => { const getBasicStats = () => useApiFetch('/stats').then(parseApiResponse)
const response = await $fetch('/performance', { return { getPerformanceStats, getSystemInfo, getBasicStats }
baseURL: config.public.apiBase,
})
return parseApiResponse(response)
}
const getSystemInfo = async () => {
const response = await $fetch('/system/info', {
baseURL: config.public.apiBase,
})
return parseApiResponse(response)
}
const getBasicStats = async () => {
const response = await $fetch('/stats', {
baseURL: config.public.apiBase,
})
return parseApiResponse(response)
}
return {
getPerformanceStats,
getSystemInfo,
getBasicStats,
}
} }
// 用户管理相关API
export const useUserApi = () => { export const useUserApi = () => {
const config = useRuntimeConfig() const getUsers = (params?: any) => useApiFetch('/users', { params }).then(parseApiResponse)
const getUser = (id: number) => useApiFetch(`/users/${id}`).then(parseApiResponse)
const getAuthHeaders = () => { const createUser = (data: any) => useApiFetch('/users', { method: 'POST', body: data }).then(parseApiResponse)
const userStore = useUserStore() const updateUser = (id: number, data: any) => useApiFetch(`/users/${id}`, { method: 'PUT', body: data }).then(parseApiResponse)
return userStore.authHeaders const deleteUser = (id: number) => useApiFetch(`/users/${id}`, { method: 'DELETE' }).then(parseApiResponse)
} const changePassword = (id: number, newPassword: string) => useApiFetch(`/users/${id}/password`, { method: 'PUT', body: { new_password: newPassword } }).then(parseApiResponse)
return { getUsers, getUser, createUser, updateUser, deleteUser, changePassword }
const getUsers = async (params?: any) => {
const response = await $fetch('/users', {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const getUser = async (id: number) => {
const response = await $fetch(`/users/${id}`, {
baseURL: config.public.apiBase,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const createUser = async (data: any) => {
const response = await $fetch('/users', {
baseURL: config.public.apiBase,
method: 'POST',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const updateUser = async (id: number, data: any) => {
const response = await $fetch(`/users/${id}`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: data,
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const deleteUser = async (id: number) => {
const response = await $fetch(`/users/${id}`, {
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
const changePassword = async (id: number, newPassword: string) => {
const response = await $fetch(`/users/${id}/password`, {
baseURL: config.public.apiBase,
method: 'PUT',
body: { new_password: newPassword },
headers: getAuthHeaders() as Record<string, string>
})
return parseApiResponse(response)
}
return {
getUsers,
getUser,
createUser,
updateUser,
deleteUser,
changePassword,
}
} }

View File

@@ -0,0 +1,37 @@
import { useRuntimeConfig } from '#app'
import { useUserStore } from '~/stores/user'
export function useApiFetch<T = any>(
url: string,
options: any = {}
): Promise<T> {
const config = useRuntimeConfig()
const userStore = useUserStore()
const baseURL = process.server
? String(config.public.apiServer)
: String(config.public.apiBase)
// 自动带上 token
const headers = {
...(options.headers || {}),
...(userStore.authHeaders || {})
}
return $fetch<T>(url, {
baseURL,
...options,
headers,
onResponse({ response }) {
// 统一处理 code/message
if (response._data && response._data.code && response._data.code !== 200) {
throw new Error(response._data.message || '请求失败')
}
},
onResponseError({ error }) {
// 统一错误提示
// 你可以用 naive-ui 的 useMessage() 这里弹窗
// useMessage().error(error.message)
throw error
}
})
}

View File

@@ -51,7 +51,7 @@ export default defineNuxtConfig({
}, },
runtimeConfig: { runtimeConfig: {
public: { public: {
apiBase: process.env.NUXT_PUBLIC_API_CLIENT || '/api', apiBase: process.env.NUXT_PUBLIC_API_CLIENT || 'http://localhost:8080/api',
apiServer: process.env.NUXT_PUBLIC_API_SERVER || 'http://localhost:8080/api' apiServer: process.env.NUXT_PUBLIC_API_SERVER || 'http://localhost:8080/api'
} }
}, },

View File

@@ -198,6 +198,8 @@ definePageMeta({
const router = useRouter() const router = useRouter()
const userStore = useUserStore() const userStore = useUserStore()
const config = useRuntimeConfig() const config = useRuntimeConfig()
import { useCategoryApi } from '~/composables/useApi'
const categoryApi = useCategoryApi()
// 页面状态 // 页面状态
const pageLoading = ref(true) const pageLoading = ref(true)
@@ -257,23 +259,10 @@ const fetchCategories = async () => {
page_size: pageSize.value, page_size: pageSize.value,
search: searchQuery.value search: searchQuery.value
} }
const response = await categoryApi.getCategories(params)
const response = await $fetch('/categories', { categories.value = Array.isArray(response) ? response : []
baseURL: config.public.apiBase,
params
})
// 解析响应
if (response && typeof response === 'object' && 'code' in response && response.code === 200) {
categories.value = response.data.items || []
totalCount.value = response.data.total || 0
totalPages.value = Math.ceil(totalCount.value / pageSize.value)
} else {
categories.value = response.items || []
totalCount.value = response.total || 0 totalCount.value = response.total || 0
totalPages.value = Math.ceil(totalCount.value / pageSize.value) totalPages.value = Math.ceil(totalCount.value / pageSize.value)
}
} catch (error) { } catch (error) {
console.error('获取分类列表失败:', error) console.error('获取分类列表失败:', error)
} finally { } finally {
@@ -318,13 +307,8 @@ const deleteCategory = async (categoryId: number) => {
if (!confirm(`确定要删除分类吗?`)) { if (!confirm(`确定要删除分类吗?`)) {
return return
} }
try { try {
await $fetch(`/categories/${categoryId}`, { await categoryApi.deleteCategory(categoryId)
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders()
})
await fetchCategories() await fetchCategories()
} catch (error) { } catch (error) {
console.error('删除分类失败:', error) console.error('删除分类失败:', error)
@@ -335,23 +319,11 @@ const deleteCategory = async (categoryId: number) => {
const handleSubmit = async () => { const handleSubmit = async () => {
try { try {
submitting.value = true submitting.value = true
if (editingCategory.value) { if (editingCategory.value) {
await $fetch(`/categories/${editingCategory.value.id}`, { await categoryApi.updateCategory(editingCategory.value.id, formData.value)
baseURL: config.public.apiBase,
method: 'PUT',
body: formData.value,
headers: getAuthHeaders()
})
} else { } else {
await $fetch('/categories', { await categoryApi.createCategory(formData.value)
baseURL: config.public.apiBase,
method: 'POST',
body: formData.value,
headers: getAuthHeaders()
})
} }
closeModal() closeModal()
await fetchCategories() await fetchCategories()
} catch (error) { } catch (error) {

View File

@@ -315,7 +315,11 @@ const pageLoading = ref(true)
const submitting = ref(false) const submitting = ref(false)
const platform = ref(null) const platform = ref(null)
const { data: pansData } = await useAsyncData('pans', () => $fetch('/api/pans')) import { useCksApi, usePanApi } from '~/composables/useApi'
const cksApi = useCksApi()
const panApi = usePanApi()
const { data: pansData } = await useAsyncData('pans', () => panApi.getPans())
const pans = computed(() => { const pans = computed(() => {
return (pansData.value).data.list || [] return (pansData.value).data.list || []
}) })
@@ -339,8 +343,6 @@ const checkAuth = () => {
const fetchCks = async () => { const fetchCks = async () => {
loading.value = true loading.value = true
try { try {
const { useCksApi } = await import('~/composables/useApi')
const cksApi = useCksApi()
const response = await cksApi.getCks() const response = await cksApi.getCks()
cksList.value = Array.isArray(response) ? response : [] cksList.value = Array.isArray(response) ? response : []
} catch (error) { } catch (error) {
@@ -354,8 +356,6 @@ const fetchCks = async () => {
// 获取平台列表 // 获取平台列表
const fetchPlatforms = async () => { const fetchPlatforms = async () => {
try { try {
const { usePanApi } = await import('~/composables/useApi')
const panApi = usePanApi()
const response = await panApi.getPans() const response = await panApi.getPans()
platforms.value = Array.isArray(response) ? response : [] platforms.value = Array.isArray(response) ? response : []
} catch (error) { } catch (error) {
@@ -367,8 +367,6 @@ const fetchPlatforms = async () => {
const createCks = async () => { const createCks = async () => {
submitting.value = true submitting.value = true
try { try {
const { useCksApi } = await import('~/composables/useApi')
const cksApi = useCksApi()
await cksApi.createCks(form.value) await cksApi.createCks(form.value)
await fetchCks() await fetchCks()
closeModal() closeModal()
@@ -384,8 +382,6 @@ const createCks = async () => {
const updateCks = async () => { const updateCks = async () => {
submitting.value = true submitting.value = true
try { try {
const { useCksApi } = await import('~/composables/useApi')
const cksApi = useCksApi()
await cksApi.updateCks(editingCks.value.id, form.value) await cksApi.updateCks(editingCks.value.id, form.value)
await fetchCks() await fetchCks()
closeModal() closeModal()
@@ -402,8 +398,6 @@ const deleteCks = async (id) => {
if (!confirm('确定要删除这个账号吗?')) return if (!confirm('确定要删除这个账号吗?')) return
try { try {
const { useCksApi } = await import('~/composables/useApi')
const cksApi = useCksApi()
await cksApi.deleteCks(id) await cksApi.deleteCks(id)
await fetchCks() await fetchCks()
} catch (error) { } catch (error) {
@@ -417,8 +411,6 @@ const refreshCapacity = async (id) => {
if (!confirm('确定要刷新此账号的容量信息吗?')) return if (!confirm('确定要刷新此账号的容量信息吗?')) return
try { try {
const { useCksApi } = await import('~/composables/useApi')
const cksApi = useCksApi()
await cksApi.refreshCapacity(id) await cksApi.refreshCapacity(id)
await fetchCks() await fetchCks()
alert('容量信息已刷新!') alert('容量信息已刷新!')

View File

@@ -244,15 +244,17 @@ definePageMeta({
const userStore = useUserStore() const userStore = useUserStore()
// 统计数据 // 统计数据
const { data: statsData } = await useAsyncData('stats', () => $fetch('/api/stats')) import { useStatsApi, usePanApi } from '~/composables/useApi'
const stats = computed(() => (statsData.value as any)?.data || {})
const statsApi = useStatsApi()
const panApi = usePanApi()
const { data: statsData } = await useAsyncData('stats', () => statsApi.getStats())
const stats = computed(() => (statsData.value as any) || {})
// 平台数据 // 平台数据
const { data: pansData } = await useAsyncData('pans', () => $fetch('/api/pans')) const { data: pansData } = await useAsyncData('pans', () => panApi.getPans())
console.log() const pans = computed(() => (pansData.value as any) || [])
const pans = computed(() => {
return (pansData.value as any).data.list || []
})
// 分类管理相关 // 分类管理相关
const goToCategoryManagement = () => { const goToCategoryManagement = () => {

View File

@@ -334,11 +334,8 @@ const totalCount = ref(0)
const totalPages = ref(0) const totalPages = ref(0)
// 获取待处理资源API // 获取待处理资源API
const { useReadyResourceApi } = await import('~/composables/useApi') import { useReadyResourceApi, useSystemConfigApi } from '~/composables/useApi'
const readyResourceApi = useReadyResourceApi() const readyResourceApi = useReadyResourceApi()
// 获取系统配置API
const { useSystemConfigApi } = await import('~/composables/useApi')
const systemConfigApi = useSystemConfigApi() const systemConfigApi = useSystemConfigApi()
// 获取系统配置 // 获取系统配置

View File

@@ -420,10 +420,7 @@ const selectedResources = ref<number[]>([])
const selectAll = ref(false) const selectAll = ref(false)
// API // API
const { useResourceApi } = await import('~/composables/useApi') import { useResourceApi, usePanApi, useCategoryApi, useTagApi } from '~/composables/useApi'
const { usePanApi } = await import('~/composables/useApi')
const { useCategoryApi } = await import('~/composables/useApi')
const { useTagApi } = await import('~/composables/useApi')
const resourceApi = useResourceApi() const resourceApi = useResourceApi()
const panApi = usePanApi() const panApi = usePanApi()

View File

@@ -334,9 +334,10 @@ definePageMeta({
}) })
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { useSystemConfigApi } from '~/composables/useApi'
// API // API
const { getSystemConfig, updateSystemConfig } = useSystemConfigApi() const systemConfigApi = useSystemConfigApi()
// 响应式数据 // 响应式数据
const loading = ref(false) const loading = ref(false)
@@ -388,7 +389,7 @@ useHead({
const loadConfig = async () => { const loadConfig = async () => {
try { try {
loading.value = true loading.value = true
const response = await getSystemConfig() const response = await systemConfigApi.getSystemConfig()
console.log('系统配置响应:', response) console.log('系统配置响应:', response)
// 使用新的统一响应格式直接使用response // 使用新的统一响应格式直接使用response
@@ -441,7 +442,7 @@ const saveConfig = async () => {
api_token: config.value.apiToken // 保存API Token api_token: config.value.apiToken // 保存API Token
} }
const response = await updateSystemConfig(requestData) const response = await systemConfigApi.updateSystemConfig(requestData)
// 使用新的统一响应格式直接检查response是否存在 // 使用新的统一响应格式直接检查response是否存在
if (response) { if (response) {
alert('配置保存成功!') alert('配置保存成功!')

View File

@@ -331,16 +331,8 @@ const checkAuth = () => {
// 获取分类列表 // 获取分类列表
const fetchCategories = async () => { const fetchCategories = async () => {
try { try {
const response = await $fetch('/categories', { const response = await categoryApi.getCategories()
baseURL: config.public.apiBase, categories.value = Array.isArray(response) ? response : []
headers: getAuthHeaders() as Record<string, string>
})
if (response && typeof response === 'object' && 'code' in response && response.code === 200) {
categories.value = (response as any).data?.items || []
} else {
categories.value = (response as any).items || []
}
} catch (error) { } catch (error) {
console.error('获取分类列表失败:', error) console.error('获取分类列表失败:', error)
} }
@@ -355,34 +347,15 @@ const fetchTags = async () => {
page_size: pageSize.value, page_size: pageSize.value,
search: searchQuery.value search: searchQuery.value
} }
let response: any let response: any
if (selectedCategory.value) { if (selectedCategory.value) {
// 如果选择了分类,使用按分类查询的接口 response = await tagApi.getTagsByCategory(selectedCategory.value, params)
response = await $fetch(`/categories/${selectedCategory.value}/tags`, {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
} else { } else {
// 否则使用普通查询接口 response = await tagApi.getTags(params)
response = await $fetch('/tags', {
baseURL: config.public.apiBase,
params,
headers: getAuthHeaders() as Record<string, string>
})
} }
// 解析响应
if (response && typeof response === 'object' && 'code' in response && response.code === 200) {
tags.value = response.data?.items || []
totalCount.value = response.data?.total || 0
totalPages.value = Math.ceil(totalCount.value / pageSize.value)
} else {
tags.value = response.items || [] tags.value = response.items || []
totalCount.value = response.total || 0 totalCount.value = response.total || 0
totalPages.value = Math.ceil(totalCount.value / pageSize.value) totalPages.value = Math.ceil(totalCount.value / pageSize.value)
}
} catch (error) { } catch (error) {
console.error('获取标签列表失败:', error) console.error('获取标签列表失败:', error)
} finally { } finally {
@@ -436,11 +409,7 @@ const deleteTag = async (tagId: number) => {
} }
try { try {
await $fetch(`/tags/${tagId}`, { await tagApi.deleteTag(tagId)
baseURL: config.public.apiBase,
method: 'DELETE',
headers: getAuthHeaders() as Record<string, string>
})
await fetchTags() await fetchTags()
} catch (error) { } catch (error) {
console.error('删除标签失败:', error) console.error('删除标签失败:', error)
@@ -465,19 +434,9 @@ const handleSubmit = async () => {
} }
if (editingTag.value) { if (editingTag.value) {
await $fetch(`/tags/${editingTag.value.id}`, { await tagApi.updateTag(editingTag.value.id, submitData)
baseURL: config.public.apiBase,
method: 'PUT',
body: submitData,
headers: getAuthHeaders() as Record<string, string>
})
} else { } else {
await $fetch('/tags', { await tagApi.createTag(submitData)
baseURL: config.public.apiBase,
method: 'POST',
body: submitData,
headers: getAuthHeaders() as Record<string, string>
})
} }
closeModal() closeModal()

View File

@@ -209,6 +209,8 @@ definePageMeta({
}) })
import { ref, computed, onMounted, watch } from 'vue' import { ref, computed, onMounted, watch } from 'vue'
import { useHotDramaApi } from '~/composables/useApi'
const hotDramaApi = useHotDramaApi()
// 响应式数据 // 响应式数据
const loading = ref(false) const loading = ref(false)
@@ -250,32 +252,20 @@ const averageRating = computed(() => {
const fetchDramas = async () => { const fetchDramas = async () => {
loading.value = true loading.value = true
try { try {
const { useHotDramaApi } = await import('~/composables/useApi')
const hotDramaApi = useHotDramaApi()
const params = { const params = {
page: 1, page: 1,
page_size: 1000 // 获取大量数据,实际会返回所有数据 page_size: 1000
} }
if (selectedCategory.value) { if (selectedCategory.value) {
params.category = selectedCategory.value params.category = selectedCategory.value
} }
const response = await hotDramaApi.getHotDramas(params) const response = await hotDramaApi.getHotDramas(params)
console.log('API响应:', response)
// 使用新的统一响应格式
if (response && response.items) { if (response && response.items) {
dramas.value = response.items dramas.value = response.items
total.value = response.total || 0 total.value = response.total || 0
console.log('设置数据:', dramas.value.length, '条')
console.log('第一条数据:', dramas.value[0])
} else { } else {
// 兼容旧格式
dramas.value = Array.isArray(response) ? response : [] dramas.value = Array.isArray(response) ? response : []
total.value = dramas.value.length total.value = dramas.value.length
console.log('兼容格式数据:', dramas.value.length, '条')
} }
} catch (error) { } catch (error) {
console.error('获取热播剧列表失败:', error) console.error('获取热播剧列表失败:', error)

View File

@@ -250,7 +250,12 @@ useHead({
// 获取运行时配置 // 获取运行时配置
const config = useRuntimeConfig() const config = useRuntimeConfig()
import { useResourceApi, useStatsApi, usePanApi, useSystemConfigApi } from '~/composables/useApi'
const resourceApi = useResourceApi()
const statsApi = useStatsApi()
const panApi = usePanApi()
const systemConfigApi = useSystemConfigApi()
// 获取路由参数 // 获取路由参数
const route = useRoute() const route = useRoute()
@@ -268,51 +273,36 @@ const isLoadingMore = ref(false)
const hasMoreData = ref(true) const hasMoreData = ref(true)
const pageLoading = ref(false) const pageLoading = ref(false)
console.log(pageSize.value, currentPage.value)
// 使用 useAsyncData 获取资源数据 // 使用 useAsyncData 获取资源数据
const { data: resourcesData, pending, refresh } = await useAsyncData( const { data: resourcesData, pending, refresh } = await useAsyncData(
() => `resources-${currentPage.value}-${searchQuery.value}-${selectedPlatform.value}`, () => `resources-${currentPage.value}-${searchQuery.value}-${selectedPlatform.value}`,
() => $fetch('/api/resources', { () => resourceApi.getResources({
params: {
page: currentPage.value, page: currentPage.value,
page_size: pageSize.value, page_size: pageSize.value,
search: searchQuery.value, search: searchQuery.value,
pan_id: selectedPlatform.value pan_id: selectedPlatform.value
}
}) })
) )
// 获取统计数据 // 获取统计数据
const { data: statsData } = await useAsyncData('stats', const { data: statsData } = await useAsyncData('stats', () => statsApi.getStats())
() => $fetch('/api/stats')
)
// 获取平台数据 // 获取平台数据
const { data: platformsData } = await useAsyncData('platforms', const { data: platformsData } = await useAsyncData('platforms', () => panApi.getPans())
() => $fetch('/api/pans')
)
// 获取系统配置 // 获取系统配置
const { data: systemConfigData } = await useAsyncData('systemConfig', const { data: systemConfigData } = await useAsyncData('systemConfig', () => systemConfigApi.getSystemConfig())
() => $fetch('/api/system-config')
)
const sysConfig = (systemConfigData.value as any)?.data as any
const panList = (platformsData.value as any)?.data?.list as any[]
const resourceList = (resourcesData.value as any)?.data?.resources as any[]
const total = (resourcesData.value as any)?.data?.total as number
// 从 SSR 数据中获取值 // 从 SSR 数据中获取值
const safeResources = computed(() => (resourcesData.value as any)?.data?.resources || []) const safeResources = computed(() => (resourcesData.value as any)?.resources || [])
const safeStats = computed(() => (statsData.value as any)?.data || { total_resources: 0, total_categories: 0, total_tags: 0, total_views: 0, today_updates: 0 }) const safeStats = computed(() => (statsData.value as any) || { total_resources: 0, total_categories: 0, total_tags: 0, total_views: 0, today_updates: 0 })
const platforms = computed(() => panList || []) const platforms = computed(() => platformsData.value || [])
const systemConfig = computed(() => sysConfig || { site_title: '老九网盘资源数据库' }) const systemConfig = computed(() => (systemConfigData.value as any) || { site_title: '老九网盘资源数据库' })
const safeLoading = computed(() => pending.value) const safeLoading = computed(() => pending.value)
// 计算属性 // 计算属性
const totalPages = computed(() => { const totalPages = computed(() => {
const total = (resourcesData.value as any)?.data?.total || 0 const total = (resourcesData.value as any)?.total || 0
return Math.ceil(total / pageSize.value) return Math.ceil(total / pageSize.value)
}) })

View File

@@ -245,6 +245,8 @@ definePageMeta({
}) })
import { ref, onMounted, onUnmounted, computed } from 'vue' import { ref, onMounted, onUnmounted, computed } from 'vue'
import { useMonitorApi } from '~/composables/useApi'
const monitorApi = useMonitorApi()
// 响应式数据 // 响应式数据
const loading = ref(false) const loading = ref(false)
@@ -283,8 +285,6 @@ const formatTimestamp = (timestamp: number) => {
// 获取系统信息 // 获取系统信息
const fetchSystemInfo = async () => { const fetchSystemInfo = async () => {
try { try {
const { useMonitorApi } = await import('~/composables/useApi')
const monitorApi = useMonitorApi()
const response = await monitorApi.getSystemInfo() const response = await monitorApi.getSystemInfo()
systemInfo.value = response systemInfo.value = response
} catch (error) { } catch (error) {
@@ -295,8 +295,6 @@ const fetchSystemInfo = async () => {
// 获取性能统计 // 获取性能统计
const fetchPerformanceStats = async () => { const fetchPerformanceStats = async () => {
try { try {
const { useMonitorApi } = await import('~/composables/useApi')
const monitorApi = useMonitorApi()
const response = await monitorApi.getPerformanceStats() const response = await monitorApi.getPerformanceStats()
performanceStats.value = response performanceStats.value = response
} catch (error) { } catch (error) {
@@ -307,8 +305,6 @@ const fetchPerformanceStats = async () => {
// 获取基础统计 // 获取基础统计
const fetchBasicStats = async () => { const fetchBasicStats = async () => {
try { try {
const { useMonitorApi } = await import('~/composables/useApi')
const monitorApi = useMonitorApi()
const response = await monitorApi.getBasicStats() const response = await monitorApi.getBasicStats()
basicStats.value = response basicStats.value = response
} catch (error) { } catch (error) {

View File

@@ -4,7 +4,7 @@ export default defineEventHandler(async (event) => {
try { try {
// 在服务端调用后端 API // 在服务端调用后端 API
const response = await $fetch('/pans', { const response = await $fetch('/pans', {
baseURL: config.public.apiBase, baseURL: String(process.server ? config.public.apiServer : config.public.apiBase),
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
} }

View File

@@ -5,7 +5,7 @@ export default defineEventHandler(async (event) => {
try { try {
// 在服务端调用后端 API // 在服务端调用后端 API
const response = await $fetch('/resources', { const response = await $fetch('/resources', {
baseURL: config.public.apiBase, baseURL: String(process.server ? config.public.apiServer : config.public.apiBase),
query, query,
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'

View File

@@ -4,7 +4,7 @@ export default defineEventHandler(async (event) => {
try { try {
// 在服务端调用后端 API // 在服务端调用后端 API
const response = await $fetch('/stats', { const response = await $fetch('/stats', {
baseURL: config.public.apiBase, baseURL: String(process.server ? config.public.apiServer : config.public.apiBase),
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
} }

View File

@@ -4,7 +4,7 @@ export default defineEventHandler(async (event) => {
try { try {
// 在服务端调用后端 API // 在服务端调用后端 API
const response = await $fetch('/system/config', { const response = await $fetch('/system/config', {
baseURL: config.public.apiBase, baseURL: String(process.server ? config.public.apiServer : config.public.apiBase),
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
} }

View File

@@ -1,6 +1,6 @@
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
const config = useRuntimeConfig() const config = useRuntimeConfig()
const apiBase = config.public.apiBase || 'http://localhost:8080/api' const apiBase = String(process.server ? config.public.apiServer : config.public.apiBase)
try { try {
const response = await $fetch(`${apiBase}/version`) const response = await $fetch(`${apiBase}/version`)