Files
2024-03-21 15:54:39 +08:00

220 lines
4.9 KiB
JavaScript
Raw Permalink 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 preCacheKeyClearFetch = 'storage:clear:fetch:'
uni.pro.interceptor('request', {
config(paramOptions) {
let options = Object.assign({}, paramOptions)
options.url = uni.conf.baseUrl + paramOptions.url
this.options = options
return options
},
success(res) {
if (res.data.code == 1) {
return res.data
} else {
return res.data
}
}
})
function requestrequest(options) {
return new Promise((resolve, reject) => {
uni.request({
...options,
success: res => {
resolve(res.data) //异步操作执行成功
// if (res.data.code == 1) {
// resolve(res.data) //异步操作执行成功
// } else {
// console.log(res,'请求的接口没有找到');
// resolve(res.data) //异步操作执行失败
// }
}
})
})
}
async function request(options) {
try {
if (options.toast) {
// #ifdef MP-WEIXIN
uni.showLoading({
title: '加载中',
mask: true
})
// #endif
// #ifndef MP-WEIXIN
uni.pro.showLoading({
title: '加载中',
mask: true
})
// #endif
}
options.header = {
datamodel: uni.getStorageSync('loginuser') == 0 ? '' : uni.getStorageSync('loginuser').model_type,
token: uni.getStorageSync('loginuser') == 0 ? '' : uni.getStorageSync('loginuser').userinfo.token,
'store-id': uni.cache.get('store_id') ? uni.cache.get('store_id') : '',
}
// #ifdef MP-WEIXIN
options.url = uni.conf.baseUrl + options.url
let res = await requestrequest(options);
// #endif
// #ifndef MP-WEIXIN
let res = await uni.pro.request(options);
// #endif
if (res.code != 1) {
if (res.code == 401) {
let {
token
} = await uni.login()
uni.cache.set('storage:authorization', token, -1)
uni.cache.set('memory:refresh', true)
return await request(options)
} else if (res.code == 482) {
let nowTime = new Date() / 1000 | 0
let offset = parseInt(res.data.message) - parseInt(nowTime);
uni.cache.set('storage:offset-time', offset, -1)
return await request(options)
} else {
if (options.toast) {
uni.showToast({
title: res.message || res.msg,
icon: "none",
success() {
setTimeout(res => {
// if (options.toast) {
uni.hideLoading()
// }
}, 2000)
}
})
}
if (options.mask == 1) {
uni.showToast({
title: res.message || res.msg,
icon: "none",
success() {
setTimeout(res => {
// if (options.toast) {
uni.hideLoading()
// }
}, 2000)
}
})
}
}
} else {
uni.hideLoading()
let resdata = null
if (options.mask == 0) {
resdata = res.data == null ? '1' : res.data
} else {
resdata = res
}
return resdata
}
} catch (err) {
console.warn('uni.request fail [network]', options, err)
throw err;
} finally {
if (options.toast) {
setTimeout(res => {
uni.hideLoading()
}, 2000)
}
}
}
function isExpire(url) {
return uni.cache.get(preCacheKeyClearFetch + url)
}
/**
* 标记fetch过期会重新请求
* @author NanQi
* @param {String} url 标记的URL
*/
function markFetch(url) {
uni.cache.set(preCacheKeyClearFetch + url, true)
}
/**
* 拉取数据(get请求,带缓存)
* @author NanQi
* @param {String} url 请求的URL
* @param {Object} data 请求参数
* @param {Boolean} toast 是否显示toast
* @param {Number} expire 缓存过期时间(秒)
* @return {Promise} Promise对象
*/
async function fetch(url, data, toast = true, expire = uni.conf.default_expire) {
let param = ''
if (data) {
param += ':' + uni.utils.md5(uni.utils.sortTransform(data));
}
const cacheKey = 'memory:fetch:' + url + param;
const cacheVal = uni.cache.get(cacheKey);
if (!isExpire(url) && cacheVal) {
return Promise.resolve(cacheVal);
} else {
if (isExpire(url)) {
uni.cache.remove(preCacheKeyClearFetch + url)
}
try {
const res = await get(url, data, toast);
uni.cache.remove(cacheKey);
uni.cache.set(cacheKey, res, expire);
return res;
} catch (err) {
const res = uni.cache.getStorageData(cacheKey);
if (res) {
return Promise.resolve(res);
} else {
throw err;
}
}
}
}
/**
* 获取数据(get请求,不带缓存)
* @author NanQi
* @param {String} url 请求的URL
* @param {Object} data 请求参数
* @param {Boolean} toast 是否显示toast
* @return {Promise} Promise对象
*/
function get(url, data, toast = true) {
return request({
url,
data,
toast
})
}
/**
* post请求
* @author NanQi
* @param {String} url 请求的URL
* @param {Object} data 请求参数
* @param {Boolean} toast 是否显示toast
* @param {String} method 请求方式,默认POST
* @param {String} mask 返回data 0 0是正常 1是全部
* @return {Promise} Promise对象
*/
function post(url, data, toast = true, mask = 0, method = 'POST') {
return request({
url,
method,
data,
mask,
toast
})
}
uni.api = {
request,
markFetch,
fetch,
get,
post
}