mrr.sj.front/utils/request3.js

354 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 基础配置
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
})
}
}