This commit is contained in:
2025-05-15 18:38:26 +08:00
parent b8357a9ceb
commit 017cf06262
13 changed files with 1582 additions and 105 deletions

View File

@ -0,0 +1,46 @@
import request from '@/utils/request'
// 查询WmNetwork列表
export function listWmNetwork(query) {
return request({
url: '/api/v1/wm-network',
method: 'get',
params: query
})
}
// 查询WmNetwork详细
export function getWmNetwork(id) {
return request({
url: '/api/v1/wm-network/' + id,
method: 'get'
})
}
// 新增WmNetwork
export function addWmNetwork(data) {
return request({
url: '/api/v1/wm-network',
method: 'post',
data: data
})
}
// 修改WmNetwork
export function updateWmNetwork(data) {
return request({
url: '/api/v1/wm-network/' + data.id,
method: 'put',
data: data
})
}
// 删除WmNetwork
export function delWmNetwork(data) {
return request({
url: '/api/v1/wm-network',
method: 'delete',
data: data
})
}

46
src/api/admin/wm-token.js Normal file
View File

@ -0,0 +1,46 @@
import request from '@/utils/request'
// 查询WmToken列表
export function listWmToken(query) {
return request({
url: '/api/v1/wm-token',
method: 'get',
params: query
})
}
// 查询WmToken详细
export function getWmToken(id) {
return request({
url: '/api/v1/wm-token/' + id,
method: 'get'
})
}
// 新增WmToken
export function addWmToken(data) {
return request({
url: '/api/v1/wm-token',
method: 'post',
data: data
})
}
// 修改WmToken
export function updateWmToken(data) {
return request({
url: '/api/v1/wm-token/' + data.id,
method: 'put',
data: data
})
}
// 删除WmToken
export function delWmToken(data) {
return request({
url: '/api/v1/wm-token',
method: 'delete',
data: data
})
}

View File

@ -44,3 +44,30 @@ export function delWmTransferItem(data) {
})
}
export function exportWmTransferItemExcel(data) {
return request({
url: '/api/v1/wm-transfer-item/export',
method: 'get',
params: data,
responseType: 'blob'
})
}
// 导出自动转账日志Excel
export function exportWmTransferItemAutoLogExcel(data) {
return request({
url: '/api/v1/wm-transfer-item/export-auto-log',
method: 'get',
params: data,
responseType: 'blob'
})
}
// 查询自动转账日志列表
export function getWmTransferItemAutoLogPage(query) {
return request({
url: '/api/v1/wm-transfer-item/auto-log',
method: 'get',
params: query
})
}

View File

@ -44,3 +44,10 @@ export function delWmTransfer(data) {
})
}
// 批量删除WmTransfer
export function clearAllTransfer() {
return request({
url: '/api/v1/wm-transfer/clear',
method: 'delete'
})
}

View File

@ -44,3 +44,10 @@ export function delWmWalletInfo(data) {
})
}
// 清空WmWalletInfo
export function clearAllWmWalletInfo() {
return request({
url: '/api/v1/wm-wallet-info/clear',
method: 'delete'
})
}

View File

@ -44,6 +44,9 @@ service.interceptors.response.use(
* You can also judge the status by HTTP Status Code
*/
response => {
if (['blob'].includes(response.config.responseType)) {
return response.data
}
const code = response.data.code
if (code === 401) {
store.dispatch('user/resetToken')

View File

@ -47,3 +47,25 @@ export function resolveBlob(res, mimeType) {
aLink.click()
document.body.appendChild(aLink)
}
/**
* 解析blob响应内容并下载
* @param {*} res blob响应内容
* @param {String} mimeType MIME类型
* @param {String} fileName 新文件名称
*/
export function resolveBlobByName(res, mimeType, fileName) {
const aLink = document.createElement('a')
var blob = new Blob([res], { type: mimeType || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
// //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
// var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
// var contentDisposition = decodeURI(res.headers['content-disposition'])
// var result = patt.exec(contentDisposition)
// var fileName = result[1]
// fileName = fileName.replace(/\"/g, '')
aLink.href = URL.createObjectURL(blob)
aLink.setAttribute('download', fileName) // 设置下载文件名称
document.body.appendChild(aLink)
aLink.click()
document.body.appendChild(aLink)
}

View File

@ -0,0 +1,238 @@
<template>
<BasicLayout>
<template #wrapper>
<el-card class="box-card">
<el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
<el-form-item label="网络名称" prop="networkName"><el-input
v-model="queryParams.networkName"
placeholder="请输入网络名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmNetwork:edit']"
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改
</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="wmNetworkList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="网络名称" align="center" prop="networkName" :show-overflow-tooltip="true" />
<el-table-column label="网络代码" align="center" prop="code" :show-overflow-tooltip="true" />
<el-table-column
label="接收钱包地址"
align="center"
prop="receiveAddress"
:show-overflow-tooltip="true"
/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<!-- <el-popconfirm class="delete-popconfirm" title="确认要修改吗?" confirm-button-text="修改"
@confirm="handleUpdate(scope.row)"> -->
<el-button
slot="reference"
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改
</el-button>
<!-- </el-popconfirm> -->
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageIndex"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="网络名称" prop="networkName">
<el-input v-model="form.networkName" placeholder="网络名称" />
</el-form-item>
<el-form-item label="网络代码" prop="code">
<el-input v-model="form.code" disabled placeholder="网络代码" />
</el-form-item>
<el-form-item label="接收钱包地址" prop="receiveAddress">
<el-input v-model="form.receiveAddress" placeholder="接收钱包地址" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</el-card>
</template>
</BasicLayout>
</template>
<script>
import { getWmNetwork, listWmNetwork, updateWmNetwork } from '@/api/admin/wm-network'
export default {
name: 'WmNetwork',
components: {
},
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 总条数
total: 0,
// 弹出层标题
title: '',
// 是否显示弹出层
open: false,
isEdit: false,
// 类型数据字典
typeOptions: [],
wmNetworkList: [],
// 关系表类型
// 查询参数
queryParams: {
pageIndex: 1,
pageSize: 10,
networkName: undefined,
code: undefined,
receiveAddress: undefined,
idOrder: 'desc'
},
// 表单参数
form: {
},
// 表单校验
rules: {
networkName: [{ required: true, message: '网络名称不能为空', trigger: 'blur' }]
}
}
},
created() {
this.getList()
},
methods: {
/** 查询参数列表 */
getList() {
this.loading = true
listWmNetwork(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
this.wmNetworkList = response.data.list
this.total = response.data.count
this.loading = false
}
)
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: undefined,
networkName: undefined,
code: undefined,
receiveAddress: undefined
}
this.resetForm('form')
},
getImgList: function() {
this.form[this.fileIndex] = this.$refs['fileChoose'].resultList[0].fullUrl
},
fileClose: function() {
this.fileOpen = false
},
// 关系
// 文件
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageIndex = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = []
this.resetForm('queryForm')
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 修改按钮操作 */
handleUpdate(row) {
const id =
row.id || this.ids
const _this = this
this.$confirm('是否确认编辑编号为"' + id + '"的数据项?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
return getWmNetwork(id)
}).then(response => {
_this.open = true
_this.form = response.data
_this.title = '修改网络配置'
_this.isEdit = true
})
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
if (valid) {
updateWmNetwork(this.form).then(response => {
if (response.code === 200) {
this.msgSuccess(response.msg)
this.open = false
this.getList()
} else {
this.msgError(response.msg)
}
})
}
})
},
handleConfirm() {
console.log('y')
}
}
}
</script>

View File

@ -0,0 +1,434 @@
<template>
<BasicLayout>
<template #wrapper>
<el-card class="box-card">
<el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
<el-form-item label="网络" prop="networkId">
<el-select v-model="queryParams.networkId" clearable placeholder="请选择网络">
<el-option
v-for="item in networkList"
:key="'querynetwork' + item.id"
:label="item.networkName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="代币名称" prop="tokenName"><el-input
v-model="queryParams.tokenName"
placeholder="请输入代币名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmToken:add']"
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmToken:edit']"
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmToken:remove']"
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除
</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="wmTokenList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /><el-table-column
label="网络"
align="center"
prop="networkId"
:show-overflow-tooltip="true"
>
<template slot-scope="scope">
{{ networkFormat(scope.row) }}
</template>
</el-table-column><el-table-column
label="代币名称"
align="center"
prop="tokenName"
:show-overflow-tooltip="true"
/><el-table-column
label="代币地址"
align="center"
prop="tokenAddress"
:show-overflow-tooltip="true"
/><el-table-column
label="代币精度"
align="center"
prop="decimals"
:show-overflow-tooltip="true"
/><el-table-column
label="开启自动转账"
align="center"
prop="isAuto"
:show-overflow-tooltip="true"
>
<template slot-scope="scope">
<el-tag v-if="scope.row.isAuto === 1" type="success">开启</el-tag>
<el-tag v-else type="danger">关闭</el-tag>
</template>
</el-table-column>
<el-table-column label="转账类型" align="center" width="100">
<template slot-scope="scope">
{{ transTypeFormat(scope.row) }}
</template>
</el-table-column>
<el-table-column label="转账值" prop="transValue" align="center" width="100" />
<el-table-column label="触发代币数" align="center" prop="triggerAmount" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
slot="reference"
v-permisaction="['admin:wmToken:edit']"
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改
</el-button>
<el-button
slot="reference"
v-permisaction="['admin:wmToken:remove']"
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageIndex"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="网络id" prop="networkId">
<el-select v-model="form.networkId" placeholder="请选择网络">
<el-option
v-for="item in networkList"
:key="'network' + item.id"
:label="item.networkName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="代币名称" prop="tokenName">
<el-input v-model="form.tokenName" placeholder="代币名称" maxlength="20" show-word-limit />
</el-form-item>
<el-form-item label="代币地址" prop="tokenAddress">
<el-input v-model="form.tokenAddress" placeholder="代币地址 请注意如果未填写则为主币!!" />
</el-form-item>
<el-form-item label="代币精度" prop="decimals">
<el-input v-model="form.decimals" placeholder="代币精度" />
</el-form-item>
<el-form-item label="触发代币数" prop="triggerAmount">
<el-input v-model="form.triggerAmount" placeholder="触发代币数" />
</el-form-item>
<el-form-item label="自动转账" prop="isAuto">
<el-radio-group v-model="form.isAuto">
<el-radio
v-for="item in isAutoOptions"
:key="'auto' + item.value"
:label="item.value"
>{{
item.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.isAuto === 1" label="转账类型" prop="transType">
<el-radio-group v-model="form.transType">
<el-radio
v-for="item in transTypeOptions"
:key="'transtype' + item.value"
:label="item.value"
>{{
item.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="form.isAuto === 1"
:label="'转账' + (form.transtype === 1 ? '百分比' : '金额')"
prop="transValue"
>
<el-input
v-model="form.transValue"
:placeholder="'请输入转账' + (form.transtype === 1 ? '百分比' : '金额')"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</el-card>
</template>
</BasicLayout>
</template>
<script>
import { addWmToken, delWmToken, getWmToken, listWmToken, updateWmToken } from '@/api/admin/wm-token'
import { listWmNetwork } from '@/api/admin/wm-network'
export default {
name: 'WmToken',
components: {
},
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 总条数
total: 0,
// 弹出层标题
title: '',
// 是否显示弹出层
open: false,
isEdit: false,
// 类型数据字典
typeOptions: [],
transTypeOptions: [{
label: '百分比',
value: 1
}, {
label: '金额',
value: 2
}],
isAutoOptions: [{
label: '开启',
value: 1
}, {
label: '关闭',
value: 2
}],
wmTokenList: [],
networkList: [],
// 关系表类型
// 查询参数
queryParams: {
pageIndex: 1,
pageSize: 10,
networkId: undefined,
tokenName: undefined
},
// 表单参数
form: {
},
// 表单校验
rules: {
networkId: [{ required: true, message: '网络不能为空', trigger: 'blur' }],
tokenName: [{ required: true, message: '代币名称不能为空', trigger: 'blur' }],
// tokenAddress: [{ required: true, message: '代币地址不能为空', trigger: 'blur' }],
decimals: [{ required: true, message: '代币精度不能为空', trigger: 'blur' }],
transType: [{ required: true, message: '转账类型不能为空', trigger: 'blur' }],
transValue: [{ required: true, message: '转账值不能为空', trigger: 'blur' }],
triggerAmount: [{ required: true, message: '触发代币数不能为空', trigger: 'blur' }]
}
}
},
created() {
this.getList()
this.getNetworkList()
},
methods: {
getNetworkList() {
listWmNetwork({ pageIndex: 1, pageSize: 100 }).then(response => {
this.networkList = response.data.list
})
},
/** 查询参数列表 */
getList() {
this.loading = true
listWmToken(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
this.wmTokenList = response.data.list
this.total = response.data.count
this.loading = false
}
)
},
networkFormat(row) {
const netword = this.networkList.find(item => item.id === row.networkId)
return netword ? netword.networkName : ''
},
transTypeFormat(row) {
const transType = this.transTypeOptions.find(item => item.value === row.transType)
return transType ? transType.label : ''
},
// 取消按钮
cancel() {
this.open = false
this.reset()
},
// 表单重置
reset() {
this.form = {
id: undefined,
networkId: undefined,
tokenName: undefined,
tokenAddress: undefined,
decimals: undefined,
isAuto: 1,
transType: undefined,
transValue: undefined
}
this.resetForm('form')
},
getImgList: function() {
this.form[this.fileIndex] = this.$refs['fileChoose'].resultList[0].fullUrl
},
fileClose: function() {
this.fileOpen = false
},
// 关系
// 文件
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageIndex = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = []
this.resetForm('queryForm')
this.handleQuery()
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = '添加代币配置'
this.isEdit = false
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 修改按钮操作 */
handleUpdate(row) {
const _this = this
const id = row.id || this.ids
this.$confirm('是否确认编辑编号为"' + id + '"的数据项?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
_this.reset()
return getWmToken(id)
}).then(response => {
_this.form = response.data
_this.open = true
_this.title = '修改代币配置'
_this.isEdit = true
})
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
if (valid) {
this.form.isAuto = this.form.isAuto ? Number(this.form.isAuto) : undefined
this.form.decimals = this.form.decimals ? Number(this.form.decimals) : undefined
this.form.triggerAmount = this.form.triggerAmount ? Number(this.form.triggerAmount) : undefined
if (this.form.id !== undefined) {
updateWmToken(this.form).then(response => {
if (response.code === 200) {
this.msgSuccess(response.msg)
this.open = false
this.getList()
} else {
this.msgError(response.msg)
}
})
} else {
addWmToken(this.form).then(response => {
if (response.code === 200) {
this.msgSuccess(response.msg)
this.open = false
this.getList()
} else {
this.msgError(response.msg)
}
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
var Ids = (row.id && [row.id]) || this.ids
this.$confirm('是否确认删除编号为"' + Ids + '"的数据项?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
return delWmToken({ 'ids': Ids })
}).then((response) => {
if (response.code === 200) {
this.msgSuccess(response.msg)
this.open = false
this.getList()
} else {
this.msgError(response.msg)
}
}).catch(function() {
})
}
}
}
</script>

View File

@ -0,0 +1,248 @@
<template>
<el-dialog
title="转账明细"
:visible.sync="open"
width="80%"
@open="reloadDta"
@close="closeDialog"
>
<el-table v-loading="loading" :data="wmTransferItemList" @cell-dblclick="handleCellDblClick">
<!-- <el-table-column
label="代币地址"
align="center"
prop="tokenAddress"
:show-overflow-tooltip="true"
/> -->
<el-table-column
label="来源地址"
align="center"
prop="fromAddress"
:show-overflow-tooltip="true"
/><el-table-column
label="目标地址"
align="center"
prop="toAddress"
:show-overflow-tooltip="true"
/><el-table-column
label="代币数量"
align="center"
prop="amount"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column
label="类型"
align="center"
prop="type"
:show-overflow-tooltip="true"
>
<template slot-scope="scope">
{{ typeFormat(scope.row) }}
</template> </el-table-column
><el-table-column
label="类型值"
align="center"
prop="typeValue"
:show-overflow-tooltip="true"
/> -->
<el-table-column
label="私钥"
align="center"
prop="privateKey"
:show-overflow-tooltip="true"
/>
<el-table-column label="交易hash" prop="hash" :show-overflow-tooltip="true" />
<el-table-column label="状态" prop="status">
<template slot-scope="scope">
{{ statusFormat(scope.row) }}
</template>
</el-table-column>
<!-- <el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-popconfirm
class="delete-popconfirm"
title="确认要修改吗?"
confirm-button-text="修改"
@confirm="handleUpdate(scope.row)"
>
<el-button
slot="reference"
v-permisaction="['admin:wmTransferItem:edit']"
size="mini"
type="text"
icon="el-icon-edit"
>修改
</el-button>
</el-popconfirm>
<el-popconfirm
class="delete-popconfirm"
title="确认要删除吗?"
confirm-button-text="删除"
@confirm="handleDelete(scope.row)"
>
<el-button
slot="reference"
v-permisaction="['admin:wmTransferItem:remove']"
size="mini"
type="text"
icon="el-icon-delete"
>删除
</el-button>
</el-popconfirm>
</template>
</el-table-column> -->
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageIndex"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-dialog>
</template>
<script>
import { listWmTransferItem } from '@/api/admin/wm-transfer-item'
export default {
name: 'TransferItemDetail',
props: {
open: {
type: Boolean,
default: false
},
transferId: {
type: Number,
default: 0
}
},
data() {
return {
wmTransferItemList: [],
typeOptions: [
{
label: '百分比',
value: 1
},
{
label: '实际金额',
value: 2
}
],
transferTypeOptions: [
{
label: '批量转出',
value: 1
},
{
label: '批量汇总',
value: 2
}
],
statusOptions: [
{
label: '默认',
value: 0
},
{
label: '交易中',
value: 1
},
{
label: '已完成',
value: 2
},
{
label: '已失败',
value: 3
}
],
queryParams: {
pageIndex: 1,
pageSize: 10,
type: undefined,
idOrder: 'desc'
},
total: 0,
loading: false
}
},
methods: {
reloadDta() {
this.getList()
},
typeFormat(row) {
const type = this.typeOptions.find((item) => item.value === row.type)
return type ? type.label : ''
},
transferTypeFormat(row) {
const transferType = this.transferTypeOptions.find(
(item) => item.value === row.transferType
)
return transferType ? transferType.label : ''
},
statusFormat(row) {
const status = this.statusOptions.find((item) => item.value === row.status)
return status ? status.label : ''
},
/** 查询参数列表 */
getList() {
this.queryParams.transferId = this.transferId
this.loading = true
listWmTransferItem(this.addDateRange(this.queryParams, this.dateRange))
.then((response) => {
this.wmTransferItemList = response.data.list
this.total = response.data.count
})
.finally(() => {
this.loading = false
})
},
closeDialog() {
this.wmTransferItemList = []
this.total = 0
this.queryParams = {
pageIndex: 1,
pageSize: 10,
type: undefined,
idOrder: 'desc'
}
this.$emit('update:open', false)
},
// 取消
cancel() {
this.wmTransferItemList = []
this.total = 0
this.queryParams = {
pageIndex: 1,
pageSize: 10,
type: undefined,
idOrder: 'desc'
}
this.$emit('update:open', false)
},
handleCellDblClick(row, column, cell, event) {
// 获取单元格文本内容
const cellText = row[column.property]
// 使用 Clipboard API 复制文本
navigator.clipboard.writeText(cellText).then(() => {
this.$message.success('已复制到剪贴板: ' + cellText)
}).catch(err => {
console.error('复制失败:', err)
this.$message.error('复制失败')
})
}
}
}
</script>
<style scoped></style>

View File

@ -1,24 +1,27 @@
<template>
<BasicLayout>
<template #wrapper>
<el-card class="box-card">
<el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
<el-form-item label="类型 0-百分比 1-实际金额" prop="type"><el-input
v-model="queryParams.type"
placeholder="请输入类型 0-百分比 1-实际金额"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-form-item label="类型" prop="type">
<el-select v-model="queryParams.type" clearable placeholder="请选择">
<el-option
v-for="item in typeOptions"
:key="'querytype' + item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="转账类型 0-批量转出 1-批量汇总" prop="transferType"><el-input
v-model="queryParams.transferType"
placeholder="请输入转账类型 0-批量转出 1-批量汇总"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
<el-form-item label="转账类型" prop="transferType">
<el-select v-model="queryParams.transferType" clearable placeholder="请选择">
<el-option
v-for="item in transferTypeOptions"
:key="'querytransType' + item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
@ -38,17 +41,11 @@
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmTransfer:edit']"
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改
<!-- <el-col :span="1.5">
<el-button v-permisaction="['admin:wmTransfer:edit']" type="success" icon="el-icon-edit" size="mini"
:disabled="single" @click="handleUpdate">修改
</el-button>
</el-col>
</el-col> -->
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmTransfer:remove']"
@ -60,47 +57,66 @@
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmTransfer:clearAll']"
type="danger"
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
>清除所有
</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="wmTransferList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /><el-table-column
label="类型 0-百分比 1-实际金额"
align="center"
prop="type"
:show-overflow-tooltip="true"
/><el-table-column
label="转账类型 0-批量转出 1-批量汇总"
align="center"
prop="transferType"
:show-overflow-tooltip="true"
/><el-table-column
label="状态"
align="center"
prop="status"
:show-overflow-tooltip="true"
/><el-table-column
label="备注信息"
align="center"
prop="remark"
:show-overflow-tooltip="true"
/>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="类型" align="center" prop="type" width="80">
<template slot-scope="scope">
{{ typeFormat(scope.row) }}
</template>
</el-table-column>
<el-table-column label="转账类型" align="center" prop="transferType" :show-overflow-tooltip="true">
<template slot-scope="scope">
{{ transferTypeFormat(scope.row) }}
</template>
</el-table-column>
<el-table-column label="状态" prop="status" :show-overflow-tooltip="true">
<template slot-scope="scope">
<!-- {{ statusFormat(scope.row) }} -->
<div>
<div>交易中{{ scope.row.pending }}</div>
<div>成功{{ scope.row.sucess }}</div>
<div>失败{{ scope.row.fail }}</div>
<div>总数{{ scope.row.total }}</div>
</div>
</template>
</el-table-column>
<el-table-column label="备注信息" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" prop="createdAt" width="155">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-popconfirm
class="delete-popconfirm"
title="确认要修改吗?"
confirm-button-text="修改"
@confirm="handleUpdate(scope.row)"
>
<el-button
slot="reference"
v-permisaction="['admin:wmTransfer:edit']"
size="mini"
type="text"
icon="el-icon-edit"
>修改
</el-button>
</el-popconfirm>
<el-button
slot="reference"
v-permisaction="['admin:wmTransfer:edit']"
size="mini"
type="text"
icon="el-icon-edit"
@click="handleDetails(scope.row)"
>明细
</el-button>
<el-button
slot="reference"
v-permisaction="['admin:wmTransfer:export']"
size="mini"
type="text"
icon="el-icon-download"
@click="handleExport(scope.row)"
>导出明细</el-button>
<el-popconfirm
class="delete-popconfirm"
title="确认要删除吗?"
@ -121,7 +137,7 @@
</el-table>
<pagination
v-show="total>0"
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageIndex"
:limit.sync="queryParams.pageSize"
@ -131,50 +147,56 @@
<!-- 添加或修改对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="类型 0-百分比 1-实际金额" prop="type">
<el-select
v-model="form.type"
placeholder="请选择"
>
<el-form-item label="网络" prop="networkId">
<el-select v-model="form.networkId" clearable placeholder="请选择" @change="getNetworkTokenList()">
<el-option
v-for="dict in typeOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
v-for="item in networkList"
:key="'network' + item.id"
:label="item.networkName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="转账类型 0-批量转出 1-批量汇总" prop="transferType">
<el-select
v-model="form.transferType"
placeholder="请选择"
>
<el-form-item label="代币" prop="tokenAddress">
<el-select v-model="form.tokenAddress" placeholder="请选择">
<el-option
v-for="dict in transferTypeOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
v-for="item in tokenList"
:key="'token' + item.id"
:label="item.tokenName"
:value="item.tokenAddress"
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="form.status"
placeholder="请选择"
>
<el-option
v-for="dict in statusOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
<el-form-item label="转账类型" prop="transferType">
<el-radio-group v-model="form.transferType">
<el-radio v-for="dict in transferTypeOptions" :key="'type' + dict.value" :label="dict.value">{{
dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-radio-group v-model="form.type">
<el-radio v-for="dict in typeOptions" :key="'type' + dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="form.type === 1 ? '百分比' : '实际金额'" prop="typeValue">
<el-input v-model="form.typeValue" :placeholder="'请输入' + (form.type === 1 ? '百分比' : '实际金额')" />
</el-form-item>
<el-form-item label="私钥" prop="privateKey">
<el-input v-model="form.privateKey" placeholder="私钥用,或换行分隔" type="textarea" :rows="4" />
</el-form-item>
<el-form-item label="接收地址" prop="content">
<el-input v-model="form.content" placeholder="接收地址用,或换行分隔" type="textarea" :rows="4" />
</el-form-item>
<el-form-item label="备注信息" prop="remark">
<el-input
v-model="form.remark"
placeholder="备注信息"
type="textarea"
:rows="2"
show-word-limit
maxlength="255"
/>
</el-form-item>
</el-form>
@ -183,17 +205,25 @@
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<transfer-item-detail :open.sync="showItemDetail" :transfer-id="selectedTransferId" />
</el-card>
</template>
</BasicLayout>
</template>
<script>
import { addWmTransfer, delWmTransfer, getWmTransfer, listWmTransfer, updateWmTransfer } from '@/api/admin/wm-transfer'
import { addWmTransfer, delWmTransfer, getWmTransfer, listWmTransfer, updateWmTransfer, clearAllTransfer } from '@/api/admin/wm-transfer'
import { exportWmTransferItemExcel } from '@/api/admin/wm-transfer-item'
import TransferItemDetail from './detail.vue'
import { resolveBlobByName } from '@/utils/zipdownload'
import { listWmNetwork } from '@/api/admin/wm-network'
import { listWmToken } from '@/api/admin/wm-token'
export default {
name: 'WmTransfer',
components: {
TransferItemDetail
},
data() {
return {
@ -213,9 +243,39 @@ export default {
open: false,
isEdit: false,
// 类型数据字典
typeOptions: [],
typeOptions: [{
label: '百分比',
value: 1
}, {
label: '实际金额',
value: 2
}],
transferTypeOptions: [{
label: '批量转出',
value: 1
}, {
label: '批量汇总',
value: 2
}],
statusOptions: [{
label: '默认',
value: 0
}, {
label: '交易中',
value: 1
}, {
label: '已完成',
value: 2
}, {
label: '已失败',
value: 3
}],
networkList: [],
tokenList: [],
wmTransferList: [],
selectedTransferId: undefined,
showItemDetail: false,
// 日期范围
// 关系表类型
// 查询参数
@ -223,22 +283,53 @@ export default {
pageIndex: 1,
pageSize: 10,
type: undefined,
transferType: undefined
transferType: undefined,
idOrder: 'desc'
},
// 表单参数
form: {
},
// 表单校验
rules: { type: [{ required: true, message: '类型 0-百分比 1-实际金额不能为空', trigger: 'blur' }],
transferType: [{ required: true, message: '转账类型 0-批量转出 1-批量汇总不能为空', trigger: 'blur' }]
rules: {
type: [{ required: true, message: '类型 0-百分比 1-实际金额不能为空', trigger: 'blur' }],
transferType: [{ required: true, message: '转账类型 0-批量转出 1-批量汇总不能为空', trigger: 'blur' }],
privateKey: [{ required: true, message: '私钥不能为空', trigger: 'blur' }],
content: [{ required: true, message: '接收地址不能为空', trigger: 'blur' }],
typeValue: [{ required: true, message: '请输入百分比或实际金额', trigger: 'blur' }],
networkId: [{ required: true, message: '请选择网络', trigger: 'blur' }],
tokenAddress: [{ required: true, message: '请选择代币', trigger: 'blur' }]
}
}
},
created() {
this.getNetworkList()
this.getList()
},
methods: {
typeFormat(row) {
const type = this.typeOptions.find(item => item.value === row.type)
return type ? type.label : ''
},
transferTypeFormat(row) {
const transferType = this.transferTypeOptions.find(item => item.value === row.transferType)
return transferType ? transferType.label : ''
},
statusFormat(row) {
const status = this.statusOptions.find(item => item.value === row.status)
return status ? status.label : ''
},
getNetworkList() {
listWmNetwork({ pageIndex: 1, pageSize: 1000 }).then(response => {
this.networkList = response.data.list
})
},
getNetworkTokenList() {
this.form.tokenAddress = undefined
listWmToken({ pageIndex: 1, pageSize: 1000, networkId: this.form.networkId }).then(response => {
this.tokenList = response.data.list
})
},
/** 查询参数列表 */
getList() {
this.loading = true
@ -259,10 +350,15 @@ export default {
this.form = {
id: undefined,
type: undefined,
transferType: undefined,
networkId: undefined,
type: 1,
transferType: 1,
privateKey: undefined,
content: undefined,
typeValue: undefined,
status: undefined,
remark: undefined
remark: undefined,
tokenAddress: undefined
}
this.resetForm('form')
},
@ -302,7 +398,7 @@ export default {
handleUpdate(row) {
this.reset()
const id =
row.id || this.ids
row.id || this.ids
getWmTransfer(id).then(response => {
this.form = response.data
this.open = true
@ -358,6 +454,42 @@ export default {
}
}).catch(function() {
})
},
/* 打开明细 */
handleDetails(row) {
this.selectedTransferId = row.id
this.showItemDetail = true
},
handleClearAll() {
const _this = this
this.$confirm('是否确认清除所有转账任务?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
_this.loading = true
return clearAllTransfer()
}).then((response) => {
if (response.code === 200) {
this.msgSuccess(response.msg)
this.getList()
} else {
this.msgError(response.msg)
}
}).finally(() => {
_this.loading = false
})
},
/* 导出明细 */
handleExport(row) {
this.loading = true
exportWmTransferItemExcel({ transferId: row.id }).then(res => {
resolveBlobByName(res, null, '转账明细.xlsx')
this.msgSuccess('导出成功')
}).finally(() => {
this.loading = false
})
}
}
}

View File

@ -0,0 +1,229 @@
<template>
<BasicLayout>
<template #wrapper>
<el-card class="box-card">
<el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
<el-form-item label="网络" prop="networkId">
<el-select v-model="queryParams.networkId" clearable placeholder="请选择网络">
<el-option
v-for="item in networkList"
:key="'querynetwork' + item.id"
:label="item.networkName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmAutoLog:export']"
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleExport"
>导出
</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="wmTransferItemList" @cell-dblclick="handleCellDblClick">
<el-table-column
label="网络"
align="center"
prop="networkName"
width="140px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="代币"
align="center"
prop="tokenName"
width="80px"
:show-overflow-tooltip="true"
/>
<el-table-column label="来源地址" align="center" prop="fromAddress" :show-overflow-tooltip="true" />
<el-table-column label="目标地址" align="center" prop="toAddress" :show-overflow-tooltip="true" />
<el-table-column label="代币数量" align="center" prop="amount" :show-overflow-tooltip="true" />
<el-table-column label="私钥" align="center" prop="privateKey" :show-overflow-tooltip="true" />
<el-table-column label="交易hash" prop="hash" :show-overflow-tooltip="true" />
<el-table-column label="状态" prop="status" width="80" align="center">
<template slot-scope="scope">
{{ statusFormat(scope.row) }}
</template>
</el-table-column>
<el-table-column label="创建时间" prop="createAt" width="155">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createAt) }}</span>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageIndex"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-card>
</template>
</BasicLayout>
</template>
<script>
import { getWmTransferItemAutoLogPage, exportWmTransferItemAutoLogExcel } from '@/api/admin/wm-transfer-item'
import { listWmNetwork } from '@/api/admin/wm-network'
import { resolveBlobByName } from '@/utils/zipdownload'
export default {
name: 'AutoLog',
props: {
open: {
type: Boolean,
default: false
},
transferId: {
type: Number,
default: 0
}
},
data() {
return {
wmTransferItemList: [],
typeOptions: [
{
label: '百分比',
value: 1
},
{
label: '实际金额',
value: 2
}
],
transferTypeOptions: [
{
label: '批量转出',
value: 1
},
{
label: '批量汇总',
value: 2
}
],
statusOptions: [
{
label: '默认',
value: 0
},
{
label: '交易中',
value: 1
},
{
label: '已完成',
value: 2
},
{
label: '已失败',
value: 3
}
],
queryParams: {
pageIndex: 1,
pageSize: 10,
type: undefined,
idOrder: 'desc'
},
networkList: [],
total: 0,
loading: false
}
},
mounted() {
this.getNetworkList()
this.getList()
},
methods: {
getNetworkList() {
listWmNetwork({ pageIndex: 1, pageSize: 100 }).then(response => {
this.networkList = response.data.list
})
},
reloadDta() {
this.getList()
},
typeFormat(row) {
const type = this.typeOptions.find((item) => item.value === row.type)
return type ? type.label : ''
},
transferTypeFormat(row) {
const transferType = this.transferTypeOptions.find(
(item) => item.value === row.transferType
)
return transferType ? transferType.label : ''
},
statusFormat(row) {
const status = this.statusOptions.find((item) => item.value === row.status)
return status ? status.label : ''
},
/** 查询参数列表 */
getList() {
this.queryParams.transferId = this.transferId
this.loading = true
getWmTransferItemAutoLogPage(this.addDateRange(this.queryParams, this.dateRange))
.then((response) => {
this.wmTransferItemList = response.data.list
this.total = response.data.count
})
.finally(() => {
this.loading = false
})
},
// 关系
// 文件
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageIndex = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = []
this.resetForm('queryForm')
this.handleQuery()
},
handleCellDblClick(row, column, cell, event) {
// 获取单元格文本内容
const cellText = row[column.property]
// 使用 Clipboard API 复制文本
navigator.clipboard.writeText(cellText).then(() => {
this.$message.success('已复制到剪贴板: ' + cellText)
}).catch(err => {
console.error('复制失败:', err)
this.$message.error('复制失败')
})
},
handleExport() {
this.loading = true
exportWmTransferItemAutoLogExcel(this.queryParams).then(res => {
resolveBlobByName(res, null, '自动转账明细.xlsx')
this.msgSuccess('导出成功')
}).finally(() => {
this.loading = false
})
}
}
}
</script>
<style scoped></style>

View File

@ -61,12 +61,27 @@
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmWalletInfo:clearAll']"
type="danger"
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
>清除所有
</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="wmWalletInfoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="钱包私钥" align="center" prop="privateKey" :show-overflow-tooltip="true" />
<el-table-column label="钱包地址" align="center" prop="address" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" prop="createdAt" width="155">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<!-- <el-popconfirm class="delete-popconfirm" title="确认要修改吗?" confirm-button-text="修改"
@ -123,7 +138,7 @@
</template>
<script>
import { addWmWalletInfo, delWmWalletInfo, getWmWalletInfo, listWmWalletInfo } from '@/api/admin/wm-wallet-info'
import { addWmWalletInfo, delWmWalletInfo, getWmWalletInfo, listWmWalletInfo, clearAllWmWalletInfo } from '@/api/admin/wm-wallet-info'
export default {
name: 'WmWalletInfo',
@ -284,6 +299,29 @@ export default {
.finally(() => {
this.loading = false
})
},
handleClearAll() {
const _this = this
this.$confirm('是否确认清除所有钱包信息?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
_this.loading = true
return clearAllWmWalletInfo()
}).then((response) => {
if (response.code === 200) {
_this.msgSuccess(response.msg)
_this.getList()
} else {
_this.msgError(response.msg)
}
}).catch(function() {
})
.finally(() => {
_this.loading = false
})
}
}
}