浏览代码

提交...

weiwenhai 6 年之前
父节点
当前提交
567231b728

+ 5 - 0
src/modules/questions/routes/routes.js

@@ -19,6 +19,7 @@ import EditSelectQuestion from "../views/EditSelectQuestion.vue";
 import EditOtherQuestion from "../views/EditOtherQuestion.vue";
 import InsertPaperTitle from "../views/InsertPaperTitle.vue";
 import EditPaper from "../views/EditPaper.vue";
+import PreviewPaper from "../views/PreviewPaper.vue";
 
 export default [
   {
@@ -121,6 +122,10 @@ export default [
         path:
           "edit_select_question/:paperId/:paperDetailId/:questionType/:courseNo/:courseName",
         component: EditSelectQuestion
+      },
+      {
+        path: "preview_paper/:paperId", //预览试卷
+        component: PreviewPaper
       }
     ]
   }

+ 2 - 2
src/modules/questions/views/BluePaperStructure.vue

@@ -10,7 +10,7 @@
       >
         <el-row>
           <el-col :span="6">
-            <el-form-item label="结构名称" class="pull-left">
+            <el-form-item label="结构名称">
               <el-input
                 class="search_width"
                 placeholder="请输入结构名称"
@@ -112,7 +112,7 @@
                 size="mini"
                 type="primary"
                 @click="editStruct(scope.row)"
-                ><i class="el-icon-edit"></i>修改</el-button
+                ><i class="el-icon-edit"></i>编辑</el-button
               >
               <el-button
                 size="mini"

+ 136 - 139
src/modules/questions/views/ExportStructure.vue

@@ -1,145 +1,141 @@
 <template>
-  <div v-loading="loading">
-    <section class="content">
-      <div class="box box-info">
-        <!-- 头信息 -->
-        <div class="box-header with-border">
-          <h3 class="box-title">导出结构</h3>
-        </div>
-        <!-- 正文信息 -->
-        <div class="box-body">
-          <el-form :inline="true" :model="formSearch">
-            <el-row>
-              <el-form-item label="考试类型">
-                <el-select
-                  class="input_width_lg"
-                  filterable
-                  clearable
-                  v-model="formSearch.examType"
-                  placeholder="请选择"
-                >
-                  <el-option
-                    v-for="item in EXAM_TYPES"
-                    :label="item.label"
-                    :value="item.value"
-                    :key="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="考试名称">
-                <el-select
-                  filterable
-                  clearable
-                  v-model="formSearch.examId"
-                  placeholder="请选择"
-                  :remote-method="getExams"
-                  remote
-                >
-                  <el-option
-                    v-for="item in examList"
-                    :key="item.id"
-                    :label="item.name"
-                    :value="item.id"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="导出类型">
-                <el-select
-                  class="input_width_lg"
-                  filterable
-                  clearable
-                  v-model="formSearch.exportType"
-                  placeholder="请选择"
-                >
-                  <el-option
-                    v-for="item in EXPORT_TYPES"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item>
-                <el-button size="small" type="primary" @click="search"
-                  >查询</el-button
+  <section class="content">
+    <!-- 正文信息 -->
+    <div class="box-body">
+      <el-form
+        :inline="true"
+        :model="formSearch"
+        label-position="right"
+        label-width="90px"
+      >
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="考试类型">
+              <el-select
+                class="search_width"
+                v-model="formSearch.examType"
+                filterable
+                clearable
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in EXAM_TYPES"
+                  :label="item.label"
+                  :value="item.value"
+                  :key="item.value"
                 >
-              </el-form-item>
-              <el-form-item>
-                <el-button size="small" type="primary" @click="add"
-                  >新增</el-button
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="考试名称">
+              <el-select
+                class="search_width"
+                v-model="formSearch.examId"
+                filterable
+                :remote-method="getExams"
+                remote
+                clearable
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in examList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
                 >
-              </el-form-item>
-            </el-row>
-          </el-form>
-          <!-- 页面列表 -->
-          <el-table
-            :data="tableData"
-            border
-            style="width: 100%;text-align:center;"
-          >
-            <el-table-column label="考试类型">
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <span>{{ scope.row.examType | examTypesFilter }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="考试名称">
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <span>{{ scope.row.examName }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="导出类型">
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <span>{{ scope.row.exportType | exportTypesFilter }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="题数">
-              <template slot-scope="scope">
-                <div
-                  class="el_table_inner_left"
-                  v-show="scope.row.exportType == 'NORMAL'"
-                  v-for="(item, index) in scope.row.questionTypeNums"
-                  :key="index"
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="导出类型">
+              <el-select
+                class="search_width"
+                v-model="formSearch.exportType"
+                filterable
+                clearable
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in EXPORT_TYPES"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
                 >
-                  <span>{{ item.questionType | questionType }}</span>
-                  <span>{{ item.quantity }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column :context="_self" fixed="right" label="操作">
-              <template slot-scope="scope">
-                <div>
-                  <el-button size="small" type="info" @click="copy(scope.row)"
-                    >复用</el-button
-                  >
-                  <el-button size="small" type="danger" @click="del(scope.row)"
-                    >删除</el-button
-                  >
-                </div>
-              </template>
-            </el-table-column>
-          </el-table>
-          <div class="page pull-right">
-            <el-pagination
-              @current-change="handleCurrentChange"
-              :current-page="currentPage"
-              :page-size="pageSize"
-              layout="total, prev, pager, next, jumper"
-              :total="total"
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <div class="search_down">
+              <el-button size="small" type="primary" @click="search"
+                ><i class="el-icon-search"></i> 查询</el-button
+              >
+              <el-button size="small" type="primary" @click="add"
+                ><i class="el-icon-plus"></i> 新增</el-button
+              >
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+      <!-- 页面列表 -->
+      <el-table border :data="tableData">
+        <el-table-column label="考试类型">
+          <template slot-scope="scope">
+            <span>{{ scope.row.examType | examTypesFilter }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="考试名称">
+          <template slot-scope="scope">
+            <span>{{ scope.row.examName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="导出类型">
+          <template slot-scope="scope">
+            <span>{{ scope.row.exportType | exportTypesFilter }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="题数">
+          <template slot-scope="scope">
+            <div
+              v-show="scope.row.exportType == 'NORMAL'"
+              v-for="(item, index) in scope.row.questionTypeNums"
+              :key="index"
             >
-            </el-pagination>
-          </div>
-        </div>
+              <span>{{ item.questionType | questionType }}</span>
+              <span>{{ item.quantity }}</span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="175">
+          <template slot-scope="scope">
+            <div class="operate_left">
+              <el-button size="mini" type="primary" @click="copy(scope.row)"
+                ><i class="el-icon-edit"></i>复用</el-button
+              >
+              <el-button size="mini" type="danger" @click="del(scope.row)"
+                ><i class="el-icon-delete"></i> 删除</el-button
+              >
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="page pull-right">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-size="pageSize"
+          layout="total, prev, pager, next, jumper"
+          :total="total"
+        >
+        </el-pagination>
       </div>
-    </section>
+    </div>
     <!-- 复用窗口 -->
     <el-dialog title="试卷结构复用" :visible.sync="dialogCopyModel">
       <el-form :model="exportStructureCopy" ref="exportStructureCopy">
@@ -265,7 +261,6 @@
             >请选择考试名称</span
           >
         </el-form-item>
-
         <el-form-item label="导出类型" label-width="120px">
           <el-select
             v-model="exportStructure.exportType"
@@ -314,9 +309,8 @@
         >
       </div>
     </el-dialog>
-  </div>
+  </section>
 </template>
-
 <script>
 import { QUESTION_API, EXAM_WORK_API } from "@/constants/constants";
 import { EXAM_TYPES, EXPORT_TYPES } from "../constants/constants";
@@ -668,3 +662,6 @@ export default {
   }
 };
 </script>
+<style scoped>
+@import "../styles/Common.css";
+</style>

+ 79 - 59
src/modules/questions/views/ExtractPaperRule.vue

@@ -32,54 +32,55 @@
               </el-select>
             </el-form-item>
           </el-col>
-
-          <el-form-item label="课程名称">
-            <el-select
-              filterable
-              clearable
-              v-model="formSearch.courseNo"
-              placeholder="请选择"
-              :remote-method="getCourses"
-              remote
-            >
-              <el-option
-                v-for="item in courseInfoSelect"
-                :label="item.courseInfo"
-                :value="item.courseNo"
-                :key="item.courseNo"
+          <el-col :span="6">
+            <el-form-item label="课程名称">
+              <el-select
+                class="search_width"
+                v-model="formSearch.courseNo"
+                filterable
+                :remote-method="getCourses"
+                remote
+                clearable
+                placeholder="请选择"
+                size="small"
               >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item class="pull-right buttonframe">
-            <el-button
-              size="small"
-              type="primary"
-              icon="search"
-              @click="searchRulePaper"
-              >查询</el-button
-            >
-            <el-button
-              size="small"
-              type="primary"
-              icon="plus"
-              @click="markRules"
-              >新增</el-button
-            >
-            <el-button
-              size="small"
-              type="primary"
-              icon="upload2"
-              @click="openBatchExportPaperDialog"
-              >批量导出
+                <el-option
+                  v-for="item in courseInfoSelect"
+                  :label="item.courseInfo"
+                  :value="item.courseNo"
+                  :key="item.courseNo"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <div class="search_down">
+              <el-button size="small" type="primary" @click="searchRulePaper"
+                ><i class="el-icon-search"></i> 查询</el-button
+              >
+              <el-button size="small" type="primary" @click="markRules"
+                ><i class="el-icon-plus"></i> 新增</el-button
+              >
+            </div>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-form-item class="pull-left">
+            <el-button size="small" type="primary" @click="openBatchExpDialog"
+              ><i class="el-icon-download"></i> 批量下载成卷
             </el-button>
           </el-form-item>
         </el-row>
       </el-form>
 
       <!-- 页面列表 -->
-      <el-table :data="tableData" border style="width: 100%;text-align:center;">
-        <el-table-column prop="examName" label="考试名称"> </el-table-column>
+      <el-table :data="tableData" border style="width: 100%">
+        <el-table-column label="考试名称" width="180">
+          <template slot-scope="scope">
+            <span>{{ scope.row.examName }}</span>
+          </template>
+        </el-table-column>
         <el-table-column label="考试类型">
           <template slot-scope="scope">
             <div class="el_table_inner_left">
@@ -93,8 +94,16 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="courseName" label="课程名称"> </el-table-column>
-        <el-table-column prop="courseCode" label="课程代码"> </el-table-column>
+        <el-table-column label="课程名称">
+          <template slot-scope="scope">
+            <span>{{ scope.row.courseName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="课程代码" width="140">
+          <template slot-scope="scope">
+            <span>{{ scope.row.courseCode }}</span>
+          </template>
+        </el-table-column>
         <el-table-column label="调卷类型">
           <template slot-scope="scope">
             <div class="el_table_inner_left">
@@ -105,31 +114,34 @@
         </el-table-column>
         <el-table-column label="调卷规则">
           <template slot-scope="scope">
-            <div class="el_table_inner_left">
-              <span v-show="scope.row.id">
-                <el-tag type="success">已制定</el-tag>
-              </span>
-            </div>
+            <span v-show="scope.row.id">
+              <el-tag type="success">已制定</el-tag>
+            </span>
           </template>
         </el-table-column>
-        <el-table-column label="操作">
+        <el-table-column label="操作" width="180">
           <template slot-scope="scope">
-            <div>
+            <div class="operate_left">
+              <el-button
+                v-if="scope.row.id"
+                size="mini"
+                type="primary"
+                @click="updateRules(scope.row)"
+                ><i class="el-icon-edit"></i>修改
+              </el-button>
               <el-button
                 v-if="scope.row.ifFinish == 1"
-                size="small"
+                size="mini"
                 type="primary"
                 @click="openSingleExportPaperDialog(scope.row)"
-              >
-                导出
+                ><i class="el-icon-download"></i> 下载
               </el-button>
               <el-button
-                v-if="scope.row.id"
-                size="small"
-                type="warning"
-                @click="updateRules(scope.row)"
+                size="mini"
+                type="primary"
+                @click="openPreViewDialog(scope.row)"
               >
-                修改
+                预览
               </el-button>
             </div>
           </template>
@@ -294,6 +306,11 @@ export default {
     };
   },
   methods: {
+    openPreViewDialog(row) {
+      this.$router.push({
+        path: "/questions/preview_paper/" + row.examPaperList[0].paper.id
+      });
+    },
     //初始化
     initialize(examId) {
       this.examList = [];
@@ -382,7 +399,7 @@ export default {
       this.isShowPrintExamPackagePassword = false;
       this.printExamPackagePassword = "";
     },
-    openBatchExportPaperDialog() {
+    openBatchExpDialog() {
       this.exportModel = {
         examType: "",
         examId: "",
@@ -637,3 +654,6 @@ export default {
   }
 };
 </script>
+<style scoped>
+@import "../styles/Common.css";
+</style>

+ 142 - 138
src/modules/questions/views/InsertPaperStructure.vue

@@ -1,40 +1,49 @@
 <template>
   <div id="insertApp">
+    <LinkTitlesCustom :currentPaths="['精确结构创建', '创建大题']" />
     <section class="content">
-      <div>
-        <!-- 头信息 -->
-        <div><h3 class="box-title">精确结构创建-->创建大题</h3></div>
-        <!-- 正文信息 -->
-        <div class="box-body">
-          <el-form
-            :inline="true"
-            :model="paperStruct"
-            ref="paperStruct"
-            :rules="rules2"
-          >
-            <el-row>
-              <el-form-item label="精确结构名称" prop="name">
+      <!-- 正文信息 -->
+      <div class="box-body">
+        <el-form
+          :inline="true"
+          :model="paperStruct"
+          ref="paperStruct"
+          :rules="rules2"
+          label-position="right"
+          label-width="90px"
+        >
+          <el-row>
+            <el-col :span="6">
+              <el-form-item label="结构名称" prop="name">
                 <el-input
+                  class="search_width"
                   v-model="paperStruct.name"
-                  auto-complete="off"
                   placeholder="试卷结构名称"
+                  size="small"
                 ></el-input>
               </el-form-item>
+            </el-col>
+            <el-col :span="6">
               <el-form-item label="总分" prop="score">
                 <el-input
+                  class="search_width"
                   v-model.number="paperStruct.totalScore"
-                  auto-complete="off"
                   placeholder="请输入总分"
+                  size="small"
                 ></el-input>
               </el-form-item>
+            </el-col>
+            <el-col :span="6">
               <el-form-item label="制定课程">
                 <el-select
+                  class="search_width"
                   v-model="paperStruct.courseNo"
                   filterable
                   :remote-method="getCourses"
                   remote
                   clearable
                   placeholder="请选择"
+                  size="small"
                 >
                   <el-option label="请选择" value="ALL" key="ALL"></el-option>
                   <el-option label="公用" value="" key=""></el-option>
@@ -47,153 +56,146 @@
                   </el-option>
                 </el-select>
               </el-form-item>
-              <el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <div class="search_down">
                 <el-button
                   size="small"
-                  type="success"
+                  type="primary"
+                  icon="el-icon-circle-check"
                   :disabled="button_disabled"
                   @click="savePaperStruct()"
-                >
-                  <i class="fa fa-floppy-o"></i>保 存</el-button
+                  >保 存</el-button
                 >
                 <el-button
                   size="small"
                   type="primary"
-                  icon="plus"
+                  icon="el-icon-plus"
                   :disabled="button_disabled"
                   @click="insert()"
                   >添加大题</el-button
                 >
                 <el-button
                   size="small"
-                  type="primary"
-                  icon="caret-left"
+                  type="success"
+                  icon="el-icon-caret-left"
                   @click="back"
                   >返 回</el-button
                 >
+              </div>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-form-item label="考试说明">
+              <div style="width:550px;">
+                <ckeditor
+                  :editor="editor"
+                  v-model="paperStruct.examRemark"
+                  :config="editorConfig"
+                ></ckeditor>
+              </div>
+            </el-form-item>
+          </el-row>
+        </el-form>
+
+        <!-- 添加大题弹出框 -->
+        <el-dialog
+          title="大题信息"
+          :visible.sync="paperDetailStructDialog"
+          size="tiny"
+        >
+          <el-form
+            :inline="true"
+            :model="paperDetailStructForm"
+            ref="paperDetailStructForm"
+            :rules="rules"
+            label-position="right"
+            label-width="90px"
+          >
+            <el-row>
+              <el-form-item label="大题名称" label-width="120px" prop="name">
+                <el-input
+                  v-model="paperDetailStructForm.name"
+                  placeholder="请输入题型名称"
+                ></el-input>
               </el-form-item>
             </el-row>
             <el-row>
-              <el-form-item label="考试说明">
-                <div style="width:550px;">
-                  <ckeditor
-                    :editor="editor"
-                    v-model="paperStruct.examRemark"
-                    :config="editorConfig"
-                  ></ckeditor>
-                </div>
+              <el-form-item label="题型描述" label-width="120px" prop="remark">
+                <el-input
+                  type="textarea"
+                  :rows="2"
+                  v-model="paperDetailStructForm.remark"
+                  placeholder="请输入题型描述"
+                ></el-input>
               </el-form-item>
             </el-row>
+            <el-row>
+              <span v-if="dialogType == 'ADD'">
+                <el-button
+                  type="primary"
+                  @click="submitForm('paperDetailStructForm')"
+                  >保 存</el-button
+                >
+              </span>
+              <span v-else>
+                <el-button
+                  type="primary"
+                  @click="submitEditForm('paperDetailStructForm')"
+                  >保 存</el-button
+                >
+              </span>
+              <el-button type="danger" @click="resetForm()">重 置</el-button>
+            </el-row>
           </el-form>
+        </el-dialog>
 
-          <!-- 添加大题弹出框 -->
-          <el-dialog
-            title="大题信息"
-            :visible.sync="paperDetailStructDialog"
-            size="tiny"
-          >
-            <el-form
-              :inline="true"
-              :model="paperDetailStructForm"
-              ref="paperDetailStructForm"
-              :rules="rules"
-              label-position="right"
-              label-width="90px"
-            >
-              <el-row>
-                <el-form-item label="大题名称" label-width="120px" prop="name">
-                  <el-input
-                    v-model="paperDetailStructForm.name"
-                    auto-complete="off"
-                    placeholder="请输入题型名称"
-                  ></el-input>
-                </el-form-item>
-              </el-row>
-              <el-row>
-                <el-form-item
-                  label="题型描述"
-                  label-width="120px"
-                  prop="remark"
+        <!-- 页面列表 -->
+        <el-table :data="paperDetailStructs" border>
+          <el-table-column label="大题名称">
+            <template slot-scope="scope">
+              <span>{{ scope.row.name }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="小题数">
+            <template slot-scope="scope">
+              <span>{{ scope.row.detailCount }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="大题分数">
+            <template slot-scope="scope">
+              <span>{{ scope.row.totalScore }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="180">
+            <template slot-scope="scope">
+              <div class="operate_left">
+                <el-button
+                  size="mini"
+                  type="primary"
+                  icon="el-icon-plus"
+                  @click="insertTopicStruct(scope.row)"
+                  >添加小题</el-button
                 >
-                  <el-input
-                    type="textarea"
-                    :rows="2"
-                    v-model="paperDetailStructForm.remark"
-                    auto-complete="off"
-                    placeholder="请输入题型描述"
-                  ></el-input>
-                </el-form-item>
-              </el-row>
-              <el-row>
-                <span v-if="dialogType == 'ADD'">
-                  <el-button
-                    type="primary"
-                    @click="submitForm('paperDetailStructForm')"
-                    >保 存</el-button
-                  >
-                </span>
-                <span v-else>
-                  <el-button
-                    type="primary"
-                    @click="submitEditForm('paperDetailStructForm')"
-                    >保 存</el-button
-                  >
-                </span>
-                <el-button type="danger" @click="resetForm()">重 置</el-button>
-              </el-row>
-            </el-form>
-          </el-dialog>
-
-          <!-- 页面列表 -->
-          <el-table :data="paperDetailStructs" border>
-            <el-table-column label="大题名称">
-              <template slot-scope="scope">
-                <div>
-                  <span>{{ scope.row.name }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="小题数">
-              <template slot-scope="scope">
-                <div>
-                  <span>{{ scope.row.detailCount }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="大题分数">
-              <template slot-scope="scope">
-                <div>
-                  <span>{{ scope.row.totalScore }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column :context="_self" label="操作">
-              <template slot-scope="scope">
-                <div>
-                  <el-button
-                    size="mini"
-                    type="primary"
-                    @click="insertTopicStruct(scope.row)"
-                    >添加小题</el-button
-                  >
-                  <el-button
-                    size="mini"
-                    type="info"
-                    @click="editPaperDetail(scope.row.id)"
-                  >
-                    编辑
-                  </el-button>
-                  <el-button
-                    size="mini"
-                    type="danger"
-                    @click="deletePaperDetail(scope.row.id)"
-                    >删除</el-button
-                  >
-                </div>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
+                <el-button
+                  size="mini"
+                  type="info"
+                  icon="el-icon-edit"
+                  @click="editPaperDetail(scope.row.id)"
+                >
+                  编辑
+                </el-button>
+                <el-button
+                  size="mini"
+                  type="danger"
+                  icon="el-icon-delete"
+                  @click="deletePaperDetail(scope.row.id)"
+                  >删除</el-button
+                >
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
       </div>
     </section>
   </div>
@@ -203,10 +205,12 @@
 import { CORE_API, QUESTION_API } from "@/constants/constants";
 import CKEditor from "@ckeditor/ckeditor5-vue";
 import ClassicEditor from "@ckeditor/ckeditor5-build-inline";
+import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 export default {
   name: "insertApp",
   components: {
-    ckeditor: CKEditor.component
+    ckeditor: CKEditor.component,
+    LinkTitlesCustom
   },
   data() {
     return {

+ 314 - 0
src/modules/questions/views/PreviewPaper.vue

@@ -0,0 +1,314 @@
+<template>
+  <div class="paper" v-loading="loading">
+    <div class="center paper-top">
+      <small class="paper-title">
+        <el-button-group>
+          <el-button size="small"
+            ><span class="titlefont">课程代码:</span></el-button
+          >
+          <el-button size="small"
+            ><span class="titlefont">{{ paper.course.code }}</span></el-button
+          >
+        </el-button-group>
+      </small>
+      <small class="paper-title">
+        <el-button-group>
+          <el-button size="small"
+            ><span class="titlefont">课程名称:</span></el-button
+          >
+          <el-button size="small"
+            ><span class="titlefont">{{ paper.course.name }}</span></el-button
+          >
+        </el-button-group>
+      </small>
+      <small class="paper-title">
+        <el-button-group>
+          <el-button size="small"
+            ><span class="titlefont">试卷名称:</span></el-button
+          >
+          <input
+            placeholder="试卷名称"
+            class="paper-input"
+            v-model="paper.name"
+          />
+        </el-button-group>
+      </small>
+      <small class="paper-title">
+        <el-button-group>
+          <el-button size="small" v-if="isBack"
+            ><span class="titlefont" @click="back">返回</span></el-button
+          >
+        </el-button-group>
+      </small>
+    </div>
+    <div class="center">
+      <div>
+        <br />
+        <h3 class="text-center">{{ paper.course.name }}&nbsp;试卷</h3>
+        <br />
+        <h4 class="text-center">(课程代码&nbsp;{{ paper.course.code }})</h4>
+        <br />
+        <div v-if="paper.examRemark">
+          <h1 class="text-left">考试说明:</h1>
+          <div v-html="paper.examRemark"></div>
+        </div>
+        <h1 class="text-left">本试卷满分{{ paper.totalScore }}分。</h1>
+        <br />
+      </div>
+    </div>
+    <div>
+      <div
+        class="mainQues"
+        v-for="(paperDetail, index) in paper.paperDetails"
+        :key="index"
+      >
+        <div class="mainQuesTitle">
+          <span>{{ paperDetail.cnNum }}</span> <span>.</span>
+          <span>{{ paperDetail.name }}</span>
+          <span
+            >(本大题共{{ paperDetail.unitCount }}小题,满分{{
+              paperDetail.score
+            }}分)</span
+          >
+        </div>
+        <div
+          v-for="(paperDetailUnit, index) in paperDetail.paperDetailUnits"
+          :key="index"
+        >
+          <div>
+            <div class="quesBody">
+              <span class="ques-title">{{ paperDetailUnit.number }}.</span>
+              <span
+                class="ques-body"
+                v-question-audio
+                :hasAudio="paperDetailUnit.question.hasAudio"
+                :questionId="paperDetailUnit.question.id"
+                v-html="paperDetailUnit.question.quesBody"
+              ></span>
+              <span>({{ paperDetailUnit.score }}分)</span>
+            </div>
+            <div
+              class="quesOption"
+              v-for="(quesOption, index) in paperDetailUnit.question
+                .quesOptions"
+              :key="index"
+            >
+              <span class="ques-title"
+                >{{ index | optionOrderWordFilter }}.</span
+              >
+              <span
+                class="ques-body"
+                v-question-audio
+                :hasAudio="paperDetailUnit.question.hasAudio"
+                :questionId="paperDetailUnit.question.id"
+                v-html="quesOption.optionBody"
+              ></span>
+            </div>
+          </div>
+          <br />
+          <div
+            class="subQues"
+            v-for="(subQuestion, index) in paperDetailUnit.question
+              .subQuestions"
+            :key="index"
+          >
+            <div>
+              <div class="quesBody">
+                <span class="ques-title"
+                  >{{ subQuestion.quesParams.number }}.</span
+                >
+                <span v-html="subQuestion.quesBody"></span>
+                <span>({{ paperDetailUnit.subScoreList[index] }}分)</span>
+              </div>
+              <div
+                class="quesOption"
+                v-for="(subQuesOption, index) in subQuestion.quesOptions"
+                :key="index"
+              >
+                <span class="ques-title"
+                  >{{ index | optionOrderWordFilter }}.</span
+                >
+                <span v-html="subQuesOption.optionBody"></span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { QUESTION_API } from "@/constants/constants";
+import { mapState } from "vuex";
+export default {
+  data() {
+    return {
+      paperId: "",
+      paperDetailId: "",
+      editPaperDetailUnit: "",
+      quesDialog: false,
+      paperDatailDialog: false,
+      parentView: "",
+      paper: {
+        course: {
+          code: "",
+          name: ""
+        }
+      },
+      questionType: "",
+      reduplicateGroup: [],
+      singleRightAnswer: "", //接收单选答案
+      multipleRightAnswer: [], //接收多选答案
+      options: ["正确", "错误"]
+    };
+  },
+  methods: {
+    //初始化试卷
+    initPaper() {
+      this.loading = true;
+      this.$http.get(QUESTION_API + "/paper/" + this.paperId).then(response => {
+        this.paper = response.data;
+        this.loading = false;
+      });
+    },
+    back() {
+      debugger;
+      console.log("返回");
+      window.history.back();
+    }
+  },
+  computed: {
+    ...mapState({
+      user: state => state.user
+    }),
+    isBack() {
+      var params = window.location.href.split("?")[1];
+      if (params && params.indexOf("isback") > -1) {
+        return true;
+      }
+      return false;
+    }
+  },
+  created() {
+    this.paperId = this.$route.params.paperId;
+    console.log("this.paperId:", this.paperId);
+    this.initPaper();
+  },
+  mounted() {}
+};
+</script>
+<style scoped>
+.red {
+  color: red;
+}
+.center {
+  margin: 0 auto 0 auto;
+  text-align: center;
+}
+h1 {
+  font-size: 16px;
+  font-family: "微软雅黑", serif;
+  font-weight: bold;
+}
+
+h3 {
+  font-size: 33px;
+  font-family: "微软雅黑", serif;
+  font-weight: bold;
+}
+h4 {
+  font-size: 21px;
+  font-family: "微软雅黑", serif;
+}
+span > p {
+  font-size: 16px;
+  font-family: "微软雅黑", serif;
+  text-align: left;
+  display: block;
+}
+.ques-title {
+  margin-right: 10px;
+}
+.mainQues {
+  margin-left: 3.5%;
+  text-align: left;
+}
+.mainQuesTitle {
+  font-size: 16px;
+  font-family: "微软雅黑", serif;
+  font-weight: bold;
+  margin-bottom: 20px;
+}
+.ques {
+  font-size: 16px;
+  font-family: "微软雅黑", serif;
+  text-align: left;
+  margin-bottom: 10px;
+  padding-left: 10px;
+  position: relative;
+}
+.subQues {
+  position: relative;
+  margin-bottom: 10px;
+  padding-left: 10px;
+}
+.ques.repeated {
+  /*border: 1px solid red;*/
+}
+.quesBody {
+  display: flex;
+}
+.quesOption {
+  margin-top: 10px;
+  display: flex;
+}
+.text-left {
+  margin-left: 3.5%;
+  text-align: left;
+}
+
+.paper-title {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+.paper-top {
+  margin-top: 10px;
+}
+small {
+  font-size: 15px;
+  font-weight: bold;
+  margin-left: 10px;
+  margin-top: 20px;
+}
+.titlefont {
+  font-size: 14px;
+}
+.paper {
+  width: 75%;
+  margin: 0 auto;
+}
+.paper-input {
+  font-size: 14px;
+  margin-left: 7px;
+  margin-top: 5px;
+  width: 150px;
+  border-bottom: 1px solid black; /* 下划线效果 */
+  border-top: 0;
+  border-left: 0;
+  border-right: 0;
+  background-color: transparent; /* 背景色透明 */
+  outline: none;
+}
+.btnDiv {
+  height: 30px;
+  text-align: right;
+  position: relative;
+  right: 2px;
+  top: 1px;
+  visibility: hidden;
+}
+textarea {
+  width: 200px;
+}
+</style>

+ 231 - 264
src/modules/questions/views/Question.vue

@@ -1,269 +1,240 @@
 <template>
-  <div>
-    <section class="content">
-      <!-- 头信息 -->
-      <div class="box box-info">
-        <div class="box-header with-border">
-          <h3 class="box-title">试题列表</h3>
-          <div class="box-tools pull-right">
-            <button
-              type="button"
-              class="btn btn-box-tool"
-              data-widget="collapse"
-            >
-              <i class="fa fa-minus"></i>
-            </button>
-          </div>
-        </div>
-        <!-- 正文信息 -->
-        <div class="box-body">
-          <el-form
-            :inline="true"
-            :model="formSearch"
-            label-position="right"
-            label-width="90px"
-          >
-            <el-row>
-              <el-form-item label="课程名称" class="pull-left">
-                <el-select
-                  v-model="formSearch.courseNo"
-                  :remote-method="getCourses"
-                  remote
-                  :loading="courseLoading"
-                  filterable
-                  clearable
-                  placeholder="请选择"
-                  class="select_width"
-                  @change="initCourseProperty"
-                >
-                  <el-option
-                    v-for="item in courseInfoSelect"
-                    :label="item.courseInfo"
-                    :value="item.courseNo"
-                    :key="item.courseNo"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="层次">
-                <el-select
-                  v-model="formSearch.courseLevel"
-                  clearable
-                  placeholder="请选择"
-                  class="select_width"
-                >
-                  <el-option label="请选择" value=""></el-option>
-                  <el-option
-                    v-for="item in levelList"
-                    :label="item.label"
-                    :value="item.value"
-                    :key="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="专业">
-                <el-select
-                  v-model="formSearch.courseMajor"
-                  clearable
-                  class="select_width"
-                  placeholder="请选择"
-                >
-                  <el-option label="请选择" value=""></el-option>
-                  <el-option
-                    v-for="item in majorList"
-                    :label="item.label"
-                    :value="item.value"
-                    :key="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="题型">
-                <el-select
-                  v-model="formSearch.questionType"
-                  clearable
-                  placeholder="请选择"
-                  class="select_width"
-                >
-                  <el-option label="请选择" value=""></el-option>
-                  <el-option
-                    v-for="item in questionTypes"
-                    :label="item.label"
-                    :value="item.value"
-                    :key="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-row>
-            <!-- created by wwh -->
-            <el-row>
-              <el-form-item label="属性名">
-                <el-select
-                  v-model="formSearch.coursePropertyName"
-                  placeholder="属性名"
-                  @change="searchFirst"
-                  class="property_with"
-                  :disabled="updatePorperty"
-                >
-                  <el-option label="请选择" value=""></el-option>
-                  <el-option
-                    v-for="item in coursePropertyList"
-                    :label="item.name"
-                    :value="item.name"
-                    :key="item.name"
-                  ></el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="一级属性">
-                <el-select
-                  v-model="formSearch.firstPropertyId"
-                  placeholder="一级"
-                  @change="searchSecond"
-                  class="property_with"
-                  :disabled="updateFirst"
+  <section class="content">
+    <!-- 正文信息 -->
+    <div class="box-body">
+      <el-form
+        :inline="true"
+        :model="formSearch"
+        label-position="right"
+        label-width="90px"
+      >
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="课程名称">
+              <el-select
+                class="search_width"
+                v-model="formSearch.courseNo"
+                filterable
+                :remote-method="getCourses"
+                remote
+                clearable
+                @change="initCourseProperty"
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in courseInfoSelect"
+                  :label="item.courseInfo"
+                  :value="item.courseNo"
+                  :key="item.courseNo"
                 >
-                  <el-option label="请选择" value=""></el-option>
-                  <el-option
-                    v-for="item in firstPropertyList"
-                    :label="item.name"
-                    :value="item.id"
-                    :key="item.id"
-                  ></el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="二级属性">
-                <el-select
-                  v-model="formSearch.secondPropertyId"
-                  placeholder="二级"
-                  class="property_with"
-                  :disabled="updateSecond"
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="层次">
+              <el-select
+                class="search_width"
+                v-model="formSearch.courseLevel"
+                filterable
+                clearable
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in levelList"
+                  :label="item.label"
+                  :value="item.value"
+                  :key="item.value"
                 >
-                  <el-option label="请选择" value=""></el-option>
-                  <el-option
-                    v-for="item in secondPropertyList"
-                    :label="item.name"
-                    :value="item.id"
-                    :key="item.id"
-                  ></el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item label="公开度">
-                <el-select
-                  v-model="formSearch.publicity"
-                  clearable
-                  placeholder="请选择"
-                  class="select_width"
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="题型">
+              <el-select
+                class="search_width"
+                v-model="formSearch.questionType"
+                filterable
+                clearable
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in questionTypes"
+                  :label="item.label"
+                  :value="item.value"
+                  :key="item.value"
                 >
-                  <el-option label="请选择" value=""></el-option>
-                  <el-option
-                    v-for="item in publicityList"
-                    :label="item.label"
-                    :value="item.value"
-                    :key="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-row>
-            <!-- end by wwh -->
-            <el-form-item class="pull-right">
-              <el-button
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="属性名">
+              <el-select
+                class="search_width"
+                v-model="formSearch.coursePropertyName"
+                filterable
+                clearable
+                @change="searchFirst"
+                :disabled="updatePorperty"
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in coursePropertyList"
+                  :label="item.name"
+                  :value="item.name"
+                  :key="item.name"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <!-- created by wwh -->
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="一级属性">
+              <el-select
+                class="search_width"
+                v-model="formSearch.firstPropertyId"
+                filterable
+                clearable
+                @change="searchSecond"
+                :disabled="updateFirst"
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in firstPropertyList"
+                  :label="item.name"
+                  :value="item.id"
+                  :key="item.id"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="二级属性">
+              <el-select
+                class="search_width"
+                v-model="formSearch.secondPropertyId"
+                filterable
+                clearable
+                :disabled="updateSecond"
+                placeholder="请选择"
+                size="small"
+              >
+                <el-option
+                  v-for="item in secondPropertyList"
+                  :label="item.name"
+                  :value="item.id"
+                  :key="item.id"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="公开度">
+              <el-select
+                class="search_width"
+                v-model="formSearch.publicity"
+                filterable
+                clearable
+                placeholder="请选择"
                 size="small"
-                type="primary"
-                icon="search"
-                @click="searchQuestionPaper"
-                >查询</el-button
               >
+                <el-option
+                  v-for="item in publicityList"
+                  :label="item.label"
+                  :value="item.value"
+                  :key="item.value"
+                >
+                </el-option>
+              </el-select>
             </el-form-item>
-          </el-form>
+          </el-col>
+          <el-col :span="6">
+            <div class="search_down">
+              <el-button size="small" type="primary" @click="searchQues"
+                ><i class="el-icon-search"></i> 查询</el-button
+              >
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
 
-          <!-- 页面列表 -->
-          <el-table
-            :data="tableData"
-            v-loading="loading"
-            element-loading-text="拼命加载中"
-            border
-            style="width: 100%;text-align:center;"
-          >
-            <el-table-column label="课程" header-align="center" width="180">
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <span>{{ scope.row.course.name }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="层次" header-align="center" width="100">
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <span>{{ getLevel(scope.row.course.level) }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="题型" header-align="center" width="100">
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <span>{{ scope.row.questionType | questionType }}</span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column label="题干" header-align="center">
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <span
-                    class="row_quesBody"
-                    @click="prevViewQues(scope.row)"
-                    v-html="scope.row.quesBody"
-                  >
-                  </span>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column
-              :context="_self"
-              width="150"
-              label="操作"
-              header-align="center"
-            >
-              <template slot-scope="scope">
-                <div class="el_table_inner_left">
-                  <el-button
-                    v-if="scope.row.questionType !== 'NESTED_ANSWER_QUESTION'"
-                    size="mini"
-                    type="info"
-                    @click="updateRow(scope.row)"
-                  >
-                    编辑
-                  </el-button>
-                  <el-button
-                    size="mini"
-                    type="danger"
-                    @click="deleteRow(scope.row)"
-                  >
-                    删除
-                  </el-button>
-                </div>
-              </template>
-            </el-table-column>
-          </el-table>
-          <!-- 分页栏 -->
-          <div class="page pull-right">
-            <el-pagination
-              @current-change="handleCurrentChange"
-              :current-page="currentPage"
-              :page-size="pageSize"
-              layout="total, prev, pager, next, jumper"
-              :total="total"
+      <!-- 页面列表 -->
+      <el-table :data="tableData" border>
+        <el-table-column label="课程" width="180">
+          <template slot-scope="scope">
+            <span>{{ scope.row.course.name }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="层次" width="100">
+          <template slot-scope="scope">
+            <span>{{ getLevel(scope.row.course.level) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="题型" width="100">
+          <template slot-scope="scope">
+            <span>{{ scope.row.questionType | questionType }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="题干">
+          <template slot-scope="scope">
+            <span
+              class="row_quesBody"
+              @click="prevViewQues(scope.row)"
+              v-html="scope.row.quesBody"
             >
-            </el-pagination>
-          </div>
-        </div>
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="175">
+          <template slot-scope="scope">
+            <div class="operate_left">
+              <el-button
+                v-if="scope.row.questionType !== 'NESTED_ANSWER_QUESTION'"
+                size="mini"
+                type="primary"
+                @click="updateRow(scope.row)"
+              >
+                <i class="el-icon-edit"></i>编辑
+              </el-button>
+              <el-button
+                size="mini"
+                type="danger"
+                @click="deleteRow(scope.row)"
+              >
+                <i class="el-icon-delete"></i> 删除
+              </el-button>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 分页栏 -->
+      <div class="page pull-right">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-size="pageSize"
+          layout="total, prev, pager, next, jumper"
+          :total="total"
+        >
+        </el-pagination>
       </div>
-    </section>
+    </div>
 
     <div class="text-left">
-      <el-dialog @close="closeQuesDialog" title="试题预览" v-model="quesDialog">
+      <el-dialog
+        @close="closeQuesDialog"
+        title="试题预览"
+        :visible.sync="quesDialog"
+      >
         <el-form :model="quesModel" label-position="right" label-width="80px">
           <el-row :gutter="10">
             <el-col :xs="10" :sm="10" :md="10" :lg="10">
@@ -355,7 +326,7 @@
         >
       </span>
     </el-dialog>
-  </div>
+  </section>
 </template>
 <script>
 import { CORE_API, QUESTION_API } from "@/constants/constants";
@@ -363,12 +334,10 @@ import { QUESTION_TYPES, LEVEL_TYPE } from "../constants/constants";
 export default {
   data() {
     return {
-      courseLoading: false,
       formSearch: {
         questionType: "",
         courseNo: "",
         courseLevel: "",
-        courseMajor: "",
         publicity: "",
         coursePropertyName: "",
         firstPropertyId: "",
@@ -376,7 +345,6 @@ export default {
       },
       courseList: [], //课程list
       levelList: LEVEL_TYPE, //层次list
-      majorList: [], //专业
       questionTypeList: [], //题型
       tableData: [],
       currentPage: 1,
@@ -415,7 +383,7 @@ export default {
       }
     },
     //查询列表
-    searchQuestionPaper() {
+    searchQues() {
       this.tableData = [];
       var url =
         QUESTION_API + "/question/" + this.currentPage + "/" + this.pageSize;
@@ -429,7 +397,7 @@ export default {
     //分页
     handleCurrentChange(val) {
       this.currentPage = val;
-      this.searchQuestionPaper();
+      this.searchQues();
     },
     //修改
     updateRow(row) {
@@ -477,7 +445,7 @@ export default {
                   message: "删除成功",
                   type: "success"
                 });
-                this.searchQuestionPaper();
+                this.searchQues();
               }
             },
             () => {
@@ -501,6 +469,7 @@ export default {
     },
     //预览
     prevViewQues(row) {
+      console.log("row", row);
       this.quesModel = row;
       this.disposeSelectAnswer();
       this.openQuesDialog();
@@ -509,12 +478,10 @@ export default {
     getCourses(query) {
       console.log("查询课程!");
       if (query) {
-        this.courseLoading = true;
         this.$http
           .get(CORE_API + "/course/query?name=" + query + "&enable=true")
           .then(response => {
             this.courseList = response.data;
-            this.courseLoading = false;
             if (this.formSearch.courseNo) {
               this.$http
                 .get(
@@ -729,7 +696,7 @@ export default {
         sessionStorage.getItem("question_currentPage")
       );
     }
-    this.searchQuestionPaper();
+    this.searchQues();
   }
 };
 </script>