103 lines
3.0 KiB
JavaScript
103 lines
3.0 KiB
JavaScript
import { getStorage, removeStorage, TOKEN_KEY, LOCALE_KEY } from '../utils/storage.js'
|
||
|
||
// 后端API基础地址
|
||
// MuMu模拟器需使用宿主机局域网IP,生产环境替换为正式域名
|
||
export const BASE_URL = 'http://192.168.21.7:5082'
|
||
|
||
/**
|
||
* 统一请求封装,自动注入Token和语言请求头,统一处理响应和错误
|
||
* @param {string} url - 请求路径(相对路径)
|
||
* @param {object} options - 请求选项
|
||
* @returns {Promise<{success: boolean, data: any, message: string}>}
|
||
*/
|
||
export function request(url, options = {}) {
|
||
const token = getStorage(TOKEN_KEY)
|
||
const locale = getStorage(LOCALE_KEY) || 'zh-CN'
|
||
|
||
const header = {
|
||
'Content-Type': 'application/json',
|
||
'Accept-Language': locale,
|
||
...options.header
|
||
}
|
||
|
||
if (token) {
|
||
header['Authorization'] = `Bearer ${token}`
|
||
}
|
||
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url: `${BASE_URL}${url}`,
|
||
method: options.method || 'GET',
|
||
data: options.data,
|
||
header,
|
||
success: (res) => {
|
||
// 401未授权:清除Token并跳转登录页
|
||
if (res.statusCode === 401) {
|
||
removeStorage(TOKEN_KEY)
|
||
uni.showToast({ title: '登录已过期,请重新登录', icon: 'none' })
|
||
uni.reLaunch({ url: '/pages/login/login' })
|
||
reject(new Error('未授权'))
|
||
return
|
||
}
|
||
|
||
// 服务器错误
|
||
if (res.statusCode >= 500) {
|
||
uni.showToast({ title: '服务器繁忙,请稍后重试', icon: 'none' })
|
||
reject(new Error('服务器错误'))
|
||
return
|
||
}
|
||
|
||
const body = res.data
|
||
// 业务逻辑判断:根据success字段
|
||
if (body && body.success) {
|
||
resolve(body)
|
||
} else {
|
||
const msg = (body && body.message) || '请求失败'
|
||
uni.showToast({ title: msg, icon: 'none' })
|
||
reject(new Error(msg))
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
// 网络错误(超时、断网等)
|
||
const msg = err.errMsg || ''
|
||
if (msg.includes('timeout')) {
|
||
uni.showToast({ title: '网络连接超时,请重试', icon: 'none' })
|
||
} else {
|
||
uni.showToast({ title: '网络连接失败,请检查网络设置', icon: 'none' })
|
||
}
|
||
reject(new Error(msg || '网络错误'))
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
|
||
/**
|
||
* 发起GET请求
|
||
* @param {string} url - 请求路径
|
||
* @param {object} params - 查询参数
|
||
* @returns {Promise<{success: boolean, data: any, message: string}>}
|
||
*/
|
||
export function get(url, params) {
|
||
return request(url, { method: 'GET', data: params })
|
||
}
|
||
|
||
/**
|
||
* 发起POST请求
|
||
* @param {string} url - 请求路径
|
||
* @param {object} data - 请求体
|
||
* @returns {Promise<{success: boolean, data: any, message: string}>}
|
||
*/
|
||
export function post(url, data) {
|
||
return request(url, { method: 'POST', data })
|
||
}
|
||
|
||
/**
|
||
* 发起DELETE请求
|
||
* @param {string} url - 请求路径
|
||
* @returns {Promise<{success: boolean, data: any, message: string}>}
|
||
*/
|
||
export function del(url) {
|
||
return request(url, { method: 'DELETE' })
|
||
}
|