提交 50c8fca1 authored 作者: 王鹏飞's avatar 王鹏飞

feat: 新增知识点

上级 6b4e5045
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
"axios": "^0.27.2", "axios": "^0.27.2",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"dayjs": "^1.11.3", "dayjs": "^1.11.3",
"echarts": "^5.3.2", "echarts": "^5.6.0",
"element-plus": "^2.2.9", "element-plus": "^2.2.9",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"pinia": "^2.0.14", "pinia": "^2.0.14",
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
"sortablejs": "^1.15.0", "sortablejs": "^1.15.0",
"video.js": "^7.19.2", "video.js": "^7.19.2",
"vue": "^3.2.37", "vue": "^3.2.37",
"vue-echarts": "^7.0.3",
"vue-router": "^4.0.16" "vue-router": "^4.0.16"
}, },
"devDependencies": { "devDependencies": {
...@@ -172,12 +173,10 @@ ...@@ -172,12 +173,10 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.18.3", "version": "7.27.6",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.3.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"dependencies": { "license": "MIT",
"regenerator-runtime": "^0.13.4"
},
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
...@@ -285,6 +284,66 @@ ...@@ -285,6 +284,66 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.10.tgz",
"integrity": "sha512-HM2F4B9N4cA0RH2KQiIZOHAZqtP4xGS4IZ+SFe1SIbO4dyjf9MTY2Bo3vHYnm0hglWfXqBrzUBSa+cJfl3Xvrg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.8.tgz",
"integrity": "sha512-3EDAPd0B8X1gsQQgGHU8vyxSp2MB414z3roN67fY7nI0GV3GDthHfaWcbCfrC95tpAzA5xUvAuoO9Dxx/ywwRQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.2.tgz",
"integrity": "sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.27",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.27.tgz",
"integrity": "sha512-VO95AxtSFMelbg3ouljAYnfvTEwSWVt/2YLf+U5Ejd8iT5mXE2Sa/1LGyvySMne2CGsepGLI7KpF3EzE3Aq9Mg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@nodelib/fs.scandir": { "node_modules/@nodelib/fs.scandir": {
"version": "2.1.5", "version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
...@@ -542,11 +601,47 @@ ...@@ -542,11 +601,47 @@
"integrity": "sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==", "integrity": "sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==",
"dev": true "dev": true
}, },
"node_modules/@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
"version": "3.7.7",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/@types/json-schema": { "node_modules/@types/json-schema": {
"version": "7.0.11", "version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/@types/lodash": { "node_modules/@types/lodash": {
"version": "4.14.182", "version": "4.14.182",
...@@ -1057,37 +1152,203 @@ ...@@ -1057,37 +1152,203 @@
} }
} }
}, },
"node_modules/@vueuse/core/node_modules/vue-demi": { "node_modules/@vueuse/metadata": {
"version": "0.13.2", "version": "8.9.0",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.2.tgz", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.0.tgz",
"integrity": "sha512-41ukrclEbMddAyP7PvxMSYqnOSzPV6r7GNnyTSKSCNTaz19GehxmTiXyP9kwHSUv2+Dr6hHqiUiF7L1VAw2KdQ==", "integrity": "sha512-pjkIbQgJPRUrxK5/iXVKQFGC+OhJ+Vd6fhBsdwgj+NNJEHUotRliYymwdvhnEke/o+kkulT0xMvoK19nyPoiMw==",
"hasInstallScript": true,
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": { "funding": {
"url": "https://github.com/sponsors/antfu" "url": "https://github.com/sponsors/antfu"
}
}, },
"peerDependencies": { "node_modules/@webassemblyjs/ast": {
"@vue/composition-api": "^1.0.0-rc.1", "version": "1.14.1",
"vue": "^3.0.0-0 || ^2.6.0" "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/helper-numbers": "1.13.2",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2"
}
}, },
"peerDependenciesMeta": { "node_modules/@webassemblyjs/floating-point-hex-parser": {
"@vue/composition-api": { "version": "1.13.2",
"optional": true "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-api-error": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
"@webassemblyjs/helper-api-error": "1.13.2",
"@xtuc/long": "4.2.2"
} }
},
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/wasm-gen": "1.14.1"
} }
}, },
"node_modules/@vueuse/metadata": { "node_modules/@webassemblyjs/ieee754": {
"version": "8.9.0", "version": "1.13.2",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
"integrity": "sha512-pjkIbQgJPRUrxK5/iXVKQFGC+OhJ+Vd6fhBsdwgj+NNJEHUotRliYymwdvhnEke/o+kkulT0xMvoK19nyPoiMw==", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
"funding": { "dev": true,
"url": "https://github.com/sponsors/antfu" "license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
},
"node_modules/@webassemblyjs/leb128": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"peer": true,
"dependencies": {
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/utf8": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
"integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/helper-wasm-section": "1.14.1",
"@webassemblyjs/wasm-gen": "1.14.1",
"@webassemblyjs/wasm-opt": "1.14.1",
"@webassemblyjs/wasm-parser": "1.14.1",
"@webassemblyjs/wast-printer": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
"integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/ieee754": "1.13.2",
"@webassemblyjs/leb128": "1.13.2",
"@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wasm-opt": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
"integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/wasm-gen": "1.14.1",
"@webassemblyjs/wasm-parser": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-api-error": "1.13.2",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/ieee754": "1.13.2",
"@webassemblyjs/leb128": "1.13.2",
"@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wast-printer": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
"integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@xtuc/long": "4.2.2"
} }
}, },
"node_modules/@xmldom/xmldom": { "node_modules/@xmldom/xmldom": {
...@@ -1098,11 +1359,30 @@ ...@@ -1098,11 +1359,30 @@
"node": ">=10.0.0" "node": ">=10.0.0"
} }
}, },
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true,
"license": "BSD-3-Clause",
"optional": true,
"peer": true
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"peer": true
},
"node_modules/acorn": { "node_modules/acorn": {
"version": "8.7.1", "version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true, "dev": true,
"license": "MIT",
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
...@@ -1188,6 +1468,54 @@ ...@@ -1188,6 +1468,54 @@
"url": "https://github.com/sponsors/epoberezkin" "url": "https://github.com/sponsors/epoberezkin"
} }
}, },
"node_modules/ajv-formats": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"ajv": "^8.0.0"
},
"peerDependencies": {
"ajv": "^8.0.0"
},
"peerDependenciesMeta": {
"ajv": {
"optional": true
}
}
},
"node_modules/ajv-formats/node_modules/ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-formats/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/ali-oss": { "node_modules/ali-oss": {
"version": "6.17.1", "version": "6.17.1",
"resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.17.1.tgz", "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.17.1.tgz",
...@@ -1421,6 +1749,50 @@ ...@@ -1421,6 +1749,50 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/browserslist": {
"version": "4.25.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001726",
"electron-to-chromium": "^1.5.173",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.3"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/builtin-status-codes": { "node_modules/builtin-status-codes": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
...@@ -1457,6 +1829,29 @@ ...@@ -1457,6 +1829,29 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/caniuse-lite": {
"version": "1.0.30001726",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz",
"integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "CC-BY-4.0",
"optional": true,
"peer": true
},
"node_modules/chalk": { "node_modules/chalk": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
...@@ -1508,6 +1903,18 @@ ...@@ -1508,6 +1903,18 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/chrome-trace-event": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
"integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">=6.0"
}
},
"node_modules/color-convert": { "node_modules/color-convert": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
...@@ -1766,12 +2173,13 @@ ...@@ -1766,12 +2173,13 @@
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
}, },
"node_modules/echarts": { "node_modules/echarts": {
"version": "5.3.2", "version": "5.6.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.3.2.tgz", "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
"integrity": "sha512-LWCt7ohOKdJqyiBJ0OGBmE9szLdfA9sGcsMEi+GGoc6+Xo75C+BkcT/6NNGRHAWtnQl2fNow05AQjznpap28TQ==", "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"tslib": "2.3.0", "tslib": "2.3.0",
"zrender": "5.3.1" "zrender": "5.6.1"
} }
}, },
"node_modules/echarts/node_modules/tslib": { "node_modules/echarts/node_modules/tslib": {
...@@ -1785,6 +2193,15 @@ ...@@ -1785,6 +2193,15 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true "dev": true
}, },
"node_modules/electron-to-chromium": {
"version": "1.5.177",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz",
"integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==",
"dev": true,
"license": "ISC",
"optional": true,
"peer": true
},
"node_modules/element-plus": { "node_modules/element-plus": {
"version": "2.2.9", "version": "2.2.9",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.9.tgz", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.9.tgz",
...@@ -1828,6 +2245,31 @@ ...@@ -1828,6 +2245,31 @@
"node": ">= 0.11.14" "node": ">= 0.11.14"
} }
}, },
"node_modules/enhanced-resolve": {
"version": "5.18.2",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
"integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/es-module-lexer": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
"integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.15.18", "version": "0.15.18",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
...@@ -2206,6 +2648,18 @@ ...@@ -2206,6 +2648,18 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/escape-html": { "node_modules/escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
...@@ -2547,6 +3001,18 @@ ...@@ -2547,6 +3001,18 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/extend-shallow": { "node_modules/extend-shallow": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
...@@ -2605,6 +3071,25 @@ ...@@ -2605,6 +3071,25 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true "dev": true
}, },
"node_modules/fast-uri": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fastify"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fastify"
}
],
"license": "BSD-3-Clause",
"optional": true,
"peer": true
},
"node_modules/fastq": { "node_modules/fastq": {
"version": "1.13.0", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
...@@ -2864,6 +3349,15 @@ ...@@ -2864,6 +3349,15 @@
"node": ">=10.13.0" "node": ">=10.13.0"
} }
}, },
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true,
"license": "BSD-2-Clause",
"optional": true,
"peer": true
},
"node_modules/global": { "node_modules/global": {
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz", "resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz",
...@@ -2909,10 +3403,11 @@ ...@@ -2909,10 +3403,11 @@
} }
}, },
"node_modules/graceful-fs": { "node_modules/graceful-fs": {
"version": "4.2.10", "version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true "dev": true,
"license": "ISC"
}, },
"node_modules/has": { "node_modules/has": {
"version": "1.0.3", "version": "1.0.3",
...@@ -3205,6 +3700,41 @@ ...@@ -3205,6 +3700,41 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true "dev": true
}, },
"node_modules/jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/jest-worker/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/js-base64": { "node_modules/js-base64": {
"version": "2.6.4", "version": "2.6.4",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
...@@ -3229,6 +3759,15 @@ ...@@ -3229,6 +3759,15 @@
"js-yaml": "bin/js-yaml.js" "js-yaml": "bin/js-yaml.js"
} }
}, },
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/json-schema-traverse": { "node_modules/json-schema-traverse": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
...@@ -3289,6 +3828,18 @@ ...@@ -3289,6 +3828,18 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">=6.11.5"
}
},
"node_modules/local-pkg": { "node_modules/local-pkg": {
"version": "0.4.2", "version": "0.4.2",
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz",
...@@ -3380,6 +3931,15 @@ ...@@ -3380,6 +3931,15 @@
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
"dev": true "dev": true
}, },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/merge2": { "node_modules/merge2": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
...@@ -3581,6 +4141,15 @@ ...@@ -3581,6 +4141,15 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true "dev": true
}, },
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/netmask": { "node_modules/netmask": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
...@@ -3590,6 +4159,15 @@ ...@@ -3590,6 +4159,15 @@
"node": ">= 0.4.0" "node": ">= 0.4.0"
} }
}, },
"node_modules/node-releases": {
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/normalize-path": { "node_modules/normalize-path": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
...@@ -3798,9 +4376,9 @@ ...@@ -3798,9 +4376,9 @@
} }
}, },
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.1.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC" "license": "ISC"
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
...@@ -3840,31 +4418,6 @@ ...@@ -3840,31 +4418,6 @@
} }
} }
}, },
"node_modules/pinia/node_modules/vue-demi": {
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz",
"integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==",
"hasInstallScript": true,
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/pkcs7": { "node_modules/pkcs7": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmmirror.com/pkcs7/-/pkcs7-1.0.4.tgz", "resolved": "https://registry.npmmirror.com/pkcs7/-/pkcs7-1.0.4.tgz",
...@@ -4050,6 +4603,18 @@ ...@@ -4050,6 +4603,18 @@
} }
] ]
}, },
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"safe-buffer": "^5.1.0"
}
},
"node_modules/raw-body": { "node_modules/raw-body": {
"version": "2.5.1", "version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
...@@ -4092,11 +4657,6 @@ ...@@ -4092,11 +4657,6 @@
"node": ">=8.10.0" "node": ">=8.10.0"
} }
}, },
"node_modules/regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
},
"node_modules/regexpp": { "node_modules/regexpp": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
...@@ -4109,6 +4669,18 @@ ...@@ -4109,6 +4669,18 @@
"url": "https://github.com/sponsors/mysticatea" "url": "https://github.com/sponsors/mysticatea"
} }
}, },
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resolve": { "node_modules/resolve": {
"version": "1.22.8", "version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
...@@ -4251,6 +4823,71 @@ ...@@ -4251,6 +4823,71 @@
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true "dev": true
}, },
"node_modules/schema-utils": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
"integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/schema-utils/node_modules/ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/schema-utils/node_modules/ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/schema-utils/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/scule": { "node_modules/scule": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/scule/-/scule-0.2.1.tgz", "resolved": "https://registry.npmjs.org/scule/-/scule-0.2.1.tgz",
...@@ -4281,6 +4918,18 @@ ...@@ -4281,6 +4918,18 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/serialize-javascript": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"dev": true,
"license": "BSD-3-Clause",
"optional": true,
"peer": true,
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/setprototypeof": { "node_modules/setprototypeof": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
...@@ -4390,6 +5039,19 @@ ...@@ -4390,6 +5039,19 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/sourcemap-codec": { "node_modules/sourcemap-codec": {
"version": "1.4.8", "version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
...@@ -4496,6 +5158,85 @@ ...@@ -4496,6 +5158,85 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/tapable": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
"integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/terser": {
"version": "5.43.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
"integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
"dev": true,
"license": "BSD-2-Clause",
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.14.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.14",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
"integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
"serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.1.0"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"esbuild": {
"optional": true
},
"uglify-js": {
"optional": true
}
}
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/text-table": { "node_modules/text-table": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
...@@ -4776,6 +5517,39 @@ ...@@ -4776,6 +5517,39 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/update-browserslist-db": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"escalade": "^3.2.0",
"picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
},
"node_modules/uri-js": { "node_modules/uri-js": {
"version": "4.4.1", "version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
...@@ -5109,6 +5883,51 @@ ...@@ -5109,6 +5883,51 @@
"@vue/shared": "3.2.37" "@vue/shared": "3.2.37"
} }
}, },
"node_modules/vue-demi": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/vue-echarts": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-7.0.3.tgz",
"integrity": "sha512-/jSxNwOsw5+dYAUcwSfkLwKPuzTQ0Cepz1LxCOpj2QcHrrmUa/Ql0eQqMmc1rTPQVrh2JQ29n2dhq75ZcHvRDw==",
"license": "MIT",
"dependencies": {
"vue-demi": "^0.13.11"
},
"peerDependencies": {
"@vue/runtime-core": "^3.0.0",
"echarts": "^5.5.1",
"vue": "^2.7.0 || ^3.1.1"
},
"peerDependenciesMeta": {
"@vue/runtime-core": {
"optional": true
}
}
},
"node_modules/vue-eslint-parser": { "node_modules/vue-eslint-parser": {
"version": "8.3.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
...@@ -5184,6 +6003,72 @@ ...@@ -5184,6 +6003,72 @@
"typescript": "*" "typescript": "*"
} }
}, },
"node_modules/watchpack": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
"integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/webpack": {
"version": "5.99.9",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz",
"integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.6",
"@types/json-schema": "^7.0.15",
"@webassemblyjs/ast": "^1.14.1",
"@webassemblyjs/wasm-edit": "^1.14.1",
"@webassemblyjs/wasm-parser": "^1.14.1",
"acorn": "^8.14.0",
"browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.17.1",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.2.11",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
"schema-utils": "^4.3.2",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.11",
"watchpack": "^2.4.1",
"webpack-sources": "^3.2.3"
},
"bin": {
"webpack": "bin/webpack.js"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependenciesMeta": {
"webpack-cli": {
"optional": true
}
}
},
"node_modules/webpack-sources": { "node_modules/webpack-sources": {
"version": "3.2.3", "version": "3.2.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
...@@ -5297,9 +6182,10 @@ ...@@ -5297,9 +6182,10 @@
"dev": true "dev": true
}, },
"node_modules/zrender": { "node_modules/zrender": {
"version": "5.3.1", "version": "5.6.1",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.3.1.tgz", "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz",
"integrity": "sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw==", "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
"license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"tslib": "2.3.0" "tslib": "2.3.0"
} }
...@@ -5307,7 +6193,8 @@ ...@@ -5307,7 +6193,8 @@
"node_modules/zrender/node_modules/tslib": { "node_modules/zrender/node_modules/tslib": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
"license": "0BSD"
} }
}, },
"dependencies": { "dependencies": {
...@@ -5407,12 +6294,9 @@ ...@@ -5407,12 +6294,9 @@
"integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==" "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg=="
}, },
"@babel/runtime": { "@babel/runtime": {
"version": "7.18.3", "version": "7.27.6",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.3.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q=="
"requires": {
"regenerator-runtime": "^0.13.4"
}
}, },
"@ctrl/tinycolor": { "@ctrl/tinycolor": {
"version": "3.4.1", "version": "3.4.1",
...@@ -5486,6 +6370,58 @@ ...@@ -5486,6 +6370,58 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"@jridgewell/gen-mapping": {
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.10.tgz",
"integrity": "sha512-HM2F4B9N4cA0RH2KQiIZOHAZqtP4xGS4IZ+SFe1SIbO4dyjf9MTY2Bo3vHYnm0hglWfXqBrzUBSa+cJfl3Xvrg==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"optional": true,
"peer": true
},
"@jridgewell/source-map": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.8.tgz",
"integrity": "sha512-3EDAPd0B8X1gsQQgGHU8vyxSp2MB414z3roN67fY7nI0GV3GDthHfaWcbCfrC95tpAzA5xUvAuoO9Dxx/ywwRQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"@jridgewell/sourcemap-codec": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.2.tgz",
"integrity": "sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==",
"dev": true,
"optional": true,
"peer": true
},
"@jridgewell/trace-mapping": {
"version": "0.3.27",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.27.tgz",
"integrity": "sha512-VO95AxtSFMelbg3ouljAYnfvTEwSWVt/2YLf+U5Ejd8iT5mXE2Sa/1LGyvySMne2CGsepGLI7KpF3EzE3Aq9Mg==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"@nodelib/fs.scandir": { "@nodelib/fs.scandir": {
"version": "2.1.5", "version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
...@@ -5670,10 +6606,42 @@ ...@@ -5670,10 +6606,42 @@
"integrity": "sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==", "integrity": "sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==",
"dev": true "dev": true
}, },
"@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"@types/eslint-scope": {
"version": "3.7.7",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"optional": true,
"peer": true
},
"@types/json-schema": { "@types/json-schema": {
"version": "7.0.11", "version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true "dev": true
}, },
"@types/lodash": { "@types/lodash": {
...@@ -6000,59 +6968,245 @@ ...@@ -6000,59 +6968,245 @@
"@vue/shared": "3.2.37" "@vue/shared": "3.2.37"
} }
}, },
"@vue/shared": { "@vue/shared": {
"version": "3.2.37", "version": "3.2.37",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
"integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==" "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw=="
}, },
"@vue/tsconfig": { "@vue/tsconfig": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.1.3.tgz", "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.1.3.tgz",
"integrity": "sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==", "integrity": "sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==",
"dev": true,
"requires": {}
},
"@vueuse/core": {
"version": "8.9.0",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.0.tgz",
"integrity": "sha512-eKWehF6gsiLYxnYM/1xgDu16bKED7AWvkk56JIFNQes8OKgktr3Jc1wUy8UWIulrnwCXICUu9YUo+Wkq4r2JNw==",
"requires": {
"@types/web-bluetooth": "^0.0.14",
"@vueuse/metadata": "8.9.0",
"@vueuse/shared": "8.9.0",
"vue-demi": "*"
},
"dependencies": {
"@vueuse/shared": {
"version": "8.9.0",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.0.tgz",
"integrity": "sha512-Pmu3Fopk/JJjN8b90uQuFrVCc/RPcSA/0zDFRTyn3YIhoB5ESna/1Sac5WZxK+n82g/ERXHHQTetGI9yxEdPfA==",
"requires": {
"vue-demi": "*"
}
}
}
},
"@vueuse/metadata": {
"version": "8.9.0",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.0.tgz",
"integrity": "sha512-pjkIbQgJPRUrxK5/iXVKQFGC+OhJ+Vd6fhBsdwgj+NNJEHUotRliYymwdvhnEke/o+kkulT0xMvoK19nyPoiMw=="
},
"@webassemblyjs/ast": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@webassemblyjs/helper-numbers": "1.13.2",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2"
}
},
"@webassemblyjs/floating-point-hex-parser": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
"dev": true,
"optional": true,
"peer": true
},
"@webassemblyjs/helper-api-error": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
"dev": true,
"optional": true,
"peer": true
},
"@webassemblyjs/helper-buffer": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
"dev": true,
"optional": true,
"peer": true
},
"@webassemblyjs/helper-numbers": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
"@webassemblyjs/helper-api-error": "1.13.2",
"@xtuc/long": "4.2.2"
}
},
"@webassemblyjs/helper-wasm-bytecode": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
"dev": true,
"optional": true,
"peer": true
},
"@webassemblyjs/helper-wasm-section": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/wasm-gen": "1.14.1"
}
},
"@webassemblyjs/ieee754": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
"integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@xtuc/ieee754": "^1.2.0"
}
},
"@webassemblyjs/leb128": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@xtuc/long": "4.2.2"
}
},
"@webassemblyjs/utf8": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
"dev": true, "dev": true,
"requires": {} "optional": true,
"peer": true
}, },
"@vueuse/core": { "@webassemblyjs/wasm-edit": {
"version": "8.9.0", "version": "1.14.1",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
"integrity": "sha512-eKWehF6gsiLYxnYM/1xgDu16bKED7AWvkk56JIFNQes8OKgktr3Jc1wUy8UWIulrnwCXICUu9YUo+Wkq4r2JNw==", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": { "requires": {
"@types/web-bluetooth": "^0.0.14", "@webassemblyjs/ast": "1.14.1",
"@vueuse/metadata": "8.9.0", "@webassemblyjs/helper-buffer": "1.14.1",
"@vueuse/shared": "8.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"vue-demi": "*" "@webassemblyjs/helper-wasm-section": "1.14.1",
"@webassemblyjs/wasm-gen": "1.14.1",
"@webassemblyjs/wasm-opt": "1.14.1",
"@webassemblyjs/wasm-parser": "1.14.1",
"@webassemblyjs/wast-printer": "1.14.1"
}
}, },
"dependencies": { "@webassemblyjs/wasm-gen": {
"@vueuse/shared": { "version": "1.14.1",
"version": "8.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.0.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
"integrity": "sha512-Pmu3Fopk/JJjN8b90uQuFrVCc/RPcSA/0zDFRTyn3YIhoB5ESna/1Sac5WZxK+n82g/ERXHHQTetGI9yxEdPfA==", "dev": true,
"optional": true,
"peer": true,
"requires": { "requires": {
"vue-demi": "*" "@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/ieee754": "1.13.2",
"@webassemblyjs/leb128": "1.13.2",
"@webassemblyjs/utf8": "1.13.2"
} }
}, },
"vue-demi": { "@webassemblyjs/wasm-opt": {
"version": "0.13.2", "version": "1.14.1",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.2.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
"integrity": "sha512-41ukrclEbMddAyP7PvxMSYqnOSzPV6r7GNnyTSKSCNTaz19GehxmTiXyP9kwHSUv2+Dr6hHqiUiF7L1VAw2KdQ==", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
"requires": {} "dev": true,
"optional": true,
"peer": true,
"requires": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/wasm-gen": "1.14.1",
"@webassemblyjs/wasm-parser": "1.14.1"
} }
},
"@webassemblyjs/wasm-parser": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-api-error": "1.13.2",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/ieee754": "1.13.2",
"@webassemblyjs/leb128": "1.13.2",
"@webassemblyjs/utf8": "1.13.2"
} }
}, },
"@vueuse/metadata": { "@webassemblyjs/wast-printer": {
"version": "8.9.0", "version": "1.14.1",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
"integrity": "sha512-pjkIbQgJPRUrxK5/iXVKQFGC+OhJ+Vd6fhBsdwgj+NNJEHUotRliYymwdvhnEke/o+kkulT0xMvoK19nyPoiMw==" "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@webassemblyjs/ast": "1.14.1",
"@xtuc/long": "4.2.2"
}
}, },
"@xmldom/xmldom": { "@xmldom/xmldom": {
"version": "0.7.5", "version": "0.7.5",
"resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz", "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz",
"integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==" "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A=="
}, },
"@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true,
"optional": true,
"peer": true
},
"@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true,
"optional": true,
"peer": true
},
"acorn": { "acorn": {
"version": "8.7.1", "version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true "dev": true
}, },
"acorn-jsx": { "acorn-jsx": {
...@@ -6115,6 +7269,41 @@ ...@@ -6115,6 +7269,41 @@
"uri-js": "^4.2.2" "uri-js": "^4.2.2"
} }
}, },
"ajv-formats": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"ajv": "^8.0.0"
},
"dependencies": {
"ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2"
}
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"optional": true,
"peer": true
}
}
},
"ali-oss": { "ali-oss": {
"version": "6.17.1", "version": "6.17.1",
"resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.17.1.tgz", "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.17.1.tgz",
...@@ -6314,6 +7503,28 @@ ...@@ -6314,6 +7503,28 @@
"fill-range": "^7.0.1" "fill-range": "^7.0.1"
} }
}, },
"browserslist": {
"version": "4.25.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"caniuse-lite": "^1.0.30001726",
"electron-to-chromium": "^1.5.173",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.3"
}
},
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"optional": true,
"peer": true
},
"builtin-status-codes": { "builtin-status-codes": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
...@@ -6341,6 +7552,14 @@ ...@@ -6341,6 +7552,14 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true "dev": true
}, },
"caniuse-lite": {
"version": "1.0.30001726",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz",
"integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==",
"dev": true,
"optional": true,
"peer": true
},
"chalk": { "chalk": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz",
...@@ -6374,6 +7593,14 @@ ...@@ -6374,6 +7593,14 @@
} }
} }
}, },
"chrome-trace-event": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
"integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
"dev": true,
"optional": true,
"peer": true
},
"color-convert": { "color-convert": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
...@@ -6569,12 +7796,12 @@ ...@@ -6569,12 +7796,12 @@
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
}, },
"echarts": { "echarts": {
"version": "5.3.2", "version": "5.6.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.3.2.tgz", "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
"integrity": "sha512-LWCt7ohOKdJqyiBJ0OGBmE9szLdfA9sGcsMEi+GGoc6+Xo75C+BkcT/6NNGRHAWtnQl2fNow05AQjznpap28TQ==", "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
"requires": { "requires": {
"tslib": "2.3.0", "tslib": "2.3.0",
"zrender": "5.3.1" "zrender": "5.6.1"
}, },
"dependencies": { "dependencies": {
"tslib": { "tslib": {
...@@ -6590,6 +7817,14 @@ ...@@ -6590,6 +7817,14 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true "dev": true
}, },
"electron-to-chromium": {
"version": "1.5.177",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz",
"integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==",
"dev": true,
"optional": true,
"peer": true
},
"element-plus": { "element-plus": {
"version": "2.2.9", "version": "2.2.9",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.9.tgz", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.9.tgz",
...@@ -6627,6 +7862,26 @@ ...@@ -6627,6 +7862,26 @@
"integrity": "sha1-3HpiEP5403L+4kqLSJnb0VVBTcs=", "integrity": "sha1-3HpiEP5403L+4kqLSJnb0VVBTcs=",
"dev": true "dev": true
}, },
"enhanced-resolve": {
"version": "5.18.2",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
"integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
}
},
"es-module-lexer": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
"integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
"dev": true,
"optional": true,
"peer": true
},
"esbuild": { "esbuild": {
"version": "0.15.18", "version": "0.15.18",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
...@@ -6797,6 +8052,14 @@ ...@@ -6797,6 +8052,14 @@
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
"optional": true,
"peer": true
},
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
...@@ -7048,6 +8311,14 @@ ...@@ -7048,6 +8311,14 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true "dev": true
}, },
"events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"dev": true,
"optional": true,
"peer": true
},
"extend-shallow": { "extend-shallow": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
...@@ -7099,6 +8370,14 @@ ...@@ -7099,6 +8370,14 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true "dev": true
}, },
"fast-uri": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
"dev": true,
"optional": true,
"peer": true
},
"fastq": { "fastq": {
"version": "1.13.0", "version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
...@@ -7298,6 +8577,14 @@ ...@@ -7298,6 +8577,14 @@
"is-glob": "^4.0.3" "is-glob": "^4.0.3"
} }
}, },
"glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true,
"optional": true,
"peer": true
},
"global": { "global": {
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz", "resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz",
...@@ -7331,9 +8618,9 @@ ...@@ -7331,9 +8618,9 @@
} }
}, },
"graceful-fs": { "graceful-fs": {
"version": "4.2.10", "version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true "dev": true
}, },
"has": { "has": {
...@@ -7564,6 +8851,32 @@ ...@@ -7564,6 +8851,32 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true "dev": true
}, },
"jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"dependencies": {
"supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"js-base64": { "js-base64": {
"version": "2.6.4", "version": "2.6.4",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
...@@ -7585,6 +8898,14 @@ ...@@ -7585,6 +8898,14 @@
"argparse": "^2.0.1" "argparse": "^2.0.1"
} }
}, },
"json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true,
"optional": true,
"peer": true
},
"json-schema-traverse": { "json-schema-traverse": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
...@@ -7642,6 +8963,14 @@ ...@@ -7642,6 +8963,14 @@
"type-check": "~0.4.0" "type-check": "~0.4.0"
} }
}, },
"loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"dev": true,
"optional": true,
"peer": true
},
"local-pkg": { "local-pkg": {
"version": "0.4.2", "version": "0.4.2",
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz",
...@@ -7720,6 +9049,14 @@ ...@@ -7720,6 +9049,14 @@
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
"dev": true "dev": true
}, },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true,
"optional": true,
"peer": true
},
"merge2": { "merge2": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
...@@ -7869,12 +9206,28 @@ ...@@ -7869,12 +9206,28 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true "dev": true
}, },
"neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true,
"optional": true,
"peer": true
},
"netmask": { "netmask": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
"integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
"dev": true "dev": true
}, },
"node-releases": {
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
"dev": true,
"optional": true,
"peer": true
},
"normalize-path": { "normalize-path": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
...@@ -8034,9 +9387,9 @@ ...@@ -8034,9 +9387,9 @@
} }
}, },
"picocolors": { "picocolors": {
"version": "1.1.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
}, },
"picomatch": { "picomatch": {
"version": "2.3.1", "version": "2.3.1",
...@@ -8051,14 +9404,6 @@ ...@@ -8051,14 +9404,6 @@
"requires": { "requires": {
"@vue/devtools-api": "^6.1.4", "@vue/devtools-api": "^6.1.4",
"vue-demi": "*" "vue-demi": "*"
},
"dependencies": {
"vue-demi": {
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz",
"integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==",
"requires": {}
}
} }
}, },
"pkcs7": { "pkcs7": {
...@@ -8192,6 +9537,17 @@ ...@@ -8192,6 +9537,17 @@
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true "dev": true
}, },
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"safe-buffer": "^5.1.0"
}
},
"raw-body": { "raw-body": {
"version": "2.5.1", "version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
...@@ -8228,17 +9584,20 @@ ...@@ -8228,17 +9584,20 @@
"picomatch": "^2.2.1" "picomatch": "^2.2.1"
} }
}, },
"regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
},
"regexpp": { "regexpp": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true "dev": true
}, },
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
"optional": true,
"peer": true
},
"resolve": { "resolve": {
"version": "1.22.8", "version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
...@@ -8334,6 +9693,55 @@ ...@@ -8334,6 +9693,55 @@
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true "dev": true
}, },
"schema-utils": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
"integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"dependencies": {
"ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2"
}
},
"ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"fast-deep-equal": "^3.1.3"
}
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"optional": true,
"peer": true
}
}
},
"scule": { "scule": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/scule/-/scule-0.2.1.tgz", "resolved": "https://registry.npmjs.org/scule/-/scule-0.2.1.tgz",
...@@ -8358,6 +9766,17 @@ ...@@ -8358,6 +9766,17 @@
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
} }
}, },
"serialize-javascript": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"randombytes": "^2.1.0"
}
},
"setprototypeof": { "setprototypeof": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
...@@ -8437,6 +9856,18 @@ ...@@ -8437,6 +9856,18 @@
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
}, },
"source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"sourcemap-codec": { "sourcemap-codec": {
"version": "1.4.8", "version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
...@@ -8515,6 +9946,53 @@ ...@@ -8515,6 +9946,53 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true "dev": true
}, },
"tapable": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
"integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
"dev": true,
"optional": true,
"peer": true
},
"terser": {
"version": "5.43.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
"integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.14.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"dependencies": {
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"optional": true,
"peer": true
}
}
},
"terser-webpack-plugin": {
"version": "5.3.14",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
"integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
"serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
}
},
"text-table": { "text-table": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
...@@ -8712,6 +10190,18 @@ ...@@ -8712,6 +10190,18 @@
} }
} }
}, },
"update-browserslist-db": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"escalade": "^3.2.0",
"picocolors": "^1.1.1"
}
},
"uri-js": { "uri-js": {
"version": "4.4.1", "version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
...@@ -8973,6 +10463,20 @@ ...@@ -8973,6 +10463,20 @@
"@vue/shared": "3.2.37" "@vue/shared": "3.2.37"
} }
}, },
"vue-demi": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
"requires": {}
},
"vue-echarts": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-7.0.3.tgz",
"integrity": "sha512-/jSxNwOsw5+dYAUcwSfkLwKPuzTQ0Cepz1LxCOpj2QcHrrmUa/Ql0eQqMmc1rTPQVrh2JQ29n2dhq75ZcHvRDw==",
"requires": {
"vue-demi": "^0.13.11"
}
},
"vue-eslint-parser": { "vue-eslint-parser": {
"version": "8.3.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
...@@ -9023,6 +10527,52 @@ ...@@ -9023,6 +10527,52 @@
"@volar/vue-typescript": "0.34.16" "@volar/vue-typescript": "0.34.16"
} }
}, },
"watchpack": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
"integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
}
},
"webpack": {
"version": "5.99.9",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz",
"integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.6",
"@types/json-schema": "^7.0.15",
"@webassemblyjs/ast": "^1.14.1",
"@webassemblyjs/wasm-edit": "^1.14.1",
"@webassemblyjs/wasm-parser": "^1.14.1",
"acorn": "^8.14.0",
"browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.17.1",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.2.11",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
"schema-utils": "^4.3.2",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.11",
"watchpack": "^2.4.1",
"webpack-sources": "^3.2.3"
}
},
"webpack-sources": { "webpack-sources": {
"version": "3.2.3", "version": "3.2.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
...@@ -9108,9 +10658,9 @@ ...@@ -9108,9 +10658,9 @@
"dev": true "dev": true
}, },
"zrender": { "zrender": {
"version": "5.3.1", "version": "5.6.1",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.3.1.tgz", "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz",
"integrity": "sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw==", "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
"requires": { "requires": {
"tslib": "2.3.0" "tslib": "2.3.0"
}, },
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
"axios": "^0.27.2", "axios": "^0.27.2",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"dayjs": "^1.11.3", "dayjs": "^1.11.3",
"echarts": "^5.3.2", "echarts": "^5.6.0",
"element-plus": "^2.2.9", "element-plus": "^2.2.9",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"pinia": "^2.0.14", "pinia": "^2.0.14",
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
"sortablejs": "^1.15.0", "sortablejs": "^1.15.0",
"video.js": "^7.19.2", "video.js": "^7.19.2",
"vue": "^3.2.37", "vue": "^3.2.37",
"vue-echarts": "^7.0.3",
"vue-router": "^4.0.16" "vue-router": "^4.0.16"
}, },
"devDependencies": { "devDependencies": {
......
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI定制学习 - 人工智能基础</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
line-height: 1.6;
color: #333;
min-height: 100vh;
}
.header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px 0;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.header-content {
max-width: 1400px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header-title {
font-size: 28px;
font-weight: 600;
margin-bottom: 5px;
}
.header-subtitle {
opacity: 0.9;
font-size: 16px;
}
.header-actions button {
padding: 10px 20px;
background: rgba(255,255,255,0.2);
color: white;
border: 1px solid rgba(255,255,255,0.3);
border-radius: 6px;
cursor: pointer;
font-size: 14px;
transition: all 0.3s ease;
}
.header-actions button:hover {
background: rgba(255,255,255,0.3);
transform: translateY(-1px);
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 30px 20px;
}
.learning-content {
background: white;
border-radius: 16px;
box-shadow: 0 10px 40px rgba(0,0,0,0.1);
overflow: hidden;
}
.content-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px 40px;
text-align: center;
}
.content-title {
font-size: 32px;
font-weight: 600;
margin-bottom: 10px;
}
.content-description {
font-size: 18px;
opacity: 0.9;
}
.content-body {
padding: 40px;
}
.learning-section {
margin-bottom: 40px;
}
.section-title {
font-size: 24px;
font-weight: 600;
color: #2d3748;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 3px solid #667eea;
display: flex;
align-items: center;
gap: 10px;
}
.section-content {
background: #f8f9fa;
padding: 25px;
border-radius: 12px;
border-left: 5px solid #667eea;
margin-bottom: 20px;
}
.key-points {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
margin: 25px 0;
}
.key-point {
background: white;
padding: 20px;
border-radius: 10px;
border: 1px solid #e2e8f0;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
transition: all 0.3s ease;
}
.key-point:hover {
transform: translateY(-3px);
box-shadow: 0 4px 15px rgba(0,0,0,0.15);
}
.key-point-title {
font-size: 18px;
font-weight: 600;
color: #667eea;
margin-bottom: 10px;
display: flex;
align-items: center;
gap: 8px;
}
.key-point-desc {
color: #4a5568;
line-height: 1.7;
}
.interactive-elements {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 20%, #4facfe 80%, #00f2fe 100%);
margin: 30px 0;
padding: 30px;
border-radius: 15px;
color: white;
text-align: center;
}
.interactive-title {
font-size: 24px;
font-weight: 600;
margin-bottom: 15px;
}
.interactive-buttons {
display: flex;
gap: 20px;
justify-content: center;
flex-wrap: wrap;
margin-top: 20px;
}
.interactive-btn {
padding: 12px 25px;
background: rgba(255,255,255,0.2);
color: white;
border: 2px solid rgba(255,255,255,0.3);
border-radius: 25px;
cursor: pointer;
font-size: 16px;
font-weight: 500;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 8px;
}
.interactive-btn:hover {
background: rgba(255,255,255,0.3);
border-color: rgba(255,255,255,0.6);
transform: translateY(-2px);
}
.progress-section {
background: #e6fffa;
padding: 25px;
border-radius: 12px;
border: 1px solid #81e6d9;
margin: 30px 0;
}
.progress-title {
font-size: 20px;
font-weight: 600;
color: #234e52;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 10px;
}
.progress-bar {
background: #b2f5ea;
height: 12px;
border-radius: 6px;
overflow: hidden;
margin: 15px 0;
}
.progress-fill {
background: linear-gradient(90deg, #4fd1c7, #38b2ac);
height: 100%;
width: 75%;
border-radius: 6px;
transition: width 0.3s ease;
}
.progress-text {
color: #234e52;
font-size: 14px;
text-align: center;
}
.ai-recommendation {
background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);
padding: 25px;
border-radius: 12px;
margin: 30px 0;
}
.ai-recommendation-title {
font-size: 20px;
font-weight: 600;
color: #7c2d12;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 10px;
}
.recommendation-list {
list-style: none;
}
.recommendation-item {
background: rgba(255,255,255,0.7);
padding: 15px;
border-radius: 8px;
margin-bottom: 10px;
border-left: 4px solid #ea580c;
}
.floating-assistant {
position: fixed;
bottom: 30px;
right: 30px;
width: 60px;
height: 60px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 24px;
cursor: pointer;
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
transition: all 0.3s ease;
z-index: 1000;
}
.floating-assistant:hover {
transform: scale(1.1);
box-shadow: 0 12px 35px rgba(102, 126, 234, 0.6);
}
/* 响应式设计 */
@media (max-width: 768px) {
.container {
padding: 20px 15px;
}
.content-body {
padding: 25px;
}
.key-points {
grid-template-columns: 1fr;
}
.interactive-buttons {
flex-direction: column;
align-items: center;
}
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div>
<h1 class="header-title">🤖 AI定制学习</h1>
<p class="header-subtitle" id="sectionTitle">个性化学习内容正在为您生成...</p>
</div>
<div class="header-actions">
<button onclick="window.close()">关闭页面</button>
</div>
</div>
</div>
<div class="container">
<div class="learning-content">
<div class="content-header">
<h2 class="content-title" id="contentTitle">AI为您定制的学习内容</h2>
<p class="content-description">基于您的学习记录和数字教材,为您量身打造的学习体验</p>
</div>
<div class="content-body" id="learningBody">
<!-- 内容将根据章节动态生成 -->
</div>
</div>
</div>
<!-- 智能助手悬浮按钮 -->
<div class="floating-assistant" onclick="showAIAssistant()">
🤖
</div>
<script>
let sectionData = {};
// 监听来自父窗口的消息
window.addEventListener('message', function(event) {
if (event.data.type === 'sectionData') {
sectionData = event.data.data;
generateLearningContent();
}
});
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
// 如果是直接打开的页面,使用默认数据
if (window.opener) {
window.opener.postMessage({type: 'requestSectionData'}, '*');
} else {
// 直接访问时使用示例数据
sectionData = {
sectionId: 'section_1_1',
sectionTitle: '1.1 人工智能的定义与发展'
};
generateLearningContent();
}
});
function generateLearningContent() {
// 确保DOM元素存在
const sectionTitleEl = document.getElementById('sectionTitle');
const contentTitleEl = document.getElementById('contentTitle');
const learningBody = document.getElementById('learningBody');
if (sectionTitleEl) {
sectionTitleEl.textContent = sectionData.sectionTitle;
}
if (contentTitleEl) {
contentTitleEl.textContent = `${sectionData.sectionTitle} - 定制学习内容`;
}
if (learningBody) {
// 根据不同章节生成不同的学习内容
const content = getLearningContentBySection(sectionData.sectionId, sectionData.sectionTitle);
learningBody.innerHTML = content;
}
}
function getLearningContentBySection(sectionId, sectionTitle) {
// 根据章节ID生成相应的学习内容
const contentMap = {
'section_1_1': generateAIBasicsContent(),
'section_1_2': generateAIHistoryContent(),
'section_2_1': generateMLBasicsContent(),
'section_3_1': generateNeuralNetworkContent(),
'section_4_1': generateNLPContent(),
'section_5_1': generateComputerVisionContent()
};
return contentMap[sectionId] || generateDefaultContent(sectionTitle);
}
function generateAIBasicsContent() {
return `
<div class="learning-section">
<h3 class="section-title">
🎯 学习目标
</h3>
<div class="section-content">
<p><strong>知识目标:</strong>通过本节学习,您将能够:</p>
<ul style="margin-top: 15px; padding-left: 20px; color: #4a5568;">
<li>准确理解人工智能的基本定义和核心概念</li>
<li>清晰掌握AI、机器学习、深度学习之间的层次关系</li>
<li>系统了解人工智能从1950年至今的发展历程</li>
<li>认识当前AI技术的主要应用领域和未来发展趋势</li>
<li>理解图灵测试等AI智能评估标准的意义</li>
</ul>
<p style="margin-top: 15px;"><strong>能力目标:</strong>能够运用所学知识分析和评价不同AI技术的特点和应用价值。</p>
</div>
</div>
<div class="learning-section">
<h3 class="section-title">
📚 核心知识点详解
</h3>
<div class="key-points">
<div class="key-point">
<div class="key-point-title">
🧠 人工智能的定义
</div>
<div class="key-point-desc">
<strong>经典定义:</strong>人工智能(Artificial Intelligence, AI)是计算机科学的一个分支,旨在创建能够执行通常需要人类智能的任务的系统。<br><br>
<strong>核心特征:</strong>学习能力、推理能力、感知能力、语言理解能力、问题解决能力。<br><br>
<strong>现代理解:</strong>AI不仅是模拟人类智能,更是要创造出能够智能化解决问题的系统。
</div>
</div>
<div class="key-point">
<div class="key-point-title">
🔗 AI技术层次关系
</div>
<div class="key-point-desc">
<strong>人工智能(AI):</strong>最广泛的概念,包含所有智能化技术<br>
<strong>机器学习(ML):</strong>AI的子集,通过数据学习规律的方法<br>
<strong>深度学习(DL):</strong>ML的子集,基于神经网络的学习方法<br><br>
<em>关系:AI ⊃ ML ⊃ DL</em>
</div>
</div>
<div class="key-point">
<div class="key-point-title">
🏆 图灵测试与智能评估
</div>
<div class="key-point-desc">
<strong>提出者:</strong>阿兰·图灵(1950年)<br>
<strong>测试原理:</strong>如果机器能在5分钟内让30%的人类评判者无法确定对话对象是人还是机器,则认为机器具有智能。<br>
<strong>意义:</strong>提供了判断机器智能的操作性标准<br>
<strong>局限性:</strong>只考虑语言能力,未涵盖其他智能表现
</div>
</div>
<div class="key-point">
<div class="key-point-title">
📅 AI发展的重要里程碑
</div>
<div class="key-point-desc">
<strong>1950年:</strong>图灵提出图灵测试<br>
<strong>1956年:</strong>达特茅斯会议,AI概念正式诞生<br>
<strong>1997年:</strong>IBM深蓝击败国际象棋世界冠军<br>
<strong>2016年:</strong>AlphaGo击败围棋世界冠军<br>
<strong>2022年:</strong>ChatGPT发布,大语言模型爆发
</div>
</div>
<div class="key-point">
<div class="key-point-title">
🌟 AI发展的三大学派
</div>
<div class="key-point-desc">
<strong>符号主义:</strong>基于逻辑推理和知识表示,代表:专家系统<br>
<strong>连接主义:</strong>模拟大脑神经网络,代表:神经网络<br>
<strong>行为主义:</strong>通过感知-行动循环学习,代表:强化学习<br><br>
现代AI融合了三大学派的优势
</div>
</div>
<div class="key-point">
<div class="key-point-title">
🚀 当前AI主要应用领域
</div>
<div class="key-point-desc">
<strong>计算机视觉:</strong>图像识别、人脸识别、自动驾驶<br>
<strong>自然语言处理:</strong>机器翻译、聊天机器人、文本分析<br>
<strong>语音技术:</strong>语音识别、语音合成、智能音箱<br>
<strong>推荐系统:</strong>电商推荐、内容推荐、广告投放<br>
<strong>智能决策:</strong>金融风控、医疗诊断、智能制造
</div>
</div>
</div>
</div>
<div class="learning-section">
<h3 class="section-title">
💡 深度理解要点
</h3>
<div class="section-content">
<div style="background: #fff3cd; border: 1px solid #ffeaa7; border-radius: 8px; padding: 20px; margin: 15px 0;">
<h4 style="color: #856404; margin-bottom: 10px;">🤔 思考题</h4>
<p style="color: #856404;">为什么说"AI不是要让机器变得和人一样"?机器智能与人类智能有什么本质区别?</p>
</div>
<div style="background: #d1ecf1; border: 1px solid #b8daff; border-radius: 8px; padding: 20px; margin: 15px 0;">
<h4 style="color: #004085; margin-bottom: 10px;">📖 案例分析</h4>
<p style="color: #004085;"><strong>AlphaGo的启示:</strong>AlphaGo通过深度学习和蒙特卡洛树搜索,在围棋这个复杂博弈中超越了人类,体现了AI在特定领域可以超越人类智能的特点。</p>
</div>
<div style="background: #d4edda; border: 1px solid #c3e6cb; border-radius: 8px; padding: 20px; margin: 15px 0;">
<h4 style="color: #155724; margin-bottom: 10px;">💼 实际应用</h4>
<p style="color: #155724;"><strong>日常生活中的AI:</strong>手机拍照美颜、语音助手、导航路径规划、购物推荐等,都体现了AI技术的实际价值。</p>
</div>
</div>
</div>
<div class="interactive-elements">
<h3 class="interactive-title">🎮 互动学习体验</h3>
<p>通过以下互动方式深化理解,提升学习效果</p>
<div class="interactive-buttons">
<button class="interactive-btn" onclick="showConcept()">
💡 概念对比分析
</button>
<button class="interactive-btn" onclick="showTimeline()">
📅 AI发展时间轴
</button>
<button class="interactive-btn" onclick="showApplications()">
🚀 应用场景探索
</button>
<button class="interactive-btn" onclick="showQuiz()">
❓ 自我检测练习
</button>
</div>
</div>
<div class="progress-section">
<h3 class="progress-title">
📊 个性化学习进度
</h3>
<div class="progress-bar">
<div class="progress-fill" style="width: 85%;"></div>
</div>
<div class="progress-text">
已完成 85% - 基础概念掌握良好,建议继续学习"机器学习基础"
</div>
<div style="margin-top: 15px; font-size: 14px; color: #666;">
<p>📈 学习数据分析:您在概念理解方面表现优秀,建议加强实际应用案例的学习</p>
</div>
</div>
<div class="ai-recommendation">
<h3 class="ai-recommendation-title">
🤖 AI个性化学习建议
</h3>
<ul class="recommendation-list">
<li class="recommendation-item">
<strong>概念强化:</strong> 重点练习AI、ML、DL的关系区分,建议制作概念图谱
</li>
<li class="recommendation-item">
<strong>历史脉络:</strong> 深入了解AI发展的"两起两落",理解技术发展的客观规律
</li>
<li class="recommendation-item">
<strong>实践体验:</strong> 尝试使用ChatGPT、文心一言等AI工具,亲身体验AI能力边界
</li>
<li class="recommendation-item">
<strong>拓展阅读:</strong> 推荐《人工智能简史》、《智能时代》等书籍深化理解
</li>
<li class="recommendation-item">
<strong>前瞻思考:</strong> 关注AGI(通用人工智能)发展动态,思考AI未来发展方向
</li>
</ul>
</div>
<div class="learning-section">
<h3 class="section-title">
🎯 下一步学习规划
</h3>
<div class="section-content">
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;">
<div style="background: white; padding: 20px; border-radius: 10px; border: 1px solid #e2e8f0;">
<h4 style="color: #667eea; margin-bottom: 10px;">📚 必修内容</h4>
<p style="font-size: 14px; color: #666;">机器学习基础、神经网络原理</p>
</div>
<div style="background: white; padding: 20px; border-radius: 10px; border: 1px solid #e2e8f0;">
<h4 style="color: #f5576c; margin-bottom: 10px;">🌟 推荐内容</h4>
<p style="font-size: 14px; color: #666;">深度学习应用、AI伦理思考</p>
</div>
<div style="background: white; padding: 20px; border-radius: 10px; border: 1px solid #e2e8f0;">
<h4 style="color: #48bb78; margin-bottom: 10px;">🚀 扩展内容</h4>
<p style="font-size: 14px; color: #666;">前沿技术动态、行业应用案例</p>
</div>
</div>
</div>
</div>
`;
}
function generateAIHistoryContent() {
return `
<div class="learning-section">
<h3 class="section-title">🎯 AI发展历程学习</h3>
<div class="section-content">
<p>了解人工智能从诞生到现在的发展历程,把握技术演进脉络</p>
</div>
</div>
<div class="key-points">
<div class="key-point">
<div class="key-point-title">📅 关键时间节点</div>
<div class="key-point-desc">1956年达特茅斯会议、1997年深蓝战胜卡斯帕罗夫、2016年AlphaGo击败李世石</div>
</div>
<div class="key-point">
<div class="key-point-title">❄️ AI寒冬分析</div>
<div class="key-point-desc">两次AI寒冬的原因及对当今AI发展的启示</div>
</div>
</div>
`;
}
function generateMLBasicsContent() {
return `
<div class="learning-section">
<h3 class="section-title">🎯 机器学习基础</h3>
<div class="section-content">
<p>机器学习是AI的核心技术,让计算机能够从数据中学习模式,做出预测或决策。</p>
</div>
</div>
<div class="key-points">
<div class="key-point">
<div class="key-point-title">📖 监督学习</div>
<div class="key-point-desc">使用标记数据训练模型,包括分类和回归任务。典型算法有决策树、SVM、神经网络等。</div>
</div>
<div class="key-point">
<div class="key-point-title">🔍 无监督学习</div>
<div class="key-point-desc">从未标记数据中发现隐藏模式,包括聚类、降维、关联规则等任务。</div>
</div>
<div class="key-point">
<div class="key-point-title">🎮 强化学习</div>
<div class="key-point-desc">通过与环境交互,根据奖励信号学习最优策略。在游戏AI、自动驾驶等领域应用广泛。</div>
</div>
</div>
`;
}
function generateNeuralNetworkContent() {
return `
<div class="learning-section">
<h3 class="section-title">🎯 神经网络原理</h3>
<div class="section-content">
<p>深入理解神经网络的结构、原理和训练过程</p>
</div>
</div>
<div class="key-points">
<div class="key-point">
<div class="key-point-title">🧠 感知机原理</div>
<div class="key-point-desc">最基础的神经元模型,理解权重、偏置和激活函数的作用</div>
</div>
<div class="key-point">
<div class="key-point-title">📊 反向传播</div>
<div class="key-point-desc">神经网络学习的核心算法,通过梯度下降优化参数</div>
</div>
</div>
`;
}
function generateNLPContent() {
return `
<div class="learning-section">
<h3 class="section-title">🎯 自然语言处理</h3>
<div class="section-content">
<p>探索让计算机理解和生成人类语言的技术</p>
</div>
</div>
<div class="key-points">
<div class="key-point">
<div class="key-point-title">✂️ 分词技术</div>
<div class="key-point-desc">将连续的文本分割成有意义的词汇单元</div>
</div>
<div class="key-point">
<div class="key-point-title">🔤 词向量表示</div>
<div class="key-point-desc">Word2Vec、Transformer等技术将词语转换为数值向量</div>
</div>
</div>
`;
}
function generateComputerVisionContent() {
return `
<div class="learning-section">
<h3 class="section-title">🎯 计算机视觉</h3>
<div class="section-content">
<p>让计算机"看懂"图像和视频的技术原理</p>
</div>
</div>
<div class="key-points">
<div class="key-point">
<div class="key-point-title">🔍 图像预处理</div>
<div class="key-point-desc">滤波、边缘检测等基础图像处理技术</div>
</div>
<div class="key-point">
<div class="key-point-title">🏗️ 卷积神经网络</div>
<div class="key-point-desc">CNN的结构原理和在图像识别中的应用</div>
</div>
</div>
`;
}
function generateDefaultContent(sectionTitle) {
return `
<div class="learning-section">
<h3 class="section-title">🎯 ${sectionTitle}</h3>
<div class="section-content">
<p>AI正在为您生成个性化的学习内容,请稍候...</p>
<p>本节内容将根据您的学习历史和偏好进行定制。</p>
</div>
</div>
<div class="key-points">
<div class="key-point">
<div class="key-point-title">📚 核心概念</div>
<div class="key-point-desc">本章节的核心概念和知识点将在这里展示</div>
</div>
<div class="key-point">
<div class="key-point-title">💡 学习要点</div>
<div class="key-point-desc">重点学习内容和注意事项</div>
</div>
<div class="key-point">
<div class="key-point-title">🚀 实际应用</div>
<div class="key-point-desc">理论知识在实际中的应用场景</div>
</div>
</div>
<div class="interactive-elements">
<h3 class="interactive-title">📖 个性化学习内容</h3>
<p>基于您的学习记录,AI为您推荐最适合的学习路径</p>
</div>
`;
}
// 交互功能
function showConcept() {
alert('💡 概念解析功能即将开放,敬请期待!');
}
function showTimeline() {
alert('📅 AI发展时间线互动功能开发中...');
}
function showApplications() {
alert('🚀 应用案例库功能即将上线!');
}
function showQuiz() {
alert('❓ 知识检测功能开发中,将很快与您见面!');
}
function showAIAssistant() {
alert('🤖 AI学习助手: 我是您的专属学习伙伴!有任何问题都可以问我哦~');
}
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI单元测试 - 人工智能基础</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);
line-height: 1.6;
color: #333;
min-height: 100vh;
}
.header {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
color: white;
padding: 20px 0;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.header-content {
max-width: 1400px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header-title {
font-size: 28px;
font-weight: 600;
margin-bottom: 5px;
}
.header-subtitle {
opacity: 0.9;
font-size: 16px;
}
.header-actions button {
padding: 10px 20px;
background: rgba(255,255,255,0.2);
color: white;
border: 1px solid rgba(255,255,255,0.3);
border-radius: 6px;
cursor: pointer;
font-size: 14px;
transition: all 0.3s ease;
}
.header-actions button:hover {
background: rgba(255,255,255,0.3);
transform: translateY(-1px);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 30px 20px;
}
.test-info {
background: white;
border-radius: 12px;
padding: 25px;
margin-bottom: 25px;
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
}
.test-title {
font-size: 24px;
font-weight: 600;
color: #2d3748;
margin-bottom: 15px;
text-align: center;
}
.test-meta {
display: flex;
justify-content: space-around;
background: #f8f9fa;
padding: 15px;
border-radius: 8px;
margin-top: 15px;
}
.meta-item {
text-align: center;
}
.meta-label {
font-size: 14px;
color: #666;
margin-bottom: 5px;
}
.meta-value {
font-size: 18px;
font-weight: 600;
color: #f5576c;
}
.test-content {
background: white;
border-radius: 12px;
padding: 30px;
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
}
.question-section {
margin-bottom: 40px;
}
.section-title {
font-size: 20px;
font-weight: 600;
color: #2d3748;
margin-bottom: 20px;
padding: 15px;
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
color: white;
border-radius: 8px;
text-align: center;
}
.question {
background: #f8f9fa;
border: 1px solid #e2e8f0;
border-radius: 10px;
padding: 20px;
margin-bottom: 20px;
transition: all 0.3s ease;
}
.question:hover {
border-color: #f5576c;
box-shadow: 0 4px 12px rgba(245, 87, 108, 0.1);
}
.question-header {
display: flex;
align-items: flex-start;
margin-bottom: 15px;
}
.question-number {
background: #f5576c;
color: white;
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: 14px;
margin-right: 15px;
flex-shrink: 0;
}
.question-text {
font-size: 16px;
font-weight: 500;
color: #2d3748;
flex: 1;
}
.question-score {
background: #e2f7ed;
color: #22543d;
padding: 4px 12px;
border-radius: 15px;
font-size: 12px;
font-weight: 600;
margin-left: 10px;
}
.options {
margin-left: 43px;
}
.option {
display: flex;
align-items: center;
padding: 10px 15px;
margin-bottom: 8px;
border-radius: 6px;
cursor: pointer;
transition: all 0.3s ease;
}
.option:hover {
background: #fff5f5;
}
.option input[type="radio"],
.option input[type="checkbox"] {
margin-right: 12px;
transform: scale(1.2);
}
.option label {
cursor: pointer;
flex: 1;
color: #4a5568;
}
.submit-section {
text-align: center;
margin-top: 40px;
padding-top: 30px;
border-top: 2px solid #e2e8f0;
}
.submit-btn {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
color: white;
border: none;
padding: 15px 40px;
font-size: 18px;
font-weight: 600;
border-radius: 25px;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 6px 20px rgba(245, 87, 108, 0.3);
}
.submit-btn:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(245, 87, 108, 0.4);
}
.submit-btn:disabled {
background: #ccc;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* 结果页面样式 */
.result-content {
display: none;
}
.result-summary {
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
color: white;
padding: 30px;
border-radius: 12px;
text-align: center;
margin-bottom: 30px;
}
.result-score {
font-size: 48px;
font-weight: 700;
margin-bottom: 10px;
}
.result-percentage {
font-size: 24px;
opacity: 0.9;
margin-bottom: 15px;
}
.result-message {
font-size: 18px;
opacity: 0.8;
}
.result-details {
background: white;
border-radius: 12px;
padding: 30px;
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
}
.result-question {
border-bottom: 1px solid #e2e8f0;
padding: 20px 0;
margin-bottom: 20px;
}
.result-question:last-child {
border-bottom: none;
margin-bottom: 0;
}
.result-question-text {
font-weight: 600;
margin-bottom: 15px;
color: #2d3748;
}
.result-options {
margin-left: 20px;
}
.result-option {
padding: 8px 12px;
margin-bottom: 6px;
border-radius: 6px;
}
.result-option.correct {
background: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.result-option.wrong {
background: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.result-option.user-answer {
border-width: 2px;
font-weight: 600;
}
.result-explanation {
background: #e7f3ff;
border: 1px solid #b3d9ff;
border-radius: 6px;
padding: 15px;
margin-top: 15px;
}
.result-explanation-title {
font-weight: 600;
color: #0066cc;
margin-bottom: 8px;
}
.result-explanation-text {
color: #004499;
line-height: 1.6;
}
.retry-btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
padding: 12px 30px;
font-size: 16px;
font-weight: 600;
border-radius: 20px;
cursor: pointer;
transition: all 0.3s ease;
margin-top: 20px;
}
.retry-btn:hover {
transform: translateY(-1px);
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
}
/* 响应式设计 */
@media (max-width: 768px) {
.container {
padding: 20px 15px;
}
.test-content {
padding: 20px;
}
.test-meta {
flex-direction: column;
gap: 15px;
}
.options {
margin-left: 0;
}
.question-header {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.question-number {
margin-right: 0;
}
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div>
<h1 class="header-title">📝 AI单元测试</h1>
<p class="header-subtitle" id="sectionTitle">智能测试系统正在为您生成题目...</p>
</div>
<div class="header-actions">
<button onclick="window.close()">关闭页面</button>
</div>
</div>
</div>
<div class="container">
<div class="test-info">
<h2 class="test-title" id="testTitle">AI个性化单元测试</h2>
<p style="text-align: center; color: #666; margin-bottom: 15px;">
基于数字教材内容,AI为您生成专属测试题目
</p>
<div class="test-meta">
<div class="meta-item">
<div class="meta-label">总题数</div>
<div class="meta-value">15题</div>
</div>
<div class="meta-item">
<div class="meta-label">总分值</div>
<div class="meta-value">60分</div>
</div>
<div class="meta-item">
<div class="meta-label">建议时间</div>
<div class="meta-value">30分钟</div>
</div>
<div class="meta-item">
<div class="meta-label">测试方式</div>
<div class="meta-value">在线答题</div>
</div>
</div>
</div>
<!-- 测试内容 -->
<div class="test-content" id="testContent">
<form id="testForm">
<!-- 题目将通过JavaScript动态生成 -->
</form>
<div class="submit-section">
<button type="button" class="submit-btn" onclick="submitTest()">
提交答案
</button>
</div>
</div>
<!-- 结果内容 -->
<div class="result-content" id="resultContent">
<div class="result-summary">
<div class="result-score" id="resultScore">0</div>
<div class="result-percentage" id="resultPercentage">0%</div>
<div class="result-message" id="resultMessage">测试完成</div>
</div>
<div class="result-details" id="resultDetails">
<!-- 详细结果将通过JavaScript生成 -->
</div>
<div style="text-align: center;">
<button class="retry-btn" onclick="retryTest()">重新测试</button>
<button class="retry-btn" onclick="window.close()" style="margin-left: 15px;">关闭页面</button>
</div>
</div>
</div>
<script>
let sectionData = {};
let testQuestions = [];
let userAnswers = {};
// 监听来自父窗口的消息
window.addEventListener('message', function(event) {
if (event.data.type === 'sectionData') {
sectionData = event.data.data;
generateTestQuestions();
}
});
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
// 如果是直接打开的页面,使用默认数据
if (window.opener) {
window.opener.postMessage({type: 'requestSectionData'}, '*');
} else {
// 直接访问时使用示例数据
sectionData = {
sectionId: 'section_1_1',
sectionTitle: '1.1 人工智能的定义与发展'
};
generateTestQuestions();
}
});
function generateTestQuestions() {
document.getElementById('sectionTitle').textContent = sectionData.sectionTitle;
document.getElementById('testTitle').textContent = `${sectionData.sectionTitle} - 单元测试`;
// 根据不同章节生成不同的测试题目
testQuestions = getTestQuestionsBySection(sectionData.sectionId);
renderTestQuestions();
}
function getTestQuestionsBySection(sectionId) {
// 根据章节ID生成相应的测试题目
const questionSets = {
'section_1_1': generateAIBasicsQuestions(),
'section_1_2': generateAIHistoryQuestions(),
'section_2_1': generateMLBasicsQuestions(),
'section_3_1': generateNeuralNetworkQuestions(),
'section_4_1': generateNLPQuestions(),
'section_5_1': generateComputerVisionQuestions()
};
return questionSets[sectionId] || generateDefaultQuestions();
}
function generateAIBasicsQuestions() {
return [
// 单选题 (5题,每题3分)
{
type: 'single',
score: 3,
question: '人工智能(AI)的概念最早在哪一年的哪个会议上正式提出?',
options: ['1950年图灵测试提出', '1956年达特茅斯会议', '1943年神经网络理论', '1965年专家系统'],
correct: 1,
explanation: '1956年在美国达特茅斯学院举行的夏季研讨会上,约翰·麦卡锡等人正式提出了"人工智能"这一概念,标志着AI学科的诞生。'
},
{
type: 'single',
score: 3,
question: '图灵测试的核心判断标准是什么?',
options: ['机器能否进行数学计算', '机器能否通过对话让人类无法分辨', '机器能否模拟人类行为', '机器能否自主学习'],
correct: 1,
explanation: '图灵测试的核心是:如果机器能在对话中让人类评判者无法确定对话对象是人还是机器,则认为机器具有智能。这是一个基于语言交互的智能评估标准。'
},
{
type: 'single',
score: 3,
question: '在AI、机器学习、深度学习的关系中,正确的包含关系是?',
options: ['机器学习 ⊃ 人工智能 ⊃ 深度学习', '深度学习 ⊃ 机器学习 ⊃ 人工智能', '人工智能 ⊃ 机器学习 ⊃ 深度学习', '三者相互独立'],
correct: 2,
explanation: '正确的层次关系是:人工智能(AI)是最大的概念,机器学习(ML)是AI的子集,深度学习(DL)是机器学习的子集。即AI ⊃ ML ⊃ DL。'
},
{
type: 'single',
score: 3,
question: '以下哪个事件标志着AI在复杂博弈游戏中首次超越人类顶级选手?',
options: ['1997年深蓝击败卡斯帕罗夫', '2016年AlphaGo击败李世石', '2017年AlphaZero自我学习', '2019年OpenAI Five击败DOTA2职业队'],
correct: 1,
explanation: '2016年AlphaGo击败围棋世界冠军李世石,是AI在复杂博弈游戏中超越人类的里程碑事件。围棋的复杂度远超国际象棋,这一胜利标志着AI技术的重大突破。'
},
{
type: 'single',
score: 3,
question: '人工智能发展史上的"AI寒冬"主要是由什么原因造成的?',
options: ['计算机硬件性能不足', '理论基础不够完善', '资金支持和期望值问题', '以上所有原因'],
correct: 3,
explanation: 'AI寒冬是由多种因素共同造成的:当时的计算机硬件无法支撑复杂的AI算法、理论基础还不够成熟、以及公众和投资者对AI的过高期望与实际能力的差距导致资金支持减少。'
},
// 多选题 (5题,每题6分)
{
type: 'multiple',
score: 6,
question: '人工智能的三大学派分别是什么?它们各自的核心思想是什么?',
options: ['符号主义(基于逻辑推理)', '连接主义(模拟神经网络)', '行为主义(感知-行动循环)', '进化主义(遗传算法)'],
correct: [0, 1, 2],
explanation: 'AI的三大学派是:符号主义(强调逻辑推理和知识表示)、连接主义(模拟大脑神经网络结构)、行为主义(强调通过与环境交互学习)。进化主义虽然重要,但不属于传统三大学派。'
},
{
type: 'multiple',
score: 6,
question: '当前人工智能技术发展的关键驱动因素包括哪些?',
options: ['算法创新(如Transformer架构)', '计算能力提升(如GPU、TPU)', '大数据可用性增加', '云计算和分布式技术'],
correct: [0, 1, 2, 3],
explanation: '现代AI发展的四大驱动力:算法创新提供了更有效的模型架构;硬件进步提供了强大算力;大数据为模型训练提供了丰富素材;云计算使得AI技术更容易获取和部署。'
},
{
type: 'multiple',
score: 6,
question: '以下哪些是人工智能在现实生活中的典型应用案例?',
options: ['智能手机的人脸识别解锁', '电商平台的个性化推荐', '导航软件的实时路径规划', '智能音箱的语音交互'],
correct: [0, 1, 2, 3],
explanation: '这些都是AI技术的实际应用:人脸识别属于计算机视觉;个性化推荐属于推荐算法;路径规划属于智能决策;语音交互涉及语音识别和自然语言处理。'
},
{
type: 'multiple',
score: 6,
question: '强人工智能(AGI)与弱人工智能的区别在于哪些方面?',
options: ['任务范围(专用vs通用)', '学习能力(特定vs泛化)', '自主性(受限vs独立)', '发展阶段(已实现vs未来目标)'],
correct: [0, 1, 2, 3],
explanation: '强AI(AGI)与弱AI的主要区别:任务范围上强AI能处理任何智力任务而弱AI只能处理特定任务;学习能力上强AI具有通用学习能力;自主性上强AI更独立;发展阶段上目前只有弱AI被实现。'
},
{
type: 'multiple',
score: 6,
question: '人工智能发展过程中出现了哪些重要的里程碑事件?',
options: ['1956年达特茅斯会议确立AI学科', '1997年深蓝战胜国际象棋世界冠军', '2012年AlexNet在图像识别竞赛中获胜', '2022年ChatGPT引发大语言模型热潮'],
correct: [0, 1, 2, 3],
explanation: '这些都是AI发展的重要里程碑:达特茅斯会议标志AI诞生;深蓝证明了AI在复杂游戏中的能力;AlexNet开启了深度学习时代;ChatGPT展现了大语言模型的强大能力。'
},
// 判断题 (5题,每题3分)
{
type: 'judgment',
score: 3,
question: '人工智能的目标就是完全复制人类的思维过程和智能表现。',
correct: false,
explanation: '这种理解是错误的。AI的目标不是完全复制人类智能,而是要解决实际问题。AI可能用与人类完全不同的方式达到甚至超越人类的智能表现,如AlphaGo的下棋策略就与人类思维模式不同。'
},
{
type: 'judgment',
score: 3,
question: '图灵测试是评估人工智能水平的完美标准,通过图灵测试的系统就具有了真正的智能。',
correct: false,
explanation: '图灵测试虽然是重要的评估标准,但并不完美。它只考虑了语言交互能力,忽略了其他智能表现如创造力、情感理解、身体技能等。通过图灵测试只能说明系统在对话方面表现优秀。'
},
{
type: 'judgment',
score: 3,
question: '深度学习是机器学习的唯一有效方法,传统机器学习方法已经过时。',
correct: false,
explanation: '这是错误的。深度学习虽然在很多领域表现出色,但传统机器学习方法(如决策树、SVM、线性回归等)在某些场景下仍然非常有效,特别是在数据量较小或需要解释性的场合。'
},
{
type: 'judgment',
score: 3,
question: '人工智能的发展经历了多次起伏,包括两次著名的"AI寒冬"。',
correct: true,
explanation: '这是正确的。AI发展史上确实经历了两次"AI寒冬":第一次在1970年代,第二次在1980年代末到1990年代初。这些低潮期主要由于技术限制、资金短缺和过高期望没有实现导致。'
},
{
type: 'judgment',
score: 3,
question: '目前的人工智能技术还处于弱人工智能阶段,强人工智能(AGI)尚未实现。',
correct: true,
explanation: '这是正确的。目前所有的AI系统都属于弱人工智能,只能在特定领域表现出智能行为。强人工智能(AGI)能够在任何智力任务上达到或超越人类水平,这一目标尚未实现,是当前AI研究的终极目标。'
}
];
}
function generateAIHistoryQuestions() {
return [
{
type: 'single',
score: 3,
question: 'AI发展史上第一次"AI寒冬"发生在哪个年代?',
options: ['1960年代', '1970年代', '1980年代', '1990年代'],
correct: 1,
explanation: '第一次AI寒冬发生在1970年代,主要由于技术限制和过高期望未能实现。'
}
];
}
function generateMLBasicsQuestions() {
return [
{
type: 'single',
score: 3,
question: '监督学习和无监督学习的主要区别是什么?',
options: ['算法复杂度不同', '数据量要求不同', '是否有标注数据', '计算时间不同'],
correct: 2,
explanation: '监督学习使用有标注的数据进行训练,而无监督学习使用无标注数据。'
}
];
}
function generateNeuralNetworkQuestions() {
return [
{
type: 'single',
score: 3,
question: '神经网络中激活函数的主要作用是什么?',
options: ['加快训练速度', '引入非线性变换', '减少参数数量', '防止过拟合'],
correct: 1,
explanation: '激活函数的主要作用是引入非线性变换,使神经网络能够学习复杂的非线性关系。'
}
];
}
function generateNLPQuestions() {
return [
{
type: 'single',
score: 3,
question: 'Word2Vec算法的主要目的是什么?',
options: ['文本分类', '词向量表示', '语法分析', '机器翻译'],
correct: 1,
explanation: 'Word2Vec算法主要用于将词语转换为稠密的向量表示,捕捉词语之间的语义关系。'
}
];
}
function generateComputerVisionQuestions() {
return [
{
type: 'single',
score: 3,
question: '卷积神经网络(CNN)中池化层的主要作用是什么?',
options: ['增加特征维度', '减少参数数量和计算量', '增强非线性', '防止梯度消失'],
correct: 1,
explanation: '池化层主要用于降采样,减少特征图的空间尺寸,从而减少参数数量和计算量。'
}
];
}
function generateDefaultQuestions() {
return [
// 默认题目集
{
type: 'single',
score: 3,
question: '这是一个示例单选题?',
options: ['选项A', '选项B', '选项C', '选项D'],
correct: 0,
explanation: '这是示例解析。'
}
// ... 可以添加更多默认题目
];
}
function renderTestQuestions() {
const form = document.getElementById('testForm');
let html = '';
// 按题型分组
const singleChoiceQuestions = testQuestions.filter(q => q.type === 'single');
const multipleChoiceQuestions = testQuestions.filter(q => q.type === 'multiple');
const judgmentQuestions = testQuestions.filter(q => q.type === 'judgment');
// 渲染单选题
if (singleChoiceQuestions.length > 0) {
html += `
<div class="question-section">
<div class="section-title">单选题 (每题3分,共${singleChoiceQuestions.length * 3}分)</div>
${singleChoiceQuestions.map((q, index) => renderQuestion(q, index, 'single')).join('')}
</div>
`;
}
// 渲染多选题
if (multipleChoiceQuestions.length > 0) {
html += `
<div class="question-section">
<div class="section-title">多选题 (每题6分,共${multipleChoiceQuestions.length * 6}分)</div>
${multipleChoiceQuestions.map((q, index) => renderQuestion(q, index + singleChoiceQuestions.length, 'multiple')).join('')}
</div>
`;
}
// 渲染判断题
if (judgmentQuestions.length > 0) {
html += `
<div class="question-section">
<div class="section-title">判断题 (每题3分,共${judgmentQuestions.length * 3}分)</div>
${judgmentQuestions.map((q, index) => renderJudgmentQuestion(q, index + singleChoiceQuestions.length + multipleChoiceQuestions.length)).join('')}
</div>
`;
}
form.innerHTML = html;
}
function renderQuestion(question, index, type) {
const inputType = type === 'single' ? 'radio' : 'checkbox';
const name = `question_${index}`;
return `
<div class="question">
<div class="question-header">
<div class="question-number">${index + 1}</div>
<div class="question-text">${question.question}</div>
<div class="question-score">${question.score}分</div>
</div>
<div class="options">
${question.options.map((option, optionIndex) => `
<div class="option">
<input type="${inputType}" name="${name}" value="${optionIndex}" id="${name}_${optionIndex}" onchange="updateAnswer(${index}, ${optionIndex}, '${type}')">
<label for="${name}_${optionIndex}">${String.fromCharCode(65 + optionIndex)}. ${option}</label>
</div>
`).join('')}
</div>
</div>
`;
}
function renderJudgmentQuestion(question, index) {
const name = `question_${index}`;
return `
<div class="question">
<div class="question-header">
<div class="question-number">${index + 1}</div>
<div class="question-text">${question.question}</div>
<div class="question-score">${question.score}分</div>
</div>
<div class="options">
<div class="option">
<input type="radio" name="${name}" value="true" id="${name}_true" onchange="updateAnswer(${index}, true, 'judgment')">
<label for="${name}_true">正确</label>
</div>
<div class="option">
<input type="radio" name="${name}" value="false" id="${name}_false" onchange="updateAnswer(${index}, false, 'judgment')">
<label for="${name}_false">错误</label>
</div>
</div>
</div>
`;
}
function updateAnswer(questionIndex, value, type) {
if (type === 'multiple') {
if (!userAnswers[questionIndex]) {
userAnswers[questionIndex] = [];
}
const answers = userAnswers[questionIndex];
const index = answers.indexOf(value);
if (index > -1) {
answers.splice(index, 1);
} else {
answers.push(value);
}
} else {
userAnswers[questionIndex] = value;
}
}
function submitTest() {
// 检查是否所有题目都已回答
const unansweredQuestions = [];
for (let i = 0; i < testQuestions.length; i++) {
if (userAnswers[i] === undefined || (Array.isArray(userAnswers[i]) && userAnswers[i].length === 0)) {
unansweredQuestions.push(i + 1);
}
}
if (unansweredQuestions.length > 0) {
alert(`请完成所有题目!未回答的题目:第${unansweredQuestions.join('、')}题`);
return;
}
// 计算得分
let totalScore = 0;
let correctCount = 0;
testQuestions.forEach((question, index) => {
const userAnswer = userAnswers[index];
let isCorrect = false;
if (question.type === 'multiple') {
// 多选题:所有正确答案都选中且没有错误答案
const correctAnswers = question.correct.sort();
const userAnswersSorted = userAnswer.sort();
isCorrect = JSON.stringify(correctAnswers) === JSON.stringify(userAnswersSorted);
} else if (question.type === 'judgment') {
// 判断题
isCorrect = userAnswer === question.correct;
} else {
// 单选题
isCorrect = userAnswer === question.correct;
}
if (isCorrect) {
totalScore += question.score;
correctCount++;
}
});
// 显示结果
showTestResult(totalScore, correctCount);
}
function showTestResult(score, correctCount) {
document.getElementById('testContent').style.display = 'none';
document.getElementById('resultContent').style.display = 'block';
// 显示总分和正确率
document.getElementById('resultScore').textContent = `${score}分`;
document.getElementById('resultPercentage').textContent = `${Math.round(score / 60 * 100)}%`;
let message = '';
if (score >= 54) message = '优秀!您对本章节内容掌握得很好!';
else if (score >= 48) message = '良好!继续加油!';
else if (score >= 36) message = '及格!还需要进一步学习。';
else message = '需要加强!建议重新学习本章节内容。';
document.getElementById('resultMessage').textContent = message;
// 显示详细结果
renderDetailedResults();
}
function renderDetailedResults() {
const resultDetails = document.getElementById('resultDetails');
let html = '<h3 style="margin-bottom: 20px; color: #2d3748;">详细解析</h3>';
testQuestions.forEach((question, index) => {
const userAnswer = userAnswers[index];
let isCorrect = false;
let correctDisplay = '';
let userDisplay = '';
if (question.type === 'multiple') {
const correctAnswers = question.correct.sort();
const userAnswersSorted = Array.isArray(userAnswer) ? userAnswer.sort() : [];
isCorrect = JSON.stringify(correctAnswers) === JSON.stringify(userAnswersSorted);
correctDisplay = question.correct.map(i => String.fromCharCode(65 + i)).join('');
userDisplay = userAnswersSorted.map(i => String.fromCharCode(65 + i)).join('');
} else if (question.type === 'judgment') {
isCorrect = userAnswer === question.correct;
correctDisplay = question.correct ? '正确' : '错误';
userDisplay = userAnswer ? '正确' : '错误';
} else {
isCorrect = userAnswer === question.correct;
correctDisplay = String.fromCharCode(65 + question.correct);
userDisplay = String.fromCharCode(65 + userAnswer);
}
html += `
<div class="result-question">
<div class="result-question-text">
${index + 1}. ${question.question} (${question.score}分)
</div>
<div style="margin: 10px 0;">
<strong>正确答案:</strong><span style="color: #22543d;">${correctDisplay}</span> &nbsp;&nbsp;
<strong>您的答案:</strong><span style="color: ${isCorrect ? '#22543d' : '#c53030'};">${userDisplay}</span> &nbsp;&nbsp;
<span style="color: ${isCorrect ? '#22543d' : '#c53030'}; font-weight: 600;">
${isCorrect ? '✓ 正确' : '✗ 错误'}
</span>
</div>
${question.type !== 'judgment' ? `
<div class="result-options">
${question.options.map((option, optionIndex) => {
let className = '';
if (question.type === 'multiple') {
if (question.correct.includes(optionIndex)) className += 'correct ';
if (userAnswer && userAnswer.includes(optionIndex)) className += 'user-answer ';
if (userAnswer && userAnswer.includes(optionIndex) && !question.correct.includes(optionIndex)) className += 'wrong ';
} else {
if (optionIndex === question.correct) className += 'correct ';
if (optionIndex === userAnswer) className += 'user-answer ';
if (optionIndex === userAnswer && optionIndex !== question.correct) className += 'wrong ';
}
return `<div class="result-option ${className}">${String.fromCharCode(65 + optionIndex)}. ${option}</div>`;
}).join('')}
</div>
` : ''}
<div class="result-explanation">
<div class="result-explanation-title">解析:</div>
<div class="result-explanation-text">${question.explanation}</div>
</div>
</div>
`;
});
resultDetails.innerHTML = html;
}
function retryTest() {
userAnswers = {};
document.getElementById('testContent').style.display = 'block';
document.getElementById('resultContent').style.display = 'none';
renderTestQuestions();
}
</script>
</body>
</html>
\ No newline at end of file
...@@ -6,8 +6,8 @@ import { getSignature, uploadFile } from '@/api/base' ...@@ -6,8 +6,8 @@ import { getSignature, uploadFile } from '@/api/base'
const props = defineProps({ const props = defineProps({
height: { height: {
type: Number, type: Number,
default: 600 default: 600,
} },
}) })
const ImageUploadHandler = (blobInfo: any) => const ImageUploadHandler = (blobInfo: any) =>
...@@ -26,7 +26,7 @@ const ImageUploadHandler = (blobInfo: any) => ...@@ -26,7 +26,7 @@ const ImageUploadHandler = (blobInfo: any) =>
signature, signature,
success_action_status: '200', success_action_status: '200',
file, file,
url: `${host}/${key}` url: `${host}/${key}`,
} }
uploadFile(params) uploadFile(params)
.then((res: any) => { .then((res: any) => {
...@@ -58,12 +58,12 @@ const init = { ...@@ -58,12 +58,12 @@ const init = {
quickbars_insert_toolbar: false, quickbars_insert_toolbar: false,
// style_formats: [{ title: '悬挂缩进', block: 'p', styles: { textIndent: '-2em', paddingLeft: '2em' } }], // style_formats: [{ title: '悬挂缩进', block: 'p', styles: { textIndent: '-2em', paddingLeft: '2em' } }],
content_style: 'img {max-width:100%;}', content_style: 'img {max-width:100%;}',
plugins: ['paste'], // plugins: ['paste'],
paste_auto_cleanup_on_paste: true, // paste_auto_cleanup_on_paste: true,
paste_remove_styles: true, // paste_remove_styles: true,
paste_remove_styles_if_webkit: true, // paste_remove_styles_if_webkit: true,
paste_strip_class_attributes: true, // paste_strip_class_attributes: true,
paste_as_text: true // paste_as_text: true,
} }
</script> </script>
......
<script lang="ts" setup>
import { ref, onMounted, nextTick } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus, Edit, Delete } from '@element-plus/icons-vue'
import KnowledgeGraph from './KnowledgeGraph.vue'
interface KnowledgeNode {
id: string
label: string
children?: KnowledgeNode[]
isEdit?: boolean
originalLabel?: string
}
const props = defineProps<{
chapterName: string
chapterID: string
}>()
const emit = defineEmits<{
(e: 'update:modelValue', value: boolean): void
(e: 'create'): void
}>()
const activeName = ref('first')
// 树形数据
const treeData = ref<KnowledgeNode[]>([])
const treeRef = ref()
const inputRef = ref()
// 获取localStorage key
const getStorageKey = () => `knowledge_tree_${props.chapterID}`
// 从localStorage加载数据
const loadFromStorage = () => {
try {
const stored = localStorage.getItem(getStorageKey())
if (stored) {
treeData.value = JSON.parse(stored)
}
} catch (error) {
console.error('加载知识点数据失败:', error)
treeData.value = []
}
}
// 保存到localStorage
const saveToStorage = () => {
try {
localStorage.setItem(getStorageKey(), JSON.stringify(treeData.value))
} catch (error) {
console.error('保存知识点数据失败:', error)
ElMessage.error('保存失败')
}
}
// 生成唯一ID
const generateId = () => {
return Date.now().toString(36) + Math.random().toString(36).substr(2)
}
// 添加根节点
const addRootNode = () => {
if (treeData.value.length > 0) {
ElMessage.warning('只能添加一个根节点')
return
}
const newNode = {
id: generateId(),
label: '新知识点',
children: [],
isEdit: true,
}
treeRef.value?.append(newNode)
treeRef.value?.setCurrentNode(newNode, true)
// 确保新节点可见并聚焦
nextTick(() => {
setTimeout(() => {
inputRef.value?.focus()
inputRef.value?.select()
}, 100)
})
saveToStorage()
}
// 添加子节点
const addChildNode = (parentNode: KnowledgeNode) => {
const newNode: KnowledgeNode = {
id: generateId(),
label: '新知识点',
children: [],
isEdit: true,
}
treeRef.value?.append(newNode, parentNode)
treeRef.value?.setCurrentNode(newNode, true)
nextTick(() => {
setTimeout(() => {
inputRef.value?.focus()
inputRef.value?.select()
}, 100)
})
saveToStorage()
}
// 编辑节点
const editNode = (node: KnowledgeNode) => {
// 保存原始值,用于取消时恢复
node.originalLabel = node.label
node.isEdit = true
nextTick(() => {
inputRef.value?.focus()
inputRef.value?.select()
})
}
// 保存编辑
const saveEdit = (node: KnowledgeNode) => {
const trimmedLabel = node.label.trim()
if (!trimmedLabel) {
ElMessage.warning('知识点名称不能为空')
// 恢复原始值
if (node.originalLabel) {
node.label = node.originalLabel
}
return
}
// 检查是否有重复名称(同级节点)
const parent = findParentNode(treeData.value, node.id)
const siblings = parent ? parent.children : treeData.value
if (siblings) {
const duplicate = siblings.find((sibling) => sibling.id !== node.id && sibling.label.trim() === trimmedLabel)
if (duplicate) {
ElMessage.warning('同级节点中已存在相同名称的知识点')
inputRef.value?.focus()
inputRef.value?.select()
return
}
}
node.label = trimmedLabel
node.isEdit = false
delete node.originalLabel
saveToStorage()
}
// 取消编辑
const cancelEdit = (node: KnowledgeNode) => {
// 恢复原始值
if (node.originalLabel) {
node.label = node.originalLabel
delete node.originalLabel
}
node.isEdit = false
// 如果是新节点且没有子节点,则删除
if (node.label === '新知识点' && (!node.children || node.children.length === 0)) {
deleteNode(node)
}
}
// 删除节点
const deleteNode = async (node: KnowledgeNode) => {
try {
await ElMessageBox.confirm('确定要删除这个知识点吗?删除后其子知识点也会被删除。', '确认删除', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
treeRef.value?.remove(node)
saveToStorage()
ElMessage.success('删除成功')
} catch {
// 用户取消删除
}
}
// 处理键盘事件
const handleKeydown = (event: KeyboardEvent, node: KnowledgeNode) => {
if (event.key === 'Enter') {
saveEdit(node)
} else if (event.key === 'Escape') {
cancelEdit(node)
}
}
// 查找父节点
const findParentNode = (nodes: KnowledgeNode[], targetId: string): KnowledgeNode | null => {
for (const node of nodes) {
if (node.children) {
const found = node.children.find((child) => child.id === targetId)
if (found) {
return node
}
const parent = findParentNode(node.children, targetId)
if (parent) {
return parent
}
}
}
return null
}
onMounted(() => {
loadFromStorage()
})
</script>
<template>
<el-dialog draggable width="800px" title="添加知识点" :model-value="true" @close="emit('update:modelValue', false)">
<el-tabs v-model="activeName">
<el-tab-pane label="树状结构" name="first">
<div class="knowledge-tree-container">
<!-- 工具栏 -->
<div class="toolbar">
<div class="toolbar-left">
<el-button type="primary" @click="addRootNode" :icon="Plus"> 添加根节点 </el-button>
</div>
<div class="toolbar-tip">
<el-icon><Edit /></el-icon>
<span>提示:双击节点名称可直接编辑</span>
</div>
</div>
<!-- 树形结构 -->
<div class="tree-wrapper">
<el-tree
ref="treeRef"
node-key="id"
highlight-current
:data="treeData"
:expand-on-click-node="false"
:default-expand-all="false"
class="knowledge-tree">
<template #default="{ data }">
<div class="knowledge-tree-node" :data-node-id="data.id">
<!-- 编辑模式 -->
<div v-if="data.isEdit" class="edit-mode">
<el-input
v-model="data.label"
size="small"
placeholder="请输入知识点名称"
maxlength="50"
show-word-limit
@keydown="(event: KeyboardEvent) => handleKeydown(event, data)"
@blur="saveEdit(data)"
ref="inputRef"
style="width: 100%" />
</div>
<!-- 显示模式 -->
<div v-else class="display-mode">
<span class="node-label" @dblclick="editNode(data)">
{{ data.label }}
</span>
<div class="node-actions">
<el-button text size="small" :icon="Plus" @click="addChildNode(data)"> 添加 </el-button>
<el-button text size="small" :icon="Edit" @click="editNode(data)"> 编辑 </el-button>
<el-button text size="small" :icon="Delete" @click="deleteNode(data)"> 删除 </el-button>
</div>
</div>
</div>
</template>
<template #empty>
<el-empty description="暂无知识点,点击上方按钮添加根节点" />
</template>
</el-tree>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="脑图预览" name="second" lazy>
<div style="width: 100%; height: 400px">
<KnowledgeGraph :treeData="treeData" />
</div>
</el-tab-pane>
</el-tabs>
<template #footer>
<span>
<el-button @click="emit('update:modelValue', false)">取消</el-button>
<el-button type="primary" @click="emit('update:modelValue', false)">确定</el-button>
</span>
</template>
</el-dialog>
</template>
<style scoped>
.knowledge-tree-container {
min-height: 400px;
}
.toolbar {
margin-bottom: 16px;
padding: 12px;
background-color: #f5f7fa;
border-radius: 4px;
display: flex;
justify-content: space-between;
align-items: center;
}
.toolbar-left {
display: flex;
gap: 12px;
}
.toolbar-tip {
display: flex;
align-items: center;
gap: 6px;
color: #909399;
font-size: 12px;
}
.tree-wrapper {
border: 1px solid #e4e7ed;
border-radius: 4px;
min-height: 300px;
position: relative;
}
.knowledge-tree {
padding: 16px;
}
.knowledge-tree-node {
display: flex;
align-items: center;
width: 100%;
min-height: 32px;
}
.edit-mode {
width: 100%;
padding: 8px;
border-radius: 4px;
}
.display-mode {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 8px 12px;
border-radius: 4px;
transition: background-color 0.2s;
}
.node-label {
flex: 1;
margin-right: 8px;
font-weight: 500;
color: #303133;
cursor: pointer;
padding: 2px 4px;
border-radius: 2px;
transition: background-color 0.2s;
}
.node-actions {
display: flex;
gap: 4px;
opacity: 0;
transition: opacity 0.2s;
}
.display-mode:hover .node-actions {
opacity: 1;
}
.empty-state {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
/* 覆盖 element-plus 树组件样式 */
:deep(.el-tree-node__content) {
height: auto;
padding: 0;
}
:deep(.el-tree-node__expand-icon) {
margin-right: 8px;
}
:deep(.el-tree-node__label) {
width: 100%;
}
</style>
<script setup lang="ts">
import { ref, watch, onMounted } from 'vue'
import { use } from 'echarts/core'
import VChart from 'vue-echarts'
import { GraphChart } from 'echarts/charts'
import { TitleComponent, TooltipComponent } from 'echarts/components'
import { CanvasRenderer } from 'echarts/renderers'
use([GraphChart, TitleComponent, TooltipComponent, CanvasRenderer])
interface KnowledgeNode {
id: string
label: string
children?: KnowledgeNode[]
}
const props = defineProps<{ treeData: KnowledgeNode[] }>()
const collapsedSet = ref<Set<string>>(new Set())
const chartOption = ref({})
function treeToGraph(tree: KnowledgeNode[]) {
const nodes: any[] = []
const links: any[] = []
function traverse(node: KnowledgeNode, parent: KnowledgeNode | null = null) {
nodes.push({
id: node.id,
name: node.label,
symbolSize: 50,
itemStyle: { color: collapsedSet.value.has(node.id) ? '#91cc75' : '#fac858' },
})
if (parent) {
links.push({
source: parent.id,
target: node.id,
})
}
if (!collapsedSet.value.has(node.id) && node.children) {
node.children.forEach((child) => traverse(child, node))
}
}
tree.forEach((root) => traverse(root))
return { nodes, links }
}
function updateOption() {
const { nodes, links } = treeToGraph(props.treeData)
chartOption.value = {
backgroundColor: '#222',
series: [
{
type: 'graph',
layout: 'force',
roam: true,
data: nodes,
links: links,
label: {
show: true,
color: '#fff',
},
force: {
repulsion: 200,
edgeLength: 100,
},
lineStyle: {
color: '#aaa',
},
},
],
}
}
function onChartClick(params: any) {
if (params.dataType === 'node') {
const nodeId = params.data.id
if (collapsedSet.value.has(nodeId)) {
collapsedSet.value.delete(nodeId)
} else {
collapsedSet.value.add(nodeId)
}
updateOption()
}
}
watch(() => props.treeData, updateOption, { deep: true })
onMounted(updateOption)
</script>
<template>
<VChart :option="chartOption" autoresize style="width: 100%; height: 100%" @click="onChartClick" />
</template>
...@@ -14,6 +14,7 @@ import VideoPlayDialog from '../components/stepTwoComponents/VideoPlayDialog.vue ...@@ -14,6 +14,7 @@ import VideoPlayDialog from '../components/stepTwoComponents/VideoPlayDialog.vue
import AddChapterDialog from '../components/stepTwoComponents/AddChapterDialog.vue' import AddChapterDialog from '../components/stepTwoComponents/AddChapterDialog.vue'
import AddTextbookDialog from '../components/stepTwoComponents/AddTextbookDialog.vue' import AddTextbookDialog from '../components/stepTwoComponents/AddTextbookDialog.vue'
import AddGraphbookDialog from '../components/stepTwoComponents/AddGraphbookDialog.vue' import AddGraphbookDialog from '../components/stepTwoComponents/AddGraphbookDialog.vue'
import AddKnowledge from '../components/stepTwoComponents/AddKnowledge.vue'
import OpenRules from '../components/stepTwoComponents/OpenRules.vue' import OpenRules from '../components/stepTwoComponents/OpenRules.vue'
const route = useRoute() const route = useRoute()
...@@ -47,44 +48,48 @@ const flag = ref(false) ...@@ -47,44 +48,48 @@ const flag = ref(false)
const btnList = [ const btnList = [
{ {
btn_name: '视频', btn_name: '视频',
resource_type: '2' resource_type: '2',
}, },
{ {
btn_name: '课件', btn_name: '课件',
resource_type: '10' resource_type: '10',
}, },
{ {
btn_name: '教案', btn_name: '教案',
resource_type: '11' resource_type: '11',
}, },
{ {
btn_name: '资料', btn_name: '资料',
resource_type: '4' resource_type: '4',
}, },
{ {
btn_name: '作业', btn_name: '作业',
resource_type: '3' resource_type: '3',
}, },
{ {
btn_name: '考试', btn_name: '考试',
resource_type: '9' resource_type: '9',
}, },
{ {
btn_name: '直播', btn_name: '直播',
resource_type: '6' resource_type: '6',
},
{
btn_name: '知识点',
resource_type: '999',
}, },
{ {
btn_name: '关联数字教材', btn_name: '关联数字教材',
resource_type: '13' resource_type: '13',
}, },
{ {
btn_name: '关联知识图谱', btn_name: '关联知识图谱',
resource_type: '14' resource_type: '14',
} },
] ]
const defaultProps = { const defaultProps = {
children: 'children', children: 'children',
label: 'name' label: 'name',
} }
// 获取章节列表 // 获取章节列表
...@@ -182,6 +187,8 @@ const handleAddDialog = (node: any, item: any, data: any) => { ...@@ -182,6 +187,8 @@ const handleAddDialog = (node: any, item: any, data: any) => {
isShowTextbookDialog.value = true isShowTextbookDialog.value = true
} else if (item.resource_type === '14') { } else if (item.resource_type === '14') {
isShowTextbookDialog2.value = true isShowTextbookDialog2.value = true
} else if (item.resource_type === '999') {
isShowKnowledgeDialog.value = true
} }
} }
//查阅 //查阅
...@@ -190,7 +197,7 @@ const handleConsult = (node: any) => { ...@@ -190,7 +197,7 @@ const handleConsult = (node: any) => {
// 视频 // 视频
if (node.data.resource_type === '2') { if (node.data.resource_type === '2') {
getVideoDetails({ id: node.data.resource_id }).then(res => { getVideoDetails({ id: node.data.resource_id }).then((res) => {
videoUrl.value = res.data.play_auth.play_info_list.filter((item: any) => item.Definition === 'SD')[0].PlayURL videoUrl.value = res.data.play_auth.play_info_list.filter((item: any) => item.Definition === 'SD')[0].PlayURL
isShowVideoPlayDialog.value = true isShowVideoPlayDialog.value = true
}) })
...@@ -225,7 +232,7 @@ const handleDrop = (startNode: any, endNode: any, position: any) => { ...@@ -225,7 +232,7 @@ const handleDrop = (startNode: any, endNode: any, position: any) => {
course_id: id, course_id: id,
id: startNode.data.id, id: startNode.data.id,
brother_id: endNode.data.id, brother_id: endNode.data.id,
type: position type: position,
} }
dragChapterList(params).then(() => { dragChapterList(params).then(() => {
handleChapterList() handleChapterList()
...@@ -340,7 +347,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -340,7 +347,7 @@ const handleChangeStatus = (node: any, data: any) => {
resource_type: node.data.resource_type, resource_type: node.data.resource_type,
name: node.label, name: node.label,
resource_id: node.data.resource_id, resource_id: node.data.resource_id,
can_download: node.can_download can_download: node.can_download,
} }
createCharacter(params).then(() => { createCharacter(params).then(() => {
ElMessage.success('设置下载控制成功') ElMessage.success('设置下载控制成功')
...@@ -351,13 +358,15 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -351,13 +358,15 @@ const handleChangeStatus = (node: any, data: any) => {
id: data.id, id: data.id,
name: node.label, name: node.label,
resource_id: node.data.resource_id, resource_id: node.data.resource_id,
can_download: node.data.can_download can_download: node.data.can_download,
} }
editCharacter(params).then(() => { editCharacter(params).then(() => {
ElMessage.success('设置下载控制成功') ElMessage.success('设置下载控制成功')
}) })
} }
} }
const isShowKnowledgeDialog = ref(false)
</script> </script>
<template> <template>
<AppCard :title="isEditCourse === '1' ? '编辑课程' : '新建课程'"> <AppCard :title="isEditCourse === '1' ? '编辑课程' : '新建课程'">
...@@ -387,8 +396,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -387,8 +396,7 @@ const handleChangeStatus = (node: any, data: any) => {
@node-drop="handleDrop" @node-drop="handleDrop"
style="min-width: 100%" style="min-width: 100%"
@node-expand="handleNodeExpand" @node-expand="handleNodeExpand"
@node-collapse="handleNodeCollapse" @node-collapse="handleNodeCollapse">
>
<!-- --> <!-- -->
<template #default="{ node, data }"> <template #default="{ node, data }">
<span class="custom-tree-node"> <span class="custom-tree-node">
...@@ -450,8 +458,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -450,8 +458,7 @@ const handleChangeStatus = (node: any, data: any) => {
class="btn_operate" class="btn_operate"
v-if="data.depth === '1' || data.depth === '2'" v-if="data.depth === '1' || data.depth === '2'"
@click="handleOpenRules(node, data)" @click="handleOpenRules(node, data)"
v-permission="'v1-course-set-chapter-rules'" v-permission="'v1-course-set-chapter-rules'">
>
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
&nbsp; 开放规则 &nbsp; 开放规则
</el-button> </el-button>
...@@ -464,8 +471,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -464,8 +471,7 @@ const handleChangeStatus = (node: any, data: any) => {
class="btn_operate" class="btn_operate"
v-for="(item, index) in btnList" v-for="(item, index) in btnList"
:key="index" :key="index"
@click="handleAddDialog(node, item, data)" @click="handleAddDialog(node, item, data)">
>
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
{{ item.btn_name }} {{ item.btn_name }}
</el-button> </el-button>
...@@ -479,8 +485,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -479,8 +485,7 @@ const handleChangeStatus = (node: any, data: any) => {
node.data.resource_type !== '9' && node.data.resource_type !== '9' &&
node.data.resource_type !== '13' && node.data.resource_type !== '13' &&
node.data.resource_type !== '14' node.data.resource_type !== '14'
" ">
>
<span class="btn_operate">学生下载控制:</span> <span class="btn_operate">学生下载控制:</span>
<el-switch <el-switch
class="btn_edit" class="btn_edit"
...@@ -497,8 +502,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -497,8 +502,7 @@ const handleChangeStatus = (node: any, data: any) => {
inactive-value="0" inactive-value="0"
inline-prompt inline-prompt
style="--el-switch-on-color: #aa1941" style="--el-switch-on-color: #aa1941"
@change="handleChangeStatus(node, data)" @change="handleChangeStatus(node, data)"></el-switch>
></el-switch>
</template> </template>
</span> </span>
</span> </span>
...@@ -509,6 +513,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -509,6 +513,7 @@ const handleChangeStatus = (node: any, data: any) => {
>上一步</el-button >上一步</el-button
> >
<el-button type="primary" @click="router.push('/course/my')">保存</el-button> <el-button type="primary" @click="router.push('/course/my')">保存</el-button>
<el-button type="primary"><a :href="`/course/my/preview?id=${id}`" target="_blank">预览</a></el-button>
</div> </div>
</AppCard> </AppCard>
<!-- 更改资源名称 --> <!-- 更改资源名称 -->
...@@ -520,8 +525,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -520,8 +525,7 @@ const handleChangeStatus = (node: any, data: any) => {
:chapterID="chapterID" :chapterID="chapterID"
:course_id="id" :course_id="id"
:sectionName="sectionName" :sectionName="sectionName"
:resourceId="resourceId" :resourceId="resourceId" />
/>
<!-- 添加章 --> <!-- 添加章 -->
<AddChapterDialog <AddChapterDialog
v-if="isShowDialog === true" v-if="isShowDialog === true"
...@@ -530,8 +534,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -530,8 +534,7 @@ const handleChangeStatus = (node: any, data: any) => {
:course_id="id" :course_id="id"
:isEdit="isEdit" :isEdit="isEdit"
:chapterID="chapterID" :chapterID="chapterID"
:chapterName="chapterName" :chapterName="chapterName" />
/>
<!-- 添加小节 --> <!-- 添加小节 -->
<AddSectionDialog <AddSectionDialog
v-if="isShowSectionDialog === true" v-if="isShowSectionDialog === true"
...@@ -541,8 +544,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -541,8 +544,7 @@ const handleChangeStatus = (node: any, data: any) => {
:chapterID="chapterID" :chapterID="chapterID"
:course_id="id" :course_id="id"
:isEdit="isEdit" :isEdit="isEdit"
:sectionName="sectionName" :sectionName="sectionName" />
/>
<!-- 添加直播 --> <!-- 添加直播 -->
<AddLiveDialog <AddLiveDialog
v-if="isShowLiveDialog === true" v-if="isShowLiveDialog === true"
...@@ -551,8 +553,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -551,8 +553,7 @@ const handleChangeStatus = (node: any, data: any) => {
:chapterName="chapterName" :chapterName="chapterName"
:chapterID="chapterID" :chapterID="chapterID"
:course_id="id" :course_id="id"
:btnInfo="btnInfo" :btnInfo="btnInfo" />
/>
<!-- 添加资源 --> <!-- 添加资源 -->
<AddVideoDialog <AddVideoDialog
v-if="isShowAddDialog === true" v-if="isShowAddDialog === true"
...@@ -561,8 +562,7 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -561,8 +562,7 @@ const handleChangeStatus = (node: any, data: any) => {
:chapterName="chapterName" :chapterName="chapterName"
:chapterID="chapterID" :chapterID="chapterID"
:course_id="id" :course_id="id"
:btnInfo="btnInfo" :btnInfo="btnInfo" />
/>
<!-- 添加考试 --> <!-- 添加考试 -->
<AddExamDialog <AddExamDialog
...@@ -574,14 +574,12 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -574,14 +574,12 @@ const handleChangeStatus = (node: any, data: any) => {
:course_id="id" :course_id="id"
:btnInfo="btnInfo" :btnInfo="btnInfo"
:paper_use_list="paper_use_list" :paper_use_list="paper_use_list"
:isMultiple="false" :isMultiple="false" />
/>
<!-- 视频查阅弹框 --> <!-- 视频查阅弹框 -->
<VideoPlayDialog <VideoPlayDialog
v-if="isShowVideoPlayDialog === true" v-if="isShowVideoPlayDialog === true"
v-model:isShowVideoPlayDialog="isShowVideoPlayDialog" v-model:isShowVideoPlayDialog="isShowVideoPlayDialog"
:videoOptions="videoUrl" :videoOptions="videoUrl" />
/>
<OpenRules <OpenRules
v-model:isShowOpenRules="isShowOpenRules" v-model:isShowOpenRules="isShowOpenRules"
v-if="isShowOpenRules === true" v-if="isShowOpenRules === true"
...@@ -590,24 +588,27 @@ const handleChangeStatus = (node: any, data: any) => { ...@@ -590,24 +588,27 @@ const handleChangeStatus = (node: any, data: any) => {
:chapterID="chapterID" :chapterID="chapterID"
:course_id="id" :course_id="id"
:controlInfo="controlInfo" :controlInfo="controlInfo"
@create="handleFresh" @create="handleFresh" />
/>
<AddTextbookDialog <AddTextbookDialog
v-if="isShowTextbookDialog === true" v-if="isShowTextbookDialog === true"
v-model:isShowTextbookDialog="isShowTextbookDialog" v-model:isShowTextbookDialog="isShowTextbookDialog"
@create="handleFresh" @create="handleFresh"
:chapterName="chapterName" :chapterName="chapterName"
:chapterID="chapterID" :chapterID="chapterID"
:course_id="id" :course_id="id" />
/>
<AddGraphbookDialog <AddGraphbookDialog
v-if="isShowTextbookDialog2 === true" v-if="isShowTextbookDialog2 === true"
v-model:isShowTextbookDialog2="isShowTextbookDialog2" v-model:isShowTextbookDialog2="isShowTextbookDialog2"
@create="handleFresh" @create="handleFresh"
:chapterName="chapterName" :chapterName="chapterName"
:chapterID="chapterID" :chapterID="chapterID"
:course_id="id" :course_id="id" />
/> <AddKnowledge
v-model="isShowKnowledgeDialog"
@create="handleFresh"
:chapterName="chapterName"
:chapterID="chapterID"
v-if="isShowKnowledgeDialog === true" />
</template> </template>
<style> <style>
......
...@@ -10,7 +10,8 @@ export const routes: Array<RouteRecordRaw> = [ ...@@ -10,7 +10,8 @@ export const routes: Array<RouteRecordRaw> = [
{ path: '/course/my/view', component: () => import('./views/View.vue') }, { path: '/course/my/view', component: () => import('./views/View.vue') },
// id: 章节id courseId课程id // id: 章节id courseId课程id
{ path: '/course/my/view/:id/:courseId', component: () => import('./views/ViewDetails.vue') }, { path: '/course/my/view/:id/:courseId', component: () => import('./views/ViewDetails.vue') },
{ path: '/course/my/graph', component: () => import('./views/Graph.vue') } { path: '/course/my/graph', component: () => import('./views/Graph.vue') },
] ],
} },
{ path: '/course/my/preview', component: () => import('./views/Preview.vue') },
] ]
<script setup lang="ts">
import { ref, onMounted, computed } from 'vue'
import { useRoute } from 'vue-router'
import { getViewCourseDetails } from '../api'
// 课程详情数据
const courseDetails = ref<any>({})
const collapseData = ref<any[]>([])
const activeNames = ref<string[]>([])
const route = useRoute()
const id = route.query.id as string
// tab切换
const activeTab = ref('study')
const tabList = [
{ label: '学习', name: 'study' },
{ label: '论坛', name: 'forum' },
{ label: '大作业', name: 'homework' },
{ label: '考试', name: 'exam' },
{ label: '课程教务', name: 'affair' },
{ label: '直播', name: 'live' },
{ label: '资料', name: 'material' },
{ label: '数字教材', name: 'ebook' },
]
// 简介/目标切换
const introTab = ref('intro')
const introField = computed(() => (introTab.value === 'intro' ? 'represent' : 'target'))
// 加载状态
const loadingVisible = ref(false)
const loadingText = ref('')
// 获取课程详情
const fetchCourseDetails = async () => {
const res = await getViewCourseDetails({ id })
courseDetails.value = res.data
// 章节处理逻辑,转为el-collapse结构
if (courseDetails.value.chapters?.[0]?.children) {
collapseData.value = courseDetails.value.chapters[0].children.map((chapter: any, cIdx: number) => ({
id: chapter.id,
name: `第${cIdx + 1}章:${chapter.name}`,
rawName: chapter.name,
children: chapter.children.map((section: any) => ({
id: section.id,
name: section.name,
children: (section.children || []).map((res: any) => ({
id: res.id,
name: res.name,
})),
})),
}))
}
}
onMounted(fetchCourseDetails)
const handleStudy = () => {
// 你的学习逻辑
}
const handleClose = () => {
// 关闭页面的逻辑
window.close()
}
// 处理AI功能跳转
const handleAIAction = (type: 'learning' | 'test') => {
const urls = {
learning: '/ai-custom-learning.html',
test: '/ai-unit-test.html',
}
const texts = {
learning: '正在准备AI定制学习环境...',
test: '正在准备AI单元测试环境...',
}
loadingText.value = texts[type]
loadingVisible.value = true
// 3秒后跳转
setTimeout(() => {
loadingVisible.value = false
window.open(urls[type], '_blank')
}, 3000)
}
</script>
<template>
<div class="preview-container-wrapper">
<!-- 头部区域 -->
<div class="preview-header">
<div class="header-content">
<div>
<h1 class="header-title">📚 课程预览</h1>
<p class="header-subtitle">{{ courseDetails.course_alias_name || courseDetails.name }}</p>
</div>
<div class="header-actions">
<el-button @click="handleClose" type="primary" plain size="large">关闭页面</el-button>
</div>
</div>
</div>
<div class="preview-container">
<div class="flex active">
<!-- 头部课程信息区 -->
<div class="course-view-h">
<div class="view-h-l">
<img :src="courseDetails.cover || '/center_resource/course_default.png'" />
<div class="btn" @click="handleStudy">立即学习</div>
</div>
<div class="course-view-r">
<div class="course-view-r__info">
<div class="name">{{ courseDetails.course_alias_name || courseDetails.name }}</div>
<div class="tag-box">
<div class="tag" v-if="courseDetails.required_type_name">{{ courseDetails.required_type_name }}</div>
<div class="tag" v-if="courseDetails.credit">{{ courseDetails.credit }}学分</div>
<div class="tag" v-if="courseDetails.term_name">{{ courseDetails.term_name }}</div>
</div>
</div>
<div class="view-content">
<div class="view-content-hd">
<div :class="introTab === 'intro' ? 'btn active' : 'btn'" @click="introTab = 'intro'">课程简介</div>
<div :class="introTab === 'target' ? 'btn active' : 'btn'" @click="introTab = 'target'">授课目标</div>
</div>
<div class="view-content_c" v-if="!courseDetails[introField]">
<el-empty :image-size="50" style="padding: 0" description="暂无数据"></el-empty>
</div>
<div class="view-content_c" v-else v-html="courseDetails[introField]"></div>
</div>
</div>
</div>
<div class="course-view-teacher">
<div class="teacher-hd">课程讲师</div>
<div class="teacher-content">
<div class="teacher-content-item" v-for="item in courseDetails.lecturers || []" :key="item.id">
<img :src="item.avatar || '/center_resource/avatar.svg'" />
<div class="box">
<div class="name">{{ item.name }}</div>
<div class="dec" v-html="item.summarize"></div>
</div>
</div>
</div>
</div>
</div>
<div class="course-view-bd">
<!-- element-plus tab菜单 -->
<el-tabs v-model="activeTab" class="tabs">
<el-tab-pane v-for="tab in tabList" :key="tab.name" :label="tab.label" :name="tab.name">
<template v-if="tab.name === 'study'">
<!-- 章节内容用el-collapse展示 -->
<div class="collapse-list">
<el-collapse v-model="activeNames" accordion>
<el-collapse-item
v-for="chapter in collapseData"
:key="chapter.id"
:name="chapter.id"
:title="chapter.name">
<template #title>
<div class="chapter-title">
<span>{{ chapter.name }}</span>
<div class="chapter-actions">
<el-button
size="small"
type="primary"
class="ai-btn"
@click.stop="handleAIAction('learning')">
AI定制学习
</el-button>
<el-button size="small" type="success" class="ai-btn" @click.stop="handleAIAction('test')">
AI单元测试
</el-button>
</div>
</div>
</template>
<div class="section-list">
<div v-for="section in chapter.children" :key="section.id" class="section-item">
<div class="section-title">{{ section.name }}</div>
<div class="resource-list">
<div v-for="resource in section.children" :key="resource.id" class="resource-item">
{{ resource.name }}
</div>
</div>
</div>
</div>
</el-collapse-item>
</el-collapse>
</div>
</template>
<template v-else>
<div class="tab-placeholder">{{ tab.label }}内容开发中…</div>
</template>
</el-tab-pane>
</el-tabs>
</div>
</div>
<!-- 自定义加载弹框 -->
<div v-if="loadingVisible" class="custom-loading-modal">
<div class="custom-loading-dialog">
<div class="loading-content">
<div class="loading-icon-wrapper">
<div class="loading-icon">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M12 2V6M12 18V22M4.93 4.93L7.76 7.76M16.24 16.24L19.07 19.07M2 12H6M18 12H22M4.93 19.07L7.76 16.24M16.24 7.76L19.07 4.93"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round" />
</svg>
</div>
</div>
<div class="loading-text-wrapper">
<h3 class="loading-title">{{ loadingText }}</h3>
<p class="loading-subtitle">请稍候,正在为您准备环境...</p>
</div>
<div class="loading-progress">
<div class="progress-bar">
<div class="progress-fill"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.preview-container-wrapper {
height: 100vh;
background-color: #eee;
box-sizing: border-box;
}
// 头部样式
.preview-header {
background: linear-gradient(135deg, #ab0a3d 0%, #d4145a 100%);
color: white;
padding: 20px 0;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
.header-content {
max-width: 1400px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header-title {
font-size: 28px;
font-weight: 600;
margin-bottom: 5px;
}
.header-subtitle {
opacity: 0.9;
font-size: 16px;
}
.header-actions {
.el-button {
padding: 12px 24px;
background: rgba(255, 255, 255, 0.2);
color: white;
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 6px;
font-size: 16px;
font-weight: 500;
transition: all 0.3s ease;
&:hover {
background: rgba(255, 255, 255, 0.3);
transform: translateY(-1px);
}
}
}
}
.preview-container {
max-width: 1400px;
margin: 0 auto;
height: calc(100vh - 140px);
background-color: #fff;
border-radius: 10px;
overflow: hidden;
}
.flex {
display: flex;
&.active {
.course-view-h {
background: #ab0a3d;
box-shadow: 0px 6px 12px 1px rgba(0, 0, 0, 0.05);
}
.view-h-l {
.btn {
background: #fff;
color: #555555;
}
}
.course-view-r {
.name {
color: #fff;
}
.view-content {
.view-content-hd {
.btn {
color: #fff;
&.active {
color: #fff;
font-weight: bold;
}
}
}
.view-content_c {
color: #fff;
}
}
}
}
}
.course-view-h {
flex: 1;
position: relative;
background: linear-gradient(90deg, #dfe4e6 0%, #eaeaea 39%, #b3b3b3 100%);
border-radius: 10px 0 0 10px;
padding: 20px;
box-sizing: border-box;
display: flex;
.view-h-l {
margin-right: 32px;
min-width: 260px;
img {
height: 150px;
width: 100%;
display: block;
border-radius: 12px;
}
.btn {
background: #ab0a3d;
border-radius: 12px;
text-align: center;
font-size: 14px;
font-weight: 400;
color: #fff;
line-height: 37px;
margin-top: 10px;
cursor: pointer;
}
}
.course-view-r {
position: relative;
width: 100%;
.name {
font-size: 20px;
font-weight: bold;
color: #000;
line-height: 100%;
margin-bottom: 20px;
}
.tag-box {
display: flex;
.tag {
padding: 0 9px;
line-height: 23px;
background: #fff;
border-radius: 4px 4px 4px 4px;
font-size: 14px;
color: #555555;
margin-right: 10px;
}
}
.view-content {
border-radius: 9px;
margin-top: 10px;
.view-content_c {
font-size: 12px;
color: #535353;
height: 85px;
overflow: auto;
&::-webkit-scrollbar {
width: 3px;
}
&::-webkit-scrollbar-track {
background-color: rgba(0, 0, 0, 0.2);
border-radius: 30px !important;
}
&::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.5);
border-radius: 30px !important;
}
}
.view-content-hd {
display: flex;
.btn {
line-height: 33px;
margin-right: 18px;
font-size: 14px;
color: #666666;
cursor: pointer;
&.active {
color: #ba143e;
}
}
}
}
}
}
.course-view-teacher {
width: 410px;
background-color: #fff;
border-radius: 0px 10px 10px 0px;
padding: 30px 30px 0 30px;
box-sizing: border-box;
.teacher-hd {
font-size: 20px;
font-weight: bold;
}
.teacher-content {
padding-top: 30px;
box-sizing: border-box;
height: 150px;
overflow: auto;
&::-webkit-scrollbar {
width: 5px;
margin-right: 40px !important;
border-radius: 30px !important;
}
&::-webkit-scrollbar-track {
background-color: #dfe4e6;
opacity: 0.5;
border-radius: 30px !important;
}
&::-webkit-scrollbar-thumb {
background-color: #b3b3b3;
border-radius: 30px !important;
}
.teacher-content-item {
display: flex;
margin-bottom: 30px;
img {
width: 90px;
height: 90px;
border-radius: 50%;
object-fit: cover;
}
}
.box {
margin-left: 30px;
.name {
font-size: 16px;
font-weight: bold;
color: #333333;
line-height: 100%;
margin-bottom: 10px;
}
.dec {
font-size: 12px;
color: #666666;
line-height: 18px;
}
}
}
}
.course-view-bd {
flex: 1;
padding: 10px 20px;
background-color: #fff;
border-radius: 10px 10px 10px 10px;
overflow: hidden;
}
.tabs {
.el-tabs__item {
--el-font-size-base: 16px;
padding: 0 20px !important;
font-weight: 400;
text-align: center;
}
.el-tabs__item.is-active {
font-weight: 500;
}
.el-tabs__active-bar {
padding: 0 20px;
margin-left: -20px;
}
.el-tabs__nav-wrap::after {
height: 1px !important;
}
}
// 新增的 collapse 相关样式
.collapse-list {
.chapter-title {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
.chapter-actions {
display: flex;
gap: 8px;
.ai-btn {
font-size: 12px;
padding: 4px 8px;
}
}
}
.section-list {
.section-item {
margin-bottom: 16px;
padding: 12px;
background-color: #f8f9fa;
border-radius: 6px;
.section-title {
font-weight: 500;
color: #333;
margin-bottom: 8px;
font-size: 14px;
}
.resource-list {
.resource-item {
padding: 6px 12px;
margin: 4px 0;
background-color: #fff;
border-radius: 4px;
font-size: 13px;
color: #666;
border-left: 3px solid #ab0a3d;
&:hover {
background-color: #f0f0f0;
cursor: pointer;
}
}
}
}
}
}
.el-collapse-item__header {
font-size: 16px;
font-weight: 500;
color: #333;
}
.el-collapse-item__content {
padding: 16px;
}
// 自定义加载弹框样式
.custom-loading-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
.custom-loading-dialog {
background-color: white;
border-radius: 24px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);
padding: 40px 30px;
min-width: 420px;
text-align: center;
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.loading-content {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
.loading-icon-wrapper {
margin-bottom: 24px;
position: relative;
z-index: 1;
.loading-icon {
display: inline-block;
width: 60px;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
svg {
width: 32px;
height: 32px;
color: #ab0a3d;
animation: spin 2s linear infinite;
}
}
}
.loading-text-wrapper {
margin-bottom: 24px;
position: relative;
z-index: 1;
text-align: center;
.loading-title {
font-size: 18px;
font-weight: 600;
margin: 0 0 8px 0;
color: #333;
}
.loading-subtitle {
font-size: 14px;
margin: 0;
color: #666;
font-weight: 400;
}
}
.loading-progress {
position: relative;
z-index: 1;
width: 100%;
.progress-bar {
width: 100%;
height: 6px;
background: #f0f0f0;
border-radius: 3px;
overflow: hidden;
position: relative;
.progress-fill {
height: 100%;
background: linear-gradient(90deg, #ab0a3d, #d4145a);
border-radius: 3px;
animation: progress 3s ease-in-out;
}
}
}
}
}
}
// 动画效果
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes progress {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论