ソースを参照

Merge branch 'main' of http://gitlab.smartai.com/qi/xiaoshu

张涛 1 年間 前
コミット
a5801672db

+ 12 - 14
README.md

@@ -6,24 +6,22 @@ This template should help get you started developing with Vue 3 in Vite.
 
 [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
 
-## Customize configuration
-
-See [Vite Configuration Reference](https://vitejs.dev/config/).
-
-## Project Setup
+## 项目设置
 
 ```sh
-npm install
-```
+# 安装项目依赖
+$ npm install 
+$ npm install --legacy-peer-deps
 
-### Compile and Hot-Reload for Development
+# 本地启动项目
+$ npm run dev
 
-```sh
-npm run dev
+# 构建项目
+$ npm run build
 ```
 
-### Compile and Minify for Production
+## 相关资源
 
-```sh
-npm run build
-```
+* [Vite配置参考](https://vitejs.dev/config/).
+* [字节跳动前端框架 arco design](https://arco.design/vue/docs/start)
+* [RAGFlow 开源大模型](https://infiniflow.cn/)

+ 494 - 1
package-lock.json

@@ -28,6 +28,7 @@
         "markmap-view": "^0.17.0",
         "mitt": "^3.0.1",
         "moment": "^2.30.1",
+        "pdfjs-dist": "^4.8.69",
         "pinia": "^2.2.6",
         "pinia-plugin-persistedstate": "^4.1.2",
         "query-string": "^9.1.1",
@@ -2002,6 +2003,37 @@
       "integrity": "sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==",
       "dev": true
     },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "optional": true
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "optional": true,
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
     "node_modules/boolbase": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
@@ -2049,6 +2081,30 @@
         "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
       }
     },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "optional": true,
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
     "node_modules/c12": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/c12/-/c12-2.0.1.tgz",
@@ -2095,6 +2151,21 @@
         }
       ]
     },
+    "node_modules/canvas": {
+      "version": "3.0.0-rc2",
+      "resolved": "https://registry.npmmirror.com/canvas/-/canvas-3.0.0-rc2.tgz",
+      "integrity": "sha512-esx4bYDznnqgRX4G8kaEaf0W3q8xIc51WpmrIitDzmcoEgwnv9wSKdzT6UxWZ4wkVu5+ileofppX0TpyviJRdQ==",
+      "hasInstallScript": true,
+      "optional": true,
+      "dependencies": {
+        "node-addon-api": "^7.0.0",
+        "prebuild-install": "^7.1.1",
+        "simple-get": "^3.0.3"
+      },
+      "engines": {
+        "node": "^18.12.0 || >= 20.9.0"
+      }
+    },
     "node_modules/cheerio": {
       "version": "1.0.0-rc.12",
       "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.12.tgz",
@@ -2743,6 +2814,27 @@
         "node": ">=14.16"
       }
     },
+    "node_modules/decompress-response": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-4.2.1.tgz",
+      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+      "optional": true,
+      "dependencies": {
+        "mimic-response": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "optional": true,
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
     "node_modules/deep-pick-omit": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
@@ -2869,6 +2961,15 @@
       "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.57.tgz",
       "integrity": "sha512-xS65H/tqgOwUBa5UmOuNSLuslDo7zho0y/lgQw35pnrqiZh7UOWHCeL/Bt6noJATbA6tpQJGCifsFsIRZj1Fqg=="
     },
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "optional": true,
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
     "node_modules/entities": {
       "version": "4.5.0",
       "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
@@ -2983,6 +3084,15 @@
         "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
+    "node_modules/expand-template": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz",
+      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/fast-glob": {
       "version": "3.3.2",
       "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -3060,6 +3170,12 @@
         "node": ">= 6"
       }
     },
+    "node_modules/fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+      "optional": true
+    },
     "node_modules/fs-minipass": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz",
@@ -3138,6 +3254,12 @@
         "giget": "dist/cli.mjs"
       }
     },
+    "node_modules/github-from-package": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz",
+      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+      "optional": true
+    },
     "node_modules/glob-parent": {
       "version": "5.1.2",
       "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -3264,6 +3386,26 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "optional": true
+    },
     "node_modules/ignore": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/ignore/-/ignore-6.0.2.tgz",
@@ -3290,6 +3432,18 @@
       "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==",
       "dev": true
     },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "optional": true
+    },
+    "node_modules/ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+      "optional": true
+    },
     "node_modules/internmap": {
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz",
@@ -3721,6 +3875,27 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/mimic-response": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-2.1.0.tgz",
+      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "optional": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/minipass": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz",
@@ -3773,6 +3948,12 @@
         "node": ">=10"
       }
     },
+    "node_modules/mkdirp-classic": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+      "optional": true
+    },
     "node_modules/mlly": {
       "version": "1.7.3",
       "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.3.tgz",
@@ -3827,6 +4008,12 @@
       "resolved": "https://registry.npmmirror.com/nanopop/-/nanopop-2.4.2.tgz",
       "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw=="
     },
+    "node_modules/napi-build-utils": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+      "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
+      "optional": true
+    },
     "node_modules/needle": {
       "version": "3.3.1",
       "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz",
@@ -3843,11 +4030,34 @@
         "node": ">= 4.4.x"
       }
     },
+    "node_modules/node-abi": {
+      "version": "3.71.0",
+      "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.71.0.tgz",
+      "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==",
+      "optional": true,
+      "dependencies": {
+        "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/node-abi/node_modules/semver": {
+      "version": "7.6.3",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "optional": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/node-addon-api": {
       "version": "7.1.1",
       "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
       "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
-      "dev": true,
       "optional": true
     },
     "node_modules/node-fetch-native": {
@@ -3931,6 +4141,15 @@
       "resolved": "https://registry.npmmirror.com/ohash/-/ohash-1.1.4.tgz",
       "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g=="
     },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "optional": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
     "node_modules/onetime": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz",
@@ -3995,11 +4214,32 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/path2d": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/path2d/-/path2d-0.2.2.tgz",
+      "integrity": "sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/pathe": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
       "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
     },
+    "node_modules/pdfjs-dist": {
+      "version": "4.8.69",
+      "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz",
+      "integrity": "sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==",
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "canvas": "^3.0.0-rc2",
+        "path2d": "^0.2.1"
+      }
+    },
     "node_modules/perfect-debounce": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
@@ -4115,6 +4355,93 @@
         "node": "^10 || ^12 || >=14"
       }
     },
+    "node_modules/prebuild-install": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.2.tgz",
+      "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==",
+      "optional": true,
+      "dependencies": {
+        "detect-libc": "^2.0.0",
+        "expand-template": "^2.0.3",
+        "github-from-package": "0.0.0",
+        "minimist": "^1.2.3",
+        "mkdirp-classic": "^0.5.3",
+        "napi-build-utils": "^1.0.1",
+        "node-abi": "^3.3.0",
+        "pump": "^3.0.0",
+        "rc": "^1.2.7",
+        "simple-get": "^4.0.0",
+        "tar-fs": "^2.0.0",
+        "tunnel-agent": "^0.6.0"
+      },
+      "bin": {
+        "prebuild-install": "bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/prebuild-install/node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "optional": true,
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/prebuild-install/node_modules/detect-libc": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.3.tgz",
+      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/prebuild-install/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "optional": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/prebuild-install/node_modules/simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "optional": true,
+      "dependencies": {
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
     "node_modules/prismjs": {
       "version": "1.29.0",
       "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
@@ -4134,6 +4461,16 @@
       "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
       "optional": true
     },
+    "node_modules/pump": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz",
+      "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+      "optional": true,
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
     "node_modules/punycode.js": {
       "version": "2.3.1",
       "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz",
@@ -4177,6 +4514,21 @@
         }
       ]
     },
+    "node_modules/rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "optional": true,
+      "dependencies": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "bin": {
+        "rc": "cli.js"
+      }
+    },
     "node_modules/rc9": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz",
@@ -4186,6 +4538,20 @@
         "destr": "^2.0.3"
       }
     },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "optional": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/readdirp": {
       "version": "4.0.2",
       "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz",
@@ -4249,6 +4615,26 @@
       "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz",
       "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
     },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "optional": true
+    },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -4341,6 +4727,37 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "optional": true
+    },
+    "node_modules/simple-get": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-3.1.1.tgz",
+      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+      "optional": true,
+      "dependencies": {
+        "decompress-response": "^4.2.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
     "node_modules/simple-swizzle": {
       "version": "0.2.2",
       "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -4399,6 +4816,15 @@
       "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.8.0.tgz",
       "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w=="
     },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "optional": true,
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
     "node_modules/strip-final-newline": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
@@ -4410,6 +4836,15 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/strip-literal": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.0.tgz",
@@ -4465,6 +4900,40 @@
         "node": ">=10"
       }
     },
+    "node_modules/tar-fs": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz",
+      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+      "optional": true,
+      "dependencies": {
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
+      }
+    },
+    "node_modules/tar-fs/node_modules/chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "optional": true
+    },
+    "node_modules/tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "optional": true,
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/tar/node_modules/yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
@@ -4491,6 +4960,18 @@
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
     },
+    "node_modules/tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "optional": true,
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/uc.micro": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz",
@@ -4630,6 +5111,12 @@
         "browserslist": ">= 4.21.0"
       }
     },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "optional": true
+    },
     "node_modules/vite": {
       "version": "4.3.7",
       "resolved": "https://registry.npmmirror.com/vite/-/vite-4.3.7.tgz",
@@ -4826,6 +5313,12 @@
         "node": ">= 8"
       }
     },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "optional": true
+    },
     "node_modules/yallist": {
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",

+ 1 - 0
package.json

@@ -29,6 +29,7 @@
     "markmap-view": "^0.17.0",
     "mitt": "^3.0.1",
     "moment": "^2.30.1",
+    "pdfjs-dist": "4.8.69",
     "pinia": "^2.2.6",
     "pinia-plugin-persistedstate": "^4.1.2",
     "query-string": "^9.1.1",

+ 48 - 0
src/assets/files/excel.svg

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Livello_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 2289.75 2130"
+	 enable-background="new 0 0 2289.75 2130" xml:space="preserve">
+<metadata>
+	<sfw  xmlns="&ns_sfw;">
+		<slices></slices>
+		<sliceSourceBounds  bottomLeftOrigin="true" height="2130" width="2289.75" x="-1147.5" y="-1041"></sliceSourceBounds>
+	</sfw>
+</metadata>
+<path fill="#185C37" d="M1437.75,1011.75L532.5,852v1180.393c0,53.907,43.7,97.607,97.607,97.607l0,0h1562.036
+	c53.907,0,97.607-43.7,97.607-97.607l0,0V1597.5L1437.75,1011.75z"/>
+<path fill="#21A366" d="M1437.75,0H630.107C576.2,0,532.5,43.7,532.5,97.607c0,0,0,0,0,0V532.5l905.25,532.5L1917,1224.75
+	L2289.75,1065V532.5L1437.75,0z"/>
+<path fill="#107C41" d="M532.5,532.5h905.25V1065H532.5V532.5z"/>
+<path opacity="0.1" enable-background="new    " d="M1180.393,426H532.5v1331.25h647.893c53.834-0.175,97.432-43.773,97.607-97.607
+	V523.607C1277.825,469.773,1234.227,426.175,1180.393,426z"/>
+<path opacity="0.2" enable-background="new    " d="M1127.143,479.25H532.5V1810.5h594.643
+	c53.834-0.175,97.432-43.773,97.607-97.607V576.857C1224.575,523.023,1180.977,479.425,1127.143,479.25z"/>
+<path opacity="0.2" enable-background="new    " d="M1127.143,479.25H532.5V1704h594.643c53.834-0.175,97.432-43.773,97.607-97.607
+	V576.857C1224.575,523.023,1180.977,479.425,1127.143,479.25z"/>
+<path opacity="0.2" enable-background="new    " d="M1073.893,479.25H532.5V1704h541.393c53.834-0.175,97.432-43.773,97.607-97.607
+	V576.857C1171.325,523.023,1127.727,479.425,1073.893,479.25z"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="203.5132" y1="1729.0183" x2="967.9868" y2="404.9817" gradientTransform="matrix(1 0 0 -1 0 2132)">
+	<stop  offset="0" style="stop-color:#18884F"/>
+	<stop  offset="0.5" style="stop-color:#117E43"/>
+	<stop  offset="1" style="stop-color:#0B6631"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M97.607,479.25h976.285c53.907,0,97.607,43.7,97.607,97.607v976.285
+	c0,53.907-43.7,97.607-97.607,97.607H97.607C43.7,1650.75,0,1607.05,0,1553.143V576.857C0,522.95,43.7,479.25,97.607,479.25z"/>
+<path fill="#FFFFFF" d="M302.3,1382.264l205.332-318.169L319.5,747.683h151.336l102.666,202.35
+	c9.479,19.223,15.975,33.494,19.49,42.919h1.331c6.745-15.336,13.845-30.228,21.3-44.677L725.371,747.79h138.929l-192.925,314.548
+	L869.2,1382.263H721.378L602.79,1160.158c-5.586-9.45-10.326-19.376-14.164-29.66h-1.757c-3.474,10.075-8.083,19.722-13.739,28.755
+	l-122.102,223.011H302.3z"/>
+<path fill="#33C481" d="M2192.143,0H1437.75v532.5h852V97.607C2289.75,43.7,2246.05,0,2192.143,0L2192.143,0z"/>
+<path fill="#107C41" d="M1437.75,1065h852v532.5h-852V1065z"/>
+</svg>

+ 1 - 0
src/assets/files/pdf.44344347.svg

@@ -0,0 +1 @@
+<svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7.75 4A3.25 3.25 0 0 1 11 .75h16c.121 0 .238.048.323.134l10.793 10.793a.457.457 0 0 1 .134.323v24A3.25 3.25 0 0 1 35 39.25H11A3.25 3.25 0 0 1 7.75 36V4Z" stroke="#D0D5DD" stroke-width="1.5"/><path d="M27 .5V8a4 4 0 0 0 4 4h7.5" stroke="#D0D5DD" stroke-width="1.5"/><rect x="1" y="18" width="26" height="16" rx="2" fill="#D92D20"/><path d="M4.832 30v-7.273h2.87c.551 0 1.021.106 1.41.316.388.209.684.499.887.87.206.37.31.796.31 1.279 0 .483-.105.909-.313 1.278-.209.37-.51.657-.906.863-.393.206-.869.309-1.427.309h-1.83V26.41h1.581c.296 0 .54-.051.732-.153.194-.104.338-.247.433-.43.097-.184.145-.396.145-.635 0-.242-.048-.452-.145-.632a.972.972 0 0 0-.433-.423c-.195-.102-.44-.153-.74-.153H6.37V30H4.832Zm9.053 0h-2.578v-7.273h2.6c.73 0 1.36.146 1.889.437.527.289.934.704 1.218 1.246.286.543.43 1.191.43 1.947 0 .757-.144 1.408-.43 1.953a2.953 2.953 0 0 1-1.226 1.253c-.53.291-1.164.437-1.903.437Zm-1.04-1.317h.976c.455 0 .837-.081 1.147-.242.313-.163.547-.415.703-.756.159-.344.238-.786.238-1.328 0-.538-.08-.977-.238-1.318a1.541 1.541 0 0 0-.7-.753c-.31-.16-.692-.241-1.146-.241h-.98v4.637ZM18.581 30v-7.273h4.816v1.268H20.12v1.733h2.958v1.268H20.12V30h-1.538Z" fill="#fff"/></svg>

+ 15 - 0
src/assets/files/word-01.svg

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="13px" height="16px" viewBox="0 0 13 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组备份 5</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="智能对话切图" transform="translate(-47, -481)">
+            <rect fill="#E6E6E6" x="0" y="0" width="428" height="564"></rect>
+            <g id="编组备份-5" transform="translate(47, 481)" fill-rule="nonzero">
+                <path d="M8.72857143,0 C8.8763349,0 9.01804637,0.0588038179 9.12253092,0.163475285 L12.8368166,3.88440552 C12.9413012,3.98907698 13,4.13104196 13,4.27906977 L13,14.6976744 C13,15.4169403 12.4179815,16 11.7,16 L1.3,16 C0.582027083,16 0,15.4169378 0,14.6976744 L0,1.30232558 C0,0.583070837 0.582029639,0 1.3,0 L8.72857143,0 Z" id="路径" fill="#FFC34C"></path>
+                <g id="w" transform="translate(2.05, 6.45)" fill="#FFFFFF">
+                    <polygon id="路径" points="1.81 5.64 0 0 1.38 0 2.48 4.03 2.53 4.03 3.63 0 4.96 0 6.07 4.03 6.12 4.03 7.21 0 8.59 0 6.79 5.64 5.45 5.64 4.32 1.63 4.27 1.63 3.14 5.64"></polygon>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 50 - 0
src/assets/files/word-02.svg

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Livello_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1881.25 1750"
+	 enable-background="new 0 0 1881.25 1750" xml:space="preserve">
+<metadata>
+	<sfw  xmlns="&ns_sfw;">
+		<slices></slices>
+		<sliceSourceBounds  bottomLeftOrigin="true" height="1750" width="1881.25" x="-938.5" y="-851"></sliceSourceBounds>
+	</sfw>
+</metadata>
+<path fill="#41A5EE" d="M1801.056,0H517.694C473.404,0,437.5,35.904,437.5,80.194c0,0,0,0,0,0V437.5l743.75,218.75l700-218.75
+	V80.194C1881.25,35.904,1845.346,0,1801.056,0L1801.056,0z"/>
+<path fill="#2B7CD3" d="M1881.25,437.5H437.5V875l743.75,131.25l700-131.25V437.5z"/>
+<path fill="#185ABD" d="M437.5,875v437.5l700,87.5l743.75-87.5V875H437.5z"/>
+<path fill="#103F91" d="M517.694,1750h1283.363c44.29,0,80.194-35.904,80.194-80.194l0,0V1312.5H437.5v357.306
+	C437.5,1714.096,473.404,1750,517.694,1750L517.694,1750z"/>
+<path opacity="0.1" enable-background="new    " d="M969.806,350H437.5v1093.75h532.306c44.23-0.144,80.05-35.964,80.194-80.194
+	V430.194C1049.856,385.964,1014.036,350.144,969.806,350z"/>
+<path opacity="0.2" enable-background="new    " d="M926.056,393.75H437.5V1487.5h488.556c44.23-0.144,80.05-35.964,80.194-80.194
+	V473.944C1006.106,429.714,970.286,393.894,926.056,393.75z"/>
+<path opacity="0.2" enable-background="new    " d="M926.056,393.75H437.5V1400h488.556c44.23-0.144,80.05-35.964,80.194-80.194
+	V473.944C1006.106,429.714,970.286,393.894,926.056,393.75z"/>
+<path opacity="0.2" enable-background="new    " d="M882.306,393.75H437.5V1400h444.806c44.23-0.144,80.05-35.964,80.194-80.194
+	V473.944C962.356,429.714,926.536,393.894,882.306,393.75z"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="167.2057" y1="1420.9117" x2="795.2943" y2="333.0883" gradientTransform="matrix(1 0 0 -1 0 1752)">
+	<stop  offset="0" style="stop-color:#2368C4"/>
+	<stop  offset="0.5" style="stop-color:#1A5DBE"/>
+	<stop  offset="1" style="stop-color:#1146AC"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M80.194,393.75h802.112c44.29,0,80.194,35.904,80.194,80.194v802.113
+	c0,44.29-35.904,80.194-80.194,80.194H80.194c-44.29,0-80.194-35.904-80.194-80.194V473.944C0,429.654,35.904,393.75,80.194,393.75z
+	"/>
+<path fill="#FFFFFF" d="M329.088,1008.788c1.575,12.381,2.625,23.144,3.106,32.375h1.837c0.7-8.75,2.158-19.294,4.375-31.631
+	c2.217-12.338,4.215-22.765,5.994-31.281l84.35-363.913h109.069l87.5,358.444c5.084,22.288,8.723,44.881,10.894,67.637h1.444
+	c1.631-22.047,4.671-43.966,9.1-65.625l69.781-360.631h99.269l-122.588,521.5H577.238L494.113,790.3
+	c-2.406-9.931-5.162-22.925-8.181-38.894c-3.019-15.969-4.9-27.65-5.644-35h-1.444c-0.962,8.487-2.844,21.088-5.644,37.8
+	c-2.8,16.713-5.046,29.079-6.738,37.1l-78.138,344.269h-117.95L147.131,614.337h101.062l75.994,364.656
+	C325.894,986.475,327.513,996.45,329.088,1008.788z"/>
+</svg>

+ 16 - 8
src/components/DialogWrap.vue

@@ -198,7 +198,10 @@
 <script>
 import DialogFeedback from "./DialogFeedback.vue";
 import { defineComponent, ref, onBeforeUnmount, onMounted, reactive, nextTick, inject } from "vue";
-import { marked } from "marked";
+
+import formatAnwserString from './refference-effect/format-anwser-string';
+import applyRefferencePopover from './refference-effect/apply-refference-popover';
+
 export default defineComponent({
   components: {
     DialogFeedback
@@ -209,18 +212,19 @@ export default defineComponent({
     const DOCUMENT_RESULT = {};
 
     const getHTML = (string) => {
-      return marked.parse(string);
+      return formatAnwserString(string);
     };
-    const replaceCode = (text) => {
-      const icon = `  <span class="circle"></span>`
+    const replaceCode = (text, index) => {
+      const icon = `  <span class="circle" data-list-index="${index}"></span>`
       return text.replace(/##\d\$\$/g, icon);
     }
+
     const { helper, ajax } = inject("$global");
     const userName = ref(helper.read("userName") || "");
 
-    const list = props.list.map((item) => {
+    const list = props.list.map((item, index) => {
       return {
-        answer: replaceCode(item.answer),
+        answer: replaceCode(item.answer, index),
         question: item.question,
         reference: (item.reference && item.reference.chunks && item.reference.doc_aggs) ? item.reference.doc_aggs.map(reference => {
           return {
@@ -359,6 +363,12 @@ export default defineComponent({
     onMounted(() => {
       scrollToEnd();
 
+      /**
+       * 应用引用效果
+       * 答案中 引用图标(感叹号)点击时,浮层显示引用内容
+       */
+      applyRefferencePopover(props.list);
+
       helper.webSocket = ajax.message.create(helper.read("token"), props.agentId, props.dialogId, props.type);
       helper.webSocket.onmessage = (event) => {
 
@@ -405,8 +415,6 @@ export default defineComponent({
             answerLoaded();
           }
           addAnswer(loadingData.value);
-
-
         }
         if (type === "close") {
           if (!answerData.value) {

+ 60 - 0
src/components/file/FileNameDisplay.vue

@@ -0,0 +1,60 @@
+<template>
+    <div class="file-name-display">
+        <span class="file-name-icon"><img :src="img_src"/></span>
+        <span class="file-name-label">{{file_name}}</span>
+    </div>
+</template>
+<script setup>
+import { defineComponent, inject, ref, useTemplateRef, watchEffect, onMounted} from "vue";
+
+import icon_excel from '../../assets/files/excel.svg';
+import icon_word from '../../assets/files/word-01.svg';
+import icon_pdf from '../../assets/files/pdf.44344347.svg';
+
+const props = defineProps({
+    file_name: String,
+    file_id: String,
+});
+
+/**
+ * 文件后缀名
+ */
+const file_endfix = (function(){
+    const arr = props.file_name.split('.');
+
+    const str = arr[arr.length - 1]
+
+    return str;
+})();
+
+const icon_map = {
+    docx: icon_word,
+    pdf: icon_pdf,
+}
+
+const img_src = icon_map[file_endfix];
+
+</script>
+<style scoped>
+.file-name-display{
+    cursor: pointer;
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+}
+
+.file-name-icon{
+    display: inline-block;
+    margin-right: 3px;
+    /* height: 22px; */
+    width: 22px
+}
+
+.file-name-icon img{
+    width: 100%;
+}
+
+.file-name-label{
+    color: blue;
+}
+</style>

+ 144 - 0
src/components/pdf-viewer/PDFViewer.vue

@@ -0,0 +1,144 @@
+<template>
+    <div class="pdf-container" ref="box">
+        
+    </div>
+</template>
+<script setup>
+import { defineComponent, inject, ref, useTemplateRef, watchEffect, onMounted} from "vue";
+
+import PDFJS from './pdfjs';
+
+/**
+ * 接收一个路径
+ * 此路径指向PDF文件
+ */
+const props = defineProps({
+    url: String,
+    doc_width: Number,
+    positions: Array,
+});
+
+const box = useTemplateRef('box');
+
+/**
+ * 处理高亮区域
+ */
+const highlight_pos = (() => {
+    const mp = {};
+
+    props.positions.forEach((item, index) => {
+        const page_index = item[0];
+
+        const x1 = item[1];
+        const x2 = item[2];
+        const y1 = item[3];
+        const y2 = item[4];
+
+        if(page_index in mp){
+            mp[page_index].push({
+                x1,
+                x2,
+                y1,
+                y2
+            });
+        }else{
+            mp[page_index] = [{
+                x1,
+                x2,
+                y1,
+                y2
+            }];
+        }
+ 
+    });
+
+    return mp;
+})();
+
+
+function drawHighLight(ctx, x1, x2, y1, y2){
+    // 设置矩形的样式
+    ctx.fillStyle = 'rgba(255, 255, 0, 0.5)';  // 填充颜色
+    // ctx.strokeStyle = 'red'; // 边框颜色
+    // ctx.lineWidth = 5;       // 边框宽度
+    
+    const width = x2 - x1;
+    const height = y2 - y1;
+
+    // 绘制填充矩形
+    ctx.fillRect(x1, y1, width, height); // 参数依次为:x坐标, y坐标, 宽度, 高度
+}
+
+function getPageHeight(viewWidth, viewHeight){
+    const height = propd.doc_width/ (viewWidth/viewHeight);
+
+    return height;
+}
+
+onMounted(() => {
+    PDFJS.getDocument(props.url).promise.then(async pdfDoc => {
+        const page_total = pdfDoc.numPages;
+
+        let min_page = -1;
+        let height_total = 0;
+
+        const height_list = [];
+
+        for(let i = 1; i <= page_total; i++){
+            const canvas = document.createElement('canvas');
+            const pdfCtx = canvas.getContext('2d')
+
+            const page = await pdfDoc.getPage(i);
+
+            const viewport = page.getViewport({ scale: 1 })
+
+            height_list.push(height_total);
+
+            canvas.width = viewport.width;
+            canvas.height = viewport.height;
+
+            height_total = height_total + canvas.height;
+
+            // canvas.width = viewport.width
+            // canvas.height = getPageHeight(viewport.width, viewport.height); // viewport.height
+                        
+            page.render({
+                viewport,
+                canvasContext: pdfCtx,
+            })
+            .promise.then(() => {
+                if(i in highlight_pos){
+                    const pos_info = highlight_pos[i];
+
+                    // 记录第一个要跳转的页码
+                    if(min_page === -1){
+                        min_page = i;
+                    }
+
+                    pos_info.forEach((psinfo) => {
+                        drawHighLight(pdfCtx, psinfo.x1, psinfo.x2, psinfo.y1, psinfo.y2);
+                    });
+                }
+
+                box.value.appendChild(canvas);
+            })
+        }
+
+        // TODO: 跳转页面
+        if(min_page !== -1){
+            console.log(height_list, 'h-list');
+            setTimeout(() => {
+                box.value.scrollTop = height_list[min_page]
+            }, 50);
+        }
+    })
+})
+
+</script>
+<style scoped>
+.pdf-container{
+    text-align: center;
+    /* height: 100vh;
+    overflow-y: auto; */
+}
+</style>

+ 7 - 0
src/components/pdf-viewer/pdfjs.js

@@ -0,0 +1,7 @@
+import * as PDFJS from 'pdfjs-dist'
+
+PDFJS.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${PDFJS.version}/build/pdf.worker.mjs`
+
+// https://unpkg.com/pdfjs-dist@4.8.69/build/pdf.mjs
+
+export default PDFJS;

+ 1 - 0
src/components/refference-effect/README.md

@@ -0,0 +1 @@
+# 回答点击显示引用浮层效果

+ 64 - 0
src/components/refference-effect/RefferenceFlag.vue

@@ -0,0 +1,64 @@
+<template>
+    <span class="refference-container">
+        <a-popover>
+            <span class="circle"></span>
+
+            <template #title></template>
+            <template #content>
+                <!-- <p>Here is the text content</p> -->
+                <div class="ref-text-content">
+                    {{text}}
+                </div>
+
+                <FileNameDisplay @click="handleClick" :file_name="doc_name" :file_id="doc_id" />
+            </template>
+        </a-popover>
+
+        <a-drawer :width="DOC_WIDTH" :visible="visible" @ok="handleOk" @cancel="handleCancel" unmountOnClose>
+            <PDFViewer :url="pdf_url" :doc_width="DOC_WIDTH" :positions="positions"/>
+        </a-drawer>
+    </span>
+</template>
+<script setup>
+import { defineComponent, inject, ref } from "vue";
+
+import PDFViewer from '../pdf-viewer/PDFViewer.vue';
+
+import FileNameDisplay from '../file/FileNameDisplay.vue';
+
+// https://arco.design/vue/component/popover
+
+const props = defineProps({
+    img: String, // 图片链接
+    text: String, // 文本地址
+    doc_id: String,
+    doc_name: String,
+    positions: Array
+});
+
+const DOC_WIDTH = 620;
+// const DOC_WIDTH = window.innerWidth/2;
+
+// http://192.168.20.119:11080/v1/document/get/
+const pdf_url = ref(`http://192.168.20.119:11080/v1/document/get/${props.doc_id}`);
+
+const visible = ref(false);
+
+const handleClick = () => {
+    visible.value = true;
+};
+const handleOk = () => {
+    visible.value = false;
+};
+const handleCancel = () => {
+    visible.value = false;
+}
+</script>
+
+<style scoped>
+.ref-text-content{
+    max-width: 460px;
+    max-height: 340px;
+    overflow-y: auto;
+}
+</style>

+ 16 - 0
src/components/refference-effect/RefferenceRoot.vue

@@ -0,0 +1,16 @@
+<template>
+    <RefferenceFlag :img="img" :text="text" :doc_id="doc_id" :doc_name="doc_name" :positions="positions"/>
+</template>
+
+<script setup>
+import RefferenceFlag from './RefferenceFlag.vue'
+
+const props = defineProps({
+    img: String, // 图片链接
+    text: String, // 文本地址
+    doc_id: String,
+    doc_name: String,
+    positions: Array
+});
+
+</script>

+ 44 - 0
src/components/refference-effect/apply-refference-popover.js

@@ -0,0 +1,44 @@
+import dynamicRegRefFlag from './refference-flag'
+
+export default function applyRefferencePopover(dialogList) {
+    // 处理引用数据
+    setTimeout(() => {
+        const ele = document.querySelectorAll('.refflag-refflag-refflag');
+
+        // 遍历找到的所有标记元素
+        ele.forEach((item, idx) => {
+            const data_flag_index = item.getAttribute('data-flag-index');
+            const data_list_index = item.getAttribute('data-list-index');
+
+            // 当前dialog对应的数据
+            const dialog_data = dialogList[data_list_index];
+
+            // 引用参考
+            const refference = dialog_data.reference;
+
+            const chunks = refference.chunks;
+
+            const target_chunk = chunks[data_flag_index];
+
+            // 引用数据
+            const current_refference_obj = {
+                refference: {
+                    chunk_id: target_chunk.chunk_id,
+                    content_ltks: target_chunk.content_ltks,
+                    content_with_weight: target_chunk.content_with_weight,
+                    doc_id: target_chunk.doc_id,
+                    docnm_kwd: target_chunk.docnm_kwd,
+                    img_id: target_chunk.img_id,
+                    important_kwd: target_chunk.important_kwd,
+                    kb_id: target_chunk.kb_id,
+                    positions: target_chunk.positions,
+                    similarity: target_chunk.similarity,
+                    term_similarity: target_chunk.term_similarity,
+                    vector_similarity: target_chunk.vector_similarity,
+                }
+            }
+
+            dynamicRegRefFlag(item, current_refference_obj);
+        });
+    }, 100);
+}

+ 35 - 0
src/components/refference-effect/format-anwser-string.js

@@ -0,0 +1,35 @@
+import { marked } from "marked";
+
+/**
+ * 引用标记
+ */
+export const REFFERENCE_FLAG = 'refference-flag';
+
+/**
+ * 转换AI的anwser数据
+ * @param {string} string - 待转换数据 
+ * @returns 
+ */
+export default function formatAnwserString(string) {
+    const result = marked.parse(string);
+
+    const reg = /<span class="circle" data-list-index="\d"><\/span>/g;
+
+    /**
+     * 处理回答的每一个答案中
+     * 关于引用的标记标签
+     * 在界面中可以通过 refference-flag 获取到对应的元素
+     */
+    let idx = 0; // 记录当前是第几次匹配
+    const formated = result.replaceAll(reg, function (match, index, full_str, c) {
+        let match_final = match.replace('></span>', `data-flag-index="${idx}"></span>`);
+
+        match_final = match_final.replace('class="circle"', `class="refflag-refflag-refflag ${REFFERENCE_FLAG}"`);
+
+        idx++;
+
+        return match_final;
+    });
+
+    return formated;
+};

+ 49 - 0
src/components/refference-effect/refference-flag.js

@@ -0,0 +1,49 @@
+import { createApp } from "vue";
+
+import ArcoVue from "@arco-design/web-vue";
+import ArcoVueIcon from "@arco-design/web-vue/es/icon";
+
+import RefferenceRoot from './RefferenceRoot.vue';
+
+/**
+ * 创建一个vue APP,并将此APP挂载到对应的DOM节点中
+ * @param {Element} mount_element - 挂载点元素
+ * @param {Object} propsObject - props值 
+ * @param {string} propsObject.refference.chunk_id - 目标ID
+ * @param {string} propsObject.refference.content_ltks - 主要内容
+ * @param {string} propsObject.refference.content_with_weight - 重点描述文本
+ * @param {string} propsObject.refference.doc_id - 文档ID
+ * @param {string} propsObject.refference.docnm_kwd - 文档名称
+ * @param {string} propsObject.refference.img_id - 图片ID
+ * @param {string} propsObject.refference.important_kwd - 关键词
+ * @param {string} propsObject.refference.kb_id - 目标ID
+ * @param {string} propsObject.refference.positions - 目标ID
+ * @param {string} propsObject.refference.similarity - 目标ID
+ * @param {string} propsObject.refference.term_similarity - 目标ID
+ * @param {string} propsObject.refference.vector_similarity - 目标ID
+ */
+export default function dynamicRegRefFlag(mount_element, propsObject = {}) {
+    /**
+     * @see https://cn.vuejs.org/api/application.html#createapp
+     */
+    const app = createApp(RefferenceRoot, {
+        img: propsObject.refference.img_id || '',
+        text: propsObject.refference.content_with_weight || '',
+        doc_id: propsObject.refference.doc_id,
+        doc_name: propsObject.refference.docnm_kwd,
+        positions: propsObject.refference.positions,
+    });
+
+    // 引用字节跳动相关的组件
+    app.use(ArcoVueIcon);
+    app.use(ArcoVue);
+
+    app.mount(mount_element);
+
+    // 返回一个卸载APP的方法
+    return () => {
+        app.unmount();
+    }
+}
+
+

+ 14 - 8
src/views/Home.vue

@@ -157,6 +157,9 @@ import DocumentsmartData from "./DocumentsmartData.vue";
 import DocumentQuestion from "./DocumentQuestion.vue";
 import Analysis from "./Analysis.vue";
 import { defineComponent, ref, onMounted, inject, onBeforeUnmount } from "vue";
+
+import dynamicRegRefFlag from '../components/refference-effect/refference-flag'
+
 export default defineComponent({
   components: {
     Right,
@@ -227,13 +230,16 @@ export default defineComponent({
         variables.value = result;
         reportData = {};
       }
-      historyList.value = data.map((value) => {
-        return {
-          content: value.name,
-          id: value.id,
-          time: new Date(value.updated_time).toLocaleString()
-        };
-      });
+
+      if(data && Array.isArray(data)){
+        historyList.value = data.map((value) => {
+          return {
+            content: value.name,
+            id: value.id,
+            time: new Date(value.updated_time).toLocaleString()
+          };
+        });
+      }
     };
     const setReadonly = (status) => {
       readonly.value = status;
@@ -365,7 +371,7 @@ export default defineComponent({
     };
     onMounted(async () => {
       agents = await ajax.agent.getAgents();
-      agentIds.value = agents.map((data) => data.id);
+      agentIds.value = agents && Array.isArray(agents) && agents.map((data) => data.id) || [];
       helper.$bus.on("open-dialog", async (value) => {
         // 如果不是历史记录对话模式,则创建对话
         if (!historyMode.value) {

+ 1 - 1
vite.config.js

@@ -16,7 +16,7 @@ export default defineConfig({
         // 服务配置
         port: 80, // 类型: number 指定服务器端口;
         open: false, // 类型: boolean | string在服务器启动时自动在浏览器中打开应用程序;
-        cors: false, // 类型: boolean | CorsOptions 为开发服务器配置 CORS。默认启用并允许任何源
+        cors: true, // 类型: boolean | CorsOptions 为开发服务器配置 CORS。默认启用并允许任何源
         host: "0.0.0.0", // IP配置,支持从IP启动
         proxy: {
             "/api": {