lsc 2 天之前
父節點
當前提交
cf38cf293c

+ 391 - 12
package-lock.json

@@ -36,6 +36,7 @@
         "prosemirror-schema-list": "^1.4.1",
         "prosemirror-state": "^1.4.3",
         "prosemirror-view": "^1.33.9",
+        "qs": "^6.14.0",
         "svg-arc-to-cubic-bezier": "^3.2.0",
         "svg-pathdata": "^7.1.0",
         "tinycolor2": "^1.6.0",
@@ -52,6 +53,7 @@
         "@types/file-saver": "^2.0.7",
         "@types/lodash": "^4.14.202",
         "@types/node": "^18.19.3",
+        "@types/qs": "^6.14.0",
         "@types/svg-arc-to-cubic-bezier": "^3.2.2",
         "@types/tinycolor2": "^1.4.6",
         "@vitejs/plugin-vue": "^5.1.0",
@@ -1397,6 +1399,12 @@
       "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
       "dev": true
     },
+    "node_modules/@types/qs": {
+      "version": "6.14.0",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
+      "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+      "dev": true
+    },
     "node_modules/@types/semver": {
       "version": "7.5.6",
       "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.6.tgz",
@@ -1973,6 +1981,33 @@
         "node": ">=8"
       }
     },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
@@ -2416,6 +2451,19 @@
         "node": ">=8"
       }
     },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/echarts": {
       "version": "5.5.1",
       "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
@@ -2451,6 +2499,33 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/esbuild": {
       "version": "0.21.5",
       "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
@@ -2891,8 +2966,7 @@
     "node_modules/function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
     },
     "node_modules/get-caller-file": {
       "version": "2.0.5",
@@ -2903,6 +2977,41 @@
         "node": "6.* || 8.* || >= 10.*"
       }
     },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/get-stream": {
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
@@ -3142,6 +3251,17 @@
         "delegate": "^3.1.2"
       }
     },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -3172,11 +3292,21 @@
         "node": ">=8"
       }
     },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/hasown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz",
-      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
-      "dev": true,
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -3721,6 +3851,14 @@
         "node": ">=8"
       }
     },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/memorystream": {
       "version": "0.3.1",
       "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz",
@@ -3960,6 +4098,17 @@
       "resolved": "https://registry.npmmirror.com/number-precision/-/number-precision-1.6.0.tgz",
       "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ=="
     },
+    "node_modules/object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
@@ -4397,6 +4546,20 @@
         "node": ">=6"
       }
     },
+    "node_modules/qs": {
+      "version": "6.14.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+      "dependencies": {
+        "side-channel": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/queue": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz",
@@ -4848,6 +5011,74 @@
       "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
       "dev": true
     },
+    "node_modules/side-channel": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/signal-exit": {
       "version": "3.0.7",
       "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -6335,6 +6566,12 @@
       "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
       "dev": true
     },
+    "@types/qs": {
+      "version": "6.14.0",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
+      "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+      "dev": true
+    },
     "@types/semver": {
       "version": "7.5.6",
       "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.6.tgz",
@@ -6789,6 +7026,24 @@
         "fill-range": "^7.0.1"
       }
     },
+    "call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      }
+    },
+    "call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      }
+    },
     "callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
@@ -7125,6 +7380,16 @@
         "is-obj": "^2.0.0"
       }
     },
+    "dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      }
+    },
     "echarts": {
       "version": "5.5.1",
       "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
@@ -7154,6 +7419,24 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
+    },
+    "es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+    },
+    "es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "requires": {
+        "es-errors": "^1.3.0"
+      }
+    },
     "esbuild": {
       "version": "0.21.5",
       "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
@@ -7501,8 +7784,7 @@
     "function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
     },
     "get-caller-file": {
       "version": "2.0.5",
@@ -7510,6 +7792,32 @@
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true
     },
+    "get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      }
+    },
+    "get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "requires": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      }
+    },
     "get-stream": {
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
@@ -7705,6 +8013,11 @@
         "delegate": "^3.1.2"
       }
     },
+    "gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
+    },
     "graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -7729,11 +8042,15 @@
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true
     },
+    "has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
+    },
     "hasown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz",
-      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
-      "dev": true,
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "requires": {
         "function-bind": "^1.1.2"
       }
@@ -8168,6 +8485,11 @@
       "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
       "dev": true
     },
+    "math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
+    },
     "memorystream": {
       "version": "0.3.1",
       "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz",
@@ -8345,6 +8667,11 @@
       "resolved": "https://registry.npmmirror.com/number-precision/-/number-precision-1.6.0.tgz",
       "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ=="
     },
+    "object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="
+    },
     "once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
@@ -8691,6 +9018,14 @@
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
       "dev": true
     },
+    "qs": {
+      "version": "6.14.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+      "requires": {
+        "side-channel": "^1.1.0"
+      }
+    },
     "queue": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz",
@@ -9053,6 +9388,50 @@
       "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
       "dev": true
     },
+    "side-channel": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      }
+    },
+    "side-channel-list": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      }
+    },
+    "side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      }
+    },
+    "side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
+      }
+    },
     "signal-exit": {
       "version": "3.0.7",
       "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",

+ 2 - 0
package.json

@@ -43,6 +43,7 @@
     "prosemirror-schema-list": "^1.4.1",
     "prosemirror-state": "^1.4.3",
     "prosemirror-view": "^1.33.9",
+    "qs": "^6.14.0",
     "svg-arc-to-cubic-bezier": "^3.2.0",
     "svg-pathdata": "^7.1.0",
     "tinycolor2": "^1.6.0",
@@ -59,6 +60,7 @@
     "@types/file-saver": "^2.0.7",
     "@types/lodash": "^4.14.202",
     "@types/node": "^18.19.3",
+    "@types/qs": "^6.14.0",
     "@types/svg-arc-to-cubic-bezier": "^3.2.2",
     "@types/tinycolor2": "^1.4.6",
     "@vitejs/plugin-vue": "^5.1.0",

+ 1 - 175
public/mocks/slides.json

@@ -1,181 +1,7 @@
 [
   {
     "id": "test-slide-1",
-    "elements": [
-      {
-        "type": "shape",
-        "id": "4cbRxp",
-        "left": 0,
-        "top": 200,
-        "width": 546,
-        "height": 362.5,
-        "viewBox": [200, 200],
-        "path": "M 0 0 L 0 200 L 200 200 Z",
-        "fill": "#5b9bd5",
-        "fixedRatio": false,
-        "opacity": 0.7,
-        "rotate": 0
-      },
-      {
-        "type": "shape",
-        "id": "ookHrf",
-        "left": 0,
-        "top": 0,
-        "width": 300,
-        "height": 320,
-        "viewBox": [200, 200],
-        "path": "M 0 0 L 0 200 L 200 200 Z",
-        "fill": "#5b9bd5",
-        "fixedRatio": false,
-        "flipV": true,
-        "rotate": 0
-      },
-      {
-        "type": "text",
-        "id": "idn7Mx",
-        "left": 355,
-        "top": 65.25,
-        "width": 450,
-        "height": 188,
-        "lineHeight": 1.2,
-        "content": "<p><strong><span style=\"font-size: 112px;\">PPTist</span></strong></p>",
-        "rotate": 0,
-        "defaultFontName": "",
-        "defaultColor": "#333"
-      },
-      {
-        "type": "text",
-        "id": "7stmVP",
-        "left": 355,
-        "top": 253.25,
-        "width": 585,
-        "height": 56,
-        "content": "<p><span style=\"font-size: 24px;\">基于 Vue 3.x + TypeScript 的在线演示文稿应用</span></p>",
-        "rotate": 0,
-        "defaultFontName": "",
-        "defaultColor": "#333"
-      },
-      {
-        "type": "line",
-        "id": "FnpZs4",
-        "left": 361,
-        "top": 238,
-        "start": [0, 0],
-        "end": [549, 0],
-        "points": ["", ""],
-        "color": "#5b9bd5",
-        "style": "solid",
-        "width": 2
-      }
-    ],
-    "background": {
-      "type": "solid",
-      "color": "#ffffff"
-    }
-  },
-  {
-    "id": "test-slide-2",
-    "elements": [
-      {
-        "type": "text",
-        "id": "ptNnUJ",
-        "left": 145,
-        "top": 148,
-        "width": 711,
-        "height": 77,
-        "lineHeight": 1.2,
-        "content": "<p style=\"text-align: center;\"><strong><span style=\"font-size: 48px;\">在此处添加标题</span></strong></p>",
-        "rotate": 0,
-        "defaultFontName": "",
-        "defaultColor": "#333"
-      },
-      {
-        "type": "text",
-        "id": "mRHvQN",
-        "left": 207.50000000000003,
-        "top": 249.84259259259264,
-        "width": 585,
-        "height": 56,
-        "content": "<p style=\"text-align: center;\"><span style=\"font-size: 24px;\">在此处添加副标题</span></p>",
-        "rotate": 0,
-        "defaultFontName": "",
-        "defaultColor": "#333"
-      },
-      {
-        "type": "line",
-        "id": "7CQDwc",
-        "left": 323.09259259259267,
-        "top": 238.33333333333334,
-        "start": [0, 0],
-        "end": [354.8148148148148, 0],
-        "points": ["", ""],
-        "color": "#5b9bd5",
-        "style": "solid",
-        "width": 4
-      },
-      {
-        "type": "shape",
-        "id": "09wqWw",
-        "left": -27.648148148148138,
-        "top": 432.73148148148147,
-        "width": 1056.2962962962963,
-        "height": 162.96296296296296,
-        "viewBox": [200, 200],
-        "path": "M 0 20 C 40 -40 60 60 100 20 C 140 -40 160 60 200 20 L 200 180 C 140 240 160 140 100 180 C 40 240 60 140 0 180 L 0 20 Z",
-        "fill": "#5b9bd5",
-        "fixedRatio": false,
-        "rotate": 0
-      }
-    ],
-    "background": {
-      "type": "solid",
-      "color": "#fff"
-    }
-  },
-  {
-    "id": "test-slide-3",
-    "elements": [
-      {
-        "type": "shape",
-        "id": "vSheCJ",
-        "left": 183.5185185185185,
-        "top": 175.5092592592593,
-        "width": 605.1851851851851,
-        "height": 185.18518518518516,
-        "viewBox": [200, 200],
-        "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
-        "fill": "#5b9bd5",
-        "fixedRatio": false,
-        "rotate": 0
-      },
-      {
-        "type": "shape",
-        "id": "Mpwv7x",
-        "left": 211.29629629629628,
-        "top": 201.80555555555557,
-        "width": 605.1851851851851,
-        "height": 185.18518518518516,
-        "viewBox": [200, 200],
-        "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
-        "fill": "#5b9bd5",
-        "fixedRatio": false,
-        "rotate": 0,
-        "opacity": 0.7
-      },
-      {
-        "type": "text",
-        "id": "WQOTAp",
-        "left": 304.9074074074074,
-        "top": 198.10185185185182,
-        "width": 417.9629629629629,
-        "height": 140,
-        "content": "<p style=\"text-align: center;\"><strong><span style=\"font-size: 80px;\"><span style=\"color: rgb(255, 255, 255);\">感谢观看</span></span></strong></p>",
-        "rotate": 0,
-        "defaultFontName": "",
-        "defaultColor": "#333",
-        "wordSpace": 5
-      }
-    ],
+    "elements": [],
     "background": {
       "type": "solid",
       "color": "#fff"

+ 184 - 0
public/mocks/slides2.json

@@ -0,0 +1,184 @@
+[
+  {
+    "id": "test-slide-1",
+    "elements": [
+      {
+        "type": "shape",
+        "id": "4cbRxp",
+        "left": 0,
+        "top": 200,
+        "width": 546,
+        "height": 362.5,
+        "viewBox": [200, 200],
+        "path": "M 0 0 L 0 200 L 200 200 Z",
+        "fill": "#5b9bd5",
+        "fixedRatio": false,
+        "opacity": 0.7,
+        "rotate": 0
+      },
+      {
+        "type": "shape",
+        "id": "ookHrf",
+        "left": 0,
+        "top": 0,
+        "width": 300,
+        "height": 320,
+        "viewBox": [200, 200],
+        "path": "M 0 0 L 0 200 L 200 200 Z",
+        "fill": "#5b9bd5",
+        "fixedRatio": false,
+        "flipV": true,
+        "rotate": 0
+      },
+      {
+        "type": "text",
+        "id": "idn7Mx",
+        "left": 355,
+        "top": 65.25,
+        "width": 450,
+        "height": 188,
+        "lineHeight": 1.2,
+        "content": "<p><strong><span style=\"font-size: 112px;\">PPTist</span></strong></p>",
+        "rotate": 0,
+        "defaultFontName": "",
+        "defaultColor": "#333"
+      },
+      {
+        "type": "text",
+        "id": "7stmVP",
+        "left": 355,
+        "top": 253.25,
+        "width": 585,
+        "height": 56,
+        "content": "<p><span style=\"font-size: 24px;\">基于 Vue 3.x + TypeScript 的在线演示文稿应用</span></p>",
+        "rotate": 0,
+        "defaultFontName": "",
+        "defaultColor": "#333"
+      },
+      {
+        "type": "line",
+        "id": "FnpZs4",
+        "left": 361,
+        "top": 238,
+        "start": [0, 0],
+        "end": [549, 0],
+        "points": ["", ""],
+        "color": "#5b9bd5",
+        "style": "solid",
+        "width": 2
+      }
+    ],
+    "background": {
+      "type": "solid",
+      "color": "#ffffff"
+    }
+  },
+  {
+    "id": "test-slide-2",
+    "elements": [
+      {
+        "type": "text",
+        "id": "ptNnUJ",
+        "left": 145,
+        "top": 148,
+        "width": 711,
+        "height": 77,
+        "lineHeight": 1.2,
+        "content": "<p style=\"text-align: center;\"><strong><span style=\"font-size: 48px;\">在此处添加标题</span></strong></p>",
+        "rotate": 0,
+        "defaultFontName": "",
+        "defaultColor": "#333"
+      },
+      {
+        "type": "text",
+        "id": "mRHvQN",
+        "left": 207.50000000000003,
+        "top": 249.84259259259264,
+        "width": 585,
+        "height": 56,
+        "content": "<p style=\"text-align: center;\"><span style=\"font-size: 24px;\">在此处添加副标题</span></p>",
+        "rotate": 0,
+        "defaultFontName": "",
+        "defaultColor": "#333"
+      },
+      {
+        "type": "line",
+        "id": "7CQDwc",
+        "left": 323.09259259259267,
+        "top": 238.33333333333334,
+        "start": [0, 0],
+        "end": [354.8148148148148, 0],
+        "points": ["", ""],
+        "color": "#5b9bd5",
+        "style": "solid",
+        "width": 4
+      },
+      {
+        "type": "shape",
+        "id": "09wqWw",
+        "left": -27.648148148148138,
+        "top": 432.73148148148147,
+        "width": 1056.2962962962963,
+        "height": 162.96296296296296,
+        "viewBox": [200, 200],
+        "path": "M 0 20 C 40 -40 60 60 100 20 C 140 -40 160 60 200 20 L 200 180 C 140 240 160 140 100 180 C 40 240 60 140 0 180 L 0 20 Z",
+        "fill": "#5b9bd5",
+        "fixedRatio": false,
+        "rotate": 0
+      }
+    ],
+    "background": {
+      "type": "solid",
+      "color": "#fff"
+    }
+  },
+  {
+    "id": "test-slide-3",
+    "elements": [
+      {
+        "type": "shape",
+        "id": "vSheCJ",
+        "left": 183.5185185185185,
+        "top": 175.5092592592593,
+        "width": 605.1851851851851,
+        "height": 185.18518518518516,
+        "viewBox": [200, 200],
+        "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
+        "fill": "#5b9bd5",
+        "fixedRatio": false,
+        "rotate": 0
+      },
+      {
+        "type": "shape",
+        "id": "Mpwv7x",
+        "left": 211.29629629629628,
+        "top": 201.80555555555557,
+        "width": 605.1851851851851,
+        "height": 185.18518518518516,
+        "viewBox": [200, 200],
+        "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
+        "fill": "#5b9bd5",
+        "fixedRatio": false,
+        "rotate": 0,
+        "opacity": 0.7
+      },
+      {
+        "type": "text",
+        "id": "WQOTAp",
+        "left": 304.9074074074074,
+        "top": 198.10185185185182,
+        "width": 417.9629629629629,
+        "height": 140,
+        "content": "<p style=\"text-align: center;\"><strong><span style=\"font-size: 80px;\"><span style=\"color: rgb(255, 255, 255);\">感谢观看</span></span></strong></p>",
+        "rotate": 0,
+        "defaultFontName": "",
+        "defaultColor": "#333",
+        "wordSpace": 5
+      }
+    ],
+    "background": {
+      "type": "solid",
+      "color": "#fff"
+    }
+  }
+]

+ 4 - 3
src/App.vue

@@ -99,10 +99,11 @@ if (import.meta.env.MODE !== 'development') {
 
 onMounted(async () => {
   const slides = await api.getFileData('slides')
+  console.log(slides) 
   slidesStore.setSlides(slides)
-
-  await deleteDiscardedDB()
-  snapshotStore.initSnapshotDatabase()
+  // 初始化快照数据库
+  // await deleteDiscardedDB()
+  // snapshotStore.initSnapshotDatabase()
   
   // 监听视图模式切换事件
   window.addEventListener('viewModeChanged', (event: any) => {

+ 68 - 4
src/services/config.ts

@@ -1,10 +1,74 @@
 import axios from 'axios'
 import message from '@/utils/message'
+import qs from 'qs'
 
 const instance = axios.create({ timeout: 1000 * 300 })
 
+// POST传参序列化(添加请求拦截器)
+
+instance.interceptors.request.use(
+  (config) => {
+    // 修复 config.url 可能为 undefined 的问题
+    const url = config.url ?? ''
+    // 修复 config.data 可能为 undefined 的问题
+    const data = config.data ?? {}
+
+    // 需要 form-urlencoded 且 data 为数组的情况
+    if (
+      config.method === 'post' &&
+      (
+        url.includes('http://localhost:7003/api/pbl/') ||
+        url.includes('https://pbl.cocorobo.cn/api/mongo/') ||
+        url.includes('https://pbl.cocorobo.cn/api/pbl/') ||
+        url.includes('https://r2rapi.cocorobo.cn/') ||
+        url.includes('http://10.1.82.64:7004/file/')
+      )
+    ) {
+      // 修复 headers 类型问题
+      if (config.headers) {
+        config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
+      }
+      else {
+        // @ts-ignore
+        config.headers = { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
+      }
+      // 处理 data[0] 为对象的情况
+      const encoded: Record<string, any> = {}
+      if (Array.isArray(data) && data.length > 0 && typeof data[0] === 'object') {
+        for (const key in data[0]) {
+          if (Object.prototype.hasOwnProperty.call(data[0], key)) {
+            encoded[key] = encodeURIComponent(data[0][key])
+          }
+        }
+        config.data = qs.stringify([encoded]) // 序列化post参数
+      }
+    }
+    // 需要对 data 进行 encode 的情况
+    else if (
+      url.includes('http://localhost:7003/api/pbl/') ||
+      url.includes('https://pbl.cocorobo.cn/api/mongo/') ||
+      url.includes('https://pbl.cocorobo.cn/api/pbl/') ||
+      url.includes('https://r2rapi.cocorobo.cn/')
+    ) {
+      const encoded: Record<string, any> = {}
+      for (const key in data) {
+        if (Object.prototype.hasOwnProperty.call(data, key)) {
+          encoded[key] = encodeURIComponent(data[key])
+        }
+      }
+      config.data = encoded
+    }
+
+    return config
+  },
+  (error) => {
+    console.log('错误的传参')
+    return Promise.reject(error)
+  }
+)
+
 instance.interceptors.response.use(
-  response => {
+  (response) => {
     if (response.status >= 200 && response.status < 400) {
       return Promise.resolve(response.data)
     }
@@ -12,7 +76,7 @@ instance.interceptors.response.use(
     message.error('未知的请求错误!')
     return Promise.reject(response)
   },
-  error => {
+  (error) => {
     if (error && error.response) {
       if (error.response.status >= 400 && error.response.status < 500) {
         return Promise.reject(error.message)
@@ -20,7 +84,7 @@ instance.interceptors.response.use(
       else if (error.response.status >= 500) {
         return Promise.reject(error.message)
       }
-      
+
       message.error('服务器遇到未知错误!')
       return Promise.reject(error.message)
     }
@@ -30,4 +94,4 @@ instance.interceptors.response.use(
   }
 )
 
-export default instance
+export default instance

+ 14 - 0
src/services/course.ts

@@ -0,0 +1,14 @@
+import axios from './config'
+
+// export const SERVER_URL = 'http://localhost:5000'
+export const API_URL = 'https://pbl.cocorobo.cn/api/pbl/'
+
+export default {
+  getCourseDetail(courseId: string): Promise<any> {
+    return axios.get(`${API_URL}selectCourseDetail3`, {
+      params: {
+        courseId,
+      },
+    })
+  },
+}

+ 2 - 1
src/services/index.ts

@@ -3,6 +3,7 @@ import axios from './config'
 // export const SERVER_URL = 'http://localhost:5000'
 export const SERVER_URL = (import.meta.env.MODE === 'development') ? '/api' : 'https://server.pptist.cn'
 export const ASSET_URL = 'https://asset.pptist.cn'
+export const API_URL = 'https://pbl.cocorobo.cn/api/pbl/'
 
 interface AIPPTOutlinePayload {
   content: string
@@ -28,7 +29,7 @@ export default {
   },
 
   getFileData(filename: string): Promise<any> {
-	  //return axios.get(`${ASSET_URL}/data/${filename}.json`)
+	  // return axios.get(`${ASSET_URL}/data/${filename}.json`)
 	  return axios.get(`./mocks/${filename}.json`)
   },
 

+ 29 - 4
src/views/Editor/Canvas/index.vue

@@ -151,6 +151,18 @@ import Operate from './Operate/index.vue'
 import LinkDialog from './LinkDialog.vue'
 import WebpageLinkEditDialog from './WebpageLinkEditDialog.vue'
 import Modal from '@/components/Modal.vue'
+import api from '@/services/course'
+import useImport from '@/hooks/useImport'
+
+
+// 定义组件props
+interface Props {
+  courseid?: string | null
+}
+
+const props = withDefaults(defineProps<Props>(), {
+  courseid: null,
+})
 
 const mainStore = useMainStore()
 const {
@@ -214,6 +226,7 @@ const { pasteElement } = useCopyAndPasteElement()
 const { enterScreeningFromStart } = useScreening()
 const { updateSlideIndex } = useSlideHandler()
 const { createTextElement, createShapeElement } = useCreateElement()
+const { readJSON } = useImport()
 
 // 组件渲染时,如果存在元素焦点,需要清除
 // 这种情况存在于:有焦点元素的情况下进入了放映模式,再退出时,需要清除原先的焦点(因为可能已经切换了页面)
@@ -221,8 +234,20 @@ onMounted(() => {
   if (activeElementIdList.value.length) {
     nextTick(() => mainStore.setActiveElementIdList([]))
   }
+  if (props.courseid) {
+    getCourseDetail()
+  }
 })
 
+const getCourseDetail = async () => {
+  const res = await api.getCourseDetail(props.courseid as string)
+  console.log(res)
+  const courseDetail = res[0][0]
+  const pptdata = JSON.parse(courseDetail.chapters).pptData ? JSON.parse(courseDetail.chapters).pptData : []
+  readJSON(pptdata, true)
+}
+
+
 // 点击画布的空白区域:清空焦点元素、设置画布焦点、清除文字选区、清空格式刷状态
 const handleClickBlankArea = (e: MouseEvent) => {
   if (activeElementIdList.value.length) mainStore.setActiveElementIdList([])
@@ -276,10 +301,10 @@ const handleMousewheelCanvas = (e: WheelEvent) => {
     else if (e.deltaY < 0) throttleScaleCanvas('+')
   }
   // 上下翻页
-  else {
-    if (e.deltaY > 0) throttleUpdateSlideIndex(KEYS.DOWN)
-    else if (e.deltaY < 0) throttleUpdateSlideIndex(KEYS.UP)
-  }
+  // else {
+  //   if (e.deltaY > 0) throttleUpdateSlideIndex(KEYS.DOWN)
+  //   else if (e.deltaY < 0) throttleUpdateSlideIndex(KEYS.UP)
+  // }
 }
 
 // 开关标尺

+ 8 - 1
src/views/Editor/index.vue

@@ -5,7 +5,7 @@
       <Thumbnails class="layout-content-left" />
       <div class="layout-content-center">
         <CanvasTool class="center-top" />
-        <Canvas class="center-body" :style="{ height: `calc(100% - ${remarkHeight + 40}px)` }" />
+        <Canvas class="center-body" :style="{ height: `calc(100% - ${remarkHeight + 40}px)` }" :courseid="props.courseid"/>
         <Remark
           class="center-bottom" 
           v-model:height="remarkHeight" 
@@ -61,7 +61,14 @@ import NotesPanel from './NotesPanel.vue'
 import MarkupPanel from './MarkupPanel.vue'
 import AIPPTDialog from './AIPPTDialog.vue'
 import Modal from '@/components/Modal.vue'
+// 定义组件props
+interface Props {
+  courseid?: string | null
+}
 
+const props = withDefaults(defineProps<Props>(), {
+  courseid: null,
+})
 const mainStore = useMainStore()
 const { dialogForExport, showSelectPanel, showSearchPanel, showNotesPanel, showMarkupPanel, showAIPPTDialog } = storeToRefs(mainStore)
 const closeExportDialog = () => mainStore.setDialogForExport('')

+ 13 - 2
src/views/Student/index.vue

@@ -109,7 +109,7 @@
     <div class="layout-content-right" v-show="type == '1'">
       <div class="thumbnails">
         <div class="viewer-header">
-          <h3>左侧导航</h3>
+          <h3>作业区</h3>
         </div>
       </div>
     </div>
@@ -117,7 +117,7 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, ref, onMounted, onUnmounted, nextTick, inject } from 'vue'
+import { computed, ref, onMounted, onUnmounted, nextTick, inject, watch } from 'vue'
 import { storeToRefs } from 'pinia'
 import { useSlidesStore } from '@/store'
 import { ElementTypes } from '@/types/slides'
@@ -131,6 +131,7 @@ import CountdownTimer from '@/views/Screen/CountdownTimer.vue'
 import useSlideBackgroundStyle from '@/hooks/useSlideBackgroundStyle'
 import useImport from '@/hooks/useImport'
 import message from '@/utils/message'
+import api from '@/services/course'
 
 // 定义组件props
 interface Props {
@@ -675,6 +676,14 @@ const handleViewportSizeUpdated = (event: any) => {
   })
 }
 
+const getCourseDetail = async () => {
+  const res = await api.getCourseDetail(props.courseid as string)
+  console.log(res)
+  const courseDetail = res[0][0]
+  const pptdata = JSON.parse(courseDetail.chapters).pptData ? JSON.parse(courseDetail.chapters).pptData : []
+  importJSON(pptdata)
+}
+
 onMounted(() => {
   document.addEventListener('keydown', handleKeydown)
 
@@ -694,6 +703,7 @@ onMounted(() => {
       // TODO: 根据type设置特定的显示模式或功能
     }
   }
+  getCourseDetail()
 
   // 计算初始缩放比例
   nextTick(() => {
@@ -736,6 +746,7 @@ onMounted(() => {
   console.log('URL参数:', { courseid: props.courseid, type: props.type })
 })
 
+
 onUnmounted(() => {
   document.removeEventListener('keydown', handleKeydown)
   window.removeEventListener('resize', calculateScale)