223 lines
5.4 KiB
JavaScript
223 lines
5.4 KiB
JavaScript
import { VUE_APP_API_URL, VUE_APP_UPLOAD_URL } from "@/config";
|
||
import cookie from "@/utils/cookie";
|
||
import { handleLoginFailure } from "@/utils/index";
|
||
import qs from 'qs'
|
||
|
||
function baseUrl() {
|
||
let url
|
||
// #ifdef H5
|
||
// h5开发环境直接走代理 vite.config.js
|
||
if (process.env.NODE_ENV === 'development') {
|
||
url = '/yshop-api'
|
||
} else {
|
||
url = VUE_APP_API_URL
|
||
}
|
||
// #endif
|
||
// #ifndef H5
|
||
url = VUE_APP_API_URL
|
||
// #endif
|
||
return url
|
||
}
|
||
|
||
class RequestUtil {
|
||
|
||
// 超时时间(毫秒)
|
||
requestTimeout = 10000
|
||
// 默认参数
|
||
defaultOptions = {}
|
||
|
||
|
||
/**
|
||
* 请求
|
||
* @param options
|
||
* @return {Promise<any>}
|
||
*/
|
||
doRequest(options = {}) {
|
||
options = this.beforeRequest(options)
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
...options,
|
||
url: `${ baseUrl() }${ options.url }`,
|
||
timeout: this.requestTimeout,
|
||
success: (res) => {
|
||
this.afterResponse(res, resolve, reject)
|
||
},
|
||
fail: (err) => {
|
||
uni.showToast({title: '请求出错了', icon: 'none'})
|
||
console.error(err)
|
||
reject(err)
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 请求拦截器
|
||
* @param options
|
||
*/
|
||
beforeRequest(options) {
|
||
// 合并options,用户优先
|
||
options = {
|
||
header: {},
|
||
...this.defaultOptions,
|
||
...options
|
||
}
|
||
// 设置header
|
||
const token = cookie.get('accessToken')
|
||
options.header = {
|
||
...options.header,
|
||
Authorization: token.accessToken ? 'Bearer ' + token.accessToken : '',
|
||
}
|
||
// 处理get参数被吃掉问题
|
||
if (options.method && options.method.toLowerCase() === 'get' && options.data) {
|
||
// 如果是get请求,且params是数组类型如arr=[1,2],则转换成arr=1&arr=2
|
||
// const newData = stringify(options.data)
|
||
// delete options.data;
|
||
const data = qs.stringify(options.data);
|
||
if (data) {
|
||
delete options.data
|
||
options.url = `${ options.url }?${ data }`;
|
||
}
|
||
}
|
||
return options
|
||
}
|
||
|
||
/**
|
||
* 响应拦截器(处理器)
|
||
* @param res {RequestSuccessCallbackResult} 响应
|
||
* @param resolve
|
||
* @param reject
|
||
*/
|
||
afterResponse(res, resolve, reject) {
|
||
uni.hideLoading()
|
||
if (res.errMsg === 'uploadFile:ok') {
|
||
res.data = JSON.parse(res.data)
|
||
}
|
||
// 请求statusCode非200
|
||
if (res.statusCode !== 200) {
|
||
return reject(res.data)
|
||
}
|
||
const {data} = res
|
||
// 无权限
|
||
if ([401].includes(data.code)) {
|
||
handleLoginFailure()
|
||
return reject(data)
|
||
}
|
||
// 拦截后端响应code
|
||
if (![0, 200].includes(data.code)) {
|
||
if ([1008007023].includes(data.code)) {
|
||
return reject(data)
|
||
}
|
||
setTimeout(() => {
|
||
uni.showToast({title: data.msg, icon: 'none'})
|
||
}, 50)
|
||
return reject(data)
|
||
}
|
||
resolve(data.data)
|
||
}
|
||
|
||
/**
|
||
* get
|
||
* @param url
|
||
* @param data
|
||
* @return {Promise<*>}
|
||
*/
|
||
get(url, data = {}) {
|
||
return this.doRequest({
|
||
url,
|
||
data,
|
||
method: 'GET'
|
||
})
|
||
}
|
||
|
||
/**
|
||
* post
|
||
* @param url
|
||
* @param data
|
||
* @return {Promise<*>}
|
||
*/
|
||
post(url, data = {}) {
|
||
return this.doRequest({
|
||
url,
|
||
data,
|
||
method: 'POST'
|
||
})
|
||
}
|
||
|
||
/**
|
||
* put
|
||
* @param url
|
||
* @param data
|
||
* @return {Promise<*>}
|
||
*/
|
||
put(url, data = {}) {
|
||
return this.doRequest({
|
||
url,
|
||
data,
|
||
method: 'PUT'
|
||
})
|
||
}
|
||
|
||
/**
|
||
* delete
|
||
* @param url
|
||
* @param data
|
||
* @return {Promise<*>}
|
||
*/
|
||
delete(url, data = {}) {
|
||
return this.doRequest({
|
||
url,
|
||
data,
|
||
method: 'DELETE'
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 上传
|
||
* @param options
|
||
* @return {Promise<unknown>}
|
||
* @doc https://zh.uniapp.dcloud.io/api/request/network-file.html
|
||
*/
|
||
upload(options) {
|
||
options = this.beforeRequest(options)
|
||
return new Promise((resolve, reject) => {
|
||
uni.uploadFile({
|
||
...options,
|
||
url: `${ baseUrl() }${ options.url || VUE_APP_UPLOAD_URL }`,
|
||
success: (uploadFileRes) => {
|
||
this.afterResponse(uploadFileRes, resolve, reject)
|
||
},
|
||
fail(err) {
|
||
reject(err)
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 下载
|
||
* @param url
|
||
* @return {Promise<unknown>}
|
||
* @doc https://zh.uniapp.dcloud.io/api/request/network-file.html
|
||
*/
|
||
download(url) {
|
||
return new Promise((resolve, reject) => {
|
||
Request.downLoadTask = uni.downloadFile({
|
||
url,
|
||
success: (res) => {
|
||
if (res.statusCode === 200) {
|
||
return resolve(res)
|
||
}
|
||
return reject(res)
|
||
},
|
||
fail: (err) => {
|
||
reject(err)
|
||
}
|
||
});
|
||
})
|
||
}
|
||
}
|
||
|
||
|
||
export const requestUtil = new RequestUtil()
|