This commit is contained in:
2025-05-20 09:12:47 +08:00
parent 017cf06262
commit 1e775b45bd
12 changed files with 398 additions and 74 deletions

View File

@ -2,5 +2,5 @@
ENV = 'development'
# base api
VUE_APP_BASE_API = 'http://127.0.0.1:8000'
VUE_APP_BASE_API = 'http://192.168.2.102:8000'

View File

@ -53,6 +53,14 @@ export function exportWmTransferItemExcel(data) {
})
}
// 清理数据
export function wmTransferItemClear() {
return request({
url: '/api/v1/wm-transfer-item/clear',
method: 'delete'
})
}
// 导出自动转账日志Excel
export function exportWmTransferItemAutoLogExcel(data) {
return request({

View File

@ -51,3 +51,20 @@ export function clearAllWmWalletInfo() {
method: 'delete'
})
}
export function batchUpdateWmWalletInfo(data) {
return request({
url: '/api/v1/wm-wallet-info/batch',
method: 'put',
data: data
})
}
// excel导入
export function wmWalletInfoExcelImport(data) {
return request({
url: '/api/v1/wm-wallet-info/excel-import',
method: 'post',
data: data
})
}

View File

@ -31,6 +31,7 @@ service.interceptors.request.use(
}
)
// export const baseURL = window.CONFIG.VUE_APP_BASE_API
// response interceptor
service.interceptors.response.use(
/**

View File

@ -6,7 +6,7 @@ const mimeMap = {
zip: 'application/zip'
}
const baseUrl = process.env.VUE_APP_BASE_API
export const baseUrl = process.env.VUE_APP_BASE_API
export function downLoadZip(str, filename) {
var url = baseUrl + str
axios({

View File

@ -34,6 +34,7 @@
<el-table v-loading="loading" :data="wmNetworkList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="编号" prop="id" align="center" width="55" />
<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

View File

@ -22,7 +22,16 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="转账类型" prop="transType">
<el-select v-model="queryParams.transType" clearable placeholder="请选择">
<el-option
v-for="item in transTypeOptions"
:key="'querytransType' + item.value"
:label="item.label"
:value="item.value"
/>
</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>
@ -65,7 +74,9 @@
</el-row>
<el-table v-loading="loading" :data="wmTokenList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /><el-table-column
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="编号" prop="id" align="center" width="55" />
<el-table-column
label="网络"
align="center"
prop="networkId"
@ -80,7 +91,7 @@
prop="tokenName"
:show-overflow-tooltip="true"
/><el-table-column
label="代币地址"
label="合约地址"
align="center"
prop="tokenAddress"
:show-overflow-tooltip="true"
@ -100,13 +111,13 @@
<el-tag v-else type="danger">关闭</el-tag>
</template>
</el-table-column>
<el-table-column label="触发代币数" align="center" prop="triggerAmount" />
<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="自动转账值" prop="transValue" align="center" width="100" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
@ -157,8 +168,8 @@
<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 label="合约地址" prop="tokenAddress">
<el-input v-model="form.tokenAddress" placeholder="合约地址 请注意只填写 0 为主币!!" />
</el-form-item>
<el-form-item label="代币精度" prop="decimals">
<el-input v-model="form.decimals" placeholder="代币精度" />
@ -259,8 +270,8 @@ export default {
pageIndex: 1,
pageSize: 10,
networkId: undefined,
tokenName: undefined
tokenName: undefined,
idOrder: 'desc'
},
// 表单参数
form: {

View File

@ -6,13 +6,30 @@
@open="reloadDta"
@close="closeDialog"
>
<el-table v-loading="loading" :data="wmTransferItemList" @cell-dblclick="handleCellDblClick">
<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="网络"
width="150"
prop="networkName"
align="center"
/>
<el-table-column
label="代币名称"
width="80"
prop="tokenName"
align="center"
/>
<el-table-column
label="来源地址"
align="center"
@ -50,7 +67,11 @@
prop="privateKey"
:show-overflow-tooltip="true"
/>
<el-table-column label="交易hash" prop="hash" :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) }}
@ -187,7 +208,9 @@ export default {
return transferType ? transferType.label : ''
},
statusFormat(row) {
const status = this.statusOptions.find((item) => item.value === row.status)
const status = this.statusOptions.find(
(item) => item.value === row.status
)
return status ? status.label : ''
},
/** 查询参数列表 */
@ -233,13 +256,22 @@ export default {
// 获取单元格文本内容
const cellText = row[column.property]
// 检查 navigator.clipboard 是否可用
if (!navigator.clipboard) {
this.$message.error('您的浏览器不支持剪贴板 API请尝试手动复制。')
return // 结束函数执行,避免出错
}
// 使用 Clipboard API 复制文本
navigator.clipboard.writeText(cellText).then(() => {
this.$message.success('已复制到剪贴板: ' + cellText)
}).catch(err => {
console.error('复制失败:', err)
this.$message.error('复制失败')
})
navigator.clipboard
.writeText(cellText)
.then(() => {
this.$message.success('复制到剪贴板: ' + cellText)
})
.catch((err) => {
console.error('复制失败:', err)
this.$message.error('复制失败: ' + err.message) // 显示更详细的错误信息
})
}
}
}

View File

@ -71,6 +71,8 @@
<el-table v-loading="loading" :data="wmTransferList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="网络" width="150" prop="networkName" align="center" />
<el-table-column label="代币名称" width="80" prop="tokenName" align="center" />
<el-table-column label="类型" align="center" prop="type" width="80">
<template slot-scope="scope">
{{ typeFormat(scope.row) }}
@ -485,8 +487,12 @@ export default {
handleExport(row) {
this.loading = true
exportWmTransferItemExcel({ transferId: row.id }).then(res => {
resolveBlobByName(res, null, '转账明细.xlsx')
this.msgSuccess('导出成功')
if (res.type === 'application/json') {
this.msgError('暂无数据')
} else {
resolveBlobByName(res, null, '转账明细.xlsx')
this.msgSuccess('导出成功')
}
}).finally(() => {
this.loading = false
})

View File

@ -14,7 +14,30 @@
/>
</el-select>
</el-form-item>
<el-form-item label="代币数量">
<div style="display: flex;;">
<div>
<el-input
v-model="queryParams.startAmount"
width="60"
clearable
placeholder="请输入代币数量"
/>
</div>
<div style="width:10px;text-align: center;">-</div>
<div> <el-input
v-model="queryParams.endAmount"
width="60"
clearable
placeholder="请输入代币数量"
/> </div>
</div>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" clearable placeholder="请选择状态">
<el-option v-for="item in statusOptions" :key="'querystatus' + item.value" :label="item.label" :value="item.value" />
</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>
@ -33,6 +56,16 @@
>导出
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmAutoLog:clearAll']"
type="danger"
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
>清除所有
</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="wmTransferItemList" @cell-dblclick="handleCellDblClick">
<el-table-column
@ -49,10 +82,10 @@
width="80px"
:show-overflow-tooltip="true"
/>
<el-table-column label="私钥" align="center" prop="privateKey" :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">
@ -79,7 +112,7 @@
</template>
<script>
import { getWmTransferItemAutoLogPage, exportWmTransferItemAutoLogExcel } from '@/api/admin/wm-transfer-item'
import { getWmTransferItemAutoLogPage, exportWmTransferItemAutoLogExcel, wmTransferItemClear } from '@/api/admin/wm-transfer-item'
import { listWmNetwork } from '@/api/admin/wm-network'
import { resolveBlobByName } from '@/utils/zipdownload'
@ -119,10 +152,6 @@ export default {
}
],
statusOptions: [
{
label: '默认',
value: 0
},
{
label: '交易中',
value: 1
@ -139,7 +168,11 @@ export default {
queryParams: {
pageIndex: 1,
pageSize: 10,
networkId: undefined,
startAmount: undefined,
endAmount: undefined,
type: undefined,
status: undefined,
idOrder: 'desc'
},
networkList: [],
@ -199,6 +232,8 @@ export default {
resetQuery() {
this.dateRange = []
this.resetForm('queryForm')
this.queryParams.startAmount = undefined
this.queryParams.endAmount = undefined
this.handleQuery()
},
handleCellDblClick(row, column, cell, event) {
@ -216,11 +251,36 @@ export default {
handleExport() {
this.loading = true
exportWmTransferItemAutoLogExcel(this.queryParams).then(res => {
resolveBlobByName(res, null, '自动转账明细.xlsx')
this.msgSuccess('导出成功')
if (res.type === 'application/json') {
this.msgError('暂无数据')
} else {
resolveBlobByName(res, null, '自动转账明细.xlsx')
this.msgSuccess('导出成功')
}
}).finally(() => {
this.loading = false
})
},
handleClearAll() {
const _this = this
this.$confirm('是否确认清除所有记录?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
_this.loading = true
return wmTransferItemClear()
}).then((response) => {
if (response.code === 200) {
this.msgSuccess(response.msg)
this.getList()
} else {
this.msgError(response.msg)
}
}).finally(() => {
_this.loading = false
})
}
}
}

View File

@ -0,0 +1,129 @@
<template>
<el-dialog title="Excel导入" :visible.sync="showDialog" width="600px" :close-on-click-modal="false" @open="opened">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="模板文件">
<p style="margin: 0; color: #1890ff;"><a
:href="futuresUrl"
download="钱包导入模板.xlsx"
>钱包导入模板.xlsx</a></p>
</el-form-item>
<el-form-item label="Excel文件" prop="file">
<el-upload
class="upload-demo"
drag
:auto-upload="false"
action=""
accept=".xls,.xlsx"
:file-list="fileList"
:before-upload="beforeUpload"
:on-change="handleFileChange"
:on-remove="handleFileRemove"
:limit="1"
>
<i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div slot="tip" class="el-upload__tip">只能上传xls/xlsx文件</div>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" :loading="formLoading" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { wmWalletInfoExcelImport } from '@/api/admin/wm-wallet-info'
import { baseUrl } from '@/utils/zipdownload'
export default {
name: 'ExcelImport',
props: {
show: Boolean
},
data() {
return {
form: {
file: null
},
formLoading: false,
futuresUrl: baseUrl + '/static/excel/钱包导入模板.xlsx',
fileList: [], // 用于存储选中的文件
showDialog: false,
rules: {
file: [{ required: true, message: '文件不能为空', trigger: 'blur' }]
}
}
},
watch: {
show(val) {
this.showDialog = val
},
showDialog(val) {
this.$emit('update:show', val)
}
},
methods: {
cancel() {
this.showDialog = false
},
// 在上传文件之前触发
beforeUpload(file) {
this.form.file = file
return false // 阻止自动上传
},
// 文件列表改变时触发
handleFileChange(file, fileList) {
this.fileList = fileList
this.form.file = fileList.length > 0 ? fileList[0].raw : null
},
// 移除文件时触发
handleFileRemove() {
this.fileList = []
this.form.file = null
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
if (valid) {
this.formLoading = true
const _this = this
// 创建表单数据
const formData = new FormData()
if (this.form.file) {
formData.append('file', this.form.file)
}
wmWalletInfoExcelImport(formData).then(response => {
_this.formLoading = false
if (response.code === 200) {
this.msgSuccess(response.msg)
this.showDialog = false
this.$emit('upload-success')
} else {
this.msgError(response.msg)
}
})
.finally(() => {
_this.formLoading = false
})
}
})
},
reset() {
this.fileList = []
this.form = {
file: null
}
},
opened() {
this.reset()
}
}
}
</script>

View File

@ -19,27 +19,6 @@
</el-form>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-button
v-permisaction="['admin:wmWalletInfo: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:wmWalletInfo: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:wmWalletInfo:add']"
@ -47,9 +26,30 @@
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>批量添加
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmWalletInfo:upload']"
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleUploadExcel"
>导入钱包
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmWalletInfo:edit']"
type="primary"
icon="el-icon-edit"
size="mini"
:disabled="multiple"
@click="handleUpdate"
>修改备注
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-permisaction="['admin:wmWalletInfo:remove']"
@ -75,23 +75,26 @@
<el-table v-loading="loading" :data="wmWalletInfoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="编号" prop="id" align="center" width="55" />
<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="钱包地址" align="center" prop="address" />
<el-table-column label="备注" 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">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
<template slot-scope="scope">
<!-- <el-popconfirm class="delete-popconfirm" title="确认要修改吗?" confirm-button-text="修改"
@confirm="handleUpdate(scope.row)">
<el-button slot="reference" v-permisaction="['admin:wmWalletInfo: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:wmWalletInfo:edit']"
size="mini"
type="text"
icon="el-icon-delete"
@click="handleUpdate(scope.row)"
>编辑
</el-button>
<el-button
slot="reference"
v-permisaction="['admin:wmWalletInfo:remove']"
@ -101,7 +104,6 @@
@click="handleDelete(scope.row)"
>删除
</el-button>
<!-- </el-popconfirm> -->
</template>
</el-table-column>
</el-table>
@ -132,17 +134,41 @@
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog title="修改备注" :visible.sync="remarkOpen" width="500px">
<el-form ref="remarkForm" :model="remarkForm" label-width="80px">
<el-form-item label="备注" prop="remark">
<el-input
v-model="remarkForm.remark"
placeholder="请填写备注"
type="textarea"
:rows="3"
clearable
maxlength="255"
show-word-limit
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" :loading="loading" @click="submitRemarkForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<ExcelImport :show.sync="fileOpen" @upload-success="handleExcelSuccess" />
</el-card>
</template>
</BasicLayout>
</template>
<script>
import { addWmWalletInfo, delWmWalletInfo, getWmWalletInfo, listWmWalletInfo, clearAllWmWalletInfo } from '@/api/admin/wm-wallet-info'
import { addWmWalletInfo, delWmWalletInfo, listWmWalletInfo, clearAllWmWalletInfo, batchUpdateWmWalletInfo } from '@/api/admin/wm-wallet-info'
import ExcelImport from '@/views/admin/wm-wallet-info/excel-import'
export default {
name: 'WmWalletInfo',
components: {
ExcelImport
},
data() {
return {
@ -160,7 +186,9 @@ export default {
title: '',
// 是否显示弹出层
open: false,
remarkOpen: false,
isEdit: false,
fileOpen: false,
// 类型数据字典
typeOptions: [],
wmWalletInfoList: [],
@ -171,12 +199,13 @@ export default {
queryParams: {
pageIndex: 1,
pageSize: 10,
privateKey: undefined
privateKey: undefined,
idOrder: 'desc'
},
// 表单参数
form: {
},
remarkForm: {},
// 表单校验
rules: {
keys: [{ required: true, message: '钱包私钥不能为空', trigger: 'blur' }]
@ -200,7 +229,15 @@ export default {
// 取消按钮
cancel() {
this.open = false
this.remarkOpen = false
this.reset()
this.resetRemarkForm()
},
resetRemarkForm() {
this.remarkForm = {
ids: undefined,
remark: undefined
}
},
// 表单重置
reset() {
@ -246,15 +283,11 @@ export default {
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
this.resetRemarkForm()
const id =
row.id || this.ids
getWmWalletInfo(id).then(response => {
this.form = response.data
this.open = true
this.title = '修改钱包信息'
this.isEdit = true
})
row.id ? [row.id] : this.ids
this.remarkForm.ids = id
this.remarkOpen = true
},
/** 提交按钮 */
submitForm: function() {
@ -276,6 +309,25 @@ export default {
}
})
},
submitRemarkForm: function() {
this.$refs['remarkForm'].validate(valid => {
if (valid) {
this.loading = true
batchUpdateWmWalletInfo(this.remarkForm).then(response => {
if (response.code === 200) {
this.msgSuccess(response.msg)
this.remarkOpen = false
this.getList()
} else {
this.msgError(response.msg)
}
})
.finally(() => {
this.loading = false
})
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
var Ids = (row.id && [row.id]) || this.ids
@ -322,6 +374,13 @@ export default {
.finally(() => {
_this.loading = false
})
},
handleExcelSuccess() {
this.getList()
},
handleUploadExcel() {
console.log('上传文件')
this.fileOpen = true
}
}
}