Source/ProjectWeb/src/actions/base/AddAction.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ProjectWeb/src/actions/base/BaseAction.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ProjectWeb/src/components/dynamic-components/dynamic-TreeTable.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ProjectWeb/src/components/dynamic-components/dynamic-tree.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ProjectWeb/src/views/base/UIContentArea.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Source/ProjectWeb/src/actions/base/AddAction.js
@@ -1,4 +1,54 @@ /** * 按钮处理 业务类型新增 */ import BaseAction from './BaseAction'; import {callPreEvent,callPostEvent} from './BaseAction'; import {validatenull} from "@/util/validate"; export const doAction = (options) => { let paramVOS = Object.assign({ url: 'uiDataController/addSave', method: 'post', uploadFileUrl: 'vciFileUploadController/uploadFile' }, options.paramVOS) options.paramVOS = paramVOS; callPreEvent(options, doBefore,function (options) { doAdd(options, function () { callPostEvent(options,doAfter, options.callback); }); }); }; /** * 执行 * @param options 按钮的配置信息 * @param callback 回调 */ export const doAdd = (options,callback)=> { this.$message.success('执行增加'); if(callback){ callback(options); } } /** * 前置事件 * @param options 按钮的配置信息 * @param callback 回调 */ export const doBefore = (options,callback)=> { this.$message.success('执行前置事件'); if(callback){ callback(options); } } /** * 后置事件 * @param options 按钮的配置信息 * @param callback 回调 */ export const doAfter = (options,callback)=> { this.$message.success('执行后置事件'); if(callback){ callback(options); } } Source/ProjectWeb/src/actions/base/BaseAction.js
@@ -1,9 +1,36 @@ import {validatenull} from "@/util/validate"; import {findArray} from "@/util/util"; /** * 按钮的基础服务 */ /** * action通用入口 */ export const doAction = (button,options) => { debugger; if(button.url && button.url!='null'){ let buttonParse = parseEventByUrl(button.url,options,false); import("../"+buttonParse.jsPath).then(module => { module.doAction(options); }) }else { const handlers = { add: () => {import("@/actions/base/AddAction").then(module => { module.doAction(options); })}, edit: () => {}, delete: () => {}, }; if(handlers[button.actionVO.id]){ handlers[button.actionVO.id]() }else{ this.$message.error('未找到对应action,请重新配置按钮!'); } } }; /** * 替换文本中的${xxx} @@ -28,7 +55,7 @@ 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] || sourceData[field] || ''; field = sourceData[field] || ''; text = temp + field + end; } reg = "sourceData.${"; @@ -36,7 +63,7 @@ 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] || sourceData[field] || ''; field = sourceData[field] || ''; text = temp + field + end; } reg = "${"; @@ -44,7 +71,7 @@ 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] || sourceData[field] || ''; field = replaceData[field] || ''; text = temp + field + end; } } @@ -70,23 +97,26 @@ /** * 执行前置事件 * @param options 按钮的配置信息,前置事件里配置的参数会替换这个里的参数的信息 * @param buttonTarget 按钮js所在的对象 * @param fnTarget 执行方法 * @param callback 回调,如果存在前置事件,会在执行完成后执行回调,否则直接回调 * @param preEventName 前置事件名称,默认beforeevent */ export const callPreEvent = (options,buttonTarget,callback,preEventName) => { export const callPreEvent = (options,fnTarget,callback,preEventName) => { const params = paramLow(options.paramVOS); options.paramVOS = params; let beforeEvent = params[preEventName || 'beforeevent']; if(beforeEvent) { let buttonParse = parseEventByUrl(beforeEvent,options,true); buttonParse.options.callback = callback; if(validatenull(buttonParse)){ buttonTarget[buttonParse.methodName](buttonParse); if(validatenull(buttonParse.jsPath)){ fnTarget(buttonParse,callback); }else{ layui.use(buttonParse.jsPath,function () { layui[buttonParse.jsPath][buttonParse.methodName](options); }); try { import("../"+buttonParse.jsPath).then(module => { module[buttonParse.methodName](options,callback); }) } catch (error) { this.$message.error('未找到前置事件执行js'); } } }else{ if(callback){ @@ -95,22 +125,28 @@ } }; /** * 执行后置时间 * 执行后置事件 * @param options 按钮的配置信息,后置事件里配置的参数会替换这个里的参数的信息 * @param buttonTarget 按钮Js所在的对象 * @param fnTarget 执行方法 * @param callback 回调,如果存在后置事件,会在执行完成后执行回调,否则直接回调 * @param preEventName 后置事件名称,默认 afterevent */ export const callPostEvent = (options,buttonTarget,callback,postEventName)=>{ export const callPostEvent = (options,fnTarget,callback,postEventName)=>{ const params = paramLow(options.paramVOS); options.paramVOS = params; var afterEvent = params[postEventName || 'afterevent']; let afterEvent = params[postEventName || 'afterevent']; if(afterEvent) { var buttonParse = parseEventByUrl(afterEvent,options,false); if(validatenull(buttonParse)){ buttonTarget[buttonParse.methodName](buttonParse); let buttonParse = parseEventByUrl(afterEvent,options,false); if(validatenull(buttonParse.jsPath)){ fnTarget(buttonParse,callback); }else{ layui.use(buttonParse.jsPath,function () { layui[buttonParse.jsPath][buttonParse.methodName](options); }); try { import("../"+buttonParse.jsPath).then(module => { module[buttonParse.methodName](options,callback); }) } catch (error) { this.$message.error('未找到后置事件执行js'); } } }else{ if(callback){ @@ -127,13 +163,13 @@ */ export const parseEventByUrl = (url,options,isBefore) => { //根据配置格式化事件 var jsPath = url; var methodName = isBefore?"doBefore":"doAfter"; var params = {}; let jsPath = url; let methodName = isBefore?"doBefore":"doAfter"; let params = {}; if (url.indexOf("?")) { var temp = url.substring(0, url.indexOf("?")); let temp = url.substring(0, url.indexOf("?")); if (temp.indexOf("#") > -1) { var array = temp.split("#"); let array = temp.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ @@ -143,17 +179,17 @@ }else{ jsPath = temp; } var paramArray = url.substring(url.indexOf("?") + 1).split("&"); layui.each(paramArray, function (_index, _item) { let paramArray = url.substring(url.indexOf("?") + 1).split("&"); paramArray.forEach(_item=>{ if (_item.indexOf("=") < 0) { this.$message.error(isBefore?"前置事件":"后置事件" + "的参数配置错误,需要要xxx=yyy&zzz=a的方式"); return true; } params[_item.split("=")[0]] = _item.split("=")[1]; }); }) }else{ if (url.indexOf("#") > -1) { var array = url.split("#"); let array = url.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ Source/ProjectWeb/src/components/dynamic-components/dynamic-TreeTable.vue
@@ -396,6 +396,7 @@ this.TreeSelectList = row; this.$emit("setDataStore", { area: this.areasName, type:this.componentVO.uiComponentType, dataStore:row }); }, Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue
@@ -56,6 +56,7 @@ <script> import func from "@/util/func"; import {validatenull} from "@/util/validate"; import {doAction} from '@/actions/base/BaseAction'; export default { name: "dynamic-button", @@ -278,18 +279,14 @@ this.$refs.dynamicForm.form = row; }, buttonClick(item) { // 根据 type 条件动态引入不同的JS文件,并传递 item this 参数 if (this.type === 'table') { import('@/views/base/buttonTable').then(module => { const buttonClickTable = module.default; buttonClickTable.buttonClick(item,this); }) } else if (this.type === 'form') { import('@/views/base/buttonForm').then(module => { const buttonClickForm = module.default; buttonClickForm.buttonClick(item,this); }) } doAction(item,{ paramVOS: item.paramVOS, dataStore: [], sourceData: {}, callback: function (){ } }); } }, } Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue
@@ -555,14 +555,14 @@ }, selectChange(row) { this.selectList = row; }, searchChange(form,done){ console.log(form) done() this.$emit("setDataStore", { area: this.areasName, type:this.componentVO.uiComponentType, dataStore:row }); }, searchChange(form,done){ done(); } } } Source/ProjectWeb/src/components/dynamic-components/dynamic-tree.vue
@@ -75,6 +75,7 @@ if(newval) { this.$emit("setDataStore", { area: this.areasName, type:this.componentVO.uiComponentType, dataStore:newval }); } Source/ProjectWeb/src/views/base/UIContentArea.vue
@@ -1,7 +1,7 @@ <template> <basic-container :cradStyle="cradStyle" cardBodyStyle="height:100%;box-sizing: border-box;padding-bottom:5px;"> <el-tabs style="height: 100%;" class="UITabs" v-if="areasData.length>1" v-model="activeName" type="card" @tab-click="tabHandleClick"> <el-tab-pane style="height:100%;overflow: auto" v-for="(areaItem,index) in areasData" :key="areaItem.oid" :label="areaItem.name" :name="areasName+'-Tab-'+index"> <el-tabs style="height: 100%;" class="UITabs" v-if="newAreasData.length>1" v-model="activeName" type="card" @tab-click="tabHandleClick"> <el-tab-pane style="height:100%;overflow: auto" v-for="(areaItem,index) in newAreasData" :key="areaItem.oid" :label="areaItem.name" :name="areasName+'-Tab-'+index"> <el-collapse class="UI-collapse" :key="areaItem.oid+'-collapse'" v-model="collapseActiveNames" v-if="areaItem.componentVOs.length>1" @change="handleChange"> <el-collapse-item v-for="(componentVO,componentIndex) in areaItem.componentVOs" :name="areasName+'-collapse-'+componentIndex"> <template slot="title"> @@ -11,7 +11,7 @@ <compoent-index :key="areasName+'componentVO-'+componentVO.oid" :inDialog="inDialog" :componentVO="componentVO" :sourceData="sourceData" :sourceData="newSourceData" :dataStore="dataStore" :areasName="areasName" :paramVOS="paramVOS" @@ -24,7 +24,7 @@ <compoent-index :key="areasName+'componentVO-'+areaItem.componentVOs[0].oid" :inDialog="inDialog" :componentVO="areaItem.componentVOs[0]" :sourceData="sourceData" :sourceData="newSourceData" :dataStore="dataStore" :areasName="areasName" :paramVOS="paramVOS" @@ -33,9 +33,9 @@ </div> </el-tab-pane> </el-tabs> <div v-else style="height:100%;overflow: auto"> <el-collapse class="UI-collapse" :key="areasData[0].oid+'-collapse'" v-model="collapseActiveNames" v-if="areasData[0].componentVOs.length>1" @change="handleChange"> <el-collapse-item v-for="(componentVO,componentIndex) in areasData[0].componentVOs" :name="areasName+'-collapse-'+componentIndex"> <div v-else-if="newAreasData.length===1" style="height:100%;overflow: auto"> <el-collapse class="UI-collapse" :key="newAreasData[0].oid+'-collapse'" v-model="collapseActiveNames" v-if="newAreasData[0].componentVOs.length>1" @change="handleChange"> <el-collapse-item v-for="(componentVO,componentIndex) in newAreasData[0].componentVOs" :name="areasName+'-collapse-'+componentIndex"> <template slot="title"> {{componentVO.name}} </template> @@ -43,7 +43,7 @@ <compoent-index :key="areasName+'componentVO-'+componentVO.oid" :inDialog="inDialog" :componentVO="componentVO" :sourceData="sourceData" :sourceData="newSourceData" :dataStore="dataStore" :areasName="areasName" :paramVOS="paramVOS" @@ -53,10 +53,10 @@ </el-collapse-item> </el-collapse> <div v-else class="componentVO"> <compoent-index :key="areasName+'componentVO-'+areasData[0].componentVOs[0].oid" <compoent-index :key="areasName+'componentVO-'+newAreasData[0].componentVOs[0].oid" :inDialog="inDialog" :componentVO="areasData[0].componentVOs[0]" :sourceData="sourceData" :componentVO="newAreasData[0].componentVOs[0]" :sourceData="newSourceData" :dataStore="dataStore" :areasName="areasName" :paramVOS="paramVOS" @@ -64,11 +64,42 @@ :isShow="true"></compoent-index> </div> </div> <div v-else> <el-alert v-if="areasData.length==0" class="alert" :closable="false" title="配置错误" type="error" show-icon description="该区域没有配置显示的内容"> </el-alert> <el-alert v-else-if="Object.keys(newSourceData).length === 0" class="alert" :closable="false" title="源数据为空" type="error" show-icon description="不满足显示表达式条件,没有可显示的内容"> </el-alert> <el-alert v-else class="alert" :closable="false" title="" type="error" show-icon description="不满足显示表达式条件,没有可显示的内容。"> </el-alert> {{newSourceData}} </div> </basic-container> </template> <script> import compoentIndex from "@/components/dynamic-components/index" import {validatenull, verifyNotNull} from "@/util/validate"; export default { name: "UIContentArea", components:{compoentIndex}, @@ -107,10 +138,54 @@ collapseActiveNames:[this.areasName+'-collapse-0'] } }, computed:{ newAreasData(){ let newAreasData = []; this.areasData.forEach(areaData => { //验证显式表达式 if (!validatenull(areaData.displayExpression)) { if (this.checkDisplayExpression(areaData.displayExpression)) { newAreasData.push(areaData) } } else { newAreasData.push(areaData) } }) return newAreasData; }, newSourceData(){ if(this.sourceData.attributes && this.sourceData.parentId!=undefined && this.sourceData.parentId !=null){ //源数据是树节点 return this.sourceData.attributes } return this.sourceData; } }, created() { }, mounted() { // console.log(this.areasData); }, methods:{ checkDisplayExpression(displayExpressionStr){ //"${folderbusinesstype}"<>"workunit" and "${folderbusinesstype}"<>"part" and "${folderbusinesstype}"<>"Terminology" and "${folderbusinesstype}"<>"AssMaterial" and "${folderbusinesstype}"<>"resourcelib" and "${folderbusinesstype}"<>"material" and "${folderbusinesstype}"<>"machine" // "${folderbusinesstype}"="AssMaterial" or "${folderbusinesstype}"="assmaterial" //"${folderbusinesstype}"="material" //${folderbusinesstype}为源数据中的属性 let checkdisplay=false; //替换and和or let newDisplayExpressionStr=displayExpressionStr.replace(/"\s*and\s*"/g,'" && "').replace(/"\s*AND\s*"/g,'" && "').replace(/"\s*or\s*"/g,'" || "').replace(/"\s*OR\s*"/g,'" || "'); newDisplayExpressionStr=newDisplayExpressionStr.replace(/"\s*<>\s*"/g,'" != "').replace(/"\s*=\s*"/g,'" == "'); newDisplayExpressionStr=newDisplayExpressionStr.replace(/"\$\{/g,'this.newSourceData.').replace(/\}"/g,'') const sandbox = {}; if(eval('('+newDisplayExpressionStr+')')){ checkdisplay=true; } return checkdisplay; }, tabHandleClick(tab, event) { // console.log(tab, event); },