// API 服务器地址 - 开发环境使用本地地址,生产环境请替换为实际域名 // 微信开发者工具需勾选: 设置 → 安全 → 不校验合法域名 const API_BASE_URL = 'http://127.0.0.1:8186/api' const TIMEOUT = 30000 async function request(method, url, data) { const token = uni.getStorageSync('token') const header = { 'Content-Type': 'application/json' } if (token) { header.Authorization = `Bearer ${token}` } return new Promise((resolve, reject) => { uni.request({ url: API_BASE_URL + url, method, data, header, timeout: TIMEOUT, success(res) { const response = res.data if (response.code !== 0) { uni.showToast({ title: response.message || '请求失败', icon: 'none' }) if (response.code === 1001) { uni.removeStorageSync('token') // 跳转到登录页,避免 switchTab 超时问题 setTimeout(() => { uni.reLaunch({ url: '/pages/login/index' }) }, 500) } const err = new Error(response.message || '请求失败') err.code = response.code reject(err) } else { resolve(response.data) } }, fail(err) { uni.showToast({ title: '网络错误', icon: 'none' }) reject(err) } }) }) } const requestInstance = { get: (url, data) => request('GET', url, data), post: (url, data) => request('POST', url, data), put: (url, data) => request('PUT', url, data), delete: (url, data) => request('DELETE', url, data) } export default requestInstance export const authApi = { login: (data) => requestInstance.post('/auth/login', data) } export const consultationApi = { start: (data) => requestInstance.post('/consultation/start', data), check: (data) => requestInstance.post('/consultation/check', data), regenerate: (chartRecordId) => requestInstance.post('/consultation/regenerate', { chartRecordId }) } export const chartApi = { create: (data) => requestInstance.post('/chart/create', data), list: () => requestInstance.post('/chart/list', {}), detail: (id) => requestInstance.post('/chart/detail', { id }), delete: (id) => requestInstance.post('/chart/delete', { id }), interpret: (chartRecordId) => requestInstance.post('/chart/interpret', { chartRecordId }), academicOrientation: (chartRecordId) => requestInstance.post('/chart/academic-orientation', { chartRecordId }) } export const chatApi = { send: (data) => requestInstance.post('/chat/send', data), history: (chartRecordId) => requestInstance.post('/chat/history', { chartRecordId }), voiceUpload: (filePath, chartRecordId) => { const token = uni.getStorageSync('token') return new Promise((resolve, reject) => { uni.uploadFile({ url: API_BASE_URL + '/chat/voice', filePath, name: 'file', formData: { chartRecordId: String(chartRecordId || '') }, header: token ? { Authorization: `Bearer ${token}` } : {}, success: (res) => { try { const data = JSON.parse(res.data) if (data.code === 0) resolve(data.data) else reject(new Error(data.message || '上传失败')) } catch (e) { reject(new Error('解析响应失败')) } }, fail: (err) => reject(err) }) }) } } export const payApi = { create: (data) => requestInstance.post('/pay/create', data) } export const pricingApi = { current: () => requestInstance.post('/pricing/current', {}), upgrade: () => requestInstance.post('/pricing/upgrade', {}) } export const planApi = { apply: (data) => requestInstance.post('/plan/apply', data), myRequests: () => requestInstance.post('/plan/requests/my', {}) } export const workbenchApi = { list: () => requestInstance.post('/plan/requests/incoming', {}), accept: (requestId) => requestInstance.post('/plan/requests/accept', { requestId }), reject: (requestId) => requestInstance.post('/plan/requests/reject', { requestId }) } export const proposalApi = { create: (data) => requestInstance.post('/plan/proposals/create', data), counter: (data) => requestInstance.post('/plan/proposals/counter', data), accept: (data) => requestInstance.post('/plan/proposals/accept', data), reject: (data) => requestInstance.post('/plan/proposals/reject', data), logs: (requestId) => requestInstance.post('/plan/proposals/logs', { requestId }) } export const profileApi = { info: () => requestInstance.post('/profile/info', {}), vipStatus: () => requestInstance.post('/profile/vip-status', {}), quota: () => requestInstance.post('/profile/quota', {}), commissionSummary: () => requestInstance.post('/profile/commission-summary', {}), chartCount: () => requestInstance.post('/profile/chart-count', {}), trackShare: () => requestInstance.post('/profile/share/track', {}), complete: (data) => requestInstance.post('/profile/complete', data), update: (data) => requestInstance.post('/profile/update', data), qrcode: () => requestInstance.get('/profile/qrcode', {}) } export const annotationApi = { add: (data) => requestInstance.post('/annotation/add', data), list: (recordId) => requestInstance.post('/annotation/list', { recordId }), delete: (id) => requestInstance.post('/annotation/delete', { id }), addTag: (data) => requestInstance.post('/annotation/tag/add', data), listTags: (recordId) => requestInstance.post('/annotation/tag/list', { recordId }), deleteTag: (id) => requestInstance.post('/annotation/tag/delete', { id }) } export const commissionApi = { list: () => requestInstance.post('/commission/list', {}), total: () => requestInstance.post('/commission/total', {}), team: () => requestInstance.post('/commission/team', {}), stats: () => requestInstance.post('/commission/stats', {}) } export const withdrawApi = { apply: (amount) => requestInstance.post('/withdraw/apply', { amount }), list: () => requestInstance.post('/withdraw/list', {}), balance: () => requestInstance.post('/withdraw/balance', {}) } export const interventionApi = { chatList: () => requestInstance.post('/intervention/chat-list', {}), history: (chartRecordId) => requestInstance.post('/intervention/chat-history', { chartRecordId }), start: (chartRecordId) => requestInstance.post('/intervention/start', { chartRecordId }), end: (interventionId) => requestInstance.post('/intervention/end', { interventionId, endedBy: 'practitioner' }), endByUser: (interventionId) => requestInstance.post('/intervention/end', { interventionId, endedBy: 'user' }), send: (data) => requestInstance.post('/intervention/send', data) } export const deliveryApi = { create: (data) => requestInstance.post('/plan/delivery/create', data), list: (planRequestId) => requestInstance.post('/plan/delivery/list', { planRequestId }) } export const exportApi = { pdf: (recordId) => { const token = uni.getStorageSync('token') return new Promise((resolve, reject) => { uni.downloadFile({ url: API_BASE_URL + '/export/pdf', method: 'POST', data: { recordId }, header: token ? { Authorization: `Bearer ${token}` } : {}, success: (res) => { if (res.statusCode === 200) { resolve(res.tempFilePath) } else { reject(new Error('导出失败: ' + res.statusCode)) } }, fail: (err) => { reject(err) } }) }) } }