作者 dong

首页增加统计项,日志管理增加存入知识库功能,按钮管理增加字段code,日志管理增加提问方式字段

@@ -21,48 +21,51 @@ @@ -21,48 +21,51 @@
21 "husky:install": "husky install" 21 "husky:install": "husky install"
22 }, 22 },
23 "dependencies": { 23 "dependencies": {
24 - "@jeecg/online": "3.7.4-beta", 24 + "@ant-design/colors": "^7.2.0",
  25 + "@ant-design/icons-vue": "^7.0.1",
  26 + "@iconify/iconify": "^3.1.1",
25 "@jeecg/aiflow": "1.0.0", 27 "@jeecg/aiflow": "1.0.0",
  28 + "@jeecg/online": "3.7.4-beta",
26 "@logicflow/core": "^2.0.10", 29 "@logicflow/core": "^2.0.10",
27 "@logicflow/extension": "^2.0.14", 30 "@logicflow/extension": "^2.0.14",
28 "@logicflow/vue-node-registry": "^1.0.12", 31 "@logicflow/vue-node-registry": "^1.0.12",
29 - "@iconify/iconify": "^3.1.1",  
30 - "@ant-design/colors": "^7.2.0",  
31 - "@ant-design/icons-vue": "^7.0.1", 32 + "@tinymce/tinymce-vue": "4.0.7",
  33 + "@traptitech/markdown-it-katex": "^3.6.0",
  34 + "@vant/area-data": "^1.5.2",
32 "@vue/shared": "^3.5.13", 35 "@vue/shared": "^3.5.13",
33 "@vueuse/core": "^10.11.1", 36 "@vueuse/core": "^10.11.1",
34 - "@tinymce/tinymce-vue": "4.0.7",  
35 "@zxcvbn-ts/core": "^3.0.4", 37 "@zxcvbn-ts/core": "^3.0.4",
36 "ant-design-vue": "^4.2.6", 38 "ant-design-vue": "^4.2.6",
37 "axios": "^1.7.9", 39 "axios": "^1.7.9",
38 "china-area-data": "^5.0.1", 40 "china-area-data": "^5.0.1",
39 - "@vant/area-data": "^1.5.2",  
40 "clipboard": "^2.0.11", 41 "clipboard": "^2.0.11",
41 "codemirror": "^5.65.18", 42 "codemirror": "^5.65.18",
42 "cron-parser": "^4.9.0", 43 "cron-parser": "^4.9.0",
43 "cropperjs": "^1.6.2", 44 "cropperjs": "^1.6.2",
44 "crypto-js": "^4.2.0", 45 "crypto-js": "^4.2.0",
45 "dayjs": "^1.11.13", 46 "dayjs": "^1.11.13",
  47 + "docx-preview": "^0.3.5",
46 "dom-align": "^1.12.4", 48 "dom-align": "^1.12.4",
47 "echarts": "^5.6.0", 49 "echarts": "^5.6.0",
48 "emoji-mart-vue-fast": "^15.0.3", 50 "emoji-mart-vue-fast": "^15.0.3",
49 "enquire.js": "^2.1.6", 51 "enquire.js": "^2.1.6",
  52 + "event-source-polyfill": "^1.0.31",
  53 + "highlight.js": "^11.11.1",
50 "intro.js": "^7.2.0", 54 "intro.js": "^7.2.0",
51 "lodash-es": "^4.17.21", 55 "lodash-es": "^4.17.21",
52 "lodash.get": "^4.4.2", 56 "lodash.get": "^4.4.2",
  57 + "mammoth": "^1.9.1",
53 "markdown-it": "^14.1.0", 58 "markdown-it": "^14.1.0",
54 "markdown-it-link-attributes": "^4.0.1", 59 "markdown-it-link-attributes": "^4.0.1",
55 - "event-source-polyfill": "^1.0.31",  
56 - "highlight.js": "^11.11.1",  
57 - "@traptitech/markdown-it-katex": "^3.6.0",  
58 "md5": "^2.3.0", 60 "md5": "^2.3.0",
59 "mockjs": "^1.1.0", 61 "mockjs": "^1.1.0",
60 "nprogress": "^0.2.0", 62 "nprogress": "^0.2.0",
61 "path-to-regexp": "^6.3.0", 63 "path-to-regexp": "^6.3.0",
  64 + "pdfjs-dist": "^5.3.31",
62 "pinia": "2.1.7", 65 "pinia": "2.1.7",
63 "print-js": "^1.6.0", 66 "print-js": "^1.6.0",
64 - "qs": "^6.13.1",  
65 "qrcode": "^1.5.4", 67 "qrcode": "^1.5.4",
  68 + "qs": "^6.13.1",
66 "resize-observer-polyfill": "^1.5.1", 69 "resize-observer-polyfill": "^1.5.1",
67 "showdown": "^2.1.0", 70 "showdown": "^2.1.0",
68 "sortablejs": "^1.15.6", 71 "sortablejs": "^1.15.6",
@@ -78,9 +81,9 @@ @@ -78,9 +81,9 @@
78 "vue-router": "^4.5.0", 81 "vue-router": "^4.5.0",
79 "vue-types": "^5.1.3", 82 "vue-types": "^5.1.3",
80 "vuedraggable": "^4.1.0", 83 "vuedraggable": "^4.1.0",
  84 + "vxe-pc-ui": "4.6.12",
81 "vxe-table": "4.13.31", 85 "vxe-table": "4.13.31",
82 "vxe-table-plugin-antd": "4.0.8", 86 "vxe-table-plugin-antd": "4.0.8",
83 - "vxe-pc-ui": "4.6.12",  
84 "xe-utils": "3.5.26", 87 "xe-utils": "3.5.26",
85 "xss": "^1.0.15" 88 "xss": "^1.0.15"
86 }, 89 },
@@ -89,6 +92,7 @@ @@ -89,6 +92,7 @@
89 "@commitlint/config-conventional": "^18.6.3", 92 "@commitlint/config-conventional": "^18.6.3",
90 "@iconify/json": "^2.2.292", 93 "@iconify/json": "^2.2.292",
91 "@purge-icons/generated": "^0.10.0", 94 "@purge-icons/generated": "^0.10.0",
  95 + "@rys-fe/vite-plugin-theme": "^0.8.6",
92 "@types/codemirror": "^5.60.15", 96 "@types/codemirror": "^5.60.15",
93 "@types/crypto-js": "^4.2.2", 97 "@types/crypto-js": "^4.2.2",
94 "@types/fs-extra": "^11.0.4", 98 "@types/fs-extra": "^11.0.4",
@@ -110,11 +114,13 @@ @@ -110,11 +114,13 @@
110 "@vue/compiler-sfc": "^3.5.13", 114 "@vue/compiler-sfc": "^3.5.13",
111 "@vue/test-utils": "^2.4.6", 115 "@vue/test-utils": "^2.4.6",
112 "autoprefixer": "^10.4.20", 116 "autoprefixer": "^10.4.20",
  117 + "big.js": "^6.2.2",
113 "commitizen": "^4.3.1", 118 "commitizen": "^4.3.1",
114 "conventional-changelog-cli": "^4.1.0", 119 "conventional-changelog-cli": "^4.1.0",
115 "cross-env": "^7.0.3", 120 "cross-env": "^7.0.3",
116 "cz-git": "^1.11.0", 121 "cz-git": "^1.11.0",
117 "czg": "^1.11.0", 122 "czg": "^1.11.0",
  123 + "dingtalk-jsapi": "^3.0.42",
118 "dotenv": "^16.4.7", 124 "dotenv": "^16.4.7",
119 "eslint": "^8.57.1", 125 "eslint": "^8.57.1",
120 "eslint-config-prettier": "^9.1.0", 126 "eslint-config-prettier": "^9.1.0",
@@ -150,6 +156,7 @@ @@ -150,6 +156,7 @@
150 "ts-jest": "^29.2.5", 156 "ts-jest": "^29.2.5",
151 "ts-node": "^10.9.2", 157 "ts-node": "^10.9.2",
152 "typescript": "^4.9.5", 158 "typescript": "^4.9.5",
  159 + "unocss": "^0.58.9",
153 "vite": "^6.0.7", 160 "vite": "^6.0.7",
154 "vite-plugin-compression": "^0.5.1", 161 "vite-plugin-compression": "^0.5.1",
155 "vite-plugin-html": "^3.2.2", 162 "vite-plugin-html": "^3.2.2",
@@ -158,15 +165,11 @@ @@ -158,15 +165,11 @@
158 "vite-plugin-optimize-persist": "^0.1.2", 165 "vite-plugin-optimize-persist": "^0.1.2",
159 "vite-plugin-package-config": "^0.1.1", 166 "vite-plugin-package-config": "^0.1.1",
160 "vite-plugin-purge-icons": "^0.10.0", 167 "vite-plugin-purge-icons": "^0.10.0",
161 - "vite-plugin-svg-icons": "^2.0.1",  
162 "vite-plugin-qiankun": "^1.0.15", 168 "vite-plugin-qiankun": "^1.0.15",
163 - "@rys-fe/vite-plugin-theme": "^0.8.6", 169 + "vite-plugin-svg-icons": "^2.0.1",
164 "vite-plugin-vue-setup-extend-plus": "^0.1.0", 170 "vite-plugin-vue-setup-extend-plus": "^0.1.0",
165 - "unocss": "^0.58.9",  
166 "vue-eslint-parser": "^9.4.3", 171 "vue-eslint-parser": "^9.4.3",
167 - "vue-tsc": "^1.8.27",  
168 - "dingtalk-jsapi": "^3.0.42",  
169 - "big.js": "^6.2.2" 172 + "vue-tsc": "^1.8.27"
170 }, 173 },
171 "repository": { 174 "repository": {
172 "type": "git", 175 "type": "git",
@@ -77,6 +77,9 @@ importers: @@ -77,6 +77,9 @@ importers:
77 dayjs: 77 dayjs:
78 specifier: ^1.11.13 78 specifier: ^1.11.13
79 version: 1.11.13 79 version: 1.11.13
  80 + docx-preview:
  81 + specifier: ^0.3.5
  82 + version: 0.3.5
80 dom-align: 83 dom-align:
81 specifier: ^1.12.4 84 specifier: ^1.12.4
82 version: 1.12.4 85 version: 1.12.4
@@ -104,6 +107,9 @@ importers: @@ -104,6 +107,9 @@ importers:
104 lodash.get: 107 lodash.get:
105 specifier: ^4.4.2 108 specifier: ^4.4.2
106 version: 4.4.2 109 version: 4.4.2
  110 + mammoth:
  111 + specifier: ^1.9.1
  112 + version: 1.9.1
107 markdown-it: 113 markdown-it:
108 specifier: ^14.1.0 114 specifier: ^14.1.0
109 version: 14.1.0 115 version: 14.1.0
@@ -122,6 +128,9 @@ importers: @@ -122,6 +128,9 @@ importers:
122 path-to-regexp: 128 path-to-regexp:
123 specifier: ^6.3.0 129 specifier: ^6.3.0
124 version: 6.3.0 130 version: 6.3.0
  131 + pdfjs-dist:
  132 + specifier: ^5.3.31
  133 + version: 5.3.31
125 pinia: 134 pinia:
126 specifier: 2.1.7 135 specifier: 2.1.7
127 version: 2.1.7(typescript@4.9.5)(vue@3.5.14(typescript@4.9.5)) 136 version: 2.1.7(typescript@4.9.5)(vue@3.5.14(typescript@4.9.5))
@@ -1171,6 +1180,70 @@ packages: @@ -1171,6 +1180,70 @@ packages:
1171 '@vue/composition-api': 1180 '@vue/composition-api':
1172 optional: true 1181 optional: true
1173 1182
  1183 + '@napi-rs/canvas-android-arm64@0.1.71':
  1184 + resolution: {integrity: sha512-cxi3VCotIOS9kNFQI7dcysbVJi106pxryVY1Hi85pX+ZeqahRyeqc/NsLaZ998Ae99+F3HI5X/39G1Y/Byrf0A==}
  1185 + engines: {node: '>= 10'}
  1186 + cpu: [arm64]
  1187 + os: [android]
  1188 +
  1189 + '@napi-rs/canvas-darwin-arm64@0.1.71':
  1190 + resolution: {integrity: sha512-7Y4D/6vIuMLYsVNtRM/w2j0+fB1GyqeOxc7I0BTx8eLP1S6BZE2Rj6zJfdG+zmLEOW0IlHa+VQq1q2MUAjW84w==}
  1191 + engines: {node: '>= 10'}
  1192 + cpu: [arm64]
  1193 + os: [darwin]
  1194 +
  1195 + '@napi-rs/canvas-darwin-x64@0.1.71':
  1196 + resolution: {integrity: sha512-Z0IUqxclrYdfVt/SK9nKCzUHTOXKTWiygtO71YCzs0OtxKdNI7GJRJdYG48wXZEDQ/pqTF4F7Ifgtidfc2tYpg==}
  1197 + engines: {node: '>= 10'}
  1198 + cpu: [x64]
  1199 + os: [darwin]
  1200 +
  1201 + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.71':
  1202 + resolution: {integrity: sha512-KlpqqCASak5ruY+UIolJgmhMZ9Pa2o1QyaNu648L8sz4WNBbNa+aOT60XCLCL1VIKLv11B3MlNgiOHoYNmDhXQ==}
  1203 + engines: {node: '>= 10'}
  1204 + cpu: [arm]
  1205 + os: [linux]
  1206 +
  1207 + '@napi-rs/canvas-linux-arm64-gnu@0.1.71':
  1208 + resolution: {integrity: sha512-bdGZCGu8YQNAiu3nkIVVUp6nIn6fPd36IuZsLXTG027E52KyIuZ3obCxehSwjDIUNkFWvmff5D6JYfWwAoioEw==}
  1209 + engines: {node: '>= 10'}
  1210 + cpu: [arm64]
  1211 + os: [linux]
  1212 +
  1213 + '@napi-rs/canvas-linux-arm64-musl@0.1.71':
  1214 + resolution: {integrity: sha512-1R5sMWe9ur8uM+hAeylBwG0b6UHDR+iWQNgzXmF9vbBYRooQvmDWqpcgytKLJAC0vnWhIkKwqd7yExn7cwczmg==}
  1215 + engines: {node: '>= 10'}
  1216 + cpu: [arm64]
  1217 + os: [linux]
  1218 +
  1219 + '@napi-rs/canvas-linux-riscv64-gnu@0.1.71':
  1220 + resolution: {integrity: sha512-xjjKsipueuG+LdKIk6/uAlqdo+rzGcmNpTZPXdakIT1sHX4NNSnQTzjRaj9Gh96Czjd9G89UWR0KIlE7fwOgFA==}
  1221 + engines: {node: '>= 10'}
  1222 + cpu: [riscv64]
  1223 + os: [linux]
  1224 +
  1225 + '@napi-rs/canvas-linux-x64-gnu@0.1.71':
  1226 + resolution: {integrity: sha512-3s6YpklXDB4OeeULG1XTRyKrKAOo7c3HHEqM9A6N4STSjMaJtzmpp7tB/JTvAFeOeFte6gWN8IwC+7AjGJ6MpQ==}
  1227 + engines: {node: '>= 10'}
  1228 + cpu: [x64]
  1229 + os: [linux]
  1230 +
  1231 + '@napi-rs/canvas-linux-x64-musl@0.1.71':
  1232 + resolution: {integrity: sha512-5v9aCLzCXw7u10ray5juQMdl7TykZSn1X5AIGYwBvTAcKSgrqaR9QkRxp1Lqk3njQmFekOW1SFN9bZ/i/6y6kA==}
  1233 + engines: {node: '>= 10'}
  1234 + cpu: [x64]
  1235 + os: [linux]
  1236 +
  1237 + '@napi-rs/canvas-win32-x64-msvc@0.1.71':
  1238 + resolution: {integrity: sha512-oJughk6xjsRIr0Rd9EqjmZmhIMkvcPuXgr3MNn2QexTqn+YFOizrwHS5ha0BDfFl7TEGRvwaDUXBQtu8JKXb8A==}
  1239 + engines: {node: '>= 10'}
  1240 + cpu: [x64]
  1241 + os: [win32]
  1242 +
  1243 + '@napi-rs/canvas@0.1.71':
  1244 + resolution: {integrity: sha512-92ybDocKl6JM48ZpYbj+A7Qt45IaTABDk0y3sDecEQfgdhfNzJtEityqNHoCZ4Vty2dldPkJhxgvOnbrQMXTTA==}
  1245 + engines: {node: '>= 10'}
  1246 +
1174 '@nodelib/fs.scandir@2.1.5': 1247 '@nodelib/fs.scandir@2.1.5':
1175 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 1248 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
1176 engines: {node: '>= 8'} 1249 engines: {node: '>= 8'}
@@ -1756,6 +1829,10 @@ packages: @@ -1756,6 +1829,10 @@ packages:
1756 peerDependencies: 1829 peerDependencies:
1757 vue: ^3.2.0 1830 vue: ^3.2.0
1758 1831
  1832 + '@xmldom/xmldom@0.8.10':
  1833 + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
  1834 + engines: {node: '>=10.0.0'}
  1835 +
1759 '@zxcvbn-ts/core@3.0.4': 1836 '@zxcvbn-ts/core@3.0.4':
1760 resolution: {integrity: sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==} 1837 resolution: {integrity: sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==}
1761 1838
@@ -1995,6 +2072,9 @@ packages: @@ -1995,6 +2072,9 @@ packages:
1995 bl@4.1.0: 2072 bl@4.1.0:
1996 resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 2073 resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
1997 2074
  2075 + bluebird@3.4.7:
  2076 + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==}
  2077 +
1998 bluebird@3.7.2: 2078 bluebird@3.7.2:
1999 resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 2079 resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
2000 2080
@@ -2384,6 +2464,9 @@ packages: @@ -2384,6 +2464,9 @@ packages:
2384 core-js@3.42.0: 2464 core-js@3.42.0:
2385 resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==} 2465 resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==}
2386 2466
  2467 + core-util-is@1.0.3:
  2468 + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
  2469 +
2387 cors@2.8.5: 2470 cors@2.8.5:
2388 resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 2471 resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
2389 engines: {node: '>= 0.10'} 2472 engines: {node: '>= 0.10'}
@@ -2665,6 +2748,9 @@ packages: @@ -2665,6 +2748,9 @@ packages:
2665 dijkstrajs@1.0.3: 2748 dijkstrajs@1.0.3:
2666 resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} 2749 resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
2667 2750
  2751 + dingbat-to-unicode@1.0.1:
  2752 + resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==}
  2753 +
2668 dingtalk-jsapi@3.1.0: 2754 dingtalk-jsapi@3.1.0:
2669 resolution: {integrity: sha512-2W1XuOR3g/0eYbqXXOMKwmTSUzyIeKNIQ1DDgUrMmf3eNdfOb8ShcQZ02QNvn/j5Vpy6Pd0Yf+uRkWVB3Pl9gA==} 2755 resolution: {integrity: sha512-2W1XuOR3g/0eYbqXXOMKwmTSUzyIeKNIQ1DDgUrMmf3eNdfOb8ShcQZ02QNvn/j5Vpy6Pd0Yf+uRkWVB3Pl9gA==}
2670 2756
@@ -2676,6 +2762,9 @@ packages: @@ -2676,6 +2762,9 @@ packages:
2676 resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 2762 resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
2677 engines: {node: '>=6.0.0'} 2763 engines: {node: '>=6.0.0'}
2678 2764
  2765 + docx-preview@0.3.5:
  2766 + resolution: {integrity: sha512-nod1jG5PkvzDIiZAcgAY4gSFQzgmAAChcuZH4Hj9dj7oCzscY3Hn8NfbUv7X7Jk4xL1lfKO113JLDhWKOt6fYw==}
  2767 +
2679 dom-align@1.12.4: 2768 dom-align@1.12.4:
2680 resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} 2769 resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==}
2681 2770
@@ -2735,6 +2824,9 @@ packages: @@ -2735,6 +2824,9 @@ packages:
2735 resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} 2824 resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==}
2736 engines: {node: '>=12'} 2825 engines: {node: '>=12'}
2737 2826
  2827 + duck@0.1.12:
  2828 + resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==}
  2829 +
2738 dunder-proto@1.0.1: 2830 dunder-proto@1.0.1:
2739 resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 2831 resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
2740 engines: {node: '>= 0.4'} 2832 engines: {node: '>= 0.4'}
@@ -3618,6 +3710,9 @@ packages: @@ -3618,6 +3710,9 @@ packages:
3618 engines: {node: '>=0.10.0'} 3710 engines: {node: '>=0.10.0'}
3619 hasBin: true 3711 hasBin: true
3620 3712
  3713 + immediate@3.0.6:
  3714 + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
  3715 +
3621 import-fresh@3.3.1: 3716 import-fresh@3.3.1:
3622 resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 3717 resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
3623 engines: {node: '>=6'} 3718 engines: {node: '>=6'}
@@ -4142,6 +4237,9 @@ packages: @@ -4142,6 +4237,9 @@ packages:
4142 resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} 4237 resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
4143 engines: {'0': node >= 0.2.0} 4238 engines: {'0': node >= 0.2.0}
4144 4239
  4240 + jszip@3.10.1:
  4241 + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
  4242 +
4145 katex@0.16.22: 4243 katex@0.16.22:
4146 resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} 4244 resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==}
4147 hasBin: true 4245 hasBin: true
@@ -4191,6 +4289,9 @@ packages: @@ -4191,6 +4289,9 @@ packages:
4191 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 4289 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
4192 engines: {node: '>= 0.8.0'} 4290 engines: {node: '>= 0.8.0'}
4193 4291
  4292 + lie@3.3.0:
  4293 + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
  4294 +
4194 lilconfig@3.0.0: 4295 lilconfig@3.0.0:
4195 resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} 4296 resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==}
4196 engines: {node: '>=14'} 4297 engines: {node: '>=14'}
@@ -4303,6 +4404,9 @@ packages: @@ -4303,6 +4404,9 @@ packages:
4303 resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 4404 resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
4304 hasBin: true 4405 hasBin: true
4305 4406
  4407 + lop@0.4.2:
  4408 + resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==}
  4409 +
4306 lower-case@2.0.2: 4410 lower-case@2.0.2:
4307 resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 4411 resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
4308 4412
@@ -4337,6 +4441,11 @@ packages: @@ -4337,6 +4441,11 @@ packages:
4337 makeerror@1.0.12: 4441 makeerror@1.0.12:
4338 resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 4442 resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
4339 4443
  4444 + mammoth@1.9.1:
  4445 + resolution: {integrity: sha512-4S2v1eP4Yo4so0zGNicJKcP93su3wDPcUk+xvkjSG75nlNjSkDJu8BhWQ+e54BROM0HfA6nPzJn12S6bq2Ko6w==}
  4446 + engines: {node: '>=12.0.0'}
  4447 + hasBin: true
  4448 +
4340 map-cache@0.2.2: 4449 map-cache@0.2.2:
4341 resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} 4450 resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
4342 engines: {node: '>=0.10.0'} 4451 engines: {node: '>=0.10.0'}
@@ -4695,6 +4804,9 @@ packages: @@ -4695,6 +4804,9 @@ packages:
4695 resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} 4804 resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
4696 hasBin: true 4805 hasBin: true
4697 4806
  4807 + option@0.2.4:
  4808 + resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==}
  4809 +
4698 optionator@0.9.4: 4810 optionator@0.9.4:
4699 resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 4811 resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
4700 engines: {node: '>= 0.8.0'} 4812 engines: {node: '>= 0.8.0'}
@@ -4745,6 +4857,9 @@ packages: @@ -4745,6 +4857,9 @@ packages:
4745 package-manager-detector@1.3.0: 4857 package-manager-detector@1.3.0:
4746 resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} 4858 resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
4747 4859
  4860 + pako@1.0.11:
  4861 + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
  4862 +
4748 param-case@3.0.4: 4863 param-case@3.0.4:
4749 resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} 4864 resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
4750 4865
@@ -4846,6 +4961,10 @@ packages: @@ -4846,6 +4961,10 @@ packages:
4846 pathe@2.0.3: 4961 pathe@2.0.3:
4847 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 4962 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
4848 4963
  4964 + pdfjs-dist@5.3.31:
  4965 + resolution: {integrity: sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA==}
  4966 + engines: {node: '>=20.16.0 || >=22.3.0'}
  4967 +
4849 perfect-debounce@1.0.0: 4968 perfect-debounce@1.0.0:
4850 resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 4969 resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
4851 4970
@@ -5021,6 +5140,9 @@ packages: @@ -5021,6 +5140,9 @@ packages:
5021 print-js@1.6.0: 5140 print-js@1.6.0:
5022 resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==} 5141 resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==}
5023 5142
  5143 + process-nextick-args@2.0.1:
  5144 + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
  5145 +
5024 promise-polyfill@7.1.2: 5146 promise-polyfill@7.1.2:
5025 resolution: {integrity: sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==} 5147 resolution: {integrity: sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==}
5026 5148
@@ -5097,6 +5219,9 @@ packages: @@ -5097,6 +5219,9 @@ packages:
5097 resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} 5219 resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==}
5098 engines: {node: '>=16'} 5220 engines: {node: '>=16'}
5099 5221
  5222 + readable-stream@2.3.8:
  5223 + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
  5224 +
5100 readable-stream@3.6.2: 5225 readable-stream@3.6.2:
5101 resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 5226 resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
5102 engines: {node: '>= 6'} 5227 engines: {node: '>= 6'}
@@ -5326,6 +5451,9 @@ packages: @@ -5326,6 +5451,9 @@ packages:
5326 resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} 5451 resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
5327 engines: {node: '>=0.10.0'} 5452 engines: {node: '>=0.10.0'}
5328 5453
  5454 + setimmediate@1.0.5:
  5455 + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
  5456 +
5329 shallow-equal@1.2.1: 5457 shallow-equal@1.2.1:
5330 resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} 5458 resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==}
5331 5459
@@ -5529,6 +5657,9 @@ packages: @@ -5529,6 +5657,9 @@ packages:
5529 resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 5657 resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
5530 engines: {node: '>= 0.4'} 5658 engines: {node: '>= 0.4'}
5531 5659
  5660 + string_decoder@1.1.1:
  5661 + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
  5662 +
5532 string_decoder@1.3.0: 5663 string_decoder@1.3.0:
5533 resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 5664 resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
5534 5665
@@ -5901,6 +6032,9 @@ packages: @@ -5901,6 +6032,9 @@ packages:
5901 unconfig@0.3.13: 6032 unconfig@0.3.13:
5902 resolution: {integrity: sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==} 6033 resolution: {integrity: sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==}
5903 6034
  6035 + underscore@1.13.7:
  6036 + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==}
  6037 +
5904 undici-types@6.19.8: 6038 undici-types@6.19.8:
5905 resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 6039 resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
5906 6040
@@ -6277,6 +6411,10 @@ packages: @@ -6277,6 +6411,10 @@ packages:
6277 resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 6411 resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
6278 engines: {node: '>=12'} 6412 engines: {node: '>=12'}
6279 6413
  6414 + xmlbuilder@10.1.1:
  6415 + resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==}
  6416 + engines: {node: '>=4.0'}
  6417 +
6280 xss@1.0.15: 6418 xss@1.0.15:
6281 resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} 6419 resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==}
6282 engines: {node: '>= 0.10.0'} 6420 engines: {node: '>= 0.10.0'}
@@ -7226,6 +7364,50 @@ snapshots: @@ -7226,6 +7364,50 @@ snapshots:
7226 vue: 3.5.14(typescript@4.9.5) 7364 vue: 3.5.14(typescript@4.9.5)
7227 vue-demi: 0.14.10(vue@3.5.14(typescript@4.9.5)) 7365 vue-demi: 0.14.10(vue@3.5.14(typescript@4.9.5))
7228 7366
  7367 + '@napi-rs/canvas-android-arm64@0.1.71':
  7368 + optional: true
  7369 +
  7370 + '@napi-rs/canvas-darwin-arm64@0.1.71':
  7371 + optional: true
  7372 +
  7373 + '@napi-rs/canvas-darwin-x64@0.1.71':
  7374 + optional: true
  7375 +
  7376 + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.71':
  7377 + optional: true
  7378 +
  7379 + '@napi-rs/canvas-linux-arm64-gnu@0.1.71':
  7380 + optional: true
  7381 +
  7382 + '@napi-rs/canvas-linux-arm64-musl@0.1.71':
  7383 + optional: true
  7384 +
  7385 + '@napi-rs/canvas-linux-riscv64-gnu@0.1.71':
  7386 + optional: true
  7387 +
  7388 + '@napi-rs/canvas-linux-x64-gnu@0.1.71':
  7389 + optional: true
  7390 +
  7391 + '@napi-rs/canvas-linux-x64-musl@0.1.71':
  7392 + optional: true
  7393 +
  7394 + '@napi-rs/canvas-win32-x64-msvc@0.1.71':
  7395 + optional: true
  7396 +
  7397 + '@napi-rs/canvas@0.1.71':
  7398 + optionalDependencies:
  7399 + '@napi-rs/canvas-android-arm64': 0.1.71
  7400 + '@napi-rs/canvas-darwin-arm64': 0.1.71
  7401 + '@napi-rs/canvas-darwin-x64': 0.1.71
  7402 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.71
  7403 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.71
  7404 + '@napi-rs/canvas-linux-arm64-musl': 0.1.71
  7405 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.71
  7406 + '@napi-rs/canvas-linux-x64-gnu': 0.1.71
  7407 + '@napi-rs/canvas-linux-x64-musl': 0.1.71
  7408 + '@napi-rs/canvas-win32-x64-msvc': 0.1.71
  7409 + optional: true
  7410 +
7229 '@nodelib/fs.scandir@2.1.5': 7411 '@nodelib/fs.scandir@2.1.5':
7230 dependencies: 7412 dependencies:
7231 '@nodelib/fs.stat': 2.0.5 7413 '@nodelib/fs.stat': 2.0.5
@@ -7958,6 +8140,8 @@ snapshots: @@ -7958,6 +8140,8 @@ snapshots:
7958 vue: 3.5.14(typescript@4.9.5) 8140 vue: 3.5.14(typescript@4.9.5)
7959 xe-utils: 3.7.4 8141 xe-utils: 3.7.4
7960 8142
  8143 + '@xmldom/xmldom@0.8.10': {}
  8144 +
7961 '@zxcvbn-ts/core@3.0.4': 8145 '@zxcvbn-ts/core@3.0.4':
7962 dependencies: 8146 dependencies:
7963 fastest-levenshtein: 1.0.16 8147 fastest-levenshtein: 1.0.16
@@ -8233,6 +8417,8 @@ snapshots: @@ -8233,6 +8417,8 @@ snapshots:
8233 inherits: 2.0.4 8417 inherits: 2.0.4
8234 readable-stream: 3.6.2 8418 readable-stream: 3.6.2
8235 8419
  8420 + bluebird@3.4.7: {}
  8421 +
8236 bluebird@3.7.2: {} 8422 bluebird@3.7.2: {}
8237 8423
8238 boolbase@1.0.0: {} 8424 boolbase@1.0.0: {}
@@ -8668,6 +8854,8 @@ snapshots: @@ -8668,6 +8854,8 @@ snapshots:
8668 8854
8669 core-js@3.42.0: {} 8855 core-js@3.42.0: {}
8670 8856
  8857 + core-util-is@1.0.3: {}
  8858 +
8671 cors@2.8.5: 8859 cors@2.8.5:
8672 dependencies: 8860 dependencies:
8673 object-assign: 4.1.1 8861 object-assign: 4.1.1
@@ -8930,6 +9118,8 @@ snapshots: @@ -8930,6 +9118,8 @@ snapshots:
8930 9118
8931 dijkstrajs@1.0.3: {} 9119 dijkstrajs@1.0.3: {}
8932 9120
  9121 + dingbat-to-unicode@1.0.1: {}
  9122 +
8933 dingtalk-jsapi@3.1.0: 9123 dingtalk-jsapi@3.1.0:
8934 dependencies: 9124 dependencies:
8935 promise-polyfill: 7.1.2 9125 promise-polyfill: 7.1.2
@@ -8942,6 +9132,10 @@ snapshots: @@ -8942,6 +9132,10 @@ snapshots:
8942 dependencies: 9132 dependencies:
8943 esutils: 2.0.3 9133 esutils: 2.0.3
8944 9134
  9135 + docx-preview@0.3.5:
  9136 + dependencies:
  9137 + jszip: 3.10.1
  9138 +
8945 dom-align@1.12.4: {} 9139 dom-align@1.12.4: {}
8946 9140
8947 dom-scroll-into-view@2.0.1: {} 9141 dom-scroll-into-view@2.0.1: {}
@@ -9011,6 +9205,10 @@ snapshots: @@ -9011,6 +9205,10 @@ snapshots:
9011 9205
9012 dotenv@16.5.0: {} 9206 dotenv@16.5.0: {}
9013 9207
  9208 + duck@0.1.12:
  9209 + dependencies:
  9210 + underscore: 1.13.7
  9211 +
9014 dunder-proto@1.0.1: 9212 dunder-proto@1.0.1:
9015 dependencies: 9213 dependencies:
9016 call-bind-apply-helpers: 1.0.2 9214 call-bind-apply-helpers: 1.0.2
@@ -10008,6 +10206,8 @@ snapshots: @@ -10008,6 +10206,8 @@ snapshots:
10008 10206
10009 image-size@0.5.5: {} 10207 image-size@0.5.5: {}
10010 10208
  10209 + immediate@3.0.6: {}
  10210 +
10011 import-fresh@3.3.1: 10211 import-fresh@3.3.1:
10012 dependencies: 10212 dependencies:
10013 parent-module: 1.0.1 10213 parent-module: 1.0.1
@@ -10708,6 +10908,13 @@ snapshots: @@ -10708,6 +10908,13 @@ snapshots:
10708 10908
10709 jsonparse@1.3.1: {} 10909 jsonparse@1.3.1: {}
10710 10910
  10911 + jszip@3.10.1:
  10912 + dependencies:
  10913 + lie: 3.3.0
  10914 + pako: 1.0.11
  10915 + readable-stream: 2.3.8
  10916 + setimmediate: 1.0.5
  10917 +
10711 katex@0.16.22: 10918 katex@0.16.22:
10712 dependencies: 10919 dependencies:
10713 commander: 8.3.0 10920 commander: 8.3.0
@@ -10759,6 +10966,10 @@ snapshots: @@ -10759,6 +10966,10 @@ snapshots:
10759 prelude-ls: 1.2.1 10966 prelude-ls: 1.2.1
10760 type-check: 0.4.0 10967 type-check: 0.4.0
10761 10968
  10969 + lie@3.3.0:
  10970 + dependencies:
  10971 + immediate: 3.0.6
  10972 +
10762 lilconfig@3.0.0: {} 10973 lilconfig@3.0.0: {}
10763 10974
10764 lines-and-columns@1.2.4: {} 10975 lines-and-columns@1.2.4: {}
@@ -10875,6 +11086,12 @@ snapshots: @@ -10875,6 +11086,12 @@ snapshots:
10875 dependencies: 11086 dependencies:
10876 js-tokens: 4.0.0 11087 js-tokens: 4.0.0
10877 11088
  11089 + lop@0.4.2:
  11090 + dependencies:
  11091 + duck: 0.1.12
  11092 + option: 0.2.4
  11093 + underscore: 1.13.7
  11094 +
10878 lower-case@2.0.2: 11095 lower-case@2.0.2:
10879 dependencies: 11096 dependencies:
10880 tslib: 2.8.1 11097 tslib: 2.8.1
@@ -10911,6 +11128,19 @@ snapshots: @@ -10911,6 +11128,19 @@ snapshots:
10911 dependencies: 11128 dependencies:
10912 tmpl: 1.0.5 11129 tmpl: 1.0.5
10913 11130
  11131 + mammoth@1.9.1:
  11132 + dependencies:
  11133 + '@xmldom/xmldom': 0.8.10
  11134 + argparse: 1.0.10
  11135 + base64-js: 1.5.1
  11136 + bluebird: 3.4.7
  11137 + dingbat-to-unicode: 1.0.1
  11138 + jszip: 3.10.1
  11139 + lop: 0.4.2
  11140 + path-is-absolute: 1.0.1
  11141 + underscore: 1.13.7
  11142 + xmlbuilder: 10.1.1
  11143 +
10914 map-cache@0.2.2: {} 11144 map-cache@0.2.2: {}
10915 11145
10916 map-obj@1.0.1: {} 11146 map-obj@1.0.1: {}
@@ -11273,6 +11503,8 @@ snapshots: @@ -11273,6 +11503,8 @@ snapshots:
11273 11503
11274 opener@1.5.2: {} 11504 opener@1.5.2: {}
11275 11505
  11506 + option@0.2.4: {}
  11507 +
11276 optionator@0.9.4: 11508 optionator@0.9.4:
11277 dependencies: 11509 dependencies:
11278 deep-is: 0.1.4 11510 deep-is: 0.1.4
@@ -11332,6 +11564,8 @@ snapshots: @@ -11332,6 +11564,8 @@ snapshots:
11332 11564
11333 package-manager-detector@1.3.0: {} 11565 package-manager-detector@1.3.0: {}
11334 11566
  11567 + pako@1.0.11: {}
  11568 +
11335 param-case@3.0.4: 11569 param-case@3.0.4:
11336 dependencies: 11570 dependencies:
11337 dot-case: 3.0.4 11571 dot-case: 3.0.4
@@ -11422,6 +11656,10 @@ snapshots: @@ -11422,6 +11656,10 @@ snapshots:
11422 11656
11423 pathe@2.0.3: {} 11657 pathe@2.0.3: {}
11424 11658
  11659 + pdfjs-dist@5.3.31:
  11660 + optionalDependencies:
  11661 + '@napi-rs/canvas': 0.1.71
  11662 +
11425 perfect-debounce@1.0.0: {} 11663 perfect-debounce@1.0.0: {}
11426 11664
11427 picocolors@1.1.1: {} 11665 picocolors@1.1.1: {}
@@ -11584,6 +11822,8 @@ snapshots: @@ -11584,6 +11822,8 @@ snapshots:
11584 11822
11585 print-js@1.6.0: {} 11823 print-js@1.6.0: {}
11586 11824
  11825 + process-nextick-args@2.0.1: {}
  11826 +
11587 promise-polyfill@7.1.2: {} 11827 promise-polyfill@7.1.2: {}
11588 11828
11589 prompts@2.4.2: 11829 prompts@2.4.2:
@@ -11661,6 +11901,16 @@ snapshots: @@ -11661,6 +11901,16 @@ snapshots:
11661 parse-json: 7.1.1 11901 parse-json: 7.1.1
11662 type-fest: 4.41.0 11902 type-fest: 4.41.0
11663 11903
  11904 + readable-stream@2.3.8:
  11905 + dependencies:
  11906 + core-util-is: 1.0.3
  11907 + inherits: 2.0.4
  11908 + isarray: 1.0.0
  11909 + process-nextick-args: 2.0.1
  11910 + safe-buffer: 5.1.2
  11911 + string_decoder: 1.1.1
  11912 + util-deprecate: 1.0.2
  11913 +
11664 readable-stream@3.6.2: 11914 readable-stream@3.6.2:
11665 dependencies: 11915 dependencies:
11666 inherits: 2.0.4 11916 inherits: 2.0.4
@@ -11908,6 +12158,8 @@ snapshots: @@ -11908,6 +12158,8 @@ snapshots:
11908 is-plain-object: 2.0.4 12158 is-plain-object: 2.0.4
11909 split-string: 3.1.0 12159 split-string: 3.1.0
11910 12160
  12161 + setimmediate@1.0.5: {}
  12162 +
11911 shallow-equal@1.2.1: {} 12163 shallow-equal@1.2.1: {}
11912 12164
11913 shebang-command@1.2.0: 12165 shebang-command@1.2.0:
@@ -12137,6 +12389,10 @@ snapshots: @@ -12137,6 +12389,10 @@ snapshots:
12137 define-properties: 1.2.1 12389 define-properties: 1.2.1
12138 es-object-atoms: 1.1.1 12390 es-object-atoms: 1.1.1
12139 12391
  12392 + string_decoder@1.1.1:
  12393 + dependencies:
  12394 + safe-buffer: 5.1.2
  12395 +
12140 string_decoder@1.3.0: 12396 string_decoder@1.3.0:
12141 dependencies: 12397 dependencies:
12142 safe-buffer: 5.2.1 12398 safe-buffer: 5.2.1
@@ -12548,6 +12804,8 @@ snapshots: @@ -12548,6 +12804,8 @@ snapshots:
12548 defu: 6.1.4 12804 defu: 6.1.4
12549 jiti: 1.21.7 12805 jiti: 1.21.7
12550 12806
  12807 + underscore@1.13.7: {}
  12808 +
12551 undici-types@6.19.8: {} 12809 undici-types@6.19.8: {}
12552 12810
12553 undici@6.21.3: {} 12811 undici@6.21.3: {}
@@ -12983,6 +13241,8 @@ snapshots: @@ -12983,6 +13241,8 @@ snapshots:
12983 13241
12984 xml-name-validator@4.0.0: {} 13242 xml-name-validator@4.0.0: {}
12985 13243
  13244 + xmlbuilder@10.1.1: {}
  13245 +
12986 xss@1.0.15: 13246 xss@1.0.15:
12987 dependencies: 13247 dependencies:
12988 commander: 2.20.3 13248 commander: 2.20.3
@@ -14,3 +14,5 @@ export const getLoginfo = (params) => defHttp.get({ url: Api.loginfo, params }, @@ -14,3 +14,5 @@ export const getLoginfo = (params) => defHttp.get({ url: Api.loginfo, params },
14 * @param params 14 * @param params
15 */ 15 */
16 export const getVisitInfo = (params) => defHttp.get({ url: Api.visitInfo, params }, { isTransformResponse: false }); 16 export const getVisitInfo = (params) => defHttp.get({ url: Api.visitInfo, params }, { isTransformResponse: false });
  17 +
  18 +export const getStatistics = () => defHttp.get({ url: '/airaglog/airagLog/getStatistics' });
@@ -16,7 +16,12 @@ @@ -16,7 +16,12 @@
16 <a-tab-pane loading="true" tab="受理监管" key="1"> 16 <a-tab-pane loading="true" tab="受理监管" key="1">
17 <a-row> 17 <a-row>
18 <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> 18 <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24">
19 - <Bar :chartData="barData" :option="{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }" height="40vh" :seriesColor="seriesColor" /> 19 + <Bar
  20 + :chartData="barData"
  21 + :option="{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }"
  22 + height="40vh"
  23 + :seriesColor="seriesColor"
  24 + />
20 </a-col> 25 </a-col>
21 <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> 26 <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24">
22 <QuickNav :loading="loading" class="enter-y" :bordered="false" :body-style="{ padding: 0 }" /> 27 <QuickNav :loading="loading" class="enter-y" :bordered="false" :body-style="{ padding: 0 }" />
@@ -41,8 +46,8 @@ @@ -41,8 +46,8 @@
41 <a-tab-pane tab="存储监管" key="3"> 46 <a-tab-pane tab="存储监管" key="3">
42 <a-row> 47 <a-row>
43 <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24" style="display: flex"> 48 <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24" style="display: flex">
44 - <Gauge :seriesColor="seriesColor" :chartData="{ name: 'C盘', value: 70 }" height="30vh"></Gauge>  
45 - <Gauge :seriesColor="seriesColor" :chartData="{ name: 'D盘', value: 50 }" height="30vh"></Gauge> 49 + <Gauge :seriesColor="seriesColor" :chartData="{ name: 'C盘', value: 70 }" height="30vh" />
  50 + <Gauge :seriesColor="seriesColor" :chartData="{ name: 'D盘', value: 50 }" height="30vh" />
46 </a-col> 51 </a-col>
47 <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> 52 <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24">
48 <QuickNav :loading="loading" class="enter-y" :bordered="false" :body-style="{ padding: 0 }" /> 53 <QuickNav :loading="loading" class="enter-y" :bordered="false" :body-style="{ padding: 0 }" />
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 <ChartCard 4 <ChartCard
5 :loading="loading" 5 :loading="loading"
6 :title="item.title" 6 :title="item.title"
7 - :total="getTotal(item.total, index)" 7 + :total="item.total"
8 class="md:w-1/4 w-full !md:mt-0 !mt-4" 8 class="md:w-1/4 w-full !md:mt-0 !mt-4"
9 :class="[index + 1 < 4 && '!md:mr-4']" 9 :class="[index + 1 < 4 && '!md:mr-4']"
10 > 10 >
@@ -14,31 +14,38 @@ @@ -14,31 +14,38 @@
14 </a-tooltip> 14 </a-tooltip>
15 </template> 15 </template>
16 <div v-if="type === 'chart'"> 16 <div v-if="type === 'chart'">
17 - <Trend term="周同比" :percentage="12" v-if="index === 0" />  
18 - <Trend term="日同比" :percentage="11" v-if="index === 0" :type="false" /> 17 + <!-- <Trend term="周同比" :percentage="12" v-if="index === 0" />-->
  18 + <!-- <Trend term="日同比" :percentage="11" v-if="index === 0" :type="false" />-->
  19 + <div v-if="index === 0" class="p-2 px-4 flex justify-between">
  20 + <span>平均问答次数</span>
  21 + <span>{{ formatNumber(statistics.averageCount) }}</span>
  22 + </div>
  23 + <SingleLine v-if="index === 1" :option="option" :chartData="chartData" :seriesColor="seriesColor" height="50px" />
19 24
20 - <SingleLine v-if="index === 1" :option="option" :chartData="chartData" :seriesColor="seriesColor" height="50px"></SingleLine> 25 + <Bar v-if="index === 2" :option="option" :chartData="chartData" :seriesColor="seriesColor" height="50px" />
21 26
22 - <Bar v-if="index === 2" :option="option" :chartData="chartData" :seriesColor="seriesColor" height="50px"></Bar>  
23 -  
24 - <Progress v-if="index === 3" :percent="78" :show-info="false"></Progress> 27 + <Trend
  28 + v-if="index === 3"
  29 + :term="statistics.growthRate >= 0 ? '日增长' : '日下降'"
  30 + :percentage="Math.abs(statistics.growthRate)"
  31 + :type="statistics.growthRate >= 0"
  32 + />
25 </div> 33 </div>
26 <div v-else> 34 <div v-else>
27 - <SingleLine :seriesColor="seriesColor" v-if="index === 0" :option="option" :chartData="chartData" height="50px"></SingleLine>  
28 -  
29 - <SingleLine :seriesColor="seriesColor" v-if="index === 1" :option="option" :chartData="chartData" height="50px"></SingleLine> 35 + <SingleLine :seriesColor="seriesColor" v-if="index === 0" :option="option" :chartData="chartData" height="50px" />
30 36
31 - <Bar :seriesColor="seriesColor" v-if="index === 2" :option="option" :chartData="chartData" height="50px"></Bar> 37 + <SingleLine :seriesColor="seriesColor" v-if="index === 1" :option="option" :chartData="chartData" height="50px" />
32 38
33 - <Progress v-if="index === 3" :percent="78" :show-info="false"></Progress> 39 + <Bar :seriesColor="seriesColor" v-if="index === 2" :option="option" :chartData="chartData" height="50px" />
34 40
  41 + <Progress v-if="index === 3" :percent="78" :show-info="false" />
35 </div> 42 </div>
36 <template #footer v-if="type === 'chart'"> 43 <template #footer v-if="type === 'chart'">
37 <span v-if="index !== 3" 44 <span v-if="index !== 3"
38 >{{ item.footer }}<span>{{ item.value }}</span></span 45 >{{ item.footer }}<span>{{ item.value }}</span></span
39 > 46 >
40 - <Trend term="周同比" :percentage="12" v-if="index === 3" />  
41 - <Trend term="日同比" :percentage="11" v-if="index === 3" :type="false" /> 47 + <!-- <Trend term="周同比" :percentage="12" v-if="index === 3" />-->
  48 + <!-- <Trend term="日同比" :percentage="11" v-if="index === 3" :type="false" />-->
42 </template> 49 </template>
43 <template #footer v-else> 50 <template #footer v-else>
44 <span 51 <span
@@ -50,18 +57,28 @@ @@ -50,18 +57,28 @@
50 </div> 57 </div>
51 </template> 58 </template>
52 <script lang="ts" setup> 59 <script lang="ts" setup>
53 - import { ref, computed } from 'vue'; 60 + import { ref, computed, watch, toRaw } from 'vue';
54 import { Icon } from '/@/components/Icon'; 61 import { Icon } from '/@/components/Icon';
55 import { Progress } from 'ant-design-vue'; 62 import { Progress } from 'ant-design-vue';
56 import ChartCard from '/@/components/chart/ChartCard.vue'; 63 import ChartCard from '/@/components/chart/ChartCard.vue';
57 import Trend from '/@/components/chart/Trend.vue'; 64 import Trend from '/@/components/chart/Trend.vue';
58 import Bar from '/@/components/chart/Bar.vue'; 65 import Bar from '/@/components/chart/Bar.vue';
59 import SingleLine from '/@/components/chart/SingleLine.vue'; 66 import SingleLine from '/@/components/chart/SingleLine.vue';
60 - import { chartCardList, bdcCardList } from '../data'; 67 + import { bdcCardList } from '../data';
61 import { useRootSetting } from '/@/hooks/setting/useRootSetting'; 68 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
62 69
63 const { getThemeColor } = useRootSetting(); 70 const { getThemeColor } = useRootSetting();
64 const props = defineProps({ 71 const props = defineProps({
  72 + statistics: {
  73 + type: Object,
  74 + default: () => ({
  75 + todayCount: 0,
  76 + rejectedCount: 0,
  77 + totalCount: 0,
  78 + averageCount: 0,
  79 + monthlyData: [],
  80 + }),
  81 + },
65 loading: { 82 loading: {
66 type: Boolean, 83 type: Boolean,
67 }, 84 },
@@ -100,10 +117,75 @@ @@ -100,10 +117,75 @@
100 ]); 117 ]);
101 const seriesColor = computed(() => { 118 const seriesColor = computed(() => {
102 return getThemeColor.value; 119 return getThemeColor.value;
103 - })  
104 - const dataList = computed(() => (props.type === 'dbc' ? bdcCardList : chartCardList)); 120 + });
  121 + console.log('ChartGroupCard 组件渲染,接收到的 statistics:', toRaw(props.statistics));
  122 + // 动态生成数据
  123 + // 修复计算属性:使用props.statistics直接访问
  124 + const dataList = computed(() => {
  125 + if (props.type === 'dbc') {
  126 + return bdcCardList;
  127 + }
  128 +
  129 + // 使用解构确保响应式依赖
  130 + const { todayCount, rejectedCount, totalCount, growthRate } = props.statistics;
105 131
106 - function getTotal(total, index) {  
107 - return index === 0 ? `¥${total}` : index === 3 ? `${total}%` : total; 132 + return [
  133 + {
  134 + title: '累计问答次数',
  135 + icon: 'visit-count|svg',
  136 + total: totalCount || 0,
  137 + },
  138 + {
  139 + title: '今日问答次数',
  140 + icon: 'total-sales|svg',
  141 + total: todayCount || 0,
  142 + color: 'blue',
  143 + },
  144 + {
  145 + title: '拒绝回答次数',
  146 + icon: 'download-count|svg',
  147 + total: rejectedCount || 0,
  148 + color: 'orange',
  149 + },
  150 + {
  151 + title: '对比前一日增长同比',
  152 + icon: 'transaction|svg',
  153 + total: formatGrowthRate(growthRate),
  154 + },
  155 + ];
  156 + });
  157 + // 添加数字格式化函数
  158 + const formatNumber = (value: number) => {
  159 + if (isNaN(value)) return '0';
  160 + return value.toFixed(2);
  161 + };
  162 +
  163 + // 格式化增长率显示
  164 + function formatGrowthRate(rate: number): string {
  165 + if (rate > 0) {
  166 + return `+${rate.toFixed(2)}%`;
  167 + } else if (rate < 0) {
  168 + return `${rate.toFixed(2)}%`;
  169 + }
  170 + return '0.00%';
108 } 171 }
  172 +
  173 + // 监测 props.statistics 的变化
  174 + watch(
  175 + () => props.statistics,
  176 + (newStatistics) => {
  177 + console.log('statistics 更新:', newStatistics);
  178 + // 这里可以添加其他处理逻辑,如果有必要的话
  179 + },
  180 + { deep: true }
  181 + );
  182 +
  183 + // 使用 toRaw 确保打印真实值
  184 + watch(
  185 + () => props.statistics,
  186 + (newVal) => {
  187 + console.log('子组件接收到新的 statistics:', toRaw(newVal));
  188 + },
  189 + { deep: true, immediate: true }
  190 + );
109 </script> 191 </script>
@@ -37,17 +37,17 @@ @@ -37,17 +37,17 @@
37 title: '信息查询', 37 title: '信息查询',
38 icon: 'ion:settings-outline', 38 icon: 'ion:settings-outline',
39 color: '#3fb27f', 39 color: '#3fb27f',
40 - },  
41 - {  
42 - title: '通知公告',  
43 - icon: 'ion:notifications',  
44 - color: '#13b0ff',  
45 - },  
46 - {  
47 - title: '我的任务',  
48 - icon: 'ion:person-stalker',  
49 - color: '#b27315',  
50 - } 40 + },
  41 + {
  42 + title: '通知公告',
  43 + icon: 'ion:notifications',
  44 + color: '#13b0ff',
  45 + },
  46 + {
  47 + title: '我的任务',
  48 + icon: 'ion:person-stalker',
  49 + color: '#b27315',
  50 + },
51 ]; 51 ];
52 52
53 function goPage() { 53 function goPage() {
@@ -13,61 +13,64 @@ @@ -13,61 +13,64 @@
13 <a-range-picker :style="{ width: '256px' }" /> 13 <a-range-picker :style="{ width: '256px' }" />
14 </div> 14 </div>
15 </template> 15 </template>
16 - <a-tab-pane loading="true" tab="销售额" key="1"> 16 + <a-tab-pane loading="true" tab="每月问答次数" key="1">
17 <a-row> 17 <a-row>
18 <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> 18 <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24">
19 - <Bar :chartData="barData" :option="{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }" height="40vh" :seriesColor="seriesColor" /> 19 + <Bar
  20 + :chartData="barData"
  21 + :option="{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }"
  22 + height="40vh"
  23 + :seriesColor="seriesColor"
  24 + />
20 </a-col> 25 </a-col>
21 <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> 26 <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24">
22 - <RankList title="门店销售排行榜" :list="rankList" />  
23 - </a-col>  
24 - </a-row>  
25 - </a-tab-pane>  
26 - <a-tab-pane tab="销售趋势" key="2">  
27 - <a-row>  
28 - <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24">  
29 - <Bar :chartData="barData.reverse()" :option="{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }" height="40vh" :seriesColor="seriesColor" />  
30 - </a-col>  
31 - <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24">  
32 - <RankList title="门店销售排行榜" :list="rankList" /> 27 + <RankList title="按钮统计榜" :list="buttonStats" />
33 </a-col> 28 </a-col>
34 </a-row> 29 </a-row>
35 </a-tab-pane> 30 </a-tab-pane>
  31 + <!-- <a-tab-pane tab="销售趋势" key="2">-->
  32 + <!-- <a-row>-->
  33 + <!-- <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24">-->
  34 + <!-- <Bar-->
  35 + <!-- :chartData="barData.reverse()"-->
  36 + <!-- :option="{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }"-->
  37 + <!-- height="40vh"-->
  38 + <!-- :seriesColor="seriesColor"-->
  39 + <!-- />-->
  40 + <!-- </a-col>-->
  41 + <!-- <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24">-->
  42 + <!-- <RankList title="门店销售排行榜" :list="rankList" />-->
  43 + <!-- </a-col>-->
  44 + <!-- </a-row>-->
  45 + <!-- </a-tab-pane>-->
36 </a-tabs> 46 </a-tabs>
37 </div> 47 </div>
38 </a-card> 48 </a-card>
39 </template> 49 </template>
40 <script lang="ts" setup> 50 <script lang="ts" setup>
41 - import { ref, computed } from 'vue'; 51 + import { computed } from 'vue';
42 import Bar from '/@/components/chart/Bar.vue'; 52 import Bar from '/@/components/chart/Bar.vue';
43 import RankList from '/@/components/chart/RankList.vue'; 53 import RankList from '/@/components/chart/RankList.vue';
44 import { useRootSetting } from '/@/hooks/setting/useRootSetting'; 54 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
45 -  
46 55
47 defineProps({ 56 defineProps({
48 loading: { 57 loading: {
49 type: Boolean, 58 type: Boolean,
50 }, 59 },
  60 + barData: {
  61 + type: Array as () => Array<{ name: string; value: number }>, // 直接定义类型
  62 + default: () => [],
  63 + },
  64 + buttonStats: {
  65 + // 添加按钮统计属性
  66 + type: Array as () => Array<{ question: string; total: number }>,
  67 + default: () => [],
  68 + },
51 }); 69 });
52 const { getThemeColor } = useRootSetting(); 70 const { getThemeColor } = useRootSetting();
53 - const rankList = [];  
54 - for (let i = 0; i < 7; i++) {  
55 - rankList.push({  
56 - name: '白鹭岛 ' + (i + 1) + ' 号店',  
57 - total: 1234.56 - i * 100,  
58 - });  
59 - }  
60 -  
61 - const barData = [];  
62 - for (let i = 0; i < 12; i += 1) {  
63 - barData.push({  
64 - name: `${i + 1}月`,  
65 - value: Math.floor(Math.random() * 1000) + 200,  
66 - });  
67 - }  
68 const seriesColor = computed(() => { 71 const seriesColor = computed(() => {
69 - return getThemeColor.value  
70 - }) 72 + return getThemeColor.value;
  73 + });
71 </script> 74 </script>
72 75
73 <style lang="less" scoped> 76 <style lang="less" scoped>
@@ -43,32 +43,26 @@ export const growCardList: GrowCardItem[] = [ @@ -43,32 +43,26 @@ export const growCardList: GrowCardItem[] = [
43 }, 43 },
44 ]; 44 ];
45 45
46 -export const chartCardList: GrowCardItem[] = [ 46 +export const getChartCardList = (statistics) => [
47 { 47 {
48 - title: '总销售额', 48 + title: '累计问答次数',
49 icon: 'visit-count|svg', 49 icon: 'visit-count|svg',
50 - total: 126560,  
51 - value: 234.56,  
52 - footer: '日均销售额', 50 + total: statistics.totalCount || 0,
53 }, 51 },
54 { 52 {
55 - title: '订单量', 53 + title: '今日问答次数',
56 icon: 'total-sales|svg', 54 icon: 'total-sales|svg',
57 - value: 1234,  
58 - total: 8846, 55 + total: statistics.todayCount || 0,
59 color: 'blue', 56 color: 'blue',
60 - footer: '日订单量',  
61 }, 57 },
62 { 58 {
63 - title: '支付笔数', 59 + title: '拒绝回答次数',
64 icon: 'download-count|svg', 60 icon: 'download-count|svg',
65 - value: 60,  
66 - total: 6560, 61 + total: statistics.rejectedCount || 0,
67 color: 'orange', 62 color: 'orange',
68 - footer: '转化率',  
69 }, 63 },
70 { 64 {
71 - title: '运营活动效果', 65 + title: '对比前一日增长同比',
72 icon: 'transaction|svg', 66 icon: 'transaction|svg',
73 total: 78, 67 total: 78,
74 }, 68 },
1 <template> 1 <template>
2 <div class="p-4"> 2 <div class="p-4">
3 - <ChartGroupCard class="enter-y" :loading="loading" type="chart" />  
4 - <SaleTabCard class="!my-4 enter-y" :loading="loading" /> 3 + <ChartGroupCard class="enter-y" :loading="loading" type="chart" :statistics="statistics" />
  4 + <SaleTabCard class="!my-4 enter-y" :loading="loading" :barData="barData" :buttonStats="buttonStats" />
5 <a-row> 5 <a-row>
6 <a-col :span="24"> 6 <a-col :span="24">
7 <a-card :loading="loading" :bordered="false" title="最近一周访问量统计"> 7 <a-card :loading="loading" :bordered="false" title="最近一周访问量统计">
8 <div class="infoArea"> 8 <div class="infoArea">
9 - <HeadInfo title="今日IP" :iconColor="ipColor" :content="loginfo.todayIp" icon="environment"></HeadInfo>  
10 - <HeadInfo title="今日访问" :iconColor="visitColor" :content="loginfo.todayVisitCount" icon="team"></HeadInfo>  
11 - <HeadInfo title="总访问量" :iconColor="seriesColor" :content="loginfo.totalVisitCount" icon="rise"></HeadInfo> 9 + <HeadInfo title="今日IP" :iconColor="ipColor" :content="loginfo.todayIp" icon="environment" />
  10 + <HeadInfo title="今日访问" :iconColor="visitColor" :content="loginfo.todayVisitCount" icon="team" />
  11 + <HeadInfo title="总访问量" :iconColor="seriesColor" :content="loginfo.totalVisitCount" icon="rise" />
12 </div> 12 </div>
13 - <LineMulti :chartData="lineMultiData" height="33vh" type="line" :option="{ legend: { top: 'bottom' } }"></LineMulti> 13 + <!-- <LineMulti :chartData="lineMultiData" height="33vh" type="line" :option="{ legend: { top: 'bottom' } }" />-->
14 </a-card> 14 </a-card>
15 </a-col> 15 </a-col>
16 </a-row> 16 </a-row>
17 </div> 17 </div>
18 </template> 18 </template>
19 <script lang="ts" setup> 19 <script lang="ts" setup>
20 - import { ref, watch } from 'vue'; 20 + import { computed, onMounted, onUnmounted, ref, watch } from 'vue';
21 import ChartGroupCard from '../components/ChartGroupCard.vue'; 21 import ChartGroupCard from '../components/ChartGroupCard.vue';
22 import SaleTabCard from '../components/SaleTabCard.vue'; 22 import SaleTabCard from '../components/SaleTabCard.vue';
23 - import LineMulti from '/@/components/chart/LineMulti.vue';  
24 import HeadInfo from '/@/components/chart/HeadInfo.vue'; 23 import HeadInfo from '/@/components/chart/HeadInfo.vue';
25 - import { getLoginfo, getVisitInfo } from '../api.ts'; 24 + import { getLoginfo, getStatistics, getVisitInfo } from '../api';
26 import { useRootSetting } from '/@/hooks/setting/useRootSetting'; 25 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
27 26
28 const loading = ref(true); 27 const loading = ref(true);
29 const { getThemeColor } = useRootSetting(); 28 const { getThemeColor } = useRootSetting();
30 29
  30 + // 使用实时数据对象
  31 + const statistics = ref({
  32 + todayCount: 0,
  33 + yesterdayCount: 0,
  34 + growthRate: 0,
  35 + rejectedCount: 0,
  36 + totalCount: 0,
  37 + averageCount: 0,
  38 + buttonStats: [] as { question: string; count: number }[],
  39 + monthlyData: [] as { month: string; count: number }[],
  40 + });
  41 +
  42 + // 实时数据获取函数
  43 + async function fetchStatistics() {
  44 + try {
  45 + const res = await getStatistics();
  46 + console.log('接收到的统计数据:', res); // 添加日志输出
  47 + console.log('res是否有success属性:', 'success' in res);
  48 + // 直接使用响应数据,不检查 success 属性
  49 + statistics.value = {
  50 + todayCount: res.todayCount || res.data?.todayCount || 0,
  51 + yesterdayCount: res.yesterdayCount || 0,
  52 + growthRate: res.growthRate || 0,
  53 + rejectedCount: res.rejectedCount || res.data?.rejectedCount || 0,
  54 + totalCount: res.totalCount || res.data?.totalCount || 0,
  55 + averageCount: res.averageCount || 0,
  56 + buttonStats: res.buttonStats || [],
  57 + monthlyData: res.monthlyData || res.data?.monthlyData || generateMonthlyData(),
  58 + };
  59 +
  60 + console.log('更新后的 statistics:', statistics.value);
  61 + } catch (e) {
  62 + console.error('获取统计数据失败', e);
  63 + }
  64 + }
  65 +
  66 + // 生成模拟月度数据(当后端未提供时)
  67 + function generateMonthlyData() {
  68 + return Array.from({ length: 12 }, (_, i) => ({
  69 + name: `${i + 1}月`,
  70 + value: Math.floor(Math.random() * 1000) + 200,
  71 + }));
  72 + }
  73 +
  74 + // 转换按钮统计数据格式
  75 + const buttonStats = computed(() => {
  76 + return statistics.value.buttonStats.map((item) => ({
  77 + name: item.question,
  78 + total: item.count,
  79 + }));
  80 + });
  81 + // 在 setup 中添加转换函数
  82 + const barData = computed(() => {
  83 + if (!statistics.value.monthlyData) return [];
  84 +
  85 + return statistics.value.monthlyData.map((item) => {
  86 + // 提取月份数字 (格式如 "2025-05" -> 5)
  87 + const monthNum = parseInt(item.month.split('-')[1]);
  88 + return {
  89 + name: `${monthNum}月`,
  90 + value: item.count,
  91 + };
  92 + });
  93 + });
  94 + // 设置实时更新
  95 + let refreshTimer: number | null = null;
  96 +
  97 + onMounted(() => {
  98 + fetchStatistics();
  99 +
  100 + // 每5秒更新一次数据(根据需求调整间隔)
  101 + refreshTimer = setInterval(fetchStatistics, 5000) as unknown as number;
  102 + });
  103 +
  104 + onUnmounted(() => {
  105 + if (refreshTimer) clearInterval(refreshTimer);
  106 + });
  107 +
31 setTimeout(() => { 108 setTimeout(() => {
32 loading.value = false; 109 loading.value = false;
33 }, 500); 110 }, 500);
34 111
35 const loginfo = ref({}); 112 const loginfo = ref({});
36 const lineMultiData = ref([]); 113 const lineMultiData = ref([]);
37 -  
38 function initLogInfo() { 114 function initLogInfo() {
39 getLoginfo(null).then((res) => { 115 getLoginfo(null).then((res) => {
40 if (res.success) { 116 if (res.success) {
@@ -80,7 +156,7 @@ @@ -80,7 +156,7 @@
80 </script> 156 </script>
81 157
82 <style lang="less" scoped> 158 <style lang="less" scoped>
83 - .infoArea { 159 + .infoArea {
84 display: flex; 160 display: flex;
85 justify-content: space-between; 161 justify-content: space-between;
86 padding: 0 10%; 162 padding: 0 10%;
1 <template> 1 <template>
2 - <IndexChart v-if="indexStyle === 0"></IndexChart>  
3 - <IndexDef v-if="indexStyle === 1"></IndexDef>  
4 - <IndexBdc v-if="indexStyle == 2"></IndexBdc>  
5 - <IndexTask v-if="indexStyle == 3"></IndexTask> 2 + <IndexChart v-if="indexStyle === 0" />
  3 + <IndexDef v-if="indexStyle === 1" />
  4 + <IndexBdc v-if="indexStyle == 2" />
  5 + <IndexTask v-if="indexStyle == 3" />
6 <div style="width: 100%; text-align: right; margin-top: 20px"> 6 <div style="width: 100%; text-align: right; margin-top: 20px">
7 首页主题: 7 首页主题:
8 <a-radio-group v-model:value="indexStyle"> 8 <a-radio-group v-model:value="indexStyle">
1 <template> 1 <template>
2 <div class="wrap"> 2 <div class="wrap">
3 <div class="content"> 3 <div class="content">
4 - <AiChat></AiChat> 4 + <AiChat />
5 </div> 5 </div>
6 </div> 6 </div>
7 </template> 7 </template>
8 8
9 <script setup> 9 <script setup>
10 import AiChat from '/@/views/super/airag/aiapp/chat/AiChat.vue'; 10 import AiChat from '/@/views/super/airag/aiapp/chat/AiChat.vue';
11 -  
12 </script> 11 </script>
13 12
14 <style lang="less" scoped> 13 <style lang="less" scoped>
@@ -35,6 +35,11 @@ export const columns: BasicColumn[] = [ @@ -35,6 +35,11 @@ export const columns: BasicColumn[] = [
35 align: 'center', 35 align: 'center',
36 dataIndex: 'buttonValues', 36 dataIndex: 'buttonValues',
37 }, 37 },
  38 + {
  39 + title: '按钮code',
  40 + align: 'center',
  41 + dataIndex: 'code',
  42 + },
38 ]; 43 ];
39 // 定义开关状态映射 44 // 定义开关状态映射
40 const switchLoading = reactive<Record<string, boolean>>({}); 45 const switchLoading = reactive<Record<string, boolean>>({});
@@ -93,6 +98,12 @@ export const formSchema: FormSchema[] = [ @@ -93,6 +98,12 @@ export const formSchema: FormSchema[] = [
93 componentProps: {}, 98 componentProps: {},
94 }, 99 },
95 { 100 {
  101 + label: '按钮code',
  102 + field: 'code',
  103 + component: 'Input',
  104 + required: true,
  105 + },
  106 + {
96 label: '发送内容', 107 label: '发送内容',
97 field: 'buttonValues', 108 field: 'buttonValues',
98 component: 'InputTextArea', // 替换为文本域组件 109 component: 'InputTextArea', // 替换为文本域组件
@@ -9,6 +9,7 @@ enum Api { @@ -9,6 +9,7 @@ enum Api {
9 listKnowledgeName = '/airaglog/airagLog/listKnowledgeName', 9 listKnowledgeName = '/airaglog/airagLog/listKnowledgeName',
10 save = '/airaglog/airagLog/add', 10 save = '/airaglog/airagLog/add',
11 saveToQuestionLibrary = '/airaglog/airagLog/saveToQuestionLibrary', 11 saveToQuestionLibrary = '/airaglog/airagLog/saveToQuestionLibrary',
  12 + saveToEmbeddingLibrary = '/airaglog/airagLog/saveToEmbeddingLibrary',
12 edit = '/airaglog/airagLog/edit', 13 edit = '/airaglog/airagLog/edit',
13 deleteOne = '/airaglog/airagLog/delete', 14 deleteOne = '/airaglog/airagLog/delete',
14 deleteBatch = '/airaglog/airagLog/deleteBatch', 15 deleteBatch = '/airaglog/airagLog/deleteBatch',
@@ -40,6 +41,14 @@ export const saveToQuestionLibrary = (params) => @@ -40,6 +41,14 @@ export const saveToQuestionLibrary = (params) =>
40 'Content-Type': 'application/json', 41 'Content-Type': 'application/json',
41 }, 42 },
42 }); 43 });
  44 +export const saveToEmbeddingLibrary = (params) =>
  45 + defHttp.post({
  46 + url: Api.saveToEmbeddingLibrary,
  47 + params,
  48 + headers: {
  49 + 'Content-Type': 'application/json',
  50 + },
  51 + });
43 /** 52 /**
44 * 删除单个 53 * 删除单个
45 */ 54 */
@@ -51,6 +51,19 @@ export const columns: BasicColumn[] = [ @@ -51,6 +51,19 @@ export const columns: BasicColumn[] = [
51 }, 51 },
52 }, 52 },
53 { 53 {
  54 + title: '提问方式',
  55 + align: 'center',
  56 + dataIndex: 'codeType',
  57 + customRender: ({ text }) => {
  58 + return text === 1 ? '输入框提问' : '快捷按钮提问';
  59 + },
  60 + },
  61 + {
  62 + title: '按钮code',
  63 + align: 'center',
  64 + dataIndex: 'code',
  65 + },
  66 + {
54 title: '是否存入问题库', 67 title: '是否存入问题库',
55 align: 'center', 68 align: 'center',
56 dataIndex: 'isStorage', 69 dataIndex: 'isStorage',
1 <template> 1 <template>
2 <div> 2 <div>
3 <!--引用表格--> 3 <!--引用表格-->
4 - <BasicTable @register="registerTable" :rowSelection="rowSelection" @change="handleTableChange"> 4 + <BasicTable @register="registerTable" :rowSelection="rowSelection">
5 <!--插槽:table标题--> 5 <!--插槽:table标题-->
6 <template #tableTitle> 6 <template #tableTitle>
7 <a-button type="primary" v-auth="'airaglog:airag_log:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button> 7 <a-button type="primary" v-auth="'airaglog:airag_log:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
@@ -40,7 +40,7 @@ @@ -40,7 +40,7 @@
40 40
41 <script lang="ts" name="airaglog-airagLog" setup> 41 <script lang="ts" name="airaglog-airagLog" setup>
42 import { ref, reactive } from 'vue'; 42 import { ref, reactive } from 'vue';
43 - import { BasicTable, TableAction } from '/@/components/Table'; 43 + import { BasicTable, TableAction, type ActionItem } from '/@/components/Table';
44 import { useModal } from '/@/components/Modal'; 44 import { useModal } from '/@/components/Modal';
45 import { useListPage } from '/@/hooks/system/useListPage'; 45 import { useListPage } from '/@/hooks/system/useListPage';
46 import AiragLogModal from './components/AiragLogModal.vue'; 46 import AiragLogModal from './components/AiragLogModal.vue';
@@ -87,7 +87,7 @@ @@ -87,7 +87,7 @@
87 ], 87 ],
88 }, 88 },
89 actionColumn: { 89 actionColumn: {
90 - width: 120, 90 + width: 200,
91 fixed: 'right', 91 fixed: 'right',
92 }, 92 },
93 beforeFetch: (params) => { 93 beforeFetch: (params) => {
@@ -174,20 +174,22 @@ @@ -174,20 +174,22 @@
174 * 操作栏 174 * 操作栏
175 */ 175 */
176 function getTableAction(record) { 176 function getTableAction(record) {
177 - if (record.isStorage == 0)  
178 - return [  
179 - {  
180 - label: '存入问题库',  
181 - onClick: () => handleSaveToQuestionLibrary(record),  
182 - auth: 'airaglog:airag_log:saveToQuestionLibrary',  
183 - },  
184 - ];  
185 - else  
186 - return [  
187 - {  
188 - label: '',  
189 - },  
190 - ]; 177 + const actions: ActionItem[] = [];
  178 + if (record.isStorage == 0) {
  179 + actions.push({
  180 + label: '存入问题库',
  181 + onClick: () => handleSaveToQuestionLibrary(record),
  182 + auth: 'airaglog:airag_log:saveToQuestionLibrary',
  183 + });
  184 + }
  185 + if (record.ifSaveKnowledge == 0) {
  186 + actions.push({
  187 + label: '存入知识库',
  188 + onClick: () => handleSaveToEmbeddingLibrary(record),
  189 + auth: 'airaglog:airag_log:saveToEmbeddingLibrary',
  190 + });
  191 + }
  192 + return actions;
191 } 193 }
192 /** 194 /**
193 * 存入问题库事件 195 * 存入问题库事件
@@ -198,8 +200,10 @@ @@ -198,8 +200,10 @@
198 isUpdate: true, 200 isUpdate: true,
199 showFooter: true, 201 showFooter: true,
200 showSaveButton: true, 202 showSaveButton: true,
  203 + operationType: 'question', // 指定操作类型
201 onConfirm: async (record) => { 204 onConfirm: async (record) => {
202 try { 205 try {
  206 + console.log('执行知识库保存操作...');
203 await defHttp.post({ url: '/airaglog/airagLog/saveToQuestionLibrary', params: record }); 207 await defHttp.post({ url: '/airaglog/airagLog/saveToQuestionLibrary', params: record });
204 // 刷新列表 208 // 刷新列表
205 reload(); 209 reload();
@@ -210,24 +214,27 @@ @@ -210,24 +214,27 @@
210 }); 214 });
211 } 215 }
212 /** 216 /**
213 - * 下拉操作栏 217 + * 存入问题库事件
214 */ 218 */
215 - function getDropDownAction(record) {  
216 - return [  
217 - {  
218 - label: '详情',  
219 - onClick: handleDetail.bind(null, record),  
220 - },  
221 - {  
222 - label: '删除',  
223 - popConfirm: {  
224 - title: '是否确认删除',  
225 - confirm: handleDelete.bind(null, record),  
226 - placement: 'topLeft',  
227 - },  
228 - auth: 'airaglog:airag_log:delete', 219 + async function handleSaveToEmbeddingLibrary(record) {
  220 + console.log('点击存入知识库按钮,记录ID:', record.id);
  221 + openModal(true, {
  222 + record,
  223 + isUpdate: true,
  224 + showFooter: true,
  225 + showSaveButton: true,
  226 + operationType: 'knowledge', // 指定操作类型
  227 + onConfirm: async (record) => {
  228 + console.log("执行知识库确认回调");
  229 + try {
  230 + await defHttp.post({ url: '/airaglog/airagLog/saveToEmbeddingLibrary', params: record });
  231 + // 刷新列表
  232 + reload();
  233 + } catch (error) {
  234 + console.error('存入知识库失败', error);
  235 + }
229 }, 236 },
230 - ]; 237 + });
231 } 238 }
232 </script> 239 </script>
233 240
@@ -4,8 +4,13 @@ @@ -4,8 +4,13 @@
4 <template #footer> 4 <template #footer>
5 <a-button @click="closeModal">取消</a-button> 5 <a-button @click="closeModal">取消</a-button>
6 <!-- 根据 showSaveButton 决定显示哪个按钮 --> 6 <!-- 根据 showSaveButton 决定显示哪个按钮 -->
7 - <template v-if="showSaveButton">  
8 - <a-button @click="handleSubmit" type="primary">存入</a-button> 7 + <!-- 根据操作类型显示不同按钮 -->
  8 + <template v-if="operationType === 'question'">
  9 + <a-button @click="handleSubmit" type="primary">存入问题库</a-button>
  10 + </template>
  11 +
  12 + <template v-else-if="operationType === 'knowledge'">
  13 + <a-button @click="handleSubmit" type="primary">存入知识库</a-button>
9 </template> 14 </template>
10 <template v-else> 15 <template v-else>
11 <a-button @click="handleSubmit">确认</a-button> 16 <a-button @click="handleSubmit">确认</a-button>
@@ -20,17 +25,14 @@ @@ -20,17 +25,14 @@
20 import { BasicForm, useForm } from '/@/components/Form/index'; 25 import { BasicForm, useForm } from '/@/components/Form/index';
21 import { formSchema } from '../AiragLog.data'; 26 import { formSchema } from '../AiragLog.data';
22 import { saveOrUpdate } from '../AiragLog.api'; 27 import { saveOrUpdate } from '../AiragLog.api';
  28 + // 添加操作类型标识
  29 + const operationType = ref<string>('');
23 // Emits声明 30 // Emits声明
24 const emit = defineEmits(['register', 'success']); 31 const emit = defineEmits(['register', 'success']);
25 const isUpdate = ref(true); 32 const isUpdate = ref(true);
26 const isDetail = ref(false); 33 const isDetail = ref(false);
27 const showSaveButton = ref(true); 34 const showSaveButton = ref(true);
28 - const props = defineProps({  
29 - onConfirm: {  
30 - type: Function,  
31 - default: null,  
32 - },  
33 - }); 35 + let customOnConfirm = ref<Function | null>(null);
34 //表单配置 36 //表单配置
35 const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField }] = useForm({ 37 const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField }] = useForm({
36 labelWidth: 150, 38 labelWidth: 150,
@@ -40,9 +42,13 @@ @@ -40,9 +42,13 @@
40 }); 42 });
41 //表单赋值 43 //表单赋值
42 const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { 44 const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
  45 + console.log("模态框打开,操作类型:", data?.operationType);
43 //重置表单 46 //重置表单
44 await resetFields(); 47 await resetFields();
45 setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter }); 48 setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });
  49 + // 设置操作类型
  50 + operationType.value = data?.operationType || '';
  51 + customOnConfirm.value = data?.onConfirm || null;
46 isUpdate.value = !!data?.isUpdate; 52 isUpdate.value = !!data?.isUpdate;
47 isDetail.value = !!data?.showFooter; 53 isDetail.value = !!data?.showFooter;
48 if (unref(isUpdate)) { 54 if (unref(isUpdate)) {
@@ -54,17 +60,26 @@ @@ -54,17 +60,26 @@
54 // 隐藏底部时禁用整个表单 60 // 隐藏底部时禁用整个表单
55 setProps({ disabled: !data?.showFooter }); 61 setProps({ disabled: !data?.showFooter });
56 }); 62 });
57 - //设置标题  
58 - const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑')); 63 + // 根据操作类型设置标题
  64 + const title = computed(() => {
  65 + if (operationType.value === 'question') return '存入问题库';
  66 + if (operationType.value === 'knowledge') return '存入知识库';
  67 + return !unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑';
  68 + });
59 //表单提交事件 69 //表单提交事件
60 async function handleSubmit(v) { 70 async function handleSubmit(v) {
  71 + console.log('表单提交,操作类型:', operationType.value);
61 try { 72 try {
62 let values = await validate(); 73 let values = await validate();
63 setModalProps({ confirmLoading: true }); 74 setModalProps({ confirmLoading: true });
64 - if (props.onConfirm) {  
65 - await props.onConfirm(values); 75 + console.log('当前操作类型:', operationType.value);
  76 + // 如果有传入的onConfirm函数,则执行它
  77 + if (typeof customOnConfirm.value === 'function') {
  78 + console.log('执行自定义确认函数');
  79 + await customOnConfirm.value(values);
66 } else { 80 } else {
67 - //提交表单 81 + // 否则执行默认的保存
  82 + console.log('执行默认保存');
68 await saveOrUpdate(values, isUpdate.value); 83 await saveOrUpdate(values, isUpdate.value);
69 } 84 }
70 //关闭弹窗 85 //关闭弹窗
1 import { defHttp } from '/@/utils/http/axios'; 1 import { defHttp } from '/@/utils/http/axios';
2 import { useMessage } from '/@/hooks/web/useMessage'; 2 import { useMessage } from '/@/hooks/web/useMessage';
3 -import { useUserStore } from '/@/store/modules/user'; // 引入用户store获取token  
4 3
5 const { createMessage } = useMessage(); 4 const { createMessage } = useMessage();
6 5
@@ -13,37 +13,37 @@ export const columns: BasicColumn[] = [ @@ -13,37 +13,37 @@ export const columns: BasicColumn[] = [
13 title: '文本内容', 13 title: '文本内容',
14 align: 'center', 14 align: 'center',
15 dataIndex: 'text', 15 dataIndex: 'text',
16 - width: 300 16 + width: 300,
17 }, 17 },
18 { 18 {
19 title: '文件名称', 19 title: '文件名称',
20 align: 'center', 20 align: 'center',
21 dataIndex: 'docName', 21 dataIndex: 'docName',
22 - width: 150 22 + width: 150,
23 }, 23 },
24 { 24 {
25 title: '知识ID', 25 title: '知识ID',
26 align: 'center', 26 align: 'center',
27 dataIndex: 'knowledgeId', 27 dataIndex: 'knowledgeId',
28 - width: 150 28 + width: 150,
29 }, 29 },
30 { 30 {
31 title: '文档ID', 31 title: '文档ID',
32 align: 'center', 32 align: 'center',
33 dataIndex: 'docId', 33 dataIndex: 'docId',
34 - width: 150 34 + width: 150,
35 }, 35 },
36 { 36 {
37 title: '索引', 37 title: '索引',
38 align: 'center', 38 align: 'center',
39 dataIndex: 'index', 39 dataIndex: 'index',
40 - width: 80 40 + width: 80,
41 }, 41 },
42 { 42 {
43 title: '相似度', 43 title: '相似度',
44 align: 'center', 44 align: 'center',
45 dataIndex: 'similarity', 45 dataIndex: 'similarity',
46 - width: 100 46 + width: 100,
47 }, 47 },
48 ]; 48 ];
49 49
@@ -50,7 +50,7 @@ @@ -50,7 +50,7 @@
50 </div> 50 </div>
51 <div class="preview-content"> 51 <div class="preview-content">
52 <div v-if="previewType === 'txt' || previewType === 'md'" class="text-preview"> 52 <div v-if="previewType === 'txt' || previewType === 'md'" class="text-preview">
53 - <pre style="white-space: pre-wrap;">{{ previewContent }}</pre> 53 + <pre>{{ previewContent }}</pre>
54 </div> 54 </div>
55 <div v-else-if="previewType === 'pdf'" class="pdf-preview" ref="pdfPreview"></div> 55 <div v-else-if="previewType === 'pdf'" class="pdf-preview" ref="pdfPreview"></div>
56 <div v-else-if="previewType === 'docx'" class="docx-preview" ref="docxPreview"></div> 56 <div v-else-if="previewType === 'docx'" class="docx-preview" ref="docxPreview"></div>