Ver código fonte

修改信息、答题开始页面显示分享时名称和备注、完整预览时显示分数

dusenyao 1 ano atrás
pai
commit
7b6ce0f536

+ 81 - 70
package-lock.json

@@ -12,7 +12,7 @@
         "@tinymce/tinymce-vue": "^3.2.8",
         "axios": "^1.6.8",
         "core-js": "^3.36.1",
-        "dompurify": "^3.0.11",
+        "dompurify": "^3.1.0",
         "element-ui": "^2.15.14",
         "hanzi-writer": "^3.6.1",
         "js-audio-recorder": "^1.0.7",
@@ -27,9 +27,9 @@
         "vuex": "^3.6.2"
       },
       "devDependencies": {
-        "@babel/core": "^7.24.3",
+        "@babel/core": "^7.24.4",
         "@babel/eslint-parser": "^7.24.1",
-        "@rushstack/eslint-patch": "^1.7.2",
+        "@rushstack/eslint-patch": "^1.10.2",
         "@types/md5": "^2.3.5",
         "@vue/cli-plugin-babel": "~5.0.8",
         "@vue/cli-plugin-eslint": "~5.0.8",
@@ -40,12 +40,12 @@
         "compression-webpack-plugin": "^6.1.2",
         "eslint": "^8.57.0",
         "eslint-plugin-prettier": "^5.1.3",
-        "eslint-plugin-vue": "^9.24.0",
+        "eslint-plugin-vue": "^9.24.1",
         "patch-package": "^8.0.0",
         "postcss-html": "^1.6.0",
         "prettier": "^3.2.5",
-        "sass": "^1.72.0",
-        "sass-loader": "^13.3.3",
+        "sass": "^1.74.1",
+        "sass-loader": "^14.1.1",
         "stylelint": "^15.11.0",
         "stylelint-config-recess-order": "^4.6.0",
         "stylelint-config-recommended-scss": "^14.0.0",
@@ -120,18 +120,18 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.24.3",
-      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.24.3.tgz",
-      "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.24.4.tgz",
+      "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.24.2",
-        "@babel/generator": "^7.24.1",
+        "@babel/generator": "^7.24.4",
         "@babel/helper-compilation-targets": "^7.23.6",
         "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helpers": "^7.24.1",
-        "@babel/parser": "^7.24.1",
+        "@babel/helpers": "^7.24.4",
+        "@babel/parser": "^7.24.4",
         "@babel/template": "^7.24.0",
         "@babel/traverse": "^7.24.1",
         "@babel/types": "^7.24.0",
@@ -143,6 +143,10 @@
       },
       "engines": {
         "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
       }
     },
     "node_modules/@babel/core/node_modules/@babel/compat-data": {
@@ -253,9 +257,9 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.1.tgz",
-      "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==",
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.4.tgz",
+      "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==",
       "dev": true,
       "dependencies": {
         "@babel/types": "^7.24.0",
@@ -573,9 +577,9 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.1.tgz",
-      "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==",
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.4.tgz",
+      "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==",
       "dev": true,
       "dependencies": {
         "@babel/template": "^7.24.0",
@@ -602,9 +606,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.1.tgz",
-      "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.4.tgz",
+      "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -2429,9 +2433,9 @@
       "dev": true
     },
     "node_modules/@rushstack/eslint-patch": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz",
-      "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==",
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz",
+      "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==",
       "dev": true
     },
     "node_modules/@sideway/address": {
@@ -5863,9 +5867,9 @@
       }
     },
     "node_modules/dompurify": {
-      "version": "3.0.11",
-      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.0.11.tgz",
-      "integrity": "sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.1.0.tgz",
+      "integrity": "sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA=="
     },
     "node_modules/domready": {
       "version": "1.0.8",
@@ -6144,9 +6148,9 @@
       }
     },
     "node_modules/eslint-plugin-vue": {
-      "version": "9.24.0",
-      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz",
-      "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==",
+      "version": "9.24.1",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.24.1.tgz",
+      "integrity": "sha512-wk3SuwmS1pZdcuJlokGYEi/buDOwD6KltvhIZyOnpJ/378dcQ4zchu9PAMbbLAaydCz1iYc5AozszcOOgZIIOg==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
@@ -6162,7 +6166,7 @@
         "node": "^14.17.0 || >=16.0.0"
       },
       "peerDependencies": {
-        "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+        "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
       }
     },
     "node_modules/eslint-plugin-vue/node_modules/globals": {
@@ -11985,9 +11989,9 @@
       "dev": true
     },
     "node_modules/sass": {
-      "version": "1.72.0",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.72.0.tgz",
-      "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==",
+      "version": "1.74.1",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.74.1.tgz",
+      "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==",
       "dev": true,
       "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",
@@ -12002,25 +12006,29 @@
       }
     },
     "node_modules/sass-loader": {
-      "version": "13.3.3",
-      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-13.3.3.tgz",
-      "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==",
+      "version": "14.1.1",
+      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-14.1.1.tgz",
+      "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==",
       "dev": true,
       "dependencies": {
         "neo-async": "^2.6.2"
       },
       "engines": {
-        "node": ">= 14.15.0"
+        "node": ">= 18.12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
       },
       "peerDependencies": {
-        "fibers": ">= 3.1.0",
+        "@rspack/core": "0.x || 1.x",
         "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
         "sass": "^1.3.0",
         "sass-embedded": "*",
         "webpack": "^5.0.0"
       },
       "peerDependenciesMeta": {
-        "fibers": {
+        "@rspack/core": {
           "optional": true
         },
         "node-sass": {
@@ -12031,6 +12039,9 @@
         },
         "sass-embedded": {
           "optional": true
+        },
+        "webpack": {
+          "optional": true
         }
       }
     },
@@ -15532,18 +15543,18 @@
       "dev": true
     },
     "@babel/core": {
-      "version": "7.24.3",
-      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.24.3.tgz",
-      "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.24.4.tgz",
+      "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==",
       "dev": true,
       "requires": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.24.2",
-        "@babel/generator": "^7.24.1",
+        "@babel/generator": "^7.24.4",
         "@babel/helper-compilation-targets": "^7.23.6",
         "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helpers": "^7.24.1",
-        "@babel/parser": "^7.24.1",
+        "@babel/helpers": "^7.24.4",
+        "@babel/parser": "^7.24.4",
         "@babel/template": "^7.24.0",
         "@babel/traverse": "^7.24.1",
         "@babel/types": "^7.24.0",
@@ -15636,9 +15647,9 @@
       }
     },
     "@babel/generator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.1.tgz",
-      "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==",
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.4.tgz",
+      "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==",
       "dev": true,
       "requires": {
         "@babel/types": "^7.24.0",
@@ -15869,9 +15880,9 @@
       }
     },
     "@babel/helpers": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.1.tgz",
-      "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==",
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.4.tgz",
+      "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==",
       "dev": true,
       "requires": {
         "@babel/template": "^7.24.0",
@@ -15892,9 +15903,9 @@
       }
     },
     "@babel/parser": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.1.tgz",
-      "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg=="
+      "version": "7.24.4",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.4.tgz",
+      "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg=="
     },
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
       "version": "7.22.15",
@@ -17175,9 +17186,9 @@
       "dev": true
     },
     "@rushstack/eslint-patch": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz",
-      "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==",
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz",
+      "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==",
       "dev": true
     },
     "@sideway/address": {
@@ -19971,9 +19982,9 @@
       }
     },
     "dompurify": {
-      "version": "3.0.11",
-      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.0.11.tgz",
-      "integrity": "sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.1.0.tgz",
+      "integrity": "sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA=="
     },
     "domready": {
       "version": "1.0.8",
@@ -20364,9 +20375,9 @@
       }
     },
     "eslint-plugin-vue": {
-      "version": "9.24.0",
-      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz",
-      "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==",
+      "version": "9.24.1",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.24.1.tgz",
+      "integrity": "sha512-wk3SuwmS1pZdcuJlokGYEi/buDOwD6KltvhIZyOnpJ/378dcQ4zchu9PAMbbLAaydCz1iYc5AozszcOOgZIIOg==",
       "dev": true,
       "requires": {
         "@eslint-community/eslint-utils": "^4.4.0",
@@ -24790,9 +24801,9 @@
       "dev": true
     },
     "sass": {
-      "version": "1.72.0",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.72.0.tgz",
-      "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==",
+      "version": "1.74.1",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.74.1.tgz",
+      "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==",
       "dev": true,
       "requires": {
         "chokidar": ">=3.0.0 <4.0.0",
@@ -24801,9 +24812,9 @@
       }
     },
     "sass-loader": {
-      "version": "13.3.3",
-      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-13.3.3.tgz",
-      "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==",
+      "version": "14.1.1",
+      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-14.1.1.tgz",
+      "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==",
       "dev": true,
       "requires": {
         "neo-async": "^2.6.2"

+ 6 - 6
package.json

@@ -12,7 +12,7 @@
     "@tinymce/tinymce-vue": "^3.2.8",
     "axios": "^1.6.8",
     "core-js": "^3.36.1",
-    "dompurify": "^3.0.11",
+    "dompurify": "^3.1.0",
     "element-ui": "^2.15.14",
     "hanzi-writer": "^3.6.1",
     "js-audio-recorder": "^1.0.7",
@@ -27,9 +27,9 @@
     "vuex": "^3.6.2"
   },
   "devDependencies": {
-    "@babel/core": "^7.24.3",
+    "@babel/core": "^7.24.4",
     "@babel/eslint-parser": "^7.24.1",
-    "@rushstack/eslint-patch": "^1.7.2",
+    "@rushstack/eslint-patch": "^1.10.2",
     "@types/md5": "^2.3.5",
     "@vue/cli-plugin-babel": "~5.0.8",
     "@vue/cli-plugin-eslint": "~5.0.8",
@@ -40,12 +40,12 @@
     "compression-webpack-plugin": "^6.1.2",
     "eslint": "^8.57.0",
     "eslint-plugin-prettier": "^5.1.3",
-    "eslint-plugin-vue": "^9.24.0",
+    "eslint-plugin-vue": "^9.24.1",
     "patch-package": "^8.0.0",
     "postcss-html": "^1.6.0",
     "prettier": "^3.2.5",
-    "sass": "^1.72.0",
-    "sass-loader": "^13.3.3",
+    "sass": "^1.74.1",
+    "sass-loader": "^14.1.1",
     "stylelint": "^15.11.0",
     "stylelint-config-recess-order": "^4.6.0",
     "stylelint-config-recommended-scss": "^14.0.0",

+ 27 - 7
src/views/exercise_questions/answer/components/StartQuestion.vue

@@ -1,9 +1,14 @@
 <template>
   <div class="start-question">
-    <div class="notice">答题须知</div>
+    <div class="name">{{ shareRecord.name }}</div>
+    <div class="memo">{{ shareRecord.memo }}</div>
+    <hr class="hr" />
     <div class="prompt">
-      <div>本练习题共{{ questionLength }}题,限时{{ answerTimeLimitMinute }}分钟</div>
-      <div>点击“开始答题”按钮进行作答,作答完毕后请点击“提交”按钮。</div>
+      <div>
+        本练习题共{{ questionLength }}题,限时{{
+          answerTimeLimitMinute
+        }}分钟点击“开始答题”按钮进行作答,作答完毕后请点击“提交”按钮。
+      </div>
     </div>
   </div>
 </template>
@@ -12,6 +17,10 @@
 export default {
   name: 'StartQuestion',
   props: {
+    shareRecord: {
+      type: Object,
+      required: true,
+    },
     questionLength: {
       type: Number,
       default: 0,
@@ -32,7 +41,7 @@ export default {
 .start-question {
   display: flex;
   flex-direction: column;
-  row-gap: 24px;
+  row-gap: 16px;
   align-items: center;
   justify-content: center;
   height: calc(100vh - 245px);
@@ -41,14 +50,25 @@ export default {
   background: #f7f7f7;
   border-radius: 4px;
 
-  .notice {
-    font-size: 40px;
+  .name {
+    font-size: 32px;
     font-weight: bold;
     color: $light-main-color;
   }
 
-  .prompt {
+  .memo {
     font-size: 24px;
+  }
+
+  .hr {
+    width: 600px;
+    border: none;
+    border-top: 1px solid #ebebeb;
+  }
+
+  .prompt {
+    font-weight: bold;
+    color: $light-main-color;
     text-align: center;
   }
 }

+ 21 - 2
src/views/exercise_questions/answer/index.vue

@@ -53,6 +53,7 @@
     <main class="main">
       <StartQuestion
         v-if="isStart"
+        :share-record="share_record"
         :question-length="questionList.length"
         :answer-time-limit-minute="answer_time_limit_minute"
         @startAnswer="startAnswer"
@@ -71,7 +72,7 @@
       </template>
     </main>
 
-    <footer class="footer" :style="{ justifyContent: isAnnotations ? 'space-between' : 'center' }">
+    <footer class="footer" :style="{ justifyContent: isAnnotations || isShow ? 'space-between' : 'center' }">
       <el-popover v-model="isPopover" placement="top-start" trigger="click">
         <!-- 学生查看批注 -->
         <div v-if="isEnable(remark.is_remarked) && !isTeacher" class="remark-container">
@@ -186,6 +187,10 @@
         </template>
       </div>
 
+      <div v-if="isShow && !isAnnotations" class="show-score_type">
+        本题 {{ `${currentQuestion.property.score} 分` }}
+      </div>
+
       <div v-if="isAnnotations" class="score_type">
         本题分数:{{
           question.score_type === scoreTypeList[0].value || currentQuestion.type === 'read'
@@ -256,6 +261,11 @@ export default {
       user_answer_record_info: {}, // 当前用户的答题记录信息
       correct_answer_show_mode: 1,
       scoreTypeList, // 分数类型列表
+      // 分享记录信息
+      share_record: {
+        name: '',
+        memo: '',
+      },
       // 问题列表
       questionList: [],
       // 当前问题
@@ -374,7 +384,7 @@ export default {
         GetShareRecordInfo({ share_record_id: this.share_record_id }).then(
           ({
             user_answer_record_info,
-            share_record: { exercise_id, answer_mode, answer_time_limit_minute, correct_answer_show_mode },
+            share_record: { exercise_id, answer_mode, answer_time_limit_minute, correct_answer_show_mode, name, memo },
           }) => {
             this.user_answer_record_info = user_answer_record_info;
             this.exercise_id = exercise_id;
@@ -384,6 +394,7 @@ export default {
             this.correct_answer_show_mode = correct_answer_show_mode;
             this.loading = false;
             this.answer_mode = answer_mode;
+            this.share_record = { name, memo };
             // 如果已经存在答题记录,则直接显示答题报告
             if (this.user_answer_record_info.is_exist_answer_record === 'true') {
               this.answer_record_id = this.user_answer_record_info.answer_record_id;
@@ -806,6 +817,14 @@ export default {
       padding: 9px 40px;
     }
 
+    // 显示模式下的分数样式
+    .show-score_type {
+      padding-right: 24px;
+      font-size: 14px;
+      font-weight: bold;
+      color: #000;
+    }
+
     .score_type {
       font-size: 14px;
       font-weight: bold;

+ 71 - 3
src/views/home/personal_question/components/CreateExercise.vue

@@ -7,7 +7,9 @@
         </el-form-item>
         <el-form-item label="标签">
           <div class="label-list">
-            <el-tag v-for="(item, i) in form.label_list" :key="`${item}${i}`" type="info" closable>{{ item }}</el-tag>
+            <el-tag v-for="(item, i) in form.label_list" :key="`${item}${i}`" type="info" closable @close="closeTag(i)">
+              {{ item }}
+            </el-tag>
             <el-button class="label-item" icon="el-icon-plus" circle @click="showVisible" />
           </div>
         </el-form-item>
@@ -37,7 +39,7 @@
 </template>
 
 <script>
-import { CreateExercise, GetLabelList } from '@/api/exercise';
+import { CreateExercise, GetLabelList, GetExerciseInfo, UpdateExercise } from '@/api/exercise';
 
 export default {
   name: 'CreateExercise',
@@ -46,6 +48,10 @@ export default {
       type: Boolean,
       default: false,
     },
+    currentExerciseId: {
+      type: String,
+      default: '',
+    },
   },
   data() {
     return {
@@ -68,10 +74,28 @@ export default {
       },
     };
   },
+  watch: {
+    dialogVisible(val) {
+      if (val) {
+        this.getExerciseInfo();
+      } else {
+        this.form = {
+          name: '',
+          label_list: [],
+          intro: '',
+        };
+      }
+    },
+  },
   created() {
     this.getLabelList();
   },
   methods: {
+    /**
+     * 标签搜索
+     * @param {string} queryString 搜索内容
+     * @param {Function} cb 回调函数
+     */
     querySearch(queryString, cb) {
       let label_list = this.label_list;
       let results = (queryString ? label_list.filter(this.createFilter(queryString)) : label_list).map((item) => {
@@ -79,6 +103,16 @@ export default {
       });
       cb(results);
     },
+    getExerciseInfo() {
+      if (!this.currentExerciseId) return;
+      GetExerciseInfo({ exercise_id: this.currentExerciseId }).then(({ exercise }) => {
+        this.form = {
+          name: exercise.name,
+          label_list: exercise.label_list,
+          intro: exercise.intro,
+        };
+      });
+    },
     createFilter(queryString) {
       return (label) => {
         return label.toLowerCase().indexOf(queryString.toLowerCase()) === 0;
@@ -91,6 +125,13 @@ export default {
       }
       this.visible = false;
     },
+    /**
+     * 删除标签
+     * @param {number} i 标签索引
+     */
+    closeTag(i) {
+      this.form.label_list.splice(i, 1);
+    },
     showVisible() {
       this.visible = true;
     },
@@ -104,11 +145,23 @@ export default {
     },
     dialogClose() {
       this.$emit('update:dialogVisible', false);
+      this.$emit('close');
     },
     createdExercise() {
       this.$refs.form.validate((valid) => {
         if (!valid) return false;
 
+        // 如果有当前练习题id,则为修改练习题
+        if (this.currentExerciseId) {
+          UpdateExercise({ id: this.currentExerciseId, ...this.form })
+            .then(() => {
+              this.$message.success('修改成功');
+              this.dialogClose();
+            })
+            .catch(() => {});
+          return;
+        }
+
         CreateExercise(this.form)
           .then(({ id }) => {
             this.$message.success('创建成功');
@@ -134,10 +187,25 @@ export default {
 }
 
 .label-list {
-  padding: 0 4px;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 4px;
+  padding: 4px;
   background-color: $fill-color;
   border-radius: 2px;
 
+  .el-tag {
+    display: flex;
+    align-items: center;
+    color: #000;
+    background-color: #fff;
+
+    :deep .el-tag__close {
+      font-size: 16px;
+      color: #000 !important;
+    }
+  }
+
   .el-button.label-item {
     width: 24px;
     height: 24px;

+ 20 - 1
src/views/home/personal_question/index.vue

@@ -25,6 +25,7 @@
 
         <el-table-column prop="operation" label="操作" fixed="right" width="300">
           <template slot-scope="{ row }">
+            <span class="link" @click="updateExercise(row.id)">信息</span>
             <span class="link" @click="showExercise(row.id)">查看</span>
             <span class="link" @click="$router.push({ path: '/exercise', query: { id: row.id } })">编辑</span>
             <span class="link" @click="share(row.id)">推送</span>
@@ -64,7 +65,11 @@
       </template>
     </HomeCommon>
 
-    <CreateExercise :dialog-visible.sync="dialogVisible" />
+    <CreateExercise
+      :current-exercise-id="currentExerciseId"
+      :dialog-visible.sync="dialogVisible"
+      @close="createExerciseClose"
+    />
     <ShareDialog :dialog-visible.sync="visibleShare" :exercise-id="exerciseId" @generateLink="generateLink" />
     <ExerciseLink :visible.sync="visibleLink" :share-data="shareData" />
   </div>
@@ -110,6 +115,7 @@ export default {
       visibleShare: false, // 分享弹窗
       visibleLink: false, // 练习题链接弹窗
       shareData: undefined, // 分享数据
+      currentExerciseId: '', // 当前练习题id
     };
   },
   methods: {
@@ -157,6 +163,19 @@ export default {
         this.getPageList();
       });
     },
+    /**
+     * 更新练习题
+     * @param {string} id 练习题id
+     */
+    updateExercise(id) {
+      this.dialogVisible = true;
+      this.currentExerciseId = id;
+    },
+    // 关闭创建练习题弹窗
+    createExerciseClose() {
+      this.currentExerciseId = '';
+      this.getPageList();
+    },
     share(id) {
       this.exerciseId = id;
       this.visibleShare = true;