Prechádzať zdrojové kódy

feat: 完成地址管理,部分接口,任务管理,部分页面

million 1 rok pred
rodič
commit
abd52bc531

+ 3 - 1
front/admin-front/package.json

@@ -19,13 +19,15 @@
     "core-js": "3.6.5",
     "crypto-js": "^4.1.1",
     "element-ui": "2.13.2",
+    "file-saver": "^2.0.5",
     "js-cookie": "2.2.0",
     "normalize.css": "7.0.0",
     "nprogress": "0.2.0",
     "path-to-regexp": "2.4.0",
     "vue": "2.6.10",
     "vue-router": "3.0.6",
-    "vuex": "3.1.0"
+    "vuex": "3.1.0",
+    "web3": "^1.10.0"
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "4.4.4",

+ 7 - 0
front/admin-front/src/api/adress.js

@@ -44,3 +44,10 @@ export function getCountAddress() {
     method: 'get',
   })
 }
+export function getEventRecord(data) {
+  return request({
+    url: '/ams/trade-record/page',
+    method: 'post',
+    data
+  })
+}

+ 8 - 0
front/admin-front/src/assets/autoplay/airplanemode_active.svg

@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_409_506" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="16">
+<rect width="16" height="16" fill="#D9D9D9"/>
+</mask>
+<g mask="url(#mask0_409_506)">
+<path d="M5.66667 14.6668V13.6668L7 12.6668V9.00016L1.33333 10.6668V9.3335L7 6.00016V2.3335C7 2.05572 7.09722 1.81961 7.29167 1.62516C7.48611 1.43072 7.72222 1.3335 8 1.3335C8.27778 1.3335 8.51389 1.43072 8.70833 1.62516C8.90278 1.81961 9 2.05572 9 2.3335V6.00016L14.6667 9.3335V10.6668L9 9.00016V12.6668L10.3333 13.6668V14.6668L8 14.0002L5.66667 14.6668Z" fill="white"/>
+</g>
+</svg>

+ 8 - 0
front/admin-front/src/assets/autoplay/arrow_forward.svg

@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_883_962" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="16">
+<rect width="16" height="16" fill="#D9D9D9"/>
+</mask>
+<g mask="url(#mask0_883_962)">
+<path d="M8 13.0767L7.2872 12.3741L11.1616 8.49974H2.9231V7.49977H11.1616L7.2872 3.6254L8 2.92285L13.0769 7.99975L8 13.0767Z" fill="#2980FF"/>
+</g>
+</svg>

+ 8 - 0
front/admin-front/src/assets/autoplay/autoplay.svg

@@ -0,0 +1,8 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_413_637" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="20" height="20">
+<rect width="20" height="20" fill="#D9D9D9"/>
+</mask>
+<g mask="url(#mask0_413_637)">
+<path d="M7.91665 13.75V6.25L13.75 10L7.91665 13.75ZM9.99998 19.1667C8.49998 19.1667 7.09373 18.8229 5.78123 18.1354C4.46873 17.4479 3.37498 16.4861 2.49998 15.25V17.5H0.833313V12.5H5.83331V14.1667H3.79165C4.49998 15.2083 5.39929 16.0243 6.48956 16.6146C7.57984 17.2049 8.74998 17.5 9.99998 17.5C11.5972 17.5 13.0451 17.0417 14.3437 16.125C15.6423 15.2083 16.5555 13.9931 17.0833 12.4792L18.7083 12.8542C18.0833 14.7431 16.9722 16.2674 15.375 17.4271C13.7778 18.5868 11.9861 19.1667 9.99998 19.1667ZM0.87498 9.16667C0.972202 8.23611 1.19442 7.34375 1.54165 6.48958C1.88887 5.63542 2.36804 4.84722 2.97915 4.125L4.16665 5.3125C3.7222 5.88195 3.36109 6.48958 3.08331 7.13542C2.80554 7.78125 2.63192 8.45833 2.56248 9.16667H0.87498ZM5.33331 4.14583L4.14581 2.95833C4.88192 2.34722 5.67359 1.86458 6.52081 1.51042C7.36804 1.15625 8.24998 0.944444 9.16665 0.875V2.54167C8.45831 2.61111 7.7847 2.78472 7.14581 3.0625C6.50692 3.34028 5.90276 3.70139 5.33331 4.14583ZM14.6875 4.14583C14.118 3.70139 13.5104 3.34028 12.8646 3.0625C12.2187 2.78472 11.5416 2.61111 10.8333 2.54167V0.875C11.7639 0.958333 12.6562 1.17361 13.5104 1.52083C14.3646 1.86806 15.1528 2.34722 15.875 2.95833L14.6875 4.14583ZM17.4583 9.16667C17.3889 8.45833 17.2153 7.78125 16.9375 7.13542C16.6597 6.48958 16.2986 5.88195 15.8541 5.3125L17.0416 4.125C17.6528 4.84722 18.1319 5.63542 18.4791 6.48958C18.8264 7.34375 19.0416 8.23611 19.125 9.16667H17.4583Z" fill="white"/>
+</g>
+</svg>

+ 8 - 0
front/admin-front/src/assets/autoplay/check.svg

@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_644_917" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="24" height="24">
+<rect width="24" height="24" fill="#D9D9D9"/>
+</mask>
+<g mask="url(#mask0_644_917)">
+<path d="M9.5501 18.0001L3.8501 12.3001L5.2751 10.8751L9.5501 15.1501L18.7251 5.9751L20.1501 7.4001L9.5501 18.0001Z" fill="#1C1B1F"/>
+</g>
+</svg>

+ 10 - 0
front/admin-front/src/assets/autoplay/chevron_right.svg

@@ -0,0 +1,10 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g opacity="0.5">
+<mask id="mask0_666_985" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="24" height="24">
+<rect width="24" height="24" fill="#D9D9D9"/>
+</mask>
+<g mask="url(#mask0_666_985)">
+<path d="M9.4 18L8 16.6L12.6 12L8 7.4L9.4 6L15.4 12L9.4 18Z" fill="#1C1B1F"/>
+</g>
+</g>
+</svg>

+ 8 - 0
front/admin-front/src/assets/autoplay/clock_loader_60.svg

@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_644_948" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="24" height="24">
+<rect width="24" height="24" fill="#D9D9D9"/>
+</mask>
+<g mask="url(#mask0_644_948)">
+<path d="M12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM6.325 17.675L12 12V4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 13.0667 4.2 14.0917 4.6 15.075C5 16.0583 5.575 16.925 6.325 17.675Z" fill="#2980FF"/>
+</g>
+</svg>

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 5 - 0
front/admin-front/src/assets/autoplay/language.svg


+ 76 - 0
front/admin-front/src/components/Loading.vue

@@ -0,0 +1,76 @@
+<template>
+  <div class="loading">
+    <div></div>
+    <div></div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Loading"
+}
+</script>
+
+<style scoped>
+/*纯css实现loading效果*/
+.loading,
+.loading > div {
+  position: relative;
+  box-sizing: border-box;
+}
+
+.loading {
+  display: block;
+  font-size: 0;
+  color: #000;
+}
+
+.loading.la-dark {
+  color: #333;
+}
+
+.loading > div {
+  display: inline-block;
+  float: none;
+  background-color: currentColor;
+  border: 0 solid currentColor;
+}
+
+.loading {
+  width: 100%;
+  height: 100%;
+  animation: ball-spin-rotate 2s infinite linear;
+}
+
+.loading > div {
+  position: absolute;
+  top: 0;
+  width: 60%;
+  height: 60%;
+  border-radius: 100%;
+  animation: ball-spin-bounce 2s infinite ease-in-out;
+}
+
+.loading > div:last-child {
+  top: auto;
+  bottom: 0;
+  animation-delay: -1s;
+}
+
+@keyframes ball-spin-rotate {
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+@keyframes ball-spin-bounce {
+  0%,
+  100% {
+    transform: scale(0);
+  }
+
+  50% {
+    transform: scale(1);
+  }
+}
+</style>

+ 114 - 98
front/admin-front/src/views/address/index.vue

@@ -30,10 +30,10 @@
         </div>
       </div>
       <div class="app-container-head-right">
-        <div class="app-container-head-right-button1">
+        <div class="app-container-head-right-button1" @click="exportAddress">
           导出地址
         </div>
-        <div class="app-container-head-right-button1" @click="downloadAddress">
+        <div class="app-container-head-right-button1" @click="downloadAddress()">
           下载 KeyStore
         </div>
         <div class="app-container-head-right-button1" @click="drawerImport = true">
@@ -127,7 +127,7 @@
           </el-table-column>
           <el-table-column align="right">
             <template v-slot="scope">
-              <div class="view" @click="viewAddress">
+              <div class="view" @click="viewAddress(scope.row)">
                 查看
               </div>
             </template>
@@ -157,7 +157,7 @@
             钱包名称
           </div>
           <div class="drawerView-container-walletAddress">
-            0x00581a605...ca48ddebe60b2a4ca4da
+            {{drawerViewData.address}}
           </div>
           <div class="drawerView-container-statistics">
             <div class="drawerView-container-statistics-item">
@@ -165,7 +165,7 @@
                 累计花费
               </div>
               <div class="drawerView-container-statistics-item-amounts">
-                <span class="number">89.11</span>
+                <span class="number">{{drawerViewData.gas}}</span>
                 <span class="currency">USDT</span>
               </div>
             </div>
@@ -174,7 +174,7 @@
                 剩余本金
               </div>
               <div class="drawerView-container-statistics-item-amounts">
-                <span class="number">700.00</span>
+                <span class="number">{{drawerViewData.balance}}</span>
                 <span class="currency">USDT</span>
               </div>
             </div>
@@ -185,7 +185,7 @@
             钱包活动
           </div>
           <div class="drawerView-container-total">
-            总计钱包: 222
+            总计钱包: {{drawerViewData.total}}
           </div>
           <div class="drawerView-container-table-screening">
             <div class="drawerView-container-table-screening-item">
@@ -196,26 +196,33 @@
               时间
               <img src="../../assets/address/filter_list.svg" alt="filter_list">
             </div>
+            <div class="drawerView-container-table-screening-item" style="margin-left: 26px;margin-right: -10px">
+              Gas
+              <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
+            </div>
             <div class="drawerView-container-table-screening-item">
-              余额
+              交易金
               <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
             </div>
           </div>
           <div class="drawerView-container-table-main">
-            <div v-for="item in drawerViewTableData" class="drawerView-container-table-main-item">
+            <div v-for="item in drawerViewData.table" class="drawerView-container-table-main-item">
               <div class="activity">
-                <div class="activity-item" v-if="item.activity === 'Mint'" style="background: #F2C94C;">
-                  {{item.activity}}
+                <div class="activity-item" v-if="item.taskType !== 'SWAP'" style="background: #F2C94C;">
+                  {{item.taskName}}
                 </div>
-                <div class="activity-item" v-if="item.activity === 'Swap'" style="background: #6FCF97;">
-                  {{item.activity}}
+                <div class="activity-item" v-if="item.taskType === 'SWAP'" style="background: #6FCF97;">
+                  {{item.taskName}}
                 </div>
               </div>
               <div class="time">
-                {{item.time}}
+                {{item.createTime}}
+              </div>
+              <div class="gas">
+                {{parseFloat(item.gas).toFixed(4)}}
               </div>
               <div class="balance">
-                {{item.balance}}
+                {{parseFloat(item.amount).toFixed(4)}}
               </div>
               <div class="link">
                 详情
@@ -229,17 +236,18 @@
             <el-pagination
               small
               layout="prev, pager, next"
-              :total="1000">
+              :page-size="10"
+              :total="drawerViewData.total">
             </el-pagination>
           </div>
-          <div class="manageAccount">
-            <img src="../../assets/address/page_info.svg" alt="page_info">
-            管理账号
-          </div>
-          <div class="disassociation">
-            <img src="../../assets/address/link_off.svg" alt="link_off">
-            取消关联
-          </div>
+<!--          <div class="manageAccount">-->
+<!--            <img src="../../assets/address/page_info.svg" alt="page_info">-->
+<!--            管理账号-->
+<!--          </div>-->
+<!--          <div class="disassociation">-->
+<!--            <img src="../../assets/address/link_off.svg" alt="link_off">-->
+<!--            取消关联-->
+<!--          </div>-->
         </div>
       </div>
     </el-drawer>
@@ -395,7 +403,10 @@
               </div>
             </div>
             <div class="confirm" @click="addBatchAddress">
-              <img src="../../assets/address/Stroke-2.svg" alt="Stroke">
+              <img v-if="!confirmLoading" src="../../assets/address/Stroke-2.svg" alt="Stroke">
+              <div v-if="confirmLoading" style="width: 20px;height: 20px;margin-top: -2px">
+                <Loading/>
+              </div>
               开始生成
             </div>
             <div class="tip">
@@ -415,7 +426,7 @@
             <img src="../../assets/address/Rectangle.png" alt="Rectangle">
             <div class="description">
               <div class="address">
-                成功生成 100 个钱包地址
+                成功生成 {{addressList.length}} 个钱包地址
               </div>
               <div class="tip">
                 请牢记您的 Keystore 文件及密码,系统无法帮你找回
@@ -437,7 +448,7 @@
                 <el-pagination
                   small
                   layout="prev, pager, next"
-                  :total="1000">
+                  :total="addressList.length">
                 </el-pagination>
               </div>
             </div>
@@ -448,7 +459,7 @@
             <img src="../../assets/address/upload.svg" alt="upload">
             导出地址
           </div>
-          <div class="download">
+          <div class="download" @click="downloadAddress(batchAddressObj.groupName)">
             <img src="../../assets/address/download.svg" alt="download">
             下载Keystore
           </div>
@@ -464,13 +475,16 @@ import {
   addPremiumAddress,
   batchAddress,
   downloadAddress,
-  getCountAddress,
+  getCountAddress, getEventRecord,
   getGroupList,
   pageAddress
 } from '@/api/adress'
-import AES from "@/utils/aes";
 import Axios from "axios";
+import Loading from "@/components/Loading";
+import {saveAs} from 'file-saver';
+
 export default {
+  components: {Loading},
   data() {
     return {
       table:{
@@ -485,39 +499,15 @@ export default {
         premiumCount:0
       },
       tableData: [],
+      exportTableData:[],
       drawerView:false,
-      drawerViewTableData:[
-        {
-          activity:'Mint',
-          time:'06:42',
-          txId:'',
-          balance:89.23
-        },
-        {
-          activity:'Swap',
-          time:'06:42',
-          txId:'',
-          balance:89.23
-        },
-        {
-          activity:'Mint',
-          time:'06:42',
-          txId:'',
-          balance:89.23
-        },
-        {
-          activity:'Swap',
-          time:'06:42',
-          txId:'',
-          balance:89.23
-        },
-        {
-          activity:'Swap',
-          time:'06:42',
-          txId:'',
-          balance:89.23
-        },
-        ],
+      drawerViewData:{
+        address:'',
+        table:[],
+        gas:0,
+        balance:0,
+        total:0
+      },
       drawerAddress:false,
       addressArr:[
         {
@@ -542,19 +532,9 @@ export default {
       drawerImport:false,
       drawerImportSelect:1,
       completeGeneration:false,
-      addressList:[
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-        '0xc63988ae669C41125ecB4e8113f4D0eF21874637',
-      ],
-      url: process.env.VUE_APP_BASEURL,
+      addressList:[],
+      confirmLoading:false,
+      url: process.env.VUE_APP_BASE_API,
     }
   },
   created() {
@@ -594,8 +574,20 @@ export default {
       this.table.page = 1
       this.getAddressGroupAddress()
     },
-    viewAddress(){
-      this.drawerView = true
+    viewAddress(row){
+      let params = {
+        page:1,
+        pageSize:10,
+        queryValue:row.address
+      }
+      getEventRecord(params).then(res=>{
+        this.drawerViewData.address = row.address
+        this.drawerViewData.gas = row.totalGas
+        this.drawerViewData.total = res.total
+        this.drawerViewData.table = res.records
+        this.drawerView = true
+      })
+
     },
     addBoutiqueAccount(){
       let params = this.addressArr
@@ -638,25 +630,22 @@ export default {
         return
       }
       let params = this.batchAddressObj
+      this.confirmLoading = true
       batchAddress(params).then(res=>{
-        console.log(res);
+        this.addressList = res
         this.completeGeneration = true
+        this.confirmLoading = true
       })
     },
-    downloadKeyStore(){
-      let params = {
-        groupName:this.table.walletNameGroup[this.table.walletNameGroupIndex]
+    downloadAddress(el) {
+      let groupName = this.table.walletNameGroup[this.table.walletNameGroupIndex]
+      if(el){
+        groupName = el
       }
-      downloadAddress(params).then(res=>{
-        console.log(res);
-      })
-    },
-    downloadAddress() {
-
           Axios.post(
             this.url + "ams/address/download/batch-keystore",
             {
-              groupName: this.table.walletNameGroup[this.table.walletNameGroupIndex],
+              groupName: groupName,
             },
             {
               responseType: "arraybuffer",
@@ -666,37 +655,55 @@ export default {
             }
           )
             .then((response) => {
-              console.log(response.data);
               let buffer = response.data;
               let view = new DataView(buffer);
-
               let str = "";
               for (let i = 0; i < view.byteLength; i++) {
                 str += String.fromCharCode(view.getUint8(i));
               }
               if (str.includes(".json")) {
-                console.log(str.includes(".json"));
-                this.downloadFile(response.data);
+                this.downloadFile(response.data,groupName);
               } else {
                 const data = JSON.parse(str);
                 this.$message.error(data.message);
               }
             })
             .catch((e) => {
-              console.log(e);
               this.$message.error(e);
             });
     },
-    downloadFile(data) {
+    downloadFile(data,groupName) {
       let blob = new Blob([data], { type: "application/zip" });
       let url = window.URL.createObjectURL(blob);
       const link = document.createElement("a"); // 创建a标签
       link.href = url;
-      link.download = this.table.walletNameGroup[this.table.walletNameGroupIndex] + ".zip";
+      link.download = groupName + ".zip";
       link.click();
       URL.revokeObjectURL(url); // 释放内存
       this.downloadModal = false;
     },
+    exportAddress() {
+      let params
+      if(this.table.walletNameGroupIndex === 0){
+        params = {
+          page:1,
+          pageSize:1000,
+          addressType:0
+        }
+      }else {
+        params = {
+          page:1,
+          pageSize:1000,
+          groupName:this.table.walletNameGroup[this.table.walletNameGroupIndex]
+        }
+      }
+      pageAddress(params).then(res=>{
+        this.exportTableData = res.records
+        this.exportTableData.forEach(item=>{
+
+        })
+      })
+    },
     success(message) {
       this.$notify({
         title: '成功',
@@ -1002,7 +1009,7 @@ export default {
         height: 52px;
         display: flex;
         align-items: center;
-        gap:120px;
+        gap:60px;
         border-bottom: 1px solid #f5f5f5;
         border-top: 1px solid #f5f5f5;
         .drawerView-container-table-screening-item{
@@ -1013,6 +1020,7 @@ export default {
           font-size: 15px;
           line-height: 20px;
           color: #4d4d4e;
+          white-space: nowrap;
         }
       }
       .drawerView-container-table-main{
@@ -1024,7 +1032,7 @@ export default {
           align-items: center;
           height: 30px;
           .activity{
-            width: 210px;
+            width: 120px;
             .activity-item{
               width: 72px;
               height: 30px;
@@ -1059,6 +1067,13 @@ export default {
             color: #222222;
             width: 120px;
           }
+          .gas{
+            font-weight: 700;
+            font-size: 15px;
+            line-height: 20px;
+            color: #222222;
+            width: 120px;
+          }
         }
       }
     }
@@ -1067,7 +1082,7 @@ export default {
       padding: 30px 10px;
       display: flex;
       align-items: center;
-      justify-content: space-around;
+      //justify-content: space-around;
       .pagination{
         width: 250px;
       }
@@ -1416,6 +1431,7 @@ export default {
         font-size: 17px;
         line-height: 22px;
         color: #222222;
+        cursor: pointer;
       }
     }
   }

+ 796 - 21
front/admin-front/src/views/autoplay/index.vue

@@ -1,42 +1,817 @@
 <template>
   <div class="app-container">
+    <div class="title">
+      任务列表
+    </div>
+    <div class="app-container-table-screening">
+      <div class="app-container-table-screening-item">
+        账号类型
+        <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
+      </div>
+      <div class="app-container-table-screening-item">
+        余额
+        <img src="../../assets/address/unfold_more.svg" alt="unfold_more">
+      </div>
+    </div>
+    <div class="app-container-table-main">
+       <div class="app-container-table-main-item"  v-for="(item,index) in missionData">
+         <div class="head">
+            <div class="avatar">
 
+            </div>
+            <div class="name" @click="drawerDetails = true">
+              <div class="missionName">
+                {{item.missionName}}
+                <img src="../../assets/autoplay/arrow_forward.svg" alt="arrow_forward">
+              </div>
+              <div class="projectName">
+                {{item.projectName}}
+              </div>
+            </div>
+          </div>
+         <div class="jump" @click="jumpRecord">
+           执行记录
+           <img src="../../assets/autoplay/arrow_forward.svg" alt="arrow_forward">
+         </div>
+         <div class="implementationStrategy">
+           <div class="item" v-if="item.implementationStrategy.length > 0" v-for="(item1,index) in item.implementationStrategy">
+             {{item1}}
+           </div>
+           <div class="item-no" v-if="item.implementationStrategy.length === 0">
+             暂无
+           </div>
+         </div>
+         <div class="implementationStrategyText">
+            执行策略
+         </div>
+         <div class="underImplementation" v-if="item.status === 0">
+           <div class="numberOfExecutions">
+             <div class="text">
+               当前执行/计划执行次数
+             </div>
+             <div class="number">
+               {{item.currentExecution}}/{{item.executionNumber}}
+             </div>
+           </div>
+           <div class="progressBar">
+             <div class="progressBar-blue">
+               <img src="../../assets/autoplay/airplanemode_active.svg" alt="airplanemode_active">
+               进行中
+             </div>
+             <div class="details">
+               详情
+               <img src="../../assets/autoplay/arrow_forward.svg" alt="arrow_forward">
+             </div>
+           </div>
+         </div>
+         <div class="batchExecution" v-if="item.status === 1">
+           <div class="left">
+             <div class="number">
+               {{item.currentExecution}}/{{item.executionNumber}}
+             </div>
+             <div class="text">
+               当前执行/计划执行次数
+             </div>
+           </div>
+           <div class="right">
+             <img src="../../assets/autoplay/autoplay.svg" alt="autoplay">
+             批量执行
+           </div>
+         </div>
+         <div class="horizontalLine"/>
+         <div class="time">
+           上次执行时间: {{item.time}}
+         </div>
+       </div>
+    </div>
+    <el-drawer
+      :visible.sync="drawerDetails"
+      :with-header="false">
+      <div class="drawerAddress-container">
+        <div class="drawerAddress-container-head">
+          <div class="drawerAddress-container-head-left">
+            <div class="avatar">
+
+            </div>
+            <div class="info">
+              <div class="projectName">
+                LayerZero
+              </div>
+              <div class="id">
+                任务id
+              </div>
+            </div>
+          </div>
+          <div class="drawerAddress-container-head-right">
+            <div class="complete">
+              <img src="../../assets/address/done_all.svg" alt="done_all">
+              完成
+            </div>
+          </div>
+        </div>
+        <div class="drawerAddress-container-main">
+          <div class="title">
+            任务详情
+          </div>
+          <div class="input">
+            <el-input v-model="input" placeholder="任务名称"></el-input>
+          </div>
+          <div class="select">
+            <el-select style="width: 140px" v-model="chainId" placeholder="选择公链">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+            <el-select style="width: 400px" v-model="chainId" placeholder="选择合约">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+          <div class="input">
+            <el-input v-model="input" placeholder="计划任务执行次数"></el-input>
+          </div>
+          <div class="input">
+            <el-input v-model="input" placeholder="预计Gas消耗"></el-input>
+          </div>
+        </div>
+      </div>
+    </el-drawer>
+    <el-drawer
+      :visible.sync="drawerRecord"
+      :with-header="false">
+      <div class="drawerRecord-container">
+        <div class="drawerAddress-container-head">
+          <div class="drawerAddress-container-head-left">
+            <div class="missionName">
+              <div class="name">
+                任务名称
+              </div>
+            </div>
+            <div class="text">
+              查看历史交互记录
+            </div>
+          </div>
+        </div>
+        <div class="drawerAddress-container-main">
+          <div class="drawerAddress-container-head-left">
+            <div class="avatar">
+
+            </div>
+            <div class="info">
+              <div class="projectName">
+                zkSync Era
+              </div>
+              <div class="webLink">
+                <img src="../../assets/autoplay/language.svg" alt="language">
+                https://zksync.io/
+              </div>
+            </div>
+          </div>
+          <div class="horizontalLine"/>
+          <div class="recordTitle">
+            <div class="left">
+              <div class="text">
+                执行记录
+              </div>
+              <div class="number">
+                累计执行: 3
+              </div>
+            </div>
+            <div class="right">
+<!--              <el-date-picker-->
+<!--                v-model="value1"-->
+<!--                type="daterange"-->
+<!--                range-separator="至"-->
+<!--                start-placeholder="开始日期"-->
+<!--                end-placeholder="结束日期">-->
+<!--              </el-date-picker>-->
+            </div>
+          </div>
+          <div class="table">
+            <el-table
+              :data="recordData"
+              style="width: 100%">
+              <el-table-column
+                prop="id"
+                label="执行ID">
+              </el-table-column>
+              <el-table-column
+                prop="time"
+                label="时间">
+              </el-table-column>
+              <el-table-column
+                prop="amount"
+                label="累计金额">
+              </el-table-column>
+              <el-table-column
+                prop="gas"
+                label="总GAS">
+              </el-table-column>
+              <el-table-column
+                prop="status"
+                label="状态"
+                width="150"
+                align="center">
+                <template v-slot="scope">
+                  <div class="status">
+                    <div class="text" v-if="scope.row.status === 0" style="color: #2980FF;">
+                      <img src="../../assets/autoplay/clock_loader_60.svg" alt="clock_loader_60">
+                      进行中
+                    </div>
+                    <div class="text" v-if="scope.row.status === 1" >
+                      <img src="../../assets/autoplay/check.svg" alt="check">
+                      已完成
+                    </div>
+                    <img src="../../assets/autoplay/chevron_right.svg" alt="chevron_right">
+                  </div>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </div>
+        <div class="drawerView-container-footer">
+          <div class="pagination">
+            <el-pagination
+              small
+              layout="prev, pager, next"
+              :page-size="10"
+              :total="3">
+            </el-pagination>
+          </div>
+        </div>
+      </div>
+    </el-drawer>
   </div>
+
 </template>
 
 <script>
 export default {
   data() {
     return {
-      form: {
-        name: '',
-        region: '',
-        date1: '',
-        date2: '',
-        delivery: false,
-        type: [],
-        resource: '',
-        desc: ''
-      }
+      missionData:[
+        {
+          missionName:'交互任务名称',
+          projectName:'LayerZero',
+          status:0,
+          time:'04/24-12:23',
+          implementationStrategy:['执行策略','执行策略','执行策略'],
+          currentExecution:11,
+          executionNumber:12
+        },
+        {
+          missionName:'交互任务名称',
+          projectName:'LayerZero',
+          status:1,
+          time:'04/24-12:23',
+          implementationStrategy:['执行策略','执行策略','执行策略'],
+          currentExecution:1,
+          executionNumber:12
+        },
+        {
+          missionName:'交互任务名称',
+          projectName:'LayerZero',
+          status:1,
+          time:'04/24-12:23',
+          implementationStrategy:['执行策略','执行策略','执行策略'],
+          currentExecution:1,
+          executionNumber:12
+        },
+        {
+          missionName:'交互任务名称',
+          projectName:'LayerZero',
+          status:1,
+          time:'04/24-12:23',
+          implementationStrategy:['执行策略','执行策略','执行策略'],
+          currentExecution:0,
+          executionNumber:12
+        },
+        {
+          missionName:'交互任务名称',
+          projectName:'LayerZero',
+          status:1,
+          time:'04/24-12:23',
+          implementationStrategy:[],
+          currentExecution:1,
+          executionNumber:12
+        },
+      ],
+      drawerDetails:false,
+      input:'',
+      chainId:'',
+      options: [{
+        value: '1',
+        label: 'ETH'
+      }],
+      drawerRecord:false,
+      value1: '',
+      recordData:[
+        {
+          id:'123',
+          time:'09-09',
+          amount:'金额',
+          gas:'GAS',
+          status:1
+        },
+        {
+          id:'123',
+          time:'09-09',
+          amount:'金额',
+          gas:'GAS',
+          status:1
+        },
+        {
+          id:'123',
+          time:'09-09',
+          amount:'金额',
+          gas:'GAS',
+          status:0
+        },
+      ]
     }
   },
   methods: {
-    onSubmit() {
-      this.$message('submit!')
-    },
-    onCancel() {
-      this.$message({
-        message: 'cancel!',
-        type: 'warning'
-      })
+    jumpRecord() {
+      this.drawerRecord = true
     },
   }
 }
 </script>
 
-<style scoped>
-.line{
-  text-align: center;
+<style lang="scss" scoped>
+.app-container{
+  .title{
+    font-weight: 700;
+    font-size: 21px;
+    line-height: 28px;
+    color: #181818;
+  }
+  .app-container-table-screening{
+    display: flex;
+    align-items: center;
+    gap:100px;
+    padding: 20px 0;
+    margin: 20px 0;
+    border-top: 1px solid #f5f5f5;
+    border-bottom: 1px solid #f5f5f5;
+    .app-container-table-screening-item{
+      display: flex;
+      align-items: center;
+      gap:6px;
+      font-weight: 400;
+      font-size: 15px;
+      line-height: 20px;
+      color: #4d4d4e;
+    }
+  }
+  .app-container-table-main{
+    display: flex;
+    justify-content: space-between;
+    gap:20px;
+    flex-wrap: wrap;
+    .app-container-table-main-item{
+      width: 345px;
+      height: 315px;
+      background: #FFFFFF;
+      border: 1px solid #2980FF;
+      border-radius: 10px;
+      padding:24px;
+      position: relative;
+      .head{
+        display: flex;
+        gap:8px;
+        .avatar{
+          width: 46px;
+          height: 46px;
+          background: black;
+          border-radius: 50%;
+        }
+        .name{
+          display: flex;
+          flex-direction: column;
+          gap:8px;
+          cursor: pointer;
+          .projectName{
+            font-weight: 700;
+            font-size: 12px;
+            line-height: 16px;
+            color: #919191;
+          }
+          .missionName{
+            font-weight: 700;
+            font-size: 17px;
+            line-height: 22px;
+            color: #222222;
+            display: flex;
+            align-items: center;
+            gap:8px
+          }
+        }
+      }
+      .jump{
+        position: absolute;
+        bottom:25px;
+        right:24px;
+        display: flex;
+        gap:8px;
+        font-weight: 700;
+        font-size: 12px;
+        line-height: 16px;
+        color: #2980FF;
+        cursor: pointer;
+      }
+      .implementationStrategy{
+        display: flex;
+        gap:12px;
+        margin-top: 32px;
+        .item{
+          width: 68px;
+          height: 24px;
+          background: #edf2ff;
+          border: 1px solid #2980FF;
+          border-radius: 4px;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          font-weight: 500;
+          font-size: 12px;
+          line-height: 16px;
+          color: #222222;
+        }
+        .item-no{
+          width: 44px;
+          height: 24px;
+          background: #F5F5F5;
+          border: 1px solid #E0E0E0;
+          border-radius: 4px;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          font-weight: 500;
+          font-size: 12px;
+          line-height: 16px;
+          color: #828282;
+        }
+      }
+      .implementationStrategyText{
+        font-weight: 400;
+        font-size: 12px;
+        line-height: 16px;
+        color: #919191;
+        margin-top: 8px;
+      }
+      .underImplementation{
+        display: flex;
+        flex-direction: column;
+        gap:8px;
+        margin-top: 24px;
+        height: 50px;
+        .numberOfExecutions{
+          display: flex;
+          gap:4px;
+          .text{
+            font-weight: 400;
+            font-size: 12px;
+            line-height: 16px;
+            color: #919191;
+          }
+          .number{
+            font-weight: 700;
+            font-size: 12px;
+            line-height: 16px;
+            color: #222222;
+          }
+        }
+        .progressBar{
+          width: 100%;
+          height: 28px;
+          background: #F5F5F5;
+          border-radius: 21px;
+          display: flex;
+          justify-content: space-between;
+          padding-right: 6px;
+          .progressBar-blue{
+            width: 147px;
+            height: 28px;
+            background: #2980FF;
+            border-radius: 26px;
+            display: flex;
+            align-items: center;
+            padding-left: 10px;
+            gap:4px;
+            font-weight: 400;
+            font-size: 12px;
+            line-height: 16px;
+            color: #FFFFFF;
+          }
+          .details{
+            display: flex;
+            align-items: center;
+            gap:4px;
+            font-weight: 400;
+            font-size: 12px;
+            line-height: 16px;
+            color: #7b7b7b;
+          }
+        }
+      }
+      .batchExecution{
+        display: flex;
+        justify-content: space-between;
+        gap:8px;
+        margin-top: 24px;
+        height: 50px;
+        .left{
+          display: flex;
+          gap:8px;
+          flex-direction: column;
+          .text{
+            font-weight: 400;
+            font-size: 12px;
+            line-height: 16px;
+            color: #919191;
+          }
+          .number{
+            font-weight: 700;
+            font-size: 17px;
+            line-height: 22px;
+            color: #222222;
+          }
+        }
+        .right{
+          display: flex;
+          gap:4px;
+          align-items: center;
+          font-weight: 700;
+          font-size: 15px;
+          line-height: 20px;
+          color: #FFFFFF;
+          width: 132px;
+          height: 44px;
+          justify-content: center;
+          background: #2980FF;
+          border: 1px solid #2980FF;
+          border-radius: 10px;
+        }
+      }
+      .horizontalLine{
+        width: 343px;
+        height: 1px;
+        border-bottom: 1px solid #F5F5F5;
+        margin-left: -24px;
+        margin-top: 28px;
+      }
+      .time{
+        font-weight: 400;
+        font-size: 12px;
+        line-height: 16px;
+        color: #919191;
+        margin-top: 20px;
+      }
+    }
+  }
+  .drawerAddress-container{
+    display: flex;
+    flex-direction: column;
+    height: 100vh;
+    overflow: auto;
+    .drawerAddress-container-head{
+      padding: 56px 40px;
+      background: #FFFFFF;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .drawerAddress-container-head-left{
+        display: flex;
+        gap:8px;
+        .avatar{
+          width: 46px;
+          height: 46px;
+          border-radius: 50%;
+          background: black;
+        }
+        .info{
+          display: flex;
+          flex-direction: column;
+          gap:8px;
+          .projectName{
+            font-weight: 700;
+            font-size: 17px;
+            line-height: 22px;
+            color: #222222;
+          }
+          .id{
+            font-weight: 400;
+            font-size: 12px;
+            line-height: 16px;
+            color: #838383;
+          }
+        }
+      }
+      .drawerAddress-container-head-right{
+        display: flex;
+        align-items: center;
+        gap:48px;
+        .complete{
+          width: 118px;
+          height: 52px;
+          border: 2px solid #4A76FF;
+          border-radius: 10px;
+          gap:4px;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          font-weight: 700;
+          font-size: 15px;
+          line-height: 20px;
+          color: #2980FF;
+          cursor: pointer;
+        }
+      }
+    }
+    .drawerAddress-container-main{
+      padding: 36px 40px;
+      background: #f9fbff;
+      flex-grow: 1;
+      display: flex;
+      flex-direction: column;
+      gap:20px;
+      .select{
+        display: flex;
+        gap:24px;
+      }
+    }
+  }
+  .drawerRecord-container{
+    display: flex;
+    flex-direction: column;
+    height: 100vh;
+    overflow: auto;
+    .drawerAddress-container-head{
+      padding: 56px 40px;
+      background: #FFFFFF;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .drawerAddress-container-head-left{
+        display: flex;
+        flex-direction: column;
+        gap:8px;
+        .missionName{
+          display: flex;
+          gap:8px;
+          align-items: center;
+          .id{
+            width: 57px;
+            height: 24px;
+            background: #F5F5F5;
+            border: 1px solid #E0E0E0;
+            border-radius: 4px;
+            font-weight: 400;
+            font-size: 12px;
+            line-height: 16px;
+            color: #7b7b7b;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+          }
+          .name{
+            font-weight: 700;
+            font-size: 21px;
+            line-height: 28px;
+            color: #181818;
+          }
+        }
+        .text{
+          font-weight: 400;
+          font-size: 12px;
+          line-height: 16px;
+          color: #919191;
+        }
+      }
+
+    }
+    .drawerAddress-container-main{
+      padding: 36px 40px;
+      background: #f9fbff;
+      flex-grow: 1;
+      display: flex;
+      flex-direction: column;
+      gap:20px;
+      .drawerAddress-container-head-left{
+        display: flex;
+        gap:24px;
+        .avatar{
+          width: 46px;
+          height: 46px;
+          border-radius: 50%;
+          background: black;
+        }
+        .info{
+          display: flex;
+          flex-direction: column;
+          gap:8px;
+          .projectName{
+            font-weight: 700;
+            font-size: 17px;
+            line-height: 22px;
+            color: #222222;
+          }
+          .webLink{
+            font-weight: 700;
+            font-size: 15px;
+            line-height: 20px;
+            color: #2980FF;
+            text-decoration-line: underline;
+            display: flex;
+            align-items: center;
+            gap:8px
+          }
+        }
+      }
+      .horizontalLine{
+        width: 100%;
+        height: 1px;
+        border-bottom: 1px solid #f1f1f1;
+        margin-top: 40px;
+        margin-bottom: 30px;
+      }
+      .recordTitle{
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .left{
+          display: flex;
+          flex-direction: column;
+          gap:8px;
+          .text{
+            font-weight: 700;
+            font-size: 21px;
+            line-height: 28px;
+            color: #181818;
+          }
+          .number{
+            font-weight: 700;
+            font-size: 12px;
+            line-height: 16px;
+            color: #8e8f91;
+          }
+        }
+      }
+      .table{
+        .status{
+          display: flex;
+          justify-content: space-between;
+          cursor: pointer;
+          .text{
+            display: flex;
+            align-items: center;
+            gap:4px;
+            font-weight: 400;
+            font-size: 15px;
+            line-height: 20px;
+            color: #222222;
+            white-space: nowrap;
+          }
+        }
+      }
+    }
+    .drawerView-container-footer {
+      height: 84px;
+      padding: 30px 10px;
+      display: flex;
+      align-items: center;
+      //justify-content: space-around;
+      .pagination{
+        width: 250px;
+      }
+      .manageAccount{
+        display: flex;
+        align-items: center;
+        gap:12px;
+        font-weight: 700;
+        font-size: 17px;
+        line-height: 22px;
+        color: #222222;
+      }
+      .disassociation{
+        display: flex;
+        align-items: center;
+        gap:12px;
+        font-weight: 700;
+        font-size: 17px;
+        line-height: 22px;
+        color: #EB5757;
+      }
+    }
+  }
 }
 </style>
 

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov