|
@@ -1,174 +1,63 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <v-card
|
|
|
|
|
- elevation="1"
|
|
|
|
|
- >
|
|
|
|
|
- <v-container>
|
|
|
|
|
- <v-row>
|
|
|
|
|
- <!-- block过滤 -->
|
|
|
|
|
- <v-col cols="18" md="2">
|
|
|
|
|
- <v-text-field required label="BlockNumber" v-model="query.block" />
|
|
|
|
|
- </v-col>
|
|
|
|
|
|
|
+ <v-card elevation="1">
|
|
|
|
|
+ <!-- 顶部组件 -->
|
|
|
|
|
+ <Top :query='query' :page='page' :table='table'></Top>
|
|
|
|
|
|
|
|
- <!-- hash过滤 -->
|
|
|
|
|
- <v-col cols="18" md="2">
|
|
|
|
|
- <v-text-field required label="Hash" v-model="query.hash" />
|
|
|
|
|
- </v-col>
|
|
|
|
|
-
|
|
|
|
|
- <!-- data过滤 -->
|
|
|
|
|
- <v-col cols="18" md="6">
|
|
|
|
|
- <v-text-field required label="Data" v-model="query.dataVague" />
|
|
|
|
|
- </v-col>
|
|
|
|
|
-
|
|
|
|
|
- <!-- 搜索按钮 -->
|
|
|
|
|
- <v-col cols="18" md="1">
|
|
|
|
|
- <v-btn outlined x-large tile color="primary" @click="generateHistoryData">
|
|
|
|
|
- <v-icon>mdi-cloud-search-outline</v-icon>
|
|
|
|
|
- </v-btn>
|
|
|
|
|
- </v-col>
|
|
|
|
|
- </v-row>
|
|
|
|
|
- </v-container>
|
|
|
|
|
-
|
|
|
|
|
- <!-- 表格组件 -->
|
|
|
|
|
- <v-card elevation="0">
|
|
|
|
|
- <!-- 表格上功能区 -->
|
|
|
|
|
- <v-card-title>
|
|
|
|
|
- <v-container id="dataTableHeader">
|
|
|
|
|
- <v-row>
|
|
|
|
|
- <v-col cols="4">
|
|
|
|
|
- Pending Data
|
|
|
|
|
- </v-col>
|
|
|
|
|
- <v-col cols="8">
|
|
|
|
|
- <v-text-field hide-details single-line label="Local Search" append-icon="mdi-magnify" v-model="search"/>
|
|
|
|
|
- </v-col>
|
|
|
|
|
- </v-row>
|
|
|
|
|
-
|
|
|
|
|
- <v-row>
|
|
|
|
|
- <v-col cols="12">
|
|
|
|
|
- Block: {{ showBlock }}
|
|
|
|
|
- </v-col>
|
|
|
|
|
- </v-row>
|
|
|
|
|
- </v-container>
|
|
|
|
|
- </v-card-title>
|
|
|
|
|
-
|
|
|
|
|
- <!-- 表格主体 -->
|
|
|
|
|
- <v-data-table calculate-widths multi-sort
|
|
|
|
|
- group-by="block"
|
|
|
|
|
- :headers="headers" :items="tableData" :search="search" :items-per-page="200" :loading="loading"
|
|
|
|
|
- :sort-by="['block', 'gasPrice', 'pending']" :sort-desc="[false, true, false]">
|
|
|
|
|
- <!-- 操作区 -->
|
|
|
|
|
- <template v-slot:item.option="{ item }">
|
|
|
|
|
- <div @mouseenter="changeShowBlock(item, false)">
|
|
|
|
|
- <v-row>
|
|
|
|
|
- <v-col cols="5">
|
|
|
|
|
- <v-btn icon elevation="0" color="red" large @click="deleteByHash(item.hash)">
|
|
|
|
|
- <v-icon large>mdi-delete-forever-outline</v-icon>
|
|
|
|
|
- </v-btn>
|
|
|
|
|
- </v-col>
|
|
|
|
|
- </v-row>
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <!-- Block -->
|
|
|
|
|
- <template v-slot:item.block="{ item }">
|
|
|
|
|
- <div @mouseenter="changeShowBlock(item, false)">
|
|
|
|
|
- {{ item.block }}
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <!-- Hash -->
|
|
|
|
|
- <template v-slot:item.hash="{ item }">
|
|
|
|
|
- <v-chip label target="_blank" :href="'https://www.oklink.com/en/ethw/tx/' + item.hash">
|
|
|
|
|
- {{ hashKit.head5(item.hash) + '..' }}
|
|
|
|
|
- </v-chip>
|
|
|
|
|
- </template>
|
|
|
|
|
- <!-- From -->
|
|
|
|
|
- <template v-slot:item.from="{ item }">
|
|
|
|
|
- <v-chip label color="green lighten-3" target="_blank" @click="httpKit.jumpToEthw(item.from)">
|
|
|
|
|
- {{ hashKit.headAndEnd2(item.from) }}
|
|
|
|
|
- </v-chip>
|
|
|
|
|
- </template>
|
|
|
|
|
- <!-- to -->
|
|
|
|
|
- <template v-slot:item.to="{ item }">
|
|
|
|
|
- <v-chip v-if="!item.toName" label color="indigo lighten-4" @click="httpKit.jumpToEthw(item.to)">
|
|
|
|
|
- {{ hashKit.headAndEnd2(item.to) }}
|
|
|
|
|
- </v-chip>
|
|
|
|
|
- <v-chip v-else label color="indigo lighten-4" @click="httpKit.jumpToEthw(item.to)">
|
|
|
|
|
- {{ item.toName }}
|
|
|
|
|
- </v-chip>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-slot:item.type="{ item }">
|
|
|
|
|
- <div v-if="item.type !== undefined && item.type !== ''">
|
|
|
|
|
- {{ item.type }}
|
|
|
|
|
- </div>
|
|
|
|
|
- <div v-else>
|
|
|
|
|
- [type]
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-slot:item.index="{ item }">
|
|
|
|
|
- <div v-if="item.index !== undefined">
|
|
|
|
|
- {{ item.index }}
|
|
|
|
|
- </div>
|
|
|
|
|
- <div v-else>
|
|
|
|
|
- [index]
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-slot:item.state="{ item }">
|
|
|
|
|
- <div v-if="item.state !== undefined">
|
|
|
|
|
- {{ item.state }}
|
|
|
|
|
- </div>
|
|
|
|
|
- <div v-else>
|
|
|
|
|
- [state]
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-slot:item.mev="{ item }">
|
|
|
|
|
- <div v-if="item.mev !== undefined">
|
|
|
|
|
- {{ item.mev }}
|
|
|
|
|
- </div>
|
|
|
|
|
- <div v-else>
|
|
|
|
|
- [mev]
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template v-slot:item.pending="{ item }">
|
|
|
|
|
- <div v-if="item.pending !== undefined">
|
|
|
|
|
- {{ item.pending }}
|
|
|
|
|
- </div>
|
|
|
|
|
- <div v-else>
|
|
|
|
|
- [pending]
|
|
|
|
|
- </div>
|
|
|
|
|
- </template>
|
|
|
|
|
- <!--tradeInfo-->
|
|
|
|
|
- <template v-slot:item.tradeInfo="{ item }">
|
|
|
|
|
- <TradeInfo :item="item"></TradeInfo>
|
|
|
|
|
- </template>
|
|
|
|
|
- </v-data-table>
|
|
|
|
|
- </v-card>
|
|
|
|
|
-
|
|
|
|
|
- <v-snackbar color="blue-grey" timeout="100000" v-model="blockSnackbar">
|
|
|
|
|
- block: {{ showBlock }}
|
|
|
|
|
-
|
|
|
|
|
- <template v-slot:action="{ attrs }">
|
|
|
|
|
- <v-btn text color="white" v-bind="attrs" @click="blockSnackbar = false">Close</v-btn>
|
|
|
|
|
- </template>
|
|
|
|
|
- </v-snackbar>
|
|
|
|
|
|
|
+ <!-- 中间表格组件 -->
|
|
|
|
|
+ <Table :query='query' :page='page' :table='table'></Table>
|
|
|
</v-card>
|
|
</v-card>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-import NumKit from '@/plugins/kit/NumKit'
|
|
|
|
|
-import HashKit from '@/plugins/kit/HashKit'
|
|
|
|
|
-import HttpKit from '@/plugins/kit/HttpKit'
|
|
|
|
|
-import EthMev from '@/plugins/model/EthMev'
|
|
|
|
|
-import TradeInfo from '@/components/history/TradeInfo';
|
|
|
|
|
|
|
+import Top from '@/components/viewer/Top'
|
|
|
|
|
+import Table from '@/components/viewer/Table'
|
|
|
|
|
+import EthMev from "@/plugins/model/EthMev";
|
|
|
|
|
+import NumKit from "@/plugins/kit/NumKit";
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
name: 'Pending',
|
|
name: 'Pending',
|
|
|
- components: {TradeInfo},
|
|
|
|
|
|
|
+ components: {Top, Table},
|
|
|
|
|
+ data: () => ({
|
|
|
|
|
+ query: {
|
|
|
|
|
+ block: '',
|
|
|
|
|
+ hash: '',
|
|
|
|
|
+ dataVague: ''
|
|
|
|
|
+ },
|
|
|
|
|
+ page: {
|
|
|
|
|
+ name: 'Pending Page'
|
|
|
|
|
+ },
|
|
|
|
|
+ table: {
|
|
|
|
|
+ search: '',
|
|
|
|
|
+ loading: false,
|
|
|
|
|
+ groupBy: 'block',
|
|
|
|
|
+ sortBy: ['block', 'gasPrice', 'pending'],
|
|
|
|
|
+ sortDesc: [false, true, false],
|
|
|
|
|
+ pageSize: 200,
|
|
|
|
|
+ data: [],
|
|
|
|
|
+ headers: [
|
|
|
|
|
+ {text: "Option", value: 'option'},
|
|
|
|
|
+ {text: 'Block', value: 'block'},
|
|
|
|
|
+ {text: 'Hash', value: 'hash'},
|
|
|
|
|
+ {text: 'From', value: 'from'},
|
|
|
|
|
+ {text: 'To', value: 'to'},
|
|
|
|
|
+ {text: 'GasPrice', value: 'gasPrice'},
|
|
|
|
|
+ {text: 'Type', value: 'type'},
|
|
|
|
|
+ {text: 'Index', value: 'index'},
|
|
|
|
|
+ {text: 'State', value: 'state'},
|
|
|
|
|
+ {text: 'Mev', value: 'mev'},
|
|
|
|
|
+ {text: 'Pending', value: 'pending'},
|
|
|
|
|
+ {text: 'TradeInfo', value: 'tradeInfo'}
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
|
|
+ }),
|
|
|
methods: {
|
|
methods: {
|
|
|
// 获取数据
|
|
// 获取数据
|
|
|
- async generateHistoryData() {
|
|
|
|
|
- this.tableData.length = 0
|
|
|
|
|
|
|
+ async generateTableData() {
|
|
|
|
|
+ this.table.data.length = 0
|
|
|
|
|
|
|
|
- this.loading = true
|
|
|
|
|
|
|
+ this.table.loading = true
|
|
|
const rst = await EthMev.getEthMevPendingData(this.query.block, this.query.hash, this.query.dataVague)
|
|
const rst = await EthMev.getEthMevPendingData(this.query.block, this.query.hash, this.query.dataVague)
|
|
|
- this.loading = false
|
|
|
|
|
|
|
+ this.table.loading = false
|
|
|
|
|
|
|
|
if (!rst.data.state) {
|
|
if (!rst.data.state) {
|
|
|
this.$msgkit.error(rst.data.msg)
|
|
this.$msgkit.error(rst.data.msg)
|
|
@@ -177,16 +66,16 @@ export default {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
this.$msgkit.success(rst.data.msg)
|
|
this.$msgkit.success(rst.data.msg)
|
|
|
- this.tableData = rst.data.data
|
|
|
|
|
|
|
+ this.table.data = rst.data.data
|
|
|
|
|
|
|
|
- this.tableData.map(function (one) {
|
|
|
|
|
|
|
+ this.table.data.map(function (one) {
|
|
|
try {
|
|
try {
|
|
|
let dataObj = one.dataObj
|
|
let dataObj = one.dataObj
|
|
|
|
|
|
|
|
one.tradeInfo = dataObj.tradeInfo
|
|
one.tradeInfo = dataObj.tradeInfo
|
|
|
one.from = dataObj.fromAdd
|
|
one.from = dataObj.fromAdd
|
|
|
one.to = dataObj.toAdd
|
|
one.to = dataObj.toAdd
|
|
|
- one.gasPrice = NumKit._N(parseInt(dataObj.gasPrice) / (10 ** 9), 2)
|
|
|
|
|
|
|
+ one.gasPrice = NumKit._N(parseInt(dataObj.gasPrice) / (1E9), 2)
|
|
|
one.index = dataObj.index
|
|
one.index = dataObj.index
|
|
|
one.type = dataObj.type
|
|
one.type = dataObj.type
|
|
|
one.state = dataObj.status
|
|
one.state = dataObj.status
|
|
@@ -195,60 +84,15 @@ export default {
|
|
|
one.tradeInfo = []
|
|
one.tradeInfo = []
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
- },
|
|
|
|
|
- async deleteByHash(hash_code) {
|
|
|
|
|
- if (confirm('要删吗?\n' + hash_code)) {
|
|
|
|
|
- const rst = await EthMev.deleteByHash(hash_code)
|
|
|
|
|
-
|
|
|
|
|
- if (rst.data.state) {
|
|
|
|
|
- this.$msgkit.success(rst.data.msg)
|
|
|
|
|
-
|
|
|
|
|
- await this.pullData()
|
|
|
|
|
- } else {
|
|
|
|
|
- this.$msgkit.error(rst.data.msg)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- logInfo(info) {
|
|
|
|
|
- console.log(info)
|
|
|
|
|
- },
|
|
|
|
|
- changeShowBlock(item, openSnackbar) {
|
|
|
|
|
- if (openSnackbar) this.blockSnackbar = true
|
|
|
|
|
- this.showBlock = item.block
|
|
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
-
|
|
|
|
|
- data: () => ({
|
|
|
|
|
- hashKit: HashKit,
|
|
|
|
|
- httpKit: HttpKit,
|
|
|
|
|
- query: {
|
|
|
|
|
- block: '',
|
|
|
|
|
- hash: '',
|
|
|
|
|
- dataVague: ''
|
|
|
|
|
- },
|
|
|
|
|
- blockSnackbar: false,
|
|
|
|
|
- search: '',
|
|
|
|
|
- showBlock: 0,
|
|
|
|
|
- loading: false,
|
|
|
|
|
- headers: [
|
|
|
|
|
- {text: "Option", value: 'option'},
|
|
|
|
|
- {text: 'Block', value: 'block'},
|
|
|
|
|
- {text: 'Hash', value: 'hash'},
|
|
|
|
|
- {text: 'From', value: 'from'},
|
|
|
|
|
- {text: 'To', value: 'to'},
|
|
|
|
|
- {text: 'GasPrice', value: 'gasPrice'},
|
|
|
|
|
- {text: 'Type', value: 'type'},
|
|
|
|
|
- {text: 'Index', value: 'index'},
|
|
|
|
|
- {text: 'State', value: 'state'},
|
|
|
|
|
- {text: 'Mev', value: 'mev'},
|
|
|
|
|
- {text: 'Pending', value: 'pending'},
|
|
|
|
|
- // { text: 'TradeInfo', value: 'tradeInfo'}
|
|
|
|
|
- ],
|
|
|
|
|
- tableData: []
|
|
|
|
|
- }),
|
|
|
|
|
-
|
|
|
|
|
- async mounted() {
|
|
|
|
|
- await this.generateHistoryData()
|
|
|
|
|
|
|
+ provide() {
|
|
|
|
|
+ return {
|
|
|
|
|
+ generateTableData: this.generateTableData
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ async mounted () {
|
|
|
|
|
+ await this.generateTableData()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|
|
@@ -271,7 +115,7 @@ thead.v-data-table-header {
|
|
|
bottom: 0 !important;
|
|
bottom: 0 !important;
|
|
|
z-index: 999;
|
|
z-index: 999;
|
|
|
background-color: rgba(255, 255, 255, 255);
|
|
background-color: rgba(255, 255, 255, 255);
|
|
|
- width: 95%;
|
|
|
|
|
|
|
+ width: 96.35%;
|
|
|
border-top: grey 1px solid;
|
|
border-top: grey 1px solid;
|
|
|
}
|
|
}
|
|
|
|
|
|