src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -178,4 +178,6 @@ public static final String IDO_BOX_PRIZE = "IDO_BOX_PRIZE"; public static final String REDIS_KEY_SYMBOL_DAILY_PRICE = "SYMBOL_DAILY_PRICE"; public static final BigDecimal NFT_ACTIVE_PRICE = new BigDecimal("30"); } src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -20,8 +20,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; /** * @author * @author * @date 2022-03-17 **/ @Slf4j @@ -97,4 +99,17 @@ redisUtils.hdel(AppContants.REDIS_KEY_SIGN, member.getAddress()); return new FebsResponse().success(); } @ApiOperation(value = "激活卡牌", notes = "激活卡牌") @PostMapping(value = "/activeNft") public FebsResponse activeNft(@RequestBody @Valid ActiveDto activeDto) { dappWalletService.activeNft(activeDto); return new FebsResponse().success(); } @ApiOperation(value = "卡牌列表", notes = "卡牌列表") @PostMapping(value = "/findNftList") public FebsResponse findNftList() { return null; } } src/main/java/cc/mrbird/febs/dapp/dto/ActiveDto.java
New file @@ -0,0 +1,24 @@ package cc.mrbird.febs.dapp.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; /** * @author wzy * @date 2022-08-11 **/ @Data @ApiModel(value = "ActiveDto", description = "激活卡牌参数接收类") public class ActiveDto { @NotNull(message = "参数错误") @ApiModelProperty(value = "id") private Long id; @NotNull(message = "参数错误") @ApiModelProperty(value = "交易哈希") private String txHash; } src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -47,7 +47,7 @@ private BigDecimal amount; /** * 类型 1-买入 2-卖出 3-采矿 4-返利 5-获取盲盒 6-开盲盒获取卡牌 7-推荐奖励 * 类型 1-买入 2-卖出 3-采矿 4-返利 5-获取盲盒 6-开盲盒获取卡牌 7-推荐奖励 8-激活盲盒 */ private Integer type; src/main/java/cc/mrbird/febs/dapp/entity/DappNftActivation.java
New file @@ -0,0 +1,29 @@ package cc.mrbird.febs.dapp.entity; import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.Date; /** * @author wzy * @date 2022-08-11 **/ @Data @TableName("dapp_nft_activation") public class DappNftActivation extends BaseEntity { private Long memberId; private Integer tokenId; private String hash; private Date openTime; private Integer status; private Long flowId; } src/main/java/cc/mrbird/febs/dapp/mapper/DappNftActivationDao.java
New file @@ -0,0 +1,9 @@ package cc.mrbird.febs.dapp.mapper; import cc.mrbird.febs.dapp.entity.DappNftActivation; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import java.util.List; public interface DappNftActivationDao extends BaseMapper<DappNftActivation> { } src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -1,14 +1,12 @@ package cc.mrbird.febs.dapp.service; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.dapp.dto.PriceDto; import cc.mrbird.febs.dapp.dto.RecordInPageDto; import cc.mrbird.febs.dapp.dto.TransferDto; import cc.mrbird.febs.dapp.dto.WalletOperateDto; import cc.mrbird.febs.dapp.dto.*; import cc.mrbird.febs.dapp.entity.DappAccountMoneyChangeEntity; import cc.mrbird.febs.dapp.entity.DappFundFlowEntity; import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity; import cc.mrbird.febs.dapp.entity.DappWalletMineEntity; import cc.mrbird.febs.dapp.vo.ActiveNftListVo; import cc.mrbird.febs.dapp.vo.WalletInfoVo; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -41,4 +39,9 @@ Map<String, BigDecimal> calPrice(PriceDto priceDto); int boxSurprise(); void activeNft(ActiveDto activeDto); List<ActiveNftListVo> findUnActiveNftList(); } src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -10,17 +10,20 @@ import cc.mrbird.febs.dapp.chain.ChainEnum; import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.chain.ContractChainService; import cc.mrbird.febs.dapp.dto.PriceDto; import cc.mrbird.febs.dapp.dto.RecordInPageDto; import cc.mrbird.febs.dapp.dto.TransferDto; import cc.mrbird.febs.dapp.dto.WalletOperateDto; import cc.mrbird.febs.dapp.dto.*; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappSystemService; import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.utils.BoxUtil; import cc.mrbird.febs.dapp.vo.ActiveNftListVo; import cc.mrbird.febs.dapp.vo.WalletInfoVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -30,9 +33,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; /** * @author @@ -51,6 +52,7 @@ private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final DappSystemService dappSystemService; private final DappNftActivationDao dappNftActivationDao; @Override public WalletInfoVo walletInfo() { @@ -367,6 +369,7 @@ HashMap<String, BigDecimal> map = new HashMap<>(); map.put("x", x); map.put("y", y); map.put("nft", AppContants.NFT_ACTIVE_PRICE); return map; } @@ -407,4 +410,47 @@ // // return box.getIndex(); } @Override @Transactional(rollbackFor = Exception.class) public void activeNft(ActiveDto activeDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), BigDecimal.ONE, 8, 1, BigDecimal.ZERO, activeDto.getTxHash()); fundFlow.setNewestPrice(AppContants.NFT_ACTIVE_PRICE); dappFundFlowDao.insert(fundFlow); DappNftActivation nftActive = dappNftActivationDao.selectById(activeDto.getId()); if (nftActive.getStatus() != 1) { throw new FebsException(MessageSourceUtils.getString("nft_active_001")); } nftActive.setStatus(2); dappNftActivationDao.updateById(nftActive); } @Override public List<ActiveNftListVo> findUnActiveNftList() { DappMemberEntity member = LoginUserUtil.getAppUser(); List<ActiveNftListVo> list = new ArrayList<>(); UpdateWrapper<DappNftActivation> query = new UpdateWrapper<>(); query.eq("status", 3); query.eq("member_id", member.getId()); List<DappNftActivation> nftActivations = dappNftActivationDao.selectList(query); if (CollUtil.isEmpty(nftActivations)) { return list; } Date now = new Date(); nftActivations.forEach(nft -> { ActiveNftListVo nftVo = new ActiveNftListVo(); nftVo.setId(nft.getId()); nftVo.setRemain(DateUtil.between(nft.getOpenTime(), now, DateUnit.SECOND, false)); list.add(nftVo); }); return list; } } src/main/java/cc/mrbird/febs/dapp/vo/ActiveNftListVo.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.dapp.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author wzy * @date 2022-08-11 **/ @Data @ApiModel(value = "ActiveNftListVo", description = "卡牌列表") public class ActiveNftListVo { @ApiModelProperty(value = "待激活卡牌ID") private Long id; @ApiModelProperty(value = "倒计时(剩余多少秒)") private Long remain; } src/main/resources/i18n/message_en_US.properties
@@ -12,4 +12,6 @@ box_surprise_002=Feature upgrade system_regist_error=Please contact the recommender to recommend registration. system_regist_error=Please contact the recommender to recommend registration. nft_active_001=Do Not Repeat Activation src/main/resources/i18n/message_zh_CN.properties
@@ -1,14 +1,16 @@ system_error=\u7cfb\u7edf\u5f02\u5e38 system_error=\u7CFB\u7EDF\u5F02\u5E38 transfer_msg_001=\u7cfb\u7edf\u672a\u542f\u52a8 transfer_msg_002=\u5269\u4f59\u0055\u0053\u0044\u0054\u4e0d\u8db3 transfer_msg_003=\u8d85\u51fa\u0032\u0034\u5c0f\u65f6\u53ef\u7528\u6570\u91cf transfer_msg_004=\u0054\u0046\u0043\u5e01\u4e0d\u8db3 transfer_msg_005=\u4f4e\u4e8e\u6700\u5c0f\u8d2d\u4e70\u91cf transfer_msg_006=\u0054\u0046\u0043\u5e01\u4e0d\u8db3 transfer_msg_007=\u6bcf\u5929\u6700\u591a\u8d2d\u4e70\u0031\u0030\u0030\u0030\u0055\u0053\u0044\u0054 transfer_msg_001=\u7CFB\u7EDF\u672A\u542F\u52A8 transfer_msg_002=\u5269\u4F59USDT\u4E0D\u8DB3 transfer_msg_003=\u8D85\u51FA24\u5C0F\u65F6\u53EF\u7528\u6570\u91CF transfer_msg_004=TFC\u5E01\u4E0D\u8DB3 transfer_msg_005=\u4F4E\u4E8E\u6700\u5C0F\u8D2D\u4E70\u91CF transfer_msg_006=TFC\u5E01\u4E0D\u8DB3 transfer_msg_007=\u6BCF\u5929\u6700\u591A\u8D2D\u4E701000USDT box_surprise_001=\u76f2\u76d2\u6570\u91cf\u4e0d\u8db3 box_surprise_002=\u529f\u80fd\u5347\u7ea7\u4e2d box_surprise_001=\u76F2\u76D2\u6570\u91CF\u4E0D\u8DB3 box_surprise_002=\u529F\u80FD\u5347\u7EA7\u4E2D system_regist_error=\u8bf7\u8054\u7cfb\u63a8\u8350\u4eba\u63a8\u8350\u6ce8\u518c system_regist_error=\u8BF7\u8054\u7CFB\u63A8\u8350\u4EBA\u63A8\u8350\u6CE8\u518C nft_active_001=\u8BF7\u52FF\u91CD\u590D\u6FC0\u6D3B src/main/resources/mapper/dapp/DappNftActivationDao.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.dapp.mapper.DappNftActivationDao"> </mapper> src/main/resources/spy.properties
@@ -1,13 +1,13 @@ # p6spyÅäÖã¬Îĵµ https://p6spy.readthedocs.io/en/latest/configandusage.html # ʹÓÃÈÕ־ϵͳ¼Ç¼ sql # p6spy\u914D\u7F6E\uFF0C\u6587\u6863 https://p6spy.readthedocs.io/en/latest/configandusage.html # \u4F7F\u7528\u65E5\u5FD7\u7CFB\u7EDF\u8BB0\u5F55 sql appender=com.p6spy.engine.spy.appender.Slf4JLogger # ×Ô¶¨ÒåÈÕÖ¾´òÓ¡ # \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370 logMessageFormat=cc.mrbird.febs.common.configure.P6spySqlFormatConfigure # ÊÇ·ñ¿ªÆôÂý SQL¼Ç¼ # \u662F\u5426\u5F00\u542F\u6162 SQL\u8BB0\u5F55 outagedetection=true # Âý SQL¼Ç¼±ê×¼ 2 Ãë # \u6162 SQL\u8BB0\u5F55\u6807\u51C6 2 \u79D2 outagedetectioninterval=2 # ¿ªÆô¹ýÂË # \u5F00\u542F\u8FC7\u6EE4 filter=true # °üº¬ QRTZµÄ²»´òÓ¡ # \u5305\u542B QRTZ\u7684\u4E0D\u6253\u5370 exclude=QRTZ,select 1