import Taro from '@tarojs/taro' import envConfig from '@/config/env' import { API_CONFIG } from '@/config/api' import httpService from './httpService' import tokenManager from '../utils/tokenManager' // 用户接口 export interface UploadFilesData { id: string, filePath: string, description?: string, tags?: string, is_public?: 0 | 1, } export interface uploadFileResponse { code: number, message: string, data: uploadFileResponseData, } export interface uploadFileResponseData { id: number, user_id: number, file_name: string, original_name: string, file_path: string, file_url: string, file_size: number, resource_type: string, mime_type: string, description: string, tags: string[], is_public: string, view_count: number, download_count: number, created_at: string, updated_at: string, } // 从上传错误中取出可展示的文案 function get_upload_error_msg(error: any): string { if (!error) return "上传失败"; const msg = error?.message || (typeof error?.error === "string" ? error.error : error?.error?.message) || (error?.data?.message ?? error?.data?.msg) || ""; return (msg && String(msg).trim()) || "上传失败"; } // 发布球局类 class UploadApi { async upload(req: UploadFilesData): Promise<{ id: string, data: uploadFileResponseData }> { const fullUrl = `${envConfig.apiBaseURL}/api/gallery/upload`; const authHeader = tokenManager.getAuthHeader(); const { id, ...rest } = req; try { const res = await Taro.uploadFile({ url: fullUrl, filePath: rest.filePath, name: "file", formData: { description: rest.description, tags: rest.tags, is_public: rest.is_public, }, header: authHeader, }); const parsed = JSON.parse(res.data); if (parsed.code !== 0) { const msg = get_upload_error_msg(parsed); Taro.showToast({ title: msg, icon: "none" }); throw new Error(msg); } return { id, data: parsed.data }; } catch (error) { const msg = get_upload_error_msg(error); Taro.showToast({ title: msg, icon: "none" }); throw { id, error }; } } async batchUpload(req: UploadFilesData[]): Promise<{ id: string, data: uploadFileResponseData | null }[]> { return Promise.all(req.map(async (item) => { try { const res = await this.upload(item); return res; } catch (error) { return { id: item.id, data: null } } })) } // 上传单张图片到OSS async upload_oss_img(file_path: string): Promise { try { let fullUrl = `${envConfig.apiBaseURL}/api${API_CONFIG.UPLOAD.OSS_IMG}` const authHeader = tokenManager.getAuthHeader() const response = await Taro.uploadFile({ url: fullUrl, filePath: file_path, name: 'file', header: authHeader, }); const result = JSON.parse(response.data); if (result.code === 0) { return result.data; } else { throw new Error(result.message || '上传失败'); } } catch (error) { console.warn('上传图片失败:', error); throw error; } } } // 导出认证服务实例 export default new UploadApi()