chenken 6 years ago
parent
commit
7871e68605

+ 1 - 0
package.json

@@ -12,6 +12,7 @@
   "dependencies": {
     "axios": "^0.18.0",
     "element-ui": "^2.4.9",
+    "lodash": "^4.17.11",
     "moment": "^2.22.2",
     "rasterizehtml": "^1.3.0",
     "register-service-worker": "^1.0.0",

+ 0 - 0
src/modules/marking/.ignore


+ 1 - 1
src/modules/marking/views/CourseDetail.vue

@@ -221,7 +221,7 @@ export default {
     back() {
       this.$router.push({
         path:
-          "/index/MarkWorkOverview/" +
+          "/marking/mark_work_overview/" +
           this.workId +
           "/" +
           this.examId +

+ 1 - 1
src/modules/marking/views/MarkGradeMain.vue

@@ -348,7 +348,7 @@ export default {
     },
     back() {
       this.$router.push({
-        path: "/index/MarkSettingWork/grade"
+        path: "/marking/mark_setting_work/grade"
       });
     }
   },

+ 1 - 1
src/modules/marking/views/MarkPaperCheck.vue

@@ -352,7 +352,7 @@ export default {
         var studentPaperId = row.studentPaper.id;
         console.log("studentPaperId:", studentPaperId);
         var urls =
-          "/index/ViewPaper/" +
+          "/marking/view_paper/" +
           this.workId +
           "/" +
           this.examId +

+ 1 - 1
src/modules/marking/views/MarkSettingFast.vue

@@ -288,7 +288,7 @@ export default {
     back() {
       this.$router.push({
         path:
-          "/index/MarkSettingMain/" +
+          "/marking/mark_setting_main/" +
           this.$route.params.workId +
           "/" +
           this.$route.params.examId +

+ 5 - 8
src/modules/marking/views/MarkSettingMain.vue

@@ -258,7 +258,7 @@ export default {
     fastSetting(index, row) {
       this.paperId = row.pk;
       var url =
-        "/index/MarkSettingFast/" +
+        "/marking/mark_setting_fast/" +
         this.$route.params.workId +
         "/" +
         this.$route.params.examId +
@@ -353,7 +353,7 @@ export default {
     },
     back() {
       this.$router.push({
-        path: "/index/MarkSettingWork/setting"
+        path: "/marking/mark_setting_work/setting"
       });
     },
     //导入
@@ -367,12 +367,10 @@ export default {
     beforeUpload(file) {
       console.log(file);
     },
-    uploadProgress(event, file, fileList) {
-      console.log(fileList.length);
+    uploadProgress() {
       console.log("uploadProgress");
     },
-    uploadSuccess(response, file, fileList) {
-      console.log(fileList.length);
+    uploadSuccess(response) {
       console.log("uploadSuccess");
       console.log(response);
       if (!response || response.length == 0) {
@@ -390,8 +388,7 @@ export default {
         this.impDialog = false;
       }
     },
-    uploadError(err, file, fileList) {
-      console.log(fileList.length);
+    uploadError(err) {
       var result = err.message.match(/\{.+}/);
       var errMessage = JSON.parse(result[0]).desc;
       this.$notify({

+ 16 - 7
src/modules/marking/views/MarkSettingWork.vue

@@ -206,27 +206,37 @@ export default {
     },
     settingMarkWork(row) {
       var url =
-        "/index/MarkSettingMain/" + row.id + "/" + row.examId + "/" + row.name;
+        "/marking/mark_setting_main/" +
+        row.id +
+        "/" +
+        row.examId +
+        "/" +
+        row.name;
       this.$router.push({
         path: url
       });
     },
     markWorkOverview(row) {
       var url =
-        "/index/MarkWorkOverview/" + row.id + "/" + row.examId + "/" + row.name;
+        "/marking/mark_work_overview/" +
+        row.id +
+        "/" +
+        row.examId +
+        "/" +
+        row.name;
       this.$router.push({
         path: url
       });
     },
     marker(row) {
-      var url = "/index/Marker/" + row.id + "/" + row.examId + "/" + row.name;
+      var url = "/marking/marker/" + row.id + "/" + row.examId + "/" + row.name;
       this.$router.push({
         path: url
       });
     },
     paperCheck(row) {
       var url =
-        "/index/MarkPaperCheck/" +
+        "/marking/mark_paper_check/" +
         row.id +
         "/" +
         row.examId +
@@ -237,7 +247,7 @@ export default {
       });
     },
     viewGrade(row) {
-      var url = "/index/MarkGradeMain/" + row.examId;
+      var url = "/marking/mark_grade_main/" + row.examId;
       this.$router.push({
         path: url
       });
@@ -245,7 +255,7 @@ export default {
     marking(row) {
       var userId = this.user.userId;
       var self = this;
-      var url = "/Marking/" + row.id + "/" + row.examType;
+      var url = "/marking/" + row.id + "/" + row.examType;
       self.$http
         .get(
           DATA_PROCESS_API + "/markTasks?workId=" + row.id + "&userId=" + userId
@@ -284,7 +294,6 @@ export default {
     }
   },
   created() {
-    this.user.userId = 55666;
     this.initMarkWork();
   }
 };

+ 1 - 1
src/modules/marking/views/MarkWorkOverview.vue

@@ -326,7 +326,7 @@ export default {
     },
     courseDetail(row) {
       var url =
-        "/index/CourseDetail/" +
+        "/marking/course_detail/" +
         this.$route.params.workId +
         "/" +
         this.$route.params.examId +

+ 1 - 1
src/modules/marking/views/Marker.vue

@@ -204,7 +204,7 @@ export default {
     },
     markerDetail(row) {
       var url =
-        "/index/MarkerDetail/" +
+        "/marking/marker_detail/" +
         this.$route.params.workId +
         "/" +
         this.$route.params.examId +

+ 3 - 3
src/modules/marking/views/MarkerDetail.vue

@@ -164,7 +164,7 @@ export default {
       this.$http
         .get(
           MARKING_API +
-            "/markCourses/all/Marker/0/" +
+            "/markCourses/all/marker/0/" +
             this.pageSize +
             "?workId=" +
             this.workId +
@@ -183,7 +183,7 @@ export default {
       this.$http
         .get(
           MARKING_API +
-            "/markCourses/all/Marker/" +
+            "/markCourses/all/marker/" +
             (this.currentPage - 1) +
             "/" +
             this.pageSize +
@@ -203,7 +203,7 @@ export default {
     back() {
       this.$router.push({
         path:
-          "/index/Marker/" +
+          "/marking/marker/" +
           this.workId +
           "/" +
           this.examId +

+ 46 - 9
src/modules/marking/views/Marking.vue

@@ -3,7 +3,14 @@
   width: 160px;
 }
 .content {
+  min-height: 600px;
+  padding: 15px;
+  margin-right: auto;
+  margin-left: auto;
   margin-top: 10px;
+  padding-left: 15px;
+  padding-right: 15px;
+  padding-top: 60px;
 }
 small {
   font-size: 18px;
@@ -21,6 +28,11 @@ section {
 .box-body {
   height: 100%;
   width: 100%;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+  padding: 10px;
 }
 .backcolor {
   background-color: #ecf0f5;
@@ -31,6 +43,8 @@ li {
 .marktitle {
   margin-right: 10px;
   margin-bottom: 10px;
+  font-size: 18px;
+  font-weight: 700;
 }
 .titlefont {
   font-size: 15px;
@@ -48,16 +62,39 @@ li {
 .markcount {
   margin-right: 10px;
 }
-.scroll {
-  overflow: auto;
-  height: 450px;
-}
 .reject {
   color: red;
 }
 .marksign {
   margin-left: 20px;
 }
+.label-danger {
+  background-color: #d9534f;
+  color: #fff;
+}
+.box.box-info {
+  border-top-color: #20a0ff;
+}
+.box {
+  position: relative;
+  border-radius: 3px;
+  border-top: 3px solid #d2d6de;
+  margin-bottom: 20px;
+  width: 100%;
+  height: 700px;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+.scoreboard {
+  width: 25%;
+  border-left: 3px solid #20a0ff;
+  min-height: 600px;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
 </style>
 <template>
   <div v-loading="loading" element-loading-text="拼命加载中">
@@ -122,7 +159,8 @@ li {
           <small class="marktitle">
             <el-button-group>
               <el-button size="small"
-                ><span class="titlefont"><i class="fa fa-user"></i></span
+                ><span class="titlefont"
+                  ><v-icon name="user" style="height:12"/></span
               ></el-button>
               <el-button size="small"
                 ><span class="titlefont">{{
@@ -133,7 +171,7 @@ li {
           </small>
           <small class="marktitle titlefont marksign">
             <el-button type="success" @click="backIndex" size="small">
-              <i class="fa fa-sign-out"></i>
+              <v-icon name="sign-out-alt" />
               <span class="titlefont">退回 </span>
             </el-button>
           </small>
@@ -439,7 +477,7 @@ export default {
       this.problemTaskVisible = true;
     },
     backIndex() {
-      this.$router.push({ path: "/index/MarkSettingWork/Marking" });
+      this.$router.push({ path: "/marking/mark_setting_work/marking" });
     },
     taskCurrentChange(val) {
       this.taskCurrentPage = val;
@@ -560,7 +598,7 @@ export default {
             self.examType
         )
         .then(response => {
-          if (!response) {
+          if (!response.data) {
             self.$notify({
               message: "该任务下试卷已评完,如有剩余任务将自动切换任务",
               type: "info"
@@ -714,7 +752,6 @@ export default {
     ...mapState({ user: state => state.user })
   },
   async created() {
-    this.user.userId = 55666;
     this.loading = true;
     await this.markInit();
     await this.getChangeTasks();

+ 28 - 37
src/modules/marking/views/TpMain.vue

@@ -81,7 +81,8 @@ img {
             <div v-html="getPdfUrl()" style="float: left;"></div>
             <div
               v-if="
-                this.studentPaper.studentSubjectiveHtml != '' &&
+                this.studentPaper.studentSubjectiveHtml &&
+                  this.studentPaper.studentSubjectiveHtml != '' &&
                   this.studentPaper.studentSubjectiveHtml.indexOf('.pdf') > -1
               "
               style="float: right;margin-right: 20px;"
@@ -102,11 +103,7 @@ img {
                 打印
               </el-button>
             </div>
-            <div
-              class="paper"
-              id="answer-content"
-              v-html="getAnswerHtml()"
-            ></div>
+            <div class="paper" id="answer-content">{{ getAnswerHtml }}</div>
           </div>
         </el-tab-pane>
       </template>
@@ -146,7 +143,8 @@ export default {
       activeName: "first",
       drawing: {},
       tmpSignScores: this.signScores,
-      tmpMarkSign: this.markSign
+      tmpMarkSign: this.markSign,
+      answerHtml: null
     };
   },
   props: [
@@ -161,36 +159,16 @@ export default {
   methods: {
     getPdfUrl() {
       var url = this.studentPaper.studentSubjectiveHtml;
+      console.log("paperUrl", url);
       var content = "";
-      if (
-        this.studentPaper.studentSubjectiveHtml != "" &&
-        this.studentPaper.studentSubjectiveHtml.indexOf(".pdf") > -1
-      ) {
-        content =
-          "<embed src='" + url + "'  width='800px' height='800px'></embed>";
-      }
-      if (
-        this.studentPaper.studentSubjectiveHtml != "" &&
-        this.studentPaper.studentSubjectiveHtml.indexOf(".zip") > -1
-      ) {
-        content = "<a href='" + url + "'>下载</a>";
-      }
-      return content;
-    },
-    getAnswerHtml() {
-      var content = "";
-      if (this.studentPaper.basePaperId) {
-        var paperId = this.studentPaper.basePaperId;
-        $.ajax({
-          type: "GET",
-          url: Q_API + "/extract/getAnswerHtml/" + paperId,
-          async: false,
-          success: function(response) {
-            console.log("response:" + response);
-            content = response;
-          }
-        });
-        console.log("answer:" + content);
+      if (url) {
+        if (url != "" && url.indexOf(".pdf") > -1) {
+          content =
+            "<embed src='" + url + "'  width='800px' height='800px'></embed>";
+        }
+        if (url != "" && url.indexOf(".zip") > -1) {
+          content = "<a href='" + url + "'>下载</a>";
+        }
       }
       return content;
     },
@@ -342,7 +320,7 @@ export default {
     },
     pdfDown() {
       var url = this.studentPaper.studentSubjectiveHtml;
-      if (url != "") {
+      if (url != "undefined" && url != "") {
         url = url.replace(UPAI_YUN, "");
         let xhr = new XMLHttpRequest();
         xhr.responseType = "blob";
@@ -372,6 +350,19 @@ export default {
     }
   },
   computed: {
+    async getAnswerHtml() {
+      var content = "";
+      if (this.studentPaper.basePaperId) {
+        var paperId = this.studentPaper.basePaperId;
+        await this.$http
+          .get(Q_API + "/extract/getAnswerHtml/" + paperId)
+          .then(response => {
+            console.log("html", response.data);
+            content = response.data;
+          });
+      }
+      return content;
+    },
     itemTitle() {
       if (!this.markSign) return "无";
       var title = "无";

+ 44 - 10
src/modules/marking/views/TpScoreBoard.vue

@@ -79,6 +79,40 @@ li {
   transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
   outline: none;
 }
+.el-switch__label {
+  position: absolute;
+  left: 0;
+  top: 0;
+  z-index: 2;
+}
+.button-border.button-small {
+  line-height: 26px;
+}
+.button-border.button-primary {
+  color: #1b9af7;
+}
+.button-small {
+  font-size: 12px;
+}
+.button-border {
+  background: 0;
+  border-width: 2px;
+  border-style: solid;
+}
+.button-box {
+  padding: 0 !important;
+  border-radius: 10px;
+}
+.button-primary {
+  border-color: #1b9af7;
+}
+.button {
+  font-weight: 300;
+  text-decoration: none;
+  text-align: center;
+  margin: 0;
+  display: inline-block;
+}
 </style>
 <template>
   <div class="scoreboard pull-right">
@@ -86,10 +120,10 @@ li {
       <div class="pull-right">
         <el-switch
           v-model="isMouseMode"
-          on-text="鼠标"
-          off-text="键盘"
-          on-color="#4cb0f9"
-          off-color="#13ce66"
+          active-text="鼠标"
+          inactive-text="键盘"
+          active-color="#4cb0f9"
+          inactive-color="#13ce66"
         ></el-switch>
       </div>
       <h3 class="totalScore">总分:{{ this.totalScore }}分</h3>
@@ -737,6 +771,12 @@ export default {
         document.getElementById(itemInput).focus();
       }, 1);
       this.positionDiv(order);
+    },
+    markRemarkInfo() {
+      this.textarea = "";
+      if (this.markedResult.id) {
+        this.textarea = this.markedResult.markRemark;
+      }
     }
   },
   watch: {
@@ -755,12 +795,6 @@ export default {
       if (!this.isMouseMode) {
         this.initKeyBoardMode();
       }
-    },
-    markRemarkInfo() {
-      this.textarea = "";
-      if (this.markedResult.id) {
-        this.textarea = this.markedResult.markRemark;
-      }
     }
   },
   computed: {

+ 1 - 1
src/modules/marking/views/ViewPaper.vue

@@ -26,7 +26,7 @@ export default {
   methods: {
     back() {
       var url =
-        "/index/MarkPaperCheck/" +
+        "/marking/mark_paper_check/" +
         this.workId +
         "/" +
         this.examId +

+ 9 - 32
src/modules/portal/views/Login.vue

@@ -43,7 +43,7 @@
     <footer class="login-footer">
       <div class="main">
         <div>
-          Copyright &copy; 2016 <a href="javascript:void(0)">讯飞启明</a>.
+          Copyright &copy; 2019 <a href="javascript:void(0)">讯飞启明</a>.
         </div>
       </div>
     </footer>
@@ -58,7 +58,6 @@ import { core_api } from "../constants/constants";
 export default {
   data() {
     return {
-      pending: false,
       errorInfo: "",
       title: "考试云平台",
       jwptCustomize: false,
@@ -113,37 +112,16 @@ export default {
       if (!this.checkPassword()) {
         return;
       }
-      if (this.pending) {
-        return;
-      }
-      this.pending = true;
       var url = core_api + "/auth/login";
-      this.$http
-        .post(url, this.loginInfo)
-        .then(response => {
-          console.log(response);
-          var user = response.data;
-          this.USER_SIGNIN(user);
-          user.loginUrl = "http://" + window.location.host + "/#/login";
-          user.indexUrl = "http://" + window.location.host + "/#/index";
-          window.name = JSON.stringify(user);
-          this.$router.replace({ path: "/home/overview" });
-          this.$notify({
-            message: "登录成功",
-            type: "success"
-          });
-          this.pending = false;
-        })
-        .catch(response => {
-          if (response.status == 500) {
-            this.$notify({
-              showClose: true,
-              message: response.body.desc,
-              type: "error"
-            });
-          }
-          this.pending = false;
+      this.$httpWithMsg.post(url, this.loginInfo).then(response => {
+        var user = response.data;
+        this.USER_SIGNIN(user);
+        this.$router.replace({ path: "/home/overview" });
+        this.$notify({
+          message: "登录成功",
+          type: "success"
         });
+      });
     },
     jwptCustomizeMethod() {
       // 普通高校考试综合管理平台 定制
@@ -160,7 +138,6 @@ export default {
     var params = this.$route.query;
 
     this.loginInfo.rootOrgId = params.orgId;
-    console.log("rootOrgId=" + this.loginInfo.rootOrgId);
 
     this.jwptCustomizeMethod();
   },

+ 6 - 10
src/modules/portal/views/home/Home.vue

@@ -2,7 +2,9 @@
   <el-container>
     <el-header style="padding: 0"
       ><el-menu class="el-menu-demo" mode="horizontal">
-        <el-menu-item index="1">云平台</el-menu-item>
+        <el-menu-item index="1">
+          <router-link to="/home/overview"> 云平台 </router-link></el-menu-item
+        >
         <el-submenu index="2" style="float: right" class="fr">
           <template slot="title">{{ user.rootOrgName }}</template>
           <el-menu-item index="2-1" style="width: 100px">
@@ -20,10 +22,10 @@
     </el-header>
 
     <el-container>
-      <HomeSide />
+      <HomeSide :key="$route.path" />
       <el-container>
         <router-view></router-view>
-        <el-footer>&copy; 启明泰和 2018</el-footer>
+        <el-footer>&copy; 启明泰和 2019</el-footer>
       </el-container>
     </el-container>
 
@@ -151,7 +153,7 @@ export default {
             userId +
             "&password=" +
             password;
-          this.$http.put(url).then(() => {
+          this.$httpWithMsg.put(url).then(() => {
             this.$notify({
               type: "success",
               message: "修改密码成功!"
@@ -221,12 +223,6 @@ export default {
   text-align: center;
   line-height: 60px;
 }
-.el-aside {
-  background-color: #D3DCE6;
-  color: #333;
-  line-height: 200px;
-}
-
 body > .el-container {
   margin-bottom: 40px;
 }

+ 13 - 11
src/modules/portal/views/home/HomeMain.vue

@@ -33,19 +33,21 @@ export default {
   computed: {
     ...mapState({ user: state => state.user })
   },
-  methods: {},
-  created() {
-    var url = core_api + "/rolePrivilege/getUserPrivileges";
-    const params = new URLSearchParams();
-    params.append("groupCode", "PORTAL_MENUS");
-    params.append("full", false);
-    this.$http
-      .post(url, params, {
+  methods: {
+    async getUserPrivileges(groupCode) {
+      var url = core_api + "/rolePrivilege/getUserPrivileges";
+      const params = new URLSearchParams();
+      params.append("groupCode", groupCode);
+      params.append("full", false);
+      const res = await this.$httpWithMsg.post(url, params, {
         headers: { "content-type": "application/x-www-form-urlencoded" }
-      })
-      .then(response => {
-        this.menuList = response.data;
       });
+
+      return res.data;
+    }
+  },
+  async created() {
+    this.menuList = await this.getUserPrivileges("PORTAL_MENUS");
   }
 };
 </script>

+ 86 - 160
src/modules/portal/views/home/HomeSide.vue

@@ -1,193 +1,120 @@
 <template>
-  <el-aside width="200px">
+  <el-aside width="200px" v-if="menuList.length > 0">
+    <div
+      style="height: 50px; margin-top: 20px; margin-left: 20px; font-size: 20px"
+    >
+      <i class="el-icon-location"></i> <span>{{ group.name }}</span>
+    </div>
     <el-menu
-      default-active="2"
       class="el-menu-vertical-demo"
       background-color="#545c64"
       text-color="#fff"
       active-text-color="#ffd04b"
     >
-      <el-submenu index="1">
+      <el-submenu
+        v-for="menu1 in menuList1"
+        :key="menu1.id"
+        :index="menu1.nodeCode"
+      >
         <template slot="title">
-          <i class="el-icon-location"></i> <span>基础信息</span>
+          <router-link v-if="menu1.ext5" :to="{ path: menu1.ext5 }">
+            <i class="fa fa-circle-o"></i>{{ menu1.name }}</router-link
+          >
+          <span v-else>{{ menu1.name }}</span>
         </template>
+
         <el-menu-item-group>
-          <template slot="title"
-            >分组一</template
+          <el-menu-item
+            v-for="menu2 in menuList2(menu1)"
+            :index="menu2.nodeCode"
+            :key="menu2.id"
           >
-          <el-menu-item index="1-1">选项1</el-menu-item>
-          <el-menu-item index="1-2">选项2</el-menu-item>
+            <router-link :to="{ path: menu2.ext5 }">
+              <i class="fa fa-circle-o"></i>{{ menu2.name }}
+            </router-link>
+          </el-menu-item>
         </el-menu-item-group>
-        <el-menu-item-group title="分组2">
-          <el-menu-item index="1-3">选项3</el-menu-item>
-        </el-menu-item-group>
-        <el-submenu index="1-4">
-          <template slot="title"
-            >选项4</template
-          >
-          <el-menu-item index="1-4-1">选项1</el-menu-item>
-        </el-submenu>
       </el-submenu>
-      <el-menu-item index="2">
-        <i class="el-icon-menu"></i> <span slot="title">考务</span>
-      </el-menu-item>
-      <el-menu-item index="3">
-        <i class="el-icon-document"></i> <span slot="title">题库</span>
-      </el-menu-item>
-      <el-menu-item index="4">
-        <i class="el-icon-setting"></i> <span slot="title">网考</span>
-      </el-menu-item>
-      <el-menu-item index="5">
-        <i class="el-icon-setting"></i> <span slot="title">阅卷</span>
-      </el-menu-item>
-      <el-menu-item index="6">
-        <v-icon name="print" class="el-icon-" />
-        <span slot="title">印刷</span>
-      </el-menu-item>
-      <el-menu-item index="7">
-        <v-icon name="flag" class="el-icon-" />
-        <span slot="title">报表</span>
-      </el-menu-item>
     </el-menu>
   </el-aside>
 </template>
 
 <script>
-import { mapActions, mapState } from "vuex";
-import { USER_SIGNOUT } from "../../store/user";
+import { mapState } from "vuex";
 import { core_api } from "../../constants/constants";
 
+const routesToMenu = [
+  {
+    path: "/basic",
+    name: "基础信息",
+    groupCode: "BASIC_MENUS"
+  },
+  {
+    path: "/examwork",
+    name: "考务管理",
+    groupCode: "EXAM_WORK_MENUS"
+  },
+  {
+    path: "/questions",
+    name: "题库",
+    groupCode: "QUESTIONS_WORK_MENUS"
+  },
+  {
+    path: "/oe",
+    name: "网考",
+    groupCode: "NETEXAM_WORK_MENUS"
+  },
+  {
+    path: "/marking",
+    name: "阅卷",
+    groupCode: "MARK_WORK_MENUS"
+  },
+  {
+    path: "/portal",
+    groupCode: "PORTAL_MENUS"
+  }
+];
+
 export default {
   name: "HomeSide",
   data() {
-    var validatePass = (rule, value, callback) => {
-      if (value === "") {
-        callback(new Error("请输入密码"));
-      } else {
-        if (this.passForm.checkPass !== "") {
-          this.$refs.passForm.validateField("checkPass");
-        }
-        callback();
-      }
-    };
-    var validatePass2 = (rule, value, callback) => {
-      if (value === "") {
-        callback(new Error("请输入确认密码"));
-      } else if (value !== this.passForm.pass) {
-        callback(new Error("两次输入密码不一致!"));
-      } else {
-        callback();
-      }
-    };
     return {
-      menuList: [],
-      userDialog: false,
-      passForm: { pass: "", checkPass: "" },
-      passRules: {
-        pass: [{ validator: validatePass, trigger: "blur" }],
-        checkPass: [{ validator: validatePass2, trigger: "blur" }]
-      }
+      group: null,
+      menuList: []
     };
   },
   computed: {
-    ...mapState({ user: state => state.user })
+    ...mapState({ user: state => state.user }),
+    menuList1() {
+      return this.menuList.filter(
+        m => m.parentId === null && m.ext1 === "menu"
+      );
+    }
   },
   methods: {
-    ...mapActions([USER_SIGNOUT]),
-    openUserDialog() {
-      this.passForm = { pass: "", checkPass: "" };
-      this.userDialog = true;
-    },
-    //保存密码
-    submitForm() {
-      this.$refs.passForm.validate(valid => {
-        if (valid) {
-          var userId = this.user.userId;
-          var password = encodeURIComponent(this.passForm.pass);
-          var url =
-            core_api +
-            "/user/password?userId=" +
-            userId +
-            "&password=" +
-            password;
-          this.$http.put(url).then(() => {
-            this.$notify({
-              type: "success",
-              message: "修改密码成功!"
-            });
-            this.resetForm();
-            this.userDialog = false;
-          });
-        } else {
-          console.log("error submit!");
-          return false;
-        }
+    async getUserPrivileges(groupCode) {
+      var url = core_api + "/rolePrivilege/getUserPrivileges";
+      const params = new URLSearchParams();
+      params.append("groupCode", groupCode);
+      params.append("full", false);
+      const res = await this.$httpWithMsg.post(url, params, {
+        headers: { "content-type": "application/x-www-form-urlencoded" }
       });
+
+      return res.data;
     },
-    //重置
-    resetForm() {
-      this.$refs.passForm.resetFields();
-    },
-    isSuperAdmin() {
-      if (!this.user.roleList) {
-        return false;
-      }
-      for (let role of this.user.roleList) {
-        if (role.roleCode == "SUPER_ADMIN") {
-          return true;
-        }
-      }
-      return false;
-    },
-    logout() {
-      this.$http
-        .post(core_api + "/auth/logout")
-        .then(() => {
-          const orgId = this.user.rootOrgId;
-          this.USER_SIGNOUT();
-          window.name = "";
-          this.$router.replace({
-            path: "/login" + "?orgId=" + orgId
-          });
-        })
-        .catch(response => {
-          const orgId = this.user.rootOrgId;
-          if (response.status == 500) {
-            this.$notify({
-              showClose: true,
-              message: response.data.desc,
-              type: "error"
-            });
-          }
-          this.USER_SIGNOUT();
-          window.name = "";
-          this.$router.replace({
-            path: "/login" + "?orgId=" + orgId
-          });
-        });
+    menuList2(menu1) {
+      return this.menuList.filter(
+        m => m.parentId === menu1.id && m.ext1 === "menu"
+      );
     }
   },
-  created() {
-    var url = core_api + "/rolePrivilege/getUserPrivileges";
-    const params = new URLSearchParams();
-    params.append("groupCode", "PORTAL_MENUS");
-    params.append("full", false);
-    this.$http
-      .post(url, params, {
-        headers: { "content-type": "application/x-www-form-urlencoded" }
-      })
-      .then(response => {
-        this.menuList = response.data;
-      })
-      .catch(response => {
-        if (response.status == 500) {
-          this.$notify({
-            showClose: true,
-            message: response.data.desc,
-            type: "error"
-          });
-        }
-      });
+  async created() {
+    this.group = routesToMenu.find(v => this.$route.path.startsWith(v.path));
+    const groupCode = this.group && this.group.groupCode;
+    if (groupCode) {
+      this.menuList = await this.getUserPrivileges(groupCode);
+    }
   }
 };
 </script>
@@ -197,8 +124,7 @@ export default {
   height: calc(100vh - 60px);
 }
 .el-aside {
-  background-color: #D3DCE6;
-  color: #333;
-  line-height: 200px;
+  background-color: #545c64;
+  color: #fff;
 }
 </style>

+ 3 - 0
src/modules/questions/component/ckeditor.vue

@@ -0,0 +1,3 @@
+<template>
+  <div>CKeditor</div>
+</template>

+ 5 - 2
src/modules/questions/constants/constants.js

@@ -1,4 +1,5 @@
 import Vue from "vue";
+import _ from "lodash";
 export const CORE_API = "/api/ecs_core"; //基础信息API
 export const EXAM_WORK_API = "/api/ecs_exam_work"; //考务信息API
 export const Q_API = "/api/ecs_ques"; //题库API
@@ -8,7 +9,7 @@ export const LEVEL_TYPE = [
   { label: "高起本", value: "GQB" },
   { label: "不限", value: "ALL" }
 ];
-export const questionTypes = [
+export const QUESTION_TYPES = [
   { value: "SINGLE_ANSWER_QUESTION", label: "单选" },
   { value: "MULTIPLE_ANSWER_QUESTION", label: "多选" },
   { value: "BOOL_ANSWER_QUESTION", label: "判断" },
@@ -22,7 +23,7 @@ Vue.filter("optionOrderWordFilter", function(value) {
 });
 //题型过滤器
 Vue.filter("questionType", function(value) {
-  for (let questionType of questionTypes) {
+  for (let questionType of QUESTION_TYPES) {
     if (questionType.value === value) {
       return questionType.label;
     }
@@ -55,6 +56,8 @@ Vue.filter("exportTypesFilter", function(value) {
   }
 });
 
+Vue.prototype._ = _;
+
 // Vue.directive("questionAudio", {
 //   bind: function(el, binding, vnode) {
 //     addAudio(el, binding, vnode);

+ 11 - 1
src/modules/questions/routes/routes.js

@@ -1,5 +1,7 @@
 import Home from "../../portal/views/home/Home.vue";
 import PaperStructure from "../views/PaperStructure.vue";
+import InsertPaperStructure from "../views/InsertPaperStructure.vue";
+import InsertPaperStructureInfo from "../views/InsertPaperStructureInfo.vue";
 
 export default [
   {
@@ -8,8 +10,16 @@ export default [
     component: Home,
     children: [
       {
-        path: "paper_structure/:isClear", //试卷结构
+        path: "paper_structure/:isClear", //精确结构列表
         component: PaperStructure
+      },
+      {
+        path: "insert_paper_structure/:id", //精确结构(新增/修改)
+        component: InsertPaperStructure
+      },
+      {
+        path: "insert_paper_structure_info/:id/:name/:detailId/:courseNo", //添加题型结构
+        component: InsertPaperStructureInfo
       }
     ]
   }

+ 557 - 0
src/modules/questions/views/InsertPaperStructure.vue

@@ -0,0 +1,557 @@
+<template>
+  <div>
+    <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">
+                <el-input
+                  v-model="paperStruct.name"
+                  auto-complete="off"
+                  placeholder="试卷结构名称"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="总分" prop="score">
+                <el-input
+                  v-model.number="paperStruct.totalScore"
+                  auto-complete="off"
+                  placeholder="请输入总分"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="制定课程">
+                <el-select
+                  v-model="paperStruct.courseNo"
+                  filterable
+                  :remote-method="getCourses"
+                  remote
+                  clearable
+                  placeholder="请选择"
+                >
+                  <el-option label="请选择" value="ALL" key="ALL"></el-option>
+                  <el-option label="公用" value="" key=""></el-option>
+                  <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>
+                <el-button
+                  size="small"
+                  type="success"
+                  :disabled="button_disabled"
+                  @click="savePaperStruct();"
+                >
+                  <i class="fa fa-floppy-o"></i>保 存</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="plus"
+                  :disabled="button_disabled"
+                  @click="insert();"
+                  >添加大题</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="caret-left"
+                  @click="back"
+                  >返 回</el-button
+                >
+              </el-form-item>
+            </el-row>
+            <el-row>
+              <el-form-item label="考试说明">
+                <div style="width:550px;">
+                  <ckeditor v-model="paperStruct.examRemark"></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"
+                    auto-complete="off"
+                    placeholder="请输入题型名称"
+                  ></el-input>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label="题型描述"
+                  label-width="120px"
+                  prop="remark"
+                >
+                  <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>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { CORE_API, Q_API } from "../constants/constants";
+import ckeditor from "../component/ckeditor.vue";
+export default {
+  components: { ckeditor },
+  data() {
+    return {
+      loading: false,
+      courseList: [],
+      paperDetailStructForm: {
+        id: "",
+        number: "",
+        name: "",
+        remark: "",
+        totalScore: "",
+        detailCount: "",
+        unitStructs: []
+      },
+      paperStruct: {
+        name: "",
+        totalScore: "",
+        paperDetailStructs: [],
+        courseNo: "ALL",
+        type: "EXACT", //试卷结构类型
+        genPaperType: "COMMON", //组卷类型
+        examRemark: ""
+      },
+      paperDetailStructs: [],
+      paperDeatilId: "",
+      rules: {
+        name: [{ required: true, message: "请输入名称", trigger: "blur" }],
+        remark: [{ required: true, message: "请输入题型描述", trigger: "blur" }]
+      },
+      rules2: {
+        name: [
+          { required: true, message: "请输入试卷结构名称", trigger: "blur" }
+        ]
+      },
+      paperStructId: "",
+      paperDetailStructDialog: false,
+      dialogType: ""
+    };
+  },
+
+  methods: {
+    //查询列表集合
+    searchForm() {
+      this.loading = true;
+      var paperStructStorge = sessionStorage.getItem("paperStruct");
+      if (typeof paperStructStorge == "string") {
+        var paperStruct = JSON.parse(paperStructStorge);
+        console.log(paperStruct);
+        this.paperStruct = paperStruct;
+        this.paperDetailStructs = paperStruct.paperDetailStructs;
+      }
+      this.loading = false;
+    },
+    //保存
+    savePaperStruct() {
+      if (this.paperStruct.name.trim().length == 0) {
+        this.$notify({
+          message: "结构名称不能为空格",
+          type: "error"
+        });
+        return false;
+      }
+      if (!this.checkPaperStruct()) {
+        return false;
+      }
+      if (this.paperStruct.courseNo == "ALL") {
+        this.$notify({
+          message: "请选择课程",
+          type: "error"
+        });
+        return false;
+      }
+      this.loading = true;
+      var url = Q_API + "/paperStruct";
+      console.log(this.paperStructId);
+      if (this.paperStructId != "add") {
+        //假如没ID就是新增
+        this.$http
+          .put(url, this.paperStruct)
+          .then(() => {
+            this.$notify({
+              message: "保存成功",
+              type: "success"
+            });
+            this.loading = false;
+            this.removeItem();
+            this.back();
+          })
+          .catch(() => {
+            this.$notify({
+              type: "error",
+              message: "试卷结构名称重复,请重新命名"
+            });
+
+            this.loading = false;
+          });
+      } else {
+        this.$http
+          .post(url, this.paperStruct)
+          .then(() => {
+            this.$notify({
+              message: "保存成功",
+              type: "success"
+            });
+            this.loading = false;
+            this.removeItem();
+            this.back();
+          })
+          .catch(() => {
+            this.loading = false;
+            this.$notify({
+              type: "error",
+              message: "试卷结构名称重复,请重新命名"
+            });
+          });
+      }
+    },
+    checkPaperStruct() {
+      if (
+        !(
+          this.paperStruct.paperDetailStructs &&
+          this.paperStruct.paperDetailStructs.length > 0
+        )
+      ) {
+        this.$notify({
+          message: "请添加大题",
+          type: "error"
+        });
+        return false;
+      }
+      for (let paperDetailStruct of this.paperStruct.paperDetailStructs) {
+        if (
+          !(
+            paperDetailStruct.unitStructs &&
+            paperDetailStruct.unitStructs.length > 0
+          )
+        ) {
+          this.$notify({
+            message: "请添加大题下的题型",
+            type: "error"
+          });
+          return false;
+        }
+      }
+      if (this.paperStruct.totalScore != this.totalScore) {
+        this.$notify({
+          message: "大题总分与结构满分不一致",
+          type: "error"
+        });
+        return false;
+      }
+      return true;
+    },
+    //保存大题
+    submitForm(formData) {
+      //校验大题名称
+      if (
+        !this.paperDetailStructForm.name ||
+        this.paperDetailStructForm.name.trim().length == 0
+      ) {
+        this.$notify({
+          message: "大题名称不能为空",
+          type: "error"
+        });
+        return;
+      }
+      this.loading = true;
+      this.$refs[formData].validate(valid => {
+        if (valid) {
+          var ids = [];
+          for (let paperDetailStruct of this.paperDetailStructs) {
+            ids.push(paperDetailStruct.id);
+          }
+          ids.sort();
+          var maxId;
+          if (ids.length == 0) {
+            maxId = 1;
+          } else {
+            maxId = ids[ids.length - 1];
+          }
+
+          var paperDetailStruct = Object.assign({}, this.paperDetailStructForm);
+          paperDetailStruct.id = maxId + 1;
+          paperDetailStruct.number = this.paperDetailStructs.length + 1;
+          this.paperDetailStructs.push(paperDetailStruct);
+          this.paperDetailStructDialog = false;
+          this.paperDetailStructForm = { name: "", remark: "" };
+          this.paperStruct.paperDetailStructs = this.paperDetailStructs;
+          sessionStorage.setItem(
+            "paperStruct",
+            JSON.stringify(this.paperStruct)
+          );
+        } else {
+          return false;
+        }
+      });
+      this.loading = false;
+    },
+    submitEditForm(formData) {
+      //校验大题名称
+      if (
+        !this.paperDetailStructForm.name ||
+        this.paperDetailStructForm.name.trim().length == 0
+      ) {
+        this.$notify({
+          message: "大题名称不能为空",
+          type: "error"
+        });
+        return;
+      }
+      this.loading = true;
+      this.$refs[formData].validate(valid => {
+        if (valid) {
+          var paperDetailStructs = this.paperDetailStructs;
+          for (let i = paperDetailStructs.length - 1; i >= 0; i--) {
+            if (paperDetailStructs[i].id == this.paperDeatilId) {
+              paperDetailStructs[i].remark = this.paperDetailStructForm.remark;
+              paperDetailStructs[i].name = this.paperDetailStructForm.name;
+            }
+          }
+          this.paperDetailStructDialog = false;
+          this.paperDetailStructForm = { name: "", remark: "" };
+          this.paperStruct.paperDetailStructs = paperDetailStructs;
+          sessionStorage.setItem(
+            "paperStruct",
+            JSON.stringify(this.paperStruct)
+          );
+        } else {
+          return false;
+        }
+      });
+      this.loading = false;
+    },
+    deletePaperDetail(id) {
+      var paperDetailStructs = this.paperDetailStructs;
+      for (let i = paperDetailStructs.length - 1; i >= 0; i--) {
+        if (paperDetailStructs[i].id == id) {
+          paperDetailStructs.splice(i, 1);
+        }
+      }
+      this.paperStruct.paperDetailStructs = paperDetailStructs;
+      sessionStorage.setItem("paperStruct", JSON.stringify(this.paperStruct));
+      console.log(sessionStorage.getItem("paperStruct"));
+    },
+    setPaperStruct() {
+      var paperStruct = sessionStorage.getItem("paperStruct");
+      this.paperStruct = JSON.parse(paperStruct);
+    },
+    removeItem() {
+      sessionStorage.removeItem("paperStruct");
+    },
+    //重置
+    resetForm() {
+      this.paperDetailStructForm = {
+        name: "",
+        remark: ""
+      };
+    },
+
+    //添加大题型
+    insert() {
+      this.dialogType = "ADD";
+      this.paperDetailStructForm.remark = "";
+      this.paperDetailStructForm.name = "";
+      this.paperDetailStructDialog = true;
+    },
+    editPaperDetail(paperDeatilId) {
+      this.dialogType = "EDIT";
+      this.paperDeatilId = paperDeatilId;
+      var paperDetailStructs = this.paperDetailStructs;
+      for (let i = paperDetailStructs.length - 1; i >= 0; i--) {
+        if (paperDetailStructs[i].id == this.paperDeatilId) {
+          this.paperDetailStructForm.remark = paperDetailStructs[i].remark;
+          this.paperDetailStructForm.name = paperDetailStructs[i].name;
+        }
+      }
+      this.paperDetailStructDialog = true;
+    },
+    //添加小题
+    insertTopicStruct(row) {
+      let courseNo =
+        this.paperStruct.courseNo === "" ? "all" : this.paperStruct.courseNo;
+      sessionStorage.setItem("paperStruct", JSON.stringify(this.paperStruct));
+      this.$router.push({
+        path:
+          "/questions/insert_paper_structure_info/" +
+          this.paperStructId +
+          "/" +
+          row.name +
+          "/" +
+          row.id +
+          "/" +
+          courseNo
+      });
+    },
+    //返回
+    back() {
+      this.$router.push({
+        path: "/questions/paper_structure/1"
+      });
+    },
+    //查询所有课程
+    getCourses(query) {
+      query = query.trim();
+      if (query) {
+        if (!(query.indexOf("(") > -1 && query.indexOf(")") > -1)) {
+          this.courseLoading = true;
+          this.$http
+            .get(CORE_API + "/course/query?name=" + query + "&enable=true")
+            .then(response => {
+              this.courseList = response.data;
+              this.courseLoading = false;
+            });
+        }
+      } else {
+        this.courseList = [];
+      }
+    }
+  },
+  computed: {
+    button_disabled: function() {
+      //var reg = /^[-\+]?\d+(\.\d+)?$/; //正小数
+      var reg = /^\d+(?=\.{0,1}\d+$|$)/;
+      if (
+        reg.test(this.paperStruct.totalScore) &&
+        this.paperStruct.totalScore > 0 &&
+        this.paperStruct.name
+      ) {
+        return false;
+      } else {
+        return true;
+      }
+    },
+    totalScore() {
+      var sum = 0.0;
+      for (let paperDetailStruct of this.paperDetailStructs) {
+        sum += paperDetailStruct.totalScore;
+      }
+      return sum;
+    },
+    courseInfoSelect() {
+      var courseList = [];
+      for (let course of this.courseList) {
+        var courseInfo = course.name + "(" + course.code + ")";
+        var courseNo = course.code;
+        courseList.push({ courseNo: courseNo, courseInfo: courseInfo });
+      }
+      return courseList;
+    }
+  },
+  created() {
+    this.paperStructId = this.$route.params.id;
+    this.searchForm();
+  }
+};
+</script>

+ 1096 - 0
src/modules/questions/views/InsertPaperStructureInfo.vue

@@ -0,0 +1,1096 @@
+<template>
+  <div>
+    <section class="content">
+      <div>
+        <!-- 头信息 -->
+        <div>
+          <h3 class="box-title">题型创建->{{ detailName }}</h3>
+        </div>
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <el-form
+            :inline="true"
+            :model="paperUnitForm"
+            :rules="rules"
+            ref="paperUnitForm"
+            label-position="right"
+            label-width="90px"
+          >
+            <el-form-item
+              label="题型结构"
+              class="pull-left"
+              prop="questionType"
+            >
+              <el-select
+                @change="getQuesNameList"
+                v-model="paperUnitForm.questionType"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in quesTypes"
+                  :label="item.label"
+                  :value="item.value"
+                  :key="item.value"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="题目数量" prop="count">
+              <el-input
+                v-model.number="paperUnitForm.count"
+                @change="muli"
+                placeholder="请点击"
+                :disabled="true"
+                @focus="openDialog"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="每题分值" class="pull-left" prop="score">
+              <el-input
+                v-model.number="paperUnitForm.score"
+                @change="muli"
+                placeholder="请输入"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="题型总分" class="pull-left" prop="totalScore">
+              <el-input
+                v-model="paperUnitForm.totalScore"
+                :disabled="true"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="来源大题" class="pull-left" prop="quesNames">
+              <el-select
+                multiple
+                v-model="paperUnitForm.quesNames"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in quesNameList"
+                  :label="item.name"
+                  :value="item.code"
+                  :key="item.code"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item class="pull-right">
+              <el-button
+                size="small"
+                type="primary"
+                @click="submitForm('paperUnitForm');"
+                >保 存</el-button
+              >
+              <el-button
+                size="small"
+                type="danger"
+                @click="resetForm('paperUnitForm');"
+                >重 置</el-button
+              >
+              <el-button
+                size="small"
+                type="primary"
+                icon="caret-left"
+                @click="back"
+                >返 回</el-button
+              >
+            </el-form-item>
+          </el-form>
+          <!-- 页面列表 -->
+          <el-table
+            :data="unitStructs"
+            border
+            style="width: 100%;text-align:center;"
+          >
+            <el-table-column label="大题名称" width="100">
+              <div>
+                <span>{{ detailName }}</span>
+              </div>
+            </el-table-column>
+            <el-table-column label="题型结构" width="100">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ getQuesTypeName(scope.row.questionType) }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="题目总数" width="100">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.count }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="公开(简单)" width="130">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.publicSimple }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="公开(中等)" width="130">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.publicMedium }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="公开(困难)" width="130">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.publicDifficulty }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="非公开(简单)" width="140">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.noPublicSimple }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="非公开(中等)" width="140">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.noPublicMedium }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="非公开(困难)" width="140">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.noPublicDifficulty }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="每题分值" width="100">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.score }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="题型总分" width="100">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ scope.row.totalScore }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="来源大题" width="150">
+              <template slot-scope="scope">
+                <div>
+                  <span>{{ getQuesNames(scope.row.quesNames) }}</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="140">
+              <template slot-scope="scope">
+                <div>
+                  <el-button
+                    size="mini"
+                    type="info"
+                    @click="openPaperDetailUnitStructDialog(scope.row.id);"
+                  >
+                    编辑
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="deleteUnit(scope.row.id);"
+                    >删除</el-button
+                  >
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-dialog
+            title="小题信息"
+            v-model="paperDetailUnitStructDialog"
+            size="small"
+          >
+            <div>
+              <el-form
+                :inline="true"
+                :model="paperUnitForm2"
+                :rules="rules"
+                ref="paperUnitForm2"
+                label-position="right"
+                label-width="90px"
+              >
+                <el-row :gutter="45">
+                  <el-col :span="12">
+                    <el-form-item label="题型结构" prop="questionType">
+                      <el-select
+                        @change="getQuesNameList"
+                        v-model="paperUnitForm2.questionType"
+                        placeholder="请选择"
+                      >
+                        <el-option
+                          v-for="item in quesTypes"
+                          :label="item.label"
+                          :value="item.value"
+                          :key="item.value"
+                        ></el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item
+                      label="每题分值"
+                      class="pull-left"
+                      prop="score"
+                    >
+                      <el-input
+                        v-model.number="paperUnitForm2.score"
+                        @change="muli2"
+                        placeholder="请输入"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="45">
+                  <el-col :span="12">
+                    <el-form-item label="题型总分" prop="totalScore">
+                      <el-input
+                        v-model="paperUnitForm2.totalScore"
+                        :disabled="true"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item label="来源大题" prop="quesNames">
+                      <el-select
+                        multiple
+                        v-model="paperUnitForm2.quesNames"
+                        placeholder="请选择"
+                      >
+                        <el-option
+                          v-for="item in quesNameList"
+                          :label="item.name"
+                          :value="item.code"
+                          :key="item.code"
+                        ></el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-table :data="paperUnitForms" border>
+                    <el-table-column label="公开(简单)">
+                      <template slot-scope="scope">
+                        <div>
+                          <el-input
+                            v-model="scope.row.publicSimple"
+                            @change="
+                              unitCount(
+                                scope.row,
+                                scope.row.publicSimple,
+                                'publicSimple',
+                                paperUnitForm2
+                              );
+                            "
+                          ></el-input>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="公开(中等)">
+                      <template slot-scope="scope">
+                        <div>
+                          <el-input
+                            v-model="scope.row.publicMedium"
+                            @change="
+                              unitCount(
+                                scope.row,
+                                scope.row.publicMedium,
+                                'publicMedium',
+                                paperUnitForm2
+                              );
+                            "
+                          ></el-input>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="公开(困难)">
+                      <template slot-scope="scope">
+                        <div>
+                          <el-input
+                            v-model="scope.row.publicDifficulty"
+                            @change="
+                              unitCount(
+                                scope.row,
+                                scope.row.publicDifficulty,
+                                'publicDifficulty',
+                                paperUnitForm2
+                              );
+                            "
+                          ></el-input>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="公开总数">
+                      <div>
+                        <el-input
+                          v-model="paperUnitForm2.publicSum"
+                          :disabled="true"
+                        ></el-input>
+                      </div>
+                    </el-table-column>
+                  </el-table>
+
+                  <el-table :data="paperUnitForms" border>
+                    <el-table-column label="非公开(简单)">
+                      <template slot-scope="scope">
+                        <div>
+                          <el-input
+                            v-model="row.noPublicSimple"
+                            @change="
+                              unitCount(
+                                scope.row,
+                                scope.row.noPublicSimple,
+                                'noPublicSimple',
+                                paperUnitForm2
+                              );
+                            "
+                          ></el-input>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="非公开(中等)">
+                      <template slot-scope="scope">
+                        <div>
+                          <el-input
+                            v-model="row.noPublicMedium"
+                            @change="
+                              unitCount(
+                                scope.row,
+                                scope.row.noPublicMedium,
+                                'noPublicMedium',
+                                paperUnitForm2
+                              );
+                            "
+                            :disabled="scope.row.disable"
+                          ></el-input>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="非公开(困难)">
+                      <template slot-scope="scope">
+                        <div>
+                          <el-input
+                            v-model="scope.row.noPublicDifficulty"
+                            @change="
+                              unitCount(
+                                scope.row,
+                                scope.row.noPublicDifficulty,
+                                'noPublicDifficulty',
+                                paperUnitForm2
+                              );
+                            "
+                            :disabled="scope.row.disable"
+                          ></el-input>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="非公开总数">
+                      <div>
+                        <el-input
+                          v-model="paperUnitForm2.noPublicSum"
+                          :disabled="true"
+                        ></el-input>
+                      </div>
+                    </el-table-column>
+                  </el-table>
+
+                  <el-table :data="paperUnitForms" border>
+                    <el-table-column label="简单总数">
+                      <div>
+                        <el-input
+                          v-model="paperUnitForm2.simpleSum"
+                          :disabled="true"
+                        ></el-input>
+                      </div>
+                    </el-table-column>
+                    <el-table-column label="中等总数">
+                      <div>
+                        <el-input
+                          v-model="paperUnitForm2.mediumSum"
+                          :disabled="true"
+                        ></el-input>
+                      </div>
+                    </el-table-column>
+                    <el-table-column label="困难总数">
+                      <div>
+                        <el-input
+                          v-model="paperUnitForm2.difficultySum"
+                          :disabled="true"
+                        ></el-input>
+                      </div>
+                    </el-table-column>
+                    <el-table-column label="总数">
+                      <div>
+                        <el-input
+                          v-model="paperUnitForm2.count"
+                          :disabled="true"
+                        ></el-input>
+                      </div>
+                    </el-table-column>
+                  </el-table>
+                </el-row>
+                <el-row>
+                  <div>
+                    <el-button
+                      type="primary"
+                      @click="editSubmitForm('paperUnitForm2');"
+                      >保 存</el-button
+                    >
+                  </div>
+                </el-row>
+              </el-form>
+            </div>
+          </el-dialog>
+
+          <el-dialog title="题目数量" v-model="propertyDialog" size="small">
+            <el-table :data="paperUnitForms" border>
+              <el-table-column label="公开(简单)">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.publicSimple"
+                      @change="
+                        unitCount(
+                          scope.row,
+                          scope.row.publicSimple,
+                          'publicSimple',
+                          paperUnitForm
+                        );
+                      "
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="公开(中等)">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.publicMedium"
+                      @change="
+                        unitCount(
+                          scope.row,
+                          scope.row.publicMedium,
+                          'publicMedium',
+                          paperUnitForm
+                        );
+                      "
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="公开(困难)">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.publicDifficulty"
+                      @change="
+                        unitCount(
+                          scope.row,
+                          scope.row.publicDifficulty,
+                          'publicDifficulty',
+                          paperUnitForm
+                        );
+                      "
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="公开总数">
+                <div>
+                  <el-input
+                    v-model="paperUnitForm.publicSum"
+                    :disabled="true"
+                  ></el-input>
+                </div>
+              </el-table-column>
+            </el-table>
+
+            <el-table
+              :data="paperUnitForms"
+              border
+              style="width: 100%;text-align:center;"
+            >
+              <el-table-column label="非公开(简单)">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.noPublicSimple"
+                      @change="
+                        unitCount(
+                          scope.row,
+                          scope.row.noPublicSimple,
+                          'noPublicSimple',
+                          paperUnitForm
+                        );
+                      "
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="非公开(中等)">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="row.noPublicMedium"
+                      @change="
+                        unitCount(
+                          scope.row,
+                          scope.row.noPublicMedium,
+                          'noPublicMedium',
+                          paperUnitForm
+                        );
+                      "
+                      :disabled="scope.row.disable"
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="非公开(困难)">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.noPublicDifficulty"
+                      @change="
+                        unitCount(
+                          scope.row,
+                          scope.row.noPublicDifficulty,
+                          'noPublicDifficulty',
+                          paperUnitForm
+                        );
+                      "
+                      :disabled="scope.row.disable"
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="非公开总数">
+                <div>
+                  <el-input
+                    v-model="paperUnitForm.noPublicSum"
+                    :disabled="true"
+                  ></el-input>
+                </div>
+              </el-table-column>
+            </el-table>
+
+            <el-table :data="paperUnitForms" border>
+              <el-table-column label="简单总数">
+                <div>
+                  <el-input
+                    v-model="paperUnitForm.simpleSum"
+                    :disabled="true"
+                  ></el-input>
+                </div>
+              </el-table-column>
+              <el-table-column label="中等总数">
+                <div>
+                  <el-input
+                    v-model="paperUnitForm.mediumSum"
+                    :disabled="true"
+                  ></el-input>
+                </div>
+              </el-table-column>
+              <el-table-column label="困难总数">
+                <div>
+                  <el-input
+                    v-model="paperUnitForm.difficultySum"
+                    :disabled="true"
+                  ></el-input>
+                </div>
+              </el-table-column>
+              <el-table-column label="总数">
+                <div>
+                  <el-input
+                    v-model="paperUnitForm.count"
+                    :disabled="true"
+                  ></el-input>
+                </div>
+              </el-table-column>
+            </el-table>
+
+            <div style="margin-top:20px;margin-left:42%">
+              <el-button type="primary" @click="saveCount">保 存</el-button>
+              <el-button type="primary" icon="caret-left" @click="close"
+                >返 回</el-button
+              >
+            </div>
+          </el-dialog>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { Q_API, QUESTION_TYPES } from "../constants/constants";
+import _ from "lodash";
+export default {
+  data() {
+    var checkIntegerNumber = (rule, value, callback) => {
+      if (!value) {
+        return callback(new Error("数值不能为空"));
+      }
+      setTimeout(() => {
+        if (!Number.isInteger(value)) {
+          callback(new Error("请输入整数"));
+        } else {
+          if (value < 0) {
+            callback(new Error("必须大于0"));
+          } else {
+            callback();
+          }
+        }
+      }, 100);
+    };
+    var checkDoubleNumber = (rule, value, callback) => {
+      //var reg = /^[-\+]?\d+(\.\d+)?$/;
+      var reg = /^\d+(?=\.{0,1}\d+$|$)/;
+      if (!value) {
+        return callback(new Error("数值不能为空"));
+      }
+      setTimeout(() => {
+        if (!reg.test(value)) {
+          callback(new Error("请输入数值"));
+        } else {
+          if (value < 0) {
+            callback(new Error("必须大于等于0"));
+          } else {
+            callback();
+          }
+        }
+      }, 100);
+    };
+    var validateQuesNames = (rule, value, callback) => {
+      if (Array.isArray(value) && value.length == 0) {
+        callback(new Error("请选择来源大题"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      quesTypes: QUESTION_TYPES,
+      courseNo: "",
+      quesNameList: [],
+      paperUnitForm: {
+        id: "",
+        questionType: "",
+        count: 0,
+        score: "",
+        totalScore: "",
+        quesNames: [],
+        publicSimple: 0,
+        publicMedium: 0,
+        publicDifficulty: 0,
+        noPublicSimple: 0,
+        noPublicMedium: 0,
+        noPublicDifficulty: 0,
+        publicSum: 0,
+        noPublicSum: 0,
+        simpleSum: 0,
+        mediumSum: 0,
+        difficultySum: 0
+      },
+      paperUnitForm2: {
+        id: "",
+        questionType: "",
+        count: "",
+        score: "",
+        totalScore: "",
+        quesNames: [],
+        publicSimple: 0,
+        publicMedium: 0,
+        publicDifficulty: 0,
+        noPublicSimple: 0,
+        noPublicMedium: 0,
+        noPublicDifficulty: 0,
+        publicSum: 0,
+        noPublicSum: 0,
+        simpleSum: 0,
+        mediumSum: 0,
+        difficultySum: 0
+      },
+      unitId: "",
+      detailName: "",
+      detailId: "",
+      paperStructId: "",
+      paperStruct: {},
+      unitStructs: [],
+      paperUnitForms: [],
+      paperDetailUnitStructDialog: false,
+      propertyDialog: false,
+      rules: {
+        questionType: [
+          { required: true, message: "题型不能为空", trigger: "change" }
+        ],
+        count: [
+          { validator: checkIntegerNumber, required: true, trigger: "blur" }
+        ],
+        score: [
+          { required: true, validator: checkDoubleNumber, trigger: "blur" }
+        ],
+        quesNames: [{ validator: validateQuesNames, trigger: "change" }]
+      }
+    };
+  },
+  methods: {
+    //查询来源大题名称
+    getQuesNameList(quesType) {
+      if (quesType && quesType.length > 0) {
+        var quesTypeObj = {};
+        var url = Q_API + "/paperStruct/quesNames";
+        if (this.courseNo !== "all") {
+          quesTypeObj = {
+            quesType: quesType,
+            courseNo: this.courseNo
+          };
+        } else {
+          quesTypeObj = {
+            quesType: quesType
+          };
+        }
+        this.$http.get(url, { params: quesTypeObj }).then(response => {
+          console.log(response);
+          this.quesNameList = response.data;
+          this.initQuesNames();
+        });
+      }
+    },
+    initQuesNames() {
+      var arr1 = _.difference(this.paperUnitForm.quesNames, this.quesNames);
+      if (arr1.length > 0) {
+        this.paperUnitForm.quesNames = [];
+      }
+      var arr2 = _.difference(this.paperUnitForm2.quesNames, this.quesNames);
+      if (arr2.length > 0) {
+        this.paperUnitForm2.quesNames = [];
+      }
+    },
+    getQuesNames(quesNameList) {
+      var quesNameStr = "";
+      if (!Array.isArray(quesNameList)) {
+        return quesNameStr;
+      }
+      for (let quesName of quesNameList) {
+        if (quesNameStr === "") {
+          quesNameStr += quesName;
+        } else {
+          quesNameStr += "," + quesName;
+        }
+      }
+      return quesNameStr;
+    },
+    //查询列表集合
+    searchForm() {
+      this.loading = true;
+      var paperStructStorge = sessionStorage.getItem("paperStruct");
+      if (typeof paperStructStorge === "string") {
+        var paperStruct = JSON.parse(paperStructStorge);
+        this.paperStruct = paperStruct;
+        this.unitStructs = this.getUnits();
+      }
+    },
+    //保存
+    submitForm(formData) {
+      this.loading = true;
+      this.$refs[formData].validate(valid => {
+        if (valid) {
+          var unitStruct = Object.assign({}, this.paperUnitForm);
+          var ids = [];
+          for (let unitStruct of this.unitStructs) {
+            ids.push(unitStruct.id);
+          }
+          ids.sort();
+          var maxId;
+          if (ids.length == 0) {
+            maxId = 1;
+          } else {
+            maxId = ids[ids.length - 1];
+          }
+
+          unitStruct.id = maxId + 1;
+          this.unitStructs.push(unitStruct);
+          this.resetForm();
+          this.setUnits();
+          sessionStorage.setItem(
+            "paperStruct",
+            JSON.stringify(this.paperStruct)
+          );
+        } else {
+          return false;
+        }
+      });
+    },
+
+    editSubmitForm(formData) {
+      this.$refs[formData].validate(valid => {
+        if (valid) {
+          for (let unitStruct of this.unitStructs) {
+            if (unitStruct.id == this.paperUnitForm2.id) {
+              unitStruct.questionType = this.paperUnitForm2.questionType;
+              unitStruct.count = this.paperUnitForm2.count;
+              unitStruct.score = this.paperUnitForm2.score;
+              unitStruct.totalScore = this.paperUnitForm2.totalScore;
+              unitStruct.quesNames = this.paperUnitForm2.quesNames;
+              unitStruct.publicSimple = this.paperUnitForm2.publicSimple;
+              unitStruct.publicMedium = this.paperUnitForm2.publicMedium;
+              unitStruct.publicDifficulty = this.paperUnitForm2.publicDifficulty;
+              unitStruct.noPublicSimple = this.paperUnitForm2.noPublicSimple;
+              unitStruct.noPublicMedium = this.paperUnitForm2.noPublicMedium;
+              unitStruct.noPublicDifficulty = this.paperUnitForm2.noPublicDifficulty;
+              unitStruct.publicSum = this.paperUnitForm2.publicSum;
+              unitStruct.noPublicSum = this.paperUnitForm2.noPublicSum;
+              unitStruct.simpleSum = this.paperUnitForm2.simpleSum;
+              unitStruct.mediumSum = this.paperUnitForm2.mediumSum;
+              unitStruct.difficultySum = this.paperUnitForm2.difficultySum;
+              this.setUnits();
+              this.paperDetailUnitStructDialog = false;
+              sessionStorage.setItem(
+                "paperStruct",
+                JSON.stringify(this.paperStruct)
+              );
+            }
+          }
+        }
+      });
+    },
+    //重置
+    resetForm() {
+      this.paperUnitForm = {
+        id: "",
+        questionType: "",
+        count: 0,
+        score: "",
+        totalScore: "",
+        quesNames: [],
+        publicSimple: 0,
+        publicMedium: 0,
+        publicDifficulty: 0,
+        noPublicSimple: 0,
+        noPublicMedium: 0,
+        noPublicDifficulty: 0,
+        publicSum: 0,
+        noPublicSum: 0,
+        simpleSum: 0,
+        mediumSum: 0,
+        difficultySum: 0
+      };
+    },
+    //返回
+    back() {
+      this.$router.push({
+        path: "/questions/insert_paper_structure/" + this.paperStructId
+      });
+    },
+    muli() {
+      this.paperUnitForm.totalScore =
+        this.paperUnitForm.count * this.paperUnitForm.score;
+    },
+    muli2() {
+      this.paperUnitForm2.totalScore =
+        this.paperUnitForm2.count * this.paperUnitForm2.score;
+    },
+    getUnits() {
+      var unitStructs = [];
+      for (let paperDetailStruct of this.paperStruct.paperDetailStructs) {
+        if (parseInt(paperDetailStruct.id) == this.detailId) {
+          if (paperDetailStruct.unitStructs) {
+            return paperDetailStruct.unitStructs;
+          }
+        }
+      }
+      return unitStructs;
+    },
+    setUnits() {
+      for (let paperDetailStruct of this.paperStruct.paperDetailStructs) {
+        if (parseInt(paperDetailStruct.id) == this.detailId) {
+          paperDetailStruct.unitStructs = this.unitStructs;
+          paperDetailStruct.totalScore = this.totalScore;
+          paperDetailStruct.detailCount = this.detailCount;
+        }
+      }
+    },
+    getQuesTypeName(value) {
+      for (let quesType of this.quesTypes) {
+        if (value == quesType.value) {
+          return quesType.label;
+        }
+      }
+    },
+
+    openPaperDetailUnitStructDialog(id) {
+      this.unitId = id;
+      for (let unitStruct of this.unitStructs) {
+        if (unitStruct.id == id) {
+          this.paperUnitForm2.id = id;
+          this.paperUnitForm2.questionType = unitStruct.questionType;
+          this.paperUnitForm2.count = unitStruct.count;
+          this.paperUnitForm2.score = unitStruct.score;
+          this.paperUnitForm2.totalScore = unitStruct.totalScore;
+          this.paperUnitForm2.quesNames = unitStruct.quesNames;
+          this.paperUnitForm2.publicSimple = unitStruct.publicSimple;
+          this.paperUnitForm2.publicMedium = unitStruct.publicMedium;
+          this.paperUnitForm2.publicDifficulty = unitStruct.publicDifficulty;
+          this.paperUnitForm2.noPublicSimple = unitStruct.noPublicSimple;
+          this.paperUnitForm2.noPublicMedium = unitStruct.noPublicMedium;
+          this.paperUnitForm2.noPublicDifficulty =
+            unitStruct.noPublicDifficulty;
+          //实时计算,不存数据库
+          this.paperUnitForm2.publicSum =
+            this.paperUnitForm2.publicSimple +
+            this.paperUnitForm2.publicMedium +
+            this.paperUnitForm2.publicDifficulty;
+          this.paperUnitForm2.noPublicSum =
+            this.paperUnitForm2.noPublicSimple +
+            this.paperUnitForm2.noPublicMedium +
+            this.paperUnitForm2.noPublicDifficulty;
+          this.paperUnitForm2.simpleSum =
+            this.paperUnitForm2.publicSimple +
+            this.paperUnitForm2.noPublicSimple;
+          this.paperUnitForm2.mediumSum =
+            this.paperUnitForm2.publicMedium +
+            this.paperUnitForm2.noPublicMedium;
+          this.paperUnitForm2.difficultySum =
+            this.paperUnitForm2.publicDifficulty +
+            this.paperUnitForm2.noPublicDifficulty;
+        }
+      }
+      this.getQuesNameList(this.paperUnitForm2.questionType);
+      this.paperDetailUnitStructDialog = true;
+      this.paperUnitForms = [];
+      this.paperUnitForms.push(this.paperUnitForm2);
+    },
+    deleteUnit(id) {
+      var unitStructs = this.unitStructs;
+      for (let i = unitStructs.length - 1; i >= 0; i--) {
+        if (unitStructs[i].id == id) {
+          unitStructs.splice(i, 1);
+        }
+      }
+      this.unitStructs = unitStructs;
+      this.setUnits();
+      sessionStorage.setItem("paperStruct", JSON.stringify(this.paperStruct));
+      console.log(sessionStorage.getItem("paperStruct"));
+    },
+    openDialog() {
+      console.log("aaa");
+      //this.propertyDialog = true;
+      //this.paperUnitForms = [];
+      //this.paperUnitForms.push(this.paperUnitForm);
+    },
+    //判断是否为正整数
+    isPositiveInteger(s) {
+      //是否为正整数
+      var re = /^[0-9]+$/;
+      return re.test(s);
+    },
+    unitCount(row, data, rowType, paperUnitForm) {
+      //计算前校验正整数
+      if (!this.isPositiveInteger(data)) {
+        if (rowType === "publicSimple") {
+          setTimeout(function() {
+            row.publicSimple = 0;
+          }, 1);
+        } else if (rowType === "publicMedium") {
+          setTimeout(function() {
+            row.publicMedium = 0;
+          }, 1);
+        } else if (rowType === "publicDifficulty") {
+          setTimeout(function() {
+            row.publicDifficulty = 0;
+          }, 1);
+        } else if (rowType === "noPublicSimple") {
+          setTimeout(function() {
+            row.noPublicSimple = 0;
+          }, 1);
+        } else if (rowType === "noPublicMedium") {
+          setTimeout(function() {
+            row.noPublicMedium = 0;
+          }, 1);
+        } else if (rowType === "noPublicDifficulty") {
+          setTimeout(function() {
+            row.noPublicDifficulty = 0;
+          }, 1);
+        }
+      }
+      setTimeout(function() {
+        row.publicSimple = parseInt(row.publicSimple);
+        row.publicMedium = parseInt(row.publicMedium);
+        row.publicDifficulty = parseInt(row.publicDifficulty);
+        row.noPublicSimple = parseInt(row.noPublicSimple);
+        row.noPublicMedium = parseInt(row.noPublicMedium);
+        row.noPublicDifficulty = parseInt(row.noPublicDifficulty);
+        //公开总数
+        paperUnitForm.publicSum =
+          parseInt(row.publicSimple) +
+          parseInt(row.publicMedium) +
+          parseInt(row.publicDifficulty);
+        //非公开总数
+        paperUnitForm.noPublicSum =
+          parseInt(row.noPublicSimple) +
+          parseInt(row.noPublicMedium) +
+          parseInt(row.noPublicDifficulty);
+        //简单总数
+        paperUnitForm.simpleSum =
+          parseInt(row.publicSimple) + parseInt(row.noPublicSimple);
+        //中等总数
+        paperUnitForm.mediumSum =
+          parseInt(row.publicMedium) + parseInt(row.noPublicMedium);
+        //困难总数
+        paperUnitForm.difficultySum =
+          parseInt(row.publicDifficulty) + parseInt(row.noPublicDifficulty);
+        //总数
+        paperUnitForm.count =
+          paperUnitForm.publicSum + paperUnitForm.noPublicSum;
+        //分数
+        paperUnitForm.totalScore = paperUnitForm.count * paperUnitForm.score;
+      }, 5);
+    },
+    close() {
+      console.log("close");
+      this.propertyDialog = false;
+      this.paperUnitForms = [];
+    },
+    saveCount() {
+      this.propertyDialog = false;
+      this.paperUnitForms = [];
+    }
+  },
+  computed: {
+    totalScore() {
+      var sum = 0.0;
+      for (let unitStruct of this.unitStructs) {
+        sum += unitStruct.totalScore;
+      }
+      return sum;
+    },
+    detailCount() {
+      var count = 0.0;
+      for (let unitStruct of this.unitStructs) {
+        count += unitStruct.count;
+      }
+      return count;
+    },
+    quesNames() {
+      var quesNames = [];
+      for (let quesName of this.quesNameList) {
+        quesNames.push(quesName.code);
+      }
+      return quesNames;
+    }
+  },
+  //初始化查询
+  created() {
+    this.paperStructId = this.$route.params.id;
+    this.detailName = this.$route.params.name;
+    this.detailId = this.$route.params.detailId;
+    this.courseNo = this.$route.params.courseNo;
+    this.searchForm();
+  }
+};
+</script>

+ 20 - 27
src/modules/questions/views/PaperStructure.vue

@@ -1,8 +1,3 @@
-<style>
-.form_width {
-  width: 180px;
-}
-</style>
 <template>
   <div>
     <section class="content">
@@ -38,7 +33,6 @@
                 <el-form-item label="制定课程">
                   <el-select
                     v-model="formSearch.courseNo"
-                    class="form_width"
                     filterable
                     :remote-method="getCourses"
                     remote
@@ -149,22 +143,24 @@
               </template>
             </el-table-column>
             <el-table-column :context="_self" label="操作" width="140">
-              <div>
-                <el-button
-                  size="mini"
-                  type="info"
-                  @click="editPaperStruct(row);"
-                >
-                  修改
-                </el-button>
-                <el-button
-                  size="mini"
-                  type="danger"
-                  @click="deletePaper($index, row);"
-                >
-                  删除
-                </el-button>
-              </div>
+              <template slot-scope="scope">
+                <div>
+                  <el-button
+                    size="mini"
+                    type="info"
+                    @click="editPaperStruct(scope.row);"
+                  >
+                    修改
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    @click="deletePaper(scope.$index, scope.row);"
+                  >
+                    删除
+                  </el-button>
+                </div>
+              </template>
             </el-table-column>
           </el-table>
           <div class="page pull-right">
@@ -213,7 +209,6 @@ export default {
       var url =
         Q_API + "/paperStruct/" + this.currentPage + "/" + this.pageSize;
       this.$http.get(url, { params: this.formSearch }).then(response => {
-        console.log("response:", response);
         this.tableData = response.data.content;
         this.total = response.data.totalElements;
       });
@@ -306,7 +301,7 @@ export default {
       sessionStorage.setItem("paper_stucture", JSON.stringify(this.formSearch));
       sessionStorage.setItem("paper_stucture_currentPage", this.currentPage);
       this.$router.push({
-        path: "/index/insert_paper_structure/add"
+        path: "/questions/insert_paper_structure/add"
       });
     },
 
@@ -321,7 +316,6 @@ export default {
     },
     //查询所有课程
     getCourses(query) {
-      console.log("query:", query);
       query = query.trim();
       if (query) {
         if (!(query.indexOf("(") > -1 && query.indexOf(")") > -1)) {
@@ -329,7 +323,7 @@ export default {
           this.$http
             .get(CORE_API + "/course/query?name=" + query + "&enable=true")
             .then(response => {
-              this.courseList = response.body;
+              this.courseList = response.data;
               this.courseLoading = false;
             });
         }
@@ -390,7 +384,6 @@ export default {
     }
     this.removeItem();
     this.searchPaperStructs();
-    //this.getCourses();
   }
 };
 </script>

+ 49 - 1
src/plugins/axios.js

@@ -14,6 +14,7 @@ let config = {
 };
 
 const _axios = axios.create(config);
+const _axiosWithoutResponseInterceptors = axios.create(config);
 
 /**
  * A. token lifecycle
@@ -27,6 +28,45 @@ let wk_token, wk_key;
 let wk_orgId;
 
 _axios.interceptors.request.use(
+  function(config) {
+    // Do something before request is sent
+    if (config.url.includes("/login") === false) {
+      if (!wk_token) {
+        const user = JSON.parse(window.sessionStorage.getItem("user"));
+        if (!user) {
+          Vue.prototype.$alert("登录失效,请重新登录!", "提示", {
+            confirmButtonText: "确定",
+            callback: () => {
+              router.push("/login/" + "?orgId=" + wk_orgId);
+            }
+          });
+          return;
+        }
+        wk_token = user.token;
+        wk_key = user.key;
+        wk_orgId = user.rootOrgId;
+      }
+      if (wk_token && config.headers.common["token"] == null) {
+        config.headers.common["token"] = wk_token;
+        config.headers.common["key"] = wk_key;
+      }
+    } else {
+      wk_token = null;
+    }
+    return config;
+  },
+  function(error) {
+    // Do something with request error
+    Vue.prototype.$notify({
+      showClose: true,
+      message: error,
+      type: "error"
+    });
+    return Promise.reject(error);
+  }
+);
+
+_axiosWithoutResponseInterceptors.interceptors.request.use(
   function(config) {
     // Do something before request is sent
     if (config.url.includes("/login") === false) {
@@ -116,9 +156,17 @@ _axios.interceptors.response.use(
 );
 
 Plugin.install = function(Vue) {
-  Vue.$http = _axios;
+  Vue.$http = _axiosWithoutResponseInterceptors;
   Object.defineProperties(Vue.prototype, {
     $http: {
+      get() {
+        return _axiosWithoutResponseInterceptors;
+      }
+    }
+  });
+  Vue.$httpWithMsg = _axios;
+  Object.defineProperties(Vue.prototype, {
+    $httpWithMsg: {
       get() {
         return _axios;
       }

+ 2 - 0
src/plugins/vueAwesome.js

@@ -3,5 +3,7 @@ import Icon from "vue-awesome/components/Icon";
 
 import "vue-awesome/icons/flag";
 import "vue-awesome/icons/print";
+import "vue-awesome/icons/user";
+import "vue-awesome/icons/sign-out-alt";
 
 Vue.component("v-icon", Icon);