| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- // 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: (productType) => requestInstance.post('/pricing/upgrade', { productType })
- }
- 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 relationApi = {
- list: () => requestInstance.post('/relation/list', {}),
- create: (data) => requestInstance.post('/relation/create', data),
- update: (data) => requestInstance.post('/relation/update', data),
- delete: (id) => requestInstance.post('/relation/delete', { id }),
- get: (id) => requestInstance.post('/relation/get', { id }),
- compare: (relationId) => requestInstance.post('/relation/compare', { relationId }),
- interpret: (relationId) => requestInstance.post('/relation/compare/interpret', { relationId })
- }
- export const numberAnalysisApi = {
- analyze: (data) => requestInstance.post('/number-analysis/analyze', data),
- list: () => requestInstance.post('/number-analysis/list', {}),
- detail: (id) => requestInstance.post('/number-analysis/detail', { 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)
- }
- /**
- * Admin-specific request that uses adminToken (stored separately from user token).
- */
- async function adminRequest(method, url, data) {
- const token = uni.getStorageSync('adminToken')
- 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) {
- if (response.code === 1001) {
- // Token invalid or expired — clear admin token
- uni.removeStorageSync('adminToken')
- }
- 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 adminRequestInstance = {
- post: (url, data) => adminRequest('POST', url, data)
- }
- export const adminApi = {
- login: (username, password) => adminRequestInstance.post('/admin/login', { username, password }),
- stats: () => adminRequestInstance.post('/admin/stats', {}),
- users: () => adminRequestInstance.post('/admin/users', {}),
- upgradeUser: (userId) => adminRequestInstance.post('/admin/user/upgrade', { userId }),
- downgradeUser: (userId) => adminRequestInstance.post('/admin/user/downgrade', { userId }),
- setAdmin: (userId, isAdmin) => adminRequestInstance.post('/admin/user/set-admin', { userId, isAdmin }),
- orders: () => adminRequestInstance.post('/admin/orders', {}),
- commissions: () => adminRequestInstance.post('/admin/commissions', {}),
- charts: () => adminRequestInstance.post('/admin/charts', {}),
- withdraws: () => adminRequestInstance.post('/admin/withdraws', {}),
- approveWithdraw: (id) => adminRequestInstance.post('/admin/withdraw/approve', { id }),
- rejectWithdraw: (id) => adminRequestInstance.post('/admin/withdraw/reject', { id }),
- configList: () => adminRequestInstance.post('/admin/config/list', {}),
- configUpdate: (data) => adminRequestInstance.post('/admin/config/update', data),
- configReset: (configKey) => adminRequestInstance.post('/admin/config/reset', { configKey })
- }
- 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)
- }
- })
- })
- }
- }
|