瀏覽代碼

no message

Ryuiso 4 月之前
父節點
當前提交
4307f04d33

+ 207 - 114
package-lock.json

@@ -10,7 +10,7 @@
       "license": "ISC",
       "dependencies": {
         "antd": "^5.23.0",
-        "axios": "^1.7.0",
+        "axios": "1.8.2",
         "dayjs": "^1.11.0",
         "mobx": "^6.13.0",
         "mobx-react": "^9.2.0",
@@ -25,7 +25,7 @@
         "@vitejs/plugin-react": "^4.3.0",
         "less": "^4.2.0",
         "typescript": "^5.7.0",
-        "vite": "6.1.0"
+        "vite": "6.3.4"
       }
     },
     "node_modules/@ampproject/remapping": {
@@ -411,13 +411,14 @@
       "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
     },
     "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
-      "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz",
+      "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==",
       "cpu": [
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "aix"
@@ -427,13 +428,14 @@
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
-      "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz",
+      "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -443,13 +445,14 @@
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
-      "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz",
+      "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -459,13 +462,14 @@
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
-      "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz",
+      "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "android"
@@ -475,13 +479,14 @@
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
-      "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz",
+      "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -491,13 +496,14 @@
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
-      "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz",
+      "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -507,13 +513,14 @@
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz",
+      "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
@@ -523,13 +530,14 @@
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
-      "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz",
+      "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "freebsd"
@@ -539,13 +547,14 @@
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
-      "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz",
+      "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==",
       "cpu": [
         "arm"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -555,13 +564,14 @@
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
-      "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz",
+      "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -571,13 +581,14 @@
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
-      "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz",
+      "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==",
       "cpu": [
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -587,13 +598,14 @@
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
-      "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz",
+      "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==",
       "cpu": [
         "loong64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -603,13 +615,14 @@
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
-      "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz",
+      "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==",
       "cpu": [
         "mips64el"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -619,13 +632,14 @@
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
-      "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz",
+      "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==",
       "cpu": [
         "ppc64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -635,13 +649,14 @@
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
-      "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz",
+      "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==",
       "cpu": [
         "riscv64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -651,13 +666,14 @@
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
-      "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz",
+      "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==",
       "cpu": [
         "s390x"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -667,13 +683,14 @@
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
-      "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz",
+      "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
@@ -683,13 +700,14 @@
       }
     },
     "node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz",
+      "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "netbsd"
@@ -699,13 +717,14 @@
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
-      "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz",
+      "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "netbsd"
@@ -715,13 +734,14 @@
       }
     },
     "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz",
+      "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "openbsd"
@@ -731,13 +751,14 @@
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
-      "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz",
+      "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "openbsd"
@@ -746,14 +767,32 @@
         "node": ">=18"
       }
     },
+    "node_modules/@esbuild/openharmony-arm64": {
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz",
+      "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
-      "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz",
+      "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "sunos"
@@ -763,13 +802,14 @@
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
-      "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz",
+      "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==",
       "cpu": [
         "arm64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -779,13 +819,14 @@
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
-      "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz",
+      "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==",
       "cpu": [
         "ia32"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -795,13 +836,14 @@
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
-      "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz",
+      "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==",
       "cpu": [
         "x64"
       ],
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "win32"
@@ -1458,9 +1500,10 @@
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "node_modules/axios": {
-      "version": "1.7.9",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz",
-      "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
+      "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
+      "license": "MIT",
       "dependencies": {
         "follow-redirects": "^1.15.6",
         "form-data": "^4.0.0",
@@ -1629,11 +1672,12 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.2.tgz",
-      "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
+      "version": "0.25.6",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz",
+      "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "bin": {
         "esbuild": "bin/esbuild"
       },
@@ -1641,31 +1685,32 @@
         "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.24.2",
-        "@esbuild/android-arm": "0.24.2",
-        "@esbuild/android-arm64": "0.24.2",
-        "@esbuild/android-x64": "0.24.2",
-        "@esbuild/darwin-arm64": "0.24.2",
-        "@esbuild/darwin-x64": "0.24.2",
-        "@esbuild/freebsd-arm64": "0.24.2",
-        "@esbuild/freebsd-x64": "0.24.2",
-        "@esbuild/linux-arm": "0.24.2",
-        "@esbuild/linux-arm64": "0.24.2",
-        "@esbuild/linux-ia32": "0.24.2",
-        "@esbuild/linux-loong64": "0.24.2",
-        "@esbuild/linux-mips64el": "0.24.2",
-        "@esbuild/linux-ppc64": "0.24.2",
-        "@esbuild/linux-riscv64": "0.24.2",
-        "@esbuild/linux-s390x": "0.24.2",
-        "@esbuild/linux-x64": "0.24.2",
-        "@esbuild/netbsd-arm64": "0.24.2",
-        "@esbuild/netbsd-x64": "0.24.2",
-        "@esbuild/openbsd-arm64": "0.24.2",
-        "@esbuild/openbsd-x64": "0.24.2",
-        "@esbuild/sunos-x64": "0.24.2",
-        "@esbuild/win32-arm64": "0.24.2",
-        "@esbuild/win32-ia32": "0.24.2",
-        "@esbuild/win32-x64": "0.24.2"
+        "@esbuild/aix-ppc64": "0.25.6",
+        "@esbuild/android-arm": "0.25.6",
+        "@esbuild/android-arm64": "0.25.6",
+        "@esbuild/android-x64": "0.25.6",
+        "@esbuild/darwin-arm64": "0.25.6",
+        "@esbuild/darwin-x64": "0.25.6",
+        "@esbuild/freebsd-arm64": "0.25.6",
+        "@esbuild/freebsd-x64": "0.25.6",
+        "@esbuild/linux-arm": "0.25.6",
+        "@esbuild/linux-arm64": "0.25.6",
+        "@esbuild/linux-ia32": "0.25.6",
+        "@esbuild/linux-loong64": "0.25.6",
+        "@esbuild/linux-mips64el": "0.25.6",
+        "@esbuild/linux-ppc64": "0.25.6",
+        "@esbuild/linux-riscv64": "0.25.6",
+        "@esbuild/linux-s390x": "0.25.6",
+        "@esbuild/linux-x64": "0.25.6",
+        "@esbuild/netbsd-arm64": "0.25.6",
+        "@esbuild/netbsd-x64": "0.25.6",
+        "@esbuild/openbsd-arm64": "0.25.6",
+        "@esbuild/openbsd-x64": "0.25.6",
+        "@esbuild/openharmony-arm64": "0.25.6",
+        "@esbuild/sunos-x64": "0.25.6",
+        "@esbuild/win32-arm64": "0.25.6",
+        "@esbuild/win32-ia32": "0.25.6",
+        "@esbuild/win32-x64": "0.25.6"
       }
     },
     "node_modules/escalade": {
@@ -1677,6 +1722,21 @@
         "node": ">=6"
       }
     },
+    "node_modules/fdir": {
+      "version": "6.4.6",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
+      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/follow-redirects": {
       "version": "1.15.9",
       "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
@@ -2040,6 +2100,19 @@
       "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
       "dev": true
     },
+    "node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
     "node_modules/pify": {
       "version": "4.0.1",
       "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
@@ -2897,6 +2970,23 @@
         "node": ">=12.22"
       }
     },
+    "node_modules/tinyglobby": {
+      "version": "0.2.14",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.4.4",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
     "node_modules/toggle-selection": {
       "version": "1.0.6",
       "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz",
@@ -2971,15 +3061,18 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmmirror.com/vite/-/vite-6.1.0.tgz",
-      "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==",
+      "version": "6.3.4",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz",
+      "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "esbuild": "^0.24.2",
-        "postcss": "^8.5.1",
-        "rollup": "^4.30.1"
+        "esbuild": "^0.25.0",
+        "fdir": "^6.4.4",
+        "picomatch": "^4.0.2",
+        "postcss": "^8.5.3",
+        "rollup": "^4.34.9",
+        "tinyglobby": "^0.2.13"
       },
       "bin": {
         "vite": "bin/vite.js"

+ 144 - 130
src/pages/layout/components/Nav.tsx

@@ -1,12 +1,12 @@
 import * as React from 'react';
 import { Layout, Menu, Button } from 'antd';
 import {
-    RobotOutlined,
-    ReadOutlined,
-    FileSearchOutlined,
-    MenuFoldOutlined,
-    MenuUnfoldOutlined,
-    StepForwardOutlined
+  RobotOutlined,
+  ReadOutlined,
+  FileSearchOutlined,
+  MenuFoldOutlined,
+  MenuUnfoldOutlined,
+  StepForwardOutlined
 } from '@ant-design/icons';
 import router from '@/router';
 import { JSX } from 'react/jsx-runtime';
@@ -15,135 +15,149 @@ import LocalStorage from '@/LocalStorage';
 const Sider = Layout.Sider;
 
 interface MenuItem {
-    key: string;
-    icon: JSX.Element;
-    label: string;
-    onClick: () => void;
+  key : string;
+  icon : JSX.Element;
+  label : string;
+  onClick : () => void;
 }
 
 interface Props {
-    selectedKey: string,
-    onChangeSelectedKey: (path: string, menuLevel: number) => void,
-    openKeys: string[],
-    onOpenChange: (openKeys: string[]) => void,
-    collapsed: boolean,
-    onClickCollapsed: () => void,
-    menuType: number; // 新增 prop
+  selectedKey : string,
+  onChangeSelectedKey : ( path : string, menuLevel : number ) => void,
+  openKeys : string[],
+  onOpenChange : ( openKeys : string[] ) => void,
+  collapsed : boolean,
+  onClickCollapsed : () => void,
+  menuType : number; // 新增 prop
 };
 
-const Nav: React.FC<Props> = (props: Props) => {
-
-    const {
-        selectedKey,
-        onChangeSelectedKey,
-        openKeys,
-        onOpenChange,
-        collapsed,
-        onClickCollapsed,
-        menuType
-    } = props;
-
-    const dsItems: MenuItem[] = [
-        {
-            key: '/deepseek/questionAnswer',
-            icon: <RobotOutlined />,
-            label: 'DeepSeek问答应用',
-            onClick: () => { router.navigate({ pathname: '/deepseek/questionAnswer' }) }
-        },
-        {
-            key: '/deepseek/knowledgeLib',
-            icon: <ReadOutlined />,
-            label: 'DeepSeek知识库',
-            onClick: () => { router.navigate({ pathname: '/deepseek/knowledgeLib' }) }
-        },
-        {
-            key: '/deepseek/dataExport',
-            icon: <FileSearchOutlined />,
-            label: 'DeepSeek数据导出',
-            onClick: () => { router.navigate({ pathname: '/deepseek/dataExport' }) }
-        },
-        {
-            key: '/deepseek/audit',
-            icon: <StepForwardOutlined />,
-            label: '应用审核',
-            onClick: () => { router.navigate({ pathname: '/deepseek/audit' }) }
-        },
-    ].filter(item => {
-        if (item.key === '/deepseek/questionAnswer') {
-            return LocalStorage.getStatusFlag('deepseek:application:list');
-        }
-        if (item.key === '/deepseek/knowledgeLib') {
-            return LocalStorage.getStatusFlag('deepseek:knowledge:list');
-        }
-        if (item.key === '/deepseek/dataExport') {
-            return LocalStorage.getStatusFlag('deepseek:dialog:list');
-        }
-        if (item.key === '/deepseek/audit') {
-            return LocalStorage.getStatusFlag('system:audit:list');
-        }
-        return true; // 其他菜单默认显示
-    });
-
-    const zpItems: MenuItem[] = [
-        {
-            key: '/questionAnswer',
-            icon: <RobotOutlined />,
-            label: '问答应用',
-            onClick: () => { router.navigate({ pathname: '/questionAnswer' }) }
-        },
-        {
-            key: '/knowledgeLib',
-            icon: <ReadOutlined />,
-            label: '知识库',
-            onClick: () => { router.navigate({ pathname: '/knowledgeLib' }) }
-        },
-        {
-            key: '/dataExport',
-            icon: <FileSearchOutlined />,
-            label: '数据导出',
-            onClick: () => { router.navigate({ pathname: '/dataExport' }) }
-        }
-    ];
-
-
-    const items = menuType === 1 ? dsItems : zpItems;
-
-    React.useEffect(() => {
-        // 当selectedKey变化时,确保路由同步
-        if (selectedKey && !window.location.pathname.startsWith(selectedKey)) {
-            router.navigate(selectedKey);
-        }
-    }, [selectedKey]);
-
-    return (
-        <Sider
-            className='nav'
-            collapsed={collapsed}
-        >
-            <div className='nav-menu'>
-                <Menu
-                    mode='inline'
-                    selectedKeys={[selectedKey]}
-                    onSelect={(item) => {
-                        const menuLevel = item.keyPath.length > 1 ? 2 : 1;
-                        onChangeSelectedKey(item.key, menuLevel);
-                    }}
-                    openKeys={openKeys}
-                    onOpenChange={(keys) => {
-                        // 点击菜单,收起其他展开的所有菜单
-                        const latestOpenKey = keys.find((key) => openKeys.indexOf(key) === -1);
-                        onOpenChange(latestOpenKey ? [latestOpenKey] : []);
-                    }}
-                    items={items}
-                />
-            </div>
-            <div className='nav-bottom'>
-                <Button type='primary' onClick={onClickCollapsed}>
-                    {collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
-                </Button>
-            </div>
-        </Sider>
-    );
+const Nav : React.FC<Props> = ( props : Props ) => {
+  
+  const {
+    selectedKey,
+    onChangeSelectedKey,
+    openKeys,
+    onOpenChange,
+    collapsed,
+    onClickCollapsed,
+    menuType
+  } = props;
+  
+  const dsItems : MenuItem[] = [
+    {
+      key: '/deepseek/questionAnswer',
+      icon: <RobotOutlined />,
+      label: 'DeepSeek问答应用',
+      onClick: () => {
+        router.navigate( { pathname: '/deepseek/questionAnswer' } )
+      }
+    },
+    {
+      key: '/deepseek/knowledgeLib',
+      icon: <ReadOutlined />,
+      label: 'DeepSeek知识库',
+      onClick: () => {
+        router.navigate( { pathname: '/deepseek/knowledgeLib' } )
+      }
+    },
+    {
+      key: '/deepseek/dataExport',
+      icon: <FileSearchOutlined />,
+      label: 'DeepSeek数据导出',
+      onClick: () => {
+        router.navigate( { pathname: '/deepseek/dataExport' } )
+      }
+    },
+    {
+      key: '/deepseek/audit',
+      icon: <StepForwardOutlined />,
+      label: '应用审核',
+      onClick: () => {
+        router.navigate( { pathname: '/deepseek/audit' } )
+      }
+    },
+  ].filter( item => {
+    if ( item.key === '/deepseek/questionAnswer' ) {
+      return LocalStorage.getStatusFlag( 'deepseek:application:list' );
+    }
+    if ( item.key === '/deepseek/knowledgeLib' ) {
+      return LocalStorage.getStatusFlag( 'deepseek:knowledge:list' );
+    }
+    if ( item.key === '/deepseek/dataExport' ) {
+      return LocalStorage.getStatusFlag( 'deepseek:dialog:list' );
+    }
+    if ( item.key === '/deepseek/audit' ) {
+      return LocalStorage.getStatusFlag( 'system:audit:list' );
+    }
+    return true; // 其他菜单默认显示
+  } );
+  
+  const zpItems : MenuItem[] = [
+    {
+      key: '/questionAnswer',
+      icon: <RobotOutlined />,
+      label: '问答应用',
+      onClick: () => {
+        router.navigate( { pathname: '/questionAnswer' } )
+      }
+    },
+    {
+      key: '/knowledgeLib',
+      icon: <ReadOutlined />,
+      label: '知识库',
+      onClick: () => {
+        router.navigate( { pathname: '/knowledgeLib' } )
+      }
+    },
+    {
+      key: '/dataExport',
+      icon: <FileSearchOutlined />,
+      label: '数据导出',
+      onClick: () => {
+        router.navigate( { pathname: '/dataExport' } )
+      }
+    }
+  ];
+  
+  
+  const items = menuType === 1 ? dsItems : zpItems;
+  
+  React.useEffect( () => {
+    // 当selectedKey变化时,确保路由同步
+    if ( selectedKey && !window.location.pathname.startsWith( selectedKey ) ) {
+      router.navigate( selectedKey );
+    }
+  }, [ selectedKey ] );
+  
+  return (
+      <Sider
+          className='nav'
+          collapsed={ collapsed }
+      >
+        <div className='nav-menu'>
+          <Menu
+              mode='inline'
+              selectedKeys={ [ selectedKey ] }
+              onSelect={ ( item ) => {
+                const menuLevel = item.keyPath.length > 1 ? 2 : 1;
+                onChangeSelectedKey( item.key, menuLevel );
+              } }
+              openKeys={ openKeys }
+              onOpenChange={ ( keys ) => {
+                // 点击菜单,收起其他展开的所有菜单
+                const latestOpenKey = keys.find( ( key ) => openKeys.indexOf( key ) === - 1 );
+                onOpenChange( latestOpenKey ? [ latestOpenKey ] : [] );
+              } }
+              items={ items }
+          />
+        </div>
+        <div className='nav-bottom'>
+          <Button type='primary' onClick={ onClickCollapsed }>
+            { collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined /> }
+          </Button>
+        </div>
+      </Sider>
+  );
 };
 
 export default Nav;

+ 29 - 20
src/pages/layout/index.tsx

@@ -1,7 +1,7 @@
 import * as React from 'react';
 import { useMatches, useLocation, Outlet, useNavigate } from 'react-router-dom';
 import { observer } from 'mobx-react';
-import { Layout } from 'antd';
+import { Layout, Divider } from 'antd';
 import Header from './components/Header';
 import Nav from './components/Nav';
 import Breadcrumb from './components/Breadcrumb';
@@ -30,10 +30,10 @@ const LayoutApp: React.FC = () => {
     selectedKey,
     openKeys,
   } = state;
-  
+
   const matches = useMatches();
   const location = useLocation();
-  
+
   React.useEffect(() => {
     const list = matches.filter((item: any) => item.handle?.menuLevel && item.handle?.breadcrumbName).map((item: any) => {
       return {
@@ -44,20 +44,20 @@ const LayoutApp: React.FC = () => {
     });
     init(list);
   }, [ matches ]);
-  
+
   const currentMenuType = LocalStorage.getMenuType();
   const [ entryModalOpen, setEntryModalOpen ] = React.useState(false);
-  
+
   React.useEffect(() => {
     if ( currentMenuType === 0 ) {
       setEntryModalOpen(true);
     }
     return () => reset();
   }, []);
-  
+
   // 统一管理菜单类型状态
   const [ menuType, setMenuType ] = React.useState(currentMenuType || (location.pathname.startsWith('/deepseek') ? 1 : 2));
-  
+
   // 处理菜单类型变化
   const handleSelectChange = (value: number) => {
     setMenuType(value);
@@ -67,21 +67,26 @@ const LayoutApp: React.FC = () => {
     // 同时更新selectedKey
     onChangeSelectedKey(defaultPath, 1);
   };
-  
+
   // 添加路由变化监听
   React.useEffect(() => {
     const path = location.pathname;
     const type = path.startsWith('/deepseek') ? 1 : 2;
     setMenuType(type);
-    
+
     // 确保selectedKey与当前路由同步
     if ( path !== selectedKey ) {
       onChangeSelectedKey(path, 1);
     }
   }, [ location.pathname ]);
-  
+
   return (
-      <Layout style={{height: '100vh'}}>
+      <Layout style={{
+        height: '100vh',
+        overflow: 'hidden',
+        display: 'flex',
+        flexDirection: 'column'
+      }}>
         <div>
           <Header
               userName={userName}
@@ -102,16 +107,20 @@ const LayoutApp: React.FC = () => {
           />
           <Layout style={{
             marginTop: '64px',
-            marginLeft: '200px',
-            width: 'calc(100% - 200px)'
+            marginLeft: collapsed ? '80px' : '200px',
+            width: collapsed ? 'calc(100% - 80px)' : 'calc(100% - 200px)',
+            backgroundColor: '#fff',
+            position: 'fixed',
+            transition: 'all 0.2s ease'
           }}>
-            {
-              location.pathname === '/404' ?
-                  <div style={{width: '100%', height: 20}}></div>
-                  :
-                  <Breadcrumb routerMatchList={routerMatchList} />
-            }
-            <Content className='content'>
+
+            <Content className='main-content'>
+              {
+                location.pathname === '/404' ?
+                    <div style={{width: '100%', height: 20}}></div>
+                    :
+                    <Breadcrumb routerMatchList={routerMatchList} />
+              }
               <Outlet></Outlet>
             </Content>
           </Layout>

+ 43 - 22
src/pages/layout/style.less

@@ -1,3 +1,8 @@
+//.ant-layout {
+//    background: #f5f7fa; // 统一的浅灰色背景
+//}
+
+
 .header {
     width: 100%;
     height: 64px;
@@ -7,7 +12,7 @@
     justify-content: space-between;
     align-items: center;
     border-bottom: 1px solid #f0f0f0;
-    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);
+    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
     position: fixed;
     top: 0;
     left: 0;
@@ -96,7 +101,7 @@
 .nav {
     width: 200px !important;
     height: calc(100vh - 64px) !important;
-    background: #FFFFFF !important;
+    background: #F9FAFB !important;
     border-right: 1px solid #f0f0f0;
     box-shadow: 1px 0 4px rgba(0, 0, 0, 0.05);
     position: fixed;
@@ -104,6 +109,17 @@
     left: 0;
     z-index: 999;
     
+    .ant-menu {
+        background-color: transparent !important;
+        &-item {
+            transition: font-weight 0.2s ease;
+            &-selected {
+                font-weight: 600;
+                color: @primary-color;
+            }
+        }
+    }
+    
     &-menu {
         width: 100%;
         height: calc(100vh - 100px);
@@ -120,27 +136,31 @@
     }
 }
 
-.breadcrumb {
-    width: 100%;
-    height: 48px;
-    padding: 18px 20px;
-    background: @background-color;
-    display: flex;
-    align-items: center;
-    position: fixed;
-    top: 64px;
-    left: 200px;
-    z-index: 900;
-    margin-left: 0;
-}
 
 
-.content {
-    min-height: calc(100vh - 48px);
-    //padding: 20px;
-    background: @background-color;
-    overflow-y: auto;
-    margin-top: 48px;
+.main-content {
+    height: calc(100vh - 48px);
+    overflow: auto;  // 添加滚动条height: ;
+    position: relative;
+    
+    .breadcrumb {
+        width: 100%;
+        height: 50px;
+        //line-height: 14px;
+        padding: 16px 20px;
+        align-items: center;
+        border-bottom: 1px solid #f0f0f0;
+        font-weight: 600;
+        .ant-breadcrumb-link {
+            a {
+                &:hover {
+                    color: @primary-color !important;
+                    font-weight: 600;
+                }
+            }
+        }
+        
+    }
 }
 
 .model-selector-modal {
@@ -246,4 +266,5 @@
         background: #722ed1;
         border-color: #722ed1;
     }
-}
+}
+

+ 69 - 37
src/pages/questionAnswer/list/index.tsx

@@ -1,6 +1,6 @@
 import * as React from 'react';
 import { observer } from 'mobx-react';
-import { List, Button, Divider, Flex, Layout, Empty, Image, Modal } from 'antd';
+import { List, Button, Card, Space, Typography, Divider, Flex, Layout, Empty, Image, Modal } from 'antd';
 import { PlusOutlined, FileOutlined, SettingOutlined, DeleteOutlined } from '@ant-design/icons';
 import { apis } from '@/apis';
 import './style.less';
@@ -163,29 +163,29 @@ const QuestionAnswerList : React.FC = () => {
           list.length
               ?
               <div className='questionAnswerList'>
-                <div style={ { overflow: 'auto' } }>
-                  <Flex gap="middle" wrap>
-                    <Layout style={ layoutStyle }>
-                      <Sider width="25%" style={ siderStyle }>
-                        <FileOutlined />
-                      </Sider>
-                      <Layout>
-                        <Header style={ headerStyle }>问答应用总数</Header>
-                        <Content style={ contentStyle }>{ appCount }个</Content>
-                      </Layout>
-                    </Layout>
-                    <Layout style={ layoutStyle }>
-                      <Sider width="25%" style={ siderStyle }>
-                        <FileOutlined />
-                      </Sider>
-                      <Layout>
-                        <Header style={ headerStyle }>知识库总数</Header>
-                        <Content style={ contentStyle }>{ knowCount } 个</Content>
-                      </Layout>
-                    </Layout>
-                  </Flex>
-                </div>
-                <div style={ { display: 'flex', justifyContent: 'space-between' } }>
+                {/*<div style={ { overflow: 'auto' } }>*/}
+                {/*  <Flex gap="middle" wrap>*/}
+                {/*    <Layout style={ layoutStyle }>*/}
+                {/*      <Sider width="25%" style={ siderStyle }>*/}
+                {/*        <FileOutlined />*/}
+                {/*      </Sider>*/}
+                {/*      <Layout>*/}
+                {/*        <Header style={ headerStyle }>问答应用总数</Header>*/}
+                {/*        <Content style={ contentStyle }>{ appCount }个</Content>*/}
+                {/*      </Layout>*/}
+                {/*    </Layout>*/}
+                {/*    <Layout style={ layoutStyle }>*/}
+                {/*      <Sider width="25%" style={ siderStyle }>*/}
+                {/*        <FileOutlined />*/}
+                {/*      </Sider>*/}
+                {/*      <Layout>*/}
+                {/*        <Header style={ headerStyle }>知识库总数</Header>*/}
+                {/*        <Content style={ contentStyle }>{ knowCount } 个</Content>*/}
+                {/*      </Layout>*/}
+                {/*    </Layout>*/}
+                {/*  </Flex>*/}
+                {/*</div>*/}
+                <div style={ { display: 'flex', justifyContent: 'space-between', padding: '16px 20px' } }>
                   <div>所有问答应用</div>
                   <Button type='primary'
                           icon={ <PlusOutlined /> }
@@ -194,15 +194,14 @@ const QuestionAnswerList : React.FC = () => {
                           } }>创建问答应用</Button>
                 </div>
                 <div className='applicationList'>
-                  <List style={ { height: 400 } }
-                        grid={ {
+                  <List grid={ {
                           gutter: 16,
                           xs: 1,
                           sm: 1,
                           md: 2,
                           lg: 2,
                           xl: 3,
-                          xxl: 3, // 展示的列数
+                          xxl: 4, // 展示的列数
                         } }
                         dataSource={ list }
                         renderItem={ ( item ) => (
@@ -217,25 +216,58 @@ const QuestionAnswerList : React.FC = () => {
                                   <div style={ { display: 'flex', alignItems: 'center', overflow: 'auto' } }>
                                     <div style={ { marginRight: 10, overflow: 'auto' } }>
                                       <Image
-                                          width={ 30 }
-                                          height={ 30 }
+                                          width={ 32 }
+                                          height={ 32 }
                                           src={ IconSvg }
                                       />
                                     </div>
-                                    <div style={ { overflow: 'auto' } }>
-                                      { item.name }
+                                    {/*<div style={ { overflow: 'auto' } }>*/ }
+                                    {/*  { item.name }*/ }
+                                    {/*</div>*/ }
+                                    
+                                    <div style={ {
+                                      display: 'flex',
+                                      flexDirection: 'column',
+                                      justifyContent: 'center',
+                                      height: '100%'
+                                    } }>
+                                      <div style={ {
+                                        lineHeight: '18px',
+                                        fontSize: 14,
+                                        fontWeight: 500,
+                                        overflow: 'auto'
+                                      } }>{ item.name }</div>
+                                      <Space size={ 4 } style={ { lineHeight: '18px' } }>
+                                        <span style={ {
+                                          color: '#999',
+                                          fontSize: 12,
+                                          margin: 0
+                                        } }>ID:{ item.appId }</span>
+                                        <Divider type="vertical" style={ { color: '999', margin: 0, height: 12 } } />
+                                        {/*<span style={ { color: '#999', fontSize: 12 } }>创建者  { item.createBy }</span>*/ }
+                                      </Space>
                                     </div>
                                   </div>
-                                  <div>{ item.createBy }</div>
+                                
                                 </div>
-                                <Divider plain></Divider>
+                                <Divider plain style={ { margin: '16px 0' } }></Divider>
+                                
                                 <div className='desc'>
                                   {
-                                    item.desc !== '' && item.desc.length > 35 ? item.desc.substring( 0, 35 ) + '......' : item.desc
+                                    item.desc !== '' && item.desc.length > 40 ? item.desc.substring( 0, 40 ) + '...' : item.desc
                                   }
                                 </div>
-                                <div style={ { display: 'flex', justifyContent: 'space-between', overflow: 'auto' } }>
-                                  <div style={ { overflow: 'auto' } }>
+                                
+                                <div style={ {
+                                  display: 'flex',
+                                  justifyContent: 'space-between',
+                                  // justifyContent: 'flex-end',
+                                  alignItems: 'flex-end',
+                                  height: '100%',
+                                  overflow: 'auto',
+                                  paddingTop: 16,} }>
+                                  <span style={ { color: '#999', fontSize: 12 } }>创建时间: {item.createTime}</span>
+                                  <Space size={ 16 } align="center">
                                     <a onClick={ () => {
                                       router.navigate( { pathname: '/questionAnswer/modify' }, { state: { id: item.appId } } );
                                     } }>
@@ -253,7 +285,7 @@ const QuestionAnswerList : React.FC = () => {
                                     } }>
                                       <DeleteOutlined /> 删除
                                     </a>
-                                  </div>
+                                  </Space>
                                 </div>
                               </div>
                             </List.Item>

+ 8 - 4
src/pages/questionAnswer/list/style.less

@@ -3,12 +3,12 @@
   height: 100%;
   background: #FFFFFF;
   border-radius: @border-radius-base;
+  padding: 16px 20px;
 }
 
 .applicationList {
   width: 100%;
-  height: 400px;
-  padding-top: 10px;
+  min-height: 640px;
 }
 
 .card{
@@ -24,11 +24,15 @@
 }
 
 .desc {
-  height: 35px;
+  height: 40px;
   overflow: auto;
+  font-weight: 300; /* 细体字 */
+  line-height: 20px;
+  transition: all 0.3s;
+  margin-bottom: 16px;
 }
 
 .info-head {
   width: 100%;
   height: 35%;
-}
+}

+ 275 - 237
src/pages/takai/questionAnswer/list/index.tsx

@@ -1,6 +1,21 @@
 import * as React from 'react';
 import { observer } from 'mobx-react';
-import { List, Button, Divider, Flex, Layout, Empty, Image, Modal, Tag, message, Tooltip, Select, Form } from 'antd';
+import {
+  List,
+  Button,
+  Divider,
+  Flex,
+  Layout,
+  Empty,
+  Image,
+  Modal,
+  Tag,
+  message,
+  Tooltip,
+  Select,
+  Form,
+  Space
+} from 'antd';
 import { PlusOutlined, FileOutlined, SettingOutlined, DeleteOutlined, StepForwardOutlined } from '@ant-design/icons';
 import { apis } from '@/apis';
 import './style.less';
@@ -10,12 +25,13 @@ import LocalStorage from '@/LocalStorage';
 import { create } from 'domain';
 import audit from '../../audit';
 import { set } from 'mobx';
+import IconSvg from "@/assets/public/icon.svg";
 
-const {Header, Footer, Sider, Content} = Layout;
-const {Option} = Select;
+const { Header, Footer, Sider, Content } = Layout;
+const { Option } = Select;
 const FormItem = Form.Item;
 
-const headerStyle: React.CSSProperties = {
+const headerStyle : React.CSSProperties = {
   textAlign: 'center',
   height: 24,
   paddingInline: 48,
@@ -23,20 +39,20 @@ const headerStyle: React.CSSProperties = {
   backgroundColor: '#fff',
 };
 
-const contentStyle: React.CSSProperties = {
+const contentStyle : React.CSSProperties = {
   textAlign: 'center',
   lineHeight: '40px',
   backgroundColor: '#fff',
 };
 
-const siderStyle: React.CSSProperties = {
+const siderStyle : React.CSSProperties = {
   paddingLeft: 30,
   paddingTop: 30,
   height: 80,
   backgroundColor: '#fff',
 };
 
-const footerStyle: React.CSSProperties = {
+const footerStyle : React.CSSProperties = {
   textAlign: 'center',
   color: '#fff',
   height: 24,
@@ -49,73 +65,73 @@ const layoutStyle = {
   width: 'calc(10% - 8px)',
   maxWidth: 'calc(20% - 8px)',
 };
-const QuestionAnswerList: React.FC = () => {
+const QuestionAnswerList : React.FC = () => {
   const [ form ] = Form.useForm();
   
   interface Item {
-    name: string,
-    desc: string,
-    appId: number,
-    createBy: string,
-    typeId: string;
-    status: string;
-    comment: string;
-    auditStatus: string;
-    projectName: string;
+    name : string,
+    desc : string,
+    appId : number,
+    createBy : string,
+    typeId : string;
+    status : string;
+    comment : string;
+    auditStatus : string;
+    projectName : string;
   };
   
   interface PageInfo {
-    pageNumber: number,
-    pageSize: number,
-    total: number,
+    pageNumber : number,
+    pageSize : number,
+    total : number,
   };
   
   type AppTypeList = {
-    label: string,
-    value: string,
+    label : string,
+    value : string,
   }[];
   
   type ProjectTypeList = {
-    label: string,
-    value: string,
+    label : string,
+    value : string,
   }[];
   
-  const [ listLoading, setListLoading ] = React.useState(false);
-  const [ list, setList ] = React.useState<Item[]>([]);
-  const [ page, setPage ] = React.useState<PageInfo>({
+  const [ listLoading, setListLoading ] = React.useState( false );
+  const [ list, setList ] = React.useState<Item[]>( [] );
+  const [ page, setPage ] = React.useState<PageInfo>( {
     pageNumber: 1,
     pageSize: 10,
     total: 0,
-  });
+  } );
   const [ appCount, setAppCount ] = React.useState<string>();
   const [ knowCount, setKnowCount ] = React.useState<string>();
-  const {Header, Footer, Sider, Content} = Layout;
-  const [ appTypeList, setAppTypeList ] = React.useState<AppTypeList>([]);
-  const [ createFlag, setCreateFlag ] = React.useState(false);
-  const [ deleteFlag, setDeleteFlag ] = React.useState(false);
-  const [ updateFlag, setUpdateFlag ] = React.useState(false);
-  const [ projectList, setProjectList ] = React.useState<ProjectTypeList>([]);
-  const [ appProjectList, setAppProjectList ] = React.useState<AppTypeList>([]);
-  const [ showSubPanel, setShowSubPanel ] = React.useState(false);
-  const [ selectedType, setSelectedType ] = React.useState<number | null>(null);
-  const wrapperRef = React.useRef<HTMLDivElement>(null);
-  const selectRef = React.useRef<any>(null);
-  const [ levelTypeList, setLevelTypeList ] = React.useState<AppTypeList>([]);
+  const { Header, Footer, Sider, Content } = Layout;
+  const [ appTypeList, setAppTypeList ] = React.useState<AppTypeList>( [] );
+  const [ createFlag, setCreateFlag ] = React.useState( false );
+  const [ deleteFlag, setDeleteFlag ] = React.useState( false );
+  const [ updateFlag, setUpdateFlag ] = React.useState( false );
+  const [ projectList, setProjectList ] = React.useState<ProjectTypeList>( [] );
+  const [ appProjectList, setAppProjectList ] = React.useState<AppTypeList>( [] );
+  const [ showSubPanel, setShowSubPanel ] = React.useState( false );
+  const [ selectedType, setSelectedType ] = React.useState<number | null>( null );
+  const wrapperRef = React.useRef<HTMLDivElement>( null );
+  const selectRef = React.useRef<any>( null );
+  const [ levelTypeList, setLevelTypeList ] = React.useState<AppTypeList>( [] );
   
   const appApi = {
-    fetchList: async (typeId: any, projectId: any) => {
-      setListLoading(true);
+    fetchList: async ( typeId : any, projectId : any ) => {
+      setListLoading( true );
       try {
         const userInfo = LocalStorage.getUserInfo();
-        const userId = (userInfo?.id ?? '').toString();
-        const res = await apis.fetchTakaiAppList({
+        const userId = ( userInfo?.id ?? '' ).toString();
+        const res = await apis.fetchTakaiAppList( {
           pageSize: page.pageSize,
           pageNumber: page.pageNumber,
           userId: userId,
           typeId: typeId,
           projectId: projectId,
-        })
-        const list = res.rows.map((item: any) => {
+        } )
+        const list = res.rows.map( ( item : any ) => {
           return {
             name: item.name,
             desc: item.desc,
@@ -127,67 +143,67 @@ const QuestionAnswerList: React.FC = () => {
             auditStatus: item.auditStatus,
             projectName: item.projectName
           }
-        });
-        const c = LocalStorage.getStatusFlag('deepseek:application:create');
-        const u = LocalStorage.getStatusFlag('deepseek:application:delete');
-        const filteredList = list.filter((item: any) => {
+        } );
+        const c = LocalStorage.getStatusFlag( 'deepseek:application:create' );
+        const u = LocalStorage.getStatusFlag( 'deepseek:application:delete' );
+        const filteredList = list.filter( ( item : any ) => {
           // 如果有 createFlag 或 updateFlag 权限,显示所有数据
           if ( c || u ) {
             return true;
           }
           // 没有权限时排除 status='5' 的数据
           return item.status !== '5';
-        });
-        setList(filteredList);
-        setPage({
+        } );
+        setList( filteredList );
+        setPage( {
           pageNumber: page.pageNumber,
           pageSize: page.pageSize,
           total: res.total,
-        });
+        } );
       } catch ( error ) {
-        console.error(error);
+        console.error( error );
       } finally {
-        setListLoading(false);
+        setListLoading( false );
       }
     },
     
-    auditApplication: async (appId: string, userId: string) => {
-      const res = await apis.auditTakaiApplicationLibApi(appId, userId);
+    auditApplication: async ( appId : string, userId : string ) => {
+      const res = await apis.auditTakaiApplicationLibApi( appId, userId );
       if ( res.data === 9 ) {
-        message.error('您没有添加审核人');
+        message.error( '您没有添加审核人' );
       }
-      await appApi.fetchList(null, null);
+      await appApi.fetchList( null, null );
     }
   };
   
   // 删除应用
-  const delApplication = async (appId: string) => {
+  const delApplication = async ( appId : string ) => {
     try {
-      await apis.deleteTakaiApplicationApi(appId);
-      await appApi.fetchList(null, null);
+      await apis.deleteTakaiApplicationApi( appId );
+      await appApi.fetchList( null, null );
     } catch ( error ) {
-      console.error(error);
+      console.error( error );
     }
   }
   
   const indexApi = {
-    fetchIndex: async (typeId: any, projectId: any) => {
+    fetchIndex: async ( typeId : any, projectId : any ) => {
       try {
         const userInfo = LocalStorage.getUserInfo();
-        const userId = (userInfo?.id ?? '').toString();
-        const res = await apis.fetchTakaiIndexCount({
+        const userId = ( userInfo?.id ?? '' ).toString();
+        const res = await apis.fetchTakaiIndexCount( {
           pageSize: page.pageSize,
           pageNumber: page.pageNumber,
           userId: userId,
           typeId: typeId,
           projectId: projectId,
-        })
-        setAppCount(res.data.applicationCount);
-        setKnowCount(res.data.knowledgeCount);
+        } )
+        setAppCount( res.data.applicationCount );
+        setKnowCount( res.data.knowledgeCount );
       } catch ( error ) {
-        console.error(error);
+        console.error( error );
       } finally {
-        setListLoading(false);
+        setListLoading( false );
       }
     }
   };
@@ -196,16 +212,16 @@ const QuestionAnswerList: React.FC = () => {
   const appTypeApi = {
     fetchAppType: async () => {
       try {
-        const res = await apis.fetchTakaiAppTypeList('app_type');
-        const list = res.data.map((item: any) => {
+        const res = await apis.fetchTakaiAppTypeList( 'app_type' );
+        const list = res.data.map( ( item : any ) => {
           return {
             label: item.dictLabel,
             value: item.dictCode,
           }
-        });
-        setAppTypeList(list);
-      } catch ( error: any ) {
-        console.error(error);
+        } );
+        setAppTypeList( list );
+      } catch ( error : any ) {
+        console.error( error );
       }
     },
   };
@@ -214,16 +230,16 @@ const QuestionAnswerList: React.FC = () => {
   const appProTypeApi = {
     fetchAppProType: async () => {
       try {
-        const res = await apis.fetchTakaiAppTypeList('project_type');
-        const list = res.data.map((item: any) => {
+        const res = await apis.fetchTakaiAppTypeList( 'project_type' );
+        const list = res.data.map( ( item : any ) => {
           return {
             label: item.dictLabel,
             value: item.dictCode,
           }
-        });
-        setAppProjectList(list);
-      } catch ( error: any ) {
-        console.error(error);
+        } );
+        setAppProjectList( list );
+      } catch ( error : any ) {
+        console.error( error );
       }
     },
   };
@@ -232,15 +248,15 @@ const QuestionAnswerList: React.FC = () => {
     fetchProject: async () => {
       try {
         const res = await apis.fetchTakaiProjectLibApi();
-        const list = res.data.map((item: any) => {
+        const list = res.data.map( ( item : any ) => {
           return {
             label: item.projectName,
             value: item.projectId,
           }
-        });
-        setProjectList(list);
-      } catch ( error: any ) {
-        console.error(error);
+        } );
+        setProjectList( list );
+      } catch ( error : any ) {
+        console.error( error );
       }
     },
   };
@@ -249,40 +265,40 @@ const QuestionAnswerList: React.FC = () => {
   const levelTypeApi = {
     fetchLevelAppType: async () => {
       try {
-        const res = await apis.fetchTakaiAppTypeList('project_type');
-        const list = res.data.map((item: any) => {
+        const res = await apis.fetchTakaiAppTypeList( 'project_type' );
+        const list = res.data.map( ( item : any ) => {
           return {
             label: item.dictLabel,
             value: item.dictCode,
           }
-        });
-        setLevelTypeList(list);
-      } catch ( error: any ) {
-        console.error(error);
+        } );
+        setLevelTypeList( list );
+      } catch ( error : any ) {
+        console.error( error );
       }
     },
   };
   
   const init = async () => {
-    await appApi.fetchList(null, null);
-    await indexApi.fetchIndex(null, null);
+    await appApi.fetchList( null, null );
+    await indexApi.fetchIndex( null, null );
     await appTypeApi.fetchAppType();
     await projectApi.fetchProject();
     await appProTypeApi.fetchAppProType();
     await levelTypeApi.fetchLevelAppType();
   }
   
-  React.useEffect(() => {
-    setCreateFlag(LocalStorage.getStatusFlag('deepseek:application:create'));
-    setDeleteFlag(LocalStorage.getStatusFlag('deepseek:application:delete'));
-    setUpdateFlag(LocalStorage.getStatusFlag('deepseek:application:update'));
+  React.useEffect( () => {
+    setCreateFlag( LocalStorage.getStatusFlag( 'deepseek:application:create' ) );
+    setDeleteFlag( LocalStorage.getStatusFlag( 'deepseek:application:delete' ) );
+    setUpdateFlag( LocalStorage.getStatusFlag( 'deepseek:application:update' ) );
     init();
-  }, [ page.pageSize, page.pageNumber ])
+  }, [ page.pageSize, page.pageNumber ] )
   
-  const paginationConfig: PaginationConfig = {
+  const paginationConfig : PaginationConfig = {
     // 显示数据总量
-    showTotal: (total: number) => {
-      return `共 ${total} 条`;
+    showTotal: ( total : number ) => {
+      return `共 ${ total } 条`;
     },
     // 展示分页条数切换
     showSizeChanger: true,
@@ -293,99 +309,99 @@ const QuestionAnswerList: React.FC = () => {
     current: page.pageNumber,
     pageSize: page.pageSize,
     total: page.total,
-    onChange: (pageNumber, pageSize) => {
-      setPage({
+    onChange: ( pageNumber, pageSize ) => {
+      setPage( {
         pageNumber: pageNumber,
         pageSize: pageSize,
         total: page.total,
-      });
+      } );
     },
   };
   
   // 点击查询
   const handleClickSearch = async () => {
-    form.validateFields().then(async (values) => {
+    form.validateFields().then( async ( values ) => {
       if ( values.proTypeId ) {
         values.typeId = values.proTypeId;
       }
-      await indexApi.fetchIndex(values.typeId, values.projectId);
-      await appApi.fetchList(values.typeId, values.projectId);
-    }).catch((error) => {
-      console.error(error);
-    });
+      await indexApi.fetchIndex( values.typeId, values.projectId );
+      await appApi.fetchList( values.typeId, values.projectId );
+    } ).catch( ( error ) => {
+      console.error( error );
+    } );
   };
   
   // 点击重置
   const handleClickReset = async () => {
     form.resetFields();
-    setShowSubPanel(false);
+    setShowSubPanel( false );
     page.pageNumber = 1;
     page.pageSize = 10;
-    await appApi.fetchList(null, null);
-    await indexApi.fetchIndex(null, null);
+    await appApi.fetchList( null, null );
+    await indexApi.fetchIndex( null, null );
   };
   
   /** 点击外部关闭面板 */
-  React.useEffect(() => {
-    const handleClickOutside = (event: MouseEvent) => {
-      if ( wrapperRef.current && !wrapperRef.current.contains(event.target as Node) ) {
-        setShowSubPanel(false);
+  React.useEffect( () => {
+    const handleClickOutside = ( event : MouseEvent ) => {
+      if ( wrapperRef.current && !wrapperRef.current.contains( event.target as Node ) ) {
+        setShowSubPanel( false );
       }
     };
     
-    document.addEventListener('mousedown', handleClickOutside, true);
+    document.addEventListener( 'mousedown', handleClickOutside, true );
     return () => {
-      document.removeEventListener('mousedown', handleClickOutside, true);
+      document.removeEventListener( 'mousedown', handleClickOutside, true );
     };
-  }, []);
+  }, [] );
   
   
-  const handleAppTypeChange = (value: number) => {
-    console.log(value, 'sssss');
+  const handleAppTypeChange = ( value : number ) => {
+    console.log( value, 'sssss' );
     if ( value === 41 ) {
       // 如果是项目级应用,切换面板状态
       // setShowSubPanel(prev => !prev);
-      setShowSubPanel(true);
+      setShowSubPanel( true );
     } else {
       // 其他选项,隐藏面板
-      setShowSubPanel(false);
+      setShowSubPanel( false );
     }
-    setSelectedType(value);
-    form.setFieldsValue({typeId: value});
+    setSelectedType( value );
+    form.setFieldsValue( { typeId: value } );
   };
   
-  const handleAppProTypeChange = (value: number) => {
-    console.log(value, 'valuevalue');
+  const handleAppProTypeChange = ( value : number ) => {
+    console.log( value, 'valuevalue' );
     
-    setSelectedType(value);
-    form.setFieldsValue({typeId: value});
+    setSelectedType( value );
+    form.setFieldsValue( { typeId: value } );
   };
   
   return (
       <div>
         <div>
-          <Form form={form} layout='inline' colon={false}>
-            <div style={{display: 'flex', alignItems: 'center', position: 'relative'}}>
-              {/* 主选择器 */}
-              <FormItem label="应用类型" name="typeId" style={{marginBottom: 0}}>
+          <Form form={ form } layout='inline' colon={ false }>
+            <div style={ { display: 'flex', alignItems: 'center', position: 'relative' } }>
+              {/* 主选择器 */ }
+              <FormItem label="应用类型" name="typeId" style={ { marginBottom: 0 } }>
                 <Select
-                    ref={selectRef}
-                    style={{width: 200}}
+                    ref={ selectRef }
+                    style={ { width: 200 } }
                     placeholder="请选择应用类型"
-                    onChange={handleAppTypeChange}
-                    value={selectedType}
+                    onChange={ handleAppTypeChange }
+                    value={ selectedType }
                     allowClear
                 >
-                  {appTypeList.map(item => (
-                      <Option key={item.value} value={item.value}>
-                        {item.label}
+                  { appTypeList.map( item => (
+                      <Option key={ item.value } value={ item.value }>
+                        { item.label }
                       </Option>
-                  ))}
+                  ) ) }
                 </Select>
               </FormItem>
               
-              {/* 子选项面板 */}
-              {showSubPanel && selectedType === 41 && (
+              {/* 子选项面板 */ }
+              { showSubPanel && selectedType === 41 && (
                   // <div
                   //     style={{
                   //         position: 'absolute',
@@ -404,26 +420,26 @@ const QuestionAnswerList: React.FC = () => {
                   <FormItem
                       label='类型'
                       name='proTypeId'
-                      rules={[ {required: true, message: '类型不能为空'} ]}
+                      rules={ [ { required: true, message: '类型不能为空' } ] }
                   >
                     <Select
                         placeholder='请选择'
                         allowClear
-                        style={{width: 200}}
+                        style={ { width: 200 } }
                         // onChange={handleAppProTypeChange}
                     >
                       {
-                        appProjectList.map((item, index) => {
-                          return <Option value={item.value} key={index}>
-                            {item.label}
+                        appProjectList.map( ( item, index ) => {
+                          return <Option value={ item.value } key={ index }>
+                            { item.label }
                           </Option>
-                        })
+                        } )
                       }
                     </Select>
                   </FormItem>
                   
                   // </div>
-              )}
+              ) }
             </div>
             
             {/* {
@@ -432,23 +448,23 @@ const QuestionAnswerList: React.FC = () => {
                                     {subItem.label}
                                 </div>
                             ))
-                        } */}
+                        } */ }
             
             <FormItem
                 label='项目'
                 name='projectId'
             >
               <Select
-                  style={{width: '200px'}}
+                  style={ { width: '200px' } }
                   placeholder='请选择项目'
                   allowClear
               >
                 {
-                  projectList.map((item, index) => {
-                    return <Option value={item.value} key={index}>
-                      {item.label}
+                  projectList.map( ( item, index ) => {
+                    return <Option value={ item.value } key={ index }>
+                      { item.label }
                     </Option>
-                  })
+                  } )
                 }
               </Select>
             </FormItem>
@@ -456,13 +472,13 @@ const QuestionAnswerList: React.FC = () => {
             
             <FormItem>
               <Button
-                  style={{marginRight: 16}}
+                  style={ { marginRight: 16 } }
                   type='primary'
-                  onClick={handleClickSearch}
+                  onClick={ handleClickSearch }
               >
                 查询
               </Button>
-              <Button onClick={handleClickReset}>
+              <Button onClick={ handleClickReset }>
                 重置
               </Button>
             </FormItem>
@@ -472,134 +488,156 @@ const QuestionAnswerList: React.FC = () => {
           list.length
               ?
               <div className='questionAnswerList'>
-                <div style={{overflow: 'auto'}}>
+                <div style={ { overflow: 'auto' } }>
                   <Flex gap="middle" wrap>
-                    <Layout style={layoutStyle}>
-                      <Sider width="25%" style={siderStyle}>
+                    <Layout style={ layoutStyle }>
+                      <Sider width="25%" style={ siderStyle }>
                         <FileOutlined />
                       </Sider>
                       <Layout>
-                        <Header style={headerStyle}>问答应用总数</Header>
-                        <Content style={contentStyle}>{appCount}个</Content>
+                        <Header style={ headerStyle }>问答应用总数</Header>
+                        <Content style={ contentStyle }>{ appCount }个</Content>
                       </Layout>
                     </Layout>
-                    <Layout style={layoutStyle}>
-                      <Sider width="25%" style={siderStyle}>
+                    <Layout style={ layoutStyle }>
+                      <Sider width="25%" style={ siderStyle }>
                         <FileOutlined />
                       </Sider>
                       <Layout>
-                        <Header style={headerStyle}>知识库总数</Header>
-                        <Content style={contentStyle}>{knowCount} 个</Content>
+                        <Header style={ headerStyle }>知识库总数</Header>
+                        <Content style={ contentStyle }>{ knowCount } 个</Content>
                       </Layout>
                     </Layout>
                   </Flex>
                 </div>
-                <div style={{display: 'flex', justifyContent: 'space-between'}}>
+                <div style={ { display: 'flex', justifyContent: 'space-between', padding: '16px 20px' } }>
                   <div>所有问答应用</div>
                   {
                       createFlag &&
                       <Button type='primary'
-                              icon={<PlusOutlined />}
-                              onClick={() => {
-                                router.navigate({pathname: '/deepseek/questionAnswer/create'});
-                              }}>创建问答应用</Button>
+                              icon={ <PlusOutlined /> }
+                              onClick={ () => {
+                                router.navigate( { pathname: '/deepseek/questionAnswer/create' } );
+                              } }>创建问答应用</Button>
                   }
                 </div>
                 <div className='applicationList'>
-                  <List style={{height: 400}}
-                        grid={{
-                          gutter: 16,
-                          xs: 1,
-                          sm: 2,
-                          md: 4,
-                          lg: 4,
-                          xl: 6,
-                          xxl: 2, // 展示的列数
-                        }}
-                        dataSource={list}
-                        renderItem={(item) => (
+                  <List grid={ {
+                    gutter: 16,
+                    xs: 1,
+                    sm: 1,
+                    md: 2,
+                    lg: 2,
+                    xl: 3,
+                    xxl: 4, // 展示的列数
+                  } }
+                        dataSource={ list }
+                        renderItem={ ( item ) => (
                             <List.Item>
                               <div className='card'>
-                                <div style={{
+                                <div style={ {
                                   display: 'flex',
                                   justifyContent: 'space-between',
                                   alignItems: 'center',
                                   overflow: 'auto'
-                                }}>
-                                  <div style={{display: 'flex', alignItems: 'center', overflow: 'auto'}}>
-                                    <div style={{marginRight: 10, overflow: 'auto'}}>
+                                } }>
+                                  <div style={ { display: 'flex', alignItems: 'center', overflow: 'auto' } }>
+                                    <div style={ { marginRight: 10, overflow: 'auto' } }>
                                       <Image
-                                          width={30}
-                                          height={30}
-                                          src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
+                                          width={ 32 }
+                                          height={ 32 }
+                                          src={ IconSvg }
                                       />
                                     </div>
-                                    <div style={{overflow: 'auto'}}>
-                                      {item.name}
+                                    {/*<div style={ { overflow: 'auto' } }>*/}
+                                    {/*  { item.name }*/}
+                                    {/*</div>*/}
+                                    
+                                    <div style={ {
+                                      display: 'flex',
+                                      flexDirection: 'column',
+                                      justifyContent: 'center',
+                                      height: '100%'
+                                    } }>
+                                      <div style={ {
+                                        lineHeight: '18px',
+                                        fontSize: 14,
+                                        fontWeight: 500,
+                                        overflow: 'auto'
+                                      } }>{ item.name }</div>
+                                      <Space size={ 4 } style={ { lineHeight: '18px' } }>
+                                        <span style={ {
+                                          color: '#999',
+                                          fontSize: 12,
+                                          margin: 0
+                                        } }>ID:{ item.appId }</span>
+                                        <Divider type="vertical" style={ { color: '999', margin: 0, height: 12 } } />
+                                        {/*<span style={ { color: '#999', fontSize: 12 } }>创建者  { item.createBy }</span>*/ }
+                                      </Space>
                                     </div>
+                                    
                                   </div>
                                   <div>
                                     <>
-                                      {item.projectName}
+                                      { item.projectName }
                                       {
-                                          (item.status !== null && item.status !== '3') &&
-                                          < Tag style={{
+                                          ( item.status !== null && item.status !== '3' ) &&
+                                          < Tag style={ {
                                             marginLeft: 16,
                                             width: 65,
                                             color: '#fff',
                                             height: 25,
                                             backgroundColor: item.status === '1' ? '#D26900' : item.status === '2' ? '#408080' : item.auditStatus === '4' ? '#CE0000' : item.status === '5' ? '#5151A2' : ''
-                                          }}>
-                                            {item.status === '1' ? '待审核' : item.status === '2' ? '审核中' : item.auditStatus === '4' ? '审核拒绝' : item.status === '5' ? '待提交' : '未知'}
+                                          } }>
+                                            { item.status === '1' ? '待审核' : item.status === '2' ? '审核中' : item.auditStatus === '4' ? '审核拒绝' : item.status === '5' ? '待提交' : '未知' }
                                           </Tag>
                                       }
                                       
                                       {
-                                          (item.auditStatus === '4') &&
-                                          <Tooltip title={item.comment}>
+                                          ( item.auditStatus === '4' ) &&
+                                          <Tooltip title={ item.comment }>
                                             {
                                               item.comment !== '' && item.comment !== null && item.comment.length > 10 ?
-                                                  item.comment.substring(0, 10) + '......' :
+                                                  item.comment.substring( 0, 10 ) + '......' :
                                                   item.comment
                                             }
                                           </Tooltip>
                                       }
-                                    
                                     </>
                                   </div>
                                 </div>
                                 <Divider plain></Divider>
                                 <div className='desc'>
                                   {
-                                    item.desc !== '' && item.desc !== null && item.desc.length > 35 ? item.desc.substring(0, 35) + '......' : item.desc
+                                    item.desc !== '' && item.desc !== null && item.desc.length > 35 ? item.desc.substring( 0, 35 ) + '......' : item.desc
                                   }
                                 </div>
-                                <div style={{display: 'flex', justifyContent: 'space-between', overflow: 'auto'}}>
-                                  <div style={{overflow: 'auto'}}>
+                                <div style={ { display: 'flex', justifyContent: 'space-between', overflow: 'auto' } }>
+                                  <div style={ { overflow: 'auto' } }>
                                     {
-                                        (item.status === '5' || item.status === '4' || item.status === '3' || item.status === '' || item.status === null) &&
+                                        ( item.status === '5' || item.status === '4' || item.status === '3' || item.status === '' || item.status === null ) &&
                                         <>
                                           {
                                               updateFlag &&
-                                              <a style={{marginRight: 16}} onClick={() => {
-                                                router.navigate({pathname: '/deepseek/questionAnswer/modify'}, {state: {id: item.appId}});
-                                              }}>
+                                              <a style={ { marginRight: 16 } } onClick={ () => {
+                                                router.navigate( { pathname: '/deepseek/questionAnswer/modify' }, { state: { id: item.appId } } );
+                                              } }>
                                                 <SettingOutlined /> 编辑
                                               </a>
                                           }
                                           
                                           {
                                               deleteFlag &&
-                                              <a className='text-error' onClick={() => {
-                                                Modal.confirm({
+                                              <a className='text-error' onClick={ () => {
+                                                Modal.confirm( {
                                                   title: '删除',
                                                   content: `确定删除应用名称: ` + item.name + ` 吗?`,
                                                   okType: 'danger',
                                                   onOk: async () => {
-                                                    await delApplication(item.appId.toString());
+                                                    await delApplication( item.appId.toString() );
                                                   }
-                                                });
-                                              }}>
+                                                } );
+                                              } }>
                                                 <DeleteOutlined /> 删除
                                               </a>
                                           }
@@ -609,18 +647,18 @@ const QuestionAnswerList: React.FC = () => {
                                     
                                     {
                                         createFlag && item.status === '5' &&
-                                        <a style={{marginLeft: 16}} onClick={() => {
-                                          Modal.confirm({
+                                        <a style={ { marginLeft: 16 } } onClick={ () => {
+                                          Modal.confirm( {
                                             title: '提交审核',
                                             content: `确认提交审核应用名称: ` + item.name + `吗?`,
                                             okType: 'danger',
                                             onOk: async () => {
                                               const userInfo = LocalStorage.getUserInfo();
-                                              const userId = (userInfo?.id ?? '').toString();
-                                              appApi.auditApplication(item.appId.toString(), userId);
+                                              const userId = ( userInfo?.id ?? '' ).toString();
+                                              appApi.auditApplication( item.appId.toString(), userId );
                                             }
-                                          });
-                                        }}>
+                                          } );
+                                        } }>
                                           <StepForwardOutlined /> 提交审核
                                         </a>
                                     }
@@ -628,25 +666,25 @@ const QuestionAnswerList: React.FC = () => {
                                   
                                   <div>
                                     <Tag
-                                        style={{
+                                        style={ {
                                           padding: '4px 8px',
                                           fontSize: 14,
                                           fontWeight: 'bold',
                                           background: '#f0f0f0',
                                           border: '1px solid #d9d9d9'
-                                        }}
+                                        } }
                                     >
                                       {
                                           appTypeList
-                                              .find(item1 => item1.value.toString() === item.typeId)?.label || levelTypeList.find(item2 => item2.value.toString() === item.typeId)?.label || '未分类'
+                                              .find( item1 => item1.value.toString() === item.typeId )?.label || levelTypeList.find( item2 => item2.value.toString() === item.typeId )?.label || '未分类'
                                       }
                                     </Tag>
                                   </div>
                                 </div>
                               </div>
                             </List.Item>
-                        )}
-                        pagination={paginationConfig} // 分页
+                        ) }
+                        pagination={ paginationConfig } // 分页
                   />
                 </div>
               </div>
@@ -655,16 +693,16 @@ const QuestionAnswerList: React.FC = () => {
                 {
                     createFlag &&
                     <Button type='primary'
-                            icon={<PlusOutlined />}
-                            onClick={() => {
-                              router.navigate({pathname: '/deepseek/questionAnswer/create'});
-                            }}>创建问答应用</Button>
+                            icon={ <PlusOutlined /> }
+                            onClick={ () => {
+                              router.navigate( { pathname: '/deepseek/questionAnswer/create' } );
+                            } }>创建问答应用</Button>
                 }
-                <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
+                <Empty image={ Empty.PRESENTED_IMAGE_SIMPLE } />
               </div>
         }
       </div>
   )
 };
 
-export default observer(QuestionAnswerList);
+export default observer( QuestionAnswerList );

+ 13 - 7
src/pages/takai/questionAnswer/list/style.less

@@ -3,28 +3,34 @@
   height: 100%;
   background: #FFFFFF;
   border-radius: @border-radius-base;
+  padding: 16px 20px;
 }
 
 .applicationList {
   width: 100%;
-  height: 400px;
-  padding-top: 10px;
+  height: 640px;
+  //padding-top: 10px;
 }
 
 .card{
-  padding: 20px;
+  padding: 16px;
   border: 1px solid @border-color;
-  border-radius: @border-radius-base;
-  height: 200px;
+  border-radius: @border-radius-large;
+  min-height: 200px;
   overflow: auto;
 }
 .card:hover{
-  border-color:@primary-color ;
+  box-shadow: 0 0 8px rgba(0,0,0,.1);
+  border: 1px solid @primary-color ;
 }
 
 .desc {
-  height: 35px;
+  height: 40px;
   overflow: auto;
+  font-weight: 300; /* 细体字 */
+  line-height: 20px;
+  transition: all 0.3s;
+  margin-bottom: 16px;
 }
 
 .info-head {