From 9b33e7e846a9505c8392f5ef9235c0b45109890c Mon Sep 17 00:00:00 2001 From: cxc Date: Tue, 20 Dec 2022 16:32:39 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E5=8D=95=E9=A2=84=E8=A7=88=E5=92=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jsconfig.json | 8 + package.json | 1 + src/api/flowable/category.js | 14 +- src/api/flowable/deploy.js | 51 +++ src/plugins/package/penal/PropertiesPanel.vue | 1 - src/plugins/package/utils.js | 2 - src/utils/generator/parser.jsx | 255 ++++++----- src/views/flowable/category/index.vue | 74 +-- src/views/flowable/deploy/index.vue | 429 ++++++++++++++++++ src/views/flowable/form/index.vue | 96 ++-- src/views/flowable/model/index.vue | 15 +- src/views/tool/build/index.vue | 13 +- vite.config.js | 2 +- vite/plugins/index.js | 5 + 14 files changed, 743 insertions(+), 223 deletions(-) create mode 100644 jsconfig.json create mode 100644 src/api/flowable/deploy.js create mode 100644 src/views/flowable/deploy/index.vue diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..abe04df --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/package.json b/package.json index 467eb6f..4f382a0 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "unplugin-auto-import": "0.11.4", "vite": "3.2.3", "vite-plugin-compression": "0.5.1", + "vite-plugin-node-polyfills": "^0.5.0", "vite-plugin-svg-icons": "2.0.1", "vite-plugin-vue-setup-extend": "0.4.0" } diff --git a/src/api/flowable/category.js b/src/api/flowable/category.js index 447ec72..cec6a71 100644 --- a/src/api/flowable/category.js +++ b/src/api/flowable/category.js @@ -1,8 +1,20 @@ import request from "@/utils/request"; -export const listCategory = (query) => +export const listAllCategory = (query) => request({ url: "/flowable/category/list", method: "get", params: query, }); +export const addCategory = (data) => + request({ + url: "/flowable/category", + method: "post", + data + }); +export const delCategory = (ids) => + request({ + url: "/flowable/category", + method: "delete", + data: { ids } + }); diff --git a/src/api/flowable/deploy.js b/src/api/flowable/deploy.js new file mode 100644 index 0000000..3a8ff76 --- /dev/null +++ b/src/api/flowable/deploy.js @@ -0,0 +1,51 @@ +import request from '@/utils/request' + +// 查询流程部署列表 +export function listDeploy(query) { + return request({ + url: '/workflow/deploy/list', + method: 'get', + params: query + }) +} + +export function listPublish(query) { + return request({ + url: '/workflow/deploy/publishList', + method: 'get', + params: query + }) +} + +// 获取流程模型流程图 +export function getBpmnXml(definitionId) { + return request({ + url: '/workflow/deploy/bpmnXml/' + definitionId, + method: 'get' + }) +} + +// 修改流程状态 +export function changeState(params) { + return request({ + url: '/workflow/deploy/changeState', + method: 'put', + params: params + }) +} + +// 删除流程部署 +export function delDeploy(deployIds) { + return request({ + url: '/workflow/deploy/' + deployIds, + method: 'delete' + }) +} + +// 查询流程部署关联表单信息 +export function getFormByDeployId(deployId) { + return request({ + url: '/workflow/deploy/form/' + deployId, + method: 'get', + }) +} diff --git a/src/plugins/package/penal/PropertiesPanel.vue b/src/plugins/package/penal/PropertiesPanel.vue index 0decdd9..279c076 100644 --- a/src/plugins/package/penal/PropertiesPanel.vue +++ b/src/plugins/package/penal/PropertiesPanel.vue @@ -127,7 +127,6 @@ import ElementProperties from "./properties/ElementProperties"; import ElementForm from "./form/ElementForm"; import UserTaskListeners from "./listeners/UserTaskListeners"; import { provide, toRefs, watch } from "vue"; -import useBpmnStore from "@/store/modules/bpmn"; const props = defineProps({ bpmnModeler: Object, diff --git a/src/plugins/package/utils.js b/src/plugins/package/utils.js index a367aa0..b031539 100644 --- a/src/plugins/package/utils.js +++ b/src/plugins/package/utils.js @@ -1,5 +1,3 @@ -import useBpmnStore from "@/store/modules/bpmn"; -const bpmnStore = useBpmnStore(); // 创建监听器实例 export function createListenerObject(options, isTask, prefix) { const listenerObj = Object.create(null); diff --git a/src/utils/generator/parser.jsx b/src/utils/generator/parser.jsx index bf440bc..58fb29a 100644 --- a/src/utils/generator/parser.jsx +++ b/src/utils/generator/parser.jsx @@ -1,59 +1,66 @@ -import { deepClone } from '@/utils/index'; -import { getToken } from '@/utils/auth'; -import render from '@/utils/generator/render'; -import axios from 'axios' -import Vue from 'vue'; +import { deepClone } from "@/utils/index"; +import { getToken } from "@/utils/auth"; +import render from "@/utils/generator/render"; +import axios from "axios"; +import { defineComponent } from "vue"; -Vue.prototype.$axios = axios +// Vue.prototype.$axios = axios; const ruleTrigger = { - 'el-input': 'blur', - 'el-input-number': 'blur', - 'el-select': 'change', - 'el-radio-group': 'change', - 'el-checkbox-group': 'change', - 'el-cascader': 'change', - 'el-time-picker': 'change', - 'el-date-picker': 'change', - 'el-rate': 'change', - 'el-upload': 'change' -} + "el-input": "blur", + "el-input-number": "blur", + "el-select": "change", + "el-radio-group": "change", + "el-checkbox-group": "change", + "el-cascader": "change", + "el-time-picker": "change", + "el-date-picker": "change", + "el-rate": "change", + "el-upload": "change", +}; const layouts = { colFormItem(h, scheme) { - const config = scheme.__config__ - const listeners = buildListeners.call(this, scheme) + const config = scheme.__config__; + const listeners = buildListeners.call(this, scheme); - let labelWidth = config.labelWidth ? `${config.labelWidth}px` : null - if (config.showLabel === false) labelWidth = '0' + let labelWidth = config.labelWidth ? `${config.labelWidth}px` : null; + if (config.showLabel === false) labelWidth = "0"; return ( - + - ) + ); }, rowFormItem(h, scheme) { - let child = renderChildren.apply(this, arguments) - if (scheme.type === 'flex') { - child = - {child} - + let child = renderChildren.apply(this, arguments); + if (scheme.type === "flex") { + child = ( + + {child} + + ); } return ( - - {child} - + {child} - ) - } -} + ); + }, +}; function renderFrom(h) { - const { formConfCopy } = this + const { formConfCopy } = this; return ( @@ -71,173 +78,181 @@ function renderFrom(h) { {formConfCopy.formBtns && formBtns.call(this, h)} - ) + ); } function formBtns(h) { - return - - 提交 - 重置 - - + return ( + + + + 提交 + + 重置 + + + ); } function renderFormItem(h, elementList) { - return elementList.map(scheme => { - const config = scheme.__config__ - const layout = layouts[config.layout] + return elementList.map((scheme) => { + const config = scheme.__config__; + const layout = layouts[config.layout]; if (layout) { - return layout.call(this, h, scheme) + return layout.call(this, h, scheme); } - throw new Error(`没有与${config.layout}匹配的layout`) - }) + throw new Error(`没有与${config.layout}匹配的layout`); + }); } function renderChildren(h, scheme) { - const config = scheme.__config__ - if (!Array.isArray(config.children)) return null - return renderFormItem.call(this, h, config.children) + const config = scheme.__config__; + if (!Array.isArray(config.children)) return null; + return renderFormItem.call(this, h, config.children); } function setValue(event, config, scheme) { - this.$set(config, 'defaultValue', event) - this.$set(this[this.formConf.formModel], scheme.__vModel__, event) + this.$set(config, "defaultValue", event); + this.$set(this[this.formConf.formModel], scheme.__vModel__, event); } function buildListeners(scheme) { - const config = scheme.__config__ - const methods = this.formConf.__methods__ || {} - const listeners = {} + const config = scheme.__config__; + const methods = this.formConf.__methods__ || {}; + const listeners = {}; // 给__methods__中的方法绑定this和event - Object.keys(methods).forEach(key => { - listeners[key] = event => methods[key].call(this, event) - }) + Object.keys(methods).forEach((key) => { + listeners[key] = (event) => methods[key].call(this, event); + }); // 响应 render.js 中的 vModel $emit('input', val) - listeners.input = event => setValue.call(this, event, config, scheme) + listeners.input = (event) => setValue.call(this, event, config, scheme); - return listeners + return listeners; } -export default { +export default defineComponent({ components: { - render + render, }, props: { formConf: { type: Object, - required: true - } + required: true, + }, }, data() { const data = { formConfCopy: deepClone(this.formConf), [this.formConf.formModel]: {}, - [this.formConf.formRules]: {} - } - this.initFormData(data.formConfCopy.fields, data[this.formConf.formModel]) - this.buildRules(data.formConfCopy.fields, data[this.formConf.formRules]) - return data + [this.formConf.formRules]: {}, + }; + this.initFormData(data.formConfCopy.fields, data[this.formConf.formModel]); + this.buildRules(data.formConfCopy.fields, data[this.formConf.formRules]); + return data; }, methods: { initFormData(componentList, formData) { - componentList.forEach(cur => { - this.buildOptionMethod(cur) + componentList.forEach((cur) => { + this.buildOptionMethod(cur); const config = cur.__config__; if (cur.__vModel__) { formData[cur.__vModel__] = config.defaultValue; // 初始化文件列表 if (cur.action && config.defaultValue) { - cur['file-list'] = config.defaultValue; + cur["file-list"] = config.defaultValue; } } if (cur.action) { - cur['headers'] = { + cur["headers"] = { Authorization: "Bearer " + getToken(), - } - cur['on-success'] = (res, file, fileList) => { + }; + cur["on-success"] = (res, file, fileList) => { formData[cur.__vModel__] = fileList; if (res.code === 200 && fileList) { config.defaultValue = fileList; - config.defaultValue.forEach(val => { + config.defaultValue.forEach((val) => { val.url = file.response.data.url; val.ossId = file.response.data.ossId; - val.response = null - }) + val.response = null; + }); } }; // 点击文件列表中已上传的文件时的钩子 - cur['on-preview'] = (file) => { - this.$download.oss(file.ossId) - } + cur["on-preview"] = (file) => { + this.$download.oss(file.ossId); + }; } if (config.children) { this.initFormData(config.children, formData); } - }) + }); }, // 特殊处理的 Option buildOptionMethod(scheme) { const config = scheme.__config__; - if (config && config.tag === 'el-cascader') { - if (config.dataType === 'dynamic') { + if (config && config.tag === "el-cascader") { + if (config.dataType === "dynamic") { this.$axios({ method: config.method, - url: config.url - }).then(resp => { - var { data } = resp - scheme[config.dataConsumer] = data[config.dataKey] + url: config.url, + }).then((resp) => { + var { data } = resp; + scheme[config.dataConsumer] = data[config.dataKey]; }); } } }, buildRules(componentList, rules) { - componentList.forEach(cur => { - const config = cur.__config__ + componentList.forEach((cur) => { + const config = cur.__config__; if (Array.isArray(config.regList)) { if (config.required) { - const required = { required: config.required, message: cur.placeholder } + const required = { + required: config.required, + message: cur.placeholder, + }; if (Array.isArray(config.defaultValue)) { - required.type = 'array' - required.message = `请至少选择一个${config.label}` + required.type = "array"; + required.message = `请至少选择一个${config.label}`; } - required.message === undefined && (required.message = `${config.label}不能为空`) - config.regList.push(required) + required.message === undefined && + (required.message = `${config.label}不能为空`); + config.regList.push(required); } - rules[cur.__vModel__] = config.regList.map(item => { - item.pattern && (item.pattern = eval(item.pattern)) - item.trigger = ruleTrigger && ruleTrigger[config.tag] - return item - }) + rules[cur.__vModel__] = config.regList.map((item) => { + item.pattern && (item.pattern = eval(item.pattern)); + item.trigger = ruleTrigger && ruleTrigger[config.tag]; + return item; + }); } - if (config.children) this.buildRules(config.children, rules) - }) + if (config.children) this.buildRules(config.children, rules); + }); }, resetForm() { - this.formConfCopy = deepClone(this.formConf) - this.$refs[this.formConf.formRef].resetFields() + this.formConfCopy = deepClone(this.formConf); + this.$refs[this.formConf.formRef].resetFields(); }, submitForm() { - this.$refs[this.formConf.formRef].validate(valid => { - if (!valid) return false + this.$refs[this.formConf.formRef].validate((valid) => { + if (!valid) return false; const params = { formData: this.formConfCopy, - valData: this[this.formConf.formModel] - } - this.$emit('submit', params) - return true - }) + valData: this[this.formConf.formModel], + }; + this.$emit("submit", params); + return true; + }); }, // 传值给父组件 - getData(){ - debugger - this.$emit('getData', this[this.formConf.formModel]) + getData() { + debugger; + this.$emit("getData", this[this.formConf.formModel]); // this.$emit('getData',this.formConfCopy) - } + }, }, render(h) { - return renderFrom.call(this, h) - } -} + return renderFrom.call(this, h); + }, +}); diff --git a/src/views/flowable/category/index.vue b/src/views/flowable/category/index.vue index b15f3b0..cee7dc5 100644 --- a/src/views/flowable/category/index.vue +++ b/src/views/flowable/category/index.vue @@ -145,7 +145,7 @@ - + @@ -172,12 +172,13 @@ + + diff --git a/src/views/flowable/form/index.vue b/src/views/flowable/form/index.vue index a615d72..54455db 100644 --- a/src/views/flowable/form/index.vue +++ b/src/views/flowable/form/index.vue @@ -19,12 +19,12 @@ 搜索 - 重置 @@ -35,10 +35,10 @@ 新增 @@ -46,11 +46,11 @@ 修改 @@ -58,11 +58,11 @@ 删除 @@ -70,15 +70,15 @@ 导出 @@ -97,28 +97,26 @@ align="center" class-name="small-padding fixed-width" > - @@ -128,13 +126,13 @@ - + @@ -146,16 +144,18 @@ - + @@ -176,6 +176,7 @@ import { } from "@/api/flowable/form"; import Editor from "@/components/Editor"; import Parser from "@/utils/generator/parser"; +import { ElMessage, ElMessageBox } from "element-plus"; import { reactive } from "vue"; import { useRouter } from "vue-router"; @@ -272,19 +273,12 @@ function handleAdd() { // this.reset(); // this.open = true; // this.title = "添加流程表单"; - router.push({ path: "/tool/build/index", query: { formId: null } }); + router.push({ path: "/flowable/form/build", query: { formId: null } }); } /** 修改按钮操作 */ function handleUpdate(row) { - // this.reset(); - // const formId = row.formId || this.ids - // getForm(formId).then(response => { - // this.form = response.data; - // this.open = true; - // this.title = "修改流程表单"; - // }); router.push({ - path: "/tool/build/index", + path: "/flowable/form/build", query: { formId: row.formId }, }); } @@ -310,8 +304,8 @@ function submitForm() { } /** 删除按钮操作 */ function handleDelete(row) { - const formIds = row.formId || this.ids; - this.$confirm( + const formIds = row.formId || ids.value; + ElMessageBox.confirm( '是否确认删除流程表单编号为"' + formIds + '"的数据项?', "警告", { @@ -324,8 +318,8 @@ function handleDelete(row) { return delForm(formIds); }) .then(() => { - this.getList(); - this.$modal.msgSuccess("删除成功"); + getList(); + ElMessage.success("删除成功"); }); } /** 导出按钮操作 */ diff --git a/src/views/flowable/model/index.vue b/src/views/flowable/model/index.vue index 19812f7..a8a3f7c 100644 --- a/src/views/flowable/model/index.vue +++ b/src/views/flowable/model/index.vue @@ -451,7 +451,7 @@ import { delModel, deployModel, } from "@/api/flowable/model"; -import { listCategory } from "@/api/flowable/category"; +import { listAllCategory } from "@/api/flowable/category"; import { ArrowDown } from "@element-plus/icons-vue"; import ProcessDesigner from "@/components/ProcessDesigner"; import ProcessViewer from "@/components/ProcessViewer"; @@ -557,7 +557,7 @@ const { /** 查询流程分类列表 */ function getCategoryList() { - listCategory().then((response) => (categoryOptions.value = response.rows)); + listAllCategory().then((response) => (categoryOptions.value = response.rows)); } /** 查询流程模型列表 */ function getList() { @@ -608,12 +608,12 @@ function handleDeploy(row) { .then((response) => { ElMessage.success(response.msg); let obj = { name: "Deploy", path: "/workflow/deploy" }; - return this.$store - .dispatch("tagsView/delCachedView", obj) + // return this.$store + // .dispatch("tagsView/delCachedView", obj) - .then(() => { - this.$router.push(obj); - }); + // .then(() => { + // this.$router.push(obj); + // }); }) .finally(() => { loading.value = false; @@ -826,6 +826,7 @@ getCategoryList(); diff --git a/src/views/tool/build/index.vue b/src/views/tool/build/index.vue index 071d241..fa252ee 100644 --- a/src/views/tool/build/index.vue +++ b/src/views/tool/build/index.vue @@ -165,6 +165,7 @@