import {validatenull} from "@/util/validate"; import Vue from 'vue'; /** * 按钮的基础服务 */ /** * action通用入口 */ export const doAction = (button,options,callback) => { options.paramVOS['title']=replaceFreeMarker(options.paramVOS.title,options.dataStore,options.sourceData); if(button.url && button.url!='null'){ //有配置action路径,使用路径对应的js import("../"+button.url+".js").then(module => { module.doAction(options,callback); }) }else { //通用action const handlers = { //查看 view: () => {}, //创建 add: () => {import("@/actions/base/AddAction").then(module => { module.doAction(options,callback); })}, //修改 edit: () => {import("@/actions/base/EditAction").then(module => { module.doAction(options,callback); })}, //删除 delete: () => {import("@/actions/base/DeleteAction").then(module => { module.doAction(options,callback); })}, }; if(validatenull(options.paramVOS.context)) { options.paramVOS.context = options.paramVOS.content; } if(handlers[button.actionVO.id.toLowerCase()]){ handlers[button.actionVO.id.toLowerCase()]() }else{ Vue.prototype.$message.error('未找到对应action,请重新配置按钮!'); } } }; /** * 替换文本中的${xxx} * @param text 文本 * @param dataStore 选择的数据 * @param sourceData 来源数据 * @returns 替换后的值,字符串 */ export const replaceFreeMarker = (text,dataStore,sourceData) => { //替换表达式 if (!sourceData) { sourceData = {}; } if (!dataStore) { dataStore = []; } let replaceData = dataStore.length > 0 ? dataStore[0] : {}; if (text && text.indexOf("${") > -1 && text.indexOf("}")) { //js只能使用${xxx}这种的方式 let reg = "root.${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = sourceData[field] || ''; text = temp + field + end; } reg = "sourceData.${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = sourceData[field] || ''; text = temp + field + end; } reg = "${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = replaceData[field] || ''; text = temp + field + end; } } return text; }; /** * 参数转换为小写 * @param paramsVOs 参数 * @returns 小写后的参数对象 */ export const paramLow = (paramsVOs) => { // if (!paramsVOs) { paramsVOs = {}; } var params = {}; for (var key in paramsVOs) { params[key.toLowerCase()] = paramsVOs[key]; } return params; }; /** * 执行前置事件 * @param options 按钮的配置信息,前置事件里配置的参数会替换这个里的参数的信息 * @param fnTarget 执行方法 * @param callback 回调,如果存在前置事件,会在执行完成后执行回调,否则直接回调 * @param preEventName 前置事件名称,默认beforeevent */ export const callPreEvent = (options,fnTarget,callback,preEventName) => { let beforeEvent = options.paramVOS[preEventName || 'beforeevent']; if(beforeEvent) { let buttonParse = parseEventByUrl(beforeEvent,options,true); if(validatenull(buttonParse.jsPath)){ fnTarget(buttonParse,callback); }else{ try { import("../"+buttonParse.jsPath+".js").then(module => { module[buttonParse.methodName](options,callback); }) } catch (error) { Vue.prototype.$message.error('未找到前置事件执行js'); } } }else{ if(callback){ callback(options); } } }; /** * 执行后置事件 * @param options 按钮的配置信息,后置事件里配置的参数会替换这个里的参数的信息 * @param fnTarget 执行方法 * @param callback 回调,如果存在后置事件,会在执行完成后执行回调,否则直接回调 * @param preEventName 后置事件名称,默认 afterevent */ export const callPostEvent = (options,fnTarget,callback,postEventName)=>{ let afterEvent = options.paramVOS[postEventName || 'afterevent']; if(afterEvent) { let buttonParse = parseEventByUrl(afterEvent,options,false); if(validatenull(buttonParse.jsPath)){ fnTarget(buttonParse,callback); }else{ try { import("../"+buttonParse.jsPath+".js").then(module => { module[buttonParse.methodName](options,callback); }) } catch (error) { Vue.prototype.$message.error('未找到后置事件执行js'); } } }else{ if(callback){ callback(options); } } }; /** * 使用url获取事件的信息 * @param url 路径,格式如jsPath#methodName?param=aaa¶m1=bbb * @param options 按钮的配置信息,会自动覆盖相同属性的参数 * @param isBefore 是否为前置事件,否则为后置 * @returns {{jsPath: js的路径, options: 按钮的配置信息, methodName: (string)方法的名字}} */ export const parseEventByUrl = (url,options,isBefore) => { //根据配置格式化事件 let jsPath = url; let methodName = isBefore?"doBefore":"doAfter"; let params = {}; if (url.indexOf("?")) { let temp = url.substring(0, url.indexOf("?")); if (temp.indexOf("#") > -1) { let array = temp.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ jsPath = array[0]; methodName = array[1]; } }else{ jsPath = temp; } let paramArray = url.substring(url.indexOf("?") + 1).split("&"); paramArray.forEach(_item=>{ if (_item.indexOf("=") < 0) { Vue.prototype.$message.error(isBefore?"前置事件":"后置事件" + "的参数配置错误,需要要xxx=yyy&zzz=a的方式"); return true; } params[_item.split("=")[0]] = _item.split("=")[1]; }) }else{ if (url.indexOf("#") > -1) { let array = url.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ jsPath = array[0]; methodName = array[1]; } }else{ jsPath = url; } } for (var key in params) { options.paramVOS[key.toLowerCase()] = params[key]; } return { jsPath:jsPath, methodName:methodName, options:options }; };