前言
go-admin 框架的定时任务使用起来非常顺手,仅需在app/jobs/examples.go中的InitJob方法中增加更多的任务结构体并实现Exec接口即可,由于我们定时任务预计会比较多,故迁移到task包中去实现,一个任务类型一个go文件,方便代码阅读。
别忘了在数据库sys_job表中增加你的任务记录,并修改状态为2(启用)
NFT基础数据拉取任务
上一节提到了一张表NFT信息扫描记录表nft_scan_record,重新回顾一下字段:
CREATE TABLE `nft_scan_record` (
`id` varchar(32) NOT NULL COMMENT 'PK',
`chain_id` varchar(50) NOT NULL COMMENT '链ID',
`contract_address` varchar(100) NOT NULL COMMENT '合约地址',
`query_limit` int(5) DEFAULT NULL COMMENT '查询大小',
`max_page` int(5) DEFAULT NULL COMMENT '最大页码',
`current_page` int(5) DEFAULT '1' COMMENT '当前页码',
`status` int(1) DEFAULT NULL COMMENT '0待开始1进行中2已结束',
PRIMARY KEY (`id`),
UNIQUE KEY `contract_unq` (`chain_id`,`contract_address`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='NFT信息扫描记录';
由于我们请求的第三方NFT列表数据的拉取不一定能一次新全部拉完,对于超过1万个NFT的合集更是存在更多不确定性,我们不能每次重新来,因此使用定时任务根据历史分页来增量拉取上最合适的,同时也能随时控制定时任务的节奏。
经过多家NFT聚合数据平台接口的调研,我们决定使用chainbase 的API作为NFT数据来源。
拉取项目(合约)基础数据
拉取合约的基础数据,参考上一节表nft_project相关字段:
CREATE TABLE `nft_project` (
`id` varchar(32) NOT NULL COMMENT 'PK',
`chain_id` varchar(50) DEFAULT NULL COMMENT '链ID',
`project_name` varchar(50) DEFAULT NULL COMMENT '项目名称',
`contract_address` varchar(100) DEFAULT NULL COMMENT '合约地址',
`nft_count` int(6) DEFAULT NULL COMMENT '藏品数',
`nft_type` varchar(50) DEFAULT NULL COMMENT '协议类型(erc721,erc1155)',
`img_url` varchar(255) DEFAULT NULL COMMENT '封面图',
`ipfs_url` varchar(255) DEFAULT NULL COMMENT 'IPFS地址',
`status` tinyint(1) DEFAULT NULL COMMENT '状态(0初始化1待拉取2拉取中3已拉取4拉取失败)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(50) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `contract_addr_unq` (`contract_address`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='NFT项目';
这里调用Get NFT collection metadata 的接口即可,一次可拿到基础数据。
分页拉取NFT详细数据
由于每个NFT都有独立的IPFS文件、名称等数据,因此我们需要先快速扫完全部的NFT,幸运的是Get NFT collection items 为我们提供了分页查询接口。将查询的数据存入表project_nft_item即可:
CREATE TABLE `project_nft_item` (
`id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'PK',
`chain_id` varchar(50) NOT NULL COMMENT '链id',
`project_id` varchar(32) NOT NULL COMMENT '项目ID',
`nft_name` varchar(50) DEFAULT NULL COMMENT 'NFT名字',
`contract_address` varchar(50) DEFAULT NULL COMMENT '合约地址',
`card_nft_name` varchar(100) DEFAULT NULL COMMENT '艺术品名称',
`art_type` tinyint(1) DEFAULT '1' COMMENT '艺术品类型',
`token_id` varchar(10) NOT NULL COMMENT 'tokenId',
`multifile_type` varchar(50) DEFAULT NULL COMMENT '文件格式video/mp4,3dmodel/glb,image',
`ipfs_url` varchar(255) DEFAULT NULL COMMENT 'ipfs链接',
`nft_img_url` varchar(255) DEFAULT NULL COMMENT '藏品oss地址',
`create_time_stamp` bigint(13) DEFAULT NULL COMMENT '13位时间戳',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`description` text COMMENT '作品简介 一句话描述',
`oss_url_compress` varchar(255) DEFAULT NULL COMMENT '作品卡图片地址-压缩图',
`sub_picture` varchar(255) DEFAULT NULL COMMENT '视频主图',
`multfile_compress` varchar(255) DEFAULT NULL COMMENT '视频压缩文件',
`ipfs_address` varchar(255) DEFAULT NULL COMMENT 'ipfs源文件存储地址',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`version` int(11) DEFAULT '0' COMMENT '版本号',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `contract_token_unq` (`contract_address`,`token_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='NFT表';
注意:这里的IPFS文件尚未解析,因此NFT的图片我们无法获取到,下一节将讲解具体到扫描过程以及IPFS解析和图片下载过程。