提交 b8d0c4a6 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 b3a0067a
...@@ -19,15 +19,16 @@ ...@@ -19,15 +19,16 @@
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"countup.js": "^2.3.2", "countup.js": "^2.3.2",
"dayjs": "^1.11.6", "dayjs": "^1.11.6",
"element-plus": "^2.2.19", "element-plus": "^2.2.21",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"pinia": "^2.0.23", "pinia": "^2.0.23",
"qs": "^6.11.0", "qs": "^6.11.0",
"ua-parser-js": "^1.0.32", "ua-parser-js": "^1.0.32",
"video.js": "^7.20.3", "video.js": "^7.20.3",
"vue": "^3.2.41", "vue": "^3.2.45",
"vue-router": "^4.1.6" "vue-router": "^4.1.6",
"vuedraggable": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@rushstack/eslint-patch": "^1.2.0", "@rushstack/eslint-patch": "^1.2.0",
...@@ -45,10 +46,10 @@ ...@@ -45,10 +46,10 @@
"chalk": "^5.1.2", "chalk": "^5.1.2",
"eslint": "^8.26.0", "eslint": "^8.26.0",
"eslint-plugin-vue": "^9.7.0", "eslint-plugin-vue": "^9.7.0",
"sass": "^1.56.0", "sass": "^1.56.1",
"typescript": "~4.8.4", "typescript": "~4.8.4",
"unplugin-auto-import": "^0.11.4", "unplugin-auto-import": "^0.11.4",
"vite": "^3.2.2", "vite": "^3.2.3",
"vite-plugin-checker": "^0.5.1", "vite-plugin-checker": "^0.5.1",
"vue-tsc": "^1.0.9" "vue-tsc": "^1.0.9"
} }
...@@ -750,36 +751,36 @@ ...@@ -750,36 +751,36 @@
} }
}, },
"node_modules/@vue/compiler-core": { "node_modules/@vue/compiler-core": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
"integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==", "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
"dependencies": { "dependencies": {
"@babel/parser": "^7.16.4", "@babel/parser": "^7.16.4",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"source-map": "^0.6.1" "source-map": "^0.6.1"
} }
}, },
"node_modules/@vue/compiler-dom": { "node_modules/@vue/compiler-dom": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
"integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==", "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
"dependencies": { "dependencies": {
"@vue/compiler-core": "3.2.41", "@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"node_modules/@vue/compiler-sfc": { "node_modules/@vue/compiler-sfc": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
"integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==", "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
"dependencies": { "dependencies": {
"@babel/parser": "^7.16.4", "@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.41", "@vue/compiler-core": "3.2.45",
"@vue/compiler-dom": "3.2.41", "@vue/compiler-dom": "3.2.45",
"@vue/compiler-ssr": "3.2.41", "@vue/compiler-ssr": "3.2.45",
"@vue/reactivity-transform": "3.2.41", "@vue/reactivity-transform": "3.2.45",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"magic-string": "^0.25.7", "magic-string": "^0.25.7",
"postcss": "^8.1.10", "postcss": "^8.1.10",
...@@ -787,12 +788,12 @@ ...@@ -787,12 +788,12 @@
} }
}, },
"node_modules/@vue/compiler-ssr": { "node_modules/@vue/compiler-ssr": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
"integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==", "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.2.41", "@vue/compiler-dom": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"node_modules/@vue/devtools-api": { "node_modules/@vue/devtools-api": {
...@@ -825,60 +826,60 @@ ...@@ -825,60 +826,60 @@
} }
}, },
"node_modules/@vue/reactivity": { "node_modules/@vue/reactivity": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.45.tgz",
"integrity": "sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==", "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
"dependencies": { "dependencies": {
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"node_modules/@vue/reactivity-transform": { "node_modules/@vue/reactivity-transform": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
"integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==", "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
"dependencies": { "dependencies": {
"@babel/parser": "^7.16.4", "@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.41", "@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"magic-string": "^0.25.7" "magic-string": "^0.25.7"
} }
}, },
"node_modules/@vue/runtime-core": { "node_modules/@vue/runtime-core": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
"integrity": "sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==", "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
"dependencies": { "dependencies": {
"@vue/reactivity": "3.2.41", "@vue/reactivity": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"node_modules/@vue/runtime-dom": { "node_modules/@vue/runtime-dom": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
"integrity": "sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==", "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
"dependencies": { "dependencies": {
"@vue/runtime-core": "3.2.41", "@vue/runtime-core": "3.2.45",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"csstype": "^2.6.8" "csstype": "^2.6.8"
} }
}, },
"node_modules/@vue/server-renderer": { "node_modules/@vue/server-renderer": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
"integrity": "sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==", "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
"dependencies": { "dependencies": {
"@vue/compiler-ssr": "3.2.41", "@vue/compiler-ssr": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
}, },
"peerDependencies": { "peerDependencies": {
"vue": "3.2.41" "vue": "3.2.45"
} }
}, },
"node_modules/@vue/shared": { "node_modules/@vue/shared": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.45.tgz",
"integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
}, },
"node_modules/@vue/tsconfig": { "node_modules/@vue/tsconfig": {
"version": "0.1.3", "version": "0.1.3",
...@@ -1515,7 +1516,7 @@ ...@@ -1515,7 +1516,7 @@
}, },
"node_modules/csstype": { "node_modules/csstype": {
"version": "2.6.21", "version": "2.6.21",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz",
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
}, },
"node_modules/data-uri-to-buffer": { "node_modules/data-uri-to-buffer": {
...@@ -1673,9 +1674,9 @@ ...@@ -1673,9 +1674,9 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
}, },
"node_modules/element-plus": { "node_modules/element-plus": {
"version": "2.2.19", "version": "2.2.21",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.19.tgz", "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.21.tgz",
"integrity": "sha512-uN0gt9lUus/IHzu5J6vkbYoYJgUtU05osdtFv9RO27bHKOG5GN7dH6uA3OKfkQQ6R2sV8ZxY1rc9PH1X8Dgrow==", "integrity": "sha512-wZUePoXZ1zuCkzENK/8mn+mekuLJ9OoGYiudjUujzCf+T8HfOQl+TKQStwOkGBNk93fK8e9YdFIty4jH4AX6dg==",
"dependencies": { "dependencies": {
"@ctrl/tinycolor": "^3.4.1", "@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6", "@element-plus/icons-vue": "^2.0.6",
...@@ -3188,7 +3189,7 @@ ...@@ -3188,7 +3189,7 @@
}, },
"node_modules/magic-string": { "node_modules/magic-string": {
"version": "0.25.9", "version": "0.25.9",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"dependencies": { "dependencies": {
"sourcemap-codec": "^1.4.8" "sourcemap-codec": "^1.4.8"
...@@ -3987,9 +3988,9 @@ ...@@ -3987,9 +3988,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"node_modules/sass": { "node_modules/sass": {
"version": "1.56.0", "version": "1.56.1",
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.56.0.tgz", "resolved": "https://registry.npmmirror.com/sass/-/sass-1.56.1.tgz",
"integrity": "sha512-WFJ9XrpkcnqZcYuLRJh5qiV6ibQOR4AezleeEjTjMsCocYW59dEG19U3fwTTXxzi2Ed3yjPBp727hbbj53pHFw==", "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"chokidar": ">=3.0.0 <4.0.0", "chokidar": ">=3.0.0 <4.0.0",
...@@ -4122,6 +4123,11 @@ ...@@ -4122,6 +4123,11 @@
"resolved": "https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz", "resolved": "https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz",
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
}, },
"node_modules/sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
},
"node_modules/source-map": { "node_modules/source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
...@@ -4597,9 +4603,9 @@ ...@@ -4597,9 +4603,9 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "3.2.2", "version": "3.2.3",
"resolved": "https://registry.npmmirror.com/vite/-/vite-3.2.2.tgz", "resolved": "https://registry.npmmirror.com/vite/-/vite-3.2.3.tgz",
"integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==", "integrity": "sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"esbuild": "^0.15.9", "esbuild": "^0.15.9",
...@@ -4617,6 +4623,7 @@ ...@@ -4617,6 +4623,7 @@
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
}, },
"peerDependencies": { "peerDependencies": {
"@types/node": ">= 14",
"less": "*", "less": "*",
"sass": "*", "sass": "*",
"stylus": "*", "stylus": "*",
...@@ -4624,6 +4631,9 @@ ...@@ -4624,6 +4631,9 @@
"terser": "^5.4.0" "terser": "^5.4.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"less": { "less": {
"optional": true "optional": true
}, },
...@@ -4780,15 +4790,15 @@ ...@@ -4780,15 +4790,15 @@
"dev": true "dev": true
}, },
"node_modules/vue": { "node_modules/vue": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.45.tgz",
"integrity": "sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==", "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.2.41", "@vue/compiler-dom": "3.2.45",
"@vue/compiler-sfc": "3.2.41", "@vue/compiler-sfc": "3.2.45",
"@vue/runtime-dom": "3.2.41", "@vue/runtime-dom": "3.2.45",
"@vue/server-renderer": "3.2.41", "@vue/server-renderer": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"node_modules/vue-eslint-parser": { "node_modules/vue-eslint-parser": {
...@@ -4871,6 +4881,17 @@ ...@@ -4871,6 +4881,17 @@
"typescript": "*" "typescript": "*"
} }
}, },
"node_modules/vuedraggable": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz",
"integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
"dependencies": {
"sortablejs": "1.14.0"
},
"peerDependencies": {
"vue": "^3.0.1"
}
},
"node_modules/webpack-sources": { "node_modules/webpack-sources": {
"version": "3.2.3", "version": "3.2.3",
"resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
...@@ -5527,36 +5548,36 @@ ...@@ -5527,36 +5548,36 @@
} }
}, },
"@vue/compiler-core": { "@vue/compiler-core": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
"integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==", "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
"requires": { "requires": {
"@babel/parser": "^7.16.4", "@babel/parser": "^7.16.4",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"source-map": "^0.6.1" "source-map": "^0.6.1"
} }
}, },
"@vue/compiler-dom": { "@vue/compiler-dom": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
"integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==", "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
"requires": { "requires": {
"@vue/compiler-core": "3.2.41", "@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"@vue/compiler-sfc": { "@vue/compiler-sfc": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
"integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==", "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
"requires": { "requires": {
"@babel/parser": "^7.16.4", "@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.41", "@vue/compiler-core": "3.2.45",
"@vue/compiler-dom": "3.2.41", "@vue/compiler-dom": "3.2.45",
"@vue/compiler-ssr": "3.2.41", "@vue/compiler-ssr": "3.2.45",
"@vue/reactivity-transform": "3.2.41", "@vue/reactivity-transform": "3.2.45",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"magic-string": "^0.25.7", "magic-string": "^0.25.7",
"postcss": "^8.1.10", "postcss": "^8.1.10",
...@@ -5564,12 +5585,12 @@ ...@@ -5564,12 +5585,12 @@
} }
}, },
"@vue/compiler-ssr": { "@vue/compiler-ssr": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
"integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==", "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
"requires": { "requires": {
"@vue/compiler-dom": "3.2.41", "@vue/compiler-dom": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"@vue/devtools-api": { "@vue/devtools-api": {
...@@ -5589,57 +5610,57 @@ ...@@ -5589,57 +5610,57 @@
} }
}, },
"@vue/reactivity": { "@vue/reactivity": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.45.tgz",
"integrity": "sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==", "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
"requires": { "requires": {
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"@vue/reactivity-transform": { "@vue/reactivity-transform": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
"integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==", "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
"requires": { "requires": {
"@babel/parser": "^7.16.4", "@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.41", "@vue/compiler-core": "3.2.45",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"magic-string": "^0.25.7" "magic-string": "^0.25.7"
} }
}, },
"@vue/runtime-core": { "@vue/runtime-core": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
"integrity": "sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==", "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
"requires": { "requires": {
"@vue/reactivity": "3.2.41", "@vue/reactivity": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"@vue/runtime-dom": { "@vue/runtime-dom": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
"integrity": "sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==", "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
"requires": { "requires": {
"@vue/runtime-core": "3.2.41", "@vue/runtime-core": "3.2.45",
"@vue/shared": "3.2.41", "@vue/shared": "3.2.45",
"csstype": "^2.6.8" "csstype": "^2.6.8"
} }
}, },
"@vue/server-renderer": { "@vue/server-renderer": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
"integrity": "sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==", "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
"requires": { "requires": {
"@vue/compiler-ssr": "3.2.41", "@vue/compiler-ssr": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"@vue/shared": { "@vue/shared": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.45.tgz",
"integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
}, },
"@vue/tsconfig": { "@vue/tsconfig": {
"version": "0.1.3", "version": "0.1.3",
...@@ -6120,7 +6141,7 @@ ...@@ -6120,7 +6141,7 @@
}, },
"csstype": { "csstype": {
"version": "2.6.21", "version": "2.6.21",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz",
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
}, },
"data-uri-to-buffer": { "data-uri-to-buffer": {
...@@ -6238,9 +6259,9 @@ ...@@ -6238,9 +6259,9 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
}, },
"element-plus": { "element-plus": {
"version": "2.2.19", "version": "2.2.21",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.19.tgz", "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.21.tgz",
"integrity": "sha512-uN0gt9lUus/IHzu5J6vkbYoYJgUtU05osdtFv9RO27bHKOG5GN7dH6uA3OKfkQQ6R2sV8ZxY1rc9PH1X8Dgrow==", "integrity": "sha512-wZUePoXZ1zuCkzENK/8mn+mekuLJ9OoGYiudjUujzCf+T8HfOQl+TKQStwOkGBNk93fK8e9YdFIty4jH4AX6dg==",
"requires": { "requires": {
"@ctrl/tinycolor": "^3.4.1", "@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6", "@element-plus/icons-vue": "^2.0.6",
...@@ -7352,7 +7373,7 @@ ...@@ -7352,7 +7373,7 @@
}, },
"magic-string": { "magic-string": {
"version": "0.25.9", "version": "0.25.9",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"requires": { "requires": {
"sourcemap-codec": "^1.4.8" "sourcemap-codec": "^1.4.8"
...@@ -7970,9 +7991,9 @@ ...@@ -7970,9 +7991,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"sass": { "sass": {
"version": "1.56.0", "version": "1.56.1",
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.56.0.tgz", "resolved": "https://registry.npmmirror.com/sass/-/sass-1.56.1.tgz",
"integrity": "sha512-WFJ9XrpkcnqZcYuLRJh5qiV6ibQOR4AezleeEjTjMsCocYW59dEG19U3fwTTXxzi2Ed3yjPBp727hbbj53pHFw==", "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"chokidar": ">=3.0.0 <4.0.0", "chokidar": ">=3.0.0 <4.0.0",
...@@ -8075,6 +8096,11 @@ ...@@ -8075,6 +8096,11 @@
"socks": "^2.3.3" "socks": "^2.3.3"
} }
}, },
"sortablejs": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz",
"integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
},
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
...@@ -8456,9 +8482,9 @@ ...@@ -8456,9 +8482,9 @@
} }
}, },
"vite": { "vite": {
"version": "3.2.2", "version": "3.2.3",
"resolved": "https://registry.npmmirror.com/vite/-/vite-3.2.2.tgz", "resolved": "https://registry.npmmirror.com/vite/-/vite-3.2.3.tgz",
"integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==", "integrity": "sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"esbuild": "^0.15.9", "esbuild": "^0.15.9",
...@@ -8567,15 +8593,15 @@ ...@@ -8567,15 +8593,15 @@
"dev": true "dev": true
}, },
"vue": { "vue": {
"version": "3.2.41", "version": "3.2.45",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.41.tgz", "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.45.tgz",
"integrity": "sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==", "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
"requires": { "requires": {
"@vue/compiler-dom": "3.2.41", "@vue/compiler-dom": "3.2.45",
"@vue/compiler-sfc": "3.2.41", "@vue/compiler-sfc": "3.2.45",
"@vue/runtime-dom": "3.2.41", "@vue/runtime-dom": "3.2.45",
"@vue/server-renderer": "3.2.41", "@vue/server-renderer": "3.2.45",
"@vue/shared": "3.2.41" "@vue/shared": "3.2.45"
} }
}, },
"vue-eslint-parser": { "vue-eslint-parser": {
...@@ -8639,6 +8665,14 @@ ...@@ -8639,6 +8665,14 @@
"@volar/vue-typescript": "1.0.9" "@volar/vue-typescript": "1.0.9"
} }
}, },
"vuedraggable": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz",
"integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
"requires": {
"sortablejs": "1.14.0"
}
},
"webpack-sources": { "webpack-sources": {
"version": "3.2.3", "version": "3.2.3",
"resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
......
...@@ -25,15 +25,16 @@ ...@@ -25,15 +25,16 @@
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"countup.js": "^2.3.2", "countup.js": "^2.3.2",
"dayjs": "^1.11.6", "dayjs": "^1.11.6",
"element-plus": "^2.2.19", "element-plus": "^2.2.21",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"pinia": "^2.0.23", "pinia": "^2.0.23",
"qs": "^6.11.0", "qs": "^6.11.0",
"ua-parser-js": "^1.0.32", "ua-parser-js": "^1.0.32",
"video.js": "^7.20.3", "video.js": "^7.20.3",
"vue": "^3.2.41", "vue": "^3.2.45",
"vue-router": "^4.1.6" "vue-router": "^4.1.6",
"vuedraggable": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@rushstack/eslint-patch": "^1.2.0", "@rushstack/eslint-patch": "^1.2.0",
...@@ -51,10 +52,10 @@ ...@@ -51,10 +52,10 @@
"chalk": "^5.1.2", "chalk": "^5.1.2",
"eslint": "^8.26.0", "eslint": "^8.26.0",
"eslint-plugin-vue": "^9.7.0", "eslint-plugin-vue": "^9.7.0",
"sass": "^1.56.0", "sass": "^1.56.1",
"typescript": "~4.8.4", "typescript": "~4.8.4",
"unplugin-auto-import": "^0.11.4", "unplugin-auto-import": "^0.11.4",
"vite": "^3.2.2", "vite": "^3.2.3",
"vite-plugin-checker": "^0.5.1", "vite-plugin-checker": "^0.5.1",
"vue-tsc": "^1.0.9" "vue-tsc": "^1.0.9"
} }
......
...@@ -25,7 +25,7 @@ onMounted(() => { ...@@ -25,7 +25,7 @@ onMounted(() => {
<template> <template>
<AppCard title="查看实验指导书"> <AppCard title="查看实验指导书">
<template v-if="detail"> <template v-if="detail">
<el-descriptions class="descriptions-box"> <el-descriptions>
<el-descriptions-item label="实验指导书名称:">{{ detail.name }}</el-descriptions-item> <el-descriptions-item label="实验指导书名称:">{{ detail.name }}</el-descriptions-item>
<el-descriptions-item label="文件大小:">{{ detail.size_name }}</el-descriptions-item> <el-descriptions-item label="文件大小:">{{ detail.size_name }}</el-descriptions-item>
<el-descriptions-item label="观看次数:">{{ detail.pv }}</el-descriptions-item> <el-descriptions-item label="观看次数:">{{ detail.pv }}</el-descriptions-item>
......
...@@ -37,7 +37,11 @@ const form = reactive<ExperimentCreateItem>({ ...@@ -37,7 +37,11 @@ const form = reactive<ExperimentCreateItem>({
type: '', type: '',
score: 100, score: 100,
teachers_id: '', teachers_id: '',
teachers_ids: [] teachers_ids: [],
purpose: '',
requirements: '',
content: '',
procedure: ''
}) })
watchEffect(() => { watchEffect(() => {
if (!props.data) return if (!props.data) return
...@@ -108,7 +112,7 @@ function handleUpdate(params: ExperimentCreateItem) { ...@@ -108,7 +112,7 @@ function handleUpdate(params: ExperimentCreateItem) {
<template> <template>
<el-dialog :title="title" :close-on-click-modal="false" width="600px" @update:modelValue="$emit('update:modelValue')"> <el-dialog :title="title" :close-on-click-modal="false" width="600px" @update:modelValue="$emit('update:modelValue')">
<el-form ref="formRef" :model="form" :rules="rules" label-width="150px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="145px">
<el-form-item label="实验所属部门/学校" prop="organ_id"> <el-form-item label="实验所属部门/学校" prop="organ_id">
<el-select v-model="form.organ_id" style="width: 100%" :disabled="isUpdate" @change="handleOrgChange"> <el-select v-model="form.organ_id" style="width: 100%" :disabled="isUpdate" @change="handleOrgChange">
<el-option v-for="item in organizations" :key="item.id" :label="item.name" :value="item.id"></el-option> <el-option v-for="item in organizations" :key="item.id" :label="item.name" :value="item.id"></el-option>
...@@ -138,6 +142,42 @@ function handleUpdate(params: ExperimentCreateItem) { ...@@ -138,6 +142,42 @@ function handleUpdate(params: ExperimentCreateItem) {
<el-form-item label="实验总成绩" prop="score"> <el-form-item label="实验总成绩" prop="score">
<el-input-number v-model="form.score" :min="1" :max="150" step-strictly style="width: 100%" /> <el-input-number v-model="form.score" :min="1" :max="150" step-strictly style="width: 100%" />
</el-form-item> </el-form-item>
<el-form-item label="实验目的" prop="purpose">
<el-input
v-model="form.purpose"
:autosize="{ minRows: 4 }"
type="textarea"
maxlength="200"
show-word-limit
placeholder="请输入实验目的" />
</el-form-item>
<el-form-item label="实验要求" prop="requirements">
<el-input
v-model="form.requirements"
:autosize="{ minRows: 4 }"
type="textarea"
maxlength="200"
show-word-limit
placeholder="请输入实验要求" />
</el-form-item>
<el-form-item label="实验内容及原理" prop="content">
<el-input
v-model="form.content"
:autosize="{ minRows: 4 }"
type="textarea"
maxlength="200"
show-word-limit
placeholder="请输入实验内容及原理" />
</el-form-item>
<el-form-item label="实验步骤及过程" prop="procedure">
<el-input
v-model="form.procedure"
:autosize="{ minRows: 4 }"
type="textarea"
maxlength="200"
show-word-limit
placeholder="请输入实验步骤及过程" />
</el-form-item>
<el-form-item label="有效状态" prop="status"> <el-form-item label="有效状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio v-for="item in status" :key="item.id" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item in status" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
......
<script setup lang="ts">
import type { FormInstance } from 'element-plus'
import type { ExperimentItem } from '../types'
import { Plus } from '@element-plus/icons-vue'
import { gradeRuleList } from '@/utils/dictionary'
interface Props {
data: ExperimentItem
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update'): void
(e: 'update:modelValue', visible: boolean): void
}>()
const formRef = $ref<FormInstance>()
const form = reactive({
is_show: 1,
rule_list: [
{
id: '232',
name: '实验报告',
type: 1,
percent: 100,
rule_mode: 1
}
]
})
// 添加
function handleAdd() {
form.rule_list.push({ id: '0', name: '', type: undefined, percent: 100, rule_mode: 1 })
}
// 删除
function handleRemove(index: number) {
form.rule_list.splice(index, 1)
}
// 提交
function handleSubmit() {
formRef?.validate().then(() => {
console.log(1)
})
}
// 当前评分方法
function currentRuleNames(value: number) {
const typeList = form.rule_list.map(item => item.type)
return gradeRuleList.filter(item => {
return item.value === value || item.value === 5 || !typeList.includes(item.value)
})
}
</script>
<template>
<el-dialog
title="编辑实验成绩规则"
:close-on-click-modal="false"
width="800px"
@update:modelValue="$emit('update:modelValue')">
<el-form ref="formRef" :model="form" label-suffix=":">
<el-form-item label="实验名称">{{ data?.name }}</el-form-item>
<el-form-item label="是否允许查看成绩明细" prop="is_show">
<el-radio-group v-model="form.is_show">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-row justify="space-between" style="width: 100%">
<p>实验成绩规则:</p>
<el-button type="primary" :icon="Plus" @click="handleAdd"></el-button>
</el-row>
<el-table :data="form.rule_list" row-key="id">
<el-table-column prop="name">
<template #default="{ row }">
<el-input v-model="row.name" style="width: 100%" v-if="row.type === 5" />
<el-select v-model="row.type" :disabled="row.type === 1" style="width: 100%" v-else>
<el-option v-for="item in currentRuleNames(row.type)" :key="item.value" v-bind="item"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="percent" align="center" width="200">
<template #default="{ row }"><el-input-number v-model="row.percent" /> %</template>
</el-table-column>
<el-table-column prop="rule_mode">
<template #default="{ row }">
<el-radio-group v-model="row.rule_mode">
<el-radio :label="1">手工评分</el-radio>
<el-radio :label="2" v-if="[2, 3].includes(row.type)">自动评分</el-radio>
</el-radio-group>
</template>
</el-table-column>
<el-table-column prop="rule_mode" align="center" width="90">
<template #default="{ $index }">
<el-button text type="primary" @click="handleRemove($index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<el-row justify="center">
<el-button type="primary" round auto-insert-space @click="handleSubmit">保存</el-button>
<el-button round auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button>
</el-row>
</el-dialog>
</template>
<script setup lang="ts">
import type { Component } from 'vue'
import { Delete } from '@element-plus/icons-vue'
import { ElMessageBox } from 'element-plus'
import draggable from 'vuedraggable'
const ReportDesignContent = defineAsyncComponent(() => import('./ReportDesignContent.vue'))
const ReportDesignAttachment = defineAsyncComponent(() => import('./ReportDesignAttachment.vue'))
const ReportDesignQuestion = defineAsyncComponent(() => import('./ReportDesignQuestion.vue'))
const ReportDesignPaper = defineAsyncComponent(() => import('./ReportDesignPaper.vue'))
interface Props {
modelValue: any[]
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update:modelValue', data: any[]): void
}>()
let datalist = $ref<any[]>([])
watchEffect(() => {
datalist = [...props.modelValue] || []
})
function getComponent(type: number) {
const map: Record<number, Component> = {
1: ReportDesignContent,
2: ReportDesignAttachment,
3: ReportDesignQuestion,
4: ReportDesignPaper
}
return map[type]
}
// 添加
function handleAdd(type: number) {
datalist.unshift({ type })
}
// 删除
function handleRemove(index: number) {
ElMessageBox.confirm('删除组件将导致报告分值的变化,请确认是否删除组件?', '提示').then(() => {
datalist.splice(index, 1)
})
}
function handleChange(data: any, index: number) {
datalist[index] = data
emit('update:modelValue', datalist)
}
</script>
<template>
<div class="report-design">
<div class="report-design-hd">
<el-button-group>
<el-button type="primary" @click="handleAdd(1)">添加内容组件</el-button>
<el-button type="primary" @click="handleAdd(2)">添加附件组件</el-button>
<el-button type="primary" @click="handleAdd(3)">添加思考题组件</el-button>
<el-button type="primary" @click="handleAdd(4)">添加试卷组件</el-button>
</el-button-group>
</div>
<div class="report-design-bd">
<draggable v-model="datalist" item-key="id">
<template #item="{ element, index }">
<div class="report-design-item-card">
<component
:is="getComponent(element.type)"
:data="element"
@change="(data:any) => handleChange(data, index)" />
<el-button type="danger" :icon="Delete" circle @click="handleRemove(index)" />
</div>
</template>
</draggable>
</div>
</div>
</template>
<style lang="scss">
.report-design-item-card {
display: flex;
align-items: center;
.report-design-item {
flex: 1;
margin-right: 20px;
}
}
.report-design-item {
position: relative;
margin: 20px 0;
padding: 10px;
background-color: #e8eff7;
border: 1px solid #bbb;
border-radius: 6px;
}
</style>
<script setup lang="ts">
interface Props {
data: any
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'change', data: any): void
}>()
const form = reactive({
name: '',
type: 1,
categories: [],
rule_mode: 1,
score: 10,
min_score: 0,
has_score: 0,
no_score: 0
})
watchEffect(() => {
const score = props.data.score ? parseFloat(props.data.score) : 0
const minScore = props.data.min_score ? parseFloat(props.data.min_score) : 0
const hasScore = props.data.has_score ? parseFloat(props.data.has_score) : 0
const noScore = props.data.no_score ? parseFloat(props.data.no_score) : 0
Object.assign(form, props.data, { score, min_score: minScore, has_score: hasScore, no_score: noScore })
})
watch(form, value => emit('change', value), { deep: true })
</script>
<template>
<div class="report-design-item">
<el-form :model="form" label-suffix=":">
<el-row :gutter="40">
<el-col :span="6">
<el-form-item label="附件组件名称" prop="name" label-width="130px">
<el-input v-model="form.name" placeholder="例:实验源代码程序包" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="分值" prop="score">
<el-input-number :min="0" v-model="form.score" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="评分规则" prop="rule_mode">
<el-radio-group v-model="form.rule_mode">
<el-radio :label="1">人工评分</el-radio>
<el-radio :label="2">自动评分</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最低分" prop="min_score">
<el-input-number :min="0" v-model="form.min_score" v-if="form.rule_mode === 1" />
<template v-else>
<el-form-item label="有附件" label-width="auto" style="margin-right: 10px; margin-bottom: 10px">
<el-input-number :min="0" v-model="form.has_score" />
</el-form-item>
<el-form-item label="无附件" label-width="auto" style="margin-bottom: 10px">
<el-input-number :min="0" v-model="form.no_score" />
</el-form-item>
</template>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="附件类型" prop="categories" label-width="130px">
<el-checkbox-group v-model="form.categories">
<el-checkbox :label="1">实验截图</el-checkbox>
<el-checkbox :label="2">本地文件</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
</div>
</template>
<script setup lang="ts">
interface Props {
data: any
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'change', data: any): void
}>()
const form = reactive({ name: '', type: 1, notice_message: '', rule_mode: 1, score: 10, min_score: 0 })
watchEffect(() => {
const score = props.data.score ? parseFloat(props.data.score) : 0
const minScore = props.data.min_score ? parseFloat(props.data.min_score) : 0
Object.assign(form, props.data, { score, min_score: minScore })
})
watch(form, value => emit('change', value), { deep: true })
</script>
<template>
<div class="report-design-item">
<el-form :model="form" label-suffix=":">
<el-row :gutter="40">
<el-col :span="6">
<el-form-item label="内容组件名称" prop="name" label-width="130px">
<el-input v-model="form.name" placeholder="例:实验目的" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="分值" prop="score">
<el-input-number :min="0" v-model="form.score" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="评分规则" prop="rule_mode">
<el-radio-group v-model="form.rule_mode">
<el-radio :label="1">人工评分</el-radio>
<!-- <el-radio :label="2">自动评分</el-radio> -->
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最低分" prop="min_score">
<el-input-number :min="0" v-model="form.min_score" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="组件提示信息" prop="notice_message" label-width="130px">
<el-input
type="textarea"
v-model="form.notice_message"
:autosize="{ minRows: 4 }"
show-word-limit
maxlength="200" />
</el-form-item>
</el-form>
</div>
</template>
<script setup lang="ts">
interface Props {
data: any
}
const props = defineProps<Props>()
const form = reactive({ name: '', type: 1, notice_message: '', rule_mode: 1, score: 10, min_score: 0 })
watchEffect(() => {
const score = props.data.score ? parseFloat(props.data.score) : 0
const minScore = props.data.min_score ? parseFloat(props.data.min_score) : 0
Object.assign(form, props.data, { score, min_score: minScore })
})
</script>
<template>
<div class="report-design-item">
<el-form :model="form" label-suffix=":">
<el-row :gutter="40">
<el-col :span="6">
<el-form-item label="试卷组件名称" prop="name" label-width="130px">
<el-input v-model="form.name" placeholder="例:商业数据分析基础理论" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="分值" prop="score">
<el-input-number :min="0" v-model="form.score" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="评分规则" prop="rule_mode">
<el-radio-group v-model="form.rule_mode">
<el-radio :label="1">人工评分</el-radio>
<el-radio :label="2">自动评分</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最低分" prop="min_score">
<el-input-number :min="0" v-model="form.min_score" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="试卷组卷说明" prop="notice_message" label-width="130px">
<el-input
type="textarea"
v-model="form.notice_message"
:autosize="{ minRows: 4 }"
show-word-limit
maxlength="200" />
</el-form-item>
</el-form>
</div>
</template>
<script setup lang="ts">
interface Props {
data: any
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'change', data: any): void
}>()
const form = reactive({ name: '', type: 1, question_stem: '', rule_mode: 1, score: 10, min_score: 0 })
watchEffect(() => {
const score = props.data.score ? parseFloat(props.data.score) : 0
const minScore = props.data.min_score ? parseFloat(props.data.min_score) : 0
Object.assign(form, props.data, { score, min_score: minScore })
})
watch(form, value => emit('change', value), { deep: true })
</script>
<template>
<div class="report-design-item">
<el-form :model="form" label-suffix=":">
<el-row :gutter="40">
<el-col :span="6">
<el-form-item label="思考题组件名称" prop="name" label-width="130px">
<el-input v-model="form.name" placeholder="例:实验扩展思考" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="分值" prop="score">
<el-input-number :min="0" v-model="form.score" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="评分规则" prop="rule_mode">
<el-radio-group v-model="form.rule_mode">
<el-radio :label="1">人工评分</el-radio>
<!-- <el-radio :label="2">自动评分</el-radio> -->
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最低分" prop="min_score">
<el-input-number :min="0" v-model="form.min_score" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="思考题题干内容" prop="question_stem" label-width="130px">
<el-input
type="textarea"
v-model="form.question_stem"
:autosize="{ minRows: 4 }"
show-word-limit
maxlength="200" />
</el-form-item>
</el-form>
</div>
</template>
<script setup lang="ts">
import { reportScoreRule } from '@/utils/dictionary'
interface Props {
data: any
}
const props = defineProps<Props>()
const teacherText = $computed(() => {
if (!props.data) return ''
return props.data.teacher.map(item => item.name).join('、')
})
</script>
<template>
<el-dialog title="预览" class="report-preview">
<h1>实验报告</h1>
<el-form label-suffix=":">
<el-row>
<el-col :span="12">
<el-form-item label="课程名称">{{ data.course_name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实验名称">{{ data.name }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="实验地点"></el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实验日期"></el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="实验类型">{{ data.type_name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指导教师">{{ teacherText }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="专业"></el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="班级"></el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="姓名"></el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学号"></el-form-item>
</el-col>
</el-row>
<el-divider />
<p class="total-score">总分:{{ data.score }}</p>
<el-form-item v-for="(item, index) in data.detail_list" :key="item.id">
<div class="form-hd">
<h3>{{ index + 1 }}{{ item.name }}</h3>
<p class="score">{{ item.score }}</p>
<p class="rule-mode">{{ reportScoreRule[item.rule_mode] }}</p>
</div>
<el-input
type="textarea"
readonly
:autosize="{ minRows: 6 }"
:value="item.notice_message || item.question_stem" />
</el-form-item>
</el-form>
<el-row justify="center">
<el-button type="primary" round auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button>
</el-row>
</el-dialog>
</template>
<style lang="scss">
.report-preview {
h1 {
font-size: 24px;
text-align: center;
padding-bottom: 30px;
}
.total-score {
text-align: right;
padding-right: 100px;
}
.form-hd {
display: flex;
width: 100%;
font-size: 14px;
font-weight: bold;
h3 {
flex: 1;
}
.rule-mode {
width: 100px;
text-align: right;
}
}
}
</style>
...@@ -9,7 +9,8 @@ export const routes: Array<RouteRecordRaw> = [ ...@@ -9,7 +9,8 @@ export const routes: Array<RouteRecordRaw> = [
children: [ children: [
{ path: 'experiment', component: () => import('./views/Index.vue') }, { path: 'experiment', component: () => import('./views/Index.vue') },
{ path: 'experiment/:id', component: () => import('./views/View.vue'), props: true }, { path: 'experiment/:id', component: () => import('./views/View.vue'), props: true },
{ path: 'experiment/group/:id', component: () => import('./views/Group.vue'), props: true } { path: 'experiment/group/:id', component: () => import('./views/Group.vue'), props: true },
{ path: 'experiment/report/:id', component: () => import('./views/Report.vue'), props: true }
] ]
} }
] ]
...@@ -26,6 +26,10 @@ export interface ExperimentItem { ...@@ -26,6 +26,10 @@ export interface ExperimentItem {
updated_operator: string updated_operator: string
updated_operator_name: string updated_operator_name: string
updated_time: string updated_time: string
purpose: string
requirements: string
content: string
procedure: string
} }
export interface ExperimentCreateItem { export interface ExperimentCreateItem {
...@@ -39,6 +43,10 @@ export interface ExperimentCreateItem { ...@@ -39,6 +43,10 @@ export interface ExperimentCreateItem {
score: number score: number
teachers_id: string teachers_id: string
teachers_ids?: string[] teachers_ids?: string[]
purpose: string
requirements: string
content: string
procedure: string
} }
export interface ClassItem { export interface ClassItem {
......
...@@ -63,7 +63,7 @@ function handleRemoveStudent(row: StudentItem) { ...@@ -63,7 +63,7 @@ function handleRemoveStudent(row: StudentItem) {
<template> <template>
<AppCard title="实验管理"> <AppCard title="实验管理">
<el-descriptions class="descriptions-box" :column="2" v-if="detail"> <el-descriptions :column="2" v-if="detail">
<el-descriptions-item label="实验名称:">{{ detail.experiment_name }}</el-descriptions-item> <el-descriptions-item label="实验名称:">{{ detail.experiment_name }}</el-descriptions-item>
<el-descriptions-item label="实验课程:">{{ detail.course_name }}</el-descriptions-item> <el-descriptions-item label="实验课程:">{{ detail.course_name }}</el-descriptions-item>
<el-descriptions-item label="小组名称:">{{ detail.name }}</el-descriptions-item> <el-descriptions-item label="小组名称:">{{ detail.name }}</el-descriptions-item>
...@@ -95,6 +95,5 @@ function handleRemoveStudent(row: StudentItem) { ...@@ -95,6 +95,5 @@ function handleRemoveStudent(row: StudentItem) {
<SelectStudentDialog <SelectStudentDialog
v-model="selectStudentVisible" v-model="selectStudentVisible"
@update="handleRefetch" @update="handleRefetch"
v-if="selectStudentVisible" v-if="selectStudentVisible"></SelectStudentDialog>
></SelectStudentDialog>
</template> </template>
...@@ -8,6 +8,7 @@ import { useGetCourseExperimentList } from '../composables/useGetCourseExperimen ...@@ -8,6 +8,7 @@ import { useGetCourseExperimentList } from '../composables/useGetCourseExperimen
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
const FormDialog = defineAsyncComponent(() => import('../components/FormDialog.vue')) const FormDialog = defineAsyncComponent(() => import('../components/FormDialog.vue'))
const GradeRulesDialog = defineAsyncComponent(() => import('../components/GradeRulesDialog.vue'))
// 数据状态 // 数据状态
const status = useMapStore().getMapValuesByKey('system_status') const status = useMapStore().getMapValuesByKey('system_status')
...@@ -113,6 +114,12 @@ function handleUpdate(row: ExperimentItem) { ...@@ -113,6 +114,12 @@ function handleUpdate(row: ExperimentItem) {
function onUpdateSuccess() { function onUpdateSuccess() {
appList?.refetch() appList?.refetch()
} }
let gradeRulesDialogVisible = $ref(false)
function handleUpdateGradeRules(row: ExperimentItem) {
rowData.value = row
gradeRulesDialogVisible = true
}
</script> </script>
<template> <template>
...@@ -125,6 +132,13 @@ function onUpdateSuccess() { ...@@ -125,6 +132,13 @@ function onUpdateSuccess() {
</template> </template>
<template #table-x="{ row }: { row: ExperimentItem }"> <template #table-x="{ row }: { row: ExperimentItem }">
<el-button type="info" round style="width: 132px; margin-bottom: 12px" @click="handleUpdateGradeRules(row)"
>编辑成绩规则</el-button
><br />
<el-button type="info" round style="width: 132px; margin-bottom: 12px">
<router-link :to="`/admin/lab/experiment/report/${row.id}`" target="_blank">编辑报告规则</router-link>
</el-button>
<br />
<el-button type="primary" round v-permission="'v1-backend-experiment-view'"> <el-button type="primary" round v-permission="'v1-backend-experiment-view'">
<router-link :to="`/admin/lab/experiment/${row.id}`" target="_blank">查看</router-link> <router-link :to="`/admin/lab/experiment/${row.id}`" target="_blank">查看</router-link>
</el-button> </el-button>
...@@ -138,4 +152,10 @@ function onUpdateSuccess() { ...@@ -138,4 +152,10 @@ function onUpdateSuccess() {
</AppList> </AppList>
</AppCard> </AppCard>
<FormDialog v-model="dialogVisible" :data="rowData" @update="onUpdateSuccess" v-if="dialogVisible"></FormDialog> <FormDialog v-model="dialogVisible" :data="rowData" @update="onUpdateSuccess" v-if="dialogVisible"></FormDialog>
<!-- 编辑实验成绩规则 -->
<GradeRulesDialog
v-model="gradeRulesDialogVisible"
:data="rowData"
@update="onUpdateSuccess"
v-if="gradeRulesDialogVisible && rowData"></GradeRulesDialog>
</template> </template>
<script setup lang="ts">
import type { ExperimentItem } from '../types'
import { ElMessageBox } from 'element-plus'
import ReportDesign from '../components/ReportDesign.vue'
import { getExperiment } from '../api'
const ReportPreview = defineAsyncComponent(() => import('../components/ReportPreview.vue'))
interface Props {
id: string
}
const props = defineProps<Props>()
let detail = $ref<ExperimentItem>()
const teacherText = $computed(() => {
if (!detail) return ''
return detail.teacher.map(item => item.name).join('、')
})
function fetchInfo() {
getExperiment({ experiment_id: props.id }).then(res => {
detail = res.data.info
})
}
const form = reactive({
switch: true,
detail_list: [
{
id: '233434343',
name: '实验目的',
type: 1,
notice_message: '好好学习天线向上',
rule_mode: 1,
score: '10.00',
min_score: '5.00'
},
{
id: '233434344',
name: '实验附件',
type: 2,
rule_mode: 2,
score: '10.00',
min_score: '5.00',
categories: [1, 2],
has_score: '8.00',
no_score: '5.00'
},
{
id: '233434344',
name: '思考题',
type: 3,
rule_mode: 1,
score: '10.00',
min_score: '5.00',
question_stem: '这是思考题的题干'
}
]
})
onMounted(() => fetchInfo())
// 保存
function handleSubmit() {}
// 关闭
function handleClose() {
ElMessageBox.confirm('此操作将不做任何修改,确认关闭该页面?', '提示').then(() => {
window.close()
})
}
// 预览
let previewVisible = $ref(false)
function handlePreview() {
previewVisible = true
}
</script>
<template>
<AppCard title="实验报告规则设置">
<el-form :model="form" label-suffix=":" v-if="detail">
<el-row>
<el-col :span="8">
<el-form-item label="实验名称">{{ detail.name }}</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实验课程名称">{{ detail.course_name }}</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所属机构/学校">{{ detail.organ_id_name }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="实验类型">{{ detail.type_name }}</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :span="3" label="指导教师">{{ teacherText }}</el-form-item>
</el-col>
</el-row>
<el-form-item label="实验报告提交方式" prop="switch">
<el-switch
v-model="form.switch"
active-text="上传文件"
inactive-text="在线填写"
style="--el-switch-on-color: #ba143e; --el-switch-off-color: #ba143e" />
</el-form-item>
<ReportDesign v-model="form.detail_list"></ReportDesign>
</el-form>
<el-row justify="center">
<el-space :size="40">
<el-button auto-insert-space @click="handleClose">关闭</el-button>
<el-button type="primary" auto-insert-space @click="handleSubmit">保存</el-button>
<el-button type="primary" auto-insert-space @click="handlePreview">预览</el-button>
</el-space>
</el-row>
<ReportPreview v-model="previewVisible" :data="{ ...detail, ...form }"></ReportPreview>
</AppCard>
</template>
...@@ -18,6 +18,11 @@ const props = defineProps<Props>() ...@@ -18,6 +18,11 @@ const props = defineProps<Props>()
let detail = $ref<ExperimentItem | null>(null) let detail = $ref<ExperimentItem | null>(null)
provide('detail', $$(detail)) provide('detail', $$(detail))
const teacherText = $computed(() => {
if (!detail) return ''
return detail.teacher.map(item => item.name).join('、')
})
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 列表配置 // 列表配置
const listOptions = { const listOptions = {
...@@ -74,11 +79,24 @@ function handleRemoveClass(row: ClassItem) { ...@@ -74,11 +79,24 @@ function handleRemoveClass(row: ClassItem) {
<template> <template>
<AppCard title="实验管理"> <AppCard title="实验管理">
<el-descriptions class="descriptions-box" v-if="detail"> <el-descriptions title="基本信息" v-if="detail">
<el-descriptions-item label="实验名称:">{{ detail.name }}</el-descriptions-item> <template #extra>
<el-button type="primary">查看成绩规则</el-button>
<el-button type="primary">查看报告规则</el-button>
</template>
<el-descriptions-item :span="3" label="实验名称:">{{ detail.name }}</el-descriptions-item>
<el-descriptions-item label="实验课程:">{{ detail.course_name }}</el-descriptions-item> <el-descriptions-item label="实验课程:">{{ detail.course_name }}</el-descriptions-item>
<el-descriptions-item label="所属机构/学校:">{{ detail.organ_id_name }}</el-descriptions-item> <el-descriptions-item label="所属机构/学校:">{{ detail.organ_id_name }}</el-descriptions-item>
<el-descriptions-item label="实验总成绩:">{{ detail.score }}</el-descriptions-item>
<el-descriptions-item label="实验类型:">{{ detail.type_name }}</el-descriptions-item>
<el-descriptions-item :span="2" label="实验学时:">{{ detail.length }}学时</el-descriptions-item>
<el-descriptions-item :span="3" label="指导教师:">{{ teacherText }}</el-descriptions-item>
<el-descriptions-item :span="3" label="实验目的:">{{ detail.purpose }}</el-descriptions-item>
<el-descriptions-item :span="3" label="实验要求:">{{ detail.requirements }}</el-descriptions-item>
<el-descriptions-item :span="3" label="实验内容及原理:">{{ detail.content }}</el-descriptions-item>
<el-descriptions-item :span="3" label="实验步骤及过程:">{{ detail.procedure }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<el-divider />
<AppList v-bind="listOptions" ref="appList"> <AppList v-bind="listOptions" ref="appList">
<template #header-buttons> <template #header-buttons>
<el-button <el-button
...@@ -116,12 +134,10 @@ function handleRemoveClass(row: ClassItem) { ...@@ -116,12 +134,10 @@ function handleRemoveClass(row: ClassItem) {
<StudentGroupDialog <StudentGroupDialog
v-model="studentGroupVisible" v-model="studentGroupVisible"
:data="rowData" :data="rowData"
v-if="studentGroupVisible && rowData" v-if="studentGroupVisible && rowData"></StudentGroupDialog>
></StudentGroupDialog>
<!-- 查看学生 --> <!-- 查看学生 -->
<StudentListDialog <StudentListDialog
v-model="studentListVisible" v-model="studentListVisible"
:data="rowData" :data="rowData"
v-if="studentListVisible && rowData" v-if="studentListVisible && rowData"></StudentListDialog>
></StudentListDialog>
</template> </template>
...@@ -36,7 +36,7 @@ onMounted(() => { ...@@ -36,7 +36,7 @@ onMounted(() => {
<template> <template>
<AppCard title="查看实验操作视频"> <AppCard title="查看实验操作视频">
<template v-if="detail"> <template v-if="detail">
<el-descriptions class="descriptions-box"> <el-descriptions>
<el-descriptions-item label="实验操作视频名称:">{{ detail.name }}</el-descriptions-item> <el-descriptions-item label="实验操作视频名称:">{{ detail.name }}</el-descriptions-item>
<el-descriptions-item label="文件大小:">{{ detail.size_name }}</el-descriptions-item> <el-descriptions-item label="文件大小:">{{ detail.size_name }}</el-descriptions-item>
<el-descriptions-item label="观看次数:">{{ detail.pv }}</el-descriptions-item> <el-descriptions-item label="观看次数:">{{ detail.pv }}</el-descriptions-item>
......
...@@ -4,14 +4,14 @@ export const json2Array = function (data: any, isValueToNumber = true) { ...@@ -4,14 +4,14 @@ export const json2Array = function (data: any, isValueToNumber = true) {
} }
// 参赛模式 // 参赛模式
export const contestMode: Record<string, any> = { export const contestMode: Record<number, any> = {
1: '个人赛' 1: '个人赛'
} }
// 参赛模式列表 // 参赛模式列表
export const contestModeList = json2Array(contestMode, false) export const contestModeList = json2Array(contestMode, false)
// 评分规则 // 评分规则
export const scoreRule: Record<string, any> = { export const scoreRule: Record<number, any> = {
1: '平均法', 1: '平均法',
2: '加权平均法', 2: '加权平均法',
3: '综合得分法', 3: '综合得分法',
...@@ -19,3 +19,21 @@ export const scoreRule: Record<string, any> = { ...@@ -19,3 +19,21 @@ export const scoreRule: Record<string, any> = {
} }
// 参赛模式列表 // 参赛模式列表
export const scoreRuleList = json2Array(scoreRule, false) export const scoreRuleList = json2Array(scoreRule, false)
// 实验成绩规则
export const gradeRule: Record<number, any> = {
1: '实验报告',
2: '实验准备',
3: '实验结果',
4: '课堂活跃度',
5: '自定义'
}
// 参赛模式列表
export const gradeRuleList = json2Array(gradeRule)
// 实验报告评分规则
export const reportScoreRule: Record<number, any> = {
1: '手工评分',
2: '自动评分'
}
export const reportScoreRuleList = json2Array(reportScoreRule)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论