import axios from 'axios' import qs from 'qs' import { notification } from 'antd' import md5 from 'md5' import moment from 'moment' import Utils from '@/utils/utils.js' import options from '@/store/options.js' let mkDataBase = null let storUsable = false if (window.openDatabase) { let service = window.GLOB.service ? '-' + window.GLOB.service.replace('/', '') : '' try { mkDataBase = openDatabase(`mkdb${service}`, '1', 'mk-pc-database', 50 * 1024 * 1024) mkDataBase.transaction(tx => { tx.executeSql('CREATE TABLE IF NOT EXISTS VERSIONS (version varchar(50), createDate varchar(50), CDefine1 varchar(50), CDefine2 varchar(50), CDefine3 varchar(50))', [], () => { }, () => { // eslint-disable-next-line throw 'CREATE TABLE ERROR' }) tx.executeSql('CREATE TABLE IF NOT EXISTS CONFIGS (menuid varchar(50), userid varchar(50), openEdition varchar(50), webEdition varchar(50), LongParam text, LongParamUser text, CDefine1 varchar(50), CDefine2 varchar(50), CDefine3 varchar(50), CDefine4 varchar(50), CDefine5 varchar(50))', [], () => { }, () => { // eslint-disable-next-line throw 'CREATE TABLE ERROR' }) }) // mkDataBase.transaction(tx => { // tx.executeSql('DROP TABLE VERSIONS') // tx.executeSql('DROP TABLE CONFIGS') // }) } catch (e) { console.warn(e) mkDataBase = null } } axios.defaults.crossDomain = true axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8' axios.defaults.withCredentials = true axios.interceptors.request.use((config) => { config.method = 'post' if (config.url.includes('LoginAndRedirect') || config.url.includes('getjsonresult') || config.url.includes('wxNativePay')) { config.data = qs.stringify(config.data) } else if (config.url.includes('Upload') || config.url.includes('doupload') || config.url.includes('dopreload')) { config.headers = { 'Content-Type': 'multipart/form-data' } } else { // config.headers.token = sessionStorage.getItem('TOKEN') || '' config.data = JSON.stringify(config.data) } return config }, (error) => { return Promise.reject(error) }) const setCurrentUrl = () => { if (!!(window.history && window.history.pushState)) { sessionStorage.clear() window.history.replaceState(null, null, window.location.href.split('#')[0] + '#/login') window.location.reload() } } window.GLOB.CacheMap = new Map() axios.interceptors.response.use((response) => { if (response.data.ErrCode === 'LoginError') { setCurrentUrl() } else { return Promise.resolve(response.data) } }, (error) => { notification.error({ className: 'notification-custom-error', bottom: 0, message: '状态码-' + error.response.status + ',请联系管理员', placement: 'bottomRight', duration: 15 }) return Promise.reject(error) }) class Api { constructor() { if (process.env.NODE_ENV === 'production') { axios.defaults.baseURL = document.location.origin + '/' + window.GLOB.service } else { // axios.defaults.baseURL = 'http://127.0.0.1:8888' } } /** * @description 使用dostar接口,跳过验证 * @param {Object} param 查询及提交参数 */ dostarInterface (param) { param.userid = param.userid || '' return axios({ url: '/webapi/dostar', data: param }) } /** * @description 使用dostar接口,跳转至dostars * @param {Object} param 查询及提交参数 */ dostarToDostars (param) { param.userid = param.userid || sessionStorage.getItem('UserID') || '' param.LoginUID = param.LoginUID || sessionStorage.getItem('LoginUID') || '' param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return axios({ url: '/webapi/dostar', data: param }) } /** * @description 游客登录 */ getTouristMsg () { let _SessionUid = localStorage.getItem('SessionUid') if (!_SessionUid) { // 手动清除SessionUid时,实时生成 _SessionUid = Utils.getuuid() localStorage.setItem('SessionUid', _SessionUid) } let param = { func: 's_visitor_login', timestamp: moment().format('YYYY-MM-DD HH:mm:ss') + '.000', SessionUid: _SessionUid, TypeCharOne: 'pc' } param.LText = md5(window.btoa(_SessionUid + param.timestamp)) param.secretkey = md5(param.LText + 'mingke' + param.timestamp) param.appkey = window.GLOB.appkey || '' if (window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi.replace(/\/webapi(.*)/, '/webapi/dologon') } return axios({ url: '/webapi/dologon', data: param }) } /** * @description 手机号验证码登录 */ getphoneusermsg (phoneNo, checkcode, isCloud = false) { let param = { // func: 'webapi_login', mob: phoneNo, UserName: '', Password: '', check_code: checkcode, way_no: 'sms_vcode', systemType: options.sysType } param.appkey = window.GLOB.appkey || '' if (isCloud) { param.debug = 'Y' if (options.cloudServiceApi) { param.rduri = options.cloudServiceApi.replace(/\/webapi(.*)/, '/webapi/dologon') } } else if (!isCloud && window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi.replace(/\/webapi(.*)/, '/webapi/dologon') } return axios({ url: '/webapi/dologon', data: param }) } /** * @description 登录系统, 获取用户信息 */ getusermsg (username, password, isCloud = false) { let param = { // func: 'webapi_login', UserName: username, Password: password, systemType: options.sysType, Type: 'X' } param.Password = Utils.formatOptions(param.Password) param.appkey = window.GLOB.appkey || '' if (isCloud) { param.debug = 'Y' if (options.cloudServiceApi) { param.rduri = options.cloudServiceApi.replace(/\/webapi(.*)/, '/webapi/dologon') } } else if (!isCloud && window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi.replace(/\/webapi(.*)/, '/webapi/dologon') } return axios({ url: '/webapi/dologon', data: param }) } /** * @description 获取系统版本信息,启用或更新websql */ getAppVersion (_resolve, _reject) { let appVersion = {} new Promise((resolve, reject) => { if (!mkDataBase) { reject() } else { mkDataBase.transaction(tx => { if (!mkDataBase) { reject() return } tx.executeSql('SELECT * FROM VERSIONS', [], (tx, results) => { if (results.rows.length === 0) { tx.executeSql('DELETE FROM CONFIGS') resolve({version: '', createDate: ''}) } else if (results.rows.length === 1) { resolve(results.rows[0]) } else if (results.rows.length > 1) { tx.executeSql('DELETE FROM VERSIONS') tx.executeSql('DELETE FROM CONFIGS') resolve({version: '', createDate: ''}) } }, (tx, results) => { reject() console.warn(results) }) }) } }).then(msg => { if (msg.version) { appVersion.oldVersion = msg.version } let curTime = moment().format('YYYY-MM-DD HH:mm:ss') + '.000' let param = { func: 's_get_app_version', modifydate: msg.createDate || curTime, } param.userid = sessionStorage.getItem('UserID') || '' param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' param.appkey = window.GLOB.appkey || '' if (window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi } param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return new Promise((resolve, reject) => { axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }).then(res => { if (!res.status) { reject() return } let version = res.app_version || '1.00' appVersion.newVersion = version appVersion.oldVersion = appVersion.oldVersion || version mkDataBase.transaction(tx => { if (res.menu_data && res.menu_data.length > 0) { let keys = res.menu_data.map(mid => `'${mid.menuid}'`) tx.executeSql(`DELETE FROM CONFIGS where menuid in (${keys.join(',')})`, [], () => {}, () => { reject() }) } if (msg.version) { tx.executeSql(`UPDATE VERSIONS SET createDate='${curTime}'`, [], () => { resolve() }, () => { reject() }) } else { tx.executeSql('INSERT INTO VERSIONS (version, createDate) VALUES (?, ?)', [version, curTime], () => { resolve() }, () => { reject() }) } }) }) }) }, () => { _reject() mkDataBase = null return Promise.reject() }).then(() => { storUsable = true _resolve(appVersion) }) } /** * @description 更新系统版本信息,清空配置信息 */ updateAppVersion (newVersion) { return new Promise(resolve => { if (!mkDataBase) { resolve({status: false}) return } let curTime = moment().format('YYYY-MM-DD HH:mm:ss') + '.000' mkDataBase.transaction(tx => { tx.executeSql(`DELETE FROM CONFIGS`, [], () => {}, () => { resolve({status: false}) }) tx.executeSql(`UPDATE VERSIONS SET version='${newVersion}', createDate='${curTime}'`, [], () => { resolve({status: true}) }, () => { resolve({status: false}) }) }) }) } /** * @description 删除某个菜单配置信息 */ deleteMenuStorage (menuId) { return new Promise(resolve => { if (!mkDataBase) { resolve() return } mkDataBase.transaction(tx => { tx.executeSql(`DELETE FROM CONFIGS where menuid='${menuId}'`, [], () => { resolve() }, () => { mkDataBase = null }) }) }) } /** * @description 获取或修改云端配置 */ getCloudConfig (param) { param.lang = localStorage.getItem('lang') || '' param.appkey = window.GLOB.appkey || '' param.SessionUid = localStorage.getItem('SessionUid') || '' if (sessionStorage.getItem('CloudUserID') && options.cloudServiceApi) { // 存在云端登录信息,且存在云端地址 param.rduri = options.cloudServiceApi param.userid = sessionStorage.getItem('CloudUserID') param.LoginUID = sessionStorage.getItem('CloudLoginUID') || '' } else if (window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi param.userid = sessionStorage.getItem('UserID') param.LoginUID = sessionStorage.getItem('LoginUID') || '' } else { param.userid = sessionStorage.getItem('UserID') param.LoginUID = sessionStorage.getItem('LoginUID') || '' } param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }) } /** * @description 获取或修改系统配置,增加appkey */ getSystemConfig (param) { param.userid = sessionStorage.getItem('UserID') || '' param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' param.appkey = window.GLOB.appkey || '' if (sessionStorage.getItem('isEditState') === 'true' && options.cloudServiceApi) { // 编辑状态,且存在云端地址 param.rduri = options.cloudServiceApi param.userid = sessionStorage.getItem('CloudUserID') || '' param.LoginUID = sessionStorage.getItem('CloudLoginUID') || '' } else if (window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi } param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }) } /** * @description 获取或修改本地配置,增加appkey */ getLocalConfig (param) { param.userid = sessionStorage.getItem('UserID') param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' param.appkey = window.GLOB.appkey || '' param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }) } /** * @description 获取系统配置,取值优先等级websql、缓存、服务器 * @param {Object} param 请求参数 */ getCacheConfig (param) { param.userid = sessionStorage.getItem('UserID') || '' param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' param.appkey = window.GLOB.appkey || '' if (sessionStorage.getItem('isEditState') === 'true') { // 编辑状态,单点登录服务器为云端 if (options.cloudServiceApi) { // 存在云端地址时,使用云端系统参数 param.rduri = options.cloudServiceApi param.userid = sessionStorage.getItem('CloudUserID') || '' param.LoginUID = sessionStorage.getItem('CloudLoginUID') || '' } } else if (window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi } let _param = JSON.parse(JSON.stringify(param)) // 缓存校验,去除时间和加密字符 delete _param.timestamp delete _param.secretkey delete _param.open_key _param = JSON.stringify(_param) _param = md5(_param) if (mkDataBase && storUsable) { param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return new Promise(resolve => { mkDataBase.transaction(tx => { tx.executeSql(`SELECT * FROM CONFIGS WHERE menuid='${param.MenuID}' and userid='${param.userid}'`, [], (tx, results) => { let paramItem = results.rows[0] if (paramItem) { resolve({ ErrCode: 'S', ErrMesg: '', LongParam: paramItem.LongParam, LongParamUser: paramItem.LongParamUser, message: '', open_edition: paramItem.openEdition, status: true, web_edition: paramItem.webEdition }) } else { axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }).then(res => { if (res.status) { this.writeInWebSql([param.MenuID, param.userid, res.open_edition, res.web_edition, res.LongParam, res.LongParamUser]) } resolve(res) }) } }, (tx, results) => { axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }).then(res => { if (res.status) { window.GLOB.CacheMap.set(_param, res) } resolve(res) }) mkDataBase = null storUsable = false console.warn(results) }) }) }) } else if (window.GLOB.CacheMap.has(_param)) { return Promise.resolve(window.GLOB.CacheMap.get(_param)) } else { param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return new Promise(resolve => { axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }).then(res => { if (res.status) { window.GLOB.CacheMap.set(_param, res) } resolve(res) }) }) } } /** * @description 将数据写入websql */ writeInWebSql (data) { if (!mkDataBase) return mkDataBase.transaction(tx => { tx.executeSql('INSERT INTO CONFIGS (menuid, userid, openEdition, webEdition, LongParam, LongParamUser) VALUES (?, ?, ?, ?, ?, ?)', data) }) } /** * @description 获取系统配置,优先从缓存中取值,增加appkey * @param {Object} param 请求参数 * @param {Boolean} SSO 是否为单点登录地址 */ getSystemCacheConfig (param) { param.userid = param.userid || sessionStorage.getItem('UserID') || '' param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = param.LoginUID || sessionStorage.getItem('LoginUID') || '' param.appkey = window.GLOB.appkey || '' let _param = JSON.parse(JSON.stringify(param)) // 缓存校验,去除时间和加密字符 delete _param.timestamp delete _param.secretkey delete _param.open_key _param = JSON.stringify(_param) _param = md5(_param) if (window.GLOB.CacheMap.has(_param)) { return Promise.resolve(window.GLOB.CacheMap.get(_param)) } else { param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return new Promise(resolve => { axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }).then(res => { if (res.status) { window.GLOB.CacheMap.set(_param, res) } resolve(res) }) }) } } /** * @description 获取业务通用接口 */ genericInterface (param) { param.userid = sessionStorage.getItem('UserID') param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' param.appkey = window.GLOB.appkey || '' if (sessionStorage.getItem('isEditState') === 'true') { // HS下菜单 param.userid = sessionStorage.getItem('CloudUserID') param.LoginUID = sessionStorage.getItem('CloudLoginUID') || '' } param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() return axios({ url: `/webapi/dostars${param.func ? '/' + param.func : ''}`, data: param }) } /** * @description 导出Excel */ getExcelOut (param, name) { param.userid = sessionStorage.getItem('UserID') param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' param.appkey = window.GLOB.appkey || '' return new Promise(resolve => { axios({ url: '/webapi/doexcel', responseType: 'blob', data: param }).then(res => { try { const blob = new Blob([res]) if (res.type === 'application/json') { const reader = new FileReader() reader.onload = e => resolve(JSON.parse(e.target.result)) reader.readAsText(blob) } else { if ('download' in document.createElement('a')) { // 非IE下载 const elink = document.createElement('a') elink.download = name elink.style.display = 'none' elink.href = URL.createObjectURL(blob) document.body.appendChild(elink) elink.click() URL.revokeObjectURL(elink.href) // 释放URL 对象 document.body.removeChild(elink) } else { // IE10+下载 navigator.msSaveBlob(blob, name) } resolve() } } catch { resolve({ ErrCode: 'E', ErrMesg: '文件解析错误', message: '', status: false }) } }) }) } /** * @description 上传base64 * @param {String} base64 base64图片编码 */ fileuploadbase64 (base64, service = 'local') { let param = { func: '', BasePath: 'Content/Upload', lang: localStorage.getItem('lang') || '', appkey: window.GLOB.appkey || '', Base64Img: base64 } param.SessionUid = localStorage.getItem('SessionUid') || '' if (service === 'sso' && window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi param.userid = sessionStorage.getItem('UserID') param.LoginUID = sessionStorage.getItem('LoginUID') || '' } else if (service === 'cloud' && options.cloudServiceApi) { param.rduri = options.cloudServiceApi param.userid = sessionStorage.getItem('CloudUserID') param.LoginUID = sessionStorage.getItem('CloudLoginUID') || '' } else { param.userid = sessionStorage.getItem('UserID') param.LoginUID = sessionStorage.getItem('LoginUID') || '' } param.nonc = Utils.getuuid() let keys = Object.keys(param).sort() let values = '' keys.forEach(key => { if (key === 'rduri' || key === 't') return if (typeof(param[key]) === 'object') { values += key + JSON.stringify(param[key]) } else { values += key + param[key] } }) param.sign = md5(values) param.t = new Date().getTime() if (param.rduri) { param.rduri = param.rduri.replace(/webapi(.*)$/, 'webapi/SaveBase64Image') return axios({ url: '/webapi/dostars', data: param }) } else { return axios({ url: '/webapi/SaveBase64Image', data: param }) } } /** * @description 大文件上传 */ getLargeFileUpload (param) { return axios({ url: '/webapi/doupload', data: param }) } /** * @description 查询文件是否已上传 */ getFilePreUpload (param) { return axios({ url: '/webapi/dopreload', data: param }) } /** * @description 获取微信支付二维码 */ getWxNativePay (param) { return axios({ url: '/wxpay/wxNativePay', data: param }) } /** * @description 文件上传 */ getFileUpload (param) { return axios({ url: '/zh-CN/Home/Upload', data: param }) } /** * @description 通用接口(数据管理) * @param {Object} param 查询及提交参数 */ commonInterface (param) { param.userid = sessionStorage.getItem('UserID') param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' param.BID = param.BID || '' param.debug = param.debug || '' return axios({ url: '/webapi/dostar', data: param }) } /** * @description 通用接口(提交)(数据管理) * @param {Object} param 查询及提交参数 */ submitInterface (param) { param.userid = sessionStorage.getItem('UserID') param.lang = localStorage.getItem('lang') || '' param.SessionUid = localStorage.getItem('SessionUid') || '' param.LoginUID = sessionStorage.getItem('LoginUID') || '' return axios({ url: '/webapi/dostar', data: param }) } } export default new Api()