增加uniapp
This commit is contained in:
@@ -0,0 +1,241 @@
|
||||
/**
|
||||
* API 请求封装
|
||||
* baseURL 前缀: /app
|
||||
* 统一 token 拦截器
|
||||
*/
|
||||
|
||||
// 基础配置
|
||||
const BASE_URL = '/app'
|
||||
const TIMEOUT = 30000
|
||||
|
||||
/**
|
||||
* 通用请求方法
|
||||
* @param {string} url - 请求路径(会自动拼接 /app 前缀)
|
||||
* @param {object} data - 请求数据
|
||||
* @param {string} method - 请求方法 GET/POST/PUT/DELETE
|
||||
* @param {object} header - 自定义请求头
|
||||
* @returns {Promise}
|
||||
*/
|
||||
export function request(url, data = {}, method = 'GET', header = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 获取 token
|
||||
const token = uni.getStorageSync('token')
|
||||
|
||||
// 合并请求头
|
||||
const headers = {
|
||||
'Content-Type': 'application/json',
|
||||
...header
|
||||
}
|
||||
|
||||
// 添加 token
|
||||
if (token) {
|
||||
headers['Authorization'] = `Bearer ${token}`
|
||||
}
|
||||
|
||||
// 完整 URL
|
||||
const fullUrl = `${BASE_URL}${url}`
|
||||
|
||||
uni.request({
|
||||
url: fullUrl,
|
||||
data,
|
||||
method,
|
||||
header: headers,
|
||||
timeout: TIMEOUT,
|
||||
success: (res) => {
|
||||
const { statusCode, data } = res
|
||||
|
||||
// HTTP 状态码判断
|
||||
if (statusCode === 200) {
|
||||
// 业务状态码判断(假设后端返回格式为 { code: 0, data, message })
|
||||
if (data.code === 0 || data.code === 200) {
|
||||
resolve(data)
|
||||
} else if (data.code === 401) {
|
||||
// token 过期或未授权
|
||||
handleUnauthorized()
|
||||
reject(new Error(data.message || '登录已过期,请重新登录'))
|
||||
} else {
|
||||
// 其他业务错误
|
||||
uni.showToast({
|
||||
title: data.message || '请求失败',
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
})
|
||||
reject(new Error(data.message || '请求失败'))
|
||||
}
|
||||
} else if (statusCode === 401) {
|
||||
handleUnauthorized()
|
||||
reject(new Error('登录已过期,请重新登录'))
|
||||
} else if (statusCode === 403) {
|
||||
reject(new Error('没有权限访问'))
|
||||
} else if (statusCode === 404) {
|
||||
reject(new Error('请求的资源不存在'))
|
||||
} else if (statusCode >= 500) {
|
||||
uni.showToast({
|
||||
title: '服务器错误,请稍后重试',
|
||||
icon: 'none'
|
||||
})
|
||||
reject(new Error('服务器错误'))
|
||||
} else {
|
||||
reject(new Error(`请求失败(${statusCode})`))
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('Request failed:', err)
|
||||
|
||||
let errorMsg = '网络异常,请检查网络连接'
|
||||
|
||||
if (err.errMsg.includes('timeout')) {
|
||||
errorMsg = '请求超时,请稍后重试'
|
||||
} else if (err.errMsg.includes('abort')) {
|
||||
errorMsg = '请求已取消'
|
||||
}
|
||||
|
||||
uni.showToast({
|
||||
title: errorMsg,
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
})
|
||||
|
||||
reject(new Error(errorMsg))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理未授权(token 失效)
|
||||
*/
|
||||
function handleUnauthorized() {
|
||||
// 清除本地存储
|
||||
uni.removeStorageSync('token')
|
||||
uni.removeStorageSync('userInfo')
|
||||
|
||||
// 提示用户
|
||||
uni.showToast({
|
||||
title: '登录已过期,请重新登录',
|
||||
icon: 'none',
|
||||
duration: 1500
|
||||
})
|
||||
|
||||
// 跳转到登录页
|
||||
setTimeout(() => {
|
||||
uni.reLaunch({
|
||||
url: '/pages/login/login'
|
||||
})
|
||||
}, 1500)
|
||||
}
|
||||
|
||||
/**
|
||||
* GET 请求
|
||||
*/
|
||||
export function get(url, data = {}, header = {}) {
|
||||
return request(url, data, 'GET', header)
|
||||
}
|
||||
|
||||
/**
|
||||
* POST 请求
|
||||
*/
|
||||
export function post(url, data = {}, header = {}) {
|
||||
return request(url, data, 'POST', header)
|
||||
}
|
||||
|
||||
/**
|
||||
* PUT 请求
|
||||
*/
|
||||
export function put(url, data = {}, header = {}) {
|
||||
return request(url, data, 'PUT', header)
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE 请求
|
||||
*/
|
||||
export function del(url, data = {}, header = {}) {
|
||||
return request(url, data, 'DELETE', header)
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
* @param {string} url - 上传接口路径
|
||||
* @param {string} filePath - 本地文件路径
|
||||
* @param {object} formData - 额外表单数据
|
||||
*/
|
||||
export function upload(url, filePath, formData = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const token = uni.getStorageSync('token')
|
||||
|
||||
const header = {}
|
||||
if (token) {
|
||||
header['Authorization'] = `Bearer ${token}`
|
||||
}
|
||||
|
||||
uni.uploadFile({
|
||||
url: `${BASE_URL}${url}`,
|
||||
filePath,
|
||||
name: 'file',
|
||||
formData,
|
||||
header,
|
||||
success: (res) => {
|
||||
if (res.statusCode === 200) {
|
||||
const data = JSON.parse(res.data)
|
||||
if (data.code === 0 || data.code === 200) {
|
||||
resolve(data)
|
||||
} else {
|
||||
reject(new Error(data.message || '上传失败'))
|
||||
}
|
||||
} else {
|
||||
reject(new Error('上传失败'))
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('Upload failed:', err)
|
||||
reject(new Error('上传失败'))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// ==================== 具体业务 API ====================
|
||||
|
||||
/**
|
||||
* 发送短信验证码
|
||||
*/
|
||||
export function sendSmsCode(data) {
|
||||
return post('/sms/send', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 手机号验证码登录
|
||||
*/
|
||||
export function phoneCodeLogin(data) {
|
||||
return post('/login/phone', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 账号密码登录
|
||||
*/
|
||||
export function passwordLogin(data) {
|
||||
return post('/login/password', data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
*/
|
||||
export function logout() {
|
||||
return post('/logout').finally(() => {
|
||||
uni.removeStorageSync('token')
|
||||
uni.removeStorageSync('userInfo')
|
||||
})
|
||||
}
|
||||
|
||||
export default {
|
||||
request,
|
||||
get,
|
||||
post,
|
||||
put,
|
||||
del,
|
||||
upload,
|
||||
sendSmsCode,
|
||||
phoneCodeLogin,
|
||||
passwordLogin,
|
||||
logout
|
||||
}
|
||||
Reference in New Issue
Block a user