当前位置: 首页 > news >正文

ethers.js express vue2 定时任务每天凌晨2点监听合约地址数据同步到Mysql整理

下面是一个完整的 Ethers.js + Express + Vue2 + MySQL 实现方案,用于:

💡每天凌晨 2 点监听某合约地址的 Transfer 事件,写入 MySQL 数据库,并展示每日 NFT 交易量图表(Vue2 + ECharts)


✅ 后端部分(Express + Ethers.js + MySQL)

📁 项目结构(后端部分):

backend/
├── abi/NFT_ABI.json
├── db.js
├── syncTransfers.js
├── api.js
└── server.js

📌 1. db.js(MySQL 连接池)

const mysql = require('mysql2/promise');const pool = mysql.createPool({host: 'localhost',user: 'root',password: 'yourpassword',database: 'nft_data',
});module.exports = pool;

📌 2. syncTransfers.js(同步 NFT Transfer 数据)

const { ethers } = require('ethers');
const pool = require('./db');
const abi = require('./abi/NFT_ABI.json');const provider = new ethers.JsonRpcProvider('https://sepolia.infura.io/v3/YOUR_INFURA_KEY');
const contract = new ethers.Contract('0xYourContractAddress', abi, provider);async function syncTransfers() {const latestBlock = await provider.getBlockNumber();const fromBlock = latestBlock - 5000;const toBlock = latestBlock;const events = await contract.queryFilter('Transfer', fromBlock, toBlock);for (const event of events) {const { transactionHash, blockNumber, args } = event;const { from, to, tokenId } = args;const block = await provider.getBlock(blockNumber);const timestamp = new Date(block.timestamp * 1000);await pool.execute(`INSERT IGNORE INTO nft_transfers (tx_hash, from_address, to_address, token_id, block_number, timestamp)VALUES (?, ?, ?, ?, ?, ?)`, [transactionHash, from, to, tokenId.toString(), blockNumber, timestamp]);}console.log(`✅ Synced ${events.length} transfers`);
}module.exports = syncTransfers;

📌 3. api.js(提供每日统计 API)

const express = require('express');
const pool = require('./db');
const router = express.Router();router.get('/daily-stats', async (req, res) => {const [rows] = await pool.execute(`SELECT DATE(timestamp) as day, COUNT(*) as countFROM nft_transfersGROUP BY day ORDER BY day DESC LIMIT 7`);res.json(rows);
});module.exports = router;

📌 4. server.js(Express + 定时任务)

const express = require('express');
const cron = require('node-cron');
const syncTransfers = require('./syncTransfers');
const api = require('./api');const app = express();
app.use('/api', api);// 定时任务:每天凌晨 2 点执行
cron.schedule('0 2 * * *', () => {console.log('⏰ Running daily syncTransfers job...');syncTransfers();
});app.listen(3000, () => {console.log('🚀 Server running on http://localhost:3000');
});

📌 5. SQL 建表语句

CREATE TABLE nft_transfers (id INT AUTO_INCREMENT PRIMARY KEY,tx_hash VARCHAR(66),from_address VARCHAR(42),to_address VARCHAR(42),token_id VARCHAR(100),block_number INT,timestamp DATETIME,UNIQUE(tx_hash)
);

✅ 前端部分(Vue2 + Axios + ECharts)

📁 frontend/src/components/Chart.vue

<template><div><h2>每日 NFT 交易量</h2><div id="chart" style="height: 400px"></div></div>
</template><script>
import axios from 'axios';
import echarts from 'echarts';export default {mounted() {axios.get('/api/daily-stats').then(res => {const days = res.data.map(r => r.day);const counts = res.data.map(r => r.count);const chart = echarts.init(document.getElementById('chart'));chart.setOption({title: { text: '每日交易量' },tooltip: {},xAxis: { type: 'category', data: days },yAxis: { type: 'value' },series: [{ type: 'line', data: counts }]});});}
};
</script>

✅ 最后提示

  1. 🔧 确保将 Infura Key、合约地址、ABI 替换为你自己的

  2. Transfer 事件仅适用于符合 ERC721/1155 标准的 NFT 合约

  3. 📦 启动命令如下:

# 安装依赖
npm install express mysql2 ethers node-cron axios echarts# 启动后端
node server.js# 启动前端(Vue2)
npm run serve

如果你还想加:

  • 统计活跃地址数

  • 展示 NFT TokenId 的交易趋势

  • 接入钱包连接

  • 用 NestJS 替换 Express

可以继续说,我可以帮你逐步拓展。

http://www.lqws.cn/news/529669.html

相关文章:

  • ASIO 避坑指南:高效、安全与稳健的异步网络编程
  • 微服务架构下面临的安全、合规审计挑战
  • Python打卡:Day37
  • 使用 Python 自动化文件获取:从 FTP 到 API 的全面指南
  • 【Bluedroid】蓝牙启动之 btm_acl_device_down 流程源码解析
  • 稳定币技术全解:从货币锚定机制到区块链金融基础设施
  • Java底层原理:深入理解线程与并发机制
  • GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径
  • 人大金仓Kingbase数据库KSQL 常用命令指南
  • 【论文】云原生事件驱动架构在智能风控系统中的实践与思考
  • 小孙学变频学习笔记(八)变频器的输入电流(下)
  • RPC(Remote Procedure Call)技术解析
  • 计算机网络 网络层:控制平面(二)
  • WPF中Converter基础用法
  • 正则表达式,`[]`(字符类)和`|`(或操作符)
  • MFC制作动态波形图( ChartCtrl)
  • 【AI News | 20250626】每日AI进展
  • ​​Deepoc大模型在光电研发中的核心技术突破与应用​
  • 使用CSS泄露标签属性值 url路径遍历攻击 -- GPN CTF 2025 PAINting Dice
  • CSS 背景属性用于定义HTML元素的背景
  • 构思的股票交易模拟 3D 虚拟主题游戏《股海逐梦 3D》
  • c++17标准std::filesystem常用函数
  • HDFS(Hadoop分布式文件系统)总结
  • 面试破局:告别流水账,用“故事思维”重塑自我介绍
  • 【RESTful接口设计规范全解析】URL路径设计 + 动词名词区分 + 状态码 + 返回值结构 + 最佳实践 + 新手常见误区汇总
  • Word 中批量转换 LaTeX 公式为标准数学格式的终极方法(附宏设置教程)
  • 高弹性、高可靠!腾讯云 TDMQ RabbitMQ Serverless 版全新发布
  • DOA-BiLSTM+NSGAII+熵权TOPSIS,附气泡图!,梦境优化算法+深度学习+多目标优化+多属性决策!
  • Java底层原理:深入理解JVM性能调优与监控
  • Java设计模式->责任链模式的介绍