[测评系统]--前端(用户答题页面)
wzp
8 天以前 fcdc68ab5c95835b70301221d25cdb75202e02f1
src/views/exam/paper/intelligence.vue
@@ -4,18 +4,22 @@
      <el-header class="align-center" v-if="guide">
        <h1></h1>
      </el-header>
      <el-main style="padding-top: 3%;">
      <el-main style="">
        <div v-html="guideDescirption" v-if="guide" :style="ismobile?'padding-top: 2%;':'padding-top: 2%;margin: 0 auto;width:66%'"></div>
        <el-row class="do-align-center" v-if="guide">
          <el-button @click="startDo" type="primary" :disable="startDoDisable">{{$t('start')}}</el-button>
        </el-row >
        <el-form :model="form" ref="form" v-loading="formLoading" label-width="100%" v-else>
          <el-row :key="index"  v-for="(titleItem,index) in titleItems">
          <el-row :key="index"  v-for="(titleItem,index) in titleItems" ref="titleItem">
            <div class="q-content">{{titleItem.description}}</div>
            <el-card class="exampaper-item-box" style="border:2px solid #2b90ff;">
              <div class="align-center"><span style="font-size: small; float: left">{{$t('examinee')}}{{memberName}}</span><span style="margin-top: 0px;padding-right: 11%">●{{form.name}}●</span><span style="font-size: small; float: right">{{$t('partRemailTime')}}{{formatSecondsG(remainTime,$t('hour'),$t('min'),$t('second'))}}</span></div>
              <hr style="border : 1px dashed #b3d8ff;" />
              <el-form-item :key="index" label-width="1px" v-for="(questionItem, index) in questionItems">
            <el-card class="exampaper-item-box" style="border:2px solid #2b90ff;" :body-style="{padding: '0px 20px 20px 20px'}">
              <div class="align-center" style="padding-top:20px;height:50px;position: sticky;top: 0px; z-index: 1; background-color: white;"><span style="font-size: small; float: left">{{$t('examinee')}}{{memberName}}</span><span style="margin-top: 0px;padding-right: 11%">●{{form.name}}●</span><span style="font-size: small; float: right">{{$t('partRemailTime')}}{{formatSecondsG(remainTime,$t('hour'),$t('min'),$t('second'))}}</span></div>
              <hr style="margin:0px;border : 1px dashed #b3d8ff;position: sticky;top: 50px; z-index: 1; background-color: white;" />
              <div class="question-title-down-box">
                <div class="question-title-down">
                </div>
              </div>
              <el-form-item :class="questionItem.questionType==1 && questionItem.template=='intelligence_title'?'question-title-box':''" :key="index" label-width="1px" v-for="(questionItem, index) in questionItems">
                <QuestionIntelligenceEdit @callNextSubject="onChoice" :qType="questionItem.questionType" :question="questionItem"
                              :answer="answer.answerItems[questionItem.itemOrder-1]" :qLabel="questionItem.questionNumber" :order = "questionItem.itemOrder-1" :displayVal="displayVal"/>
              </el-form-item>
@@ -36,15 +40,15 @@
      </el-main>
    </el-container>
    <el-row class="do-exam-title footer">
      <el-col :span="24">
    <!-- <el-row class="do-exam-title footer"> -->
      <!-- <el-col :span="24"> -->
        <!--测试的时候打开-->
        <!--<span class="do-exam-time">-->
          <!--<label>{{$t('remainingTime')}}</label>-->
          <!--<label>{{formatSecondsG(remainTime,$t('hour'),$t('min'),$t('second'))}}</label>-->
        <!--</span>-->
      </el-col>
    </el-row>
      <!-- </el-col> -->
    <!-- </el-row> -->
  </div>
</template>
@@ -98,11 +102,13 @@
      isSubmiting: false,
      displayVal: 'block',
      isSubmitClick: false,
      timeoutValue: 6
      timeoutValue: 6,
      hasShownSubmitTip: false // 标志是否已经显示过提交提示
    }
  },
  created: function () {
    let _this = this
    window.addEventListener('beforeunload', e => this.beforeunloadFn(e))
    _this.ismobile = /ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(navigator.userAgent.toLowerCase())
    // 多语言
@@ -179,7 +185,15 @@
      })
    }
  },
  mounted () {
  updated () {
    let elements = document.querySelectorAll('.exampaper-item-box')
    if (elements) {
      elements.forEach(element => {
        if (element) {
          element.addEventListener('scroll', this.handleCardScroll, true)
        }
      })
    }
  },
  beforeDestroy () {
    window.clearInterval(this.timer)
@@ -188,6 +202,30 @@
    window.removeEventListener('beforeunload', e => this.beforeunloadFn(e))
  },
  methods: {
    handleCardScroll (e) {
      const scrollRoot = e.target
      const questionTitleBox = scrollRoot.querySelector('.question-title-box')
      const questionTitleDown = scrollRoot.querySelector('.question-title-down')
      const questionTitleDownBox = scrollRoot.querySelector('.question-title-down-box')
      if (!questionTitleBox || !questionTitleDown || !questionTitleDownBox) {
        return
      }
      const scrollTop = scrollRoot.scrollTop
      if (scrollTop >= questionTitleBox.offsetHeight) {
        questionTitleDownBox.classList.add('show')
        if (questionTitleDown.childNodes.length === 0) {
          this.fillStickyTitleClone(questionTitleBox, questionTitleDown)
        }
      } else {
        questionTitleDown.innerHTML = ''
        questionTitleDownBox.classList.remove('show')
      }
    },
    fillStickyTitleClone (questionTitleBox, questionTitleDown) {
      questionTitleDown.innerHTML = ''
      questionTitleDown.appendChild(questionTitleBox.cloneNode(true))
    },
    beforeunloadFn (e) {
      if (!this.isSubmiting) {
        if (this.isLastQuestionOrderNum(this.order)) {
@@ -461,7 +499,18 @@
      _this.determineWhetherIntelligenceTitle()
    },
    onChoice () { // 是否显示提交按钮
      let _this = this
      if (this.isLastQuestionOrder()) {
        // 检查是否是最后一题且已答完,弹出提示框
        if (_this.isContentNotEmpty(_this.order)) {
          if (!_this.hasShownSubmitTip) {
            _this.hasShownSubmitTip = true
            _this.$alert(_this.$t('submit_tip'), _this.$t('prompt'), {
              confirmButtonText: _this.$t('determine'),
              customClass: 'submit-tip-dialog'
            })
          }
        }
        return
      }
      this.isShowNextQuestionButton(this)
@@ -550,6 +599,22 @@
      return true
    },
    nextOrder () {
      // 滚动到顶部
      let elements = document.querySelectorAll('.exampaper-item-box')
      if (elements) {
        elements.forEach(element => {
          if (element) {
            element.scrollTop = 0
            const downBox = element.querySelector('.question-title-down-box')
            const down = element.querySelector('.question-title-down')
            if (downBox && down) {
              down.innerHTML = ''
              downBox.classList.remove('show')
            }
          }
        })
      }
      let _this = this
      _this.order++
      // 如果是已经完成本段,提交展示指导语
@@ -585,6 +650,22 @@
      return answerSubmit
    },
    preSubject () {
      // 滚动到顶部
      let elements = document.querySelectorAll('.exampaper-item-box')
      if (elements) {
        elements.forEach(element => {
          if (element) {
            element.scrollTop = 0
            const downBox = element.querySelector('.question-title-down-box')
            const down = element.querySelector('.question-title-down')
            if (downBox && down) {
              down.innerHTML = ''
              downBox.classList.remove('show')
            }
          }
        })
      }
      let _this = this
      _this.isShowGuide(false)
      if (_this.order <= 0) {
@@ -816,4 +897,31 @@
    z-index: 1000;
    bottom: 0px;
  }
  .exampaper-item-box {
    position: relative;
    overflow-y: auto; /* 允许内容滚动 */
    height: calc(100vh - 110px); /* 根据需要设置盒子的最大高度 */
  }
  .question-title-down-box {
    position: sticky;
    display: none;
    top: 51px;
    width: 100%;
    z-index: 1;
  }
  .question-title-down {
    background-color: #fff;
  }
  .question-title-down .question-title-box {
    margin-bottom: 0px;
  }
  .question-title-down-box.show{
    display: block;
  }
</style>