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

bug fixes

上级 9b56dabb
...@@ -4662,7 +4662,7 @@ ...@@ -4662,7 +4662,7 @@
}, },
"node_modules/vue-tsc": { "node_modules/vue-tsc": {
"version": "0.40.5", "version": "0.40.5",
"resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-0.40.5.tgz", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.40.5.tgz",
"integrity": "sha512-rQPyyqrQiDzc8a3YpAYUb27VQbU+NDewOJ7GJBiEIEcaSugMjDc6dtJijTHK32t8IgGPl6ybsJ9LIU9sZvixLA==", "integrity": "sha512-rQPyyqrQiDzc8a3YpAYUb27VQbU+NDewOJ7GJBiEIEcaSugMjDc6dtJijTHK32t8IgGPl6ybsJ9LIU9sZvixLA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
...@@ -8314,7 +8314,7 @@ ...@@ -8314,7 +8314,7 @@
}, },
"vue-tsc": { "vue-tsc": {
"version": "0.40.5", "version": "0.40.5",
"resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-0.40.5.tgz", "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.40.5.tgz",
"integrity": "sha512-rQPyyqrQiDzc8a3YpAYUb27VQbU+NDewOJ7GJBiEIEcaSugMjDc6dtJijTHK32t8IgGPl6ybsJ9LIU9sZvixLA==", "integrity": "sha512-rQPyyqrQiDzc8a3YpAYUb27VQbU+NDewOJ7GJBiEIEcaSugMjDc6dtJijTHK32t8IgGPl6ybsJ9LIU9sZvixLA==",
"dev": true, "dev": true,
"requires": { "requires": {
......
...@@ -98,7 +98,7 @@ function handleSubmit() { ...@@ -98,7 +98,7 @@ function handleSubmit() {
v-permission="'v1-teacher-discussion-comment'" v-permission="'v1-teacher-discussion-comment'"
> >
<el-form-item prop="content"> <el-form-item prop="content">
<el-input type="textarea" v-model="form.content" :autosize="{ minRows: 4, maxRows: 6 }" /> <el-input type="textarea" v-model="form.content" :autosize="{ minRows: 4, maxRows: 6 }" :maxlength="200" />
</el-form-item> </el-form-item>
<el-row justify="end"> <el-row justify="end">
<el-button round auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button> <el-button round auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button>
......
...@@ -76,7 +76,12 @@ function handleSubmit() { ...@@ -76,7 +76,12 @@ function handleSubmit() {
</script> </script>
<template> <template>
<el-dialog title="学生实验评分" :close-on-click-modal="false" @update:modelValue="$emit('update:modelValue')"> <el-dialog
title="学生实验评分"
:close-on-click-modal="false"
width="700px"
@update:modelValue="$emit('update:modelValue')"
>
<el-form :rules="rules" label-width="120px" label-suffix=":" v-if="detail"> <el-form :rules="rules" label-width="120px" label-suffix=":" v-if="detail">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
......
...@@ -10,7 +10,11 @@ defineProps<Props>() ...@@ -10,7 +10,11 @@ defineProps<Props>()
<div class="list-item"> <div class="list-item">
<div class="list-item-pic"> <div class="list-item-pic">
<router-link :to="`/admin/lab/video/${data.id}`" target="_blank"> <router-link :to="`/admin/lab/video/${data.id}`" target="_blank">
<el-image :src="data.cover" fit="cover" /> <el-image :src="data.cover" fit="cover">
<template #error>
<img src="/images/video_poster.png" />
</template>
</el-image>
<el-icon><VideoPlay /></el-icon> <el-icon><VideoPlay /></el-icon>
</router-link> </router-link>
</div> </div>
......
<script setup lang="ts"> <script setup lang="ts">
import type { ExperimentRecord } from '../types' import type { ExperimentRecord, ExperimentRecordFile } from '../types'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import ImageViewer from '@/components/ImageViewer.vue' import ImageViewer from '@/components/ImageViewer.vue'
import { uploadExperimentPicture } from '../api' import { uploadExperimentPicture } from '../api'
const ResultScoreDialog = defineAsyncComponent(() => import('./ResultScoreDialog.vue'))
interface Props { interface Props {
experiment_id?: string experiment_id?: string
...@@ -14,6 +15,8 @@ const emit = defineEmits<{ ...@@ -14,6 +15,8 @@ const emit = defineEmits<{
}>() }>()
const detail = $ref<ExperimentRecord>(inject('detail')) const detail = $ref<ExperimentRecord>(inject('detail'))
const dialogVisible = $ref(false)
const isEmpty = $computed(() => { const isEmpty = $computed(() => {
return !props.experiment_id || !detail return !props.experiment_id || !detail
}) })
...@@ -45,7 +48,7 @@ function handleRemove(index: number) { ...@@ -45,7 +48,7 @@ function handleRemove(index: number) {
<div class="result-score"> <div class="result-score">
<h2>我的成绩</h2> <h2>我的成绩</h2>
<template v-if="detail.status === 2"> <template v-if="detail.status === 2">
<p class="t1">{{ parseFloat(detail.score) }}</p> <p class="t1" @click="dialogVisible = !dialogVisible">{{ parseFloat(detail.score) }}</p>
<p class="t2">批改讲师:{{ detail.checker_user.real_name }}</p> <p class="t2">批改讲师:{{ detail.checker_user.real_name }}</p>
</template> </template>
<template v-else> <template v-else>
...@@ -66,6 +69,7 @@ function handleRemove(index: number) { ...@@ -66,6 +69,7 @@ function handleRemove(index: number) {
</li> </li>
</ul> </ul>
<ImageViewer v-model="imageViewerVisible" :index="imageViewerIndex" :items="detail.pictures"></ImageViewer> <ImageViewer v-model="imageViewerVisible" :index="imageViewerIndex" :items="detail.pictures"></ImageViewer>
<ResultScoreDialog v-model="dialogVisible"></ResultScoreDialog>
</template> </template>
</template> </template>
......
<script setup lang="ts">
import type { ExperimentRecord } from '../types'
import { Document } from '@element-plus/icons-vue'
const detail = $ref<ExperimentRecord>(inject('detail'))
const score = $computed<number>(() => {
const result =
((detail.score_details.operate || 0) + (detail.score_details.result || 0) + (detail.score_details.file || 0)) / 3
return parseFloat(result.toFixed(2))
})
</script>
<template>
<el-dialog title="实验成绩详情" :close-on-click-modal="false">
<el-form label-width="120px" label-suffix=":" v-if="detail">
<el-row>
<el-col :span="12">
<el-form-item label="实验名称">{{ detail.experiment.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实验课程名称">{{ detail.course.name }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="学生姓名">{{ detail.student.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学生学号">{{ detail.student.sno_number }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="所属专业">{{ detail.student.specialty.name }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属班级">{{ detail.student.specialty.name }}</el-form-item>
</el-col>
</el-row>
<el-form-item label="实验成绩" class="form-item-score">
<el-form ref="formRef" hide-required-asterisk inline label-position="top" style="padding: 5px 0 20px">
<el-form-item label="实验操作" prop="operate">
<el-input-number
:min="1"
:max="100"
:controls="false"
step-strictly
disabled
v-model="detail.score_details.operate"
/>
</el-form-item>
<el-form-item label="实验结果" prop="result">
<el-input-number
:min="1"
:max="100"
:controls="false"
step-strictly
disabled
v-model="detail.score_details.result"
/>
</el-form-item>
<el-form-item label="实验报告" prop="file">
<el-input-number
:min="1"
:max="100"
:controls="false"
step-strictly
disabled
v-model="detail.score_details.file"
/>
</el-form-item>
<el-form-item label="综合实验成绩">
<el-input-number :min="0" :max="100" :controls="false" disabled v-model="score" />
</el-form-item>
</el-form>
</el-form-item>
<el-form-item label="实验报告文件">
<div v-if="detail.file">
<a :href="detail.file.url" target="_blank" class="file-item">
<el-icon><Document /></el-icon>{{ detail.file.name }}
</a>
</div>
</el-form-item>
<!-- <el-form-item label="实验过程截图">
<ul class="picture-list">
<li v-for="item in pictures" :key="item.url">
<p class="t1">
<a :href="item.url" target="_blank">{{ item.name }}</a>
</p>
<p class="t2">截图时间:{{ item.upload_time }}</p>
</li>
</ul>
</el-form-item> -->
</el-form>
</el-dialog>
</template>
<style lang="scss" scoped>
.file-item {
display: flex;
align-items: center;
color: var(--main-color);
.el-icon {
margin-right: 5px;
}
}
.picture-list {
width: 100%;
li {
display: flex;
justify-content: space-between;
}
a {
color: var(--main-color);
}
.t1 {
flex: 1;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
}
.form-item-score {
padding-top: 10px;
background-color: #f8f9fb;
border-radius: 16px;
:deep(.el-form-item__label) {
text-align: center;
}
.el-input-number {
width: 100px;
}
}
</style>
...@@ -92,7 +92,7 @@ export interface ExperimentRecord { ...@@ -92,7 +92,7 @@ export interface ExperimentRecord {
file: ExperimentRecordFile file: ExperimentRecordFile
checker_id: string checker_id: string
check_time: string check_time: string
score_details: string score_details: { operate: number; result: number; file: number }
score: string score: string
status: 0 | 1 | 2 status: 0 | 1 | 2
checker_user: UserType checker_user: UserType
...@@ -114,6 +114,7 @@ export interface ExperimentRecordFile { ...@@ -114,6 +114,7 @@ export interface ExperimentRecordFile {
export interface ExperimentRecordStudent { export interface ExperimentRecordStudent {
id: string id: string
name: string name: string
sno_number: string
specialty: { specialty: {
id: string id: string
name: string name: string
......
...@@ -28,6 +28,18 @@ const experimentList = $computed(() => { ...@@ -28,6 +28,18 @@ const experimentList = $computed(() => {
const course = courses.value.find((item: CourseType) => item.id === form.course_id) const course = courses.value.find((item: CourseType) => item.id === form.course_id)
return course?.experiments || [] return course?.experiments || []
}) })
watchEffect(() => {
if (!form.course_id && courses.value.length) {
const [first] = courses.value
form.course_id = first.id
}
if (!form.experiment_id && experimentList.length) {
const [first] = experimentList
form.experiment_id = first.id
}
})
let detail = $ref<ExperimentRecord>() let detail = $ref<ExperimentRecord>()
provide('detail', $$(detail)) provide('detail', $$(detail))
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论