From 4d8f0c85660d7dd77199e86e9af9e945a1611e52 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期一, 08 七月 2024 09:41:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 src/utils/download.js            |   15 +
 src/utils/request.js             |   17 +
 src/views/exam/exam/monitor.vue  |    4 
 src/views/exam/paper/list.vue    |   67 ++---
 src/views/exam/question/list.vue |    1 
 src/views/exam/paper/import.vue  |  514 ++++++++++++++++++++++++++++++++++++++++++++++
 src/router.js                    |    7 
 src/api/examPaper.js             |    4 
 8 files changed, 589 insertions(+), 40 deletions(-)

diff --git a/src/api/examPaper.js b/src/api/examPaper.js
index 1a11e5c..32c1b7a 100644
--- a/src/api/examPaper.js
+++ b/src/api/examPaper.js
@@ -1,4 +1,4 @@
-import { post,get } from '@/utils/request'
+import { post, get, download } from '@/utils/request'
 
 export default {
   pageList: query => post('/api/admin/exam/paper/page', query),
@@ -7,4 +7,6 @@
   select: id => post('/api/admin/exam/paper/select/' + id),
   deletePaper: id => post('/api/admin/exam/paper/delete/' + id),
   myExamPaperList: param => get('/api/admin/exam/paper/my', param),
+  downloadImportTemplate: () => download('/api/admin/exam/paper/download/importTemplate'),
+  import: query => post('/api/admin/exam/paper/import', query),
 }
diff --git a/src/router.js b/src/router.js
index 9f0ea40..8fc0cf1 100644
--- a/src/router.js
+++ b/src/router.js
@@ -148,6 +148,13 @@
         hidden: true
       },
       {
+        path: 'paper/import',
+        component: () => import('@/views/exam/paper/import'),
+        name: 'ExamPaperImport',
+        meta: { title: '璇曞嵎瀵煎叆', noCache: true, activeMenu: '/exam/paper/list' },
+        hidden: true
+      },
+      {
         path: 'question/list',
         component: () => import('@/views/exam/question/list'),
         name: 'ExamQuestionPageList',
diff --git a/src/utils/download.js b/src/utils/download.js
new file mode 100644
index 0000000..713e178
--- /dev/null
+++ b/src/utils/download.js
@@ -0,0 +1,15 @@
+/**
+ * 涓嬭浇鏂囦欢
+ * @param data 鍝嶅簲鏁版嵁
+ */
+export function downloadExcel (data, fileName) {
+  // let url = window.URL.createObjectURL(data) // 灏嗕簩杩涘埗鏂囦欢杞寲涓哄彲璁块棶鐨剈rl
+  let url = window.URL.createObjectURL(new Blob([data])) // 灏嗕簩杩涘埗鏂囦欢杞寲涓哄彲璁块棶鐨剈rl
+
+  let a = document.createElement('a')
+  document.body.appendChild(a)
+  a.href = url
+  a.download = fileName + '.xlsx' // 鏂囦欢鍚�
+  a.click() // 妯℃嫙鐐瑰嚮涓嬭浇
+  window.URL.revokeObjectURL(url)
+}
diff --git a/src/utils/request.js b/src/utils/request.js
index 5457ae2..85b7402 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -104,10 +104,25 @@
   return request(false, query)
 }
 
+const download = function (url, params) {
+  const query = {
+    baseURL: process.env.VUE_APP_URL,
+    url: url,
+    method: 'get',
+    withCredentials: true,
+    timeout: 300000,
+    params: params,
+    responseType: 'blob', // 鍏抽敭
+    headers: { 'Content-Type': 'application/vnd.ms-excel' }// 绫诲瀷淇敼涓篹xcel
+  }
+  return request(false, query)
+}
+
 export {
   post,
   postWithLoadTip,
   postWithOutLoadTip,
   get,
-  form
+  form,
+  download
 }
diff --git a/src/views/exam/exam/monitor.vue b/src/views/exam/exam/monitor.vue
index eade8d1..e43fad8 100644
--- a/src/views/exam/exam/monitor.vue
+++ b/src/views/exam/exam/monitor.vue
@@ -23,7 +23,7 @@
             trigger="click">
             <el-form :model="addTimeForm" ref="addTimeForm" :rules="addTimeRule">
               <el-form-item label="瀛﹀憳">
-                <span>{{row.userName}}</span>
+                <div>{{row.userName}}</div>
               </el-form-item>
               <el-form-item label="鍔犲灏戝垎閽�">
                 <el-input v-model="addTimeForm.addTimeM" type="number" size="small"/>
@@ -94,7 +94,7 @@
         examId: null,
         userId: null,
         userName: '',
-        addTimeM: 0  // 娣诲姞澶氬皯鍒嗛挓
+        addTimeM: 1  // 娣诲姞澶氬皯鍒嗛挓
       },
       forceSubmitForm: {
         examId: null,
diff --git a/src/views/exam/paper/import.vue b/src/views/exam/paper/import.vue
new file mode 100644
index 0000000..eb6ff06
--- /dev/null
+++ b/src/views/exam/paper/import.vue
@@ -0,0 +1,514 @@
+<template>
+  <div class="app-container">
+    <el-form :model="form" ref="form" label-width="150px" v-loading="formLoading" :rules="rules">
+      <el-form-item label="瀛︾锛�" prop="subjectId" required>
+        <el-select v-model="form.subjectId" placeholder="瀛︾">
+          <el-option v-for="item in subjects" :key="item.id" :label="item.name" :value="item.id" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="璇曞嵎绫诲瀷锛�" prop="paperType" required>
+        <el-select v-model="form.paperType" placeholder="璇曞嵎绫诲瀷" disabled>
+          <el-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key" :label="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="璇曞嵎鍚嶇О锛�" prop="name" required>
+        <el-input style="width: 300px" v-model="form.name" />
+      </el-form-item>
+      <el-form-item label="鏂囦欢瀵煎叆锛�" prop="file" required>
+        <el-upload :on-change="handleChange" action="none" drag accept=".xlsx, .xls" :limit="1" :auto-upload="false">
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        </el-upload>
+      </el-form-item>
+      <!-- 棰樼洰璇︾粏淇℃伅 -->
+      <el-form-item :key="index" :label="'鏍囬' + (index + 1) + '锛�'" required
+        v-for="(titleItem, index) in form.questionTitleList"
+        v-show="form.paperType === 1 || (form.paperType === 3 && form.id)">
+        <el-input v-model="titleItem.title" style="width: 50%" />
+        <el-select @change="addQuestionType" v-model="titleItem.questionType" style="margin-left: 20px"
+          placeholder="璇烽�夋嫨棰樼洰绫诲瀷">
+          <el-option v-for="item in questionTypeList" :key="item.value" :label="item.name" :value="item.value"
+            :disabled="addedQuestionTypes.includes(item.value)" /><!-- 绂佺敤宸叉坊鍔犵殑閫夐」 -->
+        </el-select>
+        <el-input-number v-show="titleItem.questionList.length > 0" v-model="titleItem.eachScore"
+          @change="updateScores(titleItem)" :min="0" :precision="1" style="margin-left: 20px"
+          placeholder="姣忛鍒嗘暟"></el-input-number>
+        <el-button type="text" class="link-left" style="margin-left: 20px" size="mini" @click="addQuestion(titleItem)">
+          娣诲姞棰樼洰
+        </el-button>
+        <el-button type="text" class="link-left" size="mini" @click="removeTitleItem(titleItem, index)">鍒犻櫎</el-button>
+        <el-card class="exampaper-item-box" v-if="titleItem.questionList.length !== 0">
+          <el-form-item :key="questionIndex" :label="'棰樼洰' + (questionIndex + 1) + '锛�'"
+            v-for="(questionItem, questionIndex) in titleItem.questionList" style="margin-bottom: 15px">
+            <el-row>
+              <el-col :span="18">
+                <QuestionShow :qType="titleItem.questionType" :question="questionItem" />
+              </el-col>
+              <el-col :span="3">
+                <el-input-number v-model="questionItem.score" size="mini" :min="0" :precision="1" placeholder="鍒嗘暟"
+                  :controls="false" @change="updateTotalScore" />
+              </el-col>
+              <el-col :span="3">
+                <el-button type="text" size="mini" @click="removeQuestion(titleItem, questionIndex)">鍒犻櫎
+                </el-button>
+              </el-col>
+            </el-row>
+          </el-form-item>
+        </el-card>
+      </el-form-item>
+      <el-form-item label="澶氶�夐寰楀垎绫诲瀷锛�" prop="deductType">
+        <div>
+          <el-select v-model="form.deductType" placeholder="璇烽�夋嫨澶氶�夐寰楀垎绫诲瀷" style="width: 200px;margin-right: 30px">
+            <el-option v-for="item in deductTypeList" :key="item.value" :label="item.name" :value="item.value" />
+          </el-select>
+          <el-input-number v-model="form.deductTypeScore" placeholder="璇疯緭鍏ュ閫夎瘎鍒�"
+            v-show="form.deductType === 2 || form.deductType === 3" :min="0" />
+        </div>
+      </el-form-item>
+      <el-form-item label="寤鸿鏃堕暱(鍒嗛挓)锛�" prop="suggestTime" required>
+        <el-input-number v-model="form.suggestTime" placeholder="鍒嗛挓" :min="0" />
+      </el-form-item>
+      <el-form-item label="鏉冮檺锛�" prop="visibility">
+        <el-radio v-model="form.visibility" :label="'1'">绉佹湁</el-radio>
+        <el-radio v-model="form.visibility" :label="'2'">鍏紑</el-radio>
+      </el-form-item>
+      <!-- 棰樼洰閰嶇疆淇℃伅 闅忔満璇曞嵎鎴栨柊寤洪殢搴忔墠鏄剧ず -->
+      <el-form-item v-show="form.paperType === 2 || (form.paperType === 3 && !form.id)" :key="index"
+        :label="translateQuestionType(item.questionType) + '锛�'" v-for="(item, index) in form.questionSetting">
+        <div>
+          <span style="margin-right: 10px">{{ '鏍囬' }}</span>
+          <el-input v-model="item.title" style="margin-bottom: 20px;margin-right: 30px;width: 800px" />
+          <el-button type="primary" @click=addToQuestionSetting(item.questionType)>娣诲姞</el-button>
+
+          <div style="display: flex;" :key="index" v-for="(setting, index) in item.settingList">
+            <span style="margin-right: 10px;margin-bottom: 10px;">{{ '闅惧害' }}</span>
+            <el-rate v-model="setting.difficult" :precision="0" :min="0" style="margin-right: 25px;padding: 5px 0" />
+            <span style="margin-right: 10px">{{ '绉戠洰' }}</span>
+            <el-select v-model="setting.subjectId" placeholder="瀛︾" style="margin-right: 25px">
+              <el-option v-for="item in subjects" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
+            <span style="margin-right: 10px">{{ '鏁伴噺' }}</span>
+            <el-input-number v-model="setting.num" :precision="0" :min="0" style="margin-right: 25px" />
+            <span style="margin-right: 10px">{{ '姣忛鍒嗘暟' }}</span>
+            <el-input-number v-model="setting.score" :min="0" :precision="1" />
+          </div>
+
+        </div>
+      </el-form-item>
+      <!-- <el-form-item label="鍚堣锛�">
+        <div style="display: flex;">
+          <span style="margin-right: 10px">{{ '鏁伴噺锛�' }}</span>
+          <span v-if="form.paperType === 2 || (form.paperType === 3 && !form.id)"
+            style="margin-right: 50px;width: 100px">{{
+      totalNum
+    }}</span>
+          <span v-if="form.paperType === 1 || (form.paperType === 3 && form.id)"
+            style="margin-right: 50px;width: 100px">{{
+      form.num
+    }}</span>
+          <span style="margin-right: 10px">{{ '鎬诲垎锛�' }}</span>
+          <span v-if="form.paperType === 2 || (form.paperType === 3 && !form.id)" style="width: 100px">{{
+      totalScore
+    }}</span>
+          <span v-if="form.paperType === 1 || (form.paperType === 3 && form.id)" style="width: 100px">{{
+      form.score
+    }}</span>
+        </div>
+      </el-form-item> -->
+      <el-form-item>
+        <el-button type="primary" @click="submitForm">鎻愪氦</el-button>
+        <el-button @click="resetForm">閲嶇疆</el-button>
+        <!-- <el-button type="success" @click="addTitle" v-show="form.paperType ===1 ||(form.paperType ===3 && form.id)">
+          娣诲姞鏍囬
+        </el-button> -->
+      </el-form-item>
+    </el-form>
+
+    <el-dialog :visible.sync="questionPage.showDialog" width="70%">
+      <el-form :model="questionPage.queryParam" ref="queryForm" :inline="true">
+        <el-form-item label="ID锛�">
+          <el-input v-model="questionPage.queryParam.id" clearable></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="queryForm">鏌ヨ</el-button>
+        </el-form-item>
+      </el-form>
+      <el-table v-loading="questionPage.listLoading" :data="questionPage.tableData"
+        @selection-change="handleSelectionChange" border fit highlight-current-row style="width: 100%">
+        <el-table-column type="selection" width="35"></el-table-column>
+        <el-table-column prop="id" label="Id" width="60px" />
+        <el-table-column prop="questionType" label="棰樺瀷" width="70px">
+          <template slot-scope="scope">
+            <div> {{ translateQuestionType(scope.row.questionType) }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="shortTitle" label="棰樺共" show-overflow-tooltip />
+      </el-table>
+      <pagination v-show="questionPage.total > 0" :total="questionPage.total"
+        :page.sync="questionPage.queryParam.pageIndex" :limit.sync="questionPage.queryParam.pageSize"
+        @pagination="search" />
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="confirmQuestionSelect">纭畾</el-button>
+        <el-button @click="questionPage.showDialog = false">鍙� 娑�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import { mapState, mapActions } from 'vuex'
+import Pagination from '@/components/Pagination'
+import subjectApi from '@/api/subject'
+import QuestionShow from '../question/components/Show'
+import examPaperApi from '@/api/examPaper'
+import questionApi from '@/api/question'
+
+export default {
+  components: { Pagination, QuestionShow },
+  data() {
+    return {
+      form: {
+        file: '',
+        id: null,
+        subjectId: null,
+        paperType: 1,
+        name: '',
+        num: 0,
+        score: 0,
+        suggestTime: 0,
+        deductType: 1,
+        deductTypeScore: 0,
+        visibility: '1',
+        questionSetting: [
+          {
+            title: '鍗曢�夐',
+            questionType: 1,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          },
+          {
+            title: '澶氶�夐',
+            questionType: 2,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          },
+          {
+            title: '鍒ゆ柇棰�',
+            questionType: 3,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          },
+          {
+            title: '濉┖棰�',
+            questionType: 4,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          },
+          {
+            title: '绠�绛旈',
+            questionType: 5,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          },
+          {
+            title: '璇煶棰�',
+            questionType: 6,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          },
+          {
+            title: '璁$畻棰�',
+            questionType: 7,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          },
+          {
+            title: '鍒嗘瀽棰�',
+            questionType: 8,
+            settingList: [{ difficult: null, score: null, num: null, subjectId: null }]
+          }
+        ],
+        questionTitleList: []
+      },
+      deductTypeList: [
+        { name: '绛旈敊涓嶅緱鍒�', value: 1 },
+        { name: '婕忛�夊緱鍥哄畾鍒嗗��,鍖呭惈閿欒閫夐」涓嶅緱鍒�', value: 2 },
+        { name: '姣忓涓�棰樺緱鐩稿簲鍒嗗��,鍖呭惈閿欒閫夐」涓嶅緱鍒�', value: 3 },
+      ],
+      questionTypeList: [
+        { name: '鍗曢�夐', value: 1 },
+        { name: '澶氶�夐', value: 2 },
+        { name: '鍒ゆ柇棰�', value: 3 },
+        { name: '濉┖棰�', value: 4 },
+        { name: '绠�绛旈', value: 5 },
+        { name: '璇煶棰�', value: 6 },
+        { name: '璁$畻棰�', value: 7 },
+        { name: '鍒嗘瀽棰�', value: 8 }
+      ],
+      addedQuestionTypes: [], // 宸叉坊鍔犵殑棰樼洰绫诲瀷
+      subjects: [],
+      formLoading: false,
+      rules: {
+        level: [
+          { required: true, message: '璇烽�夋嫨骞寸骇', trigger: 'change' }
+        ],
+        subjectId: [
+          { required: true, message: '璇烽�夋嫨瀛︾', trigger: 'change' }
+        ],
+        paperType: [
+          { required: true, message: '璇烽�夋嫨璇曞嵎绫诲瀷', trigger: 'change' }
+        ],
+        name: [
+          { required: true, message: '璇疯緭鍏ヨ瘯鍗峰悕绉�', trigger: 'blur' }
+        ],
+        suggestTime: [
+          { required: true, message: '璇疯緭鍏ュ缓璁椂闀�', trigger: 'blur' }
+        ]
+      },
+      questionPage: {
+        multipleSelection: [],
+        showDialog: false,
+        queryParam: {
+          id: null,
+          questionType: [],
+          subjectId: [],
+          pageIndex: 1,
+          pageSize: 5
+        },
+        listLoading: true,
+        tableData: [],
+        total: 0
+      },
+      currentTitleItem: null
+    }
+  },
+  created() {
+    let id = this.$route.query.id
+    let _this = this
+    this.getSubjects()
+    if (id && parseInt(id) !== 0) {
+      _this.formLoading = true
+      examPaperApi.select(id).then(re => {
+        _this.form = re.data
+        _this.formLoading = false
+        this.addQuestionType()
+      })
+    }
+  },
+  methods: {
+    handleChange(file) {
+      this.form.file = file.raw;
+    },
+    addToQuestionSetting(questionType) {
+      this.form.questionSetting.forEach(item => {
+        if (item.questionType === questionType) {
+          item.settingList.push({ difficult: null, score: null, num: null, subjectId: null })
+        }
+      })
+    },
+    updateTotalScore() {
+      this.form.score = 0
+      this.form.questionTitleList.forEach(titleItem => {
+        titleItem.questionList.forEach(questionItem => {
+          if (questionItem.score) {
+            this.form.score += questionItem.score
+          }
+        })
+      })
+    },
+    updateScores(titleItem) {
+      if (titleItem && titleItem.questionList) {
+        titleItem.questionList.forEach(questionItem => {
+          questionItem.score = titleItem.eachScore // 鏇存柊姣忎釜棰樼洰鐨勫垎鏁�
+        })
+      }
+      this.updateTotalScore()
+    },
+    // 娣诲姞棰樼洰绫诲瀷
+    addQuestionType() {
+      if (this.form.questionTitleList.length > 0) {
+        this.addedQuestionTypes = []
+        // 閬嶅巻棰樼洰鍒楄〃
+        this.form.questionTitleList.forEach((titleItem) => {
+          // 妫�鏌ュ綋鍓嶉鐩殑绫诲瀷鏄惁杩樻病鏈夎娣诲姞鍒板凡娣诲姞鐨勯鐩被鍨嬫暟缁勪腑
+          if (!this.addedQuestionTypes.includes(titleItem.questionType)) {
+            // 濡傛灉杩樻病鏈夎娣诲姞锛屽垯娣诲姞鍒版暟缁勪腑
+            this.addedQuestionTypes.push(titleItem.questionType)
+          }
+        })
+      }
+    },
+    // 鑾峰彇绉戠洰
+    getSubjects() {
+      subjectApi.list().then(re => {
+        this.subjects = re.data
+      })
+    },
+    translateQuestionType(questionTypeId) {
+      const questionType = this.questionTypeList.find(questionType => questionType.value === questionTypeId)
+      return questionType ? questionType.name : '鏈煡'
+    },
+    submitForm() {
+      console.log("form:", this.form);
+      let _this = this
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.formLoading = true
+          if (this.form.id) {
+            examPaperApi.edit(this.form).then(re => {
+              if (re.code === 1) {
+                _this.$message.success(re.message)
+                _this.delCurrentView(_this).then(() => {
+                  _this.$router.push('/exam/paper/list')
+                })
+              } else {
+                _this.$message.error(re.message)
+                this.formLoading = false
+              }
+            }).catch(e => {
+              this.formLoading = false
+            })
+          } else {
+            let formData = new FormData();
+            formData.append('file', this.form.file);
+            formData.append('examPaper', JSON.stringify(this.form));
+            examPaperApi.import(formData).then(re => {
+              if (re.code === 1) {
+                _this.$message.success(re.message)
+                _this.delCurrentView(_this).then(() => {
+                  _this.$router.push('/exam/paper/list')
+                })
+              } else {
+                _this.$message.error(re.message)
+                this.formLoading = false
+              }
+            }).catch(e => {
+              this.formLoading = false
+            })
+          }
+        } else {
+          return false
+        }
+      })
+    },
+    addTitle() {
+      this.form.questionTitleList.push({
+        questionList: []
+      })
+    },
+    addQuestion(titleItem) {
+      this.currentTitleItem = titleItem
+      this.questionPage.queryParam.questionType = []
+      this.questionPage.queryParam.questionType.push(titleItem.questionType)
+      this.questionPage.showDialog = true
+      this.search()
+    },
+    removeTitleItem(titleItem, index) {
+      this.form.questionTitleList.splice(index, 1)
+      this.form.num = this.form.num - titleItem.questionList.length
+      this.updateTotalScore()
+      if (!this.form.questionTitleList || this.form.questionTitleList.length === 0) {
+        this.addedQuestionTypes = []
+      } else {
+        this.addQuestionType()
+      }
+    },
+    removeQuestion(titleItem, questionIndex) {
+      titleItem.questionList.splice(questionIndex, 1)
+      this.updateTotalScore()
+      this.form.num = this.form.num - 1
+    },
+    queryForm() {
+      this.questionPage.queryParam.pageIndex = 1
+      this.search()
+    },
+    confirmQuestionSelect() {
+      let _this = this
+      this.questionPage.multipleSelection.forEach(q => {
+        questionApi.select(q.id).then(re => {
+          _this.currentTitleItem.questionList.push(re.data)
+          this.form.num += 1
+        })
+      })
+      this.questionPage.showDialog = false
+    },
+    search() {
+      this.questionPage.queryParam.subjectId = []
+      this.questionPage.queryParam.subjectId.push(this.form.subjectId)
+      this.questionPage.listLoading = true
+      questionApi.pageList(this.questionPage.queryParam).then(data => {
+        const re = data.data
+        this.questionPage.tableData = re.list
+        this.questionPage.total = re.total
+        this.questionPage.queryParam.pageIndex = re.pageNum
+        this.questionPage.listLoading = false
+      })
+    },
+    handleSelectionChange(val) {
+      this.questionPage.multipleSelection = val
+    },
+    resetForm() {
+      let lastId = this.form.id
+      this.$refs['form'].resetFields()
+      this.form = {
+        file: '',
+        subjectId: null,
+        paperType: 1,
+        name: '',
+        num: 0,
+        score: 0,
+        suggestTime: 0,
+        deductType: 1,
+        deductTypeScore: 0,
+        visibility: '1',
+        questionSetting: [
+          { questionType: 1, title: '鍗曢�夐', score: null, num: null },
+          { questionType: 2, title: '澶氶�夐', score: null, num: null },
+          { questionType: 3, title: '鍒ゆ柇棰�', score: null, num: null },
+          { questionType: 4, title: '濉┖棰�', score: null, num: null },
+          { questionType: 5, title: '绠�绛旈', score: null, num: null },
+          { questionType: 6, title: '璇煶棰�', score: null, num: null },
+          { questionType: 7, title: '璁$畻棰�', score: null, num: null },
+          { questionType: 8, title: '鍒嗘瀽棰�', score: null, num: null },
+        ],
+        questionTitleList: []
+      }
+      this.form.id = lastId
+    },
+    ...mapActions('tagsView', { delCurrentView: 'delCurrentView' })
+  },
+  computed: {
+    ...mapState('enumItem', {
+      paperTypeEnum: state => state.exam.examPaper.paperTypeEnum,
+    }),
+    totalNum() {
+      if (this.form.paperType === 2 || this.form.paperType === 3) {
+        let total = 0
+        for (let item of this.form.questionSetting) {
+          total += parseInt(item.num || 0, 10)
+        }
+        this.form.num = total
+        return total
+      } else {
+
+      }
+    },
+    totalScore() {
+      if (this.form.paperType === 2 || this.form.paperType === 3) {
+        let total = 0
+        for (let item of this.form.questionSetting) {
+          const num = parseInt(item.num || 0, 10)
+          const score = parseFloat(item.score || 0)
+          total += num * score
+        }
+        this.form.score = total.toFixed(1)
+        return total.toFixed(1) // 淇濈暀涓�浣嶅皬鏁�
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.exampaper-item-box {
+  .q-title {
+    margin: 0px 5px 0px 5px;
+  }
+
+  .q-item-content {}
+}
+</style>
diff --git a/src/views/exam/paper/list.vue b/src/views/exam/paper/list.vue
index 322bd4d..e8c34ef 100644
--- a/src/views/exam/paper/list.vue
+++ b/src/views/exam/paper/list.vue
@@ -6,53 +6,41 @@
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="submitForm">鏌ヨ</el-button>
-        <router-link :to="{path:'/exam/paper/edit'}" class="link-left">
+        <router-link :to="{ path: '/exam/paper/edit' }" class="link-left">
           <el-button type="primary" >娣诲姞</el-button>
+        </router-link>
+        <el-button class="link-left" type="danger" @click="downloadImportTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
+        <router-link :to="{ path: '/exam/paper/import' }" class="link-left">
+          <el-button type="success">瀵煎叆</el-button>
         </router-link>
       </el-form-item>
     </el-form>
     <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
-      <el-table-column align="center" prop="id" label="Id" width="90px"/>
-      <el-table-column align="center" prop="name" label="鍚嶇О"  />
-      <el-table-column
-        align="center"
-        prop="paperType"
-        label="璇曞嵎绫诲瀷"
-      >
+      <el-table-column align="center" prop="id" label="Id" width="90px" />
+      <el-table-column align="center" prop="name" label="鍚嶇О" />
+      <el-table-column align="center" prop="paperType" label="璇曞嵎绫诲瀷">
         <template slot-scope="scope">
           <div v-if="scope.row.paperType === 1">鍥哄畾璇曞嵎</div>
           <div v-else-if="scope.row.paperType === 2">闅忔満璇曞嵎</div>
           <div v-else-if="scope.row.paperType === 3">闅忓簭璇曞嵎</div>
         </template>
       </el-table-column>
-      <el-table-column
-        align="center"
-        prop="suggestTime"
-        label="寤鸿鏃堕暱(鍒嗛挓)"
-      >
+      <el-table-column align="center" prop="suggestTime" label="寤鸿鏃堕暱(鍒嗛挓)">
       </el-table-column>
-      <el-table-column
-        align="center"
-        prop="num"
-        label="棰樼洰鏁伴噺"
-      >
+      <el-table-column align="center" prop="num" label="棰樼洰鏁伴噺">
       </el-table-column>
-      <el-table-column
-        align="center"
-        prop="score"
-        label="鎬诲垎"
-      >
+      <el-table-column align="center" prop="score" label="鎬诲垎">
       </el-table-column>
-      <el-table-column align="center" prop="createTime" label="鍒涘缓鏃堕棿" width="160px"/>
-      <el-table-column  label="鎿嶄綔" align="center"  width="160px">
+      <el-table-column align="center" prop="createTime" label="鍒涘缓鏃堕棿" width="160px" />
+      <el-table-column label="鎿嶄綔" align="center" width="160px">
         <template slot-scope="{row}">
-          <el-button size="mini" @click="$router.push({path:'/exam/paper/edit',query:{id:row.id}})" >缂栬緫</el-button>
-          <el-button size="mini" type="danger"  @click="deletePaper(row)" class="link-left">鍒犻櫎</el-button>
+          <el-button size="mini" @click="$router.push({ path: '/exam/paper/edit', query: { id: row.id } })">缂栬緫</el-button>
+          <el-button size="mini" type="danger" @click="deletePaper(row)" class="link-left">鍒犻櫎</el-button>
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
-                @pagination="search"/>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize"
+      @pagination="search" />
   </div>
 </template>
 
@@ -60,10 +48,11 @@
 import Pagination from '@/components/Pagination'
 import subjectApi from '@/api/subject'
 import examPaperApi from '@/api/examPaper'
+import { downloadExcel } from '@/utils/download'
 
 export default {
   components: { Pagination },
-  data () {
+  data() {
     return {
       queryParam: {
         id: null,
@@ -78,16 +67,22 @@
       total: 0
     }
   },
-  created () {
+  created() {
     this.getSubjects()
     this.search()
   },
   methods: {
-    submitForm () {
+    // 涓嬭浇瀵煎叆妯℃澘
+    downloadImportTemplate() {
+      examPaperApi.downloadImportTemplate().then(res => {
+        downloadExcel(res, '棰樼洰瀵煎叆妯℃澘')
+      })
+    },
+    submitForm() {
       this.queryParam.pageIndex = 1
       this.search()
     },
-    search () {
+    search() {
       this.listLoading = true
       examPaperApi.pageList(this.queryParam).then(data => {
         const re = data.data
@@ -97,7 +92,7 @@
         this.listLoading = false
       })
     },
-    deletePaper (row) {
+    deletePaper(row) {
       let _this = this
       examPaperApi.deletePaper(row.id).then(re => {
         if (re.code === 1) {
@@ -109,12 +104,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 : '鏈煡';
     }
diff --git a/src/views/exam/question/list.vue b/src/views/exam/question/list.vue
index 26eac15..512f167 100644
--- a/src/views/exam/question/list.vue
+++ b/src/views/exam/question/list.vue
@@ -31,6 +31,7 @@
       </el-form-item>
     </el-form>
     <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%">
+      <el-table-column align="center" prop="id" label="缂栧彿" width="80px" />
       <el-table-column align="center" prop="shortTitle" label="棰樼洰" show-overflow-tooltip>
       </el-table-column>
       <el-table-column align="center" prop="subjectName" label="绉戠洰" width="150px">

--
Gitblit v1.8.0