UNPKG

tfp

Version:

A Web UI framework for TaskBuilder

359 lines (334 loc) 12 kB
import { InvisibleComponent } from "../controller.js"; let _status = Symbol("status"); /** * 后台服务组件 * @param {[type]} dataModel [description] */ export default class Service extends InvisibleComponent { constructor(__tfp, dataModel, parent) { super(__tfp, "Service", dataModel, parent); this[_status] = 0; this.cbFuncs = []; //回调函数 } //服务请求状态,0:未请求,1:正在请求,2:请求完毕 get status() { return this[_status] } set status(value) { } //服务路径 get path() { return this.dataModel.path } set path(value) { this.dataModel.path = value } //请求参数 get args() { return this.dataModel.args } set args(value) { this.dataModel.args = value } //请求参数设置 get argSettings() { return this.dataModel.argSettings } set argSettings(value) { this.dataModel.argSettings = value } //参数变化时自动重载 get autoReload() { return this.dataModel.autoReload ? true : false } set autoReload(value) { this.dataModel.autoReload = value ? true : false } //是否自动显示错误提示 get autoShowError() { return this.dataModel.autoShowError ? true : false } set autoShowError(value) { this.dataModel.autoShowError = value ? true : false } /** * 设置请求参数 * @param {[type]} name [description] * @param {[type]} value [description] * @param {[type]} type [description] */ setArg(name, value, type) { if (!name) { this._tfp.showMsg("请提供参数名称!"); return; } if (!this.dataModel.argSettings) this.dataModel.argSettings = []; let arg = { name: name }; arg.type = "Default"; if (type) arg.type = type; if (value) arg.value = value; let isExists = false; for (var i = 0; i < this.dataModel.argSettings.length; i++) { if (this.dataModel.argSettings[i].name == arg.name) { isExists = true; if (type) this.dataModel.argSettings[i].type = type; if (value) this.dataModel.argSettings[i].value = value; break; } } if (!isExists) this.dataModel.argSettings.push(arg); } /** * 删除请求参数 * @param {[type]} name [description] * @return {[type]} [description] */ removeArg(name) { if (!name || !this.dataModel.argSettings) return; for (var i = 0; i < this.dataModel.argSettings.length; i++) { if (this.dataModel.argSettings[i].name == name) { this.dataModel.argSettings.splice(i, 1); return; } } } /** * 显示错误信息 * @param {[type]} msg [description] * @return {[type]} [description] */ showError(msg) { console.error(msg); if (this.dataModel.autoShowError && typeof (window) != "undefined") { this._tfp.showMsg(msg); } if (this.onError) { this.onError(msg); } else if (this.dataModel.onError) { eval(this.dataModel.onError); } } /** * 获取HTTP请求对象 * @return {[type]} [description] */ getHttpRequest() { var httpRequest; if (window.XMLHttpRequest) { httpRequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); if (!httpRequest) { httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } } if (!httpRequest) { this.showError("您的浏览器不支持Ajax,无法执行该操作!"); return null; } return httpRequest; } /** * 请求服务 * @param {[type]} args 请求参数 * @param {Function} cb 回调函数 */ request(args, cb) { if (!this.path) { this.showError("请提供服务路径!"); return; } if (cb) this.cbFuncs.push(cb); //如果当前服务对象正在发送请求,则不重复请求 if (this[_status] == 1) return; this[_status] = 1; //设置请求参数 if (!args) args = {}; args.service = this.path; if (this.dataModel.args) { for (let p in this.dataModel.args) { args[p] = this.dataModel.args[p]; } } if (this.dataModel.argSettings) { for (var i = 0; i < this.dataModel.argSettings.length; i++) { let arg = this.dataModel.argSettings[i]; if (arg.type == "QueryString") { if (arg.value) { args[arg.name] = this._tfp.getUrlArg(arg.value); } else { args[arg.name] = this._tfp.getUrlArg(arg.name); } } else if (arg.type == "ComponentVal") { let cpt = null; if (arg.value) { cpt = this._tfp.get(arg.value); } else { cpt = this._tfp.get(arg.name); } if (cpt) args[arg.name] = cpt.value; } else if (arg.type == "ComponentAttr") { if (arg.value && arg.value.indexOf(".") > 0) { let cptInfo = arg.value.split("."); let cpt = this._tfp.get(cptInfo[0]); if (cpt && cptInfo[1] != "") args[arg.name] = cpt[cptInfo[1]]; } } else if (arg.type == "DialogArg") { if (arg.value) { let dialogArgs = null; try { dialogArgs = JSON.parse(this._tfp.getDialogArgs()); args[arg.name] = dialogArgs[arg.value]; } catch (e) { this._tfp.showMsg(e.message); } } else { args[arg.name] = this._tfp.getDialogArgs(); } } else if (arg.type == "Expression") { if (args.value) { try { args[arg.name] = eval(arg.value); } catch (err) { console.log(err); } } } else { args[arg.name] = arg.value; } } } //是否终止请求,如果服务请求有关的事件处理函数返回true //则表示终止请求,不再执行后续代码 let endRequest = false; this.exeEventHandler("onRequest"); //如果设置了请求前需要执行的事件处理函数,则执行该函数 /*if(this.onRequest && typeof this.onRequest == "function") { endRequest = this.onRequest(args); } else if(this.dataModel.onRequest) { endRequest = eval(this.dataModel.onRequest); if(endRequest) return; }*/ //设置身份验证信息 //如果嵌入到第三方系统,会出现跨域错误,需要捕获一下,否则无法执行后续代码 try { if (typeof (top) != "undefined" && top.taskMsgAuthObj) { let authObj = { args: {} }; top.taskMsgAuthObj.setAuthData(authObj); for (let arg in authObj.args) { args[arg] = authObj.args[arg]; } } } catch (err) { try { if (typeof (window.parent) != "undefined" && window.parent.taskMsgAuthObj) { let authObj = { args: {} }; window.parent.taskMsgAuthObj.setAuthData(authObj); for (let arg in authObj.args) { args[arg] = authObj.args[arg]; } } } catch (err2) { if (typeof (tmClient) != "undefined" && ((tmClient.clientOSType == "iOS" && typeof (TMiOSClient) != "undefined") || (tmClient.clientOSType == "Android" && typeof (TMAndroidClient) != "undefined"))) { let authData = JSON.parse(tmClient.getAuthData()); args._auth_org = authData._auth_org; args._auth_ts = authData._auth_ts; args._auth_data = authData._auth_data; } else { if (this._tfp.getUrlArg("_auth_org")) args._auth_org = this._tfp.getUrlArg("_auth_org"); if (this._tfp.getUrlArg("_auth_ts")) args._auth_ts = this._tfp.getUrlArg("_auth_ts"); if (this._tfp.getUrlArg("_auth_data")) args._auth_data = this._tfp.getUrlArg("_auth_data"); } } } //console.log(args); //如果嵌入到第三方系统,会出现跨域错误,需要捕获一下,否则无法执行后续代码 let topTBObj = false; try { topTBObj = typeof (top) != "undefined" && top.taskBuilder; } catch (err) { } if (topTBObj) { var that = this; top.taskBuilder.requestByIPC(this.path, args, function (req, res) { that.onResponse(req, res); }); } else { this.sendRequest(args); } } exeResponseFunc(req, res, responseFuncStr) { if (responseFuncStr.indexOf(".") < 0 && responseFuncStr.indexOf(" ") < 0 && responseFuncStr.indexOf("=") < 0 && responseFuncStr.indexOf("(") < 0 && responseFuncStr.indexOf(")") < 0) { eval(responseFuncStr + "(req, res)"); } else { eval(responseFuncStr); } } onResponse(req, res) { if (res.code == 0) { if (this.srcElement) req.srcElement = this.srcElement; if (this.cbFuncs.length > 0) { for (var i = 0; i < this.cbFuncs.length; i++) { this.cbFuncs[i](req, res); } //执行完响应回调函数之后,要清空回调函数数组,否则再次请求时,会重复执行 this.cbFuncs = []; } if (this.dataModel.onResponse && typeof (this.dataModel.onResponse) == "string") { this.exeResponseFunc(req, res, this.dataModel.onResponse); } } else { //出错时,要清空回调函数数组,否则再次请求时,会重复执行 this.cbFuncs = []; //如果是身份验证失败 if (res.code == 501) { try { if (this._tfp.isMobile()) { top.location = "/mobile/login.html"; } else { top.location = "/"; } } catch (err) { //嵌入到第三方系统时可能会出现跨域错误 } return; } this.showError(res.message); } } sendRequest(args) { var that = this; var httpRequest = this.getHttpRequest(); try { httpRequest.onreadystatechange = function () { if (httpRequest.readyState == 4) { that[_status] = 2; if (httpRequest.status == 200) { var response = JSON.parse(httpRequest.responseText); that.onResponse(args, response); } else if (httpRequest.status == 404) { that.showError("请求的服务不存在!"); } else { if (httpRequest.status !== 0) that.showError("向服务器发送请求时发生意外错误!\r\n错误代码:" + httpRequest.status); } } }; var serverPath = location.toString(); serverPath = serverPath.substr(0, serverPath.indexOf("/", 8) + 1); httpRequest.open("POST", serverPath + "Service", true); //httpRequest.open("POST", serverPath+this.path, true); httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); httpRequest.send(JSON.stringify(args)); } catch (e) { this.showError("向服务器发送请求时发生意外错误!\r\n错误描述:" + e.message); } } initRuntime() { let that = this; if (this.dataModel.argSettings && this.dataModel.autoReload) { for (var i = 0; i < this.dataModel.argSettings.length; i++) { let arg = this.dataModel.argSettings[i]; if (arg.type == "ComponentVal") { let cpt = null; if (arg.value) { cpt = this._tfp.get(arg.value); } else { cpt = this._tfp.get(arg.name); } if (!cpt) continue; if (!cpt.formulaIpts) cpt.formulaIpts = []; if (!cpt.formulaIpts.contains(that.id)) cpt.formulaIpts.push(that.id); } } } } }