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 }