5ace0c236059dc6f550d8d441e437b8ef764511d523fb078d7cd185c33717bf3.json 65 KB

1
  1. {"ast":null,"code":"import _objectSpread from \"/Users/zyh/Desktop/demo001/node_modules/@babel/runtime/helpers/esm/objectSpread2.js\";\nimport \"core-js/modules/es.error.to-string.js\";\nimport \"core-js/modules/es.array.filter.js\";\nimport \"core-js/modules/es.array.find.js\";\nimport \"core-js/modules/es.array.find-index.js\";\nimport \"core-js/modules/es.array.for-each.js\";\nimport \"core-js/modules/es.array.includes.js\";\nimport \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.array.some.js\";\nimport \"core-js/modules/es.array.splice.js\";\nimport \"core-js/modules/es.date.now.js\";\nimport \"core-js/modules/es.date.to-string.js\";\nimport \"core-js/modules/es.function.name.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.object.to-string.js\";\nimport \"core-js/modules/es.regexp.to-string.js\";\nimport \"core-js/modules/es.string.includes.js\";\nimport \"core-js/modules/es.string.starts-with.js\";\nimport \"core-js/modules/es.string.substr.js\";\nimport \"core-js/modules/web.dom-collections.for-each.js\";\nimport { Graph, Shape, Addon } from '@antv/x6';\nimport { register } from '@antv/x6-vue-shape';\nimport { ElMessage } from 'element-ui';\n\n// 自定义Vue节点组件\nvar FlowNode = {\n template: \"\\n <div :class=\\\"['custom-node', node.type]\\\">\\n <div class=\\\"node-label\\\">{{ node.label }}</div>\\n </div>\\n \",\n props: {\n node: {\n type: Object,\n required: true\n }\n }\n};\n\n// 注册自定义Vue节点\nregister({\n shape: 'flow-node',\n component: FlowNode,\n width: 120,\n height: 60,\n ports: {\n groups: {\n \"in\": {\n position: 'top',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: '#C2C8D5',\n strokeWidth: 1,\n fill: '#fff'\n }\n }\n },\n out: {\n position: 'bottom',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: '#C2C8D5',\n strokeWidth: 1,\n fill: '#fff'\n }\n }\n }\n }\n }\n});\nexport default {\n name: 'X6EmployeeFlow',\n data: function data() {\n return {\n graph: null,\n selectedNode: null,\n flowNodes: [{\n id: 'start',\n type: 'start',\n label: '开始',\n x: 400,\n y: 50,\n url: '/process/start'\n }, {\n id: 'interview',\n type: 'condition',\n label: '面试',\n x: 400,\n y: 150,\n url: '/interview'\n }, {\n id: 'pass',\n type: 'process',\n label: '发录用通知书',\n x: 600,\n y: 150,\n url: '/offer'\n }, {\n id: 'prepare',\n type: 'process',\n label: '准备入职材料',\n x: 600,\n y: 250,\n url: '/prepare'\n }, {\n id: 'verify',\n type: 'condition',\n label: '材料核实',\n x: 600,\n y: 350,\n url: '/verify'\n }, {\n id: 'onboard',\n type: 'process',\n label: '办理入职',\n x: 600,\n y: 450,\n url: '/onboard'\n }, {\n id: 'reject',\n type: 'process',\n label: '发送拒绝通知',\n x: 200,\n y: 250,\n url: '/reject'\n }, {\n id: 'archive',\n type: 'process',\n label: '归档简历',\n x: 200,\n y: 350,\n url: '/archive'\n }, {\n id: 'end',\n type: 'end',\n label: '结束',\n x: 400,\n y: 550,\n url: '/process/end'\n }],\n flowEdges: [{\n source: 'start',\n target: 'interview',\n label: ''\n }, {\n source: 'interview',\n target: 'pass',\n label: '通过'\n }, {\n source: 'interview',\n target: 'reject',\n label: '不通过'\n }, {\n source: 'pass',\n target: 'prepare',\n label: ''\n }, {\n source: 'prepare',\n target: 'verify',\n label: ''\n }, {\n source: 'verify',\n target: 'onboard',\n label: '材料无误'\n }, {\n source: 'reject',\n target: 'archive',\n label: ''\n }, {\n source: 'onboard',\n target: 'end',\n label: ''\n }, {\n source: 'archive',\n target: 'end',\n label: ''\n }],\n nodeDialogVisible: false,\n edgeDialogVisible: false,\n nodeForm: {\n id: '',\n label: '',\n type: 'process',\n x: 400,\n y: 300,\n url: ''\n },\n nodeFormRules: {\n id: [{\n required: true,\n message: '请输入节点ID',\n trigger: 'blur'\n }, {\n pattern: /^[a-z0-9_]+$/,\n message: 'ID只能包含小写字母、数字和下划线',\n trigger: 'blur'\n }],\n label: [{\n required: true,\n message: '请输入节点名称',\n trigger: 'blur'\n }],\n type: [{\n required: true,\n message: '请选择节点类型',\n trigger: 'change'\n }],\n url: [{\n required: true,\n message: '请输入节点链接',\n trigger: 'blur'\n }]\n },\n edgeForm: {\n source: '',\n target: '',\n label: ''\n },\n edgeFormRules: {\n source: [{\n required: true,\n message: '请选择源节点',\n trigger: 'change'\n }],\n target: [{\n required: true,\n message: '请选择目标节点',\n trigger: 'change'\n }]\n },\n isEditMode: false\n };\n },\n mounted: function mounted() {\n this.initGraph();\n },\n beforeDestroy: function beforeDestroy() {\n if (this.graph) {\n this.graph.dispose();\n }\n },\n methods: {\n initGraph: function initGraph() {\n var _this = this;\n // 创建画布\n this.graph = new Graph({\n container: this.$refs.graphContainer,\n width: 800,\n height: 600,\n grid: {\n visible: true,\n type: 'doubleMesh',\n size: 10,\n args: [{\n color: '#E7E8EA',\n thickness: 1\n }, {\n color: '#CBCFD3',\n thickness: 1,\n factor: 4\n }]\n },\n connecting: {\n router: {\n name: 'manhattan',\n args: {\n padding: 20\n }\n },\n connector: {\n name: 'rounded',\n args: {\n radius: 8\n }\n },\n anchor: 'center',\n connectionPoint: 'anchor',\n allowBlank: false,\n snap: {\n radius: 20\n },\n createEdge: function createEdge() {\n return new Shape.Edge({\n attrs: {\n line: {\n stroke: '#409EFF',\n strokeWidth: 2,\n targetMarker: {\n name: 'block',\n width: 12,\n height: 8\n }\n }\n },\n zIndex: 0,\n label: {\n attrs: {\n label: {\n fill: '#409EFF',\n fontSize: 12\n }\n }\n }\n });\n }\n },\n highlighting: {\n magnetAvailable: {\n name: 'stroke',\n args: {\n padding: 3,\n attrs: {\n 'stroke-width': 2,\n stroke: '#409EFF'\n }\n }\n }\n },\n mousewheel: {\n enabled: true,\n zoomAtMousePosition: true,\n modifiers: 'ctrl',\n minScale: 0.5,\n maxScale: 3\n },\n interacting: {\n nodeMovable: true,\n edgeMovable: false,\n edgeLabelMovable: true\n }\n });\n\n // 添加缩放控制\n var scroller = new Addon.Scroller({\n graph: this.graph,\n autoResize: true,\n pageVisible: false,\n pageBreak: false\n });\n\n // 添加小地图\n new Addon.MiniMap({\n graph: this.graph,\n container: document.createElement('div'),\n width: 150,\n height: 100,\n padding: 10\n });\n\n // 渲染节点\n this.renderNodes();\n\n // 渲染连线\n this.renderEdges();\n\n // 节点点击事件\n this.graph.on('node:click', function (_ref) {\n var node = _ref.node;\n var nodeId = node.id;\n var nodeData = _this.flowNodes.find(function (n) {\n return n.id === nodeId;\n });\n if (nodeData) {\n _this.selectedNode = _objectSpread({}, nodeData);\n }\n });\n\n // 画布点击事件,关闭面板\n this.graph.on('blank:click', function () {\n _this.selectedNode = null;\n });\n\n // 添加右键菜单功能\n this.graph.on('node:contextmenu', function (_ref2) {\n var node = _ref2.node,\n e = _ref2.e;\n e.preventDefault();\n var nodeId = node.id;\n var nodeData = _this.flowNodes.find(function (n) {\n return n.id === nodeId;\n });\n if (nodeData) {\n _this.showContextMenu(e, nodeData);\n }\n });\n\n // 双击连线编辑标签\n this.graph.on('edge:dblclick', function (_ref3) {\n var edge = _ref3.edge;\n var edgeData = _this.flowEdges.find(function (e) {\n return e.source === edge.getSourceCellId() && e.target === edge.getTargetCellId();\n });\n if (edgeData) {\n _this.editEdgeLabel(edge, edgeData);\n }\n });\n\n // 自动调整画布大小\n scroller.center();\n },\n renderNodes: function renderNodes() {\n var _this2 = this;\n // 创建节点\n this.flowNodes.forEach(function (node) {\n var fillColor, strokeColor;\n\n // 根据节点类型设置不同样式\n switch (node.type) {\n case 'start':\n case 'end':\n fillColor = '#409EFF';\n strokeColor = '#409EFF';\n break;\n case 'condition':\n fillColor = '#FFF';\n strokeColor = '#E6A23C';\n break;\n case 'process':\n default:\n fillColor = '#FFF';\n strokeColor = '#409EFF';\n break;\n }\n\n // 计算节点宽度根据文本长度\n var width = Math.max(80, node.label.length * 16);\n\n // 创建节点形状\n var nodeShape = node.type === 'condition' ? 'flow-node-diamond' // 条件节点用菱形\n : node.type === 'start' || node.type === 'end' ? 'flow-node-circle' // 开始/结束用圆形\n : 'flow-node-rect'; // 其它用矩形\n\n // 添加节点到画布\n _this2.graph.addNode({\n id: node.id,\n x: node.x - width / 2,\n y: node.y - 30,\n width: node.type === 'condition' ? 80 : width,\n height: node.type === 'condition' ? 80 : 60,\n shape: nodeShape,\n attrs: {\n body: {\n fill: fillColor,\n stroke: strokeColor,\n strokeWidth: 2,\n rx: node.type === 'process' ? 6 : 0,\n ry: node.type === 'process' ? 6 : 0\n },\n label: {\n text: node.label,\n fill: node.type === 'start' || node.type === 'end' ? '#FFF' : '#333',\n fontSize: 14,\n fontWeight: 500\n }\n },\n data: {\n type: node.type,\n url: node.url\n },\n ports: {\n groups: {\n \"in\": {\n position: 'top',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: strokeColor,\n fill: '#FFF'\n }\n }\n },\n out: {\n position: 'bottom',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: strokeColor,\n fill: '#FFF'\n }\n }\n }\n },\n items: [{\n id: \"\".concat(node.id, \"-in\"),\n group: 'in'\n }, {\n id: \"\".concat(node.id, \"-out\"),\n group: 'out'\n }]\n }\n });\n });\n },\n renderEdges: function renderEdges() {\n var _this3 = this;\n // 绘制连线\n this.flowEdges.forEach(function (edge) {\n var _this3$flowNodes$find;\n // 确定连线样式\n var isConditionEdge = ((_this3$flowNodes$find = _this3.flowNodes.find(function (n) {\n return n.id === edge.source;\n })) === null || _this3$flowNodes$find === void 0 ? void 0 : _this3$flowNodes$find.type) === 'condition';\n var strokeColor = isConditionEdge ? '#E6A23C' : '#409EFF';\n var strokeDasharray = edge.label.includes('不通过') ? '5,2' : undefined;\n _this3.graph.addEdge({\n source: {\n cell: edge.source,\n port: \"\".concat(edge.source, \"-out\")\n },\n target: {\n cell: edge.target,\n port: \"\".concat(edge.target, \"-in\")\n },\n label: edge.label,\n attrs: {\n line: {\n stroke: strokeColor,\n strokeWidth: 2,\n targetMarker: {\n name: 'block',\n width: 12,\n height: 8,\n fill: strokeColor\n },\n strokeDasharray: strokeDasharray\n }\n },\n labels: [{\n attrs: {\n text: {\n text: edge.label,\n fill: strokeColor,\n fontSize: 12,\n textAnchor: 'middle',\n textVerticalAnchor: 'middle'\n },\n rect: {\n fill: '#FFF',\n stroke: strokeColor,\n strokeWidth: 0.5,\n rx: 3,\n ry: 3,\n refWidth: '100%',\n refHeight: '100%',\n refX: 0,\n refY: 0\n }\n },\n position: {\n distance: 0.5\n }\n }]\n });\n });\n },\n zoomGraph: function zoomGraph(delta) {\n var zoom = this.graph.zoom();\n if (delta > 0 && zoom < 2 || delta < 0 && zoom > 0.5) {\n this.graph.zoom(delta);\n }\n },\n resetGraph: function resetGraph() {\n this.graph.zoomTo(1);\n this.graph.centerContent();\n },\n openNodeUrl: function openNodeUrl() {\n var _this4 = this;\n if (!this.selectedNode) return;\n var url = this.selectedNode.url;\n if (url) {\n if (url.startsWith('http')) {\n window.open(url, '_blank');\n } else {\n this.$router.push(url)[\"catch\"](function (err) {\n if (err.name !== 'NavigationDuplicated') {\n ElMessage({\n type: 'info',\n message: \"\\u6B63\\u5728\\u8DF3\\u8F6C\\u5230\".concat(_this4.selectedNode.label, \"\\u9875\\u9762...\")\n });\n }\n });\n }\n }\n },\n closePanel: function closePanel() {\n this.selectedNode = null;\n },\n addNewNode: function addNewNode() {\n // 重置表单数据\n this.nodeForm = {\n id: 'node_' + Date.now().toString().substr(-6),\n label: '新节点',\n type: 'process',\n x: 400,\n y: 300,\n url: '/new-node'\n };\n this.isEditMode = false;\n this.nodeDialogVisible = true;\n },\n editNode: function editNode() {\n if (!this.selectedNode) return;\n\n // 复制选中节点数据到表单\n this.nodeForm = _objectSpread({}, this.selectedNode);\n this.isEditMode = true;\n this.nodeDialogVisible = true;\n },\n saveNode: function saveNode() {\n var _this5 = this;\n this.$refs.nodeForm.validate(function (valid) {\n if (!valid) return;\n\n // 检查ID是否已存在(仅在添加新节点时检查)\n if (!_this5.isEditMode && _this5.flowNodes.some(function (node) {\n return node.id === _this5.nodeForm.id;\n })) {\n ElMessage.error('节点ID已存在,请更换');\n return;\n }\n if (_this5.isEditMode) {\n // 更新节点\n var index = _this5.flowNodes.findIndex(function (node) {\n return node.id === _this5.nodeForm.id;\n });\n if (index !== -1) {\n _this5.flowNodes.splice(index, 1, _objectSpread({}, _this5.nodeForm));\n\n // 更新画布上的节点\n var node = _this5.graph.getCellById(_this5.nodeForm.id);\n if (node) {\n // 更新节点位置\n node.position(_this5.nodeForm.x - node.size().width / 2, _this5.nodeForm.y - node.size().height / 2);\n\n // 更新节点属性\n var fillColor, strokeColor;\n switch (_this5.nodeForm.type) {\n case 'start':\n case 'end':\n fillColor = '#409EFF';\n strokeColor = '#409EFF';\n break;\n case 'condition':\n fillColor = '#FFF';\n strokeColor = '#E6A23C';\n break;\n case 'process':\n default:\n fillColor = '#FFF';\n strokeColor = '#409EFF';\n break;\n }\n node.attr('label/text', _this5.nodeForm.label);\n node.attr('body/fill', fillColor);\n node.attr('body/stroke', strokeColor);\n\n // 更新节点数据\n node.setData({\n type: _this5.nodeForm.type,\n url: _this5.nodeForm.url\n });\n }\n ElMessage.success('节点更新成功');\n }\n } else {\n // 添加新节点\n _this5.flowNodes.push(_objectSpread({}, _this5.nodeForm));\n\n // 重新渲染图表\n _this5.graph.clearCells();\n _this5.renderNodes();\n _this5.renderEdges();\n ElMessage.success('节点添加成功');\n }\n _this5.nodeDialogVisible = false;\n _this5.isEditMode = false;\n });\n },\n showContextMenu: function showContextMenu(event, node) {\n var _this6 = this;\n // 这里可以使用 element-ui 的 Popover 或其他方式实现\n this.$confirm(\"\\u8981\\u5BF9\\u8282\\u70B9 \\\"\".concat(node.label, \"\\\" \\u8FDB\\u884C\\u64CD\\u4F5C?\"), '节点操作', {\n distinguishCancelAndClose: true,\n confirmButtonText: '编辑',\n cancelButtonText: '删除',\n type: 'warning'\n }).then(function () {\n // 点击编辑\n _this6.selectedNode = _objectSpread({}, node);\n _this6.editNode();\n })[\"catch\"](function (action) {\n if (action === 'cancel') {\n // 点击删除\n _this6.deleteNode(node.id);\n }\n });\n },\n deleteNode: function deleteNode(nodeId) {\n var _this7 = this;\n this.$confirm('确定要删除该节点吗?相关的连线也将被删除', '删除节点', {\n type: 'warning'\n }).then(function () {\n // 删除节点数据\n var index = _this7.flowNodes.findIndex(function (node) {\n return node.id === nodeId;\n });\n if (index !== -1) {\n _this7.flowNodes.splice(index, 1);\n\n // 删除相关连线\n _this7.flowEdges = _this7.flowEdges.filter(function (edge) {\n return edge.source !== nodeId && edge.target !== nodeId;\n });\n\n // 重新渲染图表\n _this7.graph.clearCells();\n _this7.renderNodes();\n _this7.renderEdges();\n ElMessage.success('节点删除成功');\n }\n })[\"catch\"](function () {});\n },\n addEdge: function addEdge() {\n this.edgeForm = {\n source: '',\n target: '',\n label: ''\n };\n this.edgeDialogVisible = true;\n },\n saveEdge: function saveEdge() {\n var _this8 = this;\n this.$refs.edgeForm.validate(function (valid) {\n if (!valid) return;\n\n // 检查连线是否已存在\n if (_this8.flowEdges.some(function (edge) {\n return edge.source === _this8.edgeForm.source && edge.target === _this8.edgeForm.target;\n })) {\n ElMessage.error('该连线已存在');\n return;\n }\n\n // 添加连线\n _this8.flowEdges.push(_objectSpread({}, _this8.edgeForm));\n\n // 重新渲染图表\n _this8.graph.clearCells();\n _this8.renderNodes();\n _this8.renderEdges();\n ElMessage.success('连线添加成功');\n _this8.edgeDialogVisible = false;\n });\n },\n editEdgeLabel: function editEdgeLabel(edge, edgeData) {\n this.$prompt('请输入连线标签', '编辑连线', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n inputValue: edgeData.label\n }).then(function (_ref4) {\n var value = _ref4.value;\n // 更新连线数据\n edgeData.label = value;\n\n // 更新画布上的连线\n edge.setLabels([{\n attrs: {\n text: {\n text: value\n }\n },\n position: {\n distance: 0.5\n }\n }]);\n ElMessage.success('连线标签更新成功');\n })[\"catch\"](function () {});\n }\n }\n};","map":{"version":3,"names":["Graph","Shape","Addon","register","ElMessage","FlowNode","template","props","node","type","Object","required","shape","component","width","height","ports","groups","position","attrs","circle","r","magnet","stroke","strokeWidth","fill","out","name","data","graph","selectedNode","flowNodes","id","label","x","y","url","flowEdges","source","target","nodeDialogVisible","edgeDialogVisible","nodeForm","nodeFormRules","message","trigger","pattern","edgeForm","edgeFormRules","isEditMode","mounted","initGraph","beforeDestroy","dispose","methods","_this","container","$refs","graphContainer","grid","visible","size","args","color","thickness","factor","connecting","router","padding","connector","radius","anchor","connectionPoint","allowBlank","snap","createEdge","Edge","line","targetMarker","zIndex","fontSize","highlighting","magnetAvailable","mousewheel","enabled","zoomAtMousePosition","modifiers","minScale","maxScale","interacting","nodeMovable","edgeMovable","edgeLabelMovable","scroller","Scroller","autoResize","pageVisible","pageBreak","MiniMap","document","createElement","renderNodes","renderEdges","on","_ref","nodeId","nodeData","find","n","_objectSpread","_ref2","e","preventDefault","showContextMenu","_ref3","edge","edgeData","getSourceCellId","getTargetCellId","editEdgeLabel","center","_this2","forEach","fillColor","strokeColor","Math","max","length","nodeShape","addNode","body","rx","ry","text","fontWeight","items","concat","group","_this3","_this3$flowNodes$find","isConditionEdge","strokeDasharray","includes","undefined","addEdge","cell","port","labels","textAnchor","textVerticalAnchor","rect","refWidth","refHeight","refX","refY","distance","zoomGraph","delta","zoom","resetGraph","zoomTo","centerContent","openNodeUrl","_this4","startsWith","window","open","$router","push","err","closePanel","addNewNode","Date","now","toString","substr","editNode","saveNode","_this5","validate","valid","some","error","index","findIndex","splice","getCellById","attr","setData","success","clearCells","event","_this6","$confirm","distinguishCancelAndClose","confirmButtonText","cancelButtonText","then","action","deleteNode","_this7","filter","saveEdge","_this8","$prompt","inputValue","_ref4","value","setLabels"],"sources":["src/views/X6EmployeeFlow.vue"],"sourcesContent":["<template>\n <div class=\"x6-flow-container\">\n <div class=\"flow-header\">\n <h2>员工入职流程图 (X6版本)</h2>\n <div class=\"flow-actions\">\n <el-button size=\"small\" type=\"primary\" @click=\"zoomGraph(0.1)\">\n <i class=\"el-icon-zoom-in\"></i>\n </el-button>\n <el-button size=\"small\" type=\"primary\" @click=\"zoomGraph(-0.1)\">\n <i class=\"el-icon-zoom-out\"></i>\n </el-button>\n <el-button size=\"small\" type=\"success\" @click=\"resetGraph\">\n <i class=\"el-icon-refresh\"></i>\n </el-button>\n <el-button size=\"small\" type=\"warning\" @click=\"addNewNode\">\n 新增节点\n </el-button>\n </div>\n </div>\n \n <!-- 图形容器 -->\n <div class=\"graph-container\">\n <div id=\"x6-graph-container\" ref=\"graphContainer\"></div>\n \n <!-- 信息面板 -->\n <div class=\"node-info-panel\" v-if=\"selectedNode\">\n <h3>节点详情</h3>\n <div class=\"info-item\">\n <span class=\"label\">ID:</span>\n <span class=\"value\">{{ selectedNode.id }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">名称:</span>\n <span class=\"value\">{{ selectedNode.label }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">类型:</span>\n <span class=\"value\">{{ selectedNode.type }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"label\">链接:</span>\n <span class=\"value\">{{ selectedNode.url }}</span>\n </div>\n <div class=\"actions\">\n <el-button size=\"small\" type=\"primary\" @click=\"openNodeUrl\">\n 打开链接\n </el-button>\n <el-button size=\"small\" type=\"success\" @click=\"editNode\">\n 编辑节点\n </el-button>\n <el-button size=\"small\" type=\"danger\" @click=\"closePanel\">\n 关闭\n </el-button>\n </div>\n </div>\n </div>\n \n <!-- 节点添加对话框 -->\n <el-dialog \n title=\"添加新节点\" \n :visible.sync=\"nodeDialogVisible\" \n width=\"500px\"\n :close-on-click-modal=\"false\">\n <el-form ref=\"nodeForm\" :model=\"nodeForm\" :rules=\"nodeFormRules\" label-width=\"80px\">\n <el-form-item label=\"节点ID\" prop=\"id\">\n <el-input v-model=\"nodeForm.id\" placeholder=\"请输入节点唯一标识\"></el-input>\n </el-form-item>\n <el-form-item label=\"节点名称\" prop=\"label\">\n <el-input v-model=\"nodeForm.label\" placeholder=\"请输入节点显示名称\"></el-input>\n </el-form-item>\n <el-form-item label=\"节点类型\" prop=\"type\">\n <el-select v-model=\"nodeForm.type\" placeholder=\"请选择节点类型\" style=\"width: 100%\">\n <el-option label=\"开始节点\" value=\"start\"></el-option>\n <el-option label=\"结束节点\" value=\"end\"></el-option>\n <el-option label=\"条件节点\" value=\"condition\"></el-option>\n <el-option label=\"流程节点\" value=\"process\"></el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"位置 X\" prop=\"x\">\n <el-input-number v-model=\"nodeForm.x\" :min=\"0\" :max=\"1000\" :step=\"50\"></el-input-number>\n </el-form-item>\n <el-form-item label=\"位置 Y\" prop=\"y\">\n <el-input-number v-model=\"nodeForm.y\" :min=\"0\" :max=\"1000\" :step=\"50\"></el-input-number>\n </el-form-item>\n <el-form-item label=\"链接URL\" prop=\"url\">\n <el-input v-model=\"nodeForm.url\" placeholder=\"请输入节点链接地址\"></el-input>\n </el-form-item>\n </el-form>\n <div slot=\"footer\" class=\"dialog-footer\">\n <el-button @click=\"nodeDialogVisible = false\">取 消</el-button>\n <el-button type=\"primary\" @click=\"saveNode\">确 定</el-button>\n </div>\n </el-dialog>\n \n <!-- 连接添加对话框 -->\n <el-dialog \n title=\"添加连接\" \n :visible.sync=\"edgeDialogVisible\" \n width=\"500px\"\n :close-on-click-modal=\"false\">\n <el-form ref=\"edgeForm\" :model=\"edgeForm\" :rules=\"edgeFormRules\" label-width=\"120px\">\n <el-form-item label=\"源节点\" prop=\"source\">\n <el-select v-model=\"edgeForm.source\" placeholder=\"请选择源节点\" style=\"width: 100%\">\n <el-option \n v-for=\"node in flowNodes\" \n :key=\"node.id\" \n :label=\"node.label\" \n :value=\"node.id\">\n </el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"目标节点\" prop=\"target\">\n <el-select v-model=\"edgeForm.target\" placeholder=\"请选择目标节点\" style=\"width: 100%\">\n <el-option \n v-for=\"node in flowNodes\" \n :key=\"node.id\" \n :label=\"node.label\" \n :value=\"node.id\">\n </el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"连线标签\" prop=\"label\">\n <el-input v-model=\"edgeForm.label\" placeholder=\"请输入连线标签(可选)\"></el-input>\n </el-form-item>\n </el-form>\n <div slot=\"footer\" class=\"dialog-footer\">\n <el-button @click=\"edgeDialogVisible = false\">取 消</el-button>\n <el-button type=\"primary\" @click=\"saveEdge\">确 定</el-button>\n </div>\n </el-dialog>\n </div>\n</template>\n\n<script>\nimport { Graph, Shape, Addon } from '@antv/x6'\nimport { register } from '@antv/x6-vue-shape'\nimport { ElMessage } from 'element-ui'\n\n// 自定义Vue节点组件\nconst FlowNode = {\n template: `\n <div :class=\"['custom-node', node.type]\">\n <div class=\"node-label\">{{ node.label }}</div>\n </div>\n `,\n props: {\n node: {\n type: Object,\n required: true\n }\n }\n}\n\n// 注册自定义Vue节点\nregister({\n shape: 'flow-node',\n component: FlowNode,\n width: 120,\n height: 60,\n ports: {\n groups: {\n in: {\n position: 'top',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: '#C2C8D5',\n strokeWidth: 1,\n fill: '#fff'\n }\n }\n },\n out: {\n position: 'bottom',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: '#C2C8D5',\n strokeWidth: 1,\n fill: '#fff'\n }\n }\n }\n }\n }\n})\n\nexport default {\n name: 'X6EmployeeFlow',\n data() {\n return {\n graph: null,\n selectedNode: null,\n flowNodes: [\n { \n id: 'start', \n type: 'start', \n label: '开始', \n x: 400, \n y: 50,\n url: '/process/start'\n },\n { \n id: 'interview', \n type: 'condition', \n label: '面试', \n x: 400, \n y: 150,\n url: '/interview'\n },\n { \n id: 'pass', \n type: 'process', \n label: '发录用通知书', \n x: 600, \n y: 150,\n url: '/offer'\n },\n { \n id: 'prepare', \n type: 'process', \n label: '准备入职材料', \n x: 600, \n y: 250,\n url: '/prepare'\n },\n { \n id: 'verify', \n type: 'condition', \n label: '材料核实', \n x: 600, \n y: 350,\n url: '/verify'\n },\n { \n id: 'onboard', \n type: 'process', \n label: '办理入职', \n x: 600, \n y: 450,\n url: '/onboard'\n },\n { \n id: 'reject', \n type: 'process', \n label: '发送拒绝通知', \n x: 200, \n y: 250,\n url: '/reject'\n },\n { \n id: 'archive', \n type: 'process', \n label: '归档简历', \n x: 200, \n y: 350,\n url: '/archive'\n },\n { \n id: 'end', \n type: 'end', \n label: '结束', \n x: 400, \n y: 550,\n url: '/process/end'\n }\n ],\n flowEdges: [\n { source: 'start', target: 'interview', label: '' },\n { source: 'interview', target: 'pass', label: '通过' },\n { source: 'interview', target: 'reject', label: '不通过' },\n { source: 'pass', target: 'prepare', label: '' },\n { source: 'prepare', target: 'verify', label: '' },\n { source: 'verify', target: 'onboard', label: '材料无误' },\n { source: 'reject', target: 'archive', label: '' },\n { source: 'onboard', target: 'end', label: '' },\n { source: 'archive', target: 'end', label: '' }\n ],\n nodeDialogVisible: false,\n edgeDialogVisible: false,\n nodeForm: {\n id: '',\n label: '',\n type: 'process',\n x: 400,\n y: 300,\n url: ''\n },\n nodeFormRules: {\n id: [\n { required: true, message: '请输入节点ID', trigger: 'blur' },\n { pattern: /^[a-z0-9_]+$/, message: 'ID只能包含小写字母、数字和下划线', trigger: 'blur' }\n ],\n label: [\n { required: true, message: '请输入节点名称', trigger: 'blur' }\n ],\n type: [\n { required: true, message: '请选择节点类型', trigger: 'change' }\n ],\n url: [\n { required: true, message: '请输入节点链接', trigger: 'blur' }\n ]\n },\n edgeForm: {\n source: '',\n target: '',\n label: ''\n },\n edgeFormRules: {\n source: [\n { required: true, message: '请选择源节点', trigger: 'change' }\n ],\n target: [\n { required: true, message: '请选择目标节点', trigger: 'change' }\n ]\n },\n isEditMode: false\n }\n },\n mounted() {\n this.initGraph()\n },\n beforeDestroy() {\n if (this.graph) {\n this.graph.dispose()\n }\n },\n methods: {\n initGraph() {\n // 创建画布\n this.graph = new Graph({\n container: this.$refs.graphContainer,\n width: 800,\n height: 600,\n grid: {\n visible: true,\n type: 'doubleMesh',\n size: 10,\n args: [\n {\n color: '#E7E8EA',\n thickness: 1\n },\n {\n color: '#CBCFD3',\n thickness: 1,\n factor: 4\n }\n ]\n },\n connecting: {\n router: {\n name: 'manhattan',\n args: {\n padding: 20\n }\n },\n connector: {\n name: 'rounded',\n args: {\n radius: 8\n }\n },\n anchor: 'center',\n connectionPoint: 'anchor',\n allowBlank: false,\n snap: {\n radius: 20\n },\n createEdge() {\n return new Shape.Edge({\n attrs: {\n line: {\n stroke: '#409EFF',\n strokeWidth: 2,\n targetMarker: {\n name: 'block',\n width: 12,\n height: 8\n }\n }\n },\n zIndex: 0,\n label: {\n attrs: {\n label: {\n fill: '#409EFF',\n fontSize: 12\n }\n }\n }\n })\n }\n },\n highlighting: {\n magnetAvailable: {\n name: 'stroke',\n args: {\n padding: 3,\n attrs: {\n 'stroke-width': 2,\n stroke: '#409EFF'\n }\n }\n }\n },\n mousewheel: {\n enabled: true,\n zoomAtMousePosition: true,\n modifiers: 'ctrl',\n minScale: 0.5,\n maxScale: 3\n },\n interacting: {\n nodeMovable: true,\n edgeMovable: false,\n edgeLabelMovable: true\n }\n })\n\n // 添加缩放控制\n const scroller = new Addon.Scroller({\n graph: this.graph,\n autoResize: true,\n pageVisible: false,\n pageBreak: false\n })\n\n // 添加小地图\n new Addon.MiniMap({\n graph: this.graph,\n container: document.createElement('div'),\n width: 150,\n height: 100,\n padding: 10\n })\n\n // 渲染节点\n this.renderNodes()\n \n // 渲染连线\n this.renderEdges()\n \n // 节点点击事件\n this.graph.on('node:click', ({ node }) => {\n const nodeId = node.id\n const nodeData = this.flowNodes.find(n => n.id === nodeId)\n if (nodeData) {\n this.selectedNode = { ...nodeData }\n }\n })\n \n // 画布点击事件,关闭面板\n this.graph.on('blank:click', () => {\n this.selectedNode = null\n })\n\n // 添加右键菜单功能\n this.graph.on('node:contextmenu', ({ node, e }) => {\n e.preventDefault()\n \n const nodeId = node.id\n const nodeData = this.flowNodes.find(n => n.id === nodeId)\n if (nodeData) {\n this.showContextMenu(e, nodeData)\n }\n })\n\n // 双击连线编辑标签\n this.graph.on('edge:dblclick', ({ edge }) => {\n const edgeData = this.flowEdges.find(\n e => e.source === edge.getSourceCellId() && e.target === edge.getTargetCellId()\n )\n \n if (edgeData) {\n this.editEdgeLabel(edge, edgeData)\n }\n })\n\n // 自动调整画布大小\n scroller.center()\n },\n \n renderNodes() {\n // 创建节点\n this.flowNodes.forEach(node => {\n let fillColor, strokeColor\n \n // 根据节点类型设置不同样式\n switch (node.type) {\n case 'start':\n case 'end':\n fillColor = '#409EFF'\n strokeColor = '#409EFF'\n break\n case 'condition':\n fillColor = '#FFF'\n strokeColor = '#E6A23C'\n break\n case 'process':\n default:\n fillColor = '#FFF'\n strokeColor = '#409EFF'\n break\n }\n \n // 计算节点宽度根据文本长度\n let width = Math.max(80, node.label.length * 16)\n \n // 创建节点形状\n const nodeShape = node.type === 'condition'\n ? 'flow-node-diamond' // 条件节点用菱形\n : (node.type === 'start' || node.type === 'end')\n ? 'flow-node-circle' // 开始/结束用圆形\n : 'flow-node-rect' // 其它用矩形\n \n // 添加节点到画布\n this.graph.addNode({\n id: node.id,\n x: node.x - width / 2,\n y: node.y - 30,\n width: node.type === 'condition' ? 80 : width,\n height: node.type === 'condition' ? 80 : 60,\n shape: nodeShape,\n attrs: {\n body: {\n fill: fillColor,\n stroke: strokeColor,\n strokeWidth: 2,\n rx: node.type === 'process' ? 6 : 0,\n ry: node.type === 'process' ? 6 : 0\n },\n label: {\n text: node.label,\n fill: node.type === 'start' || node.type === 'end' ? '#FFF' : '#333',\n fontSize: 14,\n fontWeight: 500\n }\n },\n data: {\n type: node.type,\n url: node.url\n },\n ports: {\n groups: {\n in: {\n position: 'top',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: strokeColor,\n fill: '#FFF'\n }\n }\n },\n out: {\n position: 'bottom',\n attrs: {\n circle: {\n r: 4,\n magnet: true,\n stroke: strokeColor,\n fill: '#FFF'\n }\n }\n }\n },\n items: [\n { id: `${node.id}-in`, group: 'in' },\n { id: `${node.id}-out`, group: 'out' }\n ]\n }\n })\n })\n },\n \n renderEdges() {\n // 绘制连线\n this.flowEdges.forEach(edge => {\n // 确定连线样式\n const isConditionEdge = this.flowNodes.find(n => n.id === edge.source)?.type === 'condition'\n const strokeColor = isConditionEdge ? '#E6A23C' : '#409EFF'\n const strokeDasharray = edge.label.includes('不通过') ? '5,2' : undefined\n \n this.graph.addEdge({\n source: { cell: edge.source, port: `${edge.source}-out` },\n target: { cell: edge.target, port: `${edge.target}-in` },\n label: edge.label,\n attrs: {\n line: {\n stroke: strokeColor,\n strokeWidth: 2,\n targetMarker: {\n name: 'block',\n width: 12,\n height: 8,\n fill: strokeColor\n },\n strokeDasharray\n }\n },\n labels: [\n {\n attrs: {\n text: {\n text: edge.label,\n fill: strokeColor,\n fontSize: 12,\n textAnchor: 'middle',\n textVerticalAnchor: 'middle'\n },\n rect: {\n fill: '#FFF',\n stroke: strokeColor,\n strokeWidth: 0.5,\n rx: 3,\n ry: 3,\n refWidth: '100%',\n refHeight: '100%',\n refX: 0,\n refY: 0\n }\n },\n position: {\n distance: 0.5\n }\n }\n ]\n })\n })\n },\n \n zoomGraph(delta) {\n const zoom = this.graph.zoom()\n if ((delta > 0 && zoom < 2) || (delta < 0 && zoom > 0.5)) {\n this.graph.zoom(delta)\n }\n },\n \n resetGraph() {\n this.graph.zoomTo(1)\n this.graph.centerContent()\n },\n \n openNodeUrl() {\n if (!this.selectedNode) return\n \n const url = this.selectedNode.url\n if (url) {\n if (url.startsWith('http')) {\n window.open(url, '_blank')\n } else {\n this.$router.push(url).catch(err => {\n if (err.name !== 'NavigationDuplicated') {\n ElMessage({\n type: 'info',\n message: `正在跳转到${this.selectedNode.label}页面...`\n })\n }\n })\n }\n }\n },\n \n closePanel() {\n this.selectedNode = null\n },\n \n addNewNode() {\n // 重置表单数据\n this.nodeForm = {\n id: 'node_' + Date.now().toString().substr(-6),\n label: '新节点',\n type: 'process',\n x: 400,\n y: 300,\n url: '/new-node'\n }\n this.isEditMode = false\n this.nodeDialogVisible = true\n },\n \n editNode() {\n if (!this.selectedNode) return\n \n // 复制选中节点数据到表单\n this.nodeForm = { ...this.selectedNode }\n this.isEditMode = true\n this.nodeDialogVisible = true\n },\n \n saveNode() {\n this.$refs.nodeForm.validate(valid => {\n if (!valid) return\n \n // 检查ID是否已存在(仅在添加新节点时检查)\n if (!this.isEditMode && this.flowNodes.some(node => node.id === this.nodeForm.id)) {\n ElMessage.error('节点ID已存在,请更换')\n return\n }\n \n if (this.isEditMode) {\n // 更新节点\n const index = this.flowNodes.findIndex(node => node.id === this.nodeForm.id)\n if (index !== -1) {\n this.flowNodes.splice(index, 1, { ...this.nodeForm })\n \n // 更新画布上的节点\n const node = this.graph.getCellById(this.nodeForm.id)\n if (node) {\n // 更新节点位置\n node.position(this.nodeForm.x - node.size().width / 2, this.nodeForm.y - node.size().height / 2)\n \n // 更新节点属性\n let fillColor, strokeColor\n switch (this.nodeForm.type) {\n case 'start':\n case 'end':\n fillColor = '#409EFF'\n strokeColor = '#409EFF'\n break\n case 'condition':\n fillColor = '#FFF'\n strokeColor = '#E6A23C'\n break\n case 'process':\n default:\n fillColor = '#FFF'\n strokeColor = '#409EFF'\n break\n }\n \n node.attr('label/text', this.nodeForm.label)\n node.attr('body/fill', fillColor)\n node.attr('body/stroke', strokeColor)\n \n // 更新节点数据\n node.setData({\n type: this.nodeForm.type,\n url: this.nodeForm.url\n })\n }\n \n ElMessage.success('节点更新成功')\n }\n } else {\n // 添加新节点\n this.flowNodes.push({ ...this.nodeForm })\n \n // 重新渲染图表\n this.graph.clearCells()\n this.renderNodes()\n this.renderEdges()\n \n ElMessage.success('节点添加成功')\n }\n \n this.nodeDialogVisible = false\n this.isEditMode = false\n })\n },\n \n showContextMenu(event, node) {\n // 这里可以使用 element-ui 的 Popover 或其他方式实现\n this.$confirm(`要对节点 \"${node.label}\" 进行操作?`, '节点操作', {\n distinguishCancelAndClose: true,\n confirmButtonText: '编辑',\n cancelButtonText: '删除',\n type: 'warning'\n }).then(() => {\n // 点击编辑\n this.selectedNode = { ...node }\n this.editNode()\n }).catch(action => {\n if (action === 'cancel') {\n // 点击删除\n this.deleteNode(node.id)\n }\n })\n },\n \n deleteNode(nodeId) {\n this.$confirm('确定要删除该节点吗?相关的连线也将被删除', '删除节点', {\n type: 'warning'\n }).then(() => {\n // 删除节点数据\n const index = this.flowNodes.findIndex(node => node.id === nodeId)\n if (index !== -1) {\n this.flowNodes.splice(index, 1)\n \n // 删除相关连线\n this.flowEdges = this.flowEdges.filter(\n edge => edge.source !== nodeId && edge.target !== nodeId\n )\n \n // 重新渲染图表\n this.graph.clearCells()\n this.renderNodes()\n this.renderEdges()\n \n ElMessage.success('节点删除成功')\n }\n }).catch(() => {})\n },\n \n addEdge() {\n this.edgeForm = {\n source: '',\n target: '',\n label: ''\n }\n this.edgeDialogVisible = true\n },\n \n saveEdge() {\n this.$refs.edgeForm.validate(valid => {\n if (!valid) return\n \n // 检查连线是否已存在\n if (this.flowEdges.some(\n edge => edge.source === this.edgeForm.source && edge.target === this.edgeForm.target\n )) {\n ElMessage.error('该连线已存在')\n return\n }\n \n // 添加连线\n this.flowEdges.push({ ...this.edgeForm })\n \n // 重新渲染图表\n this.graph.clearCells()\n this.renderNodes()\n this.renderEdges()\n \n ElMessage.success('连线添加成功')\n this.edgeDialogVisible = false\n })\n },\n \n editEdgeLabel(edge, edgeData) {\n this.$prompt('请输入连线标签', '编辑连线', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n inputValue: edgeData.label\n }).then(({ value }) => {\n // 更新连线数据\n edgeData.label = value\n \n // 更新画布上的连线\n edge.setLabels([{\n attrs: {\n text: {\n text: value\n }\n },\n position: {\n distance: 0.5\n }\n }])\n \n ElMessage.success('连线标签更新成功')\n }).catch(() => {})\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.x6-flow-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: #f7f9fc;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\n}\n\n.flow-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 10px;\n border-bottom: 1px solid #ebeef5;\n \n h2 {\n margin: 0;\n color: #2c3e50;\n font-size: 22px;\n font-weight: 600;\n }\n \n .flow-actions {\n display: flex;\n gap: 10px;\n }\n}\n\n.graph-container {\n position: relative;\n flex: 1;\n min-height: 600px;\n border: 1px solid #ebeef5;\n border-radius: 4px;\n background-color: #fff;\n overflow: hidden;\n}\n\n#x6-graph-container {\n width: 100%;\n height: 100%;\n}\n\n// 自定义节点样式\n:global(.flow-node-rect) {\n &:hover {\n filter: drop-shadow(0px 4px 10px rgba(64, 158, 255, 0.3));\n }\n}\n\n:global(.flow-node-diamond) {\n &:hover {\n filter: drop-shadow(0px 4px 10px rgba(230, 162, 60, 0.3));\n }\n}\n\n:global(.flow-node-circle) {\n &:hover {\n filter: drop-shadow(0px 4px 10px rgba(64, 158, 255, 0.4));\n }\n}\n\n// 节点信息面板\n.node-info-panel {\n position: absolute;\n top: 20px;\n right: 20px;\n width: 250px;\n background-color: #fff;\n border-radius: 8px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);\n padding: 15px;\n z-index: 100;\n \n h3 {\n margin-top: 0;\n margin-bottom: 15px;\n font-size: 16px;\n color: #2c3e50;\n border-bottom: 1px solid #ebeef5;\n padding-bottom: 10px;\n }\n \n .info-item {\n display: flex;\n margin-bottom: 10px;\n \n .label {\n width: 60px;\n color: #606266;\n font-weight: 600;\n }\n \n .value {\n flex: 1;\n color: #303133;\n word-break: break-all;\n }\n }\n \n .actions {\n display: flex;\n justify-content: flex-end;\n margin-top: 15px;\n gap: 10px;\n }\n}\n\n// 响应式布局\n@media screen and (max-width: 768px) {\n .x6-flow-container {\n padding: 10px;\n }\n \n .flow-header {\n flex-direction: column;\n align-items: flex-start;\n \n h2 {\n margin-bottom: 10px;\n font-size: 18px;\n }\n }\n \n .node-info-panel {\n width: calc(100% - 40px);\n top: auto;\n bottom: 20px;\n }\n}\n\n// 自定义Vue节点组件样式\n.custom-node {\n width: 100%;\n height: 100%;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n \n &.start, &.end {\n background-color: #409EFF;\n color: #fff;\n border-radius: 30px;\n }\n \n &.condition {\n background-color: #fff;\n border: 2px solid #E6A23C;\n color: #E6A23C;\n transform: rotate(45deg);\n \n .node-label {\n transform: rotate(-45deg);\n }\n }\n \n &.process {\n background-color: #fff;\n border: 2px solid #409EFF;\n color: #303133;\n }\n \n .node-label {\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n padding: 0 6px;\n }\n}\n\n// 对话框表单样式\n.el-form-item {\n margin-bottom: 20px;\n}\n\n.dialog-footer {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n}\n\n// 工具栏样式\n.toolbar {\n position: absolute;\n left: 20px;\n bottom: 20px;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);\n padding: 8px;\n z-index: 50;\n \n .el-button {\n margin-bottom: 8px;\n \n &:last-child {\n margin-bottom: 0;\n }\n }\n}\n</style> "],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}