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
|
};
|
};
|