327 lines
8.6 KiB
JavaScript
327 lines
8.6 KiB
JavaScript
import cookie from 'js-cookie'
|
||
import CONFIG from './config.js'
|
||
import CONSTANT from './constant.js'
|
||
import AES from "@/utils/cryptoJs/aes.js";
|
||
import { tansParams } from "@/utils/cryptoJs/bonus.js";
|
||
// import utils from '@/assets/js/util/utils.js';
|
||
/**
|
||
* 请求接口地址处理
|
||
*/
|
||
const _config = {
|
||
env: process.env.NODE_ENV,
|
||
serverUrl() {
|
||
console.log(this.env)
|
||
switch (this.env) {
|
||
case 'development':
|
||
return CONFIG.TEST_URL;
|
||
case 'production':
|
||
return CONFIG.PROD_URL;
|
||
}
|
||
},
|
||
//新增一个是否开发环境
|
||
isDev() {
|
||
return this.env === 'development';
|
||
},
|
||
api(url, mock) {
|
||
// 判断运行环境
|
||
let href = ''
|
||
//此处不把系统服务端地址暴露在本地缓存中,完全按照 identity 来判断
|
||
// let identity = uni.getStorageSync('identity');
|
||
let identity = 'Test'
|
||
if (identity === 'Test') {
|
||
href = `${CONFIG.TEST_URL}${url}`
|
||
} else if (identity === 'Poc') {
|
||
href = `${CONFIG.POC_URL}${url}`
|
||
} else {
|
||
href = `${CONFIG.PROD_URL}${url}`
|
||
}
|
||
// console.log(identity, href, 'identity, href')
|
||
// // 如果 mock 为 true,使用RAP2 联调地址(开发使用)
|
||
// if (mock === 1) {
|
||
// return `http://rap2.tydiczt.cn:8001/app/mock/230${url}`;
|
||
// } else if (mock) {
|
||
// return `http://rap2.tydiczt.cn:8001/app/mock/228${url}`;
|
||
// } else {
|
||
// return href;
|
||
// }
|
||
// console.log(href, 'href');
|
||
return href;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 接口请求统一处理方法
|
||
*/
|
||
const _fn = {
|
||
/**
|
||
* 接口调用成功的回调函数
|
||
*/
|
||
success(resolve, reject, res) {
|
||
// console.log(res, 'response');
|
||
// header token 放到外围记录,放在里面可能会丢失
|
||
if (res?.header?.Authorization) {
|
||
// console.log(res.header.authorization, 'res.header.authorization')
|
||
// H5里面 authorization 首字母小写
|
||
uni.setStorageSync('auth-token', res.header.Authorization)
|
||
// #ifdef H5
|
||
cookie.set('admin-token', res.header.Authorization)
|
||
// #endif
|
||
}else if (res?.header?.Authorization) {
|
||
// 安卓 Authorization 首字母大写
|
||
// console.log(res.header.Authorization, 'res.header.Authorization')
|
||
uni.setStorageSync('auth-token', res.header.Authorization)
|
||
// #ifdef H5
|
||
cookie.set('admin-token', res.header.Authorization)
|
||
// #endif
|
||
}
|
||
|
||
if(res.data.decrypt){
|
||
res.data=AES.decrypt(res.data.data)
|
||
}
|
||
console.log(res.data,'//////request res////////////')
|
||
|
||
// 接口返回res.data是string类型,需转成json类型
|
||
if (typeof res.data === 'string') {
|
||
try {
|
||
res.data = JSON.parse(res.data);
|
||
} catch (e) {
|
||
console.error(`==接口出参string转json失败`);
|
||
}
|
||
}
|
||
switch (res.data.code) {
|
||
case 200:
|
||
// console.log('200',res)
|
||
//如果没有code属性,表示不是后端返回,不判断
|
||
if (res.data.code === 200) {
|
||
resolve(res.data);
|
||
} else {
|
||
reject(res.data)
|
||
}
|
||
break;
|
||
case 401:
|
||
if (res.data.code !== 200) {
|
||
// 未登录或Token过期
|
||
if (res.data.code === 401) {
|
||
console.log('401')
|
||
// 清除登录信息的缓存数据
|
||
uni.removeStorageSync('auth-token');
|
||
// 获取当前页面的路由名
|
||
const routes = getCurrentPages(); // 获取当前打开过的页面路由数组
|
||
const curRoutePath = routes[routes.length - 1].route; // 获取当前页面路由
|
||
const curRouteSplit = curRoutePath.split('/');
|
||
const curRouteName = curRouteSplit[curRouteSplit.length - 1]; // 获取当前页面的路由名称
|
||
// 启动页获取用户信息,也不能再跳转回来,
|
||
// 当前页面如果是登录页就不再跳转 login
|
||
if (!['blank', 'login'].includes(curRouteName)) {
|
||
//对应页面退出后,把页面地址作为参数传给登录页面
|
||
let rediect = routes[routes.length - 1]['$page']['fullPath']
|
||
console.log(rediect, 'rediect')
|
||
// 记录到缓存需要首页跳转
|
||
// 加个判断,如果页面url带的参数过长,不记录首页跳转
|
||
if (rediect && rediect.length < 100)
|
||
uni.setStorageSync('rediect', rediect)
|
||
}
|
||
uni.reLaunch({
|
||
url: '/pages/login/login'
|
||
});
|
||
}
|
||
else {
|
||
reject(res.data)
|
||
if (_config.isDev())
|
||
console.error(`==网络异常==`, res);
|
||
// uni.showToast({
|
||
// title: res.data.message || '接口异常',
|
||
// icon: 'none'
|
||
// });
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
// console.log(res);
|
||
reject(res.data);
|
||
if (_config.isDev())
|
||
console.error(`==网络异常==`, res);
|
||
uni.showToast({
|
||
title: res?.data?.msg || '网络异常',
|
||
icon: 'none'
|
||
});
|
||
break;
|
||
}
|
||
},
|
||
/**
|
||
* 接口调用失败的回调函数
|
||
*/
|
||
fail(resolve, reject, res) {
|
||
console.error('==接口请求失败==', res);
|
||
reject(res.data);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @param {Object} 接受一个对象作为参数
|
||
* {
|
||
* url: url地址,
|
||
* data: 请求参数,
|
||
* mock: 启用 rap2 联调测试
|
||
* method: 请求方法,默认'GET',
|
||
* contentType: 数据类型,默认'json',
|
||
* disableLoad: 是否禁用加载框,默认false
|
||
* }
|
||
* @return {Promise} 返回一个Promise对象
|
||
* @desc '只有在接口返回的statusCode === 200 并且 res.data.status === 1才resolve,其他情况为reject'
|
||
*/
|
||
let os = null
|
||
const request = ({
|
||
url,
|
||
data = {},
|
||
mock = false,
|
||
option,
|
||
method = 'GET',
|
||
// contentType = 'json'
|
||
}) => {
|
||
// console.log(method)
|
||
if (method=== 'GET') {
|
||
let param=tansParams(data);
|
||
// console.log(param)
|
||
if(param){
|
||
param = param.slice(0, -1);
|
||
param=AES.encrypt(param);
|
||
}
|
||
|
||
url = url + '?' + param;
|
||
}
|
||
if(option.header&&option.header.decrypt=='decrypt') {
|
||
data=data
|
||
}else{
|
||
//参数加密
|
||
data=AES.encrypt(JSON.stringify(data))
|
||
// console.log('request data',data);
|
||
}
|
||
|
||
let contentType = 'application/x-www-form-urlencoded'
|
||
let timeout = 20000
|
||
// console.log(option)
|
||
if (option.contentType === 'form') {
|
||
contentType = 'application/json';
|
||
}
|
||
if (option.contentType === 'upload') {
|
||
contentType = 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW';
|
||
}
|
||
if(option.timeout) {
|
||
timeout = option.timeout
|
||
}
|
||
const header = {
|
||
'Content-Type': contentType,
|
||
// H5 方式 token 存在 cookie 的 admin-token 中,因为需要跨项目共享token
|
||
'Authorization': uni.getStorageSync('auth-token') ?? '',
|
||
'token': uni.getStorageSync('auth-token') ?? '',
|
||
// 'decrypt':'decrypt',
|
||
// #ifndef H5
|
||
'cookie': '', //此处由于APP会自动带上H5的cookie,所以APP此处cookie置空
|
||
// #endif
|
||
// 'version': CONSTANT.VERSIONNAME,
|
||
// os,
|
||
// #ifdef H5 || MP-WEIXIN
|
||
// 'loginType': 'reserveH5',
|
||
// #endif
|
||
// #ifdef APP-PLUS
|
||
'loginType': 'app',
|
||
// #endif
|
||
}
|
||
|
||
// else {
|
||
// contentType = 'multipart/form-data';
|
||
// }
|
||
// console.log(option)
|
||
// console.log(option.header, 'option.header')
|
||
if(option.header) {
|
||
Object.assign(header, option.header);
|
||
}
|
||
|
||
|
||
// console.log(header, 'request header');
|
||
// console.log(data, 'request data');
|
||
// console.log(url, header, 'header.loginType')
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url: _config.api(url, mock),
|
||
data,
|
||
method,
|
||
header,
|
||
dataType: 'json',
|
||
responseType: 'text',
|
||
timeout,
|
||
success: function(res) {
|
||
_fn.success(resolve, reject, res);
|
||
// resolve(res.data);
|
||
},
|
||
fail: function(res) {
|
||
_fn.fail(resolve, reject, res);
|
||
// reject(res.data);
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
/**
|
||
* @param {Object} 接受一个对象作为参数
|
||
* {
|
||
* url: url地址,
|
||
* filePath: 文件路径,
|
||
* disableLoad: 是否禁用加载框,默认false
|
||
* }
|
||
* @return {Promise} 返回一个Promise对象
|
||
* @desc '只有在接口返回的statusCode === 200 并且 res.data.status === 1才resolve,其他情况为reject'
|
||
*/
|
||
const upload = ({
|
||
url,
|
||
filePath = '',
|
||
disableLoad = false
|
||
}) => {
|
||
|
||
const header = {
|
||
// 'content-type': contentType,
|
||
// H5 方式 token 存在 cookie 的 admin-token 中,因为需要跨项目共享token(智能客服)
|
||
// #ifndef H5
|
||
'Authorization': uni.getStorageSync('auth-token') ?? '',
|
||
'cookie': '', // 此处由于APP会自动带上H5的cookie,所以APP此处cookie置空
|
||
// #endif
|
||
'version': CONSTANT.VERSIONNAME,
|
||
os,
|
||
// #ifdef H5 || MP-WEIXIN
|
||
'loginType': 'reserveH5',
|
||
// #endif
|
||
// #ifdef APP-PLUS
|
||
'loginType': 'app',
|
||
// #endif
|
||
}
|
||
// if(option.header) {
|
||
// Object.assign(header, option.header);
|
||
// }
|
||
return new Promise((resolve, reject) => {
|
||
uni.uploadFile({
|
||
url: _config.api(url),
|
||
filePath,
|
||
header,
|
||
name: 'file',
|
||
// formData: {
|
||
// projectname: 'app'
|
||
// },
|
||
success: function(res) {
|
||
// _fn.success(resolve, reject, res);
|
||
resolve(res);
|
||
},
|
||
fail: function(res) {
|
||
// _fn.fail(resolve, reject, res);
|
||
reject(res);
|
||
}
|
||
});
|
||
})
|
||
}
|
||
|
||
export {
|
||
request,
|
||
upload,
|
||
_config
|
||
}
|