소스 검색

自动升级

zhangjie 1 년 전
부모
커밋
6c667f37a0
8개의 변경된 파일294개의 추가작업 그리고 26개의 파일을 삭제
  1. 1 1
      package.json
  2. 3 0
      src/assets/styles/base.scss
  3. 65 0
      src/assets/styles/pages.scss
  4. 6 0
      src/constants/adminNavs.js
  5. 8 0
      src/modules/admin/api.js
  6. 6 0
      src/modules/admin/router.js
  7. 195 0
      src/modules/admin/views/PackageManage.vue
  8. 10 25
      yarn.lock

+ 1 - 1
package.json

@@ -9,7 +9,7 @@
     "test:unit": "vue-cli-service test:unit"
   },
   "dependencies": {
-    "axios": "^0.18.0",
+    "axios": "^0.22.0",
     "core-js": "^3.8.3",
     "cropperjs": "^1.5.1",
     "crypto-js": "^4.0.0",

+ 3 - 0
src/assets/styles/base.scss

@@ -550,6 +550,9 @@ body {
 .tips-error {
   color: $--color-danger;
 }
+.tips-success {
+  color: $--color-success;
+}
 .tips-icon {
   display: inline-block;
   vertical-align: middle;

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

@@ -1477,3 +1477,68 @@
     }
   }
 }
+
+// package-manage
+.package-manage {
+  .card-box {
+    height: 100%;
+  }
+  .upload-precess {
+    border-radius: 4px;
+    background-color: $--color-background;
+    padding: 5px;
+
+    > .icon {
+      flex-grow: 0;
+      flex-shrink: 0;
+      cursor: pointer;
+      &:hover {
+        opacity: 0.8;
+      }
+    }
+
+    .upload-name {
+      flex-grow: 2;
+
+      p {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+    .el-progress-bar__outer {
+      background-color: #ccc !important;
+    }
+  }
+  .package-card {
+    h3 {
+      font-weight: 600;
+      color: $--color-text-dark;
+      line-height: 20px;
+      margin-bottom: 5px;
+
+      &:nth-of-type(2) {
+        margin-top: 30px;
+      }
+    }
+    p {
+      line-height: 20px;
+
+      > span {
+        color: $--color-text-dark-1;
+        &:nth-of-type(2) {
+          color: $--color-text-dark;
+        }
+      }
+
+      > a {
+        color: $--color-primary;
+
+        &:hover {
+          opacity: 0.8;
+          text-decoration: underline;
+        }
+      }
+    }
+  }
+}

+ 6 - 0
src/constants/adminNavs.js

@@ -29,6 +29,12 @@ const navs = [
     name: "扫描日志",
     url: "ScanLogManage",
   },
+  {
+    id: "8",
+    parentId: "1",
+    name: "自动升级",
+    url: "PackageManage",
+  },
 ];
 
 export default navs;

+ 8 - 0
src/modules/admin/api.js

@@ -140,3 +140,11 @@ export const schoolSetCourseTargetQuery = (schoolId) => {
 export const schoolSetCourseTargetSave = (datas) => {
   return $postParam("/api/admin/set/course/degree/save", datas);
 };
+
+// package-manage
+export const packageInfo = () => {
+  return $postParam("/api/admin/sys/client/package/external", {});
+};
+export const updatePackage = (datas, config = {}) => {
+  return $post("/api/admin/sys/client/package/upload", datas, config);
+};

+ 6 - 0
src/modules/admin/router.js

@@ -3,6 +3,7 @@ import SystemRoleManage from "./views/SystemRoleManage.vue";
 import SchoolManage from "./views/SchoolManage.vue";
 import AuthSet from "./views/AuthSet.vue";
 import ScanLogManage from "./views/ScanLogManage.vue";
+import PackageManage from "./views/PackageManage.vue";
 import Admin from "./views/Admin.vue";
 
 export default {
@@ -35,5 +36,10 @@ export default {
       name: "ScanLogManage",
       component: ScanLogManage,
     },
+    {
+      path: "package-manage",
+      name: "PackageManage",
+      component: PackageManage,
+    },
   ],
 };

+ 195 - 0
src/modules/admin/views/PackageManage.vue

@@ -0,0 +1,195 @@
+<template>
+  <div class="package-manage">
+    <el-row :gutter="20" type="flex">
+      <el-col :span="12">
+        <el-card class="card-box upload-card" header="包上传">
+          <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"
+            :show-file-list="false"
+            :on-error="handleError"
+            :on-success="handleSuccess"
+            :http-request="upload"
+            :disabled="loading"
+            :on-change="handleFileChange"
+            ref="UploadComp"
+          >
+            <i class="el-icon-upload"></i><br />
+            <em class="el-upload__text">点击或将文件拖拽到这里上传</em>
+            <p
+              slot="tip"
+              :class="[
+                `info-tips`,
+                {
+                  'tips-success': result.success,
+                  'tips-error': !result.success,
+                },
+              ]"
+              v-if="result.message"
+            >
+              {{ result.message }}
+            </p>
+          </el-upload>
+          <div
+            v-if="curProcess.filename && loading"
+            class="upload-precess box-justify"
+          >
+            <div class="upload-name">
+              <p>{{ curProcess.filename }}</p>
+              <el-progress :percentage="curProcess.progress"></el-progress>
+            </div>
+            <i class="icon icon-close-act" @click="toDelete"></i>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="12">
+        <el-card class="card-box package-card" header="包信息">
+          <h3>安装包</h3>
+          <p>
+            <span>下载地址:</span>
+            <a v-if="installUrl" :href="installUrl" download>{{
+              installUrl
+            }}</a>
+            <span v-else>--</span>
+          </p>
+
+          <h3>升级包</h3>
+          <p>
+            <span>版本号:</span><span>{{ info.upgrade.version || "--" }}</span>
+          </p>
+          <p>
+            <span>增量升级最低版本号:</span
+            ><span>{{ info.upgrade.supportMin || "--" }}</span>
+          </p>
+          <p>
+            <span>文件清单:</span>
+            <a v-if="manfestUrl" :href="manfestUrl" download>{{
+              info.upgrade?.index
+            }}</a>
+            <span v-else>--</span>
+          </p>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { packageInfo, updatePackage } from "../api";
+import { fileMD5 } from "@/plugins/md5";
+
+export default {
+  name: "package-manage",
+  data() {
+    return {
+      info: {
+        install: {},
+        upgrade: {},
+      },
+      fileType: "INSTALL",
+      result: {
+        message: "",
+        success: true,
+      },
+      curProcess: {
+        filename: "",
+        progress: 0,
+      },
+      loading: false,
+      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}`
+        : "";
+    },
+  },
+  mounted() {
+    this.getInfo();
+  },
+  methods: {
+    initData() {
+      this.result = {
+        message: "",
+        success: true,
+      };
+      this.curProcess = {
+        filename: "",
+        progress: 0,
+      };
+      this.loading = false;
+      this.uploadController = null;
+    },
+    async getInfo() {
+      const res = await packageInfo();
+      this.info = res || {};
+    },
+    handleFileChange(file) {
+      if (file.status === "ready") {
+        this.initData();
+      }
+      this.curProcess.filename = file.name;
+    },
+    async upload(options) {
+      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);
+
+      return updatePackage(formData, {
+        timeout: 60 * 60 * 1000,
+        signal: this.uploadController.signal,
+        onUploadProgress: ({ loaded, total }) => {
+          this.curProcess.progress = Math.floor((100 * loaded) / total);
+        },
+      });
+    },
+    handleError(error) {
+      const message = error.message === "canceled" ? "已取消" : error.message;
+
+      this.loading = false;
+      this.result = {
+        success: false,
+        message,
+      };
+    },
+    handleSuccess(responseData) {
+      this.loading = false;
+      this.result = {
+        success: true,
+        message: "导入成功!",
+      };
+      this.initData();
+      this.getInfo();
+    },
+    async toDelete() {
+      const confirm = await this.$confirm(`确定要取消上传吗?`, "提示", {
+        type: "warning",
+      }).catch(() => {});
+      if (confirm !== "confirm") return;
+
+      this.uploadController && this.uploadController.abort();
+      this.initData();
+    },
+  },
+};
+</script>

+ 10 - 25
yarn.lock

@@ -1921,13 +1921,12 @@ autoprefixer@^10.2.4:
     picocolors "^1.0.0"
     postcss-value-parser "^4.2.0"
 
-axios@^0.18.0:
-  version "0.18.1"
-  resolved "https://registry.npmmirror.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3"
-  integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==
+axios@^0.22.0:
+  version "0.22.0"
+  resolved "https://registry.npmmirror.com/axios/-/axios-0.22.0.tgz#bf702c41fb50fbca4539589d839a077117b79b25"
+  integrity sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==
   dependencies:
-    follow-redirects "1.5.10"
-    is-buffer "^2.0.2"
+    follow-redirects "^1.14.4"
 
 babel-helper-vue-jsx-merge-props@^2.0.0:
   version "2.0.3"
@@ -2627,13 +2626,6 @@ debug@2.6.9:
   dependencies:
     ms "2.0.0"
 
-debug@=3.1.0:
-  version "3.1.0"
-  resolved "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
-  integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
-  dependencies:
-    ms "2.0.0"
-
 debug@^3.2.7:
   version "3.2.7"
   resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
@@ -3297,18 +3289,16 @@ flatted@^3.1.0:
   resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
   integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
 
-follow-redirects@1.5.10:
-  version "1.5.10"
-  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
-  integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
-  dependencies:
-    debug "=3.1.0"
-
 follow-redirects@^1.0.0:
   version "1.15.2"
   resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
   integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
 
+follow-redirects@^1.14.4:
+  version "1.15.6"
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+  integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
 forwarded@0.2.0:
   version "0.2.0"
   resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -3731,11 +3721,6 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
-is-buffer@^2.0.2:
-  version "2.0.5"
-  resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
-  integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
-
 is-ci@^1.0.10:
   version "1.2.1"
   resolved "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"