Browse Source

feat: 下载工具相关

zhangjie 6 tháng trước cách đây
mục cha
commit
df06ebcc8a

+ 63 - 6
src/modules/admin/views/ToolManage.vue

@@ -1,13 +1,20 @@
 <template>
-  <div class="tool-manage package-manage">
+  <div class="package-manage">
     <el-row :gutter="20" type="flex">
       <el-col :span="12">
         <el-card class="card-box upload-card" header="包上传">
-          <h3 class="mb-2">图片下载工具:</h3>
+          <el-form>
+            <el-form-item label="文件类型:">
+              <el-select v-model="fileType" :disabled="loading">
+                <el-option value="INSTALL" label="安装包"></el-option>
+                <el-option value="UPGRADE" label="升级包"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-form>
           <el-upload
             drag
             action="/api/admin/sys/client/package/upload"
-            accept=".zip"
+            :accept="accept"
             :show-file-list="false"
             :on-error="handleError"
             :on-success="handleSuccess"
@@ -46,10 +53,40 @@
       </el-col>
       <el-col :span="12">
         <el-card class="card-box package-card" header="包信息">
-          <h3>安装包(更新时间:{{ info.createTime | timestampFilter }})</h3>
+          <h3>
+            安装包(更新时间:{{
+              info.install.installUploadTime | timestampFilter
+            }})
+          </h3>
           <p>
             <span>下载地址:</span>
-            <a v-if="info.url" :href="info.url" download> 图片下载工具</a>
+            <a v-if="installUrl" :href="installUrl" download>
+              {{ info.install.fileName }}</a
+            >
+            <span v-else>--</span>
+          </p>
+
+          <h3>
+            升级包(更新时间:{{
+              info.upgrade.upgradeUploadTime | timestampFilter
+            }})
+          </h3>
+          <p>
+            <span>版本名称:</span
+            ><span>{{ info.upgrade.version || "--" }}</span>
+          </p>
+          <p>
+            <span>版本号:</span><span>{{ info.upgrade.build || "--" }}</span>
+          </p>
+          <p>
+            <span>增量升级最低版本号:</span
+            ><span>{{ info.upgrade.supportMin || "--" }}</span>
+          </p>
+          <p>
+            <span>文件清单:</span>
+            <a v-if="info.upgrade.index" :href="manfestUrl" download>
+              mainfest.json
+            </a>
             <span v-else>--</span>
           </p>
         </el-card>
@@ -66,7 +103,11 @@ export default {
   name: "tool-manage",
   data() {
     return {
-      info: { url: "", createTime: 0 },
+      info: {
+        install: {},
+        upgrade: {},
+      },
+      fileType: "INSTALL",
       result: {
         message: "",
         success: true,
@@ -79,6 +120,21 @@ export default {
       uploadController: null,
     };
   },
+  computed: {
+    installUrl() {
+      return this.info.prefix
+        ? `${this.info.prefix}/${this.info.install.url}`
+        : "";
+    },
+    manfestUrl() {
+      return this.info.prefix
+        ? `${this.info.prefix}/${this.info.upgrade.index}`
+        : "";
+    },
+    accept() {
+      return this.fileType === "INSTALL" ? ".exe" : ".zip";
+    },
+  },
   mounted() {
     this.getInfo();
   },
@@ -109,6 +165,7 @@ export default {
       this.uploadController = new AbortController();
       this.loading = true;
       let formData = new FormData();
+      formData.append("type", this.fileType);
       formData.append("file", options.file);
       const md5 = await fileMD5(options.file);
       formData.append("md5", md5);

+ 33 - 1
src/modules/course/components/CourseDocumentDetail.vue

@@ -92,6 +92,14 @@
                 @click="toDownload(scope.row)"
                 >下载</el-button
               >
+              <el-button
+                v-if="checkToolDownload(scope.row)"
+                class="btn-primary"
+                type="text"
+                :disabled="downloading"
+                @click="toToolDownload(scope.row)"
+                >下载</el-button
+              >
               <el-button
                 v-if="checkDownloadUrl(scope.row)"
                 class="btn-primary"
@@ -169,6 +177,7 @@ import AddDocumentDialog from "./AddDocumentDialog.vue";
 import UploadButton from "@/components/UploadButton.vue";
 import ScoreReportPreview from "@/modules/mark/components/ScoreReportPreview.vue";
 import PaperApproveTable from "@/modules/exam/components/PaperApproveTable.vue";
+import { openApp, getDownloadURLScheme } from "@/plugins/imageExport";
 
 /*
 SYLLABUS("课程教学大纲", 1),
@@ -248,7 +257,10 @@ export default {
       );
     },
     checkDownload(row) {
-      return ["SCORE", "SHEET", "TRACK", "SIGN"].includes(row.type);
+      return ["SCORE", "SIGN"].includes(row.type);
+    },
+    checkToolDownload(row) {
+      return ["SHEET", "TRACK"].includes(row.type);
     },
     checkDownloadUrl(row) {
       return [
@@ -335,6 +347,26 @@ export default {
       if (!res) return;
       this.$message.success("下载成功!");
     },
+    toToolDownload() {
+      const url = getDownloadURLScheme(
+        {
+          semesterId: this.course.semesterId,
+          examId: this.course.examId,
+          courseCode: this.course.courseCode,
+          paperNumber: this.course.paperNumber,
+        },
+        "http://test-school-1.teach-cloud-test.com"
+      );
+
+      openApp(url, () => {
+        this.$notify.error({
+          title: "错误提示",
+          message: "请点击底部链接,先下载工具!",
+          duration: 5000,
+          showClose: true,
+        });
+      });
+    },
     toAdd() {
       this.$refs.AddDocumentDialog.open();
     },

+ 61 - 0
src/plugins/imageExport.js

@@ -0,0 +1,61 @@
+import Vue from "vue";
+import { AES } from "./crypto";
+import { pick } from "lodash";
+import { DEVICE_ID, PLATFORM } from "@/constants/app";
+import { randomCode } from "./utils";
+
+export function getDownloadURLScheme(downloadSet = null, apiUrl = null) {
+  let user = Vue.ls.get("user");
+  const schoolId = Vue.ls.get("schoolId");
+  const curSchoolInfo = user.schoolInfo.find((item) => item.id === schoolId);
+  user.curSchoolInfo = curSchoolInfo;
+  user = pick(user, [
+    "id",
+    "loginName",
+    "realName",
+    "sessionId",
+    "accessToken",
+    "orgInfo",
+    "curSchoolInfo",
+  ]);
+  user.deviceId = DEVICE_ID;
+  user.platform = PLATFORM;
+
+  const key = AES(
+    JSON.stringify({
+      user,
+      apiUrl: apiUrl || window.location.origin,
+      downloadSet,
+      actionSession: `${Date.now()}${randomCode()}`,
+    })
+  );
+  return `trd://download?q=${key}`;
+}
+
+export function openApp(scheme, fallback, timeout = 2000) {
+  let isPageHidden = false;
+
+  const onVisibilityChange = () => {
+    if (document.hidden) {
+      isPageHidden = true;
+    }
+  };
+
+  document.addEventListener("visibilitychange", onVisibilityChange);
+
+  // 创建 iframe 来尝试调用 URL Scheme
+  const iframe = document.createElement("iframe");
+  iframe.style.display = "none";
+  iframe.src = scheme;
+  document.body.appendChild(iframe);
+
+  setTimeout(() => {
+    document.removeEventListener("visibilitychange", onVisibilityChange);
+    document.body.removeChild(iframe);
+
+    if (!isPageHidden) {
+      // 如果页面未切换到后台,跳转到 fallback URL
+      fallback && fallback();
+    }
+  }, timeout);
+}