|
@@ -106,6 +106,9 @@ import asideData from "./aside/asideData.vue"
|
|
|
|
|
|
import node from "@/assets/img/node.png"
|
|
|
|
|
|
+// 获取路由实例
|
|
|
+const router = useRouter()
|
|
|
+
|
|
|
const {
|
|
|
onInit,
|
|
|
onNodeDragStop,
|
|
@@ -126,7 +129,7 @@ const { onDragOver, onDrop, onDragLeave, isDragOver } = useDragAndDrop()
|
|
|
const dark = ref(false)
|
|
|
let vueFlowRef = ref()
|
|
|
let iconcolor = ref("#000")
|
|
|
-const GRID_SIZE = 5;
|
|
|
+const GRID_SIZE = 2;
|
|
|
const edges = ref([])
|
|
|
const nodes = ref([])
|
|
|
let mergedObj = ref("")
|
|
@@ -159,8 +162,17 @@ const props = defineProps({
|
|
|
|
|
|
// 处理节点拖动时的网格吸附
|
|
|
onNodeDrag(({ node }) => {
|
|
|
- node.position.x = Math.round(node.position.x / GRID_SIZE) * GRID_SIZE;
|
|
|
- node.position.y = Math.round(node.position.y / GRID_SIZE) * GRID_SIZE;
|
|
|
+ if (!node) {
|
|
|
+ console.error('onNodeDrag 未收到节点数据');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ console.log('拖动节点:', node.id, node.type, node.position);
|
|
|
+ const step = node.type === 'point-only' ? 1 : GRID_SIZE;
|
|
|
+ const newPosition = {
|
|
|
+ x: Math.round(node.position.x / step) * step,
|
|
|
+ y: Math.round(node.position.y / step) * step,
|
|
|
+ };
|
|
|
+ updateNode(node.id, { position: newPosition });
|
|
|
});
|
|
|
|
|
|
// 旧数据存储
|
|
@@ -255,31 +267,33 @@ const toggleDarkMode = () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-const saveproject = () => {
|
|
|
- let obj = {
|
|
|
- nodes: toObject().nodes,
|
|
|
- edges: toObject().edges
|
|
|
- }
|
|
|
- mergedObj.value = JSON.stringify(obj)
|
|
|
-
|
|
|
- const params = {
|
|
|
- transCode: "ES0002",
|
|
|
- pid: pid.value,
|
|
|
- flow: mergedObj.value,
|
|
|
- name: projectStore.projectInfo.name || "",
|
|
|
- remark: projectStore.projectInfo.remark || "",
|
|
|
- keywords: projectStore.projectInfo.keywords || ""
|
|
|
- }
|
|
|
- request(params)
|
|
|
- .then((res) => {
|
|
|
- projectStore.setProjectInfo({
|
|
|
- ...projectStore.projectInfo,
|
|
|
- flow: mergedObj.value || ""
|
|
|
- })
|
|
|
- })
|
|
|
- .catch((error) => {
|
|
|
- console.error("保存失败:", error)
|
|
|
+const saveproject = async () => {
|
|
|
+ try {
|
|
|
+ let obj = {
|
|
|
+ nodes: toObject().nodes,
|
|
|
+ edges: toObject().edges
|
|
|
+ }
|
|
|
+ mergedObj.value = JSON.stringify(obj)
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ transCode: "ES0002",
|
|
|
+ pid: pid.value,
|
|
|
+ flow: mergedObj.value,
|
|
|
+ name: projectStore.projectInfo.name || "",
|
|
|
+ remark: projectStore.projectInfo.remark || "",
|
|
|
+ keywords: projectStore.projectInfo.keywords || ""
|
|
|
+ }
|
|
|
+
|
|
|
+ await request(params)
|
|
|
+ projectStore.setProjectInfo({
|
|
|
+ ...projectStore.projectInfo,
|
|
|
+ flow: mergedObj.value || ""
|
|
|
})
|
|
|
+ console.log('保存成功')
|
|
|
+ } catch (error) {
|
|
|
+ console.error("保存失败:", error)
|
|
|
+ ElMessage.error("保存失败,请稍后重试")
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
const removeNode = () => {
|
|
@@ -746,6 +760,26 @@ const closePanel = () => {
|
|
|
}, 100) // 延迟 100ms 销毁组件,避免 Splitpanes 销毁错误
|
|
|
}
|
|
|
|
|
|
+// 路由切换前保存
|
|
|
+router.beforeEach(async (to, from, next) => {
|
|
|
+ if (to.path !== from.path) {
|
|
|
+ try {
|
|
|
+ await saveproject() // 直接调用 saveproject
|
|
|
+ next()
|
|
|
+ } catch (error) {
|
|
|
+ console.error("路由切换保存失败:", error)
|
|
|
+ next() // 即使保存失败也允许切换路由
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ next()
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+// 组件卸载前保存
|
|
|
+onBeforeUnmount(async () => {
|
|
|
+ await saveproject() // 直接调用 saveproject
|
|
|
+})
|
|
|
+
|
|
|
defineExpose({
|
|
|
resetTransform,
|
|
|
toggleDarkMode,
|