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

bug fixes

上级 9b56dabb
......@@ -4662,7 +4662,7 @@
},
"node_modules/vue-tsc": {
"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==",
"dev": true,
"dependencies": {
......@@ -8314,7 +8314,7 @@
},
"vue-tsc": {
"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==",
"dev": true,
"requires": {
......
......@@ -98,7 +98,7 @@ function handleSubmit() {
v-permission="'v1-teacher-discussion-comment'"
>
<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-row justify="end">
<el-button round auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button>
......
......@@ -76,7 +76,12 @@ function handleSubmit() {
</script>
<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-row>
<el-col :span="12">
......
......@@ -10,7 +10,11 @@ defineProps<Props>()
<div class="list-item">
<div class="list-item-pic">
<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>
</router-link>
</div>
......
<script setup lang="ts">
import type { ExperimentRecord } from '../types'
import type { ExperimentRecord, ExperimentRecordFile } from '../types'
import { ElMessageBox } from 'element-plus'
import ImageViewer from '@/components/ImageViewer.vue'
import { uploadExperimentPicture } from '../api'
const ResultScoreDialog = defineAsyncComponent(() => import('./ResultScoreDialog.vue'))
interface Props {
experiment_id?: string
......@@ -14,6 +15,8 @@ const emit = defineEmits<{
}>()
const detail = $ref<ExperimentRecord>(inject('detail'))
const dialogVisible = $ref(false)
const isEmpty = $computed(() => {
return !props.experiment_id || !detail
})
......@@ -45,7 +48,7 @@ function handleRemove(index: number) {
<div class="result-score">
<h2>我的成绩</h2>
<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>
</template>
<template v-else>
......@@ -66,6 +69,7 @@ function handleRemove(index: number) {
</li>
</ul>
<ImageViewer v-model="imageViewerVisible" :index="imageViewerIndex" :items="detail.pictures"></ImageViewer>
<ResultScoreDialog v-model="dialogVisible"></ResultScoreDialog>
</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 {
file: ExperimentRecordFile
checker_id: string
check_time: string
score_details: string
score_details: { operate: number; result: number; file: number }
score: string
status: 0 | 1 | 2
checker_user: UserType
......@@ -114,6 +114,7 @@ export interface ExperimentRecordFile {
export interface ExperimentRecordStudent {
id: string
name: string
sno_number: string
specialty: {
id: string
name: string
......
......@@ -28,6 +28,18 @@ const experimentList = $computed(() => {
const course = courses.value.find((item: CourseType) => item.id === form.course_id)
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>()
provide('detail', $$(detail))
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论