http.interceptor.js 3.33 KB
//免登录接口
import util from '@/utils/util.js'
// let noLoginUrl = [
// 	'/v1/h5/settled/get-settled-info',
// 	'/v1/h5/settled/area',
// 	'/v1/h5/settled/save-info',
// ];
// 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token
// 同时,我们也可以在此使用getApp().globalData,如果你把token放在getApp().globalData的话,也是可以使用的
const globalUrl = process.uniEnv || {}

const install = (Vue, vm) => {
	let systemApiUrl = globalUrl.systemUrl.apiUrl
	let ucenterApiUrl = globalUrl.ucenterUrl.apiUrl
	let xueApiUrl = globalUrl.ucenterUrl.xueUrl
	
	function toLoginPage(){
		const app = getApp()
		let curpath = vm.$Route.path
		if(curpath == '/pages/login/index') {
			// 如果已经在登录页,无需再次跳转
			return false
		}
		vm.$u.route('/pages/login/index');	
	}
	Vue.prototype.$u.http.setConfig({
		baseUrl: systemApiUrl,
		header: {
			'content-type': 'application/json; charset=utf-8'
		},
		originalData: true
	});
	// 请求拦截,配置Token等参数
	Vue.prototype.$u.http.interceptor.request = (config) => {
		const reg = /\?\w+/;
		let token = vm.vuex_token
		// if(!token && noLoginUrl.indexOf(config.url)<0){
		// 	toLoginPage()
		// 	return false
		// }
		if(config.url.indexOf('access-token=')>=0 && config.params['access-token']){
			// 给默认参数增加access-token (Java端)
			if(reg.test(config.url)){
				config.url += '&access-token=' + token
			}else{
				config.url += '?access-token=' + token
			}
		}
		if(config.url.indexOf(ucenterApiUrl)>-1 || config.url.indexOf(xueApiUrl)>-1){
			// php端增加header Authorization
			config.header['Authorization'] = token
		}
		
		// config.header.token = vm.vuex_token || 'RTOKENe56f873b5823477fa2e15572f8fa7eb3a5fb6f7b';
		config.header['x-requested-with'] = 'xmlhttprequest';
		return config;
	}
	function getCode(res){
		const result = res.data || res
		// let code
		// if(result.hasOwnProperty('statusCode')){
		// 	code = res.statusCode
		// }else if(result.hasOwnProperty('code')){
		// 	code = result.code
		// }
		return result.statusCode || result.code || res.statusCode || res.code
	}
	function getMsg(res){
		res = res.data || res
		let msg = res.message || res.errMsg
		if(res.code == 200 || res.status == true || msg) {
			return msg
		}
		return msg || '请求错误'
	}
	// 响应拦截,判断状态码是否通过
	Vue.prototype.$u.http.interceptor.response = (res) => {		
		let result = res.data || res;
		let msg = getMsg(res)
		//返回__token__,设置
		// if (res.header.__token__) {
		// 	vm.$u.vuex('vuex__token__', res.header.__token__);
		// }
		const code = getCode(res)
		switch (code) {
			case 1:				
			case 0:
				// return result;
			case 200:
				return {
					data:result.data || result,
					code:code,
					message:msg
				};
			case 401:
				// token失效,清空登录信息,同时跳转登录
				vm.$u.vuex('vuex_token', '');
				vm.$u.vuex('vuex_user', null);
				vm.$u.vuex('vuex_wx_uid', '');
				toLoginPage()
			case 403://没有权限访问
			case 500:
				// return result;				
			default:
				return {
					data:result,
					code:code,
					message:msg
				};	
				// vm.$u.toast('网络请求错误!');
		}
	}
}
// 将返回值统一封装为直接返回对象的统一封装{data:data,code:200,message:message}形式


export default {
	install
}