fuliqi
2024-06-26 b66dc32f331b455ed1135235bbce14fc84a2f6fe
阅卷前端样式
5个文件已修改
262 ■■■■■ 已修改文件
src/views/answer/components/QuestionAnswerShow.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/exam/MarkPaperDetail.vue 164 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/list.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/train/data-list/index.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/train/index.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/answer/components/QuestionAnswerShow.vue
@@ -1,6 +1,7 @@
<template>
  <div v-loading="qLoading" style="line-height:1.8">
    <div v-if="qType == 1 || qType == 2 || qType == 3 || qType == 4 || qType == 5 || qType == 6 || qType == 7 || qType == 8">
     <!-- 选择或语音 -->
      <div v-if="qType == 1 || qType == 6">
        <div class="q-title" v-html="question.title" />
        <div class="q-content">
@@ -12,6 +13,7 @@
          </el-radio-group>
        </div>
      </div>
      <!-- 多选 -->
      <div v-else-if="qType == 2">
        <div class="q-title" v-html="question.title" />
        <div class="q-content">
@@ -23,6 +25,7 @@
          </el-checkbox-group>
        </div>
      </div>
      <!-- 判断 -->
      <div v-else-if="qType == 3">
        <div class="q-title" v-html="question.title" style="display: inline;margin-right: 10px" />
        <span style="padding-right: 10px;">(</span>
@@ -33,6 +36,7 @@
        </el-radio-group>
        <span style="padding-left: 10px;">)</span>
      </div>
      <!-- 填空 -->
      <div v-else-if="qType == 4">
        <div class="q-title" v-html="question.title" />
        <div v-if="answer.contentArray !== null">
@@ -42,6 +46,7 @@
          </el-form-item>
        </div>
      </div>
      <!-- 简答、计算、分析 -->
      <div v-else-if="qType == 5 || qType == 7 || qType == 8">
        <div class="q-title" v-html="question.title" />
        <div>
@@ -69,13 +74,16 @@
      </div>
      <div class="question-answer-show-item">
        <span class="question-show-item">正确答案:</span>
        <!-- 选择、多选、简答、语音、计算、分析 -->
        <span v-if="qType == 1 || qType == 2 || qType == 5 || qType == 6 || qType == 7 || qType == 8" v-html="question.correct" class="q-item-span-content" />
        <!-- 判断 -->
        <span v-if="qType == 3" v-html="trueFalseFormatter(question)" class="q-item-span-content" />
        <!-- 填空 -->
        <span v-if="qType == 4">{{ question.correctArray }}</span>
      </div>
      <div v-if = "answer.doRight == null">
        <span style="color:#ECAB3C;">{{'批改:'}}</span>
        <el-input-number size="mini" v-model="question.markScore" :precision="1" :min="0" :max="parseInt(question.score)" ></el-input-number>
        <el-input-number size="mini" v-model="answer.score" :precision="1" :min="0" :max="parseInt(question.score)" ></el-input-number>
      </div>
    </div>
    <div v-else>
src/views/exam/exam/MarkPaperDetail.vue
@@ -1,21 +1,44 @@
<template>
  <div>
    <el-row style="text-align: center;margin-top: 20px;margin-bottom: 20px; font-size: 28px">语文考试</el-row>
    <el-row :gutter="20">
      <el-col :span="8" class="info">
        <span class="exam-info">学员姓名:</span>
        <span class="exam-info">{{ userName }}</span>
      </el-col>
      <el-col :span="8" class="info">
        <span class="exam-info">交卷时间:</span>
        <span class="exam-info">{{ examInfo.updateTime }}</span>
      </el-col>
      <el-col :span="8" class="info">
        <span class="exam-info">完成耗时:</span>
        <span class="exam-info">{{ examInfo.doTime }}</span>
      </el-col>
    </el-row>
    <el-main>
  <div class="paper-container">
    <div class="paper-card">
      <el-card style="height: 100vh">
        <el-row style="text-align: left; margin-bottom : 20px; font-size: 20px">语文考试</el-row>
        <el-row>
          <el-col class="info">
            <span class="exam-info">学员姓名:</span>
            <span class="exam-info">{{ userName }}</span>
          </el-col>
        </el-row>
        <el-row>
          <el-col class="info">
            <span class="exam-info">交卷时间:</span>
            <span class="exam-info">{{ examInfo.updateTime }}</span>
          </el-col>
        </el-row>
        <el-row>
          <el-col class="info">
            <span class="exam-info">完成耗时:</span>
            <span class="exam-info">{{ examInfo.doTime }}</span>
          </el-col>
        </el-row>
        <el-row>
          <el-col class="info">
            <span class="exam-info">得分:</span>
            <span class="exam-info">{{ 30 + ' / ' + 70 }}</span>
          </el-col>
        </el-row>
        <el-divider></el-divider>
        <el-row class="do-exam-title">
          <el-col :span="24">
                <span :key="item.itemOrder" v-for="item in answer.answerItems">
                    <el-tag :type="questionDoRightTag(item.doRight)" class="do-exam-title-tag"
                            @click="goAnchor('#question-' + item.itemOrder)">{{ item.itemOrder }}</el-tag>
                </span>
          </el-col>
        </el-row>
      </el-card>
    </div>
    <div class="paper-form">
      <el-form :model="form" ref="form" v-loading="formLoading" label-width="100px">
        <el-row :key="index" v-for="(titleItem, index) in form.titleItems">
          <h3>{{ titleItem.name }}</h3>
@@ -29,7 +52,7 @@
          </el-card>
        </el-row>
      </el-form>
    </el-main>
    </div>
  </div>
</template>
@@ -37,6 +60,7 @@
import { getStudentExam } from '@/api/exam'
import QuestionAnswerShow from '@/views/answer/components/QuestionAnswerShow'
import examPaperAnswerApi from '@/api/examPaperAnswer'
import { mapGetters, mapState } from 'vuex'
export default {
  name: 'MarkPaperDetail',
@@ -50,9 +74,9 @@
        'code': 1, 'message': '成功', 'data': {
          'paper': {
            'id': 30,
            'level': 1,
            'subjectId': 4,
            'paperType': 7,
            'score': '15',
            'classes': null,
            'name': '这是一个测试试卷',
            'suggestTime': 12,
            'limitDateTime': null,
@@ -200,6 +224,48 @@
                'knowledgeIdList': [8, 9]
              }]
            }, {
              'name': '填空题',
              'questionItems': [{
                'id': 2,
                'questionType': 4,
                'title': '中华四大名著都有',
                'gradeLevel': 1,
                'analyze': '题目比较简单,自行分析',
                'correct': null,
                'correctArray': '红楼梦,白楼梦,青楼梦,绿楼梦',
                'score': '10',
                'difficult': 3,
                'itemOrder': 7,
                'knowledgeIdList': [8, 9],
                'items': [
                  { prefix: '1', content: '红楼梦' },
                  { prefix: '2', content: '白楼梦' },
                  { prefix: '3', content: '青楼梦' },
                  { prefix: '4', content: '绿楼梦' }
                ]
              }
              ]
            }, {
              'name': '语音题',
              'questionItems': [{
                'id': 55,
                'questionType': 1,
                'title': '听音频回答出小明今天吃的什么',
                'items': [
                  { 'prefix': 'A', 'content': '番茄', 'score': null, 'itemUuid': null },
                  { 'prefix': 'B', 'content': '白菜', 'score': null, 'itemUuid': null },
                  { 'prefix': 'C', 'content': '香蕉', 'score': null, 'itemUuid': null },
                  { 'prefix': 'D', 'content': '菠萝', 'score': null, 'itemUuid': null }
                ],
                'analyze': '题目比较简单,自行分析',
                'correctArray': null,
                'correct': 'A',
                'score': '2.5',
                'difficult': 3,
                'itemOrder': 8,
                'knowledgeIdList': [8, 9]
              }]
            }, {
              'name': '简答题',
              'questionItems': [{
                'id': 1,
@@ -211,13 +277,11 @@
                'correct': '红楼梦、西游记、水浒传、三国演义',
                'score': '10',
                'difficult': 3,
                'itemOrder': 7,
                'itemOrder': 9,
                'knowledgeIdList': [8, 9]
              }
              ]
            }],
            'score': '15',
            'classes': null
          },
          'answer': {
            'id': 9,
@@ -279,11 +343,29 @@
              'score': '2.5',
              'questionScore': '2.5'
            }, {
              'id': 33,
              'questionId': 2,
              'doRight': null,
              'content': 'A',
              'itemOrder': 7,
              'contentArray': ['红门梦', '三国演绎', '水壶转'],
              'score': '2.5',
              'questionScore': '2.5'
            }, {
              'id': 25,
              'questionId': 55,
              'doRight': true,
              'content': 'A',
              'itemOrder': 8,
              'contentArray': null,
              'score': '2.5',
              'questionScore': '2.5'
            }, {
              'id': 31,
              'questionId': 1,
              'doRight': null,
              'content': '红楼梦.......',
              'itemOrder': 6,
              'itemOrder': 9,
              'questionScore': '10'
            }],
            'doTimeStr': '26秒'
@@ -323,27 +405,53 @@
    }
  },
  methods: {
    goAnchor (selector) {
      this.$el.querySelector(selector).scrollIntoView({ behavior: 'instant', block: 'center', inline: 'nearest' })
    },
    questionDoRightTag (status) {
      return this.enumFormat(this.doRightTag, status)
    },
    getStudentPaper () {
      getStudentExam(this.examInfo.examId, this.userId).then(res => {
        this.examInfo = res.data.data
      })
    }
  },
  computed: {
    ...mapGetters('enumItem', ['enumFormat']),
    ...mapState('enumItem', {
      doRightTag: state => state.exam.question.answer.doRightTag
    })
  }
}
</script>
<style scoped>
.question-warp {
  margin-top: 50px;
.paper-container {
  display: flex;
  flex-direction: row;
  height: 100%;
  padding: 20px;
  min-height: 100%;
}
.exam-info {
.paper-card {
  position: fixed;
  width: 270px;
}
.paper-form {
  flex: 1; /* 占据剩余空间 */
  margin-left: 300px;
}
.info {
  display: flex;
  flex-direction: row;
  justify-content: center;
  justify-content: left;
  font-size: 14px;
  margin-top: 10px;
}
</style>
src/views/exam/paper/list.vue
@@ -123,12 +123,12 @@
      })
    },
    // 获取科目
    getSubjects() {
    getSubjects () {
      subjectApi.list().then(re => {
        this.subjects = re.data
      })
    },
    translate(subjectId) {
    translate (subjectId) {
      const subject = this.subjects.find(subject => subject.id == subjectId);
      return subject ? subject.name : '未知';
    }
src/views/train/data-list/index.vue
@@ -38,42 +38,7 @@
export default {
  props: {
    tableData: [
      {
        id: 1,
        meetName: '英语',
        startTime: '2024-6-13 8:00',
        endTime: '2024-6-13 8:00',
        teacherName: '关老师'
      },
      {
        id: 2,
        meetName: '语文',
        startTime: '2024-6-13 8:00',
        endTime: '2024-6-13 8:00',
        teacherName: '测试测试'
      },
      {
        id: 3,
        meetName: '数学',
        startTime: '2024-6-13 8:00',
        endTime: '2024-6-13 8:00',
        teacherName: '测试测试'
      },
      {
        id: 4,
        meetName: '机场航空',
        startTime: '2024-6-13 8:00',
        endTime: '2024-6-13 8:00',
        teacherName: '测试测试'
      },
      {
        id: 5,
        startTime: '2024-6-13 8:00',
        endTime: '2024-6-13 8:00',
        teacherName: '测试测试',
      }
    ]
    tableData: []
  },
  methods: {
    handleUpdate (item) {
@@ -83,18 +48,7 @@
      this.$emit('remove',item)
    },
    start (item) {
      let routeUrl = this.$router.resolve({
        path: "/meet",
        query: {
          domain: 'ycl.easyblog.vip:8443/' + item.id,
          roomName: item.meetName,
          userInfoStr:  JSON.stringify({
            displayName: item.teacherName
          })
        }
      })
      window.open(routeUrl.href, '_blank')
      // window.open('https://ycl.easyblog.vip:8443/test');
      this.$emit('start',item)
    }
  }
};
src/views/train/index.vue
@@ -26,7 +26,7 @@
              <div class="card-main flex-1 my-5 relative">
                <div class="main-content absolute top-0 bottom-0 left-0 right-0">
                  <DataList :tableData="tableData" @handleUpdate="handleUpdate" @remove = "remove"></DataList>
                  <DataList :tableData="tableData" @handleUpdate="handleUpdate" @remove = "remove" @start = "start"></DataList>
                  <div id="meet" ref="meet"></div>
                </div>
              </div>
@@ -39,10 +39,10 @@
          <!-- 添加会议对话框 -->
          <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
            <el-form label-width="80px" ref="form" :model="form" :rules="rules" >
              <el-form-item label="房间名:" prop="meetName" >
              <el-form-item label="房间名" prop="meetName" >
                <el-input v-model="form.meetName" placeholder="请输入房间名" style="width: 300px"></el-input>
              </el-form-item>
              <el-form-item label="班级:" >
              <el-form-item label="班级" >
                <el-select
                  v-model="form.classesId"
                  placeholder="班级"
@@ -62,6 +62,11 @@
                    end-placeholder="结束日期">
                  </el-date-picker>
              </el-form-item>
              <el-form-item label="状态" >
                <el-radio v-model="form.status" :label="0">待开始</el-radio>
                <el-radio v-model="form.status" :label="1">进行中</el-radio>
                <el-radio v-model="form.status" :label="2">已结束</el-radio>
              </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
              <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -80,7 +85,6 @@
import Pagination from '@/components/Pagination'
import { getMeets,addMeet,editMeet,deleteMeetById } from '@/api/meet'
import { myClasses } from '@/api/classes'
export default {
  components: { DataList,Pagination},
@@ -132,6 +136,28 @@
        }
      })
    },
    start (item) {
      // 修改房间状态为进行中
      item.status = 1
      editMeet(item).then(re => {
        if (re.data.code === 1) {
          this.getList()
          let routeUrl = this.$router.resolve({
            path: "/meet",
            query: {
              domain: 'ycl.easyblog.vip:8443/' + item.id,
              roomName: item.meetName,
              userInfoStr:  JSON.stringify({
                displayName: item.teacherName
              })
            }
          })
          window.open(routeUrl.href, '_blank')
        } else {
          this.$message.error(re.data.message)
        }
      })
    },
    handleUpdate (item) {
      this.form = {
        ...item,