Files
mgm-daylight-mcrm-mobile-ios/common/request.js
T
2026-09-16 10:43:59 +08:00

207 lines
6.4 KiB
JavaScript

import {refreshToken} from '../api/commonApi.js'
import dayjs from '../uni_modules/uview-ui/libs/util/dayjs.js';
// 此vm参数为页面的实例,可以通过它引用vuex中的变量
module.exports = (vm) => {
// 请求拦截
uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
// 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
config.data = config.data || {}
// 根据custom参数中配置的是否需要token,添加对应的请求头
// #ifdef APP-PLUS
if(
config.url!==undefined && config.url!==''
&& config.url.indexOf('logout')==-1
&& config.url.indexOf('Logout')==-1
&& config.url.indexOf('login')==-1
&& config.url.indexOf('Login')==-1
&& config.url.indexOf('setting')==-1
&& config.url.indexOf('regionRestrict')==-1
&& config.url.indexOf('refresh_token')==-1
&& config.url.indexOf('adfs')==-1
&& config.url.indexOf('/me')==-1
&& config.url.indexOf('sys_setting/get_list')==-1
&& config.url.indexOf('sso/get_sso_token_by_code')==-1
&& config.url.indexOf('sso/user_sso_login')==-1
&& config.url.indexOf('sso/mock_user_sso_login')==-1
&& config.url.indexOf('write_log')==-1
)
{
let siteData = uni.getStorageSync("siteData");
//模拟内网登录 打包删除
// siteData.internalTag=true;
//模拟内网登录 打包删除
if(siteData!==undefined && siteData!==null && siteData.internalTag===false)
{
getApp().checkLocationAndVPN();
}
}
// #endif
if(config?.custom?.auth) {
const token = uni.getStorageSync("token")
const clientId = uni.getStorageSync("clientId")
config.header.Authorization = token;
config.header.ClientId = clientId;
// #ifdef APP-PLUS
config.header.Origin = config.custom.origin;
// #endif
if(config.url.indexOf('refresh_token')==-1 ){
// checkToken();
}else{
config.header.RefreshToken = uni.getStorageSync("refreshToken")
}
}
return config
}, config => { // 可使用async await 做异步操作
return Promise.reject(config)
})
// 响应拦截
uni.$u.http.interceptors.response.use((response) => {
/* 对响应成功做点什么 可使用async await 做异步操作*/
const data = response.data
// 自定义参数
// const custom = response.config?.custom
if (data.code != 0) {
// 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示
if (data.success==false && data.message) {
console.log(data.message)
}
let url = response.config.url
let isCheck = (url!==undefined && url!==''
&& url.indexOf('logout')==-1
&& url.indexOf('Logout')==-1
&& url.indexOf('login')==-1
&& url.indexOf('Login')==-1
&& url.indexOf('setting')==-1
&& url.indexOf('regionRestrict')==-1
&& url.indexOf('refresh_token')==-1
&& url.indexOf('adfs')==-1
&& url.indexOf('/me')==-1
&& url.indexOf('sys_setting/get_list')==-1
&& url.indexOf('sso/get_sso_token_by_code')==-1
&& url.indexOf('save_confirm_log')==-1
&& url.indexOf('write_log')==-1);
if(isCheck){
checkIP(response.header)
}
if(url.indexOf('mock_user_sso_login')!=-1){
checkIP(response.header)
}
// // 如果需要catch返回,则进行reject
// if (custom?.catch) {
// return Promise.reject(data)
// } else {
// // 否则返回一个pending中的promise,请求不会进入catch中
// return new Promise(() => {})
// }
}
return data === undefined ? {} : data
}, (error) => {
console.log(error)
if( error.errMsg=="request:ok") {
error.errMsg= "request:fail";
if(error.data!=undefined){
if(error.data.message!=undefined){
if(error.data.message=="The token was expected to have 3 parts, but got 1."){
uni.$u.toast(error.errMsg)
kickout()
}
}
}
}
if(error.errMsg!==undefined && error.errMsg!=="request:fail" && error.errMsg!=="request:ok" && error.errMsg.indexOf('-1')<=0 && !error.errMsg.includes("request:fail abort")){
uni.$u.toast(error.errMsg)
}
switch (error.statusCode) {
case 403:
break;
case 400:
kickout()
break;
case 401:
if(error.config.url.indexOf('refresh_token')==-1 && error.config.url.indexOf('logout')==-1 && !error.config.custom?.tokenRetried){
error.config.custom = {...error.config.custom, tokenRetried: true};
return tokenRefresh().then(_ => {
error.config.header.Authorization = uni.getStorageSync("token");
error.config.header.RefreshToken = uni.getStorageSync("refreshToken")
error.config.baseURL = undefined;
return uni.$u.http.request(error.config);
})
}else{
kickout()
}
default:
break;
}
return Promise.reject(error)
})
}
function tokenRefresh(){
const storedRefreshToken = uni.getStorageSync("refreshToken");
if (storedRefreshToken) {
return refreshToken({})
.then((data) => {
if (!data?.success || !data.accessToken) throw new Error('Token refresh failed');
uni.setStorageSync("token",data.accessToken);
uni.setStorageSync("tokenTime",dayjs().unix());
return Promise.resolve(true)
})
.catch(error => {
kickout()
return Promise.reject(error);
})
} else {
kickout()
return Promise.reject(new Error('Missing RefreshToken'));
}
}
function checkToken(){
let now = Math.floor(new Date().getTime() / 1000);
let tokenTime = uni.getStorageSync("tokenTime");
let token = uni.getStorageSync("token")
//4 min refresh token
if(token!="" && now - tokenTime>240){
tokenRefresh()
}
}
function kickout() {
uni.removeStorageSync("userData");
uni.removeStorageSync("token");
uni.removeStorageSync("idToken");
uni.removeStorageSync("clientId");
uni.removeStorageSync("refreshToken");
uni.redirectTo({
url:'/pages/login/login'
})
}
function checkIP(header){
let isInternal = header.IsInternal
let macauIP = header.MacauIP
//console.log(header);
if(isInternal!=undefined){
let internal = false;
if(isInternal=="true") internal = true;
let siteData = uni.getStorageSync("siteData");
if(siteData){
siteData.internalTag = internal;
if(macauIP!=undefined && macauIP!="" && macauIP == "true")
siteData.macauIp = true;
else
siteData.macauIp = false;
uni.setStorageSync("siteData",siteData);
}
/*if(!internal){
if(macauIP!=undefined && macauIP!="" && macauIP == "false"){
getApp().navTo('/pages/regionRestrict/regionRestrict?type=7',0,false); //8
}
}*/
}
}