354 lines
7.2 KiB
JavaScript
354 lines
7.2 KiB
JavaScript
|
|
// 基础配置
|
|||
|
|
const config = {
|
|||
|
|
// #ifdef APP-PLUS || H5
|
|||
|
|
baseURL: 'https://app.mrrweb.com.cn', // APP和H5的基础URL
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// #ifdef MP-WEIXIN
|
|||
|
|
baseURL: 'https://app.mrrweb.com.cn', // 小程序的基础URL
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
header: {
|
|||
|
|
'content-type': 'application/json'
|
|||
|
|
},
|
|||
|
|
timeout: 60000 // 超时时间
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let noTokenUrls = ['']
|
|||
|
|
|
|||
|
|
// 请求拦截器
|
|||
|
|
const requestInterceptor = (options) => {
|
|||
|
|
// 获取token
|
|||
|
|
const token = uni.getStorageSync('accessToken')
|
|||
|
|
if (token) {
|
|||
|
|
options.header = {
|
|||
|
|
...options.header,
|
|||
|
|
'Authorization': `Bearer ${token}`
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// #ifdef H5
|
|||
|
|
// H5端跨域处理
|
|||
|
|
options.header = {
|
|||
|
|
...options.header,
|
|||
|
|
'Access-Control-Allow-Origin': '*'
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
return options
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 响应拦截器
|
|||
|
|
const responseInterceptor = (response,options,type) => {
|
|||
|
|
const { statusCode, data } = response
|
|||
|
|
|
|||
|
|
// 请求成功
|
|||
|
|
if (statusCode >= 200 && statusCode < 300) {
|
|||
|
|
return data
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理错误
|
|||
|
|
if (statusCode === 401) {
|
|||
|
|
// token过期,跳转登录
|
|||
|
|
if (uni.getStorageSync('refreshToken')) {
|
|||
|
|
return updateToken(options,type)
|
|||
|
|
}else {
|
|||
|
|
uni.removeStorageSync('accessToken')
|
|||
|
|
uni.removeStorageSync('refreshToken')
|
|||
|
|
// #ifdef H5
|
|||
|
|
// H5端使用replace而不是navigateTo
|
|||
|
|
// uni.redirectTo({
|
|||
|
|
// url: '/pages/login/login'
|
|||
|
|
// })
|
|||
|
|
uni.reLaunch({
|
|||
|
|
url: '/pages/login/login'
|
|||
|
|
})
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// #ifdef APP-PLUS || MP-WEIXIN
|
|||
|
|
uni.reLaunch({
|
|||
|
|
url: '/pages/login/login'
|
|||
|
|
})
|
|||
|
|
// #endif
|
|||
|
|
return Promise.reject(new Error('未授权,请重新登录'))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 其他错误
|
|||
|
|
uni.showToast({
|
|||
|
|
title: data.message || '请求失败',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
return Promise.reject(data)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 请求方法
|
|||
|
|
const request = (options,isUpdate) => {
|
|||
|
|
// 合并配置
|
|||
|
|
options = {
|
|||
|
|
...config,
|
|||
|
|
...options,
|
|||
|
|
url: !isUpdate ? `${config.baseURL}${options.url}` : options.url
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 请求拦截
|
|||
|
|
options = requestInterceptor(options)
|
|||
|
|
|
|||
|
|
// 发起请求
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
// #ifdef H5
|
|||
|
|
// H5端添加loading
|
|||
|
|
if (!options.hideLoading) {
|
|||
|
|
uni.showLoading({
|
|||
|
|
title: '加载中...'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
uni.request({
|
|||
|
|
...options,
|
|||
|
|
success: (res) => {
|
|||
|
|
// #ifdef H5
|
|||
|
|
if (!options.hideLoading) {
|
|||
|
|
uni.hideLoading()
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
resolve(responseInterceptor(res,options))
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
// #ifdef H5
|
|||
|
|
if (!options.hideLoading) {
|
|||
|
|
uni.hideLoading()
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// 网络错误处理
|
|||
|
|
let errorMsg = '网络错误,请稍后重试'
|
|||
|
|
// #ifdef H5
|
|||
|
|
if (err.errMsg.includes('timeout')) {
|
|||
|
|
errorMsg = '请求超时,请检查网络'
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
uni.showToast({
|
|||
|
|
title: errorMsg,
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
reject(err)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
const uploadPhoto = (options,isUpdate) => {
|
|||
|
|
options = {
|
|||
|
|
...options,
|
|||
|
|
url: !isUpdate ? `${config.baseURL}${options.url}` : options.url
|
|||
|
|
}
|
|||
|
|
// 请求拦截
|
|||
|
|
options = requestInterceptor(options)
|
|||
|
|
// 发起上传
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
// #ifdef H5
|
|||
|
|
// H5端显示上传进度
|
|||
|
|
if (!options.hideLoading) {
|
|||
|
|
uni.showLoading({
|
|||
|
|
title: '上传中...'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
uni.uploadFile({
|
|||
|
|
...options,
|
|||
|
|
success: (res) => {
|
|||
|
|
const data = JSON.parse(res.data)
|
|||
|
|
resolve(responseInterceptor({
|
|||
|
|
statusCode: res.statusCode,
|
|||
|
|
data
|
|||
|
|
},options,'uploadPhoto'))
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
reject(err)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// 上传文件
|
|||
|
|
const uploadFile = (options,isUpdate) => {
|
|||
|
|
// 合并配置
|
|||
|
|
options = {
|
|||
|
|
...options,
|
|||
|
|
url: !isUpdate ? `${config.baseURL}${options.url}` : options.url
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 请求拦截
|
|||
|
|
options = requestInterceptor(options)
|
|||
|
|
|
|||
|
|
// 发起上传
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
// #ifdef H5
|
|||
|
|
// H5端显示上传进度
|
|||
|
|
if (!options.hideLoading) {
|
|||
|
|
uni.showLoading({
|
|||
|
|
title: '上传中...'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
uni.uploadFile({
|
|||
|
|
...options,
|
|||
|
|
success: (res) => {
|
|||
|
|
// #ifdef H5
|
|||
|
|
if (!options.hideLoading) {
|
|||
|
|
uni.hideLoading()
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
try {
|
|||
|
|
const data = JSON.parse(res.data)
|
|||
|
|
resolve(responseInterceptor({
|
|||
|
|
statusCode: res.statusCode,
|
|||
|
|
data
|
|||
|
|
},options,'upload'))
|
|||
|
|
} catch (err) {
|
|||
|
|
reject('err',err)
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (err) => {
|
|||
|
|
// #ifdef H5
|
|||
|
|
if (!options.hideLoading) {
|
|||
|
|
uni.hideLoading()
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '上传失败,请稍后重试',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
reject(err)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// 更新token
|
|||
|
|
const updateToken = async (options,type) => {
|
|||
|
|
// 判断距离刷新token过期还剩 4个小时
|
|||
|
|
try {
|
|||
|
|
const res = await request({
|
|||
|
|
url: '/user/refreshtoken',
|
|||
|
|
data: {
|
|||
|
|
refresh_token: uni.getStorageSync('refreshToken'),
|
|||
|
|
deviceid: getApp().globalData.deviceid
|
|||
|
|
},
|
|||
|
|
method: 'POST'
|
|||
|
|
})
|
|||
|
|
if(res.state == 1) {
|
|||
|
|
// 2. 保存到本地
|
|||
|
|
uni.setStorageSync('accessToken',res.access_token)
|
|||
|
|
uni.setStorageSync('refreshToken',res.refresh_token)
|
|||
|
|
// 3. 重发请求
|
|||
|
|
if(type == 'upload') {
|
|||
|
|
return uploadFile(options,true)
|
|||
|
|
}else if(type == 'uploadPhoto') {
|
|||
|
|
return uploadPhoto(options,true)
|
|||
|
|
}else {
|
|||
|
|
return request(options,true)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}else if(res.state == 2) {
|
|||
|
|
// 清除token
|
|||
|
|
uni.removeStorageSync('accessToken')
|
|||
|
|
uni.removeStorageSync('refreshToken')
|
|||
|
|
uni.reLaunch({
|
|||
|
|
url: '/pages/login/login'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
// 清除token
|
|||
|
|
uni.removeStorageSync('accessToken')
|
|||
|
|
uni.removeStorageSync('refreshToken')
|
|||
|
|
uni.reLaunch({
|
|||
|
|
url: '/pages/login/login'
|
|||
|
|
})
|
|||
|
|
return Promise.reject(error)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 导出请求方法
|
|||
|
|
export default {
|
|||
|
|
// GET请求
|
|||
|
|
get(url, data = {}, options = {}) {
|
|||
|
|
return request({
|
|||
|
|
url,
|
|||
|
|
data,
|
|||
|
|
method: 'GET',
|
|||
|
|
...options
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// POST请求
|
|||
|
|
post(url, data = {}, options = {}) {
|
|||
|
|
return request({
|
|||
|
|
url,
|
|||
|
|
data,
|
|||
|
|
method: 'POST',
|
|||
|
|
...options
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// PUT请求
|
|||
|
|
put(url, data = {}, options = {}) {
|
|||
|
|
return request({
|
|||
|
|
url,
|
|||
|
|
data,
|
|||
|
|
method: 'PUT',
|
|||
|
|
...options
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// DELETE请求
|
|||
|
|
delete(url, data = {}, options = {}) {
|
|||
|
|
return request({
|
|||
|
|
url,
|
|||
|
|
data,
|
|||
|
|
method: 'DELETE',
|
|||
|
|
...options
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
// 上传图片
|
|||
|
|
uploadImage(url, filePath, formData = {}, options = {}) {
|
|||
|
|
return uploadPhoto({
|
|||
|
|
url,
|
|||
|
|
filePath,
|
|||
|
|
name: 'file',
|
|||
|
|
...formData,
|
|||
|
|
...options
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
// 上传视频
|
|||
|
|
uploadVideo(url, filePath, name, formData, options = {}) {
|
|||
|
|
return uploadFile({
|
|||
|
|
url: url,
|
|||
|
|
filePath,
|
|||
|
|
name: name,
|
|||
|
|
formData,
|
|||
|
|
...options
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
// 上传分片视频
|
|||
|
|
uploadTask(url, filePath, name, formData, options = {}) {
|
|||
|
|
return uploadFile({
|
|||
|
|
url: url,
|
|||
|
|
// 微信/App使用文件路径
|
|||
|
|
// #ifdef MP-WEIXIN || APP-PLUS
|
|||
|
|
filePath: filePath,
|
|||
|
|
// #endif
|
|||
|
|
// H5使用File对象
|
|||
|
|
// #ifdef H5
|
|||
|
|
file: filePath,
|
|||
|
|
// #endif
|
|||
|
|
name: name,
|
|||
|
|
formData,
|
|||
|
|
...options
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|