Kaynağa Gözat

feat: 考试编辑UI

zhangjie 4 gün önce
ebeveyn
işleme
ea237fae6d

+ 1 - 0
components.d.ts

@@ -55,6 +55,7 @@ declare module '@vue/runtime-core' {
     FileUpload: typeof import('./src/components/file-upload/index.vue')['default'];
     Footer: typeof import('./src/components/footer/index.vue')['default'];
     ImportDialog: typeof import('./src/components/import-dialog/index.vue')['default'];
+    PageBreadcrumb: typeof import('./src/components/page-breadcrumb/index.vue')['default'];
     RouterLink: typeof import('vue-router')['RouterLink'];
     RouterView: typeof import('vue-router')['RouterView'];
     SelectCourse: typeof import('./src/components/select-course/index.vue')['default'];

+ 1 - 1
package.json

@@ -80,7 +80,7 @@
     "unplugin-auto-import": "^19.3.0",
     "unplugin-element-plus": "^0.10.0",
     "unplugin-vue-components": "^0.24.1",
-    "vite": "^3.2.5",
+    "vite": "^4.5.14",
     "vite-plugin-compression": "^0.5.1",
     "vite-plugin-eslint": "^1.8.1",
     "vite-plugin-imagemin": "^0.6.1",

+ 273 - 241
pnpm-lock.yaml

@@ -52,7 +52,7 @@ specifiers:
   unplugin-auto-import: ^19.3.0
   unplugin-element-plus: ^0.10.0
   unplugin-vue-components: ^0.24.1
-  vite: ^3.2.5
+  vite: ^4.5.14
   vite-plugin-compression: ^0.5.1
   vite-plugin-eslint: ^1.8.1
   vite-plugin-imagemin: ^0.6.1
@@ -94,7 +94,7 @@ devDependencies:
   '@types/vue-ls': 3.2.7
   '@typescript-eslint/eslint-plugin': 5.62.0_xjofbppfavgzddet3eqaopcxxe
   '@typescript-eslint/parser': 5.62.0_avq3eyf5kaj6ssrwo7fvkrwnji
-  '@vitejs/plugin-vue': 3.2.0_vite@3.2.11+vue@3.5.16
+  '@vitejs/plugin-vue': 3.2.0_vite@4.5.14+vue@3.5.16
   consola: 2.15.3
   cross-env: 7.0.3
   eslint: 8.57.1
@@ -116,10 +116,10 @@ devDependencies:
   unplugin-auto-import: 19.3.0_@vueuse+core@9.13.0
   unplugin-element-plus: 0.10.0
   unplugin-vue-components: 0.24.1_rollup@2.79.2+vue@3.5.16
-  vite: 3.2.11_sass@1.89.2
-  vite-plugin-compression: 0.5.1_vite@3.2.11
-  vite-plugin-eslint: 1.8.1_eslint@8.57.1+vite@3.2.11
-  vite-plugin-imagemin: 0.6.1_vite@3.2.11
+  vite: 4.5.14_sass@1.89.2
+  vite-plugin-compression: 0.5.1_vite@4.5.14
+  vite-plugin-eslint: 1.8.1_eslint@8.57.1+vite@4.5.14
+  vite-plugin-imagemin: 0.6.1_vite@4.5.14
   vite-svg-loader: 3.6.0
   vue-tsc: 1.8.27_typescript@4.9.5
 
@@ -373,8 +373,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/android-arm/0.15.18:
-    resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==}
+  /@esbuild/android-arm/0.18.20:
+    resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [android]
@@ -382,6 +382,87 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/android-arm64/0.18.20:
+    resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64/0.18.20:
+    resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64/0.18.20:
+    resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64/0.18.20:
+    resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64/0.18.20:
+    resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64/0.18.20:
+    resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm/0.18.20:
+    resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64/0.18.20:
+    resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32/0.18.20:
+    resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-loong64/0.14.54:
     resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
     engines: {node: '>=12'}
@@ -391,8 +472,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-loong64/0.15.18:
-    resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==}
+  /@esbuild/linux-loong64/0.18.20:
+    resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
@@ -400,6 +481,105 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-mips64el/0.18.20:
+    resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64/0.18.20:
+    resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64/0.18.20:
+    resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x/0.18.20:
+    resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64/0.18.20:
+    resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64/0.18.20:
+    resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64/0.18.20:
+    resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64/0.18.20:
+    resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64/0.18.20:
+    resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32/0.18.20:
+    resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64/0.18.20:
+    resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@eslint-community/eslint-utils/4.7.0_eslint@8.57.1:
     resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -491,8 +671,8 @@ packages:
       '@jridgewell/sourcemap-codec': 1.5.0
     dev: true
 
-  /@napi-rs/wasm-runtime/0.2.10:
-    resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==}
+  /@napi-rs/wasm-runtime/0.2.11:
+    resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==}
     requiresBuild: true
     dependencies:
       '@emnapi/core': 1.4.3
@@ -832,7 +1012,7 @@ packages:
   /@types/keyv/3.1.4:
     resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
     dependencies:
-      '@types/node': 22.15.30
+      '@types/node': 24.0.4
     dev: true
 
   /@types/lodash-es/4.17.12:
@@ -866,6 +1046,12 @@ packages:
       undici-types: 6.21.0
     dev: true
 
+  /@types/node/24.0.4:
+    resolution: {integrity: sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==}
+    dependencies:
+      undici-types: 7.8.0
+    dev: true
+
   /@types/normalize-package-data/2.4.4:
     resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
     dev: true
@@ -877,7 +1063,7 @@ packages:
   /@types/responselike/1.0.3:
     resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
     dependencies:
-      '@types/node': 22.15.30
+      '@types/node': 24.0.4
     dev: true
 
   /@types/semver/7.7.0:
@@ -1151,7 +1337,7 @@ packages:
     cpu: [wasm32]
     requiresBuild: true
     dependencies:
-      '@napi-rs/wasm-runtime': 0.2.10
+      '@napi-rs/wasm-runtime': 0.2.11
     dev: true
     optional: true
 
@@ -1179,14 +1365,14 @@ packages:
     dev: true
     optional: true
 
-  /@vitejs/plugin-vue/3.2.0_vite@3.2.11+vue@3.5.16:
+  /@vitejs/plugin-vue/3.2.0_vite@4.5.14+vue@3.5.16:
     resolution: {integrity: sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       vite: ^3.0.0
       vue: ^3.2.25
     dependencies:
-      vite: 3.2.11_sass@1.89.2
+      vite: 4.5.14_sass@1.89.2
       vue: 3.5.16_typescript@4.9.5
     dev: true
 
@@ -1228,7 +1414,7 @@ packages:
     resolution: {integrity: sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==}
     dependencies:
       '@babel/parser': 7.27.5
-      postcss: 8.5.4
+      postcss: 8.5.6
       source-map: 0.6.1
     optionalDependencies:
       prettier: 2.8.8
@@ -1244,7 +1430,7 @@ packages:
       '@vue/shared': 3.5.16
       estree-walker: 2.0.2
       magic-string: 0.30.17
-      postcss: 8.5.4
+      postcss: 8.5.6
       source-map-js: 1.2.1
 
   /@vue/compiler-ssr/3.5.16:
@@ -2466,6 +2652,12 @@ packages:
       once: 1.4.0
     dev: true
 
+  /end-of-stream/1.4.5:
+    resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+    dependencies:
+      once: 1.4.0
+    dev: true
+
   /entities/2.2.0:
     resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
     dev: true
@@ -2592,15 +2784,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-android-64/0.15.18:
-    resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-android-arm64/0.14.54:
     resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
     engines: {node: '>=12'}
@@ -2610,15 +2793,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-android-arm64/0.15.18:
-    resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-darwin-64/0.14.54:
     resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
     engines: {node: '>=12'}
@@ -2628,15 +2802,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-darwin-64/0.15.18:
-    resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-darwin-arm64/0.14.54:
     resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
     engines: {node: '>=12'}
@@ -2646,15 +2811,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-darwin-arm64/0.15.18:
-    resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-freebsd-64/0.14.54:
     resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
     engines: {node: '>=12'}
@@ -2664,15 +2820,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-freebsd-64/0.15.18:
-    resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-freebsd-arm64/0.14.54:
     resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
     engines: {node: '>=12'}
@@ -2682,15 +2829,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-freebsd-arm64/0.15.18:
-    resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-32/0.14.54:
     resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
     engines: {node: '>=12'}
@@ -2700,15 +2838,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-32/0.15.18:
-    resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-64/0.14.54:
     resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
     engines: {node: '>=12'}
@@ -2718,15 +2847,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-64/0.15.18:
-    resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-arm/0.14.54:
     resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
     engines: {node: '>=12'}
@@ -2736,15 +2856,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-arm/0.15.18:
-    resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-arm64/0.14.54:
     resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
     engines: {node: '>=12'}
@@ -2754,15 +2865,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-arm64/0.15.18:
-    resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-mips64le/0.14.54:
     resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
     engines: {node: '>=12'}
@@ -2772,15 +2874,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-mips64le/0.15.18:
-    resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-ppc64le/0.14.54:
     resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
     engines: {node: '>=12'}
@@ -2790,15 +2883,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-ppc64le/0.15.18:
-    resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-riscv64/0.14.54:
     resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
     engines: {node: '>=12'}
@@ -2808,15 +2892,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-riscv64/0.15.18:
-    resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-s390x/0.14.54:
     resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
     engines: {node: '>=12'}
@@ -2826,15 +2901,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-s390x/0.15.18:
-    resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-netbsd-64/0.14.54:
     resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
     engines: {node: '>=12'}
@@ -2844,15 +2910,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-netbsd-64/0.15.18:
-    resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-openbsd-64/0.14.54:
     resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
     engines: {node: '>=12'}
@@ -2862,15 +2919,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-openbsd-64/0.15.18:
-    resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-sunos-64/0.14.54:
     resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
     engines: {node: '>=12'}
@@ -2880,15 +2928,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-sunos-64/0.15.18:
-    resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-windows-32/0.14.54:
     resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
     engines: {node: '>=12'}
@@ -2898,15 +2937,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-32/0.15.18:
-    resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-windows-64/0.14.54:
     resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
     engines: {node: '>=12'}
@@ -2916,15 +2946,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-64/0.15.18:
-    resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-windows-arm64/0.14.54:
     resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
     engines: {node: '>=12'}
@@ -2934,15 +2955,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-arm64/0.15.18:
-    resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild/0.14.54:
     resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
     engines: {node: '>=12'}
@@ -2972,34 +2984,34 @@ packages:
       esbuild-windows-arm64: 0.14.54
     dev: true
 
-  /esbuild/0.15.18:
-    resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==}
+  /esbuild/0.18.20:
+    resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/android-arm': 0.15.18
-      '@esbuild/linux-loong64': 0.15.18
-      esbuild-android-64: 0.15.18
-      esbuild-android-arm64: 0.15.18
-      esbuild-darwin-64: 0.15.18
-      esbuild-darwin-arm64: 0.15.18
-      esbuild-freebsd-64: 0.15.18
-      esbuild-freebsd-arm64: 0.15.18
-      esbuild-linux-32: 0.15.18
-      esbuild-linux-64: 0.15.18
-      esbuild-linux-arm: 0.15.18
-      esbuild-linux-arm64: 0.15.18
-      esbuild-linux-mips64le: 0.15.18
-      esbuild-linux-ppc64le: 0.15.18
-      esbuild-linux-riscv64: 0.15.18
-      esbuild-linux-s390x: 0.15.18
-      esbuild-netbsd-64: 0.15.18
-      esbuild-openbsd-64: 0.15.18
-      esbuild-sunos-64: 0.15.18
-      esbuild-windows-32: 0.15.18
-      esbuild-windows-64: 0.15.18
-      esbuild-windows-arm64: 0.15.18
+      '@esbuild/android-arm': 0.18.20
+      '@esbuild/android-arm64': 0.18.20
+      '@esbuild/android-x64': 0.18.20
+      '@esbuild/darwin-arm64': 0.18.20
+      '@esbuild/darwin-x64': 0.18.20
+      '@esbuild/freebsd-arm64': 0.18.20
+      '@esbuild/freebsd-x64': 0.18.20
+      '@esbuild/linux-arm': 0.18.20
+      '@esbuild/linux-arm64': 0.18.20
+      '@esbuild/linux-ia32': 0.18.20
+      '@esbuild/linux-loong64': 0.18.20
+      '@esbuild/linux-mips64el': 0.18.20
+      '@esbuild/linux-ppc64': 0.18.20
+      '@esbuild/linux-riscv64': 0.18.20
+      '@esbuild/linux-s390x': 0.18.20
+      '@esbuild/linux-x64': 0.18.20
+      '@esbuild/netbsd-x64': 0.18.20
+      '@esbuild/openbsd-x64': 0.18.20
+      '@esbuild/sunos-x64': 0.18.20
+      '@esbuild/win32-arm64': 0.18.20
+      '@esbuild/win32-ia32': 0.18.20
+      '@esbuild/win32-x64': 0.18.20
     dev: true
 
   /escalade/3.2.0:
@@ -3467,8 +3479,8 @@ packages:
       pend: 1.2.0
     dev: true
 
-  /fdir/6.4.5_picomatch@4.0.2:
-    resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==}
+  /fdir/6.4.6_picomatch@4.0.2:
+    resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==}
     peerDependencies:
       picomatch: ^3 || ^4
     peerDependenciesMeta:
@@ -5638,6 +5650,15 @@ packages:
       nanoid: 3.3.11
       picocolors: 1.1.1
       source-map-js: 1.2.1
+    dev: true
+
+  /postcss/8.5.6:
+    resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
 
   /prelude-ls/1.2.1:
     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
@@ -6464,10 +6485,10 @@ packages:
     dependencies:
       bl: 1.2.3
       buffer-alloc: 1.2.0
-      end-of-stream: 1.4.4
+      end-of-stream: 1.4.5
       fs-constants: 1.0.0
       readable-stream: 2.3.8
-      to-buffer: 1.1.1
+      to-buffer: 1.2.1
       xtend: 4.0.2
     dev: true
 
@@ -6512,12 +6533,17 @@ packages:
     resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
     engines: {node: '>=12.0.0'}
     dependencies:
-      fdir: 6.4.5_picomatch@4.0.2
+      fdir: 6.4.6_picomatch@4.0.2
       picomatch: 4.0.2
     dev: true
 
-  /to-buffer/1.1.1:
-    resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==}
+  /to-buffer/1.2.1:
+    resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      isarray: 2.0.5
+      safe-buffer: 5.2.1
+      typed-array-buffer: 1.0.3
     dev: true
 
   /to-regex-range/5.0.1:
@@ -6725,6 +6751,10 @@ packages:
     resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
     dev: true
 
+  /undici-types/7.8.0:
+    resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==}
+    dev: true
+
   /unimport/4.2.0:
     resolution: {integrity: sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==}
     engines: {node: '>=18.12.0'}
@@ -6906,7 +6936,7 @@ packages:
       spdx-expression-parse: 3.0.1
     dev: true
 
-  /vite-plugin-compression/0.5.1_vite@3.2.11:
+  /vite-plugin-compression/0.5.1_vite@4.5.14:
     resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -6914,12 +6944,12 @@ packages:
       chalk: 4.1.2
       debug: 4.4.1
       fs-extra: 10.1.0
-      vite: 3.2.11_sass@1.89.2
+      vite: 4.5.14_sass@1.89.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /vite-plugin-eslint/1.8.1_eslint@8.57.1+vite@3.2.11:
+  /vite-plugin-eslint/1.8.1_eslint@8.57.1+vite@4.5.14:
     resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==}
     peerDependencies:
       eslint: '>=7'
@@ -6929,10 +6959,10 @@ packages:
       '@types/eslint': 8.56.12
       eslint: 8.57.1
       rollup: 2.79.2
-      vite: 3.2.11_sass@1.89.2
+      vite: 4.5.14_sass@1.89.2
     dev: true
 
-  /vite-plugin-imagemin/0.6.1_vite@3.2.11:
+  /vite-plugin-imagemin/0.6.1_vite@4.5.14:
     resolution: {integrity: sha512-cP7LDn8euPrji7WYtDoNQpJEB9nkMxJHm/A+QZnvMrrCSuyo/clpMy/T1v7suDXPBavsDiDdFdVQB5p7VGD2cg==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -6960,7 +6990,7 @@ packages:
       imagemin-webp: 6.1.0
       jpegtran-bin: 6.0.1
       pathe: 0.2.0
-      vite: 3.2.11_sass@1.89.2
+      vite: 4.5.14_sass@1.89.2
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -6972,13 +7002,14 @@ packages:
       svgo: 2.8.0
     dev: true
 
-  /vite/3.2.11_sass@1.89.2:
-    resolution: {integrity: sha512-K/jGKL/PgbIgKCiJo5QbASQhFiV02X9Jh+Qq0AKCRCRKZtOTVi4t6wh75FDpGf2N9rYOnzH87OEFQNaFy6pdxQ==}
+  /vite/4.5.14_sass@1.89.2:
+    resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==}
     engines: {node: ^14.18.0 || >=16.0.0}
     hasBin: true
     peerDependencies:
       '@types/node': '>= 14'
       less: '*'
+      lightningcss: ^1.21.0
       sass: '*'
       stylus: '*'
       sugarss: '*'
@@ -6988,6 +7019,8 @@ packages:
         optional: true
       less:
         optional: true
+      lightningcss:
+        optional: true
       sass:
         optional: true
       stylus:
@@ -6997,9 +7030,8 @@ packages:
       terser:
         optional: true
     dependencies:
-      esbuild: 0.15.18
-      postcss: 8.5.4
-      resolve: 1.22.10
+      esbuild: 0.18.20
+      postcss: 8.5.6
       rollup: 2.79.2
       sass: 1.89.2
     optionalDependencies:

+ 19 - 82
src/assets/style/base.scss

@@ -52,48 +52,9 @@
   }
 }
 
-.filter-line {
-  .arco-input-wrapper,
-  .arco-select {
-    width: 200px;
-    padding-left: 8px;
-  }
-
-  .arco-select-view-prefix,
-  .arco-input-prefix {
-    padding-right: 16px;
-    position: relative;
-    color: var(--color-text-dark-1);
-
-    &::after {
-      content: '';
-      display: block;
-      position: absolute;
-      width: 1px;
-      height: 14px;
-      background: var(--color-border);
-      right: 8px;
-      top: 50%;
-      margin-top: -7px;
-    }
-  }
-}
-
 .part-action {
-  margin-bottom: 16px;
-  .arco-btn-text {
-    padding: 5px 8px;
-    font-weight: 400;
-  }
-  .arco-space-item:not(:first-child) {
-    .arco-btn-text {
-      color: var(--color-text-dark);
-    }
-  }
-  .arco-divider {
-    margin: 0;
-    border-color: var(--color-border);
-  }
+  border-top: 1px solid var(--color-border-light);
+  padding: 16px 0 15px;
 }
 
 // page-table
@@ -121,17 +82,25 @@
   }
 }
 
-// action-more
-.action-more {
-  .ant-btn-block {
-    display: block;
-    padding: 5px 8px;
+// page-breadcrumb
+.page-breadcrumb {
+  height: 22px;
+  line-height: 22px;
+  color: var(--color-text-gray);
+  font-size: 14px;
+  margin-bottom: 16px;
+
+  > span {
+    display: inline-block;
+    vertical-align: middle;
   }
+  .el-breadcrumb {
+    display: inline-block;
+    vertical-align: middle;
 
-  .ant-popover-inner {
-    border-radius: 6px;
-    padding: 6px;
-    box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.12);
+    .el-breadcrumb__inner {
+      color: var(--color-text-gray);
+    }
   }
 }
 
@@ -218,38 +187,6 @@
   }
 }
 
-/* btn */
-.btn-danger {
-  &.arco-btn-text {
-    padding: 0 !important;
-    background-color: transparent !important;
-  }
-
-  &.arco-btn-text:not(.arco-btn-disabled) {
-    color: var(--color-danger) !important;
-
-    &:hover {
-      font-weight: 600;
-    }
-  }
-  &.arco-btn-disabled {
-    color: var(--color-text-gray-2);
-  }
-}
-.btn-primary {
-  &.arco-btn-text {
-    padding: 0 !important;
-    background-color: transparent !important;
-  }
-  &.arco-btn-text:not(.arco-btn-disabled) {
-    // color: var(--color-text-dark-1) !important;
-    &:hover {
-      font-weight: 600;
-      color: var(--color-primary) !important;
-    }
-  }
-}
-
 // other
 .tips-info {
   font-size: 14px;

+ 29 - 2
src/assets/style/element-custom.scss

@@ -14,6 +14,12 @@
       background-image: linear-gradient(180deg, #f9f9f9 0%, #f1f1f1 100%);
     }
   }
+  .el-table__header-wrapper {
+    tr th.el-table-fixed-column--left,
+    tr th.el-table-fixed-column--right {
+      background-image: linear-gradient(180deg, #f9f9f9 0%, #f1f1f1 100%);
+    }
+  }
 }
 
 // el-table
@@ -81,8 +87,10 @@
 
 // el-input-number
 .el-input-number {
-  .el-input__inner {
-    text-align: left;
+  .el-input {
+    .el-input__inner {
+      text-align: left;
+    }
   }
 }
 
@@ -168,12 +176,24 @@
     border-radius: 8px 8px 0px 0px;
     padding: 11px 20px 10px;
     border-bottom: 1px solid #dce3eb;
+    .el-dialog__title {
+      font-size: 16px;
+      font-weight: 500;
+      color: var(--color-text-dark);
+    }
   }
   .el-dialog__headerbtn {
     width: 50px;
     height: 46px;
     font-size: 20px;
     line-height: 50px;
+
+    &:hover {
+      opacity: 0.7;
+    }
+    .el-dialog__close {
+      color: var(--color-text-dark-1);
+    }
   }
   .el-dialog__body {
     padding: 20px;
@@ -182,3 +202,10 @@
     padding: 10px 20px 20px;
   }
 }
+
+// .el-button
+.el-button {
+  .el-icon {
+    margin-right: 4px;
+  }
+}

+ 50 - 43
src/assets/style/pages.scss

@@ -120,11 +120,6 @@
   }
 }
 
-/* page */
-.page {
-  display: block;
-}
-
 // privilege-set
 .privilege-set {
   overflow: auto;
@@ -261,52 +256,64 @@
   }
 }
 
-// card-title-rule-edit
-.card-title-rule-edit {
-  .field-item {
-    display: inline-block;
-    vertical-align: top;
-    margin: 0 10px 10px 0;
-    padding: 8px 10px;
-    border-radius: 4px;
-    line-height: 1;
-    background-color: var(--color-background);
-    cursor: pointer;
+.exam-edit {
+  .form-section {
+    margin-bottom: 16px;
+    border: 1px solid var(--color-border-light);
 
-    &:hover {
-      color: var(--color-primary);
-    }
-    &.is-act {
-      background-color: var(--color-primary);
-      color: #fff !important;
-    }
-    &.is-disabled {
-      cursor: not-allowed;
+    .section-head {
+      height: 46px;
+      padding: 11px 16px 10px;
+      line-height: 24px;
+      background: linear-gradient(180deg, #f9f9f9 0%, #f1f1f1 100%);
+      border-bottom: 1px solid var(--color-border-light);
+
+      &.is-flex {
+        display: flex;
+        align-items: center;
+        gap: 12px;
+      }
 
-      &:hover {
+      > h3 {
+        line-height: 24px;
+        font-weight: 500;
         color: var(--color-text-dark);
+        font-size: 16px;
       }
     }
+    .section-body {
+      padding: 20px 16px;
+    }
   }
-  .field-textarea {
-    border-radius: var(--border-radius);
-    border: 1px solid var(--color-text-gray-2);
-    min-height: 60px;
-    padding: 2px;
-    overflow: hidden;
 
-    &:focus {
-      border-color: var(--color-primary);
-    }
+  .section-part {
+    margin-bottom: 20px;
+    border-bottom: 1px solid var(--color-border-light);
+    padding-bottom: 5px;
 
-    span.var-field {
-      display: inline-block;
-      vertical-align: middle;
-      padding: 3px 5px;
-      background-color: var(--color-primary);
-      color: var(--color-white);
-      line-height: 1;
-      border-radius: 3px;
+    &-title {
+      height: 22px;
+      line-height: 22px;
+      color: var(--color-text-dark);
+      position: relative;
+      padding-left: 10px;
+      margin-bottom: 20px;
+
+      &::before {
+        content: '';
+        display: block;
+        position: absolute;
+        width: 2px;
+        height: 16px;
+        background-color: var(--color-primary);
+        top: 50%;
+        left: 0;
+        transform: translateY(-50%);
+      }
     }
   }
+
+  .form-actions {
+    text-align: center;
+  }
 }

+ 2 - 0
src/components/index.ts

@@ -11,6 +11,7 @@ import SelectExam from './select-exam/index.vue';
 import SelectSubject from './select-subject/index.vue';
 import ImportDialog from './import-dialog/index.vue';
 import TableField from './table-field/index.vue';
+import PageBreadcrumb from './page-breadcrumb/index.vue';
 
 export default {
   install(Vue: App) {
@@ -24,5 +25,6 @@ export default {
     Vue.component('SelectSubject', SelectSubject);
     Vue.component('ImportDialog', ImportDialog);
     Vue.component('TableField', TableField);
+    Vue.component('PageBreadcrumb', PageBreadcrumb);
   },
 };

+ 23 - 0
src/components/page-breadcrumb/index.vue

@@ -0,0 +1,23 @@
+<template>
+  <div class="page-breadcrumb">
+    <span> 当前所在位置: </span>
+    <el-breadcrumb separator="/">
+      <el-breadcrumb-item v-for="(item, index) in props.data" :key="index">{{
+        item
+      }}</el-breadcrumb-item>
+    </el-breadcrumb>
+  </div>
+</template>
+
+<script setup lang="ts">
+  defineOptions({
+    name: 'PageBreadcrumb',
+  });
+
+  const props = defineProps({
+    data: {
+      type: Array,
+      default: () => [],
+    },
+  });
+</script>

+ 14 - 10
src/components/table-field/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-button type="primary" @click="showDialog = true">
+  <el-button @click="showDialog = true">
     <el-icon><Setting /></el-icon>
     表头配置
   </el-button>
@@ -7,7 +7,7 @@
   <el-dialog
     v-model="showDialog"
     title="表头配置"
-    width="662px"
+    width="700px"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
     top="10vh"
@@ -17,14 +17,18 @@
     @open="initFields"
   >
     <el-checkbox-group v-model="selectedFields">
-      <el-checkbox
-        v-for="field in props.fields"
-        :key="field.field"
-        :label="field.field"
-        :value="field.field"
-      >
-        {{ field.name }}
-      </el-checkbox>
+      <el-row>
+        <el-col
+          v-for="field in props.fields"
+          :key="field.field"
+          :span="4"
+          style="margin-bottom: 10px"
+        >
+          <el-checkbox :label="field.field" :value="field.field">
+            {{ field.name }}
+          </el-checkbox>
+        </el-col>
+      </el-row>
     </el-checkbox-group>
 
     <template #footer>

+ 21 - 1
src/layout/default-layout.vue

@@ -44,6 +44,7 @@
         :collapse="isCollapse"
         unique-opened
         @select="toMenuItem"
+        @open="handleSubMenuOpen"
       >
         <template v-for="submenu in appStore.appMenus">
           <el-sub-menu
@@ -123,7 +124,11 @@
   });
 
   function initData() {
-    curRouteName.value = route.name as string;
+    let routerName = route.name as string;
+    if (route.meta.relationRoutes && route.meta.relationRoutes.length) {
+      routerName = route.meta.relationRoutes[0];
+    }
+    curRouteName.value = routerName;
     // console.log(route.name);
   }
 
@@ -131,7 +136,22 @@
     isCollapse.value = !isCollapse.value;
   }
 
+  function handleSubMenuOpen(val: string) {
+    const subMenuFirstRouter = appStore.getSubMenuFirstRouter(val);
+    if (
+      route.meta.relationRoutes?.includes(subMenuFirstRouter.name) ||
+      route.name === subMenuFirstRouter.name ||
+      subMenuFirstRouter.name === val
+    ) {
+      return;
+    }
+    router.push({ name: subMenuFirstRouter.name });
+  }
+
   function toMenuItem(val: string) {
+    if (route.name === val) {
+      return;
+    }
     router.push({ name: val });
   }
 

+ 11 - 0
src/router/routes/modules/base.ts

@@ -62,6 +62,7 @@ const BASE: AppRouteRecordRaw = {
       meta: {
         title: '试卷结构编辑',
         requiresAuth: true,
+        relationRoutes: ['SubjectManage'],
       },
     },
     {
@@ -71,6 +72,7 @@ const BASE: AppRouteRecordRaw = {
       meta: {
         title: '选择题设置',
         requiresAuth: true,
+        relationRoutes: ['SubjectManage'],
       },
     },
     {
@@ -89,6 +91,7 @@ const BASE: AppRouteRecordRaw = {
       meta: {
         title: '编辑考试',
         requiresAuth: true,
+        relationRoutes: ['ExamManage'],
       },
     },
     {
@@ -234,6 +237,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '分组管理',
             requiresAuth: true,
+            relationRoutes: ['MarkManage'],
           },
         },
         {
@@ -244,6 +248,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '编辑分组',
             requiresAuth: true,
+            relationRoutes: ['MarkManage', 'GroupManage'],
           },
         },
         // 评卷员管理
@@ -254,6 +259,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '评卷员管理',
             requiresAuth: true,
+            relationRoutes: ['MarkManage'],
           },
         },
         // 试评管理
@@ -264,6 +270,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '试评管理',
             requiresAuth: true,
+            relationRoutes: ['MarkManage'],
           },
         },
         // 任务管理
@@ -274,6 +281,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '任务管理',
             requiresAuth: true,
+            relationRoutes: ['MarkManage'],
           },
         },
         // 仲裁管理
@@ -284,6 +292,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '仲裁管理',
             requiresAuth: true,
+            relationRoutes: ['MarkManage'],
           },
         },
         // 质量监控
@@ -294,6 +303,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '质量监控',
             requiresAuth: true,
+            relationRoutes: ['MarkManage'],
           },
         },
         // 给分曲线
@@ -304,6 +314,7 @@ const BASE: AppRouteRecordRaw = {
           meta: {
             title: '给分曲线',
             requiresAuth: true,
+            relationRoutes: ['MarkManage', 'QualityMonitor'],
           },
         },
       ],

+ 2 - 9
src/router/typings.d.ts

@@ -2,15 +2,8 @@ import 'vue-router';
 
 declare module 'vue-router' {
   interface RouteMeta {
-    roles?: string[]; // Controls roles that have access to the page
+    title?: string;
     requiresAuth: boolean; // Whether login is required to access the current page (every route must declare)
-    icon?: string; // The icon show in the side menu
-    locale?: string; // The locale name show in side menu and breadcrumb
-    hideInMenu?: boolean; // If true, it is not displayed in the side menu
-    hideChildrenInMenu?: boolean; // if set true, the children are not displayed in the side menu
-    activeMenu?: string; // if set name, the menu will be highlighted according to the name you set
-    order?: number; // Sort routing menu items. If set key, the higher the value, the more forward it is
-    noAffix?: boolean; // if set true, the tag will not affix in the tab-bar
-    ignoreCache?: boolean; // if set true, the page will not be cached
+    relationRoutes?: string[];
   }
 }

+ 11 - 0
src/store/modules/app/index.ts

@@ -87,6 +87,17 @@ const useAppStore = defineStore('app', {
 
       return { name: firstRouteName };
     },
+    getSubMenuFirstRouter(subMenuUrl: string) {
+      let firstRouteName = subMenuUrl;
+      let subMenu = this.appMenus.find((item) => item.url === subMenuUrl);
+
+      while (subMenu && subMenu.children?.length) {
+        firstRouteName = subMenu.children?.[0].url ?? '';
+        subMenu = subMenu.children?.[0];
+      }
+
+      return { name: firstRouteName };
+    },
     toggleDevice(device: string) {
       this.device = device;
     },

+ 12 - 12
src/store/modules/app/menuData.ts

@@ -43,7 +43,7 @@ export const adminMenus = [
   {
     id: 2,
     name: '用户管理',
-    url: 'UserManage',
+    url: 'user',
     icon: 'icon-user-manage',
     type: 'MENU',
     parentId: -1,
@@ -63,7 +63,7 @@ export const adminMenus = [
   {
     id: 3,
     name: '考试管理',
-    url: 'ExamManage',
+    url: 'exam',
     icon: 'icon-exam-manage',
     type: 'MENU',
     parentId: -1,
@@ -83,7 +83,7 @@ export const adminMenus = [
   {
     id: 4,
     name: '考生管理',
-    url: 'StudentManage',
+    url: 'student',
     icon: 'icon-student-manage',
     type: 'MENU',
     parentId: -1,
@@ -103,7 +103,7 @@ export const adminMenus = [
   {
     id: 5,
     name: '扫描进度',
-    url: 'ScanManage',
+    url: 'scan',
     icon: 'icon-scan-progress',
     type: 'MENU',
     parentId: -1,
@@ -123,7 +123,7 @@ export const adminMenus = [
   {
     id: 6,
     name: '科目管理',
-    url: 'SubjectManage',
+    url: 'subject',
     icon: 'icon-subject-manage',
     type: 'MENU',
     parentId: -1,
@@ -173,7 +173,7 @@ export const adminMenus = [
   {
     id: 8,
     name: '打回卷管理',
-    url: 'back',
+    url: 'reject',
     icon: 'icon-reject-manage',
     type: 'MENU',
     parentId: -1,
@@ -213,7 +213,7 @@ export const adminMenus = [
   {
     id: 9,
     name: '问题卷管理',
-    url: 'IssuePaper',
+    url: 'issue',
     icon: 'icon-issue-paper',
     type: 'MENU',
     parentId: -1,
@@ -233,7 +233,7 @@ export const adminMenus = [
   {
     id: 10,
     name: '成绩复核',
-    url: 'ScoreReview',
+    url: 'review',
     icon: 'icon-score-review',
     type: 'MENU',
     parentId: -1,
@@ -273,7 +273,7 @@ export const adminMenus = [
   {
     id: 11,
     name: '成绩查询',
-    url: 'ScoreQuery',
+    url: 'score',
     icon: 'icon-score-query',
     type: 'MENU',
     parentId: -1,
@@ -293,7 +293,7 @@ export const adminMenus = [
   {
     id: 12,
     name: '科目分析',
-    url: 'AnalysisManage',
+    url: 'analysis',
     icon: 'icon-subject-analysis',
     type: 'MENU',
     parentId: -1,
@@ -313,7 +313,7 @@ export const adminMenus = [
   {
     id: 13,
     name: '数据检查',
-    url: 'ManualConfirm',
+    url: 'check',
     icon: 'icon-data-check',
     type: 'MENU',
     parentId: -1,
@@ -353,7 +353,7 @@ export const adminMenus = [
   {
     id: 14,
     name: '操作日志',
-    url: 'LogManage',
+    url: 'log',
     icon: 'icon-log',
     type: 'MENU',
     parentId: -1,

+ 1 - 1
src/views/exam/ExamAdvancedDialog.vue

@@ -14,7 +14,7 @@
       ref="formRef"
       :model="formModel"
       :rules="rules"
-      label-width="220px"
+      label-width="180px"
     >
       <el-form-item label="评卷时强制试卷拉到底部">
         <el-checkbox v-model="formModel.forceScrollToBottom"> </el-checkbox>

+ 285 - 344
src/views/exam/ExamEdit.vue

@@ -1,307 +1,310 @@
 <template>
-  <div class="exam-edit-page">
-    <div class="page-header">
-      <h2>{{ isEdit ? '编辑考试' : '新增考试' }}</h2>
-    </div>
+  <div class="exam-edit">
+    <page-breadcrumb
+      :data="['考试批次管理', isEdit ? '编辑考试' : '创建考试']"
+    />
 
-    <div class="page-content">
+    <div class="part-box is-border">
       <el-form
         ref="formRef"
         :model="formModel"
         :rules="rules"
-        label-width="280px"
-        class="exam-form"
+        label-width="200px"
       >
         <!-- 考试信息 -->
         <div class="form-section">
-          <h3>考试信息</h3>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="考试名称" prop="name">
-                <el-input
-                  v-model="formModel.name"
-                  placeholder="请输入考试名称"
-                  style="width: 200px"
-                />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="类型" prop="type" label-width="200px">
-                <el-select
-                  v-model="formModel.type"
-                  placeholder="请选择类型"
-                  style="width: 200px"
-                >
-                  <el-option
-                    v-for="(val, key) in EXAM_TYPE"
-                    :key="key"
-                    :label="val"
-                    :value="key"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="评卷开始日期">
-                <el-date-picker
-                  v-model="formModel.markingStartDate"
-                  type="date"
-                  placeholder="请选择评卷开始日期"
-                  style="width: 200px"
-                  format="YYYY-MM-DD"
-                  value-format="YYYY-MM-DD"
-                />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="评卷结束日期" label-width="200px">
-                <el-date-picker
-                  v-model="formModel.markingEndDate"
-                  type="date"
-                  placeholder="请选择评卷结束日期"
-                  style="width: 200px"
-                  format="YYYY-MM-DD"
-                  value-format="YYYY-MM-DD"
+          <div class="section-head">
+            <h3>考试信息</h3>
+          </div>
+          <div class="section-body">
+            <el-form-item label="考试名称" prop="name" label-width="110px">
+              <el-input
+                v-model="formModel.name"
+                placeholder="请输入考试名称"
+                style="width: 200px"
+              />
+            </el-form-item>
+
+            <el-form-item label="类型" prop="type" label-width="110px">
+              <el-select
+                v-model="formModel.type"
+                placeholder="请选择类型"
+                style="width: 200px"
+              >
+                <el-option
+                  v-for="(val, key) in EXAM_TYPE"
+                  :key="key"
+                  :label="val"
+                  :value="key"
                 />
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row v-if="isEdit" :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="状态">
-                <el-select
-                  v-model="formModel.status"
-                  placeholder="请选择"
-                  style="width: 200px"
-                >
-                  <el-option label="A4" value="1" />
-                  <el-option label="A3" value="2" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
+              </el-select>
+            </el-form-item>
+
+            <el-form-item label="评卷开始日期" label-width="110px">
+              <el-date-picker
+                v-model="formModel.markingStartDate"
+                type="date"
+                placeholder="请选择评卷开始日期"
+                style="width: 200px"
+                format="YYYY-MM-DD"
+                value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+
+            <el-form-item label="评卷结束日期" label-width="110px">
+              <el-date-picker
+                v-model="formModel.markingEndDate"
+                type="date"
+                placeholder="请选择评卷结束日期"
+                style="width: 200px"
+                format="YYYY-MM-DD"
+                value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+            <el-form-item v-if="isEdit" label="状态" label-width="110px">
+              <el-select
+                v-model="formModel.status"
+                placeholder="请选择"
+                style="width: 200px"
+              >
+                <el-option label="A4" value="1" />
+                <el-option label="A3" value="2" />
+              </el-select>
+            </el-form-item>
+          </div>
         </div>
 
         <!-- 阅卷设置 -->
         <div class="form-section">
-          <div class="section-header">
+          <div class="section-head is-flex">
             <h3>阅卷设置</h3>
             <el-button type="primary" link @click="openAdvancedSettings">
               高级设置
             </el-button>
           </div>
-
-          <h4 class="section-sub-title">评卷给分方式</h4>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="评卷模式" prop="markingMode">
-                <el-select
-                  v-model="formModel.markingMode"
-                  placeholder="请选择"
-                  style="width: 200px"
+          <div class="section-body">
+            <div class="section-part">
+              <h4 class="section-part-title">评卷给分方式</h4>
+              <el-space size="40">
+                <el-form-item
+                  label="评卷模式"
+                  prop="markingMode"
+                  label-width="110px"
                 >
-                  <el-option
-                    v-for="(val, key) in MARKING_MODE"
-                    :key="key"
-                    :label="val"
-                    :value="key"
+                  <el-select
+                    v-model="formModel.markingMode"
+                    placeholder="请选择"
+                    style="width: 200px"
+                  >
+                    <el-option
+                      v-for="(val, key) in MARKING_MODE"
+                      :key="key"
+                      :label="val"
+                      :value="key"
+                    />
+                  </el-select>
+                </el-form-item>
+
+                <el-form-item label="强制标记" label-width="110px">
+                  <el-checkbox v-model="formModel.forceMark"></el-checkbox>
+                </el-form-item>
+              </el-space>
+            </div>
+
+            <div class="section-part">
+              <h4 class="section-part-title">数据安全</h4>
+              <el-space :size="10">
+                <el-form-item label="禁止他人查看考生信息" label-width="194px">
+                  <el-checkbox
+                    v-model="formModel.forbidViewStudentInfo"
+                  ></el-checkbox>
+                </el-form-item>
+
+                <el-form-item label="禁止科组长成绩查询" label-width="200px">
+                  <el-checkbox
+                    v-model="formModel.forbidLeaderScoreQuery"
+                  ></el-checkbox>
+                </el-form-item>
+              </el-space>
+            </div>
+
+            <div class="section-part">
+              <h4 class="section-part-title">全卷复核设置</h4>
+              <el-space :size="30">
+                <el-form-item
+                  label="全卷多次复核不能同一账号"
+                  label-width="220px"
+                >
+                  <el-checkbox
+                    v-model="formModel.preventSameAccountRecheck"
+                  ></el-checkbox>
+                </el-form-item>
+
+                <el-form-item
+                  label="全卷复核强制试卷拉到底部"
+                  label-width="200px"
+                >
+                  <el-checkbox
+                    v-model="formModel.forceScrollToBottom"
+                  ></el-checkbox>
+                </el-form-item>
+                <el-form-item
+                  label="全卷复核进度100%时才能再次复核"
+                  label-width="240px"
+                >
+                  <el-checkbox
+                    v-model="formModel.requireFullProgressForRecheck"
+                  ></el-checkbox>
+                </el-form-item>
+              </el-space>
+            </div>
+
+            <div class="section-part">
+              <h4 class="section-part-title">其他</h4>
+              <el-space :size="40">
+                <el-form-item
+                  label="回评卷数"
+                  prop="recheckCount"
+                  label-width="110px"
+                >
+                  <el-input-number
+                    v-model="formModel.recheckCount"
+                    :min="0"
+                    :max="100"
+                    :step="1"
+                    :precision="0"
+                    :controls="false"
+                    step-strictly
+                    style="width: 200px"
                   />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="强制标记" label-width="200px">
-                <el-checkbox v-model="formModel.forceMark"></el-checkbox>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <h4 class="section-sub-title">数据安全</h4>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="禁止他人查看考生信息">
-                <el-checkbox
-                  v-model="formModel.forbidViewStudentInfo"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="禁止科组长成绩查询" label-width="200px">
-                <el-checkbox
-                  v-model="formModel.forbidLeaderScoreQuery"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <h4 class="section-sub-title">全卷复核设置</h4>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="全卷多次复核不能同一账号">
-                <el-checkbox
-                  v-model="formModel.preventSameAccountRecheck"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item
-                label="全卷复核强制试卷拉到底部"
-                label-width="200px"
-              >
-                <el-checkbox
-                  v-model="formModel.forceScrollToBottom"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="全卷复核进度100%时才能再次复核">
-                <el-checkbox
-                  v-model="formModel.requireFullProgressForRecheck"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <h4 class="section-sub-title">其他</h4>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="回评卷数" prop="recheckCount">
-                <el-input-number
-                  v-model="formModel.recheckCount"
-                  :min="0"
-                  :max="100"
-                  :step="1"
-                  :precision="0"
-                  :controls="false"
-                  step-strictly
-                  style="width: 100px"
-                />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item
-                label="给分次数限制"
-                prop="scoringLimitType"
-                label-width="200px"
-              >
-                <el-select
-                  v-model="formModel.scoringLimitType"
-                  placeholder="请选择"
-                  style="width: 200px"
+                </el-form-item>
+
+                <el-form-item
+                  label="给分次数限制"
+                  prop="scoringLimitType"
+                  label-width="110px"
                 >
-                  <el-option label="小于等于" value="le" />
-                  <el-option label="等于" value="eq" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="评卷端显示客观分">
-                <el-checkbox
-                  v-model="formModel.showObjectiveScore"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="原图遮盖" label-width="200px">
-                <el-button type="primary" link>设置</el-button>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="打回后显示原分值及轨迹">
-                <el-checkbox
-                  v-model="formModel.showOriginalScoreAfterReturn"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="原卷显示" label-width="200px">
-                <el-checkbox
-                  v-model="formModel.showOriginalPaper"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="评卷提交自动定位">
-                <el-checkbox
-                  v-model="formModel.autoPositionAfterSubmit"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="自动对切题卡" label-width="200px">
-                <el-checkbox
-                  v-model="formModel.autoAlignAnswerSheet"
-                ></el-checkbox>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <h4 class="section-sub-title">数据分析设置</h4>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="及格分" prop="passingScore">
-                <el-input-number
-                  v-model="formModel.passingScore"
-                  :min="0"
-                  :max="100"
-                  :step="1"
-                  :precision="0"
-                  :controls="false"
-                  step-strictly
-                  style="width: 100px"
-                />
-                <span class="input-suffix">%</span>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item
-                label="优秀分"
-                prop="excellentScore"
-                label-width="200px"
-              >
-                <el-input-number
-                  v-model="formModel.excellentScore"
-                  :min="0"
-                  :max="100"
-                  :step="1"
-                  :precision="0"
-                  :controls="false"
-                  step-strictly
-                  style="width: 100px"
-                />
-                <span class="input-suffix">%</span>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row :gutter="20">
-            <el-col :span="20">
-              <el-form-item label="备注描述">
-                <el-input
-                  v-model="formModel.description"
-                  type="textarea"
-                  :rows="4"
-                  maxlength="999"
-                  placeholder="请输入备注描述"
-                />
-              </el-form-item>
-            </el-col>
-          </el-row>
+                  <el-select
+                    v-model="formModel.scoringLimitType"
+                    placeholder="请选择"
+                    style="width: 200px"
+                  >
+                    <el-option label="小于等于" value="le" />
+                    <el-option label="等于" value="eq" />
+                  </el-select>
+                </el-form-item>
+              </el-space>
+              <br />
+
+              <el-space :size="20">
+                <el-form-item label="评卷端显示客观分" label-width="166px">
+                  <el-checkbox
+                    v-model="formModel.showObjectiveScore"
+                  ></el-checkbox>
+                </el-form-item>
+
+                <el-form-item label="原图遮盖" label-width="140px">
+                  <el-button type="primary" link>设置</el-button>
+                </el-form-item>
+              </el-space>
+              <br />
+
+              <el-space :size="20">
+                <el-form-item
+                  label="打回后显示原分值及轨迹"
+                  label-width="207px"
+                >
+                  <el-checkbox
+                    v-model="formModel.showOriginalScoreAfterReturn"
+                  ></el-checkbox>
+                </el-form-item>
+
+                <el-form-item label="原卷显示" label-width="100px">
+                  <el-checkbox
+                    v-model="formModel.showOriginalPaper"
+                  ></el-checkbox>
+                </el-form-item>
+              </el-space>
+              <br />
+
+              <el-space :size="20">
+                <el-form-item label="评卷提交自动定位" label-width="165px">
+                  <el-checkbox
+                    v-model="formModel.autoPositionAfterSubmit"
+                  ></el-checkbox>
+                </el-form-item>
+
+                <el-form-item label="自动对切题卡" label-width="168px">
+                  <el-checkbox
+                    v-model="formModel.autoAlignAnswerSheet"
+                  ></el-checkbox>
+                </el-form-item>
+              </el-space>
+            </div>
+
+            <div class="section-part">
+              <h4 class="section-part-title">数据分析设置</h4>
+              <el-row :gutter="20">
+                <el-col :span="8">
+                  <el-form-item
+                    label="及格分"
+                    prop="passingScore"
+                    label-width="110px"
+                  >
+                    <el-input-number
+                      v-model="formModel.passingScore"
+                      :min="0"
+                      :max="100"
+                      :step="1"
+                      :precision="0"
+                      :controls="false"
+                      step-strictly
+                      style="width: 200px"
+                    >
+                      <template #suffix>
+                        <span>%</span>
+                      </template>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item
+                    label="优秀分"
+                    prop="excellentScore"
+                    label-width="110px"
+                  >
+                    <el-input-number
+                      v-model="formModel.excellentScore"
+                      :min="0"
+                      :max="100"
+                      :step="1"
+                      :precision="0"
+                      :controls="false"
+                      step-strictly
+                      style="width: 200px"
+                    >
+                      <template #suffix>
+                        <span>%</span>
+                      </template>
+                    </el-input-number>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row :gutter="20">
+                <el-col :span="16">
+                  <el-form-item label="备注描述" label-width="110px">
+                    <el-input
+                      v-model="formModel.description"
+                      type="textarea"
+                      :rows="4"
+                      maxlength="999"
+                      placeholder="请输入备注描述"
+                    />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
         </div>
         <div class="form-actions">
           <el-button @click="goBack">返回</el-button>
@@ -456,65 +459,3 @@
     loadExamDetail();
   });
 </script>
-
-<style scoped>
-  .page-header {
-    margin-bottom: 20px;
-  }
-
-  .page-header h2 {
-    margin: 0;
-    font-size: 20px;
-    font-weight: 500;
-  }
-
-  .exam-form {
-    max-width: 1200px;
-  }
-
-  .form-section {
-    margin-bottom: 30px;
-    padding: 20px;
-    background: #fff;
-    border-radius: 6px;
-  }
-
-  .form-section h3 {
-    margin: 0 0 20px 0;
-    font-size: 16px;
-    font-weight: 500;
-    color: #333;
-  }
-
-  .section-sub-title {
-    margin: 10px 0;
-    font-weight: 500;
-    color: #999;
-  }
-
-  .section-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 20px;
-  }
-
-  .section-header h3 {
-    margin: 0;
-  }
-
-  .input-suffix {
-    margin-left: 8px;
-    color: #666;
-  }
-
-  .form-actions {
-    margin-top: 30px;
-    text-align: center;
-  }
-
-  .form-actions .el-button {
-    margin: 0 10px;
-    min-width: 100px;
-  }
-</style>

+ 1 - 1
src/views/student/StudentManage.vue

@@ -161,7 +161,7 @@
         </el-input-number>
       </el-form-item>
     </el-form>
-    <div class="box-justify">
+    <div class="part-action box-justify">
       <el-space wrap>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
         <el-button @click="onAdd">添加</el-button>