zhangjie 4 سال پیش
والد
کامیت
5bf5e66487

+ 10 - 0
src/assets/styles/pages.scss

@@ -153,3 +153,13 @@
     margin-bottom: 5px;
   }
 }
+
+// page-preview
+.preview-frame {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 99;
+}

+ 0 - 4
src/modules/card/api.js

@@ -50,7 +50,3 @@ export const saveCard = datas => {
 export const submitCard = datas => {
   return $post("/api/print/card/submit", datas);
 };
-
-export const cardStudentInfo = ({ cardId, studentNo }) => {
-  return $get("/backend/sysuser/resetPwd", { cardId, studentNo });
-};

+ 1 - 1
src/modules/card/router.js

@@ -7,7 +7,7 @@ export default [
   },
   {
     // viewType::: view:预览,print:打印,frame:iframe嵌套
-    path: "/card/preview/:cardId/:viewType/:studentNo?",
+    path: "/card/preview/:cardId/:viewType",
     name: "CardPreview",
     component: () =>
       import(/* webpackChunkName: "CardPreview" */ "./views/CardPreview.vue")

+ 9 - 4
src/modules/card/views/CardDesign.vue

@@ -396,7 +396,7 @@ export default {
         // 没有题卡内容时,直接创建新的内容
         this.setCardConfig({
           cardName: detData.title,
-          aOrB: detData.enablePaperType === "A,B"
+          aOrB: detData.enablePaperType.split(",").length > 1
         });
         this.initPageData();
       }
@@ -483,11 +483,15 @@ export default {
     },
     // save
     getCardData(contentTemp = "") {
+      const multiEnablePaperType =
+        this.prepareTcPCard["enablePaperType"] &&
+        this.prepareTcPCard["enablePaperType"].split(",").length > 1
+          ? this.prepareTcPCard["enablePaperType"]
+          : "";
       const tcPCard = this.$objAssign(
         {
           examId: "",
           enablePaperType: "A",
-          // paperAttachmentId: "",
           courseName: "",
           courseCode: "",
           cardSource: "",
@@ -497,8 +501,9 @@ export default {
         {
           ...this.prepareTcPCard,
           title: this.cardConfig.cardName,
-          // todo:A,B最好前端配置一下,以便支持扩展
-          enablePaperType: this.cardConfig.aOrB ? "A,B" : "A"
+          enablePaperType: this.cardConfig.aOrB
+            ? multiEnablePaperType || "A,B"
+            : "A"
         }
       );
 

+ 25 - 9
src/modules/card/views/CardPreview.vue

@@ -70,13 +70,14 @@
         </div>
       </template>
     </div>
+    <div class="preview-frame" id="preview-frame" v-if="showHtmlTemp"></div>
   </div>
 </template>
 
 <script>
 import TopicElementPreview from "../components/TopicElementPreview";
 import PageNumber from "../components/pageInfo/PageNumber";
-import { cardTempDetail, cardStudentInfo } from "../api";
+import { cardTempDetail } from "../api";
 import previewTemp from "../previewTemp";
 const JsBarcode = require("jsbarcode");
 
@@ -88,10 +89,10 @@ export default {
       isPrint: this.$route.params.viewType !== "view",
       isFrame: this.$route.params.viewType === "frame",
       isFrameView: this.$route.params.viewType === "frame-view",
-      studentNo: this.$route.params.studentNo,
       cardId: this.$route.params.cardId,
       cardConfig: {},
-      pages: []
+      pages: [],
+      showHtmlTemp: false
     };
   },
   computed: {
@@ -173,19 +174,34 @@ export default {
         this.$message.error("很抱歉,当前题卡还没开始制作!");
         return;
       }
-      let stdInfo = {};
-      if (this.studentNo) {
-        stdInfo = await cardStudentInfo({
-          cardId: this.cardId,
-          studentNo: this.studentNo
+      if (!tempData.content) {
+        if (!tempData.contentTemp) {
+          this.$message.error("当前题卡详情数据错误!");
+          return;
+        }
+        this.showHtmlTemp = true;
+        this.$nextTick(() => {
+          this.initHtmlTemp(tempData.contentTemp);
         });
+        return;
       }
       const { cardConfig, pages } = JSON.parse(tempData.content);
-      const fieldInfos = this.fetchFieldInfos(cardConfig, stdInfo);
+      const fieldInfos = this.fetchFieldInfos(cardConfig, {});
 
       this.cardConfig = cardConfig;
       this.pages = this.appendFieldInfo(pages, fieldInfos);
     },
+    initHtmlTemp(htmlTemp) {
+      const iframeDom = document.createElement("iframe");
+      document.getElementById("preview-frame").appendChild(iframeDom);
+      const wwidth = window.innerWidth - 10;
+      const wheight = window.innerHeight - 10;
+      iframeDom.style.cssText = `width: ${wwidth}px;height: ${wheight}px;`;
+      const iframeDoc = iframeDom.contentDocument;
+      iframeDoc.open();
+      iframeDoc.write(htmlTemp);
+      iframeDoc.close();
+    },
     fetchFieldInfos(cardConfig, stdInfo) {
       let fieldInfos = {};
       const defContent = "相关信息";

+ 91 - 26
src/modules/exam-center/views/CardManage.vue

@@ -43,6 +43,17 @@
           <el-button type="warning" icon="icon icon-plus" @click="toAdd"
             >创建题卡</el-button
           >
+          <upload-button
+            btn-icon="icon icon-upload"
+            btn-type="default"
+            btn-content="导入题卡"
+            :upload-url="uploadUrl"
+            :format="['html']"
+            :upload-data="uploadData"
+            @upload-error="uplaodError"
+            @upload-success="uploadSuccess"
+            v-if="IS_ADMIN"
+          ></upload-button>
         </el-form-item>
       </el-form>
     </div>
@@ -83,30 +94,48 @@
         ></el-table-column>
         <el-table-column label="操作" align="center" width="120">
           <template slot-scope="scope">
-            <el-button
-              class="btn-table-icon"
-              type="text"
-              icon="icon icon-edit"
-              @click="toEdit(scope.row)"
-              title="编辑"
-              v-if="scope.row.cardStatus === 0"
-            ></el-button>
-            <el-button
-              class="btn-table-icon"
-              type="text"
-              icon="icon icon-delete"
-              @click="toDelete(scope.row)"
-              title="删除"
-              v-if="scope.row.cardStatus === 0"
-            ></el-button>
-            <el-button
-              class="btn-table-icon"
-              type="text"
-              icon="icon icon-copy"
-              @click="toCopy(scope.row)"
-              title="复制"
-              v-if="scope.row.auditingStatus !== 0"
-            ></el-button>
+            <div v-if="!scope.row.isImport">
+              <el-button
+                class="btn-table-icon"
+                type="text"
+                icon="icon icon-edit"
+                @click="toEdit(scope.row)"
+                title="编辑"
+                v-if="scope.row.cardStatus === 0"
+              ></el-button>
+              <el-button
+                class="btn-table-icon"
+                type="text"
+                icon="icon icon-delete"
+                @click="toDelete(scope.row)"
+                title="删除"
+                v-if="scope.row.cardStatus === 0"
+              ></el-button>
+              <el-button
+                class="btn-table-icon"
+                type="text"
+                icon="icon icon-copy"
+                @click="toCopy(scope.row)"
+                title="复制"
+                v-if="scope.row.auditingStatus !== 0"
+              ></el-button>
+            </div>
+            <div v-else>
+              <el-button
+                class="btn-table-icon"
+                type="text"
+                icon="icon icon-circle-right"
+                @click="toPreview(scope.row)"
+                title="预览"
+              ></el-button>
+              <el-button
+                class="btn-table-icon"
+                type="text"
+                icon="icon icon-copy"
+                @click="toCopyCommon(scope.row)"
+                title="复制"
+              ></el-button>
+            </div>
           </template>
         </el-table-column>
       </el-table>
@@ -145,11 +174,13 @@ import {
 import { cardConfigInfos, cardTempDetail } from "@/modules/card/api";
 import { transformField } from "@/modules/card/enumerate";
 import CardOptionDialog from "../components/CardOptionDialog";
+import UploadButton from "@/components/UploadButton";
 
 export default {
   name: "card-manage",
   components: {
-    CardOptionDialog
+    CardOptionDialog,
+    UploadButton
   },
   data() {
     return {
@@ -163,10 +194,20 @@ export default {
       total: 0,
       visible: false,
       AUDITING_STATUS,
-      cards: []
+      cards: [],
+      // import card
+      IS_ADMIN: false,
+      uploadData: {
+        schoolId: this.$ls.get("schoolId"),
+        userId: this.$ls.get("user", { id: "" }).id
+      },
+      uploadUrl: "/api/print/card/card/impHtml"
     };
   },
   created() {
+    const roleCode = this.$ls.get("user", { roleCode: "" }).roleCode;
+    this.IS_ADMIN =
+      roleCode.includes("ADMIN") || roleCode.includes("SUPER_ADMIN");
     this.getList();
   },
   methods: {
@@ -257,6 +298,22 @@ export default {
 
       this.getList();
     },
+    toPreview(row) {
+      window.open(
+        this.getRouterPath({
+          name: "CardPreview",
+          params: {
+            cardId: row.id,
+            viewType: "view"
+          }
+        })
+      );
+    },
+    async toCopyCommon(row) {
+      await copyCard(row.id);
+      this.$message.success("复制成功!");
+      this.getList();
+    },
     compareCardConfig(sysConfig, curConfig) {
       let isChange = false;
       Object.keys(sysConfig).forEach(key => {
@@ -307,6 +364,14 @@ export default {
           this.deletePageLastItem();
         })
         .catch(() => {});
+    },
+    // import card
+    uplaodError(errorData) {
+      this.$notify.error({ title: "错误提示", message: errorData.message });
+    },
+    uploadSuccess(res) {
+      this.$message.success("上传成功!");
+      this.getList();
     }
   },
   beforeRouteLeave(to, from, next) {