From 1cb263efda55e67a8d5066edd7709b056f9b85ff Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期二, 07 九月 2021 18:46:59 +0800
Subject: [PATCH] code format

---
 src/views/401.vue                            |  438 +++++++-------
 src/api/package.js                           |   16 
 src/api/user.js                              |   28 
 src/api/project.js                           |   46 
 src/views/login/index.vue                    |  466 ++++++++--------
 src/views/project/components/ProjectEdit.vue |   61 +-
 src/views/project/index.vue                  |  226 ++++---
 src/views/index/index.vue                    |    4 
 src/App.vue                                  |    8 
 src/views/404.vue                            |  436 +++++++-------
 10 files changed, 895 insertions(+), 834 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index 94f824e..e2ad31f 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -5,8 +5,8 @@
 </template>
 
 <script>
-  export default {
-    name: 'App',
-    mounted() {},
-  }
+export default {
+  name: "App",
+  mounted() {},
+};
 </script>
diff --git a/src/api/package.js b/src/api/package.js
index c8334f6..4961f46 100644
--- a/src/api/package.js
+++ b/src/api/package.js
@@ -1,9 +1,17 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 
 export function publish(data) {
   return request({
-    url: '/package/' + data.id + '/publish',
-    method: 'post',
+    url: "/package/" + data.id + "/publish",
+    method: "post",
     data,
-  })
+  });
+}
+
+export function download(query) {
+  return request({
+    url: "/package/download",
+    method: "get",
+    params: query,
+  });
 }
diff --git a/src/api/project.js b/src/api/project.js
index c892e47..ee06075 100644
--- a/src/api/project.js
+++ b/src/api/project.js
@@ -1,51 +1,51 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 
 export function getList() {
   return request({
-    url: '/projects',
-    method: 'get',
-  })
+    url: "/projects",
+    method: "get",
+  });
 }
 
 export function doEdit(data) {
   if (!data.id) {
     return request({
-      url: '/projects',
-      method: 'post',
+      url: "/projects",
+      method: "post",
       data,
-    })
+    });
   }
 
-  delete data.updatedAt
-  delete data.createdAt
+  delete data.updatedAt;
+  delete data.createdAt;
 
   return request({
-    url: '/projects',
-    method: 'put',
+    url: "/projects",
+    method: "put",
     data,
-  })
+  });
 }
 
 export function deletePrj(id) {
   return request({
-    url: '/projects/' + id,
-    method: 'delete',
-  })
+    url: "/projects/" + id,
+    method: "delete",
+  });
 }
 
 export function getPkgList(id) {
   return request({
-    url: '/projects/' + id + '/packages',
-    method: 'get',
-  })
+    url: "/projects/" + id + "/packages",
+    method: "get",
+  });
 }
 
 export function buildPkg(data, version) {
-  delete data.updatedAt
-  delete data.createdAt
+  delete data.updatedAt;
+  delete data.createdAt;
   return request({
-    url: '/projects/build/' + version,
-    method: 'post',
+    url: "/projects/build/" + version,
+    method: "post",
     data,
-  })
+  });
 }
diff --git a/src/api/user.js b/src/api/user.js
index f661449..dce05f1 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -1,34 +1,34 @@
-import request from '@/utils/request'
-import { loginRSA, tokenName } from '@/config'
+import request from "@/utils/request";
+import { loginRSA, tokenName } from "@/config";
 
 export async function login(data) {
   return request({
-    url: '/user/login',
-    method: 'post',
+    url: "/user/login",
+    method: "post",
     data,
-  })
+  });
 }
 
 export function getUserInfo(accessToken) {
   return request({
-    url: '/user/info',
-    method: 'post',
+    url: "/user/info",
+    method: "post",
     data: {
       [tokenName]: accessToken,
     },
-  })
+  });
 }
 
 export function logout() {
   return request({
-    url: '/logout',
-    method: 'post',
-  })
+    url: "/logout",
+    method: "post",
+  });
 }
 
 export function register() {
   return request({
-    url: '/register',
-    method: 'post',
-  })
+    url: "/register",
+    method: "post",
+  });
 }
diff --git a/src/views/401.vue b/src/views/401.vue
index a47ecac..e2defb1 100644
--- a/src/views/401.vue
+++ b/src/views/401.vue
@@ -28,7 +28,7 @@
         </el-col>
 
         <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-          <div class="bullshit">            
+          <div class="bullshit">
             <div class="bullshit-oops">{{ oops }}</div>
             <div class="bullshit-headline">{{ headline }}</div>
             <div class="bullshit-info">{{ info }}</div>
@@ -43,254 +43,254 @@
 </template>
 
 <script>
-  export default {
-    name: 'Page401',
-    data() {
-      return {
-        jumpTime: 5,
-        oops: '鎶辨瓑!',
-        headline: '鎮ㄦ病鏈夋搷浣滄潈闄�...',
-        info: '褰撳墠甯愬彿娌℃湁鎿嶄綔鏉冮檺,璇疯仈绯荤鐞嗗憳銆�',
-        btn: '杩斿洖',
-        timer: 0,
-      }
+export default {
+  name: "Page401",
+  data() {
+    return {
+      jumpTime: 5,
+      oops: "鎶辨瓑!",
+      headline: "鎮ㄦ病鏈夋搷浣滄潈闄�...",
+      info: "褰撳墠甯愬彿娌℃湁鎿嶄綔鏉冮檺,璇疯仈绯荤鐞嗗憳銆�",
+      btn: "杩斿洖",
+      timer: 0,
+    };
+  },
+  mounted() {
+    this.timeChange();
+  },
+  beforeDestroy() {
+    clearInterval(this.timer);
+  },
+  methods: {
+    timeChange() {
+      this.timer = setInterval(() => {
+        if (this.jumpTime) {
+          this.jumpTime--;
+        } else {
+          this.$router.push({ path: "/" });
+          this.$store.dispatch("tabsBar/delOthersRoutes", {
+            path: "/",
+          });
+          clearInterval(this.timer);
+        }
+      }, 1000);
     },
-    mounted() {
-      this.timeChange()
-    },
-    beforeDestroy() {
-      clearInterval(this.timer)
-    },
-    methods: {
-      timeChange() {
-        this.timer = setInterval(() => {
-          if (this.jumpTime) {
-            this.jumpTime--
-          } else {
-            this.$router.push({ path: '/' })
-            this.$store.dispatch('tabsBar/delOthersRoutes', {
-              path: '/',
-            })
-            clearInterval(this.timer)
-          }
-        }, 1000)
-      },
-    },
-  }
+  },
+};
 </script>
 
 <style lang="scss" scoped>
-  .error-container {
-    position: absolute;
-    top: 40%;
-    left: 50%;
-    transform: translate(-50%, -50%);
+.error-container {
+  position: absolute;
+  top: 40%;
+  left: 50%;
+  transform: translate(-50%, -50%);
 
-    .error-content {
-      .pic-error {
-        position: relative;
-        float: left;
-        width: 120%;
-        overflow: hidden;
+  .error-content {
+    .pic-error {
+      position: relative;
+      float: left;
+      width: 120%;
+      overflow: hidden;
 
-        &-parent {
-          width: 100%;
-        }
-
-        &-child {
-          position: absolute;
-
-          &.left {
-            top: 17px;
-            left: 220px;
-            width: 80px;
-            opacity: 0;
-            animation-name: cloudLeft;
-            animation-duration: 2s;
-            animation-timing-function: linear;
-            animation-delay: 1s;
-            animation-fill-mode: forwards;
-          }
-
-          &.mid {
-            top: 10px;
-            left: 420px;
-            width: 46px;
-            opacity: 0;
-            animation-name: cloudMid;
-            animation-duration: 2s;
-            animation-timing-function: linear;
-            animation-delay: 1.2s;
-            animation-fill-mode: forwards;
-          }
-
-          &.right {
-            top: 100px;
-            left: 500px;
-            width: 62px;
-            opacity: 0;
-            animation-name: cloudRight;
-            animation-duration: 2s;
-            animation-timing-function: linear;
-            animation-delay: 1s;
-            animation-fill-mode: forwards;
-          }
-
-          @keyframes cloudLeft {
-            0% {
-              top: 17px;
-              left: 220px;
-              opacity: 0;
-            }
-
-            20% {
-              top: 33px;
-              left: 188px;
-              opacity: 1;
-            }
-
-            80% {
-              top: 81px;
-              left: 92px;
-              opacity: 1;
-            }
-
-            100% {
-              top: 97px;
-              left: 60px;
-              opacity: 0;
-            }
-          }
-
-          @keyframes cloudMid {
-            0% {
-              top: 10px;
-              left: 420px;
-              opacity: 0;
-            }
-
-            20% {
-              top: 40px;
-              left: 360px;
-              opacity: 1;
-            }
-
-            70% {
-              top: 130px;
-              left: 180px;
-              opacity: 1;
-            }
-
-            100% {
-              top: 160px;
-              left: 120px;
-              opacity: 0;
-            }
-          }
-
-          @keyframes cloudRight {
-            0% {
-              top: 100px;
-              left: 500px;
-              opacity: 0;
-            }
-
-            20% {
-              top: 120px;
-              left: 460px;
-              opacity: 1;
-            }
-
-            80% {
-              top: 180px;
-              left: 340px;
-              opacity: 1;
-            }
-
-            100% {
-              top: 200px;
-              left: 300px;
-              opacity: 0;
-            }
-          }
-        }
+      &-parent {
+        width: 100%;
       }
 
-      .bullshit {
-        position: relative;
-        float: left;
-        width: 300px;
-        padding: 30px 0;
-        overflow: hidden;
+      &-child {
+        position: absolute;
 
-        &-oops {
-          margin-bottom: 20px;
-          font-size: 32px;
-          font-weight: bold;
-          line-height: 40px;
-          color: $base-color-blue;
+        &.left {
+          top: 17px;
+          left: 220px;
+          width: 80px;
           opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
+          animation-name: cloudLeft;
+          animation-duration: 2s;
+          animation-timing-function: linear;
+          animation-delay: 1s;
           animation-fill-mode: forwards;
         }
 
-        &-headline {
-          margin-bottom: 10px;
-          font-size: 20px;
-          font-weight: bold;
-          line-height: 24px;
-          color: #222;
+        &.mid {
+          top: 10px;
+          left: 420px;
+          width: 46px;
           opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
-          animation-delay: 0.1s;
+          animation-name: cloudMid;
+          animation-duration: 2s;
+          animation-timing-function: linear;
+          animation-delay: 1.2s;
           animation-fill-mode: forwards;
         }
 
-        &-info {
-          margin-bottom: 30px;
-          font-size: 13px;
-          line-height: 21px;
-          color: $base-color-gray;
+        &.right {
+          top: 100px;
+          left: 500px;
+          width: 62px;
           opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
-          animation-delay: 0.2s;
+          animation-name: cloudRight;
+          animation-duration: 2s;
+          animation-timing-function: linear;
+          animation-delay: 1s;
           animation-fill-mode: forwards;
         }
 
-        &-return-home {
-          display: block;
-          float: left;
-          width: 110px;
-          height: 36px;
-          font-size: 14px;
-          line-height: 36px;
-          color: #fff;
-          text-align: center;
-          cursor: pointer;
-          background: $base-color-blue;
-          border-radius: 100px;
-          opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
-          animation-delay: 0.3s;
-          animation-fill-mode: forwards;
-        }
-
-        @keyframes slideUp {
+        @keyframes cloudLeft {
           0% {
+            top: 17px;
+            left: 220px;
             opacity: 0;
-            transform: translateY(60px);
+          }
+
+          20% {
+            top: 33px;
+            left: 188px;
+            opacity: 1;
+          }
+
+          80% {
+            top: 81px;
+            left: 92px;
+            opacity: 1;
           }
 
           100% {
+            top: 97px;
+            left: 60px;
+            opacity: 0;
+          }
+        }
+
+        @keyframes cloudMid {
+          0% {
+            top: 10px;
+            left: 420px;
+            opacity: 0;
+          }
+
+          20% {
+            top: 40px;
+            left: 360px;
             opacity: 1;
-            transform: translateY(0);
+          }
+
+          70% {
+            top: 130px;
+            left: 180px;
+            opacity: 1;
+          }
+
+          100% {
+            top: 160px;
+            left: 120px;
+            opacity: 0;
+          }
+        }
+
+        @keyframes cloudRight {
+          0% {
+            top: 100px;
+            left: 500px;
+            opacity: 0;
+          }
+
+          20% {
+            top: 120px;
+            left: 460px;
+            opacity: 1;
+          }
+
+          80% {
+            top: 180px;
+            left: 340px;
+            opacity: 1;
+          }
+
+          100% {
+            top: 200px;
+            left: 300px;
+            opacity: 0;
           }
         }
       }
     }
+
+    .bullshit {
+      position: relative;
+      float: left;
+      width: 300px;
+      padding: 30px 0;
+      overflow: hidden;
+
+      &-oops {
+        margin-bottom: 20px;
+        font-size: 32px;
+        font-weight: bold;
+        line-height: 40px;
+        color: $base-color-blue;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-fill-mode: forwards;
+      }
+
+      &-headline {
+        margin-bottom: 10px;
+        font-size: 20px;
+        font-weight: bold;
+        line-height: 24px;
+        color: #222;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-delay: 0.1s;
+        animation-fill-mode: forwards;
+      }
+
+      &-info {
+        margin-bottom: 30px;
+        font-size: 13px;
+        line-height: 21px;
+        color: $base-color-gray;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-delay: 0.2s;
+        animation-fill-mode: forwards;
+      }
+
+      &-return-home {
+        display: block;
+        float: left;
+        width: 110px;
+        height: 36px;
+        font-size: 14px;
+        line-height: 36px;
+        color: #fff;
+        text-align: center;
+        cursor: pointer;
+        background: $base-color-blue;
+        border-radius: 100px;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-delay: 0.3s;
+        animation-fill-mode: forwards;
+      }
+
+      @keyframes slideUp {
+        0% {
+          opacity: 0;
+          transform: translateY(60px);
+        }
+
+        100% {
+          opacity: 1;
+          transform: translateY(0);
+        }
+      }
+    }
   }
+}
 </style>
diff --git a/src/views/404.vue b/src/views/404.vue
index 9c261b6..500a7b4 100644
--- a/src/views/404.vue
+++ b/src/views/404.vue
@@ -43,254 +43,254 @@
 </template>
 
 <script>
-  export default {
-    name: 'Page404',
-    data() {
-      return {
-        jumpTime: 5,
-        oops: '鎶辨瓑!',
-        headline: '褰撳墠椤甸潰涓嶅瓨鍦�...',
-        info: '璇锋鏌ユ偍杈撳叆鐨勭綉鍧�鏄惁姝g‘锛屾垨鐐瑰嚮涓嬮潰鐨勬寜閽繑鍥為椤点��',
-        btn: '杩斿洖棣栭〉',
-        timer: 0,
-      }
+export default {
+  name: "Page404",
+  data() {
+    return {
+      jumpTime: 5,
+      oops: "鎶辨瓑!",
+      headline: "褰撳墠椤甸潰涓嶅瓨鍦�...",
+      info: "璇锋鏌ユ偍杈撳叆鐨勭綉鍧�鏄惁姝g‘锛屾垨鐐瑰嚮涓嬮潰鐨勬寜閽繑鍥為椤点��",
+      btn: "杩斿洖棣栭〉",
+      timer: 0,
+    };
+  },
+  mounted() {
+    this.timeChange();
+  },
+  beforeDestroy() {
+    clearInterval(this.timer);
+  },
+  methods: {
+    timeChange() {
+      this.timer = setInterval(() => {
+        if (this.jumpTime) {
+          this.jumpTime--;
+        } else {
+          this.$router.push({ path: "/" });
+          this.$store.dispatch("tabsBar/delOthersRoutes", {
+            path: "/",
+          });
+          clearInterval(this.timer);
+        }
+      }, 1000);
     },
-    mounted() {
-      this.timeChange()
-    },
-    beforeDestroy() {
-      clearInterval(this.timer)
-    },
-    methods: {
-      timeChange() {
-        this.timer = setInterval(() => {
-          if (this.jumpTime) {
-            this.jumpTime--
-          } else {
-            this.$router.push({ path: '/' })
-            this.$store.dispatch('tabsBar/delOthersRoutes', {
-              path: '/',
-            })
-            clearInterval(this.timer)
-          }
-        }, 1000)
-      },
-    },
-  }
+  },
+};
 </script>
 
 <style lang="scss" scoped>
-  .error-container {
-    position: absolute;
-    top: 40%;
-    left: 50%;
-    transform: translate(-50%, -50%);
+.error-container {
+  position: absolute;
+  top: 40%;
+  left: 50%;
+  transform: translate(-50%, -50%);
 
-    .error-content {
-      .pic-error {
-        position: relative;
-        float: left;
-        width: 120%;
-        overflow: hidden;
+  .error-content {
+    .pic-error {
+      position: relative;
+      float: left;
+      width: 120%;
+      overflow: hidden;
 
-        &-parent {
-          width: 100%;
-        }
-
-        &-child {
-          position: absolute;
-
-          &.left {
-            top: 17px;
-            left: 220px;
-            width: 80px;
-            opacity: 0;
-            animation-name: cloudLeft;
-            animation-duration: 2s;
-            animation-timing-function: linear;
-            animation-delay: 1s;
-            animation-fill-mode: forwards;
-          }
-
-          &.mid {
-            top: 10px;
-            left: 420px;
-            width: 46px;
-            opacity: 0;
-            animation-name: cloudMid;
-            animation-duration: 2s;
-            animation-timing-function: linear;
-            animation-delay: 1.2s;
-            animation-fill-mode: forwards;
-          }
-
-          &.right {
-            top: 100px;
-            left: 500px;
-            width: 62px;
-            opacity: 0;
-            animation-name: cloudRight;
-            animation-duration: 2s;
-            animation-timing-function: linear;
-            animation-delay: 1s;
-            animation-fill-mode: forwards;
-          }
-
-          @keyframes cloudLeft {
-            0% {
-              top: 17px;
-              left: 220px;
-              opacity: 0;
-            }
-
-            20% {
-              top: 33px;
-              left: 188px;
-              opacity: 1;
-            }
-
-            80% {
-              top: 81px;
-              left: 92px;
-              opacity: 1;
-            }
-
-            100% {
-              top: 97px;
-              left: 60px;
-              opacity: 0;
-            }
-          }
-
-          @keyframes cloudMid {
-            0% {
-              top: 10px;
-              left: 420px;
-              opacity: 0;
-            }
-
-            20% {
-              top: 40px;
-              left: 360px;
-              opacity: 1;
-            }
-
-            70% {
-              top: 130px;
-              left: 180px;
-              opacity: 1;
-            }
-
-            100% {
-              top: 160px;
-              left: 120px;
-              opacity: 0;
-            }
-          }
-
-          @keyframes cloudRight {
-            0% {
-              top: 100px;
-              left: 500px;
-              opacity: 0;
-            }
-
-            20% {
-              top: 120px;
-              left: 460px;
-              opacity: 1;
-            }
-
-            80% {
-              top: 180px;
-              left: 340px;
-              opacity: 1;
-            }
-
-            100% {
-              top: 200px;
-              left: 300px;
-              opacity: 0;
-            }
-          }
-        }
+      &-parent {
+        width: 100%;
       }
 
-      .bullshit {
-        position: relative;
-        float: left;
-        width: 300px;
-        padding: 30px 0;
-        overflow: hidden;
+      &-child {
+        position: absolute;
 
-        &-oops {
-          margin-bottom: 20px;
-          font-size: 32px;
-          font-weight: bold;
-          line-height: 40px;
-          color: $base-color-blue;
+        &.left {
+          top: 17px;
+          left: 220px;
+          width: 80px;
           opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
+          animation-name: cloudLeft;
+          animation-duration: 2s;
+          animation-timing-function: linear;
+          animation-delay: 1s;
           animation-fill-mode: forwards;
         }
 
-        &-headline {
-          margin-bottom: 10px;
-          font-size: 20px;
-          font-weight: bold;
-          line-height: 24px;
-          color: #222;
+        &.mid {
+          top: 10px;
+          left: 420px;
+          width: 46px;
           opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
-          animation-delay: 0.1s;
+          animation-name: cloudMid;
+          animation-duration: 2s;
+          animation-timing-function: linear;
+          animation-delay: 1.2s;
           animation-fill-mode: forwards;
         }
 
-        &-info {
-          margin-bottom: 30px;
-          font-size: 13px;
-          line-height: 21px;
-          color: $base-color-gray;
+        &.right {
+          top: 100px;
+          left: 500px;
+          width: 62px;
           opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
-          animation-delay: 0.2s;
+          animation-name: cloudRight;
+          animation-duration: 2s;
+          animation-timing-function: linear;
+          animation-delay: 1s;
           animation-fill-mode: forwards;
         }
 
-        &-return-home {
-          display: block;
-          float: left;
-          width: 110px;
-          height: 36px;
-          font-size: 14px;
-          line-height: 36px;
-          color: #fff;
-          text-align: center;
-          cursor: pointer;
-          background: $base-color-blue;
-          border-radius: 100px;
-          opacity: 0;
-          animation-name: slideUp;
-          animation-duration: 0.5s;
-          animation-delay: 0.3s;
-          animation-fill-mode: forwards;
-        }
-
-        @keyframes slideUp {
+        @keyframes cloudLeft {
           0% {
+            top: 17px;
+            left: 220px;
             opacity: 0;
-            transform: translateY(60px);
+          }
+
+          20% {
+            top: 33px;
+            left: 188px;
+            opacity: 1;
+          }
+
+          80% {
+            top: 81px;
+            left: 92px;
+            opacity: 1;
           }
 
           100% {
+            top: 97px;
+            left: 60px;
+            opacity: 0;
+          }
+        }
+
+        @keyframes cloudMid {
+          0% {
+            top: 10px;
+            left: 420px;
+            opacity: 0;
+          }
+
+          20% {
+            top: 40px;
+            left: 360px;
             opacity: 1;
-            transform: translateY(0);
+          }
+
+          70% {
+            top: 130px;
+            left: 180px;
+            opacity: 1;
+          }
+
+          100% {
+            top: 160px;
+            left: 120px;
+            opacity: 0;
+          }
+        }
+
+        @keyframes cloudRight {
+          0% {
+            top: 100px;
+            left: 500px;
+            opacity: 0;
+          }
+
+          20% {
+            top: 120px;
+            left: 460px;
+            opacity: 1;
+          }
+
+          80% {
+            top: 180px;
+            left: 340px;
+            opacity: 1;
+          }
+
+          100% {
+            top: 200px;
+            left: 300px;
+            opacity: 0;
           }
         }
       }
     }
+
+    .bullshit {
+      position: relative;
+      float: left;
+      width: 300px;
+      padding: 30px 0;
+      overflow: hidden;
+
+      &-oops {
+        margin-bottom: 20px;
+        font-size: 32px;
+        font-weight: bold;
+        line-height: 40px;
+        color: $base-color-blue;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-fill-mode: forwards;
+      }
+
+      &-headline {
+        margin-bottom: 10px;
+        font-size: 20px;
+        font-weight: bold;
+        line-height: 24px;
+        color: #222;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-delay: 0.1s;
+        animation-fill-mode: forwards;
+      }
+
+      &-info {
+        margin-bottom: 30px;
+        font-size: 13px;
+        line-height: 21px;
+        color: $base-color-gray;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-delay: 0.2s;
+        animation-fill-mode: forwards;
+      }
+
+      &-return-home {
+        display: block;
+        float: left;
+        width: 110px;
+        height: 36px;
+        font-size: 14px;
+        line-height: 36px;
+        color: #fff;
+        text-align: center;
+        cursor: pointer;
+        background: $base-color-blue;
+        border-radius: 100px;
+        opacity: 0;
+        animation-name: slideUp;
+        animation-duration: 0.5s;
+        animation-delay: 0.3s;
+        animation-fill-mode: forwards;
+      }
+
+      @keyframes slideUp {
+        0% {
+          opacity: 0;
+          transform: translateY(60px);
+        }
+
+        100% {
+          opacity: 1;
+          transform: translateY(0);
+        }
+      }
+    }
   }
+}
 </style>
diff --git a/src/views/index/index.vue b/src/views/index/index.vue
index 755824f..6771c50 100644
--- a/src/views/index/index.vue
+++ b/src/views/index/index.vue
@@ -4,8 +4,8 @@
 
 <script>
 export default {
-  name: '',
-}
+  name: "",
+};
 </script>
 
 <style></style>
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index dd99764..33680f1 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -74,254 +74,254 @@
 </template>
 
 <script>
-  import { isPassword } from '@/utils/validate'
+import { isPassword } from "@/utils/validate";
 
-  export default {
-    name: 'Login',
-    directives: {
-      focus: {
-        inserted(el) {
-          el.querySelector('input').focus()
-        },
+export default {
+  name: "Login",
+  directives: {
+    focus: {
+      inserted(el) {
+        el.querySelector("input").focus();
       },
     },
-    data() {
-      const validateusername = (rule, value, callback) => {
-        if ('' == value) {
-          callback(new Error('鐢ㄦ埛鍚嶄笉鑳戒负绌�'))
+  },
+  data() {
+    const validateusername = (rule, value, callback) => {
+      if ("" == value) {
+        callback(new Error("鐢ㄦ埛鍚嶄笉鑳戒负绌�"));
+      } else {
+        callback();
+      }
+    };
+    const validatePassword = (rule, value, callback) => {
+      if (!isPassword(value)) {
+        callback(new Error("瀵嗙爜涓嶈兘灏戜簬6浣�"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      nodeEnv: process.env.NODE_ENV,
+      title: this.$baseTitle,
+      form: {
+        username: "",
+        password: "",
+      },
+      rules: {
+        username: [
+          {
+            required: true,
+            trigger: "blur",
+            validator: validateusername,
+          },
+        ],
+        password: [
+          {
+            required: true,
+            trigger: "blur",
+            validator: validatePassword,
+          },
+        ],
+      },
+      loading: false,
+      passwordType: "password",
+      redirect: undefined,
+    };
+  },
+  watch: {
+    $route: {
+      handler(route) {
+        this.redirect = (route.query && route.query.redirect) || "/";
+      },
+      immediate: true,
+    },
+  },
+  created() {
+    document.body.style.overflow = "hidden";
+  },
+  beforeDestroy() {
+    document.body.style.overflow = "auto";
+  },
+  mounted() {
+    this.form.username = "admin";
+    this.form.password = "123456";
+    setTimeout(() => {
+      this.handleLogin();
+    }, 3000);
+  },
+  methods: {
+    handlePassword() {
+      this.passwordType === "password"
+        ? (this.passwordType = "")
+        : (this.passwordType = "password");
+      this.$nextTick(() => {
+        this.$refs.password.focus();
+      });
+    },
+    handleLogin() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.loading = true;
+          this.$store
+            .dispatch("user/login", this.form)
+            .then(() => {
+              const routerPath =
+                this.redirect === "/404" || this.redirect === "/401"
+                  ? "/"
+                  : this.redirect;
+              this.$router.push(routerPath).catch(() => {});
+              this.loading = false;
+            })
+            .catch(() => {
+              this.loading = false;
+            });
         } else {
-          callback()
+          return false;
         }
-      }
-      const validatePassword = (rule, value, callback) => {
-        if (!isPassword(value)) {
-          callback(new Error('瀵嗙爜涓嶈兘灏戜簬6浣�'))
-        } else {
-          callback()
-        }
-      }
-      return {
-        nodeEnv: process.env.NODE_ENV,
-        title: this.$baseTitle,
-        form: {
-          username: '',
-          password: '',
-        },
-        rules: {
-          username: [
-            {
-              required: true,
-              trigger: 'blur',
-              validator: validateusername,
-            },
-          ],
-          password: [
-            {
-              required: true,
-              trigger: 'blur',
-              validator: validatePassword,
-            },
-          ],
-        },
-        loading: false,
-        passwordType: 'password',
-        redirect: undefined,
-      }
+      });
     },
-    watch: {
-      $route: {
-        handler(route) {
-          this.redirect = (route.query && route.query.redirect) || '/'
-        },
-        immediate: true,
-      },
-    },
-    created() {
-      document.body.style.overflow = 'hidden'
-    },
-    beforeDestroy() {
-      document.body.style.overflow = 'auto'
-    },
-    mounted() {
-      this.form.username = 'admin'
-      this.form.password = '123456'
-      setTimeout(() => {
-        this.handleLogin()
-      }, 3000)
-    },
-    methods: {
-      handlePassword() {
-        this.passwordType === 'password'
-          ? (this.passwordType = '')
-          : (this.passwordType = 'password')
-        this.$nextTick(() => {
-          this.$refs.password.focus()
-        })
-      },
-      handleLogin() {
-        this.$refs.form.validate((valid) => {
-          if (valid) {
-            this.loading = true
-            this.$store
-              .dispatch('user/login', this.form)
-              .then(() => {
-                const routerPath =
-                  this.redirect === '/404' || this.redirect === '/401'
-                    ? '/'
-                    : this.redirect
-                this.$router.push(routerPath).catch(() => {})
-                this.loading = false
-              })
-              .catch(() => {
-                this.loading = false
-              })
-          } else {
-            return false
-          }
-        })
-      },
-    },
-  }
+  },
+};
 </script>
 
 <style lang="scss" scoped>
-  .login-container {
-    height: 100vh;
-    background: url('~@/assets/login_images/background.jpg') center center fixed
-      no-repeat;
-    background-size: cover;
+.login-container {
+  height: 100vh;
+  background: url("~@/assets/login_images/background.jpg") center center fixed
+    no-repeat;
+  background-size: cover;
 
-    .title {
-      font-size: 54px;
-      font-weight: 500;
-      color: rgba(14, 18, 26, 1);
+  .title {
+    font-size: 54px;
+    font-weight: 500;
+    color: rgba(14, 18, 26, 1);
+  }
+
+  .title-tips {
+    margin-top: 29px;
+    font-size: 26px;
+    font-weight: 400;
+    color: rgba(14, 18, 26, 1);
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .login-btn {
+    display: inherit;
+    width: 220px;
+    height: 60px;
+    margin-top: 5px;
+    border: 0;
+
+    &:hover {
+      opacity: 0.9;
     }
+  }
 
-    .title-tips {
-      margin-top: 29px;
-      font-size: 26px;
-      font-weight: 400;
-      color: rgba(14, 18, 26, 1);
-      text-overflow: ellipsis;
-      white-space: nowrap;
-    }
+  .login-form {
+    position: relative;
+    max-width: 100%;
+    margin: calc((100vh - 425px) / 2) 10% 10%;
+    overflow: hidden;
 
-    .login-btn {
-      display: inherit;
-      width: 220px;
-      height: 60px;
-      margin-top: 5px;
-      border: 0;
+    .forget-password {
+      width: 100%;
+      margin-top: 40px;
+      text-align: left;
 
-      &:hover {
-        opacity: 0.9;
-      }
-    }
-
-    .login-form {
-      position: relative;
-      max-width: 100%;
-      margin: calc((100vh - 425px) / 2) 10% 10%;
-      overflow: hidden;
-
-      .forget-password {
-        width: 100%;
-        margin-top: 40px;
-        text-align: left;
-
-        .forget-pass {
-          width: 129px;
-          height: 19px;
-          font-size: 20px;
-          font-weight: 400;
-          color: rgba(92, 102, 240, 1);
-        }
-      }
-    }
-
-    .tips {
-      margin-bottom: 10px;
-      font-size: $base-font-size-default;
-      color: $base-color-white;
-
-      span {
-        &:first-of-type {
-          margin-right: 16px;
-        }
-      }
-    }
-
-    .title-container {
-      position: relative;
-
-      .title {
-        margin: 0 auto 40px auto;
-        font-size: 34px;
-        font-weight: bold;
-        color: $base-color-blue;
-        text-align: center;
-      }
-    }
-
-    .svg-container {
-      position: absolute;
-      top: 14px;
-      left: 15px;
-      z-index: $base-z-index;
-      font-size: 16px;
-      color: #d7dee3;
-      cursor: pointer;
-      user-select: none;
-    }
-
-    .show-password {
-      position: absolute;
-      top: 14px;
-      right: 25px;
-      font-size: 16px;
-      color: #d7dee3;
-      cursor: pointer;
-      user-select: none;
-    }
-
-    ::v-deep {
-      .el-form-item {
-        padding-right: 0;
-        margin: 20px 0;
-        color: #454545;
-        background: transparent;
-        border: 1px solid transparent;
-        border-radius: 2px;
-
-        &__content {
-          min-height: $base-input-height;
-          line-height: $base-input-height;
-        }
-
-        &__error {
-          position: absolute;
-          top: 100%;
-          left: 18px;
-          font-size: $base-font-size-small;
-          line-height: 18px;
-          color: $base-color-red;
-        }
-      }
-
-      .el-input {
-        box-sizing: border-box;
-
-        input {
-          height: 58px;
-          padding-left: 45px;
-          font-size: $base-font-size-default;
-          line-height: 58px;
-          color: $base-font-color;
-          background: #f6f4fc;
-          border: 0;
-          caret-color: $base-font-color;
-        }
+      .forget-pass {
+        width: 129px;
+        height: 19px;
+        font-size: 20px;
+        font-weight: 400;
+        color: rgba(92, 102, 240, 1);
       }
     }
   }
+
+  .tips {
+    margin-bottom: 10px;
+    font-size: $base-font-size-default;
+    color: $base-color-white;
+
+    span {
+      &:first-of-type {
+        margin-right: 16px;
+      }
+    }
+  }
+
+  .title-container {
+    position: relative;
+
+    .title {
+      margin: 0 auto 40px auto;
+      font-size: 34px;
+      font-weight: bold;
+      color: $base-color-blue;
+      text-align: center;
+    }
+  }
+
+  .svg-container {
+    position: absolute;
+    top: 14px;
+    left: 15px;
+    z-index: $base-z-index;
+    font-size: 16px;
+    color: #d7dee3;
+    cursor: pointer;
+    user-select: none;
+  }
+
+  .show-password {
+    position: absolute;
+    top: 14px;
+    right: 25px;
+    font-size: 16px;
+    color: #d7dee3;
+    cursor: pointer;
+    user-select: none;
+  }
+
+  ::v-deep {
+    .el-form-item {
+      padding-right: 0;
+      margin: 20px 0;
+      color: #454545;
+      background: transparent;
+      border: 1px solid transparent;
+      border-radius: 2px;
+
+      &__content {
+        min-height: $base-input-height;
+        line-height: $base-input-height;
+      }
+
+      &__error {
+        position: absolute;
+        top: 100%;
+        left: 18px;
+        font-size: $base-font-size-small;
+        line-height: 18px;
+        color: $base-color-red;
+      }
+    }
+
+    .el-input {
+      box-sizing: border-box;
+
+      input {
+        height: 58px;
+        padding-left: 45px;
+        font-size: $base-font-size-default;
+        line-height: 58px;
+        color: $base-font-color;
+        background: #f6f4fc;
+        border: 0;
+        caret-color: $base-font-color;
+      }
+    }
+  }
+}
 </style>
diff --git a/src/views/project/components/ProjectEdit.vue b/src/views/project/components/ProjectEdit.vue
index d2740b4..92a7ace 100644
--- a/src/views/project/components/ProjectEdit.vue
+++ b/src/views/project/components/ProjectEdit.vue
@@ -19,7 +19,10 @@
             <el-input v-model.trim="form.srcUser" autocomplete="off"></el-input>
           </el-form-item>
           <el-form-item label="椤圭洰瀵嗙爜" prop="srcPassword">
-            <el-input v-model.trim="form.srcPassword" autocomplete="off"></el-input>
+            <el-input
+              v-model.trim="form.srcPassword"
+              autocomplete="off"
+            ></el-input>
           </el-form-item>
           <el-form-item label="椤圭洰鎻忚堪" prop="desc">
             <el-input v-model.trim="form.desc" autocomplete="off"></el-input>
@@ -61,59 +64,59 @@
 </template>
 
 <script>
-import { doEdit } from '@/api/project'
+import { doEdit } from "@/api/project";
 
 export default {
-  name: 'ProjectEdit',
+  name: "ProjectEdit",
   data() {
     return {
-      activeName: 'base',
+      activeName: "base",
       form: {
-        title: '',
-        author: '',
+        title: "",
+        author: "",
       },
       rules: {
-        title: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ユ爣棰�' }],
-        author: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ヤ綔鑰�' }],
+        title: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ爣棰�" }],
+        author: [{ required: true, trigger: "blur", message: "璇疯緭鍏ヤ綔鑰�" }],
       },
-      title: '',
+      title: "",
       dialogFormVisible: false,
-    }
+    };
   },
-  created() { },
+  created() {},
   methods: {
     showEdit(row) {
       if (!row) {
-        this.title = '娣诲姞'
+        this.title = "娣诲姞";
       } else {
-        this.title = '缂栬緫'
-        this.form = Object.assign({}, row)
+        this.title = "缂栬緫";
+        this.form = Object.assign({}, row);
       }
-      this.dialogFormVisible = true
+      this.dialogFormVisible = true;
     },
     close() {
-      this.$refs['form'].resetFields()
-      this.form = this.$options.data().form
-      this.dialogFormVisible = false
-      this.$emit('fetch-data')
+      this.$refs["form"].resetFields();
+      this.form = this.$options.data().form;
+      this.dialogFormVisible = false;
+      this.$emit("fetch-data");
     },
     save() {
-      this.$refs['form'].validate(async (valid) => {
+      this.$refs["form"].validate(async (valid) => {
         if (valid) {
-          const { msg } = await doEdit(this.form)
-          this.$baseMessage(msg, 'success')
-          this.$refs['form'].resetFields()
-          this.dialogFormVisible = false
-          this.$emit('fetch-data')
-          this.form = this.$options.data().form
+          const { msg } = await doEdit(this.form);
+          this.$baseMessage(msg, "success");
+          this.$refs["form"].resetFields();
+          this.dialogFormVisible = false;
+          this.$emit("fetch-data");
+          this.form = this.$options.data().form;
         } else {
-          return false
+          return false;
         }
-      })
+      });
     },
     handleClick(tab, event) {
       // console.log(tab, event)
     },
   },
-}
+};
 </script>
diff --git a/src/views/project/index.vue b/src/views/project/index.vue
index 8df14be..6c2c5d8 100644
--- a/src/views/project/index.vue
+++ b/src/views/project/index.vue
@@ -2,7 +2,12 @@
   <div class="table-container">
     <vab-query-form>
       <vab-query-form-left-panel>
-        <el-form ref="form" :model="queryForm" :inline="true" @submit.native.prevent>
+        <el-form
+          ref="form"
+          :model="queryForm"
+          :inline="true"
+          @submit.native.prevent
+        >
           <el-form-item>
             <el-input v-model="queryForm.title" placeholder="鍚嶇О" />
           </el-form-item>
@@ -24,14 +29,18 @@
               type="primary"
               native-type="submit"
               @click="handleQuery"
-            >鏌ヨ</el-button>
+              >鏌ヨ</el-button
+            >
           </el-form-item>
         </el-form>
       </vab-query-form-left-panel>
       <vab-query-form-right-panel>
         <el-button icon="el-icon-plus" type="primary" @click="handleAdd">
-          娣诲姞</el-button>
-        <el-button icon="el-icon-delete" type="danger" @click="handleDelete">鍒犻櫎</el-button>
+          娣诲姞</el-button
+        >
+        <el-button icon="el-icon-delete" type="danger" @click="handleDelete"
+          >鍒犻櫎</el-button
+        >
       </vab-query-form-right-panel>
     </vab-query-form>
 
@@ -47,7 +56,11 @@
     >
       <el-table-column type="expand">
         <template slot-scope="props">
-          <el-table :data="props.row.pkgList" :show-header="false" style="width: 100%">
+          <el-table
+            :data="props.row.pkgList"
+            :show-header="false"
+            style="width: 100%"
+          >
             <el-table-column prop="fileName"></el-table-column>
             <el-table-column prop="version" width="150"></el-table-column>
             <el-table-column prop="commit" width="150"></el-table-column>
@@ -58,9 +71,14 @@
                 <el-tag>{{ packageState[row.state] }}</el-tag>
               </template>
             </el-table-column>
-            <el-table-column width="120">
+            <el-table-column width="200">
               <template #default="scope">
-                <el-button size="small" @click="handlePublish(scope.row)">鍙戝竷</el-button>
+                <el-button size="small" @click="handlePublish(scope.row)"
+                  >鍙戝竷</el-button
+                >
+                <el-button size="small" @click="handleDownload(scope.row)"
+                  >涓嬭浇</el-button
+                >
               </template>
             </el-table-column>
           </el-table>
@@ -70,8 +88,16 @@
       <el-table-column show-overflow-tooltip label="搴忓彿" width="95">
         <template #default="scope">{{ scope.$index + 1 }}</template>
       </el-table-column>
-      <el-table-column show-overflow-tooltip prop="name" label="椤圭洰鍚嶇О"></el-table-column>
-      <el-table-column show-overflow-tooltip prop="srcUrl" label="椤圭洰鍦板潃"></el-table-column>
+      <el-table-column
+        show-overflow-tooltip
+        prop="name"
+        label="椤圭洰鍚嶇О"
+      ></el-table-column>
+      <el-table-column
+        show-overflow-tooltip
+        prop="srcUrl"
+        label="椤圭洰鍦板潃"
+      ></el-table-column>
       <el-table-column show-overflow-tooltip prop="type" label="绫诲瀷">
         <template #default="{ row }">
           <el-tag>{{ row.type | typeFilter }}</el-tag>
@@ -83,12 +109,26 @@
           <el-tag>{{ row.state | stateFilter }}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="鍒涘缓鏃堕棿" prop="createdAt" width="200"></el-table-column>
+      <el-table-column
+        label="鍒涘缓鏃堕棿"
+        prop="createdAt"
+        width="200"
+      ></el-table-column>
       <el-table-column label="鎿嶄綔" width="180px">
         <template #default="{ row }">
           <el-button type="text" @click="handleEdit(row)">缂栬緫</el-button>
-          <el-button type="text" style="color: red" @click="handleDeleteRow(row)">鍒犻櫎</el-button>
-          <el-button type="text" style="color: deepskyblue" @click="handlePack(row)">鎵撳寘</el-button>
+          <el-button
+            type="text"
+            style="color: red"
+            @click="handleDeleteRow(row)"
+            >鍒犻櫎</el-button
+          >
+          <el-button
+            type="text"
+            style="color: deepskyblue"
+            @click="handlePack(row)"
+            >鎵撳寘</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
@@ -106,28 +146,28 @@
 </template>
 
 <script>
-import { getList, deletePrj, getPkgList, buildPkg } from '@/api/project'
-import { publish } from '@/api/package'
+import { getList, deletePrj, getPkgList, buildPkg } from "@/api/project";
+import { publish, download } from "@/api/package";
 
-import TableEdit from './components/ProjectEdit.vue'
+import TableEdit from "./components/ProjectEdit.vue";
 export default {
-  name: 'ComprehensiveTable',
+  name: "ComprehensiveTable",
   components: {
     TableEdit,
   },
   filters: {
     stateFilter(state) {
-      const stateMap = ['涓嬭浇涓�', '鍚屾瀹屾垚', '鍚屾澶辫触']
+      const stateMap = ["涓嬭浇涓�", "鍚屾瀹屾垚", "鍚屾澶辫触"];
 
-      return stateMap[state]
+      return stateMap[state];
     },
     typeFilter(type) {
       const typeMap = {
-        sys: '绯荤粺鍖�',
-        app: '搴旂敤鍖�',
-        algo: '绠楁硶鍖�',
-      }
-      return typeMap[type]
+        sys: "绯荤粺鍖�",
+        app: "搴旂敤鍖�",
+        algo: "绠楁硶鍖�",
+      };
+      return typeMap[type];
     },
   },
   data() {
@@ -135,137 +175,147 @@
       imgShow: true,
       list: [],
       listLoading: true,
-      layout: 'total, sizes, prev, pager, next, jumper',
+      layout: "total, sizes, prev, pager, next, jumper",
       packageState: [
-        '瀹屾垚',
-        '宸叉彁浜�',
-        '鎺掗槦涓�',
-        '鎵撳寘涓�',
-        '缂栬瘧澶辫触',
-        '鎵撳寘澶辫触',
+        "瀹屾垚",
+        "宸叉彁浜�",
+        "鎺掗槦涓�",
+        "鎵撳寘涓�",
+        "缂栬瘧澶辫触",
+        "鎵撳寘澶辫触",
       ],
       total: 0,
       background: true,
-      selectRows: '',
-      elementLoadingText: '姝e湪鍔犺浇...',
+      selectRows: "",
+      elementLoadingText: "姝e湪鍔犺浇...",
       queryForm: {
         pageNo: 1,
         pageSize: 20,
-        title: '',
+        title: "",
       },
-    }
+    };
   },
   computed: {
     height() {
-      return this.$baseTableHeight()
+      return this.$baseTableHeight();
     },
   },
   created() {
-    this.fetchData()
+    this.fetchData();
   },
-  beforeDestroy() { },
-  mounted() { },
+  beforeDestroy() {},
+  mounted() {},
   methods: {
     setSelectRows(val) {
-      this.selectRows = val
+      this.selectRows = val;
     },
     handleAdd() {
-      this.$refs['edit'].showEdit()
+      this.$refs["edit"].showEdit();
     },
     handleEdit(row) {
-      this.$refs['edit'].showEdit(row)
+      this.$refs["edit"].showEdit(row);
     },
     handleDelete(row) {
       if (this.selectRows.length > 0) {
-        const ids = this.selectRows.map((item) => item.id).join()
-        this.$baseConfirm('浣犵‘瀹氳鍒犻櫎閫変腑椤瑰悧', null, async () => {
-          const { msg } = await doDelete({ ids: ids })
-          this.$baseMessage(msg, 'success')
-          this.fetchData()
-        })
+        const ids = this.selectRows.map((item) => item.id).join();
+        this.$baseConfirm("浣犵‘瀹氳鍒犻櫎閫変腑椤瑰悧", null, async () => {
+          const { msg } = await doDelete({ ids: ids });
+          this.$baseMessage(msg, "success");
+          this.fetchData();
+        });
       } else {
-        this.$baseMessage('鏈�変腑浠讳綍琛�', 'error')
-        return false
+        this.$baseMessage("鏈�変腑浠讳綍琛�", "error");
+        return false;
       }
     },
     handleDeleteRow(row) {
       if (row.id) {
-        this.$baseConfirm('浣犵‘瀹氳鍒犻櫎褰撳墠椤瑰悧', null, async () => {
-          const { msg } = await deletePrj(row.id)
-          this.$baseMessage(msg, 'success')
-          this.fetchData()
-        })
+        this.$baseConfirm("浣犵‘瀹氳鍒犻櫎褰撳墠椤瑰悧", null, async () => {
+          const { msg } = await deletePrj(row.id);
+          this.$baseMessage(msg, "success");
+          this.fetchData();
+        });
       }
     },
     handleSizeChange(val) {
-      this.queryForm.pageSize = val
-      this.fetchData()
+      this.queryForm.pageSize = val;
+      this.fetchData();
     },
     handleCurrentChange(val) {
-      this.queryForm.pageNo = val
-      this.fetchData()
+      this.queryForm.pageNo = val;
+      this.fetchData();
     },
     handleQuery() {
-      this.queryForm.pageNo = 1
-      this.fetchData()
+      this.queryForm.pageNo = 1;
+      this.fetchData();
     },
     async fetchData() {
-      this.listLoading = true
-      const { data, total } = await getList(this.queryForm)
+      this.listLoading = true;
+      const { data, total } = await getList(this.queryForm);
 
       if (data) {
         data.forEach((item) => {
-          item.pkgList = []
-        })
+          item.pkgList = [];
+        });
 
-        this.list = data
+        this.list = data;
       }
 
-      this.total = total
+      this.total = total;
       setTimeout(() => {
-        this.listLoading = false
-      }, 500)
+        this.listLoading = false;
+      }, 500);
     },
 
     async expandChange(row, expandRows) {
-      console.log(row)
+      console.log(row);
       if (expandRows.length == 0) {
-        console.log('fold')
-        return
+        console.log("fold");
+        return;
       }
 
-      const { data, total } = await getPkgList(row.id)
+      const { data, total } = await getPkgList(row.id);
       this.list.forEach((item, idx) => {
         if (item.id === row.id) {
-          this.list[idx].pkgList = data
+          this.list[idx].pkgList = data;
         }
-      })
+      });
     },
     handlePack(row) {
-      this.$prompt('璇疯緭鍏ョ増鏈彿', '鎻愮ず', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
+      this.$prompt("璇疯緭鍏ョ増鏈彿", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
         inputPattern: /[\d+][\.\d+]*/,
-        inputErrorMessage: '鐗堟湰鍙锋牸寮忎笉姝g‘,渚� 1.0.0, 10.1.100',
+        inputErrorMessage: "鐗堟湰鍙锋牸寮忎笉姝g‘,渚� 1.0.0, 10.1.100",
       })
         .then(({ value }) => {
           buildPkg(row, value).then((rsp) => {
-            console.log(rsp)
-            this.expandChange(row, 1)
-          })
+            console.log(rsp);
+            this.expandChange(row, 1);
+          });
         })
         .catch(() => {
           this.$message({
-            type: 'info',
-            message: '鍙栨秷杈撳叆',
-          })
-        })
+            type: "info",
+            message: "鍙栨秷杈撳叆",
+          });
+        });
     },
     handlePublish(row) {
       publish(row).then((rsp) => {
-        console.log(rsp)
-      })
+        if (rsp && rsp.success) {
+          this.$baseMessage(rsp.msg, "success");
+        }
+      });
+    },
+    handleDownload(row) {
+      download({ path: row.filePath }).then((rsp) => {
+        if (rsp && rsp.success) {
+          console.log(rsp);
+          window.location = rsp.data;
+        }
+      });
     },
   },
-}
+};
 </script>

--
Gitblit v1.8.0