刘洋 hai 1 ano
pai
achega
d3167283f0

+ 14 - 4
src/assets/styles/pages.scss

@@ -1146,15 +1146,17 @@
   align-items: stretch;
 
   .folder-list {
-    width: 298px;
+    width: 320px;
     margin-right: 20px;
     flex-grow: 0;
     flex-shrink: 0;
     padding: 15px 12px;
     background-color: #fff;
     border-radius: 10px;
-    overflow-x: hidden;
-    overflow-y: auto;
+    overflow:auto;
+    .el-tree-node > .el-tree-node__children{
+      overflow:visible;
+    }
   }
   .question-list {
     flex-grow: 2;
@@ -1233,7 +1235,15 @@
     }
   }
 }
-
+.synthesis-paper-storage-dialog{
+  width:100vw;
+  margin-top:0 !important;
+  .el-dialog__body {
+    height: 100vh;
+    overflow: auto;
+    min-width: 1200px;
+  }
+}
 // question-import-edit-dialog
 .question-import-edit-dialog {
   .el-dialog__body {

+ 1 - 1
src/modules/card/views/CardEdit.vue

@@ -256,7 +256,7 @@ export default {
     toExit() {
       this.$confirm(
         "请确保当前题卡已经正常保存,确定要退出当前题卡编辑吗?",
-        "提示",
+        "系统通知",
         {
           type: "warning",
         }

+ 1 - 1
src/modules/paper-export/views/PaperTemplateEdit.vue

@@ -97,7 +97,7 @@ export default {
     toExit() {
       this.$confirm(
         "请确保当前模板已经正常保存,确定要退出当前模板编辑吗?",
-        "提示",
+        "系统通知",
         {
           type: "warning",
         }

+ 2 - 2
src/modules/paper-export/views/PaperTemplateManage.vue

@@ -38,12 +38,12 @@
           label="创建人"
           width="120"
         ></el-table-column>
-        <el-table-column prop="type" label="模板类型" width="120">
+        <el-table-column prop="type" label="模板类型">
           <span slot-scope="scope">{{
             scope.row.type | paperTempalteTypeFilter
           }}</span>
         </el-table-column>
-        <el-table-column width="80" label="状态">
+        <el-table-column label="状态">
           <template slot-scope="scope">
             <span v-if="scope.row.enable">
               <el-tooltip

+ 2 - 0
src/modules/portal/views/Login.vue

@@ -33,6 +33,7 @@
               v-model.trim="loginInfo.accountValue"
               placeholder="请输入账号"
               clearable
+              @keydown.enter.native="submit"
             >
               <!-- <i slot="prefix" class="icon icon-username"></i> -->
             </el-input>
@@ -43,6 +44,7 @@
               type="password"
               placeholder="请输入密码"
               show-password
+              @keydown.enter.native="submit"
             >
               <!-- <i slot="prefix" class="icon icon-password"></i> -->
             </el-input>

+ 59 - 35
src/modules/portal/views/home/Home.vue

@@ -51,7 +51,44 @@
       custom-class="side-dialog"
       @close="() => $refs.passForm.clearValidate()"
     >
-      <el-tabs v-model="userTabName">
+      <el-form
+        ref="passForm"
+        inline-message
+        class="form-tight"
+        :model="passForm"
+        :rules="passRules"
+        label-width="100px"
+      >
+        <el-form-item label="用户权限">{{ user.roleName }}</el-form-item>
+        <el-form-item label="旧密码" prop="oldPass">
+          <el-input
+            v-model="passForm.oldPass"
+            type="password"
+            class="dialog-input-width"
+            auto-complete="off"
+            placeholder="请输入旧密码"
+          />
+        </el-form-item>
+        <el-form-item label="新密码" prop="pass">
+          <el-input
+            v-model="passForm.pass"
+            type="password"
+            class="dialog-input-width"
+            auto-complete="off"
+            placeholder="请输入新密码"
+          />
+        </el-form-item>
+        <el-form-item label="确认新密码" prop="checkPass">
+          <el-input
+            v-model="passForm.checkPass"
+            type="password"
+            class="dialog-input-width"
+            auto-complete="off"
+            placeholder="请输入确认新密码"
+          />
+        </el-form-item>
+      </el-form>
+      <!-- <el-tabs v-model="userTabName">
         <el-tab-pane label="用户权限" name="first">
           <el-form :inline="true" label-position="right" label-width="90px">
             <el-tag
@@ -65,36 +102,10 @@
           </el-form>
         </el-tab-pane>
         <el-tab-pane label="修改密码" name="second">
-          <el-form
-            ref="passForm"
-            inline-message
-            class="form-tight"
-            :model="passForm"
-            :rules="passRules"
-            label-width="80px"
-          >
-            <el-form-item label="密码" prop="pass">
-              <el-input
-                v-model="passForm.pass"
-                type="password"
-                class="dialog-input-width"
-                auto-complete="off"
-                placeholder="请输入密码"
-              />
-            </el-form-item>
-            <el-form-item label="确认密码" prop="checkPass">
-              <el-input
-                v-model="passForm.checkPass"
-                type="password"
-                class="dialog-input-width"
-                auto-complete="off"
-                placeholder="请输入确认密码"
-              />
-            </el-form-item>
-          </el-form>
+    
         </el-tab-pane>
-      </el-tabs>
-      <div v-if="userTabName === 'second'" slot="footer">
+      </el-tabs> -->
+      <div slot="footer">
         <el-button type="primary" @click="submitForm">保存</el-button>
         <el-button type="danger" plain @click="userDialog = false"
           >取消</el-button
@@ -185,11 +196,17 @@ export default {
         callback();
       }
     };
+
     var validatePassWeakPass = (rule, value, callback) => {
-      if (this.passWeakForm.checkPass !== "") {
-        this.$refs.passWeakForm.validateField("checkPass");
+      // if (this.passWeakForm.checkPass !== "") {
+      //   this.$refs.passWeakForm.validateField("checkPass");
+      // }
+      // callback();
+      if (!value) {
+        callback(new Error("请输入新密码!"));
+      } else {
+        callback();
       }
-      callback();
     };
     var validatePassWeakPass2 = (rule, value, callback) => {
       if (value !== this.passWeakForm.pass) {
@@ -228,9 +245,10 @@ export default {
       userDialog: false,
       userTabName: "first",
       passWeakDialog: false,
-      passForm: { pass: "", checkPass: "" },
+      passForm: { oldPass: "", pass: "", checkPass: "" },
       passWeakForm: { pass: "", checkPass: "" },
       passRules: {
+        oldPass: [{ validator: validatePass, trigger: "blur" }, ...pwdRule],
         pass: [{ validator: validatePass, trigger: "blur" }, ...pwdRule],
         checkPass: [{ validator: validatePass2, trigger: "blur" }, ...pwdRule],
       },
@@ -279,8 +297,14 @@ export default {
     submitForm() {
       this.$refs.passForm.validate((valid) => {
         if (valid) {
+          var oldPass = encodeURIComponent(this.passForm.oldPass);
           var password = encodeURIComponent(this.passForm.pass);
-          var url = QUESTION_API + "/user/password?password=" + password;
+          var url =
+            QUESTION_API +
+            "/user/password?password=" +
+            password +
+            "&oldPass=" +
+            oldPass;
           this.$httpWithMsg.put(url).then(() => {
             this.$notify({
               type: "success",

+ 6 - 1
src/modules/portal/views/home/HomeSide.vue

@@ -93,7 +93,12 @@
             <span> 快捷路径 </span>
           </div>
           <div>
-            <div class="fast-menu-item">导入试题</div>
+            <div
+              class="fast-menu-item"
+              @click="$router.push('/questions/import_paper/0')"
+            >
+              导入试题
+            </div>
             <div
               class="fast-menu-item"
               @click="$router.push('/questions/gen_paper/0')"

+ 3 - 0
src/modules/question/components/QuestionFolder.vue

@@ -24,11 +24,13 @@
           name="xinzeng"
           content="新建"
           :disabled="curNodeData.level >= MAX_FOLDER_LEVEL"
+          @click="toAddFolder"
         ></tool-tip-btn>
         <tool-tip-btn
           name="bianji"
           content="编辑"
           :disabled="!curNodeData.level"
+          @click="toEditFolder"
           style="margin-left: 10px"
         ></tool-tip-btn>
       </div>
@@ -45,6 +47,7 @@
         name="shanchu"
         content="删除"
         :disabled="curNodeData.level >= MAX_FOLDER_LEVEL"
+        @click="toDeleteFolder"
       ></tool-tip-btn>
     </div>
 

+ 1 - 0
src/modules/question/components/QuestionImportEdit.vue

@@ -99,6 +99,7 @@
                   type="primary"
                   icon="icon icon-save-white"
                   :loading="loading"
+                  :disabled="!paperData.length"
                   @click="confirm"
                   >识别无误,加入题库</el-button
                 >

+ 4 - 7
src/modules/questions/views/ExportTemplate.vue

@@ -57,14 +57,11 @@
       <!-- 页面列表 -->
       <el-table :data="tableData" resizable>
         <el-table-column prop="fileName" label="模板名称"> </el-table-column>
-        <el-table-column prop="suffix" width="100" label="文件类型">
-        </el-table-column>
-        <el-table-column width="150" prop="typeName" label="模板类型">
-        </el-table-column>
+        <el-table-column prop="suffix" label="文件类型"> </el-table-column>
+        <el-table-column prop="typeName" label="模板类型"> </el-table-column>
         <el-table-column width="160" prop="creationTime" label="上传时间">
         </el-table-column>
-        <el-table-column width="150" prop="createUser" label="上传人">
-        </el-table-column>
+        <el-table-column prop="createUser" label="上传人"> </el-table-column>
         <el-table-column label="状态" width="70">
           <template slot-scope="scope">
             <span v-if="scope.row.enable">
@@ -367,7 +364,7 @@ export default {
         .catch(() => {});
     },
     deleteFile(row) {
-      this.$confirm("确定要禁用该模板吗?", "系统通知", {
+      this.$confirm("确定要删除该模板吗?", "系统通知", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",

+ 10 - 2
src/modules/questions/views/License.vue

@@ -46,7 +46,11 @@
               maxlength="255"
               prop="accessKey"
             >
-              <el-input v-model="form.accessKey" maxlength="255" />
+              <el-input
+                v-model="form.accessKey"
+                maxlength="255"
+                style="width: 320px"
+              />
             </el-form-item>
             <el-form-item
               v-show="form.type == 'ONLINE'"
@@ -55,7 +59,11 @@
               class="input"
               prop="accessSecret"
             >
-              <el-input v-model="form.accessSecret" maxlength="255" />
+              <el-input
+                v-model="form.accessSecret"
+                maxlength="255"
+                style="width: 320px"
+              />
             </el-form-item>
             <el-form-item v-show="form.type == 'OFFLINE'" label="导入授权文件">
               <upload-button

+ 36 - 27
src/modules/questions/views/PropertyInfo.vue

@@ -389,11 +389,13 @@ export default {
       this.courseList = [];
       if (query) {
         this.courseLoading = true;
-        this.$http.get(QUESTION_API + "/course/" + query).then((response) => {
-          var courseBean = response.data;
-          this.courseList.push(courseBean);
-          this.courseProperty.name = courseBean.name;
-        });
+        this.$httpWithMsg
+          .get(QUESTION_API + "/course/" + query)
+          .then((response) => {
+            var courseBean = response.data;
+            this.courseList.push(courseBean);
+            this.courseProperty.name = courseBean.name;
+          });
       } else {
         this.courseList = [];
       }
@@ -416,7 +418,7 @@ export default {
       //     }
       //     this.loading = false;
       //   });
-      this.$http
+      this.$httpWithMsg
         .post(
           QUESTION_API +
             "/property/all/by/course?courseId=" +
@@ -433,7 +435,7 @@ export default {
         });
     },
     getPropertyCode(parentId) {
-      this.$http
+      this.$httpWithMsg
         .post(QUESTION_API + "/property/get_code", {
           rootOrgId: this.user.rootOrgId,
           coursePropertyId: this.coursePropertyId,
@@ -489,7 +491,7 @@ export default {
       if (res === false) {
         return;
       }
-      this.$http
+      this.$httpWithMsg
         .post(QUESTION_API + "/property/save", this.propertyForm)
         .then(() => {
           this.$notify({
@@ -498,13 +500,13 @@ export default {
           });
           this.propertyDialog = false;
           this.searchProperty();
-        })
-        .catch((error) => {
-          this.$notify({
-            type: "error",
-            message: error.response.data.desc,
-          });
         });
+      // .catch((error) => {
+      //   this.$notify({
+      //     type: "error",
+      //     message: error.response.data.desc,
+      //   });
+      // });
       this.showButton = true;
       this.showSonButtton = true;
     },
@@ -518,7 +520,7 @@ export default {
       if (confirm !== "confirm") return;
 
       this.loading = true;
-      const res = await this.$http
+      const res = await this.$httpWithMsg
         .delete(
           QUESTION_API +
             "/property/delete/" +
@@ -550,37 +552,44 @@ export default {
     //上移
     moveUp() {
       this.disAllBtn();
-      this.$http
+      this.$httpWithMsg
         .put(QUESTION_API + "/property/moveUp", this.curProperty)
         .then(() => {
           this.searchProperty();
           this.showMoveButtton = true;
         })
-        .catch((error) => {
-          this.$notify({
-            type: "error",
-            message: error.response.data.desc,
-          });
+        .catch(() => {
+          // this.$notify({
+          //   type: "error",
+          //   message: error.response.data.desc,
+          // });
           this.showMoveButtton = true;
         });
     },
     //下移
     moveDown() {
       this.disAllBtn();
-      this.$http
+      this.$httpWithMsg
         .put(QUESTION_API + "/property/moveDown", this.curProperty)
         .then(() => {
           this.searchProperty();
           this.showMoveButtton = true;
         })
-        .catch((error) => {
-          this.$notify({
-            type: "error",
-            message: error.response.data.desc,
-          });
+        .catch(() => {
+          // this.$notify({
+          //   type: "error",
+          //   message: error.response.data.desc,
+          // });
           this.showMoveButtton = true;
         });
     },
   },
 };
 </script>
+<style lang="scss" scoped>
+.property-info {
+  :deep(.el-tree-node__children) {
+    padding-left: 20px;
+  }
+}
+</style>

+ 6 - 7
src/modules/questions/views/School.vue

@@ -109,14 +109,14 @@
           </template>
         </el-table-column>
         <el-table-column prop="code" width="120" label="学校代码" />
-        <el-table-column prop="domainName" width="190" label="学校域名" />
+        <el-table-column prop="domainName" label="学校域名" />
         <el-table-column
           sortable
           prop="updateTime"
-          width="170"
+          width="180"
           label="更新时间"
         />
-        <el-table-column width="50" label="状态">
+        <el-table-column label="状态">
           <span slot-scope="scope">
             <span v-if="scope.row.enable">
               <el-tooltip
@@ -140,7 +140,7 @@
             </span>
           </span>
         </el-table-column>
-        <el-table-column width="90" label="默认机构">
+        <el-table-column label="默认机构">
           <span slot-scope="scope">
             <span v-if="scope.row.defaultOrg"> 是 </span>
             <span v-else> 否 </span>
@@ -441,13 +441,13 @@ export default {
           message: "请选择要禁用的机构",
         });
       } else {
-        this.$confirm("是否禁用这些机构?", "提示", {
+        this.$confirm("是否禁用所选机构?", "系统通知", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning",
         }).then(() => {
           var url = QUESTION_API + "/org/disable/" + this.orgIds;
-          this.$$httpWithMsg.put(url, {}).then(() => {
+          this.$httpWithMsg.put(url, {}).then(() => {
             this.$notify({
               type: "success",
               message: "禁用成功!",
@@ -469,7 +469,6 @@ export default {
       this.$refs.schoolForm.resetFields();
     },
     syncOrg() {
-      alert(1);
       var url = QUESTION_API + "/org/sync";
       this.$httpWithMsg.put(url, this.schoolForm).then(() => {
         this.$notify({

+ 27 - 7
src/modules/questions/views/SynthesisPaperStorage.vue

@@ -76,7 +76,7 @@
     </div>
     <div class="part-box">
       <div class="icon-btn-group">
-        <svg-btn name="xinzeng">综合组卷</svg-btn>
+        <svg-btn name="xinzeng" @click="toBuildPaper">综合组卷</svg-btn>
         <svg-btn
           name="shanchu"
           :disabled="noBatchSelected"
@@ -160,7 +160,6 @@
                 size="medium"
                 type="text"
                 class="normal"
-                :loading="downloading"
                 @click="toViewPaper(scope.row)"
                 >预览</el-button
               >
@@ -207,7 +206,20 @@
         </el-pagination>
       </div>
     </div>
-
+    <el-dialog
+      title="试卷预览"
+      :visible.sync="previewDialog"
+      :modal="true"
+      append-to-body
+      custom-class="synthesis-paper-storage-dialog"
+    >
+      <iframe
+        style="width: 100%; height: 100%"
+        frameborder="0"
+        ref="previewIframe"
+        src="https://www.baidu.com"
+      ></iframe>
+    </el-dialog>
     <!-- 下载 -->
     <el-dialog
       title="下载试卷"
@@ -277,7 +289,7 @@ import {
   synthesizePaperDownloadApi,
   synthesizePaperPreviewApi,
 } from "../api";
-import { downloadByApi } from "@/plugins/download";
+import { downloadByApi, blobHtmlToHtmlStr } from "@/plugins/download";
 import { QUESTION_API } from "@/constants/constants";
 
 export default {
@@ -300,6 +312,7 @@ export default {
       courseList: [],
       selectedPaperIds: [],
       exportDialog: false,
+      previewDialog: false,
       exportModel: {
         id: "",
         courseCode: "",
@@ -421,15 +434,22 @@ export default {
       if (this.downloading) return;
       this.downloading = true;
 
-      const res = await downloadByApi(() => {
+      const res = await blobHtmlToHtmlStr(() => {
         return synthesizePaperPreviewApi(row.id);
       }).catch((e) => {
         this.$message.error(e || "下载失败,请重新尝试!");
       });
       this.downloading = false;
-
       if (!res) return;
-      this.$message.success("下载成功!");
+      // this.$message.success("下载成功!");
+      this.previewDialog = true;
+      this.$nextTick(() => {
+        const iframeDom = this.$refs.previewIframe;
+        const iframeDoc = iframeDom.contentDocument;
+        iframeDoc.open();
+        iframeDoc.write(res);
+        iframeDoc.close();
+      });
     },
     toEditPaper(paper) {
       this.cacheSearchInfo();

+ 2 - 2
src/modules/statistics/views/StatisticsManage.vue

@@ -83,8 +83,8 @@ export default {
   name: "StatisticsManage",
   computed: {
     queryParams() {
-      let startTime = this.searchForm.createTime[0];
-      let endTime = this.searchForm.createTime[1];
+      let startTime = this.searchForm.createTime?.[0] || "";
+      let endTime = this.searchForm.createTime?.[1] || "";
       let obj = omit(this.searchForm, "createTime");
       return { ...obj, startTime, endTime };
     },

+ 9 - 1
src/plugins/download.js

@@ -1,4 +1,4 @@
-import { objTypeOf, blobToText } from "./utils";
+import { objTypeOf, blobToText, blobToHtml } from "./utils";
 
 function parseDownloadFilename(dispositionInfo) {
   const strs = dispositionInfo.split(";");
@@ -42,6 +42,14 @@ export async function downloadByApi(fetchFunc, fileName) {
   downloadByBlob(new Blob([res.data]), filename);
   return true;
 }
+export async function blobHtmlToHtmlStr(fetchFunc) {
+  const res = await fetchFunc().catch(() => {});
+  if (res) {
+    const html = await blobToHtml(res.data).catch(() => {});
+    return html;
+  }
+  return "";
+}
 
 /**
  * 下载blob

+ 13 - 0
src/plugins/utils.js

@@ -255,6 +255,19 @@ export function blobToText(blob) {
   });
 }
 
+export function blobToHtml(blob) {
+  return new Promise((rs, rj) => {
+    var reader = new FileReader();
+    reader.onloadend = function () {
+      rs(reader.result);
+    };
+    reader.onerror = function () {
+      rj();
+    };
+    reader.readAsText(blob);
+  });
+}
+
 export function parseHrefParam(href, paramName = null) {
   if (!href) return;
   const paramStr = href.split("?")[1];