ttk-app-core
Version:
enterprise develop framework
472 lines (421 loc) • 11.8 kB
JavaScript
import 'whatwg-fetch'
import { isAcrobatInstalledInIE } from './pdfplugin'
import { getBrowserVersion } from '../environment'
const mockApi = {}
const mockData = {}
const _options = {}
export function config(options) {
Object.assign(_options, options)
if (options.token) {
setAccessToken(options.token)
}
}
export function mock(url, handler) {
if (url && typeof url == "object") {
Object.keys(url).forEach(u => {
mock(u, url[u])
})
} else if (url.indexOf("*") != -1) {
let paths = url.split('*')
let pre = paths.shift()
Object.keys(handler).forEach(key => {
let theUrl = pre + key + paths.join('*')
mock(theUrl, handler[key])
})
} else {
mockApi[url] = handler;
}
}
export function get(url, headers, option) {
if (!option || option.ignoreAOP !== true) {
before()
}
if (_options.mock) {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
if (getAccessToken()) {
headers = headers ? { ...headers, token: getAccessToken() } : { token: getAccessToken() }
}
var resp = mockApi[url](headers)
if (resp.then && resp.catch) {
resp.then(r => {
resp = after(resp, url, undefined, headers)
return resolve(resp)
}).catch(reject)
return resp
}
else if (!option || option.ignoreAOP !== true) {
resp = after(resp, url, undefined, headers)
}
resolve(resp)
}
catch (e) {
reject(e)
}
}, 0)
})
}
headers = {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
...headers,
token: getAccessToken()
},
}
return new Promise((resolve, reject) => {
fetch(url, headers)
.then(response => response.json())
.then(responseJson => {
responseJson = after(responseJson, url, undefined, headers)
resolve(responseJson)
})
.catch(error => reject(error))
})
}
export function post(url, data, headers, option) {
if (!option || option.ignoreAOP !== true) {
before(url, data, headers)
}
if (_options.mock) {
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
if (getAccessToken()) {
headers = headers ? { ...headers, token: getAccessToken() } : { token: getAccessToken() }
}
var resp = mockApi[url](data, headers)
if (resp.then && resp.catch) {
resp.then(r => {
r = after(r, url, data, headers)
return resolve(r)
}).catch(reject)
return resp
}
else if (!option || option.ignoreAOP !== true) {
resp = after(resp, url, data, headers)
}
resolve(resp)
}
catch (e) {
reject(e)
}
}, 0)
})
}
headers = {
method: 'POST',
//mode: 'cors',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
...headers,
token: getAccessToken()
},
body: JSON.stringify(data)
}
return new Promise((resolve, reject) => {
fetch(url, headers)
.then(response => response.json())
.then(responseJson => {
responseJson = after(responseJson, url, data, headers)
resolve(responseJson)
})
.catch(error => reject(error))
})
}
function fetchIE9(url, options = {}) {
if (window.XDomainRequest) {
return new Promise((resolve, reject) => {
const method = options.method || 'GET';
const timeout = options.timeout || 30000;
let data = options.body || options.params || {};
if (data instanceof Object) {
data = JSON.stringify(data);
}
const XDR = new XDomainRequest();
XDR.open(method, url);
XDR.timeout = timeout;
XDR.onload = () => {
try {
const json = JSON.parse(XDR.responseText);
return resolve(json.data);
} catch (e) {
reject(e);
}
return reject({});
};
XDR.onprogress = () => { };
XDR.ontimeout = () => reject('XDomainRequest timeout');
XDR.onerror = () => reject('XDomainRequest error');
setTimeout(() => {
XDR.send(data);
}, 0);
});
} else {
}
}
export function formPost(url, data, isFree) {
data = data || {}
var accessToken = getAccessToken()
if (!!accessToken && !isFree) {
data.token = accessToken
}
var postForm = document.createElement("form"), formatedUrl = formatUrl(url), index = 0
postForm.method = "post"
postForm.target = "_blank"
var keys = Object.keys(data)
var tempWindow
for (var k of keys) {
if (k == 'tempWindow') {
tempWindow = data[k]
continue
}
let val = data[k] == null ? false : true
if (val) {
var hiddenInput = document.createElement("input")
hiddenInput.setAttribute("name", k)
if (typeof data[k] == "object") {
hiddenInput.setAttribute("value", JSON.stringify(data[k]))
if (index == 0) {
formatedUrl = formatedUrl + '?' + k + '=' + JSON.stringify(data[k])
} else {
formatedUrl = formatedUrl + '&' + k + '=' + JSON.stringify(data[k])
}
} else {
hiddenInput.setAttribute("value", data[k])
if (index == 0) {
formatedUrl = formatedUrl + '?' + k + '=' + data[k]
} else {
formatedUrl = formatedUrl + '&' + k + '=' + data[k]
}
}
index++
postForm.appendChild(hiddenInput)
}
}
let browserType = getBrowserVersion()
if (tempWindow != undefined) {
tempWindow.location.href = formatedUrl
// 因Edge、IE浏览器会弹出提示是否进行保存,所以Edge、IE浏览器新打开的页签让用户自己去关闭
if (browserType && !browserType.edge && !browserType.ie && !browserType.safari) {
setTimeout(() => {
tempWindow.close()
}, 1000)
}
return
// Edge、微信浏览器通过URL传递token等参数
} else if (browserType && (browserType.edge || browserType.wechat)) {
postForm.action = formatedUrl
} else {
postForm.action = formatUrl(url)
}
document.body.appendChild(postForm)
postForm.submit()
document.body.removeChild(postForm)
}
export function printPost(url, data, isFree) {
if (!isAcrobatInstalledInIE()) return
data = data || {}
var accessToken = getAccessToken()
if (!!accessToken && !isFree) {
data.token = accessToken
}
var postForm = document.createElement("form"), formatedUrl = formatUrl(url), index = 0
postForm.method = "post"
postForm.target = "_blank"
var keys = Object.keys(data)
var tempWindow
for (var k of keys) {
if (k == 'tempWindow') {
tempWindow = data[k]
continue
}
let val = data[k] == null ? false : true
if (val) {
var hiddenInput = document.createElement("input")
hiddenInput.setAttribute("name", k)
if (typeof data[k] == "object") {
hiddenInput.setAttribute("value", JSON.stringify(data[k]))
if (index == 0) {
formatedUrl = formatedUrl + '?' + k + '=' + JSON.stringify(data[k])
} else {
formatedUrl = formatedUrl + '&' + k + '=' + JSON.stringify(data[k])
}
} else {
hiddenInput.setAttribute("value", data[k])
if (index == 0) {
formatedUrl = formatedUrl + '?' + k + '=' + data[k]
} else {
formatedUrl = formatedUrl + '&' + k + '=' + data[k]
}
}
index++
postForm.appendChild(hiddenInput)
}
}
let browserType = getBrowserVersion()
if (tempWindow != undefined) {
tempWindow.location.href = formatedUrl
return
}
// Edge、微信浏览器通过URL传递token等参数
else if (browserType && (browserType.edge || browserType.wechat)) {
//解决edge MicrosoftEdge 20.10240.16384.0 版本中弹不出打印页面得问题
window.open(formatedUrl, "_blank")
return;
} else {
postForm.action = formatUrl(url)
}
document.body.appendChild(postForm)
postForm.submit()
document.body.removeChild(postForm)
}
export function pdfPost(url, data, isFree, parentNode, cb) {
if (!isAcrobatInstalledInIE()) return
data = data || {}
var accessToken = getAccessToken()
if (!!accessToken && !isFree) {
data.token = accessToken
}
var postForm = document.createElement("form"), formatedUrl = formatUrl(url), index = 0
postForm.method = "post"
postForm.target = parentNode
var keys = Object.keys(data)
var tempWindow
for (var k of keys) {
if (k == 'tempWindow') {
tempWindow = data[k]
continue
}
let val = data[k] == null ? false : true
if (val) {
var hiddenInput = document.createElement("input")
hiddenInput.setAttribute("name", k)
if (typeof data[k] == "object") {
hiddenInput.setAttribute("value", JSON.stringify(data[k]))
if (index == 0) {
formatedUrl = formatedUrl + '?' + k + '=' + JSON.stringify(data[k])
} else {
formatedUrl = formatedUrl + '&' + k + '=' + JSON.stringify(data[k])
}
} else {
hiddenInput.setAttribute("value", data[k])
if (index == 0) {
formatedUrl = formatedUrl + '?' + k + '=' + data[k]
} else {
formatedUrl = formatedUrl + '&' + k + '=' + data[k]
}
}
index++
postForm.appendChild(hiddenInput)
}
}
let browserType = getBrowserVersion()
if (tempWindow != undefined) {
tempWindow.location.href = formatedUrl
if( cb ) {
hideLoading( cb , browserType )
}
return
}
// Edge、微信浏览器通过URL传递token等参数
else if (browserType && (browserType.edge || browserType.wechat)) {
//解决edge MicrosoftEdge 20.10240.16384.0 版本中弹不出打印页面得问题
window.open(formatedUrl, parentNode)
if( cb ) {
hideLoading( cb , browserType )
}
return;
} else {
postForm.action = formatUrl(url)
}
document.body.appendChild(postForm)
postForm.submit()
document.body.removeChild(postForm)
if( cb ) {
hideLoading( cb , browserType )
}
}
//hide loading
export function hideLoading( cb, browserType ) {
let timer = setInterval( function() {
let sub_con
if (browserType && ( browserType.ie ) ){//IE
if( document.frames["pdfIframe"] ) {
sub_con = document.frames["pdfIframe"]
}
}else{//Firefox
if( document.getElementById('pdfIframe') || document.getElementById('pdfIframe').contentDocument ) {
sub_con = document.getElementById('pdfIframe').contentDocument.body.innerHTML
}
}
if(sub_con && cb ) {
cb()
clearInterval( timer )
}
} , 1000 )
}
export function test(url, data, result) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result)
}, 0)
})
}
export function setApiRootPath(path) {
if (path && path[path.length - 1] == ".") path = "https://" + path + "aitaxer.com";
else if (path && path.indexOf('/') != 0 && path.indexOf("http") != 0) path = "/" + path;
sessionStorage['_apiRootPath'] = path;
}
function formatUrl(url) {
return window.location.protocol + '//' + window.location.host + url
/*
var rootPath = config.RootPath;
if (url.indexOf('/') == 0) {
url = rootPath + url
}
else if (url.indexOf("http") != 0) {
url = rootPath + '/' + url
}
return 'http://127.0.0.1:8081/v1/gl/docManage/export'
*/
}
function before(url, data, headers) {
if (_options.before) {
_options.before(url, data, headers)
}
}
function after(response, url, data, headers) {
if (_options.after) {
return _options.after(response, url, data, headers)
}
return response
}
function getAccessToken() {
return sessionStorage['_accessToken'] || ''
}
function setAccessToken(token) {
sessionStorage['_accessToken'] = token
}
function clearAccessToken() {
sessionStorage['_accessToken'] = ''
}
export default {
config,
fetch,
get,
post,
formPost,
printPost,
pdfPost,
test,
mockData,
mock,
mockApi,
getAccessToken,
setAccessToken,
clearAccessToken
}