// @ts-ignore import axios from "axios"; import qs from 'querystring'; import Vue from 'vue'; import environment from "../environment/environment"; import common from "../js/common"; import Constant from '../constant/constant' import fileDownload from 'js-file-download' declare const $: any; // 代理商host const agentHost = environment.platform === 'develop' ? environment.agentHost : location.host; /** * 请求接口 * @param interfaceName {String} 接口名称 * @param params {Object} 参数 * @param type {String} 参数类型--all:补充userID和token|token:补充token|original:保留原样(但会去除undefined和null) * @param interfaceType {String} 接口类型 --base | oam */ function request(interfaceName: string, params: any, type: any = 'token', interfaceType: string = 'base') { // @ts-ignore let platform = window['$platform']; let baseURL = ''; console.log(environment.platform); params && params !== '' && (params.export = null); switch (interfaceType) { case 'base': baseURL = environment.apiPrefix; break; case 'oam': baseURL = environment.apiOam; break; } let url = baseURL + interfaceName; return new Promise((resolve, reject) => { // @ts-ignore axios({ method: 'post', url: url, data: sortingParameters(params, type, interfaceType, platform), headers: { 'agent-host': agentHost } }).then((res: any) => { resolve(res.data); }).catch((error: any) => { reject(handleError(error)) }) }) } /** * 文件下载请求接口 * @param interfaceName {String} 接口名称 * @param params {Object} 参数 * @param type {String} 参数类型--all:补充userID和token|token:补充token|original:保留原样(但会去除undefined和null) * @param interfaceType {String} 接口类型 --base | oam */ function fileDown(interfaceName: string, params: any, type: any = 'token', interfaceType: string = 'base', paramsFileName: string) { // @ts-ignore let platform = window['$platform']; params.limitStart = 0 params.limitCount = Constant.EXPORT_COUNT; params.export = true; params = clearUselessParams(params); params[interfaceType === 'base' ? 'ewalkToken' : 'authToken'] = common.getUserToken(interfaceType, platform); let baseURL = ''; switch (interfaceType) { case 'base': baseURL = environment.apiPrefix; break; case 'oam': baseURL = environment.apiOam; break; } let url = baseURL + interfaceName; let data = sortingParameters(params, type, interfaceType, platform); // @ts-ignore return new Promise((resolve, reject) => { axios({ method: 'post', url: url, data: data, // params: params, responseType: 'blob', headers: { 'agent-host': agentHost, } }).then((res:any) => { const contentDisposition = res.headers['content-disposition'] // 从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名; const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*') const result = patt.exec(contentDisposition); const filename = result && decodeURI(escape(result[1])); // 处理文件名,解决中文乱码问题 let fileName = filename || paramsFileName; fileDownload(res.data, fileName + '.xlsx') }) }) } /** * 请求接口 * @param interfaceName {String} 接口名称 * @param params {Object} 参数 * @param type {String} 参数类型--all:补充userID和token|token:补充token|original:保留原样(但会去除undefined和null) * @param interfaceType {String} 接口类型 --base | oam */ function exportDoc(interfaceName: string, params: any, type: any = 'token', interfaceType: string = 'base') { // @ts-ignore let platform = window['$platform']; params.limitStart = 0 params.limitCount = Constant.EXPORT_COUNT; params.export = true; let baseURL = ''; let url = '' switch (interfaceType) { case 'base': baseURL = environment.apiPrefix; break; case 'oam': baseURL = environment.apiOam; break; } let data = sortingParameters(params, type, 'base', platform); url = baseURL + interfaceName + '?' + data; window.open(url) } /** * 请求接口 * @param interfaceName {String} 接口名称 * @param params {Object} 参数 * @param interfaceType {String} 接口类型 --base | oam */ function upload(interfaceName: string, params: any, interfaceType: string = 'base') { let baseURL = ''; switch (interfaceType) { case 'base': baseURL = environment.apiPrefix; break; case 'oam': baseURL = environment.apiOam; break; } let configs = { headers: { 'Content-Type': 'multipart/form-data', 'agent-host': agentHost } }; let url = baseURL + interfaceName; return new Promise((resolve, reject) => { // @ts-ignore axios.post(url, params, configs).then(res => { resolve(res); }).catch((error: any) => { reject(handleError(error)) }) }) } /** * 请求接口 * @param interfaceName {String} 接口名称 * @param params {Object} 参数 * @param type {String} 参数类型--all:补充userID和token|token:补充token|original:保留原样(但会去除undefined和null) */ function requestGet(interfaceName: string, params: any, type: any = 'token') { // @ts-ignore let platform = window['$platform']; let url = environment.apiPrefix + interfaceName; return new Promise((resolve, reject) => { // @ts-ignore axios({ method: 'get', url: url, data: sortingParameters(params, type, 'base', platform), headers: { 'agent-host': agentHost } }).then((res: any) => { resolve(res.data); }).catch((error: any) => { reject(error) }) }) } /** * 整理参数 * @param params {Object} 参数 * @param type {String} 参数类型--all:补充userID和token|token:补充token|original:保留原样(但会去除undefined和null) * @param interfaceType {String} 接口类型,oam的tokenKey是authToken, * @param platform {String} 平台 */ function sortingParameters(params: any, type: string, interfaceType: string = 'base', platform: string = 'eap') { switch (type) { case 'all': params = clearUselessParams(params); params[interfaceType === 'base' ? 'ewalkToken' : 'authToken'] = common.getUserToken(interfaceType, platform); params['userID'] = common.getCookie(platform === 'eap' ? 'userID' : 'front_userID'); break; case 'token': params = clearUselessParams(params); params[interfaceType === 'base' ? 'ewalkToken' : 'authToken'] = common.getUserToken(interfaceType, platform); break; case 'original': params['ewalkToken'] = common.getUserToken(); params = clearUselessParams(params, 'null&undefine'); break; case 'emParams': params[interfaceType === 'base' ? 'ewalkToken' : 'authToken'] = common.getUserToken(interfaceType, platform); break; } return qs.stringify(params); } /** * 清除无用数据 * @param params {String} 参数 * @param type {String} 清除类型--all:全部(空,undefined,null)|&字符拼接 */ function clearUselessParams(params: any, type: string = 'all') { let useless = []; if (type === 'all') { useless = ['', undefined, null]; } else { useless = type.split('&'); } let newParams: any = {}; for (let i in params) { if (useless.indexOf(params[i]) === -1) { newParams[i] = params[i] } } return newParams; } /** 错误处理 */ function handleError(error: any) { if (error.response) { error = error.response; let msg = ''; if (error.data.protocol !== 'default' || error.status === 404) { msg = '服务器找不到请求的网页!'; } if (['TokenLogicException'].indexOf(error.data.errorType) > -1) { msg = '登录会话已过期,请重新登录!'; // 如果是控制台则清空cookie跳转登录页面,否则清空cookie直接获取游客token即可 // 这里先用UserID判断,因为有userID证明登录过,但是过期了。 let userID = common.getUserID(); if (userID) { common.clearAllCookie(); // setTimeout(() => { // window.location.href = '/login'; // },1000) Vue.prototype.$layer && Vue.prototype.$layer.msg(msg, {type: 'error'}); } else if (userID === undefined) { msg = '会话已超时,请重新进行连接!'; Vue.prototype.$layer && openTip(msg); } // 解决 直接跳转http://121.201.72.2:30005/ 出现的问题 // window.location.href = window.location.host+'/login' // @ts-ignore let platform = window['$platform']; let deployMode = environment.deployMode; window.location.href = platform === 'ecp' && deployMode === 'domain' ? '/manage/login' : platform === 'eap' && deployMode === 'domain' ? '/admin/login' : '/login'; } else if (['CustomerLogicException', 'BottomException', 'AuthorizationException', 'AuthCenterException', 'ValidatorException'].indexOf(error.data.errorType) > -1) { msg = 'show'; } else { msg = '很抱歉,系统繁忙,请稍后重试!'; } const err = { // 这部分是后端接口返回的 errorMsg: msg === 'show' ? error.data.errorMsg : msg, // 转换后的错误信息 errorType: error.data.errorType, // 接口返回的错误类型 protocol: error.data.protocol, // 这个不知道是什么鬼,接口返回的 protocol // 这部分是http请求返回的 status: error.status, // http请求的状态 statusText: error.statusText // http返回的状态文本说明 }; return err; } else { error.errorMsg = '很抱歉,系统繁忙,请稍后重试!'; } return error; } /**创建游客Token */ function createToken() { request('/CreateToken', {userID: 'EW_VISITOR'}, 'original').then((res: any) => { common.setCookie('front_ewalkToken', res.data); }).catch((error: any) => { console.log(error) }) } /**打开登录提示 */ function openTip(msg: string) { let haveTip = document.getElementById('layer-token-tip'); if (haveTip) { return; } let div = document.createElement('div'); div.setAttribute("class", "popup-container"); div.innerHTML = msg; div.id = "layer-token-tip"; document.body.appendChild(div); setTimeout(() => { Vue.prototype.$layer.open({ title: "温馨提示", id: div.id, icon: 'icon-tips', btn: { confirm: '前往登录', cancel: '游客访问' }, area: { width: '200px', }, confirm: () => { common.clearAllCookie(); // @ts-ignore let platform = window['$platform']; let deployMode = environment.deployMode; window.location.href = platform === 'ecp' && deployMode === 'domain' ? '/manage/login' : platform === 'eap' && deployMode === 'domain' ? '/admin/login' : '/login'; }, cancel: () => { createToken(); setTimeout(() => { document.body.removeChild(div); }, 200) } }) }, 200) } export default { request, // 请求接口 upload, fileDown, requestGet, apiPrefix: environment.apiPrefix, apiOam: environment.apiOam, exportDoc, createToken, }