145 lines
178 KiB
JavaScript
145 lines
178 KiB
JavaScript
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{
|
||
|
||
/***/ "../simple-mind-map/src/plugins/FlowChartLine.js":
|
||
/*!*******************************************************!*\
|
||
!*** ../simple-mind-map/src/plugins/FlowChartLine.js ***!
|
||
\*******************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _svgdotjs_svg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @svgdotjs/svg.js */ \"../simple-mind-map/node_modules/@svgdotjs/svg.js/dist/svg.esm.js\");\n\n\n\n/**\n * 流程图连接线插件\n * 处理从连接点拖拽创建关联线的功能\n */\nclass FlowChartLine {\n constructor(opt) {\n this.mindMap = opt.mindMap;\n this.draw = this.mindMap.draw;\n this.isDragging = false;\n this.startNode = null;\n this.startPosition = null;\n this.tempLine = null;\n this.startPoint = {\n x: 0,\n y: 0\n };\n this.endPoint = {\n x: 0,\n y: 0\n };\n this.bindEvents();\n }\n\n /**\n * 绑定事件\n */\n bindEvents() {\n // 监听连接点拖拽开始事件\n this.mindMap.on('flowchart_connector_drag_start', this.handleDragStart.bind(this));\n // 监听鼠标移动事件\n this.mindMap.on('mousemove', this.handleMouseMove.bind(this));\n // 监听鼠标松开事件\n this.mindMap.on('mouseup', this.handleMouseUp.bind(this));\n // 监听节点mouseenter事件,用于检测目标节点\n this.mindMap.on('node_mouseenter', this.handleNodeMouseEnter.bind(this));\n }\n\n /**\n * 处理拖拽开始\n */\n handleDragStart(data) {\n const {\n node,\n position,\n event\n } = data;\n\n // 只有流程图节点才能开始拖拽\n if (!node.nodeData.data.isFlowChart) return;\n this.isDragging = true;\n this.startNode = node;\n this.startPosition = position;\n\n // 获取连接点的绝对位置(在节点坐标系中)\n const connectorPos = node._flowChartConnector.getConnectorAbsolutePosition(position);\n if (!connectorPos) return;\n\n // 起始点就是连接点的位置(在SVG坐标系中)\n this.startPoint = {\n x: connectorPos.x,\n y: connectorPos.y\n };\n\n // 创建临时连接线\n this.createTempLine();\n\n // 阻止默认行为\n event.preventDefault();\n event.stopPropagation();\n }\n\n /**\n * 创建临时连接线\n */\n createTempLine() {\n this.tempLine = new _svgdotjs_svg_js__WEBPACK_IMPORTED_MODULE_1__[\"Path\"]().fill('none').stroke({\n color: '#2196f3',\n width: 2,\n dasharray: '5,5'\n }).css({\n 'pointer-events': 'none'\n });\n\n // 添加到关联线画布层,确保在正确的层级\n this.mindMap.associativeLineDraw.add(this.tempLine);\n this.tempLine.front(); // 确保在最前面\n this.updateTempLine(this.startPoint.x, this.startPoint.y);\n }\n\n /**\n * 更新临时连接线\n */\n updateTempLine(endX, endY) {\n if (!this.tempLine) return;\n const path = this.calculatePath(this.startPoint, {\n x: endX,\n y: endY\n });\n this.tempLine.plot(path);\n }\n\n /**\n * 计算路径\n */\n calculatePath(start, end) {\n // 对于流程图,使用正交路径的简化版本\n const path = [`M ${start.x} ${start.y}`];\n\n // 计算方向\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n\n // 简单的L形路径\n if (Math.abs(dx) > Math.abs(dy)) {\n // 水平方向优先\n const midX = start.x + dx / 2;\n path.push(`L ${midX} ${start.y}`);\n path.push(`L ${midX} ${end.y}`);\n path.push(`L ${end.x} ${end.y}`);\n } else {\n // 垂直方向优先\n const midY = start.y + dy / 2;\n path.push(`L ${start.x} ${midY}`);\n path.push(`L ${end.x} ${midY}`);\n path.push(`L ${end.x} ${end.y}`);\n }\n return path.join(' ');\n }\n\n /**\n * 处理鼠标移动\n */\n handleMouseMove(e) {\n if (!this.isDragging || !this.tempLine) return;\n\n // 先转换到容器坐标\n const {\n x: containerX,\n y: containerY\n } = this.mindMap.toPos(e.clientX, e.clientY);\n\n // 然后考虑画布的变换(缩放和平移)\n const transform = this.mindMap.draw.transform();\n const mousePoint = {\n x: (containerX - transform.translateX) / transform.scaleX,\n y: (containerY - transform.translateY) / transform.scaleY\n };\n\n // 检查是否靠近某个连接点(吸附功能)\n const snapResult = this.checkSnapToConnector(mousePoint, e.clientX, e.clientY);\n if (snapResult) {\n this.endPoint = snapResult.point;\n // 高亮目标连接点\n if (snapResult.connector) {\n snapResult.connector.animate(100).attr({\n opacity: 1,\n r: this.mindMap.opt.flowChartConnectorSize || 8\n });\n }\n } else {\n this.endPoint = mousePoint;\n // 取消所有连接点高亮\n this.unhighlightAllConnectors();\n }\n this.updateTempLine(this.endPoint.x, this.endPoint.y);\n }\n\n /**\n * 处理节点鼠标进入\n */\n handleNodeMouseEnter(node) {\n if (!this.isDragging) return;\n\n // 检查是否是流程图节点\n if (!node.nodeData.data.isFlowChart) return;\n\n // 不能连接到自己\n if (node.uid === this.startNode.uid) return;\n\n // 高亮目标节点的连接点\n if (node._flowChartConnector) {\n node._flowChartConnector.showConnectors();\n }\n }\n\n /**\n * 处理鼠标松开\n */\n handleMouseUp(e) {\n if (!this.isDragging) return;\n\n // 先转换坐标\n const {\n x: containerX,\n y: containerY\n } = this.mindMap.toPos(e.clientX, e.clientY);\n const transform = this.mindMap.draw.transform();\n const mousePoint = {\n x: (containerX - transform.translateX) / transform.scaleX,\n y: (containerY - transform.translateY) / transform.scaleY\n };\n\n // 检查是否可以吸附到连接点\n const snapResult = this.checkSnapToConnector(mousePoint, e.clientX, e.clientY);\n if (snapResult && snapResult.node) {\n // 创建实际的关联线,使用吸附的位置\n this.createAssociationLine(this.startNode, this.startPosition, snapResult.node, snapResult.position);\n } else {\n // 检查是否拖到空白处(Phase 4.4 功能)\n const targetNode = this.findNodeAtPosition(e.clientX, e.clientY);\n if (!targetNode && this.mindMap.opt.enableDragCreateFlowChartNode !== false) {\n // 在空白处创建新的流程图节点\n this.createNewFlowChartNode(mousePoint);\n // 延迟清理,让createNewFlowChartNode有机会使用startNode\n setTimeout(() => {\n this.cleanup();\n this.unhighlightAllConnectors();\n }, 200);\n return;\n }\n }\n\n // 正常情况下立即清理\n this.cleanup();\n this.unhighlightAllConnectors();\n }\n\n /**\n * 查找指定位置的节点\n */\n findNodeAtPosition(clientX, clientY) {\n // 使用更简单的方法:利用当前鼠标下的hover节点\n let targetNode = null;\n\n // 遍历所有SVG元素,查找包含smm-node类的元素\n const elements = document.elementsFromPoint(clientX, clientY);\n for (let element of elements) {\n // 查找包含节点类的SVG组元素\n const nodeGroup = element.closest('.smm-node');\n if (nodeGroup) {\n // 尝试从DOM元素获取存储的节点引用\n // 很多库会将节点实例存储在DOM元素上\n if (nodeGroup._node) {\n targetNode = nodeGroup._node;\n break;\n }\n\n // 如果没有直接引用,遍历所有节点查找匹配的DOM元素\n const allNodes = [];\n\n // 收集所有节点\n const collectNodes = node => {\n if (!node) return;\n allNodes.push(node);\n if (node.children && node.children.length > 0) {\n node.children.forEach(child => collectNodes(child));\n }\n };\n\n // 处理多根模式\n if (this.mindMap.renderer.renderTree) {\n if (Array.isArray(this.mindMap.renderer.renderTree)) {\n // 多根模式\n this.mindMap.renderer.renderTree.forEach(root => {\n if (root && root._node) {\n collectNodes(root._node);\n }\n });\n } else if (this.mindMap.renderer.root) {\n // 单根模式 - 使用渲染后的根节点\n collectNodes(this.mindMap.renderer.root);\n }\n }\n\n // 查找匹配的节点\n for (let node of allNodes) {\n if (node.group && node.group.node === nodeGroup) {\n targetNode = node;\n break;\n }\n }\n if (targetNode) break;\n }\n }\n return targetNode;\n }\n\n /**\n * 检查是否可以吸附到连接点\n */\n checkSnapToConnector(mousePoint, clientX, clientY) {\n const snapThreshold = 20; // 吸附阈值(像素)\n\n // 查找鼠标下的节点\n const targetNode = this.findNodeAtPosition(clientX, clientY);\n if (targetNode && targetNode.nodeData.data.isFlowChart && targetNode.uid !== this.startNode.uid && targetNode._flowChartConnector) {\n // 获取所有连接点位置\n const positions = ['top', 'right', 'bottom', 'left'];\n let nearestConnector = null;\n let nearestDistance = Infinity;\n let nearestPoint = null;\n let nearestPosition = null;\n positions.forEach(position => {\n const connector = targetNode._flowChartConnector.getConnectorByPosition(position);\n if (!connector) return;\n const connectorPos = targetNode._flowChartConnector.getConnectorAbsolutePosition(position);\n if (!connectorPos) return;\n\n // 计算距离\n const distance = Math.sqrt(Math.pow(connectorPos.x - mousePoint.x, 2) + Math.pow(connectorPos.y - mousePoint.y, 2));\n if (distance < snapThreshold && distance < nearestDistance) {\n nearestDistance = distance;\n nearestConnector = connector;\n nearestPoint = connectorPos;\n nearestPosition = position;\n }\n });\n if (nearestConnector) {\n return {\n point: nearestPoint,\n connector: nearestConnector,\n node: targetNode,\n position: nearestPosition\n };\n }\n }\n return null;\n }\n\n /**\n * 取消所有连接点高亮\n */\n unhighlightAllConnectors() {\n // 遍历所有节点,取消连接点高亮\n const allNodes = [];\n const collectNodes = node => {\n if (!node) return;\n allNodes.push(node);\n if (node.children && node.children.length > 0) {\n node.children.forEach(child => collectNodes(child));\n }\n };\n if (this.mindMap.renderer.renderTree) {\n if (Array.isArray(this.mindMap.renderer.renderTree)) {\n this.mindMap.renderer.renderTree.forEach(root => {\n if (root && root._node) collectNodes(root._node);\n });\n } else if (this.mindMap.renderer.root) {\n collectNodes(this.mindMap.renderer.root);\n }\n }\n allNodes.forEach(node => {\n if (node._flowChartConnector) {\n node._flowChartConnector.hideConnectors();\n }\n });\n }\n\n /**\n * 找到最近的连接点\n */\n findNearestConnector(node, point) {\n if (!node._flowChartConnector) return null;\n let minDistance = Infinity;\n let nearestPosition = null;\n const positions = ['top', 'right', 'bottom', 'left'];\n positions.forEach(position => {\n const connectorPos = node._flowChartConnector.getConnectorAbsolutePosition(position);\n if (!connectorPos) return;\n const distance = Math.sqrt(Math.pow(connectorPos.x - point.x, 2) + Math.pow(connectorPos.y - point.y, 2));\n if (distance < minDistance) {\n minDistance = distance;\n nearestPosition = position;\n }\n });\n return nearestPosition;\n }\n\n /**\n * 创建关联线\n */\n createAssociationLine(startNode, startPosition, endNode, endPosition) {\n // 检查参数有效性\n if (!startNode || !endNode) {\n console.warn('createAssociationLine: 无效的节点参数', startNode, endNode);\n return;\n }\n\n // 使用现有的关联线功能\n if (this.mindMap.associativeLine) {\n // 先添加关联线\n this.mindMap.associativeLine.addLine(startNode, endNode);\n\n // 获取当前的关联线目标数组\n const targets = startNode.getData('associativeLineTargets') || [];\n const targetIndex = targets.findIndex(t => t === endNode.getData('uid'));\n if (targetIndex !== -1) {\n // 获取或创建关联线点位数组\n const associativeLinePoint = startNode.getData('associativeLinePoint') || [];\n\n // 确保数组长度足够\n while (associativeLinePoint.length <= targetIndex) {\n associativeLinePoint.push({});\n }\n\n // 设置该关联线的连接点位置\n associativeLinePoint[targetIndex] = {\n startPoint: {\n dir: startPosition,\n range: 0 // range 是偏移量,0 表示中心位置\n },\n endPoint: {\n dir: endPosition,\n range: 0 // range 是偏移量,0 表示中心位置\n }\n };\n\n // 更新节点数据\n this.mindMap.execCommand('SET_NODE_DATA', startNode, {\n associativeLinePoint\n });\n\n // 立即重新渲染关联线以应用新的位置\n setTimeout(() => {\n this.mindMap.associativeLine.renderAllLines();\n }, 0);\n }\n\n // 触发事件\n this.mindMap.emit('flowchart_line_created', {\n startNode,\n startPosition,\n endNode,\n endPosition\n });\n }\n }\n\n /**\n * 创建新的流程图节点\n */\n createNewFlowChartNode(position) {\n // 默认创建一个处理节点\n const nodeType = 'process';\n const newNodeData = {\n data: {\n text: '新节点',\n isFlowChart: true,\n flowchart: {\n nodeType: nodeType\n },\n customLeft: position.x - 50,\n // 居中\n customTop: position.y - 25\n },\n children: []\n };\n\n // 保存起始节点和位置,避免在异步回调中丢失\n const sourceNode = this.startNode;\n const sourcePosition = this.startPosition;\n\n // 使用正确的 addRootNode 方法,传入回调函数\n this.mindMap.addRootNode(newNodeData, -1, createdNode => {\n if (createdNode) {\n // 根据拖拽方向决定连接点\n const dx = position.x - this.startPoint.x;\n const dy = position.y - this.startPoint.y;\n let targetPosition = 'left';\n if (Math.abs(dx) > Math.abs(dy)) {\n targetPosition = dx > 0 ? 'left' : 'right';\n } else {\n targetPosition = dy > 0 ? 'top' : 'bottom';\n }\n\n // 稍微延迟以确保节点完全渲染并初始化\n setTimeout(() => {\n // 确保节点已经完全初始化\n if (createdNode && createdNode.getData) {\n // 创建关联线\n this.createAssociationLine(sourceNode, sourcePosition, createdNode, targetPosition);\n\n // 激活新节点以便编辑\n createdNode.active();\n\n // 触发节点创建事件\n this.mindMap.emit('flowchart_node_created', {\n node: createdNode,\n fromNode: sourceNode,\n position: position\n });\n } else {\n console.warn('新创建的节点尚未完全初始化');\n }\n }, 100); // 增加延迟时间\n }\n });\n }\n\n /**\n * 清理临时元素\n */\n cleanup() {\n if (this.tempLine) {\n this.tempLine.remove();\n this.tempLine = null;\n }\n this.isDragging = false;\n this.startNode = null;\n this.startPosition = null;\n this.startPoint = {\n x: 0,\n y: 0\n };\n this.endPoint = {\n x: 0,\n y: 0\n };\n }\n\n /**\n * 销毁插件\n */\n destroy() {\n this.cleanup();\n this.mindMap.off('flowchart_connector_drag_start', this.handleDragStart);\n this.mindMap.off('mousemove', this.handleMouseMove);\n this.mindMap.off('mouseup', this.handleMouseUp);\n this.mindMap.off('node_mouseenter', this.handleNodeMouseEnter);\n }\n}\n\n// 注册插件\nFlowChartLine.pluginName = 'flowChartLine';\n/* harmony default export */ __webpack_exports__[\"default\"] = (FlowChartLine);\n\n//# sourceURL=webpack:///../simple-mind-map/src/plugins/FlowChartLine.js?");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=script&lang=js":
|
||
/*!*******************************************************************************************************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=script&lang=js ***!
|
||
\*******************************************************************************************************************************************************************************************************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom-exception.stack.js */ \"./node_modules/core-js/modules/web.dom-exception.stack.js\");\n/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/web.url-search-params.delete.js */ \"./node_modules/core-js/modules/web.url-search-params.delete.js\");\n/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/web.url-search-params.has.js */ \"./node_modules/core-js/modules/web.url-search-params.has.js\");\n/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/web.url-search-params.size.js */ \"./node_modules/core-js/modules/web.url-search-params.size.js\");\n/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/utils/logger */ \"./src/utils/logger/index.ts\");\n/* harmony import */ var simple_mind_map__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! simple-mind-map */ \"../simple-mind-map/index.js\");\n/* harmony import */ var simple_mind_map_src_plugins_MiniMap_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! simple-mind-map/src/plugins/MiniMap.js */ \"../simple-mind-map/src/plugins/MiniMap.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Watermark_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! simple-mind-map/src/plugins/Watermark.js */ \"../simple-mind-map/src/plugins/Watermark.js\");\n/* harmony import */ var simple_mind_map_src_plugins_KeyboardNavigation_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! simple-mind-map/src/plugins/KeyboardNavigation.js */ \"../simple-mind-map/src/plugins/KeyboardNavigation.js\");\n/* harmony import */ var simple_mind_map_src_plugins_ExportPDF_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! simple-mind-map/src/plugins/ExportPDF.js */ \"../simple-mind-map/src/plugins/ExportPDF.js\");\n/* harmony import */ var simple_mind_map_src_plugins_ExportXMind_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! simple-mind-map/src/plugins/ExportXMind.js */ \"../simple-mind-map/src/plugins/ExportXMind.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Export_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! simple-mind-map/src/plugins/Export.js */ \"../simple-mind-map/src/plugins/Export.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Drag_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! simple-mind-map/src/plugins/Drag.js */ \"../simple-mind-map/src/plugins/Drag.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Select_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! simple-mind-map/src/plugins/Select.js */ \"../simple-mind-map/src/plugins/Select.js\");\n/* harmony import */ var simple_mind_map_src_plugins_AssociativeLine_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! simple-mind-map/src/plugins/AssociativeLine.js */ \"../simple-mind-map/src/plugins/AssociativeLine.js\");\n/* harmony import */ var simple_mind_map_src_plugins_TouchEvent_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! simple-mind-map/src/plugins/TouchEvent.js */ \"../simple-mind-map/src/plugins/TouchEvent.js\");\n/* harmony import */ var simple_mind_map_src_plugins_NodeImgAdjust_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! simple-mind-map/src/plugins/NodeImgAdjust.js */ \"../simple-mind-map/src/plugins/NodeImgAdjust.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Search_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! simple-mind-map/src/plugins/Search.js */ \"../simple-mind-map/src/plugins/Search.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Painter_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! simple-mind-map/src/plugins/Painter.js */ \"../simple-mind-map/src/plugins/Painter.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Formula_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! simple-mind-map/src/plugins/Formula.js */ \"../simple-mind-map/src/plugins/Formula.js\");\n/* harmony import */ var simple_mind_map_src_plugins_RainbowLines_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! simple-mind-map/src/plugins/RainbowLines.js */ \"../simple-mind-map/src/plugins/RainbowLines.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Demonstrate_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! simple-mind-map/src/plugins/Demonstrate.js */ \"../simple-mind-map/src/plugins/Demonstrate.js\");\n/* harmony import */ var simple_mind_map_src_plugins_OuterFrame_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! simple-mind-map/src/plugins/OuterFrame.js */ \"../simple-mind-map/src/plugins/OuterFrame.js\");\n/* harmony import */ var simple_mind_map_src_plugins_MindMapLayoutPro_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! simple-mind-map/src/plugins/MindMapLayoutPro.js */ \"../simple-mind-map/src/plugins/MindMapLayoutPro.js\");\n/* harmony import */ var simple_mind_map_plugin_themes__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! simple-mind-map-plugin-themes */ \"./node_modules/simple-mind-map-plugin-themes/index.js\");\n/* harmony import */ var _simple_mind_map_plugin_themes_themeList__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @/../../simple-mind-map-plugin-themes/themeList */ \"../simple-mind-map-plugin-themes/themeList.js\");\n/* harmony import */ var simple_mind_map_src_plugins_FlowChartLine_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! simple-mind-map/src/plugins/FlowChartLine.js */ \"../simple-mind-map/src/plugins/FlowChartLine.js\");\n/* harmony import */ var simple_mind_map_src_parse_markdown_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! simple-mind-map/src/parse/markdown.js */ \"../simple-mind-map/src/parse/markdown.js\");\n\n\n\n\n\n\n// 导入日志系统\n\n\n// 导入 MindMap 核心库和插件\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst defaultMarkdownTestText = ['# 一级标题A', '', '简单说明段落。', '', '## 二级标题A-1', '', '- 列表项1', '- 列表项2', '', '### 三级标题A-1-1', '', '# 一级标题B', '', '## 二级标题B-1'].join('\\n');\n\n// 注册插件\nsimple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"].usePlugin(simple_mind_map_src_plugins_MiniMap_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Watermark_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Drag_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"]).usePlugin(simple_mind_map_src_plugins_KeyboardNavigation_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"]).usePlugin(simple_mind_map_src_plugins_ExportPDF_js__WEBPACK_IMPORTED_MODULE_11__[\"default\"]).usePlugin(simple_mind_map_src_plugins_ExportXMind_js__WEBPACK_IMPORTED_MODULE_12__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Export_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Select_js__WEBPACK_IMPORTED_MODULE_15__[\"default\"]).usePlugin(simple_mind_map_src_plugins_AssociativeLine_js__WEBPACK_IMPORTED_MODULE_16__[\"default\"]).usePlugin(simple_mind_map_src_plugins_NodeImgAdjust_js__WEBPACK_IMPORTED_MODULE_18__[\"default\"]).usePlugin(simple_mind_map_src_plugins_TouchEvent_js__WEBPACK_IMPORTED_MODULE_17__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Search_js__WEBPACK_IMPORTED_MODULE_19__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Painter_js__WEBPACK_IMPORTED_MODULE_20__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Formula_js__WEBPACK_IMPORTED_MODULE_21__[\"default\"]).usePlugin(simple_mind_map_src_plugins_RainbowLines_js__WEBPACK_IMPORTED_MODULE_22__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Demonstrate_js__WEBPACK_IMPORTED_MODULE_23__[\"default\"]).usePlugin(simple_mind_map_src_plugins_OuterFrame_js__WEBPACK_IMPORTED_MODULE_24__[\"default\"]).usePlugin(simple_mind_map_src_plugins_MindMapLayoutPro_js__WEBPACK_IMPORTED_MODULE_25__[\"default\"]).usePlugin(simple_mind_map_src_plugins_FlowChartLine_js__WEBPACK_IMPORTED_MODULE_28__[\"default\"]);\n\n// 注册主题\nsimple_mind_map_plugin_themes__WEBPACK_IMPORTED_MODULE_26__[\"default\"].init(simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'Test',\n data() {\n return {\n mindMap: null,\n isMultiRoot: false,\n rootCount: 1,\n associationCount: 0,\n isAssociativeMode: false,\n activeTab: 'data',\n currentData: null,\n associationsData: [],\n operationLogs: [],\n // 主题相关\n selectedRootIndex: null,\n selectedTheme: '',\n rootsInfo: [],\n // 布局相关\n selectedLayoutRootIndex: null,\n selectedLayout: '',\n // 大括号连接线相关\n braceCurveSize: 12,\n lineTestLayout: 'mindMap',\n availableLayouts: [{\n label: '逻辑结构图',\n value: 'logicalStructure'\n }, {\n label: '逻辑结构图(向左)',\n value: 'logicalStructureLeft'\n }, {\n label: '思维导图',\n value: 'mindMap'\n }, {\n label: '组织结构图',\n value: 'organizationStructure'\n }, {\n label: '目录组织图',\n value: 'catalogOrganization'\n }, {\n label: '时间轴',\n value: 'timeline'\n }, {\n label: '时间轴2',\n value: 'timeline2'\n }, {\n label: '鱼骨图',\n value: 'fishbone'\n }, {\n label: '竖向时间轴',\n value: 'verticalTimeline'\n }, {\n label: '径向布局',\n value: 'radial'\n }],\n availableThemes: ['default', 'classic', 'classic2', 'classic3', 'classic4', 'classic5', 'classic6', 'classic7', 'classic8', 'classic9', 'classic10', 'dark', 'dark2', 'dark3', 'dark4', 'freshGreen', 'freshBlue', 'freshRed', 'freshPurple', 'freshPink', 'freshYellow'],\n // 主题预览图生成相关\n themeGeneratorDialogVisible: false,\n previewMindMap: null,\n previewMindMapEl: null,\n allThemes: [],\n generatedSVGs: [],\n generatedCount: 0,\n currentThemeName: '',\n isGenerating: false,\n // 压缩质量设置\n webpQuality: 0.8,\n // 默认80%质量\n jpgQuality: 0.85,\n // 默认85%质量\n // 布局预览图生成相关\n layoutGeneratorDialogVisible: false,\n allLayouts: [],\n generatedLayoutSVGs: [],\n generatedLayoutCount: 0,\n currentLayoutName: '',\n isGeneratingLayouts: false,\n layoutWebpQuality: 0.8,\n layoutJpgQuality: 0.85,\n layoutPreviewMindMap: null,\n layoutPreviewMindMapEl: null,\n // Markdown 测试相关\n markdownTestText: defaultMarkdownTestText\n };\n },\n computed: {\n formattedData() {\n return this.currentData ? JSON.stringify(this.currentData, null, 2) : '暂无数据';\n }\n },\n mounted() {\n // 自动初始化\n this.$nextTick(() => {\n this.initMindMap();\n });\n },\n beforeDestroy() {\n if (this.mindMap) {\n this.mindMap.destroy();\n }\n },\n methods: {\n // 添加操作日志\n addLog(message) {\n this.operationLogs.unshift({\n time: new Date().toLocaleTimeString(),\n message\n });\n // 保持最多20条日志\n if (this.operationLogs.length > 20) {\n this.operationLogs = this.operationLogs.slice(0, 20);\n }\n },\n // 初始化思维导图\n initMindMap() {\n if (this.mindMap) {\n this.mindMap.destroy();\n }\n try {\n this.mindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: this.$refs.mindMapContainer,\n data: this.getMultiRootData(),\n // 默认加载多根数据\n layout: 'logicalStructure',\n theme: 'classic7',\n fit: true,\n nodeTextEditZIndex: 1000,\n nodeNoteTooltipZIndex: 1000,\n // 启用多根节点相关配置\n enableDblclickCreateRootNode: true,\n dragToEmptySpaceCreateRootTime: 2000,\n // 允许根节点收起展开\n allowRootNodeCollapse: true\n });\n this.addLog('思维导图初始化成功');\n this.bindEvents();\n this.updateAllInfo();\n } catch (error) {\n console.error('思维导图初始化失败:', error);\n this.addLog('初始化失败: ' + error.message);\n }\n },\n // 使用旧的 markdown 解析方法(单根,只取第一个顶层节点)\n parseMarkdownOld() {\n if (!this.mindMap) return;\n const md = this.markdownTestText || '';\n const oldRoot = simple_mind_map_src_parse_markdown_js__WEBPACK_IMPORTED_MODULE_29__[\"default\"].transformMarkdownTo(md);\n if (!oldRoot) {\n this.$message.warning('旧解析结果为空(可能没有有效的标题)');\n return;\n }\n this.mindMap.setData(oldRoot);\n this.mindMap.view.fit();\n this.addLog('使用旧 Markdown 解析结果渲染导图');\n },\n // 使用新的 markdown 解析方法(以固定根节点文本“测试文档”为根)\n parseMarkdownNew() {\n if (!this.mindMap) return;\n const md = this.markdownTestText || '';\n const newRoot = simple_mind_map_src_parse_markdown_js__WEBPACK_IMPORTED_MODULE_29__[\"default\"].transformMarkdownToNodeTree(md, {\n rootText: '测试文档'\n });\n if (!newRoot) {\n this.$message.warning('新解析结果为空');\n return;\n }\n this.mindMap.setData(newRoot);\n this.mindMap.view.fit();\n this.addLog('使用新 Markdown 解析结果渲染导图(根节点为“测试文档”)');\n },\n // 触发选择 markdown 文件\n triggerMarkdownFileSelect() {\n const input = this.$refs.markdownFileInput;\n if (input && input.click) {\n input.click();\n }\n },\n // 处理测试面板中导入的 markdown 文件\n handleMarkdownFileChange(e) {\n const input = e.target;\n const file = input.files && input.files[0];\n if (!file) return;\n const reader = new FileReader();\n reader.readAsText(file);\n reader.onload = evt => {\n this.markdownTestText = evt.target.result || '';\n this.$message.success('已从文件加载 Markdown 到输入框');\n this.addLog(`从文件导入 Markdown:${file.name}`);\n };\n reader.onerror = err => {\n console.error('读取 Markdown 文件失败:', err);\n this.$message.error('读取 Markdown 文件失败');\n };\n // 重置 input,避免选择同一文件不触发 change\n input.value = '';\n },\n // 绑定事件\n bindEvents() {\n // 基础事件\n this.mindMap.on('node_active', (node, activeNodeList) => {\n if (node && node.getData) {\n this.addLog(`激活节点: ${node.getData('text')}`);\n } else if (activeNodeList && activeNodeList.length === 0) {\n this.addLog('清除所有激活节点');\n } else if (!node) {\n this.addLog('激活节点已清除');\n } else {\n this.addLog('激活节点: 数据异常');\n }\n });\n this.mindMap.on('data_change', () => {\n this.updateAllInfo();\n });\n this.mindMap.on('node_created', node => {\n if (node && node.getData) {\n this.addLog(`创建节点: ${node.getData('text')}`);\n } else {\n this.addLog('创建节点: 数据异常');\n }\n });\n this.mindMap.on('node_dragged', node => {\n if (node && node.getData) {\n this.addLog(`拖拽节点: ${node.getData('text')}`);\n } else {\n this.addLog('拖拽节点: 数据异常');\n }\n });\n\n // 关联线事件\n this.mindMap.on('associative_line_click', (path, clickPath, fromNode, toNode) => {\n try {\n const fromText = fromNode && fromNode.getData ? fromNode.getData('text') : '未知';\n const toText = toNode && toNode.getData ? toNode.getData('text') : '未知';\n this.addLog(`点击关联线: ${fromText} -> ${toText}`);\n } catch (error) {\n console.warn('关联线点击事件处理错误:', error);\n this.addLog('点击关联线: 数据异常');\n }\n });\n this.mindMap.on('associative_line_deactivate', () => {\n this.addLog(`关联线取消激活`);\n });\n\n // 监听数据变化来检测关联线的增删\n this.mindMap.on('data_change', () => {\n this.updateAssociationsData();\n });\n\n // 监听关联线创建状态变化\n this.mindMap.on('draw_click', () => {\n // 当点击空白处时,如果正在创建关联线,则取消\n if (this.isAssociativeMode && this.mindMap.associativeLine && !this.mindMap.associativeLine.isCreatingLine) {\n this.isAssociativeMode = false;\n this.addLog('退出关联线创建模式');\n }\n });\n },\n // 获取单根节点测试数据\n getSingleRootData() {\n return {\n data: {\n text: 'A'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }]\n }, {\n data: {\n text: 'A2'\n },\n children: [{\n data: {\n text: 'A2-1'\n }\n }, {\n data: {\n text: 'A2-2'\n }\n }]\n }]\n };\n },\n // 获取多根节点测试数据\n getMultiRootData() {\n return {\n multiRoot: true,\n roots: [{\n data: {\n text: 'A',\n layout: 'logicalStructure',\n theme: 'classic7'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }]\n }, {\n data: {\n text: 'A2'\n }\n }]\n }, {\n data: {\n text: 'B',\n layout: 'mindMap',\n theme: 'dark2'\n },\n children: [{\n data: {\n text: 'B1'\n },\n children: [{\n data: {\n text: 'B1-1'\n }\n }, {\n data: {\n text: 'B1-2'\n }\n }]\n }, {\n data: {\n text: 'B2'\n }\n }, {\n data: {\n text: 'B3'\n }\n }]\n }, {\n data: {\n text: 'C',\n theme: 'freshGreen'\n },\n children: [{\n data: {\n text: 'C1'\n }\n }, {\n data: {\n text: 'C2'\n }\n }, {\n data: {\n text: 'C3'\n }\n }]\n }]\n };\n },\n // 基础操作方法\n loadSingleRoot() {\n if (!this.mindMap) return;\n this.mindMap.setData(this.getSingleRootData());\n this.addLog('加载单根节点数据');\n },\n loadMultiRoot() {\n if (!this.mindMap) return;\n this.mindMap.setData(this.getMultiRootData());\n this.addLog('加载多根节点数据');\n },\n toggleMultiRootMode() {\n if (!this.mindMap) return;\n const currentMode = this.mindMap.isMultiRoot;\n this.mindMap.setMultiRootMode(!currentMode);\n this.addLog(`切换到${!currentMode ? '多根' : '单根'}节点模式`);\n },\n addNewRoot() {\n if (!this.mindMap) return;\n const rootCount = this.mindMap.getRootNodes().length;\n const letter = String.fromCharCode(65 + rootCount); // A=65, B=66, C=67...\n this.mindMap.addRootNode({\n data: {\n text: letter,\n layout: rootCount % 2 === 0 ? 'logicalStructure' : 'mindMap'\n },\n children: [{\n data: {\n text: `${letter}1`\n }\n }, {\n data: {\n text: `${letter}2`\n }\n }]\n });\n this.addLog(`添加新根节点 ${letter}`);\n },\n removeLastRoot() {\n if (!this.mindMap) return;\n const roots = this.mindMap.getRootNodes();\n if (roots.length > 1) {\n this.mindMap.removeRootNode(roots.length - 1);\n this.addLog('删除最后一个根节点');\n } else {\n this.$message.warning('至少需要保留一个根节点');\n }\n },\n addRootWithCustomPosition() {\n if (!this.mindMap) return;\n const rootCount = this.mindMap.getRootNodes().length;\n const letter = String.fromCharCode(65 + rootCount);\n this.mindMap.addRootNode({\n data: {\n text: letter,\n layout: 'mindMap',\n customLeft: 100 + rootCount * 50,\n customTop: 100 + rootCount * 50\n },\n children: [{\n data: {\n text: `${letter}1`\n }\n }]\n });\n this.addLog(`添加自定义位置根节点 ${letter}`);\n },\n // 关联线操作方法\n enterAssociativeMode() {\n if (!this.mindMap || !this.mindMap.associativeLine) {\n this.$message.error('关联线插件未启用');\n return;\n }\n\n // 先激活一个节点,然后创建关联线\n const activeNodes = this.mindMap.renderer.activeNodeList;\n if (activeNodes.length === 0) {\n this.$message.warning('请先选择一个起始节点');\n return;\n }\n this.mindMap.associativeLine.createLineFromActiveNode();\n this.isAssociativeMode = true;\n this.addLog('进入关联线创建模式');\n this.$message.info('现在请点击目标节点创建关联线,按ESC取消');\n\n // 定时检查关联线创建状态\n this.checkAssociativeLineStatus();\n },\n createCrossRootAssociation() {\n if (!this.mindMap.isMultiRoot) {\n this.$message.warning('请先切换到多根模式');\n return;\n }\n this.enterAssociativeMode();\n this.$message.info('现在可以在不同根节点之间创建关联线');\n },\n showAllAssociations() {\n if (!this.mindMap || !this.mindMap.associativeLine) return;\n const lineList = this.mindMap.associativeLine.lineList;\n this.addLog(`显示所有关联线,共 ${lineList.length} 条`);\n this.updateAssociationsData();\n },\n clearAllAssociations() {\n if (!this.mindMap || !this.mindMap.associativeLine) return;\n this.mindMap.associativeLine.removeAllLines();\n this.addLog('清除所有关联线');\n this.updateAssociationsData();\n },\n // 日志系统测试方法\n testLoggerDebug() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].debug('test', 'Debug 日志测试消息', {\n timestamp: Date.now(),\n testData: '这是 DEBUG 级别的测试数据'\n });\n this.addLog('发送了 DEBUG 日志');\n },\n testLoggerInfo() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].info('test', 'Info 日志测试消息', {\n user: 'TestUser',\n action: '点击测试按钮',\n details: '这是 INFO 级别的测试'\n });\n this.addLog('发送了 INFO 日志');\n },\n testLoggerWarn() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].warn('test', 'Warning 日志测试消息', {\n warning: '这是一个警告',\n level: 'medium',\n suggestion: '建议检查配置'\n });\n this.addLog('发送了 WARN 日志');\n },\n testLoggerError() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].error('test', 'Error 日志测试消息', {\n error: new Error('模拟错误'),\n code: 'TEST_ERROR',\n message: '这是 ERROR 级别的测试'\n });\n this.addLog('发送了 ERROR 日志');\n },\n // 测试可点击链接格式\n testClickableLinks() {\n console.log('========== 测试可点击链接格式 ==========');\n\n // 测试各种格式\n const formats = ['webpack-internal:///./src/pages/test.vue:1150:5', 'webpack-internal:///node_modules/vue/dist/vue.js:100:10', 'webpack:///src/pages/test.vue:1150:5', 'webpack://kmind-plugin/src/pages/test.vue:1150:5', 'webpack://kmind-plugin/./src/pages/test.vue:1150:5', 'file:///Users/test/project/src/test.js:10:5', 'http://localhost:8080/src/test.js:10:5'];\n console.log('直接输出路径:');\n formats.forEach(url => {\n console.log(` at testFunction (${url})`);\n });\n console.log('\\n使用 console.trace:');\n console.trace('这会生成一个可点击的堆栈跟踪');\n console.log('\\n使用 Error.stack:');\n try {\n throw new Error('测试错误');\n } catch (e) {\n console.log(e.stack);\n }\n this.addLog('测试了多种链接格式,查看控制台');\n },\n // 检测运行环境\n detectEnvironment() {\n const isElectron = !!(typeof window !== 'undefined' && window.process && window.process.type);\n const isDev = \"siyuan-widget\" === 'development';\n const isIframe = window.parent !== window;\n const hasPluginApi = !!globalThis.kmindApi;\n const info = {\n isElectron,\n isDevelopment: isDev,\n isIframe,\n hasPluginApi,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n webpack: typeof __webpack_require__ !== 'undefined',\n nodeEnv: \"siyuan-widget\",\n buildMode: Object({\"NODE_ENV\":\"siyuan-widget\",\"VUE_APP_SIYUAN_WIDGET\":\"true\",\"BASE_URL\":\"\"}).VUE_APP_BUILD_MODE\n };\n console.group('环境检测结果');\n console.table(info);\n console.log('详细信息:', info);\n console.groupEnd();\n this.addLog(`环境: ${isElectron ? 'Electron' : 'Browser'}, ${isDev ? 'Dev' : 'Prod'}`);\n },\n removeAssociation(index) {\n if (!this.mindMap || !this.mindMap.associativeLine) return;\n const lineList = this.mindMap.associativeLine.lineList;\n if (index >= 0 && index < lineList.length) {\n const line = lineList[index];\n // 移除SVG元素\n line[0].remove(); // path\n line[1].remove(); // clickPath\n line[2].remove(); // text\n // 从数组中移除\n lineList.splice(index, 1);\n this.addLog('删除关联线');\n this.updateAssociationsData();\n }\n },\n // 测试功能方法\n testDragToEmptySpace() {\n this.addLog('测试拖拽到空白处创建根节点功能');\n this.$message.info('请拖拽任意子节点到空白处,停留2秒后放开鼠标');\n },\n testDoubleClickCreate() {\n this.addLog('测试双击创建根节点功能');\n this.$message.info('请在空白处双击鼠标创建新根节点');\n },\n testCrossRootDrag() {\n this.addLog('测试跨根节点拖拽功能');\n this.$message.info('请拖拽节点到其他根节点下成为子节点');\n },\n testGeneralizationWithChildren() {\n if (!this.mindMap) return;\n\n // 创建测试数据\n const testData = {\n data: {\n text: 'A'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }]\n }, {\n data: {\n text: 'A2'\n },\n children: [{\n data: {\n text: 'A2-1'\n }\n }, {\n data: {\n text: 'A2-2'\n }\n }]\n }, {\n data: {\n text: 'A3'\n }\n }]\n };\n this.mindMap.setData(testData);\n\n // 添加带子节点的概要\n setTimeout(() => {\n const rootNode = this.mindMap.renderer.root;\n if (rootNode && rootNode.children && rootNode.children.length >= 2) {\n // 为前两个子节点添加概要\n const targetNodes = [rootNode.children[0], rootNode.children[1]];\n\n // 选中节点\n this.mindMap.renderer.clearActiveNodeList();\n targetNodes.forEach(node => {\n this.mindMap.renderer.addNodeToActiveList(node);\n });\n\n // 添加带子节点的概要\n this.mindMap.execCommand('ADD_GENERALIZATION', {\n text: 'G1',\n children: [{\n data: {\n text: 'G1-1'\n },\n children: [{\n data: {\n text: 'G1-1-1'\n }\n }, {\n data: {\n text: 'G1-1-2'\n }\n }]\n }, {\n data: {\n text: 'G1-2'\n }\n }]\n });\n this.addLog('添加了带子节点的概要');\n this.$message.success('已创建带子节点的概要!可以在概要节点上使用Tab键添加更多子节点');\n }\n }, 500);\n this.addLog('加载概要子节点测试数据');\n },\n // 更新信息方法\n updateAllInfo() {\n this.updateBasicInfo();\n this.updateCurrentData();\n this.updateAssociationsData();\n },\n updateBasicInfo() {\n if (this.mindMap) {\n this.isMultiRoot = this.mindMap.isMultiRoot;\n const roots = this.mindMap.getRootNodes();\n this.rootCount = roots.length;\n\n // 更新根节点信息\n this.rootsInfo = roots.map((root, index) => {\n const rootData = root.nodeData || root.getData();\n return {\n text: rootData.data ? rootData.data.text : '根节点',\n theme: rootData.data && rootData.data.theme || 'default',\n layout: rootData.data && rootData.data.layout || 'logicalStructure'\n };\n });\n\n // 如果是多根模式且没有选中的根节点,选择第一个\n if (this.isMultiRoot && this.selectedRootIndex === null && this.rootsInfo.length > 0) {\n this.selectedRootIndex = 0;\n this.selectedTheme = this.rootsInfo[0].theme;\n } else if (!this.isMultiRoot) {\n // 单根模式下获取当前主题\n this.selectedTheme = this.mindMap.getTheme() || 'default';\n }\n\n // 布局相关\n if (this.isMultiRoot && this.selectedLayoutRootIndex === null && this.rootsInfo.length > 0) {\n this.selectedLayoutRootIndex = 0;\n const rootData = roots[0].nodeData || roots[0].getData();\n this.selectedLayout = rootData.data && rootData.data.layout || 'logicalStructure';\n } else if (!this.isMultiRoot) {\n // 单根模式下获取当前布局\n this.selectedLayout = this.mindMap.getLayout() || 'logicalStructure';\n }\n }\n },\n updateCurrentData() {\n if (this.mindMap) {\n this.currentData = this.mindMap.getData();\n }\n },\n updateAssociationsData() {\n if (this.mindMap && this.mindMap.associativeLine) {\n const lineList = this.mindMap.associativeLine.lineList;\n this.associationCount = lineList.length;\n this.associationsData = lineList.map((line, index) => {\n // lineList中每一项是 [path, clickPath, text, fromNode, toNode]\n const [path, clickPath, textElement, fromNode, toNode] = line;\n return {\n id: index,\n // 使用索引作为ID\n fromNodeText: fromNode && fromNode.getData ? fromNode.getData('text') : '未知',\n toNodeText: toNode && toNode.getData ? toNode.getData('text') : '未知',\n text: textElement && textElement.text ? textElement.text() : '无'\n };\n }).filter(item => item.fromNodeText !== '未知' || item.toNodeText !== '未知'); // 过滤掉无效的关联线\n } else {\n this.associationCount = 0;\n this.associationsData = [];\n }\n },\n refreshData() {\n this.updateAllInfo();\n this.addLog('刷新数据');\n },\n fitView() {\n if (this.mindMap && this.mindMap.view) {\n this.mindMap.view.fit();\n this.addLog('适应视图');\n }\n },\n checkAssociativeLineStatus() {\n // 检查关联线创建状态,如果已完成则退出模式\n const checkStatus = () => {\n if (this.isAssociativeMode && this.mindMap && this.mindMap.associativeLine) {\n if (!this.mindMap.associativeLine.isCreatingLine) {\n this.isAssociativeMode = false;\n this.addLog('关联线创建完成,退出创建模式');\n return;\n }\n // 如果还在创建中,继续检查\n setTimeout(checkStatus, 300);\n }\n };\n setTimeout(checkStatus, 300);\n },\n // 主题相关方法\n applyTheme() {\n if (!this.mindMap || !this.selectedTheme) return;\n if (this.isMultiRoot && this.selectedRootIndex !== null) {\n // 多根模式:设置特定根节点的主题\n this.mindMap.setRootTheme(this.selectedRootIndex, this.selectedTheme);\n this.addLog(`设置根节点 ${this.selectedRootIndex + 1} 主题为: ${this.selectedTheme}`);\n } else if (!this.isMultiRoot) {\n // 单根模式:设置整体主题\n this.mindMap.setTheme(this.selectedTheme);\n this.addLog(`设置主题为: ${this.selectedTheme}`);\n }\n this.updateBasicInfo();\n },\n resetTheme() {\n if (!this.mindMap) return;\n if (this.isMultiRoot && this.selectedRootIndex !== null) {\n // 多根模式:重置特定根节点的主题\n this.mindMap.setRootTheme(this.selectedRootIndex, 'default');\n this.addLog(`重置根节点 ${this.selectedRootIndex + 1} 主题为默认`);\n } else if (!this.isMultiRoot) {\n // 单根模式:重置整体主题\n this.mindMap.setTheme('default');\n this.addLog(`重置主题为默认`);\n }\n this.selectedTheme = 'default';\n this.updateBasicInfo();\n },\n // 布局相关方法\n applyLayout() {\n if (!this.mindMap || !this.selectedLayout) return;\n if (this.isMultiRoot && this.selectedLayoutRootIndex !== null) {\n // 多根模式:设置特定根节点的布局\n this.mindMap.setRootLayout(this.selectedLayoutRootIndex, this.selectedLayout);\n this.addLog(`设置根节点 ${this.selectedLayoutRootIndex + 1} 布局为: ${this.selectedLayout}`);\n } else if (!this.isMultiRoot) {\n // 单根模式:设置整体布局\n this.mindMap.setLayout(this.selectedLayout);\n this.addLog(`设置布局为: ${this.selectedLayout}`);\n }\n this.updateBasicInfo();\n },\n resetLayout() {\n if (!this.mindMap) return;\n const defaultLayout = 'logicalStructure';\n if (this.isMultiRoot && this.selectedLayoutRootIndex !== null) {\n // 多根模式:重置特定根节点的布局\n this.mindMap.setRootLayout(this.selectedLayoutRootIndex, defaultLayout);\n this.addLog(`重置根节点 ${this.selectedLayoutRootIndex + 1} 布局为默认`);\n } else if (!this.isMultiRoot) {\n // 单根模式:重置整体布局\n this.mindMap.setLayout(defaultLayout);\n this.addLog(`重置布局为默认`);\n }\n this.selectedLayout = defaultLayout;\n this.updateBasicInfo();\n },\n testPerRootThemes() {\n if (!this.mindMap) return;\n\n // 创建带不同主题的多根数据\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: 'A',\n layout: 'logicalStructure',\n theme: 'classic'\n },\n children: [{\n data: {\n text: 'A1'\n }\n }, {\n data: {\n text: 'A2'\n }\n }]\n }, {\n data: {\n text: 'B',\n layout: 'mindMap',\n theme: 'dark'\n },\n children: [{\n data: {\n text: 'B1'\n }\n }, {\n data: {\n text: 'B2'\n }\n }]\n }, {\n data: {\n text: 'C',\n theme: 'freshGreen'\n },\n children: [{\n data: {\n text: 'C1'\n }\n }, {\n data: {\n text: 'C2'\n }\n }]\n }, {\n data: {\n text: 'D',\n theme: 'freshBlue'\n },\n children: [{\n data: {\n text: 'D1'\n }\n }, {\n data: {\n text: 'D2'\n }\n }]\n }]\n };\n this.mindMap.setData(testData);\n this.addLog('加载多主题测试数据');\n this.$message.success('已加载不同主题的多根节点!');\n },\n // 创建流程图节点\n createFlowChartNode(nodeType) {\n if (!this.mindMap) return;\n\n // 导入 FlowChartBehavior\n const FlowChartBehavior = __webpack_require__(/*! @/../../simple-mind-map/src/core/render/node/flowchart/FlowChartBehavior.js */ \"../simple-mind-map/src/core/render/node/flowchart/FlowChartBehavior.js\").default;\n const {\n FLOWCHART_NODE_TYPES,\n FLOWCHART_NODE_STYLES\n } = __webpack_require__(/*! @/../../simple-mind-map/src/constants/flowchart.js */ \"../simple-mind-map/src/constants/flowchart.js\");\n\n // 获取节点样式\n const nodeStyle = FLOWCHART_NODE_STYLES[nodeType] || FLOWCHART_NODE_STYLES[FLOWCHART_NODE_TYPES.PROCESS];\n\n // 计算新节点位置\n const roots = this.mindMap.getRootNodes();\n const baseX = 200;\n const baseY = 100;\n const offsetX = roots.length * 200;\n\n // 创建流程图节点数据\n const nodeData = {\n data: {\n text: this.getNodeTypeText(nodeType),\n isFlowChart: true,\n customLeft: baseX + offsetX,\n customTop: baseY + Math.random() * 200,\n flowchart: {\n nodeType: nodeType,\n showConnectors: true,\n connectorPositions: ['top', 'right', 'bottom', 'left'],\n preventOverlap: true,\n hideExpandBtn: true,\n hideAddBtn: true\n },\n ...nodeStyle\n },\n children: []\n };\n\n // 添加为新的根节点\n this.mindMap.addRootNode(nodeData);\n this.addLog(`创建${this.getNodeTypeText(nodeType)}节点`);\n this.$message.success(`已创建${this.getNodeTypeText(nodeType)}!`);\n },\n // 获取节点类型文本\n getNodeTypeText(nodeType) {\n const typeTexts = {\n process: '流程',\n decision: '决策',\n start: '开始',\n end: '结束',\n subprocess: '子流程',\n data: '数据',\n document: '文档',\n database: '数据库',\n preparation: '准备'\n };\n return typeTexts[nodeType] || '流程';\n },\n // 转换为流程图节点\n convertToFlowChart() {\n if (!this.mindMap) return;\n const activeNode = this.mindMap.renderer.activeNodeList[0];\n if (!activeNode) {\n this.$message.warning('请先选择一个节点');\n return;\n }\n\n // 使用新的API进行转换\n this.mindMap.convertNodeToFlowChart(activeNode, 'process');\n this.addLog('节点转换为流程图节点');\n this.$message.success('已转换为流程图节点');\n },\n // 转换为普通节点\n convertToNormal() {\n if (!this.mindMap) return;\n const activeNode = this.mindMap.renderer.activeNodeList[0];\n if (!activeNode) {\n this.$message.warning('请先选择一个节点');\n return;\n }\n\n // 只有流程图节点才能转换为普通节点\n if (!activeNode.nodeData.data.isFlowChart) {\n this.$message.warning('只有流程图节点才能转换为普通节点');\n return;\n }\n\n // 使用新的API进行转换\n this.mindMap.convertNodeToNormal(activeNode);\n this.addLog('转换为普通节点');\n this.$message.success('已转换为普通节点');\n },\n // 测试混合模式\n testFlowChartMode() {\n if (!this.mindMap) return;\n\n // 创建混合模式测试数据\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: '项目规划',\n layout: 'mindMap'\n },\n children: [{\n data: {\n text: '需求分析'\n }\n }, {\n data: {\n text: '技术选型'\n }\n }, {\n data: {\n text: '时间规划'\n }\n }]\n }, {\n data: {\n text: '开始',\n isFlowChart: true,\n customLeft: 400,\n customTop: 50,\n flowchart: {\n nodeType: 'start',\n showConnectors: true,\n connectorPositions: ['bottom']\n },\n shape: 'circle',\n backgroundColor: '#e8f5e9',\n borderColor: '#1b5e20'\n },\n children: []\n }, {\n data: {\n text: '需求评审',\n isFlowChart: true,\n customLeft: 400,\n customTop: 150,\n flowchart: {\n nodeType: 'process',\n showConnectors: true,\n connectorPositions: ['top', 'bottom']\n },\n shape: 'rectangle',\n backgroundColor: '#e1f5fe',\n borderColor: '#01579b'\n },\n children: []\n }, {\n data: {\n text: '是否通过',\n isFlowChart: true,\n customLeft: 400,\n customTop: 250,\n flowchart: {\n nodeType: 'decision',\n showConnectors: true,\n connectorPositions: ['top', 'right', 'bottom', 'left']\n },\n shape: 'diamond',\n backgroundColor: '#fff3e0',\n borderColor: '#e65100'\n },\n children: []\n }]\n };\n this.mindMap.setData(testData);\n this.addLog('加载混合模式测试数据');\n this.$message.success('已加载流程图混合模式测试数据!');\n },\n // 测试正交连线\n testOrthogonalLines() {\n if (!this.mindMap) return;\n\n // 创建多个流程图节点用于测试正交连线\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: '开始',\n isFlowChart: true,\n flowchart: {\n nodeType: 'start'\n },\n customLeft: 100,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '处理数据',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 300,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '判断条件',\n isFlowChart: true,\n flowchart: {\n nodeType: 'decision'\n },\n customLeft: 500,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '分支处理1',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 700,\n customTop: 100\n },\n children: []\n }, {\n data: {\n text: '分支处理2',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 700,\n customTop: 300\n },\n children: []\n }, {\n data: {\n text: '结束',\n isFlowChart: true,\n flowchart: {\n nodeType: 'end'\n },\n customLeft: 900,\n customTop: 200\n },\n children: []\n }]\n };\n this.mindMap.setData(testData);\n\n // 自动创建一些关联线来展示正交路径\n setTimeout(() => {\n // 获取所有根节点\n let roots = [];\n if (this.mindMap.renderer.renderTree) {\n if (Array.isArray(this.mindMap.renderer.renderTree)) {\n // 多根模式\n roots = this.mindMap.renderer.renderTree.map(root => root._node).filter(node => node);\n } else if (this.mindMap.renderer.root) {\n // 单根模式\n roots = [this.mindMap.renderer.root];\n }\n }\n if (roots.length >= 6) {\n // 开始 -> 处理数据\n this.mindMap.associativeLine.addLine(roots[0], roots[1]);\n // 处理数据 -> 判断条件\n this.mindMap.associativeLine.addLine(roots[1], roots[2]);\n // 判断条件 -> 分支处理1\n this.mindMap.associativeLine.addLine(roots[2], roots[3]);\n // 判断条件 -> 分支处理2\n this.mindMap.associativeLine.addLine(roots[2], roots[4]);\n // 分支处理1 -> 结束\n this.mindMap.associativeLine.addLine(roots[3], roots[5]);\n // 分支处理2 -> 结束\n this.mindMap.associativeLine.addLine(roots[4], roots[5]);\n this.addLog('创建正交连线测试数据');\n this.$message.success('已创建正交连线测试!注意观察连线是90度转角的正交路径');\n }\n }, 500);\n },\n // 测试径向布局\n testRadialLayout() {\n if (!this.mindMap) return;\n\n // 创建适合径向布局的测试数据,包含很多节点\n const testData = {\n data: {\n text: '知识图谱',\n layout: 'radial'\n },\n children: [{\n data: {\n text: '前端技术'\n },\n children: [{\n data: {\n text: 'JavaScript'\n },\n children: [{\n data: {\n text: 'ES6+'\n }\n }, {\n data: {\n text: 'TypeScript'\n }\n }, {\n data: {\n text: 'Node.js'\n }\n }, {\n data: {\n text: 'Deno'\n }\n }]\n }, {\n data: {\n text: 'CSS'\n },\n children: [{\n data: {\n text: 'Flexbox'\n }\n }, {\n data: {\n text: 'Grid'\n }\n }, {\n data: {\n text: 'Animation'\n }\n }]\n }, {\n data: {\n text: 'HTML5'\n }\n }, {\n data: {\n text: 'WebAssembly'\n }\n }]\n }, {\n data: {\n text: '框架'\n },\n children: [{\n data: {\n text: 'Vue'\n }\n }, {\n data: {\n text: 'React'\n }\n }, {\n data: {\n text: 'Angular'\n }\n }, {\n data: {\n text: 'Svelte'\n }\n }, {\n data: {\n text: 'Solid'\n }\n }]\n }, {\n data: {\n text: '工具链'\n },\n children: [{\n data: {\n text: 'Webpack'\n }\n }, {\n data: {\n text: 'Vite'\n }\n }, {\n data: {\n text: 'Rollup'\n }\n }, {\n data: {\n text: 'Parcel'\n }\n }, {\n data: {\n text: 'ESBuild'\n }\n }, {\n data: {\n text: 'SWC'\n }\n }]\n }, {\n data: {\n text: '后端技术'\n },\n children: [{\n data: {\n text: 'Python'\n }\n }, {\n data: {\n text: 'Java'\n }\n }, {\n data: {\n text: 'Go'\n }\n }, {\n data: {\n text: 'Rust'\n }\n }, {\n data: {\n text: 'C++'\n }\n }]\n }, {\n data: {\n text: '数据库'\n },\n children: [{\n data: {\n text: 'MySQL'\n }\n }, {\n data: {\n text: 'PostgreSQL'\n }\n }, {\n data: {\n text: 'MongoDB'\n }\n }, {\n data: {\n text: 'Redis'\n }\n }, {\n data: {\n text: 'Elasticsearch'\n }\n }]\n }, {\n data: {\n text: '云服务'\n },\n children: [{\n data: {\n text: 'AWS'\n }\n }, {\n data: {\n text: 'Azure'\n }\n }, {\n data: {\n text: 'Google Cloud'\n }\n }, {\n data: {\n text: '阿里云'\n }\n }, {\n data: {\n text: '腾讯云'\n }\n }]\n }, {\n data: {\n text: 'DevOps'\n },\n children: [{\n data: {\n text: 'Docker'\n }\n }, {\n data: {\n text: 'Kubernetes'\n }\n }, {\n data: {\n text: 'CI/CD'\n }\n }, {\n data: {\n text: 'Jenkins'\n }\n }]\n }, {\n data: {\n text: 'AI/ML'\n },\n children: [{\n data: {\n text: 'TensorFlow'\n }\n }, {\n data: {\n text: 'PyTorch'\n }\n }, {\n data: {\n text: 'Scikit-learn'\n }\n }, {\n data: {\n text: 'Keras'\n }\n }]\n }]\n };\n\n // 设置为径向布局\n this.mindMap.setLayout('radial');\n this.mindMap.setData(testData);\n this.addLog('加载径向布局测试数据(多节点)');\n this.$message.success('已切换到径向布局模式!注意观察自动调整的半径');\n },\n // 测试径向布局的不同策略\n testRadialLayoutStrategies() {\n if (!this.mindMap) return;\n\n // 弹出选择对话框\n this.$confirm('选择要测试的径向布局策略', '径向布局策略测试', {\n distinguishCancelAndClose: true,\n confirmButtonText: '固定增量',\n cancelButtonText: '指数增长',\n closeButtonText: '加权分配',\n type: 'info'\n }).then(() => {\n // 固定增量策略\n this.mindMap.opt.radialLayoutConfig = {\n startRadius: 150,\n radiusIncrement: 100,\n radiusGrowthStrategy: 'fixed',\n angleDistribution: 'uniform'\n };\n this.testRadialLayout();\n this.addLog('使用固定增量策略');\n this.$message.success('已切换到固定增量策略');\n }).catch(action => {\n if (action === 'cancel') {\n // 指数增长策略\n this.mindMap.opt.radialLayoutConfig = {\n startRadius: 100,\n radiusGrowthStrategy: 'exponential',\n exponentialGrowthFactor: 1.6,\n angleDistribution: 'uniform'\n };\n this.testRadialLayout();\n this.addLog('使用指数增长策略');\n this.$message.success('已切换到指数增长策略');\n } else if (action === 'close') {\n // 加权分配策略\n this.mindMap.opt.radialLayoutConfig = {\n startRadius: 120,\n radiusIncrement: 150,\n radiusGrowthStrategy: 'auto',\n angleDistribution: 'weighted',\n autoAdjustRadius: true\n };\n this.testRadialLayout();\n this.addLog('使用加权分配策略');\n this.$message.success('已切换到加权分配策略(根据子树大小分配角度)');\n }\n });\n },\n resetAll() {\n this.operationLogs = [];\n this.selectedRootIndex = null;\n this.selectedTheme = '';\n this.selectedLayoutRootIndex = null;\n this.selectedLayout = '';\n this.addLog('重置所有状态');\n this.initMindMap();\n },\n // 大括号连接线测试方法\n testBraceLineStyle() {\n if (!this.mindMap) return;\n\n // 创建适合展示大括号连接线的测试数据(单根模式)\n const testData = {\n data: {\n text: 'A'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }, {\n data: {\n text: 'A1-3'\n }\n }]\n }, {\n data: {\n text: 'A2'\n },\n children: [{\n data: {\n text: 'A2-1'\n }\n }, {\n data: {\n text: 'A2-2'\n }\n }]\n }, {\n data: {\n text: 'A3'\n },\n children: [{\n data: {\n text: 'A3-1'\n }\n }, {\n data: {\n text: 'A3-2'\n }\n }, {\n data: {\n text: 'A3-3'\n }\n }, {\n data: {\n text: 'A3-4'\n }\n }]\n }]\n };\n\n // 设置布局\n this.mindMap.setLayout(this.lineTestLayout);\n // 设置连线样式为大括号\n this.mindMap.setThemeConfig({\n lineStyle: 'brace',\n braceCurveSize: this.braceCurveSize\n });\n // 设置数据(单根模式)\n this.mindMap.setData(testData);\n this.addLog(`加载大括号连接线测试数据,布局: ${this.lineTestLayout}`);\n this.$message.success('已切换到大括号连接线样式!');\n },\n changeLineTestLayout(layout) {\n if (!this.mindMap) return;\n this.mindMap.setLayout(layout);\n this.addLog(`切换布局为: ${layout}`);\n },\n setLineStyle(style) {\n if (!this.mindMap) return;\n this.mindMap.setThemeConfig({\n lineStyle: style\n });\n this.mindMap.render();\n this.addLog(`切换连线样式为: ${style}`);\n this.$message.success(`已切换到${style}连线样式`);\n },\n updateBraceCurveSize() {\n if (!this.mindMap) return;\n const currentStyle = this.mindMap.themeConfig.lineStyle;\n if (currentStyle === 'brace') {\n this.mindMap.setThemeConfig({\n braceCurveSize: this.braceCurveSize\n });\n this.mindMap.render();\n this.addLog(`更新大括号曲线弧度为: ${this.braceCurveSize}px`);\n }\n },\n // 主题预览图生成相关方法\n showThemeGeneratorDialog() {\n this.themeGeneratorDialogVisible = true;\n const themes = [..._simple_mind_map_plugin_themes_themeList__WEBPACK_IMPORTED_MODULE_27__[\"default\"]];\n\n // 在列表开头添加default主题项\n const defaultThemeItem = {\n name: 'Default Theme',\n value: 'default',\n dark: false,\n isBuiltin: true // 标记为内置主题\n };\n\n // 检查列表中是否已经有default主题,避免重复\n const hasDefault = themes.some(t => t.value === 'default');\n if (!hasDefault) {\n themes.unshift(defaultThemeItem);\n }\n this.allThemes = themes;\n this.generatedSVGs = [];\n this.generatedCount = 0;\n this.currentThemeName = '';\n this.isGenerating = false;\n // 重置质量设置为默认值\n this.webpQuality = 0.8;\n this.jpgQuality = 0.85;\n },\n // 设置质量预设\n setQualityPreset(preset) {\n switch (preset) {\n case 'high':\n this.webpQuality = 0.95;\n this.jpgQuality = 0.95;\n this.$message.success('已设置为高质量模式(文件较大,质量最佳)');\n break;\n case 'medium':\n this.webpQuality = 0.8;\n this.jpgQuality = 0.85;\n this.$message.success('已设置为平衡模式(质量和大小平衡)');\n break;\n case 'low':\n this.webpQuality = 0.6;\n this.jpgQuality = 0.7;\n this.$message.success('已设置为小文件模式(文件更小,质量尚可)');\n break;\n case 'tiny':\n this.webpQuality = 0.3;\n this.jpgQuality = 0.5;\n this.$message.warning('已设置为极限压缩模式(文件最小,质量较低)');\n break;\n }\n },\n async startGenerating() {\n if (this.isGenerating) return;\n this.isGenerating = true;\n this.generatedSVGs = [];\n this.generatedCount = 0;\n\n // 创建隐藏的容器用于生成预览\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.left = '-9999px';\n container.style.width = '800px';\n container.style.height = '600px';\n document.body.appendChild(container);\n\n // 预览数据 - 使用英文避免乱码\n const previewData = {\n data: {\n text: 'KMIND'\n },\n children: [{\n data: {\n text: 'Subtopic',\n generalization: {\n text: 'Summary'\n }\n },\n children: [{\n data: {\n text: 'Add Content'\n },\n children: []\n }, {\n data: {\n text: 'Add Content'\n },\n children: []\n }]\n }, {\n data: {\n text: 'Subtopic'\n },\n children: [{\n data: {\n text: 'Add Content'\n },\n children: []\n }, {\n data: {\n text: 'Add Content'\n },\n children: []\n }]\n }]\n };\n try {\n // 创建临时的MindMap实例\n const tempMindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: container,\n data: previewData,\n theme: 'default',\n layout: 'logicalStructure',\n readonly: true,\n isShowCreateChildBtnIcon: false,\n mousewheelAction: 'zoom'\n });\n\n // 批量生成每个主题的SVG\n for (let i = 0; i < this.allThemes.length; i++) {\n const theme = this.allThemes[i];\n this.currentThemeName = theme.name;\n\n // 判断是否为default主题,需要特殊处理\n const isDefaultTheme = theme.value === 'default';\n\n // 设置主题\n tempMindMap.setTheme(theme.value);\n\n // 等待渲染完成\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // 导出所有格式\n try {\n // 先导出SVG\n const svgDataUrl = await tempMindMap.export('svg', false, 'preview');\n\n // 从data URL提取SVG内容\n let svgContent = '';\n if (svgDataUrl.startsWith('data:image/svg+xml;base64,')) {\n const base64 = svgDataUrl.replace('data:image/svg+xml;base64,', '');\n svgContent = atob(base64);\n } else if (svgDataUrl.startsWith('data:image/svg+xml;charset=utf-8,')) {\n // 处理带charset的情况\n svgContent = decodeURIComponent(svgDataUrl.replace('data:image/svg+xml;charset=utf-8,', ''));\n } else if (svgDataUrl.startsWith('data:image/svg+xml,')) {\n svgContent = decodeURIComponent(svgDataUrl.replace('data:image/svg+xml,', ''));\n }\n\n // 优化SVG,确保正确编码\n const parser = new DOMParser();\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\n const svgElement = svgDoc.documentElement;\n\n // 添加必要的属性确保正确渲染\n svgElement.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n svgElement.setAttribute('width', '400');\n svgElement.setAttribute('height', '300');\n svgElement.setAttribute('viewBox', '0 0 800 600');\n const serializer = new XMLSerializer();\n const optimizedSvg = serializer.serializeToString(svgElement);\n\n // 计算SVG大小\n const svgSize = new Blob([optimizedSvg]).size;\n\n // 导出PNG\n let pngDataUrl = null;\n let pngSize = 0;\n try {\n pngDataUrl = await tempMindMap.export('png', false, 'preview');\n // 计算PNG大小\n if (pngDataUrl) {\n const pngData = atob(pngDataUrl.split(',')[1]);\n pngSize = pngData.length;\n }\n } catch (pngError) {\n console.warn(`生成PNG失败: ${theme.name}`, pngError);\n }\n\n // 导出WebP和JPG(通过Canvas)\n let webpDataUrl = null;\n let webpSize = 0;\n let jpgDataUrl = null;\n let jpgSize = 0;\n try {\n // 创建临时canvas来转换格式\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n // 从PNG创建图像\n if (pngDataUrl) {\n const img = new Image();\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = pngDataUrl;\n });\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n\n // 生成WebP(使用可调节的质量)\n webpDataUrl = canvas.toDataURL('image/webp', this.webpQuality);\n if (webpDataUrl && webpDataUrl.startsWith('data:image/webp')) {\n const webpData = atob(webpDataUrl.split(',')[1]);\n webpSize = webpData.length;\n } else {\n // 浏览器不支持WebP\n webpDataUrl = null;\n }\n\n // 生成JPG(使用可调节的质量,白色背景)\n // 先填充白色背景(JPG不支持透明)\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0);\n jpgDataUrl = canvas.toDataURL('image/jpeg', this.jpgQuality);\n const jpgData = atob(jpgDataUrl.split(',')[1]);\n jpgSize = jpgData.length;\n }\n } catch (error) {\n console.warn(`生成WebP/JPG失败: ${theme.name}`, error);\n }\n this.generatedSVGs.push({\n name: theme.name,\n value: theme.value,\n dark: theme.dark || false,\n isDefault: isDefaultTheme,\n // 标记是否为default主题\n svgContent: optimizedSvg,\n svgSize: svgSize,\n pngDataUrl: pngDataUrl,\n pngSize: pngSize,\n webpDataUrl: webpDataUrl,\n webpSize: webpSize,\n jpgDataUrl: jpgDataUrl,\n jpgSize: jpgSize\n });\n this.generatedCount++;\n } catch (error) {\n console.error(`生成主题 ${theme.name} 失败:`, error);\n this.$message.error(`生成主题 ${theme.name} 失败`);\n }\n\n // 避免阻塞UI\n if (i % 5 === 0) {\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n }\n\n // 清理\n tempMindMap.destroy();\n document.body.removeChild(container);\n this.$message.success(`成功生成 ${this.generatedCount} 个主题预览图`);\n } catch (error) {\n console.error('批量生成失败:', error);\n this.$message.error('批量生成失败: ' + error.message);\n } finally {\n this.isGenerating = false;\n this.currentThemeName = '';\n }\n },\n downloadSingleSVG(theme) {\n const blob = new Blob([theme.svgContent], {\n type: 'image/svg+xml;charset=utf-8'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${theme.value}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n },\n downloadSinglePNG(theme) {\n if (!theme.pngDataUrl) return;\n const a = document.createElement('a');\n a.href = theme.pngDataUrl;\n a.download = `${theme.value}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n },\n downloadAllSVGs() {\n if (this.generatedSVGs.length === 0) return;\n\n // 逐个下载所有SVG\n this.generatedSVGs.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSingleSVG(theme);\n }, index * 200); // 间隔200ms避免浏览器阻止\n });\n this.$message.success(`开始下载 ${this.generatedSVGs.length} 个SVG文件`);\n },\n downloadAllPNGs() {\n const pngThemes = this.generatedSVGs.filter(t => t.pngDataUrl);\n if (pngThemes.length === 0) return;\n\n // 逐个下载所有PNG\n pngThemes.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSinglePNG(theme);\n }, index * 200); // 间隔200ms避免浏览器阻止\n });\n this.$message.success(`开始下载 ${pngThemes.length} 个PNG文件`);\n },\n clearGenerated() {\n this.generatedSVGs = [];\n this.generatedCount = 0;\n this.$message.success('已清空生成的预览图');\n },\n removeGenerated(index) {\n this.generatedSVGs.splice(index, 1);\n this.generatedCount = this.generatedSVGs.length;\n },\n // 格式化文件大小\n formatFileSize(bytes) {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n },\n // 下载WebP格式\n downloadSingleWebP(theme) {\n if (!theme.webpDataUrl) return;\n const a = document.createElement('a');\n a.href = theme.webpDataUrl;\n a.download = `${theme.value}.webp`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n },\n // 下载JPG格式\n downloadSingleJPG(theme) {\n if (!theme.jpgDataUrl) return;\n const a = document.createElement('a');\n a.href = theme.jpgDataUrl;\n a.download = `${theme.value}.jpg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n },\n // 批量下载WebP\n downloadAllWebPs() {\n const webpThemes = this.generatedSVGs.filter(t => t.webpDataUrl);\n if (webpThemes.length === 0) return;\n webpThemes.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSingleWebP(theme);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${webpThemes.length} 个WebP文件`);\n },\n // 批量下载JPG\n downloadAllJPGs() {\n const jpgThemes = this.generatedSVGs.filter(t => t.jpgDataUrl);\n if (jpgThemes.length === 0) return;\n jpgThemes.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSingleJPG(theme);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${jpgThemes.length} 个JPG文件`);\n },\n // 布局预览图生成相关方法\n showLayoutGeneratorDialog() {\n this.layoutGeneratorDialogVisible = true;\n // 初始化布局列表\n this.allLayouts = this.availableLayouts.map(layout => ({\n ...layout,\n svgData: null,\n svgSize: null,\n pngData: null,\n pngSize: null,\n webpData: null,\n webpSize: null,\n jpgData: null,\n jpgSize: null\n }));\n this.generatedLayoutSVGs = [];\n this.generatedLayoutCount = 0;\n },\n async generateAllLayoutPreviews() {\n if (this.isGeneratingLayouts) return;\n this.isGeneratingLayouts = true;\n this.generatedLayoutCount = 0;\n this.generatedLayoutSVGs = [];\n try {\n // 创建临时容器\n const container = document.createElement('div');\n container.style.position = 'absolute';\n container.style.left = '-9999px';\n container.style.width = '800px';\n container.style.height = '600px';\n document.body.appendChild(container);\n\n // 预览数据 - 使用英文避免编码问题\n const previewData = {\n data: {\n text: 'KMind'\n },\n children: [{\n data: {\n text: 'Subtopic 1'\n },\n children: [{\n data: {\n text: 'Detail 1-1'\n }\n }, {\n data: {\n text: 'Detail 1-2'\n }\n }]\n }, {\n data: {\n text: 'Subtopic 2'\n },\n children: [{\n data: {\n text: 'Detail 2-1'\n }\n }, {\n data: {\n text: 'Detail 2-2'\n }\n }]\n }, {\n data: {\n text: 'Subtopic 3'\n },\n children: [{\n data: {\n text: 'Detail 3-1'\n }\n }, {\n data: {\n text: 'Detail 3-2'\n }\n }]\n }]\n };\n for (let i = 0; i < this.allLayouts.length; i++) {\n const layout = this.allLayouts[i];\n this.currentLayoutName = layout.name;\n try {\n // 创建新的MindMap实例\n const tempMindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: container,\n data: previewData,\n layout: layout.value,\n theme: 'default'\n });\n\n // 等待渲染完成\n await new Promise(resolve => setTimeout(resolve, 200));\n\n // 导出SVG\n const svgData = await tempMindMap.export('svg', false, 'default');\n\n // 计算SVG大小\n const svgBlob = new Blob([svgData], {\n type: 'image/svg+xml'\n });\n const svgSize = svgBlob.size;\n const svgDataUrl = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgData)))}`;\n\n // 导出PNG - 第二个参数设为false避免自动下载\n const pngDataUrl = await tempMindMap.export('png', false, 'default');\n const pngData = atob(pngDataUrl.split(',')[1]);\n const pngSize = pngData.length;\n\n // 生成WebP和JPG\n let webpDataUrl = null;\n let webpSize = 0;\n let jpgDataUrl = null;\n let jpgSize = 0;\n try {\n // 创建图片对象\n const img = new Image();\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = pngDataUrl;\n });\n\n // 创建canvas\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0);\n\n // 导出WebP\n if (canvas.toDataURL('image/webp').indexOf('image/webp') > -1) {\n webpDataUrl = canvas.toDataURL('image/webp', this.layoutWebpQuality);\n const webpData = atob(webpDataUrl.split(',')[1]);\n webpSize = webpData.length;\n }\n\n // 导出JPG\n jpgDataUrl = canvas.toDataURL('image/jpeg', this.layoutJpgQuality);\n const jpgData = atob(jpgDataUrl.split(',')[1]);\n jpgSize = jpgData.length;\n } catch (error) {\n console.warn(`生成WebP/JPG失败: ${layout.name}`, error);\n }\n\n // 更新布局数据\n this.$set(layout, 'svgData', svgDataUrl);\n this.$set(layout, 'svgSize', this.formatFileSize(svgSize));\n this.$set(layout, 'pngData', pngDataUrl);\n this.$set(layout, 'pngSize', this.formatFileSize(pngSize));\n this.$set(layout, 'webpData', webpDataUrl);\n this.$set(layout, 'webpSize', this.formatFileSize(webpSize));\n this.$set(layout, 'jpgData', jpgDataUrl);\n this.$set(layout, 'jpgSize', this.formatFileSize(jpgSize));\n\n // 添加到已生成列表\n this.generatedLayoutSVGs.push({\n ...layout,\n svgContent: svgData,\n svgDataUrl,\n pngDataUrl,\n webpDataUrl,\n jpgDataUrl\n });\n this.generatedLayoutCount++;\n\n // 清理\n tempMindMap.destroy();\n } catch (error) {\n console.error(`生成布局 ${layout.name} 失败:`, error);\n this.$message.error(`生成布局 ${layout.name} 失败`);\n }\n\n // 避免阻塞UI\n if (i % 3 === 0) {\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n }\n\n // 清理容器\n document.body.removeChild(container);\n this.$message.success(`成功生成 ${this.generatedLayoutCount} 个布局预览图`);\n } catch (error) {\n console.error('批量生成布局失败:', error);\n this.$message.error('批量生成失败: ' + error.message);\n } finally {\n this.isGeneratingLayouts = false;\n this.currentLayoutName = '';\n }\n },\n async generateLayoutPreview(layout) {\n if (this.isGeneratingLayouts) return;\n this.isGeneratingLayouts = true;\n this.currentLayoutName = layout.name;\n try {\n // 创建临时容器\n const container = document.createElement('div');\n container.style.position = 'absolute';\n container.style.left = '-9999px';\n container.style.width = '800px';\n container.style.height = '600px';\n document.body.appendChild(container);\n\n // 预览数据\n const previewData = {\n data: {\n text: 'Main Topic'\n },\n children: [{\n data: {\n text: 'Subtopic 1'\n },\n children: [{\n data: {\n text: 'Detail 1-1'\n }\n }, {\n data: {\n text: 'Detail 1-2'\n }\n }]\n }, {\n data: {\n text: 'Subtopic 2'\n },\n children: [{\n data: {\n text: 'Detail 2-1'\n }\n }, {\n data: {\n text: 'Detail 2-2'\n }\n }]\n }]\n };\n\n // 创建MindMap实例\n const tempMindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: container,\n data: previewData,\n layout: layout.value,\n theme: 'default'\n });\n\n // 等待渲染\n await new Promise(resolve => setTimeout(resolve, 200));\n\n // 导出各种格式\n const svgData = await tempMindMap.export('svg', false, 'default');\n const svgBlob = new Blob([svgData], {\n type: 'image/svg+xml'\n });\n const svgSize = svgBlob.size;\n const svgDataUrl = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgData)))}`;\n\n // 导出PNG - 第二个参数设为false避免自动下载\n const pngDataUrl = await tempMindMap.export('png', false, 'default');\n const pngData = atob(pngDataUrl.split(',')[1]);\n const pngSize = pngData.length;\n\n // 生成WebP和JPG\n let webpDataUrl = null;\n let webpSize = 0;\n let jpgDataUrl = null;\n let jpgSize = 0;\n try {\n const img = new Image();\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = pngDataUrl;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0);\n if (canvas.toDataURL('image/webp').indexOf('image/webp') > -1) {\n webpDataUrl = canvas.toDataURL('image/webp', this.layoutWebpQuality);\n const webpData = atob(webpDataUrl.split(',')[1]);\n webpSize = webpData.length;\n }\n jpgDataUrl = canvas.toDataURL('image/jpeg', this.layoutJpgQuality);\n const jpgData = atob(jpgDataUrl.split(',')[1]);\n jpgSize = jpgData.length;\n } catch (error) {\n console.warn('生成WebP/JPG失败:', error);\n }\n\n // 更新数据\n this.$set(layout, 'svgData', svgDataUrl);\n this.$set(layout, 'svgSize', this.formatFileSize(svgSize));\n this.$set(layout, 'pngData', pngDataUrl);\n this.$set(layout, 'pngSize', this.formatFileSize(pngSize));\n this.$set(layout, 'webpData', webpDataUrl);\n this.$set(layout, 'webpSize', this.formatFileSize(webpSize));\n this.$set(layout, 'jpgData', jpgDataUrl);\n this.$set(layout, 'jpgSize', this.formatFileSize(jpgSize));\n\n // 清理\n tempMindMap.destroy();\n document.body.removeChild(container);\n this.$message.success(`成功生成布局 ${layout.name} 的预览图`);\n } catch (error) {\n console.error('生成布局预览失败:', error);\n this.$message.error('生成失败: ' + error.message);\n } finally {\n this.isGeneratingLayouts = false;\n this.currentLayoutName = '';\n }\n },\n downloadLayoutPreview(layout) {\n if (!layout.svgData) return;\n const formats = [];\n if (layout.svgData) {\n const a = document.createElement('a');\n a.href = layout.svgData;\n a.download = `${layout.value}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n formats.push('SVG');\n }\n if (layout.pngData) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.pngData;\n a.download = `${layout.value}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 200);\n formats.push('PNG');\n }\n if (layout.webpData) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.webpData;\n a.download = `${layout.value}.webp`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 400);\n formats.push('WebP');\n }\n if (layout.jpgData) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.jpgData;\n a.download = `${layout.value}.jpg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 600);\n formats.push('JPG');\n }\n this.$message.success(`开始下载 ${layout.name} 的${formats.join('、')}格式`);\n },\n downloadAllLayoutSVGs() {\n if (this.generatedLayoutSVGs.length === 0) return;\n this.generatedLayoutSVGs.forEach((layout, index) => {\n if (layout.svgDataUrl) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.svgDataUrl;\n a.download = `${layout.value}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n }\n });\n this.$message.success(`开始下载 ${this.generatedLayoutSVGs.length} 个SVG文件`);\n },\n downloadAllLayoutPNGs() {\n const pngLayouts = this.generatedLayoutSVGs.filter(l => l.pngDataUrl);\n if (pngLayouts.length === 0) return;\n pngLayouts.forEach((layout, index) => {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.pngDataUrl;\n a.download = `${layout.value}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${pngLayouts.length} 个PNG文件`);\n },\n downloadAllLayoutWebPs() {\n const webpLayouts = this.generatedLayoutSVGs.filter(l => l.webpDataUrl);\n if (webpLayouts.length === 0) return;\n webpLayouts.forEach((layout, index) => {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.webpDataUrl;\n a.download = `${layout.value}.webp`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${webpLayouts.length} 个WebP文件`);\n },\n downloadAllLayoutJPGs() {\n const jpgLayouts = this.generatedLayoutSVGs.filter(l => l.jpgDataUrl);\n if (jpgLayouts.length === 0) return;\n jpgLayouts.forEach((layout, index) => {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.jpgDataUrl;\n a.download = `${layout.value}.jpg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${jpgLayouts.length} 个JPG文件`);\n },\n clearGeneratedLayouts() {\n this.allLayouts.forEach(layout => {\n this.$set(layout, 'svgData', null);\n this.$set(layout, 'svgSize', null);\n this.$set(layout, 'pngData', null);\n this.$set(layout, 'pngSize', null);\n this.$set(layout, 'webpData', null);\n this.$set(layout, 'webpSize', null);\n this.$set(layout, 'jpgData', null);\n this.$set(layout, 'jpgSize', null);\n });\n this.generatedLayoutSVGs = [];\n this.generatedLayoutCount = 0;\n this.$message.success('已清空生成的布局预览图');\n },\n // 测试吸附和拖拽创建\n testSnapAndDrag() {\n if (!this.mindMap) return;\n\n // 创建几个流程图节点用于测试\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: '拖拽起点',\n isFlowChart: true,\n flowchart: {\n nodeType: 'start'\n },\n customLeft: 200,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '目标节点1',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 400,\n customTop: 100\n },\n children: []\n }, {\n data: {\n text: '目标节点2',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 400,\n customTop: 300\n },\n children: []\n }]\n };\n this.mindMap.setData(testData);\n this.$message.info({\n message: '测试说明:1. 从节点的连接点拖拽到其他节点,会吸附到最近的连接点;2. 拖拽到空白处会创建新节点',\n duration: 5000\n });\n this.addLog('加载吸附和拖拽创建测试数据');\n },\n // 测试连接点事件\n testConnectorEvents() {\n if (!this.mindMap) return;\n\n // 监听连接点点击事件\n this.mindMap.on('flowchart_connector_click', data => {\n this.addLog(`连接点点击: 节点 ${data.node.getData('text')}, 位置 ${data.position}`);\n this.$message.info(`点击了 ${data.position} 连接点`);\n });\n\n // 监听连接点拖拽开始事件\n this.mindMap.on('flowchart_connector_drag_start', data => {\n this.addLog(`连接点拖拽开始: 节点 ${data.node.getData('text')}, 位置 ${data.position}`);\n this.$message.success('连接点拖拽开始,可以拖拽创建关联线');\n });\n this.addLog('已启用连接点事件监听');\n this.$message.success('连接点事件监听已启用,请将鼠标悬停在流程图节点上查看连接点');\n\n // 监听流程图连线创建事件\n this.mindMap.on('flowchart_line_created', data => {\n this.addLog(`流程图连线创建: 从 ${data.startNode.getData('text')} 到 ${data.endNode.getData('text')}`);\n this.$message.success('流程图连线创建成功!');\n });\n }\n }\n});\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"b8ac2678-vue-loader-template\"}!./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true":
|
||
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"b8ac2678-vue-loader-template"}!./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/loaders/templateLoader.js??ref--7!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true ***!
|
||
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
||
/*! exports provided: render, staticRenderFns */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n staticClass: \"test-container\"\n }, [_c(\"div\", {\n staticClass: \"test-main\"\n }, [_c(\"div\", {\n staticClass: \"control-panel\"\n }, [_c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"基础操作\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.initMindMap\n }\n }, [_vm._v(\"重新初始化\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.loadSingleRoot\n }\n }, [_vm._v(\"加载单根\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.loadMultiRoot\n }\n }, [_vm._v(\"加载多根\")]), _c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: _vm.toggleMultiRootMode\n }\n }, [_vm._v(\"切换模式\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"根节点操作\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n on: {\n click: _vm.addNewRoot\n }\n }, [_vm._v(\"添加根节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.removeLastRoot\n }\n }, [_vm._v(\"删除最后根节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.addRootWithCustomPosition\n }\n }, [_vm._v(\"添加自定义位置根节点\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"关联线测试\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.enterAssociativeMode\n }\n }, [_vm._v(\"进入关联线模式\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.createCrossRootAssociation\n }\n }, [_vm._v(\"创建跨根关联线\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.showAllAssociations\n }\n }, [_vm._v(\"显示所有关联线\")]), _c(\"el-button\", {\n attrs: {\n type: \"danger\"\n },\n on: {\n click: _vm.clearAllAssociations\n }\n }, [_vm._v(\"清除所有关联线\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"日志系统测试\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.testLoggerDebug\n }\n }, [_vm._v(\"测试 DEBUG\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.testLoggerInfo\n }\n }, [_vm._v(\"测试 INFO\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.testLoggerWarn\n }\n }, [_vm._v(\"测试 WARN\")]), _c(\"el-button\", {\n attrs: {\n type: \"danger\"\n },\n on: {\n click: _vm.testLoggerError\n }\n }, [_vm._v(\"测试 ERROR\")])], 1), _c(\"div\", {\n staticClass: \"button-group\",\n staticStyle: {\n \"margin-top\": \"10px\"\n }\n }, [_c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: _vm.testClickableLinks\n }\n }, [_vm._v(\"测试链接格式\")]), _c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.detectEnvironment\n }\n }, [_vm._v(\"检测环境\")])], 1), _c(\"div\", {\n staticClass: \"association-tips\"\n }, [_c(\"el-alert\", {\n attrs: {\n title: \"关联线使用提示\",\n type: \"info\",\n closable: false,\n \"show-icon\": \"\"\n }\n }, [_c(\"p\", [_vm._v(\"1. 先点击选择起始节点\")]), _c(\"p\", [_vm._v('2. 点击\"进入关联线模式\"')]), _c(\"p\", [_vm._v(\"3. 再点击目标节点创建关联线\")]), _c(\"p\", [_vm._v(\"4. 支持跨根节点创建关联线\")]), _c(\"p\", [_vm._v(\"5. 按ESC退出关联线模式\")])])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"状态信息\")]), _c(\"div\", {\n staticClass: \"status-info\"\n }, [_c(\"el-tag\", {\n attrs: {\n type: _vm.isMultiRoot ? \"success\" : \"info\"\n }\n }, [_vm._v(\" 模式: \" + _vm._s(_vm.isMultiRoot ? \"多根节点\" : \"单根节点\") + \" \")]), _c(\"el-tag\", {\n attrs: {\n type: \"primary\"\n }\n }, [_vm._v(\"根节点数: \" + _vm._s(_vm.rootCount))]), _c(\"el-tag\", {\n attrs: {\n type: \"warning\"\n }\n }, [_vm._v(\"关联线数: \" + _vm._s(_vm.associationCount))]), _c(\"el-tag\", {\n attrs: {\n type: _vm.isAssociativeMode ? \"danger\" : \"info\"\n }\n }, [_vm._v(\" \" + _vm._s(_vm.isAssociativeMode ? \"关联线模式\" : \"普通模式\") + \" \")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"主题设置\")]), _c(\"div\", {\n staticClass: \"theme-controls\"\n }, [_vm.isMultiRoot ? _c(\"div\", [_c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择根节点\",\n size: \"small\"\n },\n model: {\n value: _vm.selectedRootIndex,\n callback: function ($$v) {\n _vm.selectedRootIndex = $$v;\n },\n expression: \"selectedRootIndex\"\n }\n }, _vm._l(_vm.rootsInfo, function (root, index) {\n return _c(\"el-option\", {\n key: index,\n attrs: {\n label: `根节点 ${index + 1}: ${root.text}`,\n value: index\n }\n });\n }), 1)], 1) : _vm._e(), _c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择主题\",\n size: \"small\"\n },\n on: {\n change: _vm.applyTheme\n },\n model: {\n value: _vm.selectedTheme,\n callback: function ($$v) {\n _vm.selectedTheme = $$v;\n },\n expression: \"selectedTheme\"\n }\n }, _vm._l(_vm.availableThemes, function (theme) {\n return _c(\"el-option\", {\n key: theme,\n attrs: {\n label: theme,\n value: theme\n }\n });\n }), 1), _c(\"el-button\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n size: \"small\",\n type: \"primary\"\n },\n on: {\n click: _vm.resetTheme\n }\n }, [_vm._v(\" 重置为默认主题 \")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"布局设置\")]), _c(\"div\", {\n staticClass: \"layout-controls\"\n }, [_vm.isMultiRoot ? _c(\"div\", [_c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择根节点\",\n size: \"small\"\n },\n model: {\n value: _vm.selectedLayoutRootIndex,\n callback: function ($$v) {\n _vm.selectedLayoutRootIndex = $$v;\n },\n expression: \"selectedLayoutRootIndex\"\n }\n }, _vm._l(_vm.rootsInfo, function (root, index) {\n return _c(\"el-option\", {\n key: index,\n attrs: {\n label: `根节点 ${index + 1}: ${root.text}`,\n value: index\n }\n });\n }), 1)], 1) : _vm._e(), _c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择布局\",\n size: \"small\"\n },\n on: {\n change: _vm.applyLayout\n },\n model: {\n value: _vm.selectedLayout,\n callback: function ($$v) {\n _vm.selectedLayout = $$v;\n },\n expression: \"selectedLayout\"\n }\n }, _vm._l(_vm.availableLayouts, function (layout) {\n return _c(\"el-option\", {\n key: layout.value,\n attrs: {\n label: layout.label,\n value: layout.value\n }\n });\n }), 1), _c(\"el-button\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n size: \"small\",\n type: \"primary\"\n },\n on: {\n click: _vm.resetLayout\n }\n }, [_vm._v(\" 重置为默认布局 \")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"测试功能\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n on: {\n click: _vm.testDragToEmptySpace\n }\n }, [_vm._v(\"测试拖拽到空白\")]), _c(\"el-button\", {\n on: {\n click: _vm.testDoubleClickCreate\n }\n }, [_vm._v(\"测试双击创建\")]), _c(\"el-button\", {\n on: {\n click: _vm.testCrossRootDrag\n }\n }, [_vm._v(\"测试跨根拖拽\")]), _c(\"el-button\", {\n on: {\n click: _vm.testGeneralizationWithChildren\n }\n }, [_vm._v(\"测试概要子节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.testPerRootThemes\n }\n }, [_vm._v(\"测试多主题\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.testRadialLayout\n }\n }, [_vm._v(\"测试径向布局\")]), _c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.testRadialLayoutStrategies\n }\n }, [_vm._v(\"测试径向策略\")]), _c(\"el-button\", {\n on: {\n click: _vm.resetAll\n }\n }, [_vm._v(\"重置所有\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"Markdown 导入测试\")]), _c(\"div\", {\n staticClass: \"markdown-test-panel\"\n }, [_c(\"el-input\", {\n staticStyle: {\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n type: \"textarea\",\n rows: 8,\n placeholder: \"在此输入 Markdown 文本进行解析测试\"\n },\n model: {\n value: _vm.markdownTestText,\n callback: function ($$v) {\n _vm.markdownTestText = $$v;\n },\n expression: \"markdownTestText\"\n }\n }), _c(\"input\", {\n ref: \"markdownFileInput\",\n staticStyle: {\n display: \"none\"\n },\n attrs: {\n type: \"file\",\n accept: \".md,text/markdown\"\n },\n on: {\n change: _vm.handleMarkdownFileChange\n }\n }), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.parseMarkdownOld\n }\n }, [_vm._v(\"旧 Markdown 解析\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\",\n type: \"primary\"\n },\n on: {\n click: _vm.parseMarkdownNew\n }\n }, [_vm._v(\"新 Markdown 解析\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.triggerMarkdownFileSelect\n }\n }, [_vm._v(\"导入 Markdown 文件\")])], 1)], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"连接线样式测试\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.testBraceLineStyle\n }\n }, [_vm._v(\"测试大括号连线\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"curve\");\n }\n }\n }, [_vm._v(\"曲线样式\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"straight\");\n }\n }\n }, [_vm._v(\"直线样式\")]), _c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"direct\");\n }\n }\n }, [_vm._v(\"直连样式\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"brace\");\n }\n }\n }, [_vm._v(\"大括号样式\")])], 1), _c(\"div\", {\n staticClass: \"line-style-settings\",\n staticStyle: {\n \"margin-top\": \"10px\"\n }\n }, [_c(\"div\", {\n staticStyle: {\n display: \"flex\",\n \"align-items\": \"center\",\n \"margin-bottom\": \"8px\"\n }\n }, [_c(\"span\", {\n staticStyle: {\n \"margin-right\": \"10px\"\n }\n }, [_vm._v(\"布局切换: \")]), _c(\"el-select\", {\n staticStyle: {\n width: \"180px\"\n },\n attrs: {\n placeholder: \"选择布局\",\n size: \"small\"\n },\n on: {\n change: _vm.changeLineTestLayout\n },\n model: {\n value: _vm.lineTestLayout,\n callback: function ($$v) {\n _vm.lineTestLayout = $$v;\n },\n expression: \"lineTestLayout\"\n }\n }, _vm._l(_vm.availableLayouts, function (layout) {\n return _c(\"el-option\", {\n key: layout.value,\n attrs: {\n label: layout.label,\n value: layout.value\n }\n });\n }), 1)], 1), _c(\"div\", {\n staticStyle: {\n display: \"flex\",\n \"align-items\": \"center\"\n }\n }, [_c(\"span\", {\n staticStyle: {\n \"margin-right\": \"10px\"\n }\n }, [_vm._v(\"大括号曲线弧度: \")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"150px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 5,\n max: 30,\n step: 1\n },\n on: {\n change: _vm.updateBraceCurveSize\n },\n model: {\n value: _vm.braceCurveSize,\n callback: function ($$v) {\n _vm.braceCurveSize = $$v;\n },\n expression: \"braceCurveSize\"\n }\n }), _c(\"span\", [_vm._v(_vm._s(_vm.braceCurveSize) + \"px\")])], 1)])]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"主题预览图生成\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.showThemeGeneratorDialog\n }\n }, [_vm._v(\"批量生成主题预览图\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.showLayoutGeneratorDialog\n }\n }, [_vm._v(\"批量生成布局预览图\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"流程图功能\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"process\");\n }\n }\n }, [_vm._v(\"创建流程节点\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"decision\");\n }\n }\n }, [_vm._v(\"创建决策节点\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"start\");\n }\n }\n }, [_vm._v(\"创建开始节点\")]), _c(\"el-button\", {\n attrs: {\n type: \"danger\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"end\");\n }\n }\n }, [_vm._v(\"创建结束节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.convertToFlowChart\n }\n }, [_vm._v(\"转为流程图节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.convertToNormal\n }\n }, [_vm._v(\"转为普通节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.testFlowChartMode\n }\n }, [_vm._v(\"测试混合模式\")]), _c(\"el-button\", {\n on: {\n click: _vm.testConnectorEvents\n }\n }, [_vm._v(\"测试连接点事件\")]), _c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: _vm.testOrthogonalLines\n }\n }, [_vm._v(\"测试正交连线\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.testSnapAndDrag\n }\n }, [_vm._v(\"测试吸附和拖拽创建\")])], 1)])]), _c(\"div\", {\n staticClass: \"mindmap-area\"\n }, [_c(\"div\", {\n staticClass: \"mindmap-header\"\n }, [_c(\"span\", [_vm._v(\"思维导图\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.fitView\n }\n }, [_vm._v(\"适应视图\")])], 1), _c(\"div\", {\n staticClass: \"mindmap-container\"\n }, [_c(\"div\", {\n ref: \"mindMapContainer\",\n staticClass: \"mindMapContainer\",\n attrs: {\n id: \"testMindMapContainer\"\n }\n })])]), _c(\"el-dialog\", {\n attrs: {\n title: \"批量生成主题预览图\",\n visible: _vm.themeGeneratorDialogVisible,\n width: \"80%\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function ($event) {\n _vm.themeGeneratorDialogVisible = $event;\n }\n }\n }, [_c(\"div\", {\n staticClass: \"theme-generator-content\"\n }, [_c(\"div\", {\n staticClass: \"generator-header\"\n }, [_c(\"el-alert\", {\n attrs: {\n title: `共有 ${_vm.allThemes.length} 个主题,已生成 ${_vm.generatedCount} 个`,\n type: \"info\",\n closable: false\n }\n }), _c(\"div\", {\n staticClass: \"quality-settings\"\n }, [_c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"label\", [_vm._v(\"WebP 质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"200px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"show-tooltip\": true,\n \"format-tooltip\": val => Math.round(val * 100) + \"%\"\n },\n model: {\n value: _vm.webpQuality,\n callback: function ($$v) {\n _vm.webpQuality = $$v;\n },\n expression: \"webpQuality\"\n }\n }), _c(\"span\", {\n staticClass: \"quality-value\"\n }, [_vm._v(_vm._s(Math.round(_vm.webpQuality * 100)) + \"%\")]), _c(\"el-tooltip\", {\n attrs: {\n content: \"较低的质量会减小文件大小,但可能降低图像质量\"\n }\n }, [_c(\"i\", {\n staticClass: \"el-icon-question\",\n staticStyle: {\n \"margin-left\": \"5px\",\n color: \"#909399\"\n }\n })])], 1), _c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"label\", [_vm._v(\"JPG 质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"200px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"show-tooltip\": true,\n \"format-tooltip\": val => Math.round(val * 100) + \"%\"\n },\n model: {\n value: _vm.jpgQuality,\n callback: function ($$v) {\n _vm.jpgQuality = $$v;\n },\n expression: \"jpgQuality\"\n }\n }), _c(\"span\", {\n staticClass: \"quality-value\"\n }, [_vm._v(_vm._s(Math.round(_vm.jpgQuality * 100)) + \"%\")]), _c(\"el-tooltip\", {\n attrs: {\n content: \"JPG不支持透明度,会添加白色背景\"\n }\n }, [_c(\"i\", {\n staticClass: \"el-icon-question\",\n staticStyle: {\n \"margin-left\": \"5px\",\n color: \"#909399\"\n }\n })])], 1), _c(\"div\", {\n staticClass: \"quality-presets\"\n }, [_c(\"label\", [_vm._v(\"快速预设:\")]), _c(\"el-button-group\", {\n attrs: {\n size: \"small\"\n }\n }, [_c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"high\");\n }\n }\n }, [_vm._v(\"高质量\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"medium\");\n }\n }\n }, [_vm._v(\"平衡\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"low\");\n }\n }\n }, [_vm._v(\"小文件\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"tiny\");\n }\n }\n }, [_vm._v(\"极限压缩\")])], 1)], 1)]), _c(\"div\", {\n staticClass: \"generator-actions\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\",\n loading: _vm.isGenerating,\n disabled: _vm.isGenerating\n },\n on: {\n click: _vm.startGenerating\n }\n }, [_vm._v(\" \" + _vm._s(_vm.isGenerating ? \"生成中...\" : \"开始生成\") + \" \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0\n },\n on: {\n click: _vm.downloadAllSVGs\n }\n }, [_vm._v(\" 下载所有SVG (\" + _vm._s(_vm.generatedSVGs.length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0,\n type: \"success\"\n },\n on: {\n click: _vm.downloadAllPNGs\n }\n }, [_vm._v(\" 下载所有PNG (\" + _vm._s(_vm.generatedSVGs.filter(t => t.pngDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0,\n type: \"warning\"\n },\n on: {\n click: _vm.downloadAllWebPs\n }\n }, [_vm._v(\" 下载所有WebP (\" + _vm._s(_vm.generatedSVGs.filter(t => t.webpDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0,\n type: \"danger\"\n },\n on: {\n click: _vm.downloadAllJPGs\n }\n }, [_vm._v(\" 下载所有JPG (\" + _vm._s(_vm.generatedSVGs.filter(t => t.jpgDataUrl).length) + \") \")]), _c(\"el-button\", {\n on: {\n click: _vm.clearGenerated\n }\n }, [_vm._v(\"清空\")])], 1)], 1), _vm.isGenerating ? _c(\"div\", {\n staticClass: \"generator-progress\"\n }, [_c(\"el-progress\", {\n attrs: {\n percentage: Math.round(_vm.generatedCount / _vm.allThemes.length * 100),\n status: _vm.generatedCount === _vm.allThemes.length ? \"success\" : \"\"\n }\n }), _c(\"p\", [_vm._v(\"正在生成: \" + _vm._s(_vm.currentThemeName))])], 1) : _vm._e(), _vm.previewMindMapEl ? _c(\"div\", {\n staticClass: \"preview-container\"\n }, [_c(\"div\", {\n ref: \"previewMindMapEl\",\n attrs: {\n id: \"themePreviewMindMap\"\n }\n })]) : _vm._e(), _c(\"div\", {\n staticClass: \"generated-list\"\n }, [_c(\"el-table\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n data: _vm.generatedSVGs,\n height: \"400\"\n }\n }, [_c(\"el-table-column\", {\n attrs: {\n prop: \"name\",\n label: \"主题名称\",\n width: \"150\",\n fixed: \"\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticStyle: {\n display: \"flex\",\n \"align-items\": \"center\"\n }\n }, [_c(\"span\", [_vm._v(_vm._s(scope.row.name))]), scope.row.isDefault ? _c(\"el-tag\", {\n staticStyle: {\n \"margin-left\": \"8px\"\n },\n attrs: {\n type: \"primary\",\n size: \"mini\"\n }\n }, [_vm._v(\" 默认 \")]) : _vm._e()], 1)];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n prop: \"value\",\n label: \"主题值\",\n width: \"120\"\n }\n }), _c(\"el-table-column\", {\n attrs: {\n prop: \"type\",\n label: \"类型\",\n width: \"70\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"el-tag\", {\n attrs: {\n type: scope.row.dark ? \"info\" : \"warning\",\n size: \"small\"\n }\n }, [_vm._v(\" \" + _vm._s(scope.row.dark ? \"深色\" : \"浅色\") + \" \")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"预览\",\n width: \"200\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"el-tabs\", {\n staticStyle: {\n height: \"100px\"\n },\n attrs: {\n type: \"card\"\n }\n }, [_c(\"el-tab-pane\", {\n attrs: {\n label: \"SVG\"\n }\n }, [scope.row.svgContent ? _c(\"div\", {\n staticStyle: {\n width: \"180px\",\n height: \"80px\",\n overflow: \"hidden\"\n },\n domProps: {\n innerHTML: _vm._s(scope.row.svgContent)\n }\n }) : _vm._e()]), scope.row.pngDataUrl ? _c(\"el-tab-pane\", {\n attrs: {\n label: \"PNG\"\n }\n }, [_c(\"img\", {\n staticStyle: {\n width: \"180px\",\n height: \"auto\",\n \"max-height\": \"80px\",\n \"object-fit\": \"contain\"\n },\n attrs: {\n src: scope.row.pngDataUrl\n }\n })]) : _vm._e(), scope.row.webpDataUrl ? _c(\"el-tab-pane\", {\n attrs: {\n label: \"WebP\"\n }\n }, [_c(\"img\", {\n staticStyle: {\n width: \"180px\",\n height: \"auto\",\n \"max-height\": \"80px\",\n \"object-fit\": \"contain\"\n },\n attrs: {\n src: scope.row.webpDataUrl\n }\n })]) : _vm._e(), scope.row.jpgDataUrl ? _c(\"el-tab-pane\", {\n attrs: {\n label: \"JPG\"\n }\n }, [_c(\"img\", {\n staticStyle: {\n width: \"180px\",\n height: \"auto\",\n \"max-height\": \"80px\",\n \"object-fit\": \"contain\"\n },\n attrs: {\n src: scope.row.jpgDataUrl\n }\n })]) : _vm._e()], 1)];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"文件大小\",\n width: \"200\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticClass: \"size-info\"\n }, [scope.row.svgSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\"\n }\n }, [_vm._v(\"SVG: \" + _vm._s(_vm.formatFileSize(scope.row.svgSize)))])], 1) : _vm._e(), scope.row.pngSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\",\n type: \"success\"\n }\n }, [_vm._v(\"PNG: \" + _vm._s(_vm.formatFileSize(scope.row.pngSize)))])], 1) : _vm._e(), scope.row.webpSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\",\n type: \"warning\"\n }\n }, [_vm._v(\"WebP: \" + _vm._s(_vm.formatFileSize(scope.row.webpSize)))])], 1) : _vm._e(), scope.row.jpgSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\",\n type: \"danger\"\n }\n }, [_vm._v(\"JPG: \" + _vm._s(_vm.formatFileSize(scope.row.jpgSize)))])], 1) : _vm._e()])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n fixed: \"right\",\n width: \"240\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticClass: \"action-buttons\"\n }, [_c(\"el-button-group\", [_c(\"el-button\", {\n attrs: {\n size: \"mini\",\n title: \"下载SVG\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSingleSVG(scope.row);\n }\n }\n }, [_vm._v(\" SVG \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n disabled: !scope.row.pngDataUrl,\n type: \"success\",\n title: \"下载PNG\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSinglePNG(scope.row);\n }\n }\n }, [_vm._v(\" PNG \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n disabled: !scope.row.webpDataUrl,\n type: \"warning\",\n title: \"下载WebP\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSingleWebP(scope.row);\n }\n }\n }, [_vm._v(\" WebP \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n disabled: !scope.row.jpgDataUrl,\n type: \"danger\",\n title: \"下载JPG\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSingleJPG(scope.row);\n }\n }\n }, [_vm._v(\" JPG \")])], 1), _c(\"el-button\", {\n staticStyle: {\n \"margin-left\": \"10px\"\n },\n attrs: {\n size: \"mini\",\n type: \"text\"\n },\n on: {\n click: function ($event) {\n return _vm.removeGenerated(scope.$index);\n }\n }\n }, [_vm._v(\" 删除 \")])], 1)];\n }\n }])\n })], 1)], 1)])]), _c(\"el-dialog\", {\n attrs: {\n title: \"批量生成布局预览图\",\n visible: _vm.layoutGeneratorDialogVisible,\n width: \"80%\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function ($event) {\n _vm.layoutGeneratorDialogVisible = $event;\n }\n }\n }, [_c(\"div\", {\n staticClass: \"layout-generator-content\"\n }, [_c(\"div\", {\n staticClass: \"generator-header\"\n }, [_c(\"el-alert\", {\n attrs: {\n title: `共有 ${_vm.allLayouts.length} 个布局,已生成 ${_vm.generatedLayoutCount} 个`,\n type: \"info\",\n closable: false\n }\n }), _c(\"div\", {\n staticClass: \"generator-controls\"\n }, [_c(\"div\", {\n staticClass: \"quality-controls\"\n }, [_c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"span\", [_vm._v(\"WebP质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"150px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"format-tooltip\": val => `${Math.round(val * 100)}%`\n },\n model: {\n value: _vm.layoutWebpQuality,\n callback: function ($$v) {\n _vm.layoutWebpQuality = $$v;\n },\n expression: \"layoutWebpQuality\"\n }\n }), _c(\"el-button-group\", {\n attrs: {\n size: \"mini\"\n }\n }, [_c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 0.3;\n }\n }\n }, [_vm._v(\"低\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 0.6;\n }\n }\n }, [_vm._v(\"中\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 0.8;\n }\n }\n }, [_vm._v(\"高\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 1;\n }\n }\n }, [_vm._v(\"最高\")])], 1)], 1), _c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"span\", [_vm._v(\"JPG质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"150px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"format-tooltip\": val => `${Math.round(val * 100)}%`\n },\n model: {\n value: _vm.layoutJpgQuality,\n callback: function ($$v) {\n _vm.layoutJpgQuality = $$v;\n },\n expression: \"layoutJpgQuality\"\n }\n }), _c(\"el-button-group\", {\n attrs: {\n size: \"mini\"\n }\n }, [_c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 0.3;\n }\n }\n }, [_vm._v(\"低\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 0.6;\n }\n }\n }, [_vm._v(\"中\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 0.85;\n }\n }\n }, [_vm._v(\"高\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 1;\n }\n }\n }, [_vm._v(\"最高\")])], 1)], 1)]), _c(\"div\", {\n staticClass: \"action-buttons\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\",\n loading: _vm.isGeneratingLayouts,\n disabled: _vm.isGeneratingLayouts\n },\n on: {\n click: _vm.generateAllLayoutPreviews\n }\n }, [_vm._v(\" \" + _vm._s(_vm.isGeneratingLayouts ? `正在生成 ${_vm.currentLayoutName}...` : \"生成所有布局预览图\") + \" \")]), _c(\"el-button\", {\n on: {\n click: _vm.clearGeneratedLayouts\n }\n }, [_vm._v(\"清空已生成\")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0\n },\n on: {\n click: _vm.downloadAllLayoutSVGs\n }\n }, [_vm._v(\" 下载所有SVG (\" + _vm._s(_vm.generatedLayoutSVGs.length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0,\n type: \"success\"\n },\n on: {\n click: _vm.downloadAllLayoutPNGs\n }\n }, [_vm._v(\" 下载所有PNG (\" + _vm._s(_vm.generatedLayoutSVGs.filter(l => l.pngDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0,\n type: \"warning\"\n },\n on: {\n click: _vm.downloadAllLayoutWebPs\n }\n }, [_vm._v(\" 下载所有WebP (\" + _vm._s(_vm.generatedLayoutSVGs.filter(l => l.webpDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0,\n type: \"danger\"\n },\n on: {\n click: _vm.downloadAllLayoutJPGs\n }\n }, [_vm._v(\" 下载所有JPG (\" + _vm._s(_vm.generatedLayoutSVGs.filter(l => l.jpgDataUrl).length) + \") \")])], 1)])], 1), _c(\"div\", {\n staticClass: \"layout-generator-list\"\n }, [_c(\"el-table\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n data: _vm.allLayouts,\n height: \"400\",\n border: \"\"\n }\n }, [_c(\"el-table-column\", {\n attrs: {\n prop: \"name\",\n label: \"布局名称\",\n width: \"150\"\n }\n }), _c(\"el-table-column\", {\n attrs: {\n prop: \"value\",\n label: \"布局值\",\n width: \"180\"\n }\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"SVG预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.svgData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.svgData,\n alt: \"SVG预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.svgSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"PNG预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.pngData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.pngData,\n alt: \"PNG预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.pngSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"WebP预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.webpData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.webpData,\n alt: \"WebP预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.webpSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"JPG预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.jpgData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.jpgData,\n alt: \"JPG预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.jpgSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n width: \"200\",\n fixed: \"right\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticClass: \"action-buttons\"\n }, [_c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"primary\",\n disabled: _vm.isGeneratingLayouts\n },\n on: {\n click: function ($event) {\n return _vm.generateLayoutPreview(scope.row);\n }\n }\n }, [_vm._v(\" 生成 \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"success\",\n disabled: !scope.row.svgData\n },\n on: {\n click: function ($event) {\n return _vm.downloadLayoutPreview(scope.row);\n }\n }\n }, [_vm._v(\" 下载 \")])], 1)];\n }\n }])\n })], 1)], 1)])]), _c(\"div\", {\n staticClass: \"panel-header\"\n }, [_c(\"span\", [_vm._v(\"实时数据\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.refreshData\n }\n }, [_vm._v(\"刷新\")])], 1), _c(\"el-tabs\", {\n attrs: {\n type: \"border-card\"\n },\n model: {\n value: _vm.activeTab,\n callback: function ($$v) {\n _vm.activeTab = $$v;\n },\n expression: \"activeTab\"\n }\n }, [_c(\"el-tab-pane\", {\n attrs: {\n label: \"数据结构\",\n name: \"data\"\n }\n }, [_c(\"div\", {\n staticClass: \"data-content\"\n }, [_c(\"pre\", [_vm._v(_vm._s(_vm.formattedData))])])]), _c(\"el-tab-pane\", {\n attrs: {\n label: \"关联线数据\",\n name: \"associations\"\n }\n }, [_c(\"div\", {\n staticClass: \"data-content\"\n }, [_vm.associationsData.length === 0 ? _c(\"div\", {\n staticClass: \"no-data\"\n }, [_vm._v(\" 暂无关联线数据 \")]) : _c(\"div\", _vm._l(_vm.associationsData, function (assoc, index) {\n return _c(\"div\", {\n key: index,\n staticClass: \"association-item\"\n }, [_c(\"div\", {\n staticClass: \"association-info\"\n }, [_c(\"strong\", [_vm._v(\"关联线 \" + _vm._s(index + 1))]), _c(\"p\", [_vm._v(\"起始: \" + _vm._s(assoc.fromNodeText))]), _c(\"p\", [_vm._v(\"目标: \" + _vm._s(assoc.toNodeText))]), _c(\"p\", [_vm._v(\"文本: \" + _vm._s(assoc.text || \"无\"))])]), _c(\"el-button\", {\n attrs: {\n size: \"small\",\n type: \"danger\"\n },\n on: {\n click: function ($event) {\n return _vm.removeAssociation(index);\n }\n }\n }, [_vm._v(\"删除\")])], 1);\n }), 0)])]), _c(\"el-tab-pane\", {\n attrs: {\n label: \"操作日志\",\n name: \"logs\"\n }\n }, [_c(\"div\", {\n staticClass: \"data-content\"\n }, _vm._l(_vm.operationLogs, function (log, index) {\n return _c(\"div\", {\n key: index,\n staticClass: \"log-item\"\n }, [_c(\"span\", {\n staticClass: \"log-time\"\n }, [_vm._v(_vm._s(log.time))]), _c(\"span\", {\n staticClass: \"log-message\"\n }, [_vm._v(_vm._s(log.message))])]);\n }), 0)])], 1)], 1)]);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22b8ac2678-vue-loader-template%22%7D!./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/loaders/templateLoader.js??ref--7!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/core-js/internals/an-instance.js":
|
||
/*!*******************************************************!*\
|
||
!*** ./node_modules/core-js/internals/an-instance.js ***!
|
||
\*******************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("\nvar isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ \"./node_modules/core-js/internals/object-is-prototype-of.js\");\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n\n\n//# sourceURL=webpack:///./node_modules/core-js/internals/an-instance.js?");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/core-js/internals/dom-exception-constants.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/core-js/internals/dom-exception-constants.js ***!
|
||
\*******************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("\nmodule.exports = {\n IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 },\n DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 },\n HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 },\n WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 },\n InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 },\n NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 },\n NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 },\n NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 },\n NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 },\n InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 },\n InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 },\n SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 },\n InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 },\n NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 },\n InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 },\n ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 },\n TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 },\n SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 },\n NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 },\n AbortError: { s: 'ABORT_ERR', c: 20, m: 1 },\n URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 },\n QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 },\n TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 },\n InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 },\n DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 }\n};\n\n\n//# sourceURL=webpack:///./node_modules/core-js/internals/dom-exception-constants.js?");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/core-js/modules/web.dom-exception.stack.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/core-js/modules/web.dom-exception.stack.js ***!
|
||
\*****************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar defineProperty = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f;\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar anInstance = __webpack_require__(/*! ../internals/an-instance */ \"./node_modules/core-js/internals/an-instance.js\");\nvar inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ \"./node_modules/core-js/internals/inherit-if-required.js\");\nvar normalizeStringArgument = __webpack_require__(/*! ../internals/normalize-string-argument */ \"./node_modules/core-js/internals/normalize-string-argument.js\");\nvar DOMExceptionConstants = __webpack_require__(/*! ../internals/dom-exception-constants */ \"./node_modules/core-js/internals/dom-exception-constants.js\");\nvar clearErrorStack = __webpack_require__(/*! ../internals/error-stack-clear */ \"./node_modules/core-js/internals/error-stack-clear.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar DOM_EXCEPTION = 'DOMException';\nvar Error = getBuiltIn('Error');\nvar NativeDOMException = getBuiltIn(DOM_EXCEPTION);\n\nvar $DOMException = function DOMException() {\n anInstance(this, DOMExceptionPrototype);\n var argumentsLength = arguments.length;\n var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]);\n var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error');\n var that = new NativeDOMException(message, name);\n var error = new Error(message);\n error.name = DOM_EXCEPTION;\n defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1)));\n inheritIfRequired(that, this, $DOMException);\n return that;\n};\n\nvar DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype;\n\nvar ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION);\nvar DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2);\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(global, DOM_EXCEPTION);\n\n// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it\n// https://github.com/Jarred-Sumner/bun/issues/399\nvar BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable);\n\nvar FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK;\n\n// `DOMException` constructor patch for `.stack` where it's required\n// https://webidl.spec.whatwg.org/#es-DOMException-specialness\n$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic\n DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException\n});\n\nvar PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION);\nvar PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype;\n\nif (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) {\n if (!IS_PURE) {\n defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException));\n }\n\n for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) {\n var constant = DOMExceptionConstants[key];\n var constantName = constant.s;\n if (!hasOwn(PolyfilledDOMException, constantName)) {\n defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c));\n }\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/core-js/modules/web.dom-exception.stack.js?");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css":
|
||
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css ***!
|
||
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.test-container[data-v-2f56c616] {\\n height: 100vh;\\n display: flex;\\n flex-direction: column;\\n background: #f5f7fa;\\n}\\n.test-header[data-v-2f56c616] {\\n text-align: center;\\n padding: 15px 20px;\\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\\n color: white;\\n flex-shrink: 0;\\n}\\n.test-header h1[data-v-2f56c616] {\\n margin: 0 0 5px 0;\\n font-size: 24px;\\n font-weight: 500;\\n}\\n.test-header p[data-v-2f56c616] {\\n margin: 0;\\n opacity: 0.9;\\n font-size: 14px;\\n}\\n.test-main[data-v-2f56c616] {\\n flex: 1;\\n display: flex;\\n gap: 10px;\\n padding: 10px;\\n overflow: hidden;\\n}\\n\\n/* 左侧控制面板 */\\n.control-panel[data-v-2f56c616] {\\n width: 280px;\\n background: white;\\n border-radius: 8px;\\n padding: 15px;\\n overflow-y: auto;\\n flex-shrink: 0;\\n}\\n.panel-section[data-v-2f56c616] {\\n margin-bottom: 20px;\\n padding-bottom: 15px;\\n border-bottom: 1px solid #f0f0f0;\\n}\\n.panel-section[data-v-2f56c616]:last-child {\\n border-bottom: none;\\n}\\n.panel-section h3[data-v-2f56c616] {\\n margin: 0 0 12px 0;\\n font-size: 14px;\\n color: #333;\\n font-weight: 600;\\n}\\n.button-group[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\\n.button-group .el-button[data-v-2f56c616] {\\n width: 100%;\\n margin: 0;\\n}\\n.status-info[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\\n.association-tips[data-v-2f56c616] {\\n margin-top: 10px;\\n}\\n.association-tips[data-v-2f56c616] .el-alert__content {\\n font-size: 12px;\\n}\\n.association-tips p[data-v-2f56c616] {\\n margin: 2px 0;\\n}\\n\\n/* 中间思维导图区域 */\\n.mindmap-area[data-v-2f56c616] {\\n flex: 1;\\n display: flex;\\n flex-direction: column;\\n background: white;\\n border-radius: 8px;\\n overflow: hidden;\\n}\\n.mindmap-header[data-v-2f56c616] {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 10px 15px;\\n background: #f8f9fa;\\n border-bottom: 1px solid #e9ecef;\\n font-weight: 600;\\n color: #333;\\n}\\n.mindmap-container[data-v-2f56c616] {\\n flex: 1;\\n position: relative;\\n overflow: hidden;\\n}\\n.mindMapContainer[data-v-2f56c616] {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n}\\n\\n/* 右侧数据面板 */\\n.data-panel[data-v-2f56c616] {\\n width: 320px;\\n background: white;\\n border-radius: 8px;\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n flex-shrink: 0;\\n}\\n.panel-header[data-v-2f56c616] {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 10px 15px;\\n background: #f8f9fa;\\n border-bottom: 1px solid #e9ecef;\\n font-weight: 600;\\n color: #333;\\n}\\n.data-content[data-v-2f56c616] {\\n height: 400px;\\n overflow-y: auto;\\n padding: 10px;\\n}\\n.data-content pre[data-v-2f56c616] {\\n background: #f8f9fa;\\n padding: 10px;\\n border-radius: 4px;\\n border: 1px solid #e9ecef;\\n font-size: 12px;\\n line-height: 1.4;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n.no-data[data-v-2f56c616] {\\n text-align: center;\\n color: #999;\\n padding: 20px;\\n}\\n.association-item[data-v-2f56c616] {\\n display: flex;\\n justify-content: space-between;\\n align-items: flex-start;\\n padding: 10px;\\n border: 1px solid #e9ecef;\\n border-radius: 4px;\\n margin-bottom: 8px;\\n}\\n.association-info[data-v-2f56c616] {\\n flex: 1;\\n}\\n.association-info strong[data-v-2f56c616] {\\n color: #333;\\n display: block;\\n margin-bottom: 5px;\\n}\\n.association-info p[data-v-2f56c616] {\\n margin: 2px 0;\\n font-size: 12px;\\n color: #666;\\n}\\n.log-item[data-v-2f56c616] {\\n display: flex;\\n align-items: flex-start;\\n gap: 10px;\\n padding: 5px 0;\\n border-bottom: 1px solid #f0f0f0;\\n font-size: 12px;\\n}\\n.log-time[data-v-2f56c616] {\\n color: #999;\\n font-family: monospace;\\n flex-shrink: 0;\\n}\\n.log-message[data-v-2f56c616] {\\n color: #333;\\n flex: 1;\\n}\\n\\n/* 思维导图相关样式 */\\n[data-v-2f56c616] .smm-mind-map-container {\\n width: 100%;\\n height: 100%;\\n}\\n[data-v-2f56c616] .smm-mind-map-container svg {\\n width: 100%;\\n height: 100%;\\n}\\n\\n/* 主题生成器样式 */\\n.theme-generator-content[data-v-2f56c616] {\\n padding: 10px;\\n}\\n.generator-header[data-v-2f56c616] {\\n margin-bottom: 20px;\\n}\\n.quality-settings[data-v-2f56c616] {\\n margin: 15px 0;\\n padding: 15px;\\n background: #f5f7fa;\\n border-radius: 4px;\\n}\\n.quality-item[data-v-2f56c616] {\\n display: flex;\\n align-items: center;\\n margin-bottom: 15px;\\n}\\n.quality-item label[data-v-2f56c616] {\\n width: 100px;\\n font-weight: 500;\\n color: #606266;\\n}\\n.quality-value[data-v-2f56c616] {\\n width: 50px;\\n text-align: center;\\n font-weight: bold;\\n color: #409eff;\\n}\\n.quality-presets[data-v-2f56c616] {\\n display: flex;\\n align-items: center;\\n padding-top: 10px;\\n border-top: 1px solid #dcdfe6;\\n}\\n.quality-presets label[data-v-2f56c616] {\\n width: 100px;\\n font-weight: 500;\\n color: #606266;\\n}\\n.generator-actions[data-v-2f56c616] {\\n margin-top: 15px;\\n display: flex;\\n gap: 10px;\\n}\\n.generator-progress[data-v-2f56c616] {\\n margin: 20px 0;\\n text-align: center;\\n}\\n.generator-progress p[data-v-2f56c616] {\\n margin-top: 10px;\\n color: #666;\\n}\\n.preview-container[data-v-2f56c616] {\\n display: none; /* 隐藏预览容器 */\\n}\\n.generated-list[data-v-2f56c616] {\\n margin-top: 20px;\\n}\\n.size-info[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n}\\n.size-info div[data-v-2f56c616] {\\n display: flex;\\n align-items: center;\\n}\\n.action-buttons[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 5px;\\n align-items: flex-start;\\n}\\n\\n/* 响应式调整 */\\n@media (max-width: 1200px) {\\n.control-panel[data-v-2f56c616],\\n .data-panel[data-v-2f56c616] {\\n width: 250px;\\n}\\n}\\n@media (max-width: 1000px) {\\n.test-main[data-v-2f56c616] {\\n flex-direction: column;\\n}\\n.control-panel[data-v-2f56c616],\\n .data-panel[data-v-2f56c616] {\\n width: 100%;\\n height: 200px;\\n}\\n.mindmap-area[data-v-2f56c616] {\\n min-height: 400px;\\n}\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css":
|
||
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/vue-style-loader??ref--7-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css ***!
|
||
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css */ \"./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../node_modules/vue-style-loader/lib/addStylesClient.js */ \"./node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"87171498\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(false) {}\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/vue-style-loader??ref--7-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/pages/test.vue":
|
||
/*!****************************!*\
|
||
!*** ./src/pages/test.vue ***!
|
||
\****************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./test.vue?vue&type=template&id=2f56c616&scoped=true */ \"./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true\");\n/* harmony import */ var _test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./test.vue?vue&type=script&lang=js */ \"./src/pages/test.vue?vue&type=script&lang=js\");\n/* empty/unused harmony star reexport *//* harmony import */ var _test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css */ \"./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"2f56c616\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/pages/test.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/pages/test.vue?");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/pages/test.vue?vue&type=script&lang=js":
|
||
/*!****************************************************!*\
|
||
!*** ./src/pages/test.vue?vue&type=script&lang=js ***!
|
||
\****************************************************/
|
||
/*! exports provided: default */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/babel-loader/lib!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=script&lang=js */ \"./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=script&lang=js\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/pages/test.vue?");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css":
|
||
/*!************************************************************************************!*\
|
||
!*** ./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css ***!
|
||
\************************************************************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-style-loader??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css */ \"./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true":
|
||
/*!**********************************************************************!*\
|
||
!*** ./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true ***!
|
||
\**********************************************************************/
|
||
/*! exports provided: render, staticRenderFns */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_b8ac2678_vue_loader_template_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_loaders_templateLoader_js_ref_7_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"b8ac2678-vue-loader-template\"}!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/babel-loader/lib!../../node_modules/vue-loader/lib/loaders/templateLoader.js??ref--7!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=template&id=2f56c616&scoped=true */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"b8ac2678-vue-loader-template\\\"}!./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_b8ac2678_vue_loader_template_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_loaders_templateLoader_js_ref_7_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_b8ac2678_vue_loader_template_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_loaders_templateLoader_js_ref_7_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?");
|
||
|
||
/***/ })
|
||
|
||
}]); |