[测评系统]--前端(用户答题页面)
yj
2024-07-19 5e4bed2d67b26eeb7eab4d176bfabe3f527836e4
修复答题刷新与CAQ分片2从第2题开始bug
2个文件已添加
13个文件已修改
208 ■■■■■ 已修改文件
dist-20240704.zip 补丁 | 查看 | 原始文档 | blame | 历史
dist-20240705.zip 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/demography/index.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/demography/langOption.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/demography/login.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/career_interests.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/exercise.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/finish.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/guide.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/intelligence.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/job.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/exam/paper/personality.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dist-20240704.zip
Binary files differ
dist-20240705.zip
Binary files differ
src/layout/index.vue
@@ -49,12 +49,10 @@
    }
  },
  created () {
    console.log('环境变量:')
    console.log(process.env)
  },
  watch: {
    logo: function (val) {
      let sessionLogoUrl = sessionStorage.getItem('logoUrl')
      let sessionLogoUrl = localStorage.getItem('logoUrl')
      if (this.productType === 'API_Fan') {
        this.logoUrl = require('@/assets/logo-apifan.png')
      } else if (val === 'none') {
@@ -66,18 +64,18 @@
      } else if (sessionLogoUrl !== null) {
        this.logoUrl = sessionLogoUrl
      }
      sessionStorage.setItem('logoUrl', this.logoUrl)
      sessionStorage.setItem('backgroundColor', this.backgroundColor)
      localStorage.setItem('logoUrl', this.logoUrl)
      localStorage.setItem('backgroundColor', this.backgroundColor)
    }
  },
  mounted () {
    let sessionLogoUrl = sessionStorage.getItem('logoUrl')
    let sessionBackgroundColor = sessionStorage.getItem('backgroundColor')
    let sessionLogoUrl = localStorage.getItem('logoUrl')
    let sessionBackgroundColor = localStorage.getItem('backgroundColor')
    if (sessionLogoUrl !== null) {
      this.logoUrl = sessionLogoUrl
      this.backgroundColor = sessionBackgroundColor
    }
    sessionStorage.setItem('backgroundColor', this.backgroundColor)
    localStorage.setItem('backgroundColor', this.backgroundColor)
    window.addEventListener('beforeunload', this.handleBeforeUnload)
  },
  beforeDestroy () {
@@ -85,7 +83,7 @@
  },
  methods: {
    handleBeforeUnload: function () {
      sessionStorage.setItem('logoUrl', this.logoUrl)
      localStorage.setItem('logoUrl', this.logoUrl)
    },
    logout: function () {
      window.opener = null
@@ -116,7 +114,7 @@
    // logoUrl: function () {
    //   console.log('this.logo')
    //   console.log(this.logo)
    //   let sessionLogoUrl = this.setLogo(sessionStorage.getItem('logoUrl'))
    //   let sessionLogoUrl = this.setLogo(localStorage.getItem('logoUrl'))
    //   if (this.productType === 'API_Fan') {
    //     return require('@/assets/logo-apifan.png')
    //   } else if (this.logo === 'none') {
@@ -124,7 +122,7 @@
    //   } else if (this.logo === null && sessionLogoUrl !== null) {
    //     return sessionLogoUrl
    //   } else {
    //     sessionStorage.setItem('logoUrl', this.logo)
    //     localStorage.setItem('logoUrl', this.logo)
    //     return this.logo
    //   }
    // },
src/store/modules/user.js
@@ -1,5 +1,6 @@
import Cookies from 'js-cookie'
import userApi from '@/api/user'
import examPaperApi from '@/api/examPaper'
// initial state
const state = {
  userName: Cookies.get('studentUserName'),
@@ -8,7 +9,9 @@
  logo: null,
  messageCount: 0,
  memberToken: Cookies.get('memberTocken'),
  langType: 'English',
  // langType: localStorage.getItem('langType') || 'English',
  langType: Cookies.get('langType') || 'English',
  formDo: localStorage.getItem('formDo') && JSON.parse(localStorage.getItem('formDo')),
  langFlag: true,
  memberId: null
}
@@ -43,22 +46,48 @@
  setMemberId (state, memberId) {
    state.memberId = memberId
  },
  setFormDo (state, formDo) {
    if (formDo) {
      localStorage.setItem('formDo', JSON.stringify(formDo), { expires: 30 })
    } else {
      localStorage.setItem('formDo', formDo, { expires: 30 })
    }
    state.formDo = formDo
  },
  getFormDo (state) {
    // 如果不包含guide则重新获取
    if (!state.formDo || !Object.hasOwn(state.formDo, 'guide')) {
      state.formDo = localStorage.getItem('formDo') && JSON.parse(localStorage.getItem('formDo'))
      if (state.formDo && Object.hasOwn(state.formDo, 'guide')) {
        return
      }
      if (!state.memberToken || !state.langType) {
        return
      }
      examPaperApi.select(state.memberToken, state.langType).then(re => {
        state.formDo = re.response
        localStorage.setItem('formDo', JSON.stringify(state.formDo), { expires: 30 })
      }).catch(e => {
        console.error('获取formDo失败', e)
      })
    }
  },
  setLangType (state, paraLangType) {
    state.langType = paraLangType
        if(paraLangType == 'Chinese'){
            Cookies.set('language', 'zh', { expires: 30 })
        } else {
            Cookies.set('language', 'en', { expires: 30 })
        }
    Cookies.set('langType', paraLangType, { expires: 30 })
    if (paraLangType === 'Chinese') {
      Cookies.set('language', 'zh', { expires: 30 })
    } else {
      Cookies.set('language', 'en', { expires: 30 })
    }
  },
  getLangType () {
    let language = (navigator.language || navigator.browserLanguage).toLowerCase()
    if (language === 'zh-cn') {
      state.langType = 'Chinese'
      console.log(language)
    } else {
      state.langType = 'English'
      console.log(language)
    }
  },
  setLangFlag (state, paraLangFlag) {
src/utils/request.js
@@ -2,8 +2,6 @@
import vue from 'vue'
const request = function (loadtip, query) {
  console.log(query.baseURL)
  console.log(query.url)
  let loading
  if (loadtip) {
    loading = vue.prototype.$loading({
src/views/demography/index.vue
@@ -107,21 +107,18 @@
      paramsInfo: {},
      parasInfos: [],
      parasInfoIds: {},
      formDo: {},
      // formDo: {},
      submitDisable: false,
      isStart: this.$route.query.isStart === 'true'
    }
  },
  created () {
    const langType = localStorage.getItem('langType')
    if (langType) {
    const langType = this.$route.query.langType
    if (langType && (langType === 'Chinese' || langType === 'English' || langType === 'Thai')) {
      this.setLangType(langType)
    } else {
      localStorage.setItem('langType', this.langType)
    }
  },
  beforeDestroy () {
    localStorage.removeItem('langType')
  },
  beforeUpdate () {
  },
@@ -152,13 +149,14 @@
          demographyApi.submitDemography(_this.memberToken, _this.langType, _this.parasInfos).then(function (result) {
            if (result && result.code === 1) {
              examPaperApi.select(_this.memberToken, _this.langType).then(re => {
                _this.formDo = re.response
                _this.setFormDo(re.response)
                _this.setDoUrl(re.response.questionTemplateId)
                if (_this.isStart) {
                  _this.$router.push({ path: '/exam/' + _this.doUrl })
                  return
                }
                _this.$router.push({ path: '/guide/index', query: { formDo: _this.formDo } });
                // _this.$router.push({ path: '/guide/index', query: { formDo: _this.formDo } })
                _this.$router.push({ path: '/guide/index' })
              }).catch(e => {
                _this.$message.error(_this.$t('noquestionMsg'))
              })
@@ -205,7 +203,8 @@
    },
    ...mapMutations('user', ['setMemberTocken']),
    ...mapMutations('exam', ['setDoUrl']),
    ...mapMutations('user', ['setLangType'])
    ...mapMutations('user', ['setLangType']),
    ...mapMutations('user', ['setFormDo'])
  },
  computed: {
    ...mapState('user', { memberToken: state => state.memberToken }),
src/views/demography/langOption.vue
@@ -32,7 +32,7 @@
    return {
      langTypes: [],
      langSelectValue: this.$route.query.langSelectValue,
      fromDo: this.$route.query.fromDo,
      // fromDo: this.$route.query.fromDo,
      langWelcome: this.$t('langWelcomeChinese'),
      langOption: this.$t('langOptionChinese'),
      timer: null,
@@ -41,7 +41,6 @@
    }
  },
  created: function () {
    let _this = this
    window.clearInterval(this.timer)
    _this.getLangType()
@@ -78,7 +77,7 @@
    submitLangOption: function () {
      let _this = this
      _this.setLangType(_this.langSelectValue)
      _this.$router.push({ path: '/demography/fill/index', query: { demographyMenber: _this.memberToken, isStart: false } })
      _this.$router.push({ path: '/demography/fill/index', query: { demographyMenber: _this.memberToken, isStart: false, langType: _this.langSelectValue } })
      window.clearInterval(this.timer)
    },
    getLangAndRportTemplateId () {
@@ -92,7 +91,6 @@
            demographyApi.queryLangList(_this.memberToken, _this.reportTemplateId).then(function (result) {
              if (result && result.code === 1) {
                _this.langTypes = result.response
                console.log("longTypes", _this.langTypes)
              }
            }
            ).catch(e => {
@@ -111,6 +109,7 @@
          _this.$message.error(_this.$t('noquestionMsg'))
        })
      }
    },
    ...mapMutations('user', ['setMemberTocken']),
    ...mapMutations('user', ['setLangType']),
src/views/demography/login.vue
@@ -17,14 +17,13 @@
      paramsInfo: {},
      parasInfos: [],
      parasInfoIds: {},
      formDo: {},
      // formDo: {},
      reportTemplateType: null,
      statusInfo: { '2': this.$t('statusInfo2'), '3': this.$t('statusInfo3'), '4': this.$t('statusInfo4') }
    }
  },
  created () {
    // 清除本地存储的语言选项
    localStorage.removeItem('langType')
    let _this = this
    _this.getLangType()
    // 记录登陆日志
@@ -38,7 +37,6 @@
      } else {
        _this.setLogo(re.response.logoUrl)
      }
      console.log(re.response)
      _this.setProductType(re.response.productType)
      if (re.response.finish === 1) {
        _this.$router.push({ path: '/exam/finish', query: { name: '', content: _this.$t('finishMsg'), tokenId: _this.paraMemberToken } })
@@ -67,7 +65,7 @@
            if (_this.doUrl === 'career_interests' || _this.doUrl === 'job') {
              _this.$i18n.locale = 'zh'
              _this.setLangType('Chinese')
              _this.$router.push({ path: '/demography/fill/index', query: { demographyMenber: _this.memberToken, isStart: false } })
              _this.$router.push({ path: '/demography/fill/index', query: { demographyMenber: _this.memberToken, isStart: false, langType: 'Chinese' } })
              return
            }
@@ -97,13 +95,15 @@
            let answered = re.response.examItemOrderAndContentList
            if (answered === null) {
              examPaperApi.select(_this.memberToken, _this.langType).then(re => {
                _this.formDo = re.response
                _this.setFormDo(re.response)
                _this.setDoUrl(re.response.questionTemplateId)
                _this.$router.push({ path: '/guide/index', query: { formDo: _this.formDo } })
                // _this.$router.push({ path: '/guide/index', query: { formDo: _this.formDo } })
                _this.$router.push({ path: '/guide/index' })
              }).catch(e => {
                _this.$message.error(_this.$t('noquestionMsg'))
              })
            } else {
              // 否则清除fromDo
              _this.$router.push({ path: '/exam/' + _this.doUrl })
            }
          }).catch(e => {
@@ -119,6 +119,7 @@
    ...mapMutations('user', ['setLangType']),
    ...mapMutations('user', ['getLangType']),
    ...mapMutations('user', ['setLogo']),
    ...mapMutations('user', ['setFormDo']),
    ...mapMutations('exam', ['setProductType'])
  },
src/views/exam/paper/career_interests.vue
@@ -108,7 +108,7 @@
    _this.ismobile = /ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(navigator.userAgent.toLowerCase())
    // 多语言
    _this.setLangFlag(false)
    _this.form = this.$route.query.formDo
    _this.form = undefined
    if (_this.form !== {} && _this.form !== undefined) {
      _this.formLoading = true
      _this.remainTime = _this.form.suggestTime * 60
@@ -127,7 +127,6 @@
      // 展示指导语
      if (_this.form.parts[0].signals.length !== 0) {
        console.log('首题提示语')
        _this.showNextGuide(_this.form.parts[0].signals[0], false)
      }
    } else {
@@ -198,7 +197,6 @@
      ).catch(e => {
      })
    }
    console.log(' _this.partOrder:'+_this.partOrder)
  },
  mounted () {
  },
@@ -397,7 +395,6 @@
      }
      this.answer.answerItems[_this.order].readOnly = true
      let answerSubmit = _this.getSubmitAnswerValue(nowPartOrder)
      console.log(answerSubmit)
      // 已经答到了最后一题了,不用自动跳到下一题
      if (this.order + 1 > this.problemLength) {
        this.submitDisable = false
src/views/exam/paper/exercise.vue
@@ -1,6 +1,6 @@
<template>
  <div>
    <el-container  class="app-item-contain">
  <div v-loading.fullscreen.lock="!formDo">
    <el-container  class="app-item-contain" v-if="formDo">
      <el-main style="padding-top: 3%;">
        <el-form :model="form" ref="form" label-width="100%">
          <el-row :key="index"  v-for="(titleItem,index) in titleItems">
@@ -59,10 +59,10 @@
  components: { QuestionEdit },
  data () {
    return {
      formDo: this.$route.query.formDo,
      memberName: this.$route.query.formDo.memberName,
      // formDo: this.$route.query.formDo,
      memberName: '',
      form: {
        name: this.$route.query.formDo.name
        name: ''
      },
      itemOrder: 1,
      itemSize: 3,
@@ -81,6 +81,7 @@
    }
  },
  created: function () {
    this.getFormDo()
    this.initQuestion()
  },
  mounted () {
@@ -88,10 +89,15 @@
  beforeDestroy () {
  },
  watch: {
    'formDo': function (newVal, oldVal) {
      this.initQuestion()
    }
  },
  methods: {
    // 初始化题目
    initQuestion () {
      this.memberName = this.formDo.memberName
      this.form.name = this.formDo.name
      this.titleItems = [
        {
          questionItems: []
@@ -138,15 +144,17 @@
    doExam () {
      let _this = this
      examPaperApi.updateTestMemberStatus(_this.memberToken).then(re => {
        _this.$router.push({ path: '/exam/' + _this.doUrl, query: { formDo: _this.$route.query.formDo } })
        _this.$router.push({ path: '/exam/' + _this.doUrl, query: { formDo: _this.formDo } })
      }).catch(re => {
        _this.$message.error(re.message + ' 更新状态失败')
      })
    }
    },
    ...mapMutations('user', ['getFormDo'])
  },
  computed: {
    ...mapState('exam', { doUrl: state => state.doUrl }),
    ...mapState('user', { memberToken: state => state.memberToken })
    ...mapState('user', { memberToken: state => state.memberToken }),
    ...mapState('user', { formDo: state => state.formDo })
  }
}
</script>
src/views/exam/paper/finish.vue
@@ -44,9 +44,7 @@
        _this.downDisable = true
        // 设置下载路径
        _this.downUrl = '/api/exam/paper/download?fileName=' + re.msg + '&delete=false'
        console.log(re)
      } else {
        console.log(re)
      }
    })
src/views/exam/paper/guide.vue
@@ -1,11 +1,12 @@
<template>
  <div>
    <el-container class="app-item-contain">
  <div v-loading.fullscreen.lock="!formDo">
    <el-container class="app-item-contain" v-if="formDo">
      <el-header class="align-center" style="height: 50px;padding: 1%;margin-top: 4%">
        <H2 v-html="$t('guide')" v-if="formDo.questionTemplateId !== 'job' || formDo.questionTemplateId !== 'values'"></H2>
      </el-header>
      <el-main style="padding-top:0%">
        <div v-html="formDo.guide"></div>
        <div v-html="formDo.guide">
        </div>
        <el-row class="do-align-center">
          <el-button v-if="formDo.questionTemplateId !== 'personality'" @click="doExam" type="primary" round>{{$t('startDo')}}</el-button>
          <el-button v-if="formDo.questionTemplateId === 'job'" @click="openExplain" type="danger" round>{{$t('openJobDesc')}}</el-button>
@@ -17,27 +18,27 @@
</template>
<script>
import { mapState } from 'vuex'
import { mapState, mapMutations } from 'vuex'
import examPaperApi from '@/api/examPaper'
export default {
  data () {
    return {
      formDo: this.$route.query.formDo
      // formDo: this.$route.query.formDo,
      loading: false
    }
  },
  created () {
    this.getFormDo()
  },
  mounted () {
    // 替换APIFan指导语中的变量
    if (this.formDo.productType === 'API_Fan') {
      let guide = this.formDo.guide
      guide = guide.replace('%%fullName%%', this.formDo.memberName)
      guide = guide.replace('%%company%%', this.formDo.reportCompany)
      this.formDo.guide = guide
    }
    // this.swapGuide()
  },
  beforeDestroy () {
    window.clearInterval(this.timer)
  },
  watch: {
    'formDo': function (newVal, oldVal) {
      this.loading = false
    }
  },
  methods: {
    doExam: function () {
@@ -45,9 +46,11 @@
      examPaperApi.updateTestMemberStatus(_this.memberToken).then(re => {
        // LAQ特殊处理
        if (_this.formDo.name.indexOf('LAQ') !== -1) {
          _this.$router.push({ path: '/exam/' + _this.formDo.questionTemplateId, query: { formDo: _this.$route.query.formDo } })
          // _this.$router.push({ path: '/exam/' + _this.formDo.questionTemplateId, query: { formDo: _this.formDo } })
          _this.$router.push({ path: '/exam/' + _this.formDo.questionTemplateId })
        } else {
          _this.$router.push({ path: '/exam/' + _this.doUrl, query: { formDo: _this.$route.query.formDo } })
          // _this.$router.push({ path: '/exam/' + _this.doUrl, query: { formDo: _this.formDo } })
          _this.$router.push({ path: '/exam/' + _this.doUrl })
        }
      }).catch(re => {
        _this.$message.error(re.message + ' 更新状态失败')
@@ -61,12 +64,29 @@
    // 打开练习页面
    openExercise: function () {
      let _this = this
      _this.$router.push({ path: '/exam/exercise', query: { formDo: _this.$route.query.formDo } })
    }
      // _this.$router.push({ path: '/exam/exercise', query: { formDo: _this.formDo } })
      _this.$router.push({ path: '/exam/exercise' })
    },
    // 替换guide的值
    swapGuide: function () {
      // 替换APIFan指导语中的变量
      if (this.formDo.productType === 'API_Fan') {
        let guide = this.formDo.guide
        guide = guide.replace('%%fullName%%', this.formDo.memberName)
        guide = guide.replace('%%company%%', this.formDo.reportCompany)
        this.formDo.guide = guide
      }
    },
    ...mapMutations('user', ['getLangType']),
    ...mapMutations('user', ['getFormDo'])
  },
  computed: {
    ...mapState('exam', { doUrl: state => state.doUrl }),
    ...mapState('user', { memberToken: state => state.memberToken })
    ...mapState('user', { memberToken: state => state.memberToken }),
    ...mapState('user', { langType: state => state.langType }),
    ...mapState('user', { formDo: state => state.formDo })
  }
}
</script>
src/views/exam/paper/intelligence.vue
@@ -413,10 +413,10 @@
    },
    nextQuestion: function (nowPartOrder) {
      let _this = this
      let num = ++_this.order
      let num = _this.order + 1
      // 跳到没有答的题目的段
      while (_this.isContentNotEmpty(num) && num !== _this.answer.answerItems.length - 1) {
        num = ++_this.order
        num = _this.order + 1
        this.getEmptySubjct(num)
      }
      this.determineWhetherIntelligenceTitle()
src/views/exam/paper/job.vue
@@ -105,7 +105,7 @@
    let _this = this
    // 多语言
    _this.setLangFlag(false)
    _this.form = this.$route.query.formDo
    _this.form = undefined
    if (_this.form !== {} && _this.form !== undefined) {
      _this.formLoading = true
      _this.remainTime = _this.form.suggestTime * 60
src/views/exam/paper/personality.vue
@@ -103,12 +103,13 @@
    }
  },
  created: function () {
    // this.getFormDo()
    let _this = this
    _this.ismobile = /ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(navigator.userAgent.toLowerCase())
    // 多语言
    _this.setLangFlag(false)
    _this.form = this.$route.query.formDo
    if (_this.form !== {} && _this.form !== undefined) {
    _this.form = undefined
    if (_this.form && _this.form !== {} && _this.form !== undefined) {
      _this.formLoading = true
      _this.remainTime = _this.form.suggestTime * 60
      _this.problemLength = _this.form.titleItems[0].questionItems.length - 1
@@ -187,7 +188,6 @@
      ).catch(e => {
      })
    }
  },
  mounted () {
  },
@@ -510,7 +510,6 @@
        if (re.code === 1) {
          // 特殊处理 LAQ测试包 MAQ+CAQ
          if (_this.form.name.indexOf('LAQ') !== -1) {
            console.log('答完题,看看要不要去CAQ1')
            examPaperApi.select(_this.memberToken, _this.langType).then(re => {
              _this.form = re.response
              _this.$router.push({ path: '/guide/index', query: { formDo: _this.form } })
@@ -578,7 +577,8 @@
      return _this.form.titleItems[0].questionItems[_this.order].partOrder !== _this.form.titleItems[0].questionItems[_this.order - 1].partOrder
    },
    ...mapMutations('user', ['setLangType']),
    ...mapMutations('user', ['setLangFlag'])
    ...mapMutations('user', ['setLangFlag']),
    ...mapMutations('user', ['getFormDo'])
  },
  computed: {
    ...mapGetters('enumItem', ['enumFormat']),
@@ -586,6 +586,7 @@
    ...mapState('user', { memberToken: state => state.memberToken }),
    ...mapState('user', { langType: state => state.langType }),
    ...mapState('user', { langFlag: state => state.langFlag }),
    ...mapState('user', { formDo: state => state.formDo }),
    ...mapState('exam', { doUrl: state => state.doUrl })
  }
}