Commit bcc913ef authored by tangtuo's avatar tangtuo

dev

parent 9f100031
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
<dependency> <dependency>
<groupId>cn.fzm.chain</groupId> <groupId>cn.fzm.chain</groupId>
<artifactId>simple-sdk</artifactId> <artifactId>simple-sdk</artifactId>
<version>2.2.1</version> <version>2.6.1</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
......
...@@ -32,6 +32,9 @@ public class RedisConstant { ...@@ -32,6 +32,9 @@ public class RedisConstant {
public static final String COMMEMORATE_NFT_MEMBERS_PREFIX = "commemorateNft:members:"; public static final String COMMEMORATE_NFT_MEMBERS_PREFIX = "commemorateNft:members:";
public static final String PUBLISH_NFT_PREFIX = "NFT:";
} }
...@@ -15,4 +15,6 @@ public class SystemConstant { ...@@ -15,4 +15,6 @@ public class SystemConstant {
*/ */
public static final Integer BOOLEAN_DATA_TRUE = 1; public static final Integer BOOLEAN_DATA_TRUE = 1;
public static final Integer BOOLEAN_DATA_FALSE = 0; public static final Integer BOOLEAN_DATA_FALSE = 0;
public static final String NULL_TOKEN = "Bearer null";
} }
...@@ -42,6 +42,9 @@ public class Nft extends BaseEntity { ...@@ -42,6 +42,9 @@ public class Nft extends BaseEntity {
@ApiModelProperty("简介") @ApiModelProperty("简介")
private String synopsis; private String synopsis;
@ApiModelProperty("封面")
private String cover;
@ApiModelProperty("nft编号") @ApiModelProperty("nft编号")
private String nftNum; private String nftNum;
......
...@@ -17,27 +17,19 @@ public class CollectionNftVo { ...@@ -17,27 +17,19 @@ public class CollectionNftVo {
@ApiModelProperty("主键") @ApiModelProperty("主键")
private Integer id; private Integer id;
@ApiModelProperty("类目") @ApiModelProperty("一级类目")
private String category; private String category;
@ApiModelProperty("二级类目")
private String secondCategory;
@ApiModelProperty("名称") @ApiModelProperty("名称")
private String name; private String name;
@ApiModelProperty("封面") @ApiModelProperty("封面")
private String cover; private String cover;
@ApiModelProperty("主题,多个用逗号,隔开")
private String theme;
@ApiModelProperty("nft编号") @ApiModelProperty("nft编号")
private String nftId; private String nftNum;
@ApiModelProperty("是否是纪念版nft 0-否 1-是")
private Integer isCommemorate;
public CollectionNftVo(Nft nft, Category category) {
this.id = nft.getId();
this.category = category.getText();
this.name = nft.getName();
}
} }
...@@ -2,11 +2,15 @@ package com.fzm.common.entity.vo; ...@@ -2,11 +2,15 @@ package com.fzm.common.entity.vo;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.fzm.common.entity.Nft; import com.fzm.common.entity.Nft;
import com.fzm.common.entity.NftFile;
import com.fzm.common.entity.User; import com.fzm.common.entity.User;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import sun.management.counter.perf.PerfInstrumentation; import sun.management.counter.perf.PerfInstrumentation;
import java.util.Date;
import java.util.List;
/** /**
* @author tangtuo * @author tangtuo
* @date 2021/7/1 10:35 * @date 2021/7/1 10:35
...@@ -23,62 +27,36 @@ public class NftVo { ...@@ -23,62 +27,36 @@ public class NftVo {
@ApiModelProperty("名称") @ApiModelProperty("名称")
private String name; private String name;
@ApiModelProperty("封面") @ApiModelProperty("作者")
private String cover; private String author;
@ApiModelProperty("类目") @ApiModelProperty("类目")
private String category; private String category;
@ApiModelProperty("主题,多个用逗号,隔开")
private String theme;
@ApiModelProperty("发行人") @ApiModelProperty("发行人")
private String publisher; private String publisher;
@ApiModelProperty("头像")
private String avatar;
@ApiModelProperty("钱包地址") @ApiModelProperty("钱包地址")
private String wallet; private String wallet;
@ApiModelProperty("nft编号")
private String nftId;
@ApiModelProperty("剧本hash")
private String fileHash;
@ApiModelProperty("文件名")
private String fileName;
@ApiModelProperty("文件地址")
private String fileUrl;
@ApiModelProperty("nft哈希") @ApiModelProperty("nft哈希")
private String nftHash; private String nftHash;
@ApiModelProperty("发行时间") @ApiModelProperty("发行时间")
private String publishTime; private Date publishTime;
@ApiModelProperty("作者")
private String author;
@ApiModelProperty("简介") @ApiModelProperty("简介")
private String synopsis; private String synopsis;
@ApiModelProperty("平台存档 0-不存档 1-加密存档") @ApiModelProperty("nft编号")
private Integer isArchives; private String nftNum;
@ApiModelProperty("授权阅读 0-不需要授权 1-需要授权")
private Integer isGrant;
@ApiModelProperty("是否收藏") @ApiModelProperty("是否收藏")
private Boolean collection; private Boolean collection;
@ApiModelProperty("关于nft") @ApiModelProperty("文件列表")
private String aboutNft; private List<NftFile> fileList;
@ApiModelProperty("是否是纪念版nft 0-否 1-是")
private Integer isCommemorate;
public NftVo(Nft nft, User user) { public NftVo(Nft nft, User user) {
this.id = nft.getId(); this.id = nft.getId();
...@@ -86,11 +64,11 @@ public class NftVo { ...@@ -86,11 +64,11 @@ public class NftVo {
this.name = nft.getName(); this.name = nft.getName();
this.synopsis = nft.getSynopsis(); this.synopsis = nft.getSynopsis();
this.publisher = user.getNickname(); this.publisher = user.getNickname();
this.avatar = user.getAvatar();
this.wallet = nft.getPublishAddress(); this.wallet = nft.getPublishAddress();
this.publishTime = DateUtil.format(nft.getPublishTime(), "yyyy/MM/dd HH:mm:ss"); this.publishTime = nft.getPublishTime();
this.userId = nft.getUserId(); this.userId = nft.getUserId();
this.collection = false; this.collection = false;
this.nftHash = nft.getNftHash(); this.nftHash = nft.getNftHash();
this.nftNum = nft.getNftNum();
} }
} }
...@@ -42,4 +42,7 @@ public interface NftMapper extends BaseMapper<Nft> { ...@@ -42,4 +42,7 @@ public interface NftMapper extends BaseMapper<Nft> {
* @return * @return
*/ */
List<NftListVo> page(@Param("categoryId") Integer categoryId, @Param("name") String name, @Param("telephone") String telephone, @Param("theme") String theme, @Param("status") Integer status, @Param("startDate") DateTime startDate, @Param("endDate") DateTime endDate); List<NftListVo> page(@Param("categoryId") Integer categoryId, @Param("name") String name, @Param("telephone") String telephone, @Param("theme") String theme, @Param("status") Integer status, @Param("startDate") DateTime startDate, @Param("endDate") DateTime endDate);
List<CollectionNftVo> listCurrent(@Param("categoryId") Integer categoryId, @Param("userId") Integer userId);
} }
...@@ -11,9 +11,6 @@ import java.util.List; ...@@ -11,9 +11,6 @@ import java.util.List;
*/ */
public interface CategoryService extends IService<Category> { public interface CategoryService extends IService<Category> {
Category getCategoryById(Integer categoryId);
/** /**
* 根据pid查新类目列表 * 根据pid查新类目列表
* *
......
...@@ -4,9 +4,19 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -4,9 +4,19 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.fzm.common.entity.AuthPerson; import com.fzm.common.entity.AuthPerson;
import com.fzm.common.entity.NftFile; import com.fzm.common.entity.NftFile;
import java.util.List;
/** /**
* @author tangtuo * @author tangtuo
* @date 2021/6/28 11:28 * @date 2021/6/28 11:28
*/ */
public interface NftFileService extends IService<NftFile> { public interface NftFileService extends IService<NftFile> {
/**
* 查询nft的文件列表
*
* @param nftId
* @return
*/
List<NftFile> getByNftId(Integer nftId);
} }
...@@ -49,7 +49,7 @@ public interface NftService extends IService<Nft> { ...@@ -49,7 +49,7 @@ public interface NftService extends IService<Nft> {
* @param userId * @param userId
* @return * @return
*/ */
List<Nft> listCurrent(Integer categoryId, Integer userId); List<CollectionNftVo> listCurrent(Integer categoryId, Integer userId);
/** /**
* 生成nft编号 * 生成nft编号
......
...@@ -23,17 +23,6 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i ...@@ -23,17 +23,6 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
private CategoryMapper categoryMapper; private CategoryMapper categoryMapper;
@Override @Override
public Category getCategoryById(Integer categoryId) {
List<Category> list = list();
for (Category category : list) {
if (categoryId.equals(category.getId())) {
return category;
}
}
return null;
}
@Override
@Cacheable(value = "category:list", key = "#pid") @Cacheable(value = "category:list", key = "#pid")
public List<Category> getByPid(Integer pid) { public List<Category> getByPid(Integer pid) {
QueryWrapper<Category> queryWrapper = new QueryWrapper<>(); QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
......
package com.fzm.common.service.impl; package com.fzm.common.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.common.entity.AuthPerson; import com.fzm.common.entity.AuthPerson;
import com.fzm.common.entity.NftFile; import com.fzm.common.entity.NftFile;
import com.fzm.common.mapper.AuthPersonMapper; import com.fzm.common.mapper.AuthPersonMapper;
import com.fzm.common.mapper.NftFileMapper; import com.fzm.common.mapper.NftFileMapper;
import com.fzm.common.mapper.NftMapper;
import com.fzm.common.service.AuthPersonService; import com.fzm.common.service.AuthPersonService;
import com.fzm.common.service.NftFileService; import com.fzm.common.service.NftFileService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/** /**
* @author tangtuo * @author tangtuo
* @date 2021/6/28 11:29 * @date 2021/6/28 11:29
*/ */
@Service @Service
public class NftFileServiceImpl extends ServiceImpl<NftFileMapper, NftFile> implements NftFileService { public class NftFileServiceImpl extends ServiceImpl<NftFileMapper, NftFile> implements NftFileService {
@Resource
private NftFileMapper nftFileMapper;
@Override
public List<NftFile> getByNftId(Integer nftId) {
QueryWrapper<NftFile> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("nft_id", nftId);
return nftFileMapper.selectList(queryWrapper);
}
} }
package com.fzm.common.service.impl; package com.fzm.common.service.impl;
import cn.fzm.chain.simplesdk.client.ParaChainClient; import cn.fzm.chain.simplesdk.client.ParaChainClient;
import cn.fzm.chain.simplesdk.constant.EvmTransferEnum;
import cn.fzm.chain.simplesdk.constant.TxStatusEnum; import cn.fzm.chain.simplesdk.constant.TxStatusEnum;
import cn.fzm.chain.simplesdk.model.TxResult; import cn.fzm.chain.simplesdk.model.TxResult;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
...@@ -81,27 +86,40 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe ...@@ -81,27 +86,40 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe
@Value("${chain.para.contract-name}") @Value("${chain.para.contract-name}")
private String contractName; private String contractName;
@Value("${chain.para.contract-address}")
private String contractAddr;
@Override @Override
public Integer publish(NftDto nftDto) { public Integer publish(NftDto nftDto) {
User user = userService.getUserByToken(); User user = userService.getUserByToken();
String wallet = user.getWallet(); String wallet = user.getWallet();
// 把用户填写的信息加入到缓存中
String key = RedisConstant.PUBLISH_NFT_PREFIX + user.getId();
redisUtil.set(key, JSONUtil.toJsonStr(nftDto));
// 获取用户的私钥 // 获取用户的私钥
String privkey = paraChainClient.walletDumpPrivkey(wallet); String privkey = paraChainClient.walletDumpPrivkey(wallet);
// 生产tokenId
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long tokenId = snowflake.nextId();
Map<String, Object> map = new HashMap<>();
map.put("publishAddress", wallet);
List<String> fileHashs = nftDto.getFileList().stream().map(NftFile::getFileHash).collect(Collectors.toList());
map.put("hash", fileHashs);
String str = JSONUtil.toJsonStr(map);
String tokenInfo = HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8);
log.info("tokenInfo:{}", tokenInfo);
// 发行nft
String abi = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getTokenInfo\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenInfo\",\"type\":\"string\"}],\"name\":\"setTokenInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]";
String hash = paraChainClient.evmPublishToken(abi, contractAddr, EvmTransferEnum.ERC1155, 1000000L, wallet, privkey, tokenId, 1, str, true);
// 发行nft // 发行nft
String txHash = paraChainClient.evmPublishNFT1155(contractName, wallet, privkey, nftDto.getPublishCount(), true); if (StringUtils.isBlank(hash)) {
if (StringUtils.isBlank(txHash) || !txHash.contains("-")) {
throw GlobalException.newException(ResultCode.FAILED, "nft发行失败"); throw GlobalException.newException(ResultCode.FAILED, "nft发行失败");
} }
String[] split = txHash.split("-"); String tradeHash = paraChainClient.evmSetTokenInfoNew(abi, contractAddr, 1000000L, tokenId, tokenInfo, wallet, privkey, true);
String hash = split[0];
long tokenId = Long.parseLong(split[1]);
HashMap<String, Object> map = new HashMap<>();
String tradeHash = paraChainClient.evmSetTokenInfo(contractName, tokenId, JSONUtil.toJsonStr(map), wallet, privkey, true);
if (StringUtils.isBlank(tradeHash)) { if (StringUtils.isBlank(tradeHash)) {
throw GlobalException.newException(ResultCode.PUBLISH_ERROR, "nft发行失败"); throw GlobalException.newException(ResultCode.PUBLISH_ERROR, "nft发行失败");
} }
log.info("tokenInfo:{}", paraChainClient.evmGetTokenInfo(contractName, paraChainClient.evmQueryAddrByName(contractName), tokenId, wallet));
// 确认交易结果 // 确认交易结果
TxResult txResult = paraChainClient.cycleConfirmTxWithHash(hash, true, 1000); TxResult txResult = paraChainClient.cycleConfirmTxWithHash(hash, true, 1000);
if (!TxStatusEnum.SUCCESS.equals(txResult.getStatus())) { if (!TxStatusEnum.SUCCESS.equals(txResult.getStatus())) {
...@@ -122,6 +140,7 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe ...@@ -122,6 +140,7 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe
nft.setTokenId(tokenId); nft.setTokenId(tokenId);
nft.setPublishTime(new Date()); nft.setPublishTime(new Date());
nft.setPublishAddress(wallet); nft.setPublishAddress(wallet);
nft.setCover(nftDto.getFileList().get(0).getFileUrl());
save(nft); save(nft);
List<NftFile> fileList = nftDto.getFileList(); List<NftFile> fileList = nftDto.getFileList();
fileList.forEach(file -> file.setNftId(nft.getId())); fileList.forEach(file -> file.setNftId(nft.getId()));
...@@ -133,6 +152,8 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe ...@@ -133,6 +152,8 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe
userService.updateById(u); userService.updateById(u);
redisUtil.delete("user::statistic"); redisUtil.delete("user::statistic");
} }
// 发行成功,删除缓存
redisUtil.delete(key);
return nft.getId(); return nft.getId();
} }
...@@ -160,8 +181,10 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe ...@@ -160,8 +181,10 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe
if (user.getWallet().equals(receiveUser.getWallet())) { if (user.getWallet().equals(receiveUser.getWallet())) {
throw GlobalException.newException(ResultCode.TRANSFER_ERROR, "不能向自己转让nft"); throw GlobalException.newException(ResultCode.TRANSFER_ERROR, "不能向自己转让nft");
} }
String abi = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getTokenInfo\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenInfo\",\"type\":\"string\"}],\"name\":\"setTokenInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]";
String tokenInfo = paraChainClient.evmGetTokenInfoNew(abi, contractAddr, nft.getTokenId(), user.getWallet());
// 转让nft // 转让nft
String hash = paraChainClient.evmTransferNFT1155(contractName, user.getWallet(), null, param.getReceiveWallet(), nft.getTokenId(), param.getCount(), true); String hash = paraChainClient.evmTransferNew(abi, contractAddr, EvmTransferEnum.ERC1155, 1000000L, param.getReceiveWallet(), nft.getTokenId(), param.getCount(), tokenInfo, user.getWallet(), null, true);
if (StringUtils.isBlank(hash)) { if (StringUtils.isBlank(hash)) {
throw GlobalException.newException(ResultCode.TRANSFER_ERROR, "nft领取失败"); throw GlobalException.newException(ResultCode.TRANSFER_ERROR, "nft领取失败");
} }
...@@ -257,15 +280,8 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe ...@@ -257,15 +280,8 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe
} }
@Override @Override
public List<Nft> listCurrent(Integer categoryId, Integer userId) { public List<CollectionNftVo> listCurrent(Integer categoryId, Integer userId) {
QueryWrapper<Nft> queryWrapper = new QueryWrapper<>(); return nftMapper.listCurrent(categoryId, userId);
queryWrapper.eq("user_id", userId);
queryWrapper.ne("nft_hash", "");
if (categoryId != null) {
queryWrapper.eq("category_id", categoryId);
}
queryWrapper.orderByDesc("publish_time");
return nftMapper.selectList(queryWrapper);
} }
@Override @Override
...@@ -338,4 +354,9 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe ...@@ -338,4 +354,9 @@ public class NftServiceImpl extends ServiceImpl<NftMapper, Nft> implements NftSe
} }
public static void main(String[] args) {
String str = "{\"author\":\"金庸\",\"publisher\":\"1boYWAeq12vkodh69nLU68WyiPuaT3ZAs\",\"hash\":\"80758630e76e5990b4de0e913ba42c5e\"}";
String hex = HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8);
System.out.println("hex = " + hex);
}
} }
...@@ -173,7 +173,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us ...@@ -173,7 +173,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
User loginUser = getUserByToken(); User loginUser = getUserByToken();
// 如果不是第一次上传头像,需要删除旧头像 // 如果不是第一次上传头像,需要删除旧头像
if (StringUtils.isNotBlank(loginUser.getAvatar())) { if (StringUtils.isNotBlank(loginUser.getAvatar())) {
ossUtil.delete(loginUser.getAvatar(), ossProperties.getBucket()); ossUtil.delete(loginUser.getAvatar());
} }
User user = new User(). User user = new User().
setAvatar(avatar). setAvatar(avatar).
......
...@@ -142,16 +142,17 @@ public class OssUtil { ...@@ -142,16 +142,17 @@ public class OssUtil {
} }
} }
public void delete(String fileUrl, String bucketName) { public void delete(String fileUrl) {
String endpoint = ossProperties.getEndPoint(); String endpoint = ossProperties.getEndPoint();
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = ossProperties.getAppKey(); String accessKeyId = ossProperties.getAppKey();
String accessKeySecret = ossProperties.getAppSecret(); String accessKeySecret = ossProperties.getAppSecret();
String bucket = ossProperties.getBucket();
// <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如20210629/a8703bcf7d354ea2bbb5ccdf76b7405f/123.jpg。 // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如20210629/a8703bcf7d354ea2bbb5ccdf76b7405f/123.jpg。
String objectName = fileUrl.replace(String.format("https://%s.%s/", bucketName, endpoint), ""); String objectName = fileUrl.replace(String.format("https://%s.%s/", bucket, endpoint), "");
// 创建OSSClient实例。 // 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.deleteObject(bucketName, objectName); ossClient.deleteObject(bucket, objectName);
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<select id="list" resultType="com.fzm.common.entity.Nft"> <select id="list" resultType="com.fzm.common.entity.Nft">
select * from tb_nft select * from tb_nft
where status = 1 and is_commemorate=0 and nft_hash != '' where status = 1
<if test="categoryId != null and categoryId > 0"> <if test="categoryId != null and categoryId > 0">
and category_id=#{categoryId} and category_id=#{categoryId}
</if> </if>
...@@ -16,10 +16,8 @@ ...@@ -16,10 +16,8 @@
select a.id, select a.id,
a.name, a.name,
a.cover, a.cover,
a.theme, a.nft_num,
a.nft_id, b.text as category
a.is_commemorate,
b.category_name as category
from tb_nft a left join tb_category b on a.category_id = b.id from tb_nft a left join tb_category b on a.category_id = b.id
where a.id in ( where a.id in (
<foreach collection="list" item="id" separator=","> <foreach collection="list" item="id" separator=",">
...@@ -44,17 +42,13 @@ ...@@ -44,17 +42,13 @@
tb_nft n tb_nft n
LEFT JOIN tb_user u ON n.publish_address = u.wallet LEFT JOIN tb_user u ON n.publish_address = u.wallet
LEFT JOIN tb_category c ON n.category_id = c.id LEFT JOIN tb_category c ON n.category_id = c.id
WHERE <where>
is_commemorate=0 and nft_hash != ''
<if test="name != null and name != ''"> <if test="name != null and name != ''">
and n.name like concat ('%',#{name},'%') and n.name like concat ('%',#{name},'%')
</if> </if>
<if test="categoryId != null"> <if test="categoryId != null">
and n.category_id = #{categoryId} and n.category_id = #{categoryId}
</if> </if>
<if test="theme != null and theme != ''">
and FIND_IN_SET(#{theme},n.theme)
</if>
<if test="categoryId != null"> <if test="categoryId != null">
and n.category_id = #{categoryId} and n.category_id = #{categoryId}
</if> </if>
...@@ -70,10 +64,29 @@ ...@@ -70,10 +64,29 @@
<if test="endDate != null"> <if test="endDate != null">
and n.create_date &lt;= #{endDate} and n.create_date &lt;= #{endDate}
</if> </if>
</where>
ORDER BY ORDER BY
is_top DESC, is_top DESC,
`status` DESC, `status` DESC,
publish_time DESC publish_time DESC
</select> </select>
<select id="listCurrent" resultType="com.fzm.common.entity.vo.CollectionNftVo">
select a.id,
a.name,
a.cover,
a.nft_num,
b.text as category,
c.text as second_category
from tb_nft a
left join tb_category b on a.category_id = b.id
left join tb_category c on a.second_category_id = c.id
where a.user_id = #{userId}
<if test="categoryId != null">
and a.category_id = #{categoryId}
</if>
order by a.publish_time desc
</select>
</mapper> </mapper>
\ No newline at end of file
package com.fzm.portal.controller; package com.fzm.portal.controller;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.fzm.common.annotation.Authentication; import com.fzm.common.annotation.Authentication;
import com.fzm.common.constant.RedisConstant; import com.fzm.common.constant.RedisConstant;
import com.fzm.common.constant.SystemConstant;
import com.fzm.common.constant.TokenConstant; import com.fzm.common.constant.TokenConstant;
import com.fzm.common.entity.Nft; import com.fzm.common.entity.Nft;
import com.fzm.common.entity.NftDto; import com.fzm.common.entity.NftDto;
import com.fzm.common.entity.NftFile;
import com.fzm.common.entity.User; import com.fzm.common.entity.User;
import com.fzm.common.entity.vo.CollectionNftVo; import com.fzm.common.entity.vo.CollectionNftVo;
import com.fzm.common.entity.vo.NftCertificateVo; import com.fzm.common.entity.vo.NftCertificateVo;
...@@ -16,6 +19,7 @@ import com.fzm.common.exception.GlobalException; ...@@ -16,6 +19,7 @@ import com.fzm.common.exception.GlobalException;
import com.fzm.common.model.ResponseModel; import com.fzm.common.model.ResponseModel;
import com.fzm.common.params.NftTransferParam; import com.fzm.common.params.NftTransferParam;
import com.fzm.common.service.CategoryService; import com.fzm.common.service.CategoryService;
import com.fzm.common.service.NftFileService;
import com.fzm.common.service.NftService; import com.fzm.common.service.NftService;
import com.fzm.common.service.UserService; import com.fzm.common.service.UserService;
import com.fzm.common.utils.*; import com.fzm.common.utils.*;
...@@ -61,6 +65,12 @@ public class NftController { ...@@ -61,6 +65,12 @@ public class NftController {
@Resource @Resource
private HttpServletRequest request; private HttpServletRequest request;
@Resource
private OssUtil ossUtil;
@Resource
private NftFileService nftFileService;
/** /**
* 存证二维码跳转地址 * 存证二维码跳转地址
* todo 修改成动态前端路由 * todo 修改成动态前端路由
...@@ -76,6 +86,34 @@ public class NftController { ...@@ -76,6 +86,34 @@ public class NftController {
return ResponseModel.success(id); return ResponseModel.success(id);
} }
@Authentication
@GetMapping("/get/temp")
@ApiOperation("查询用户缓存的nft信息")
public ResponseModel<NftDto> getTemp(@RequestHeader(name = "Authorization") String token) {
NftDto nftDto = null;
String str = redisUtil.get(RedisConstant.PUBLISH_NFT_PREFIX + JwtUtil.getUserIdFromToken(token));
if (StringUtils.isNotBlank(str)) {
nftDto = JSONUtil.toBean(str, NftDto.class);
}
return ResponseModel.success(nftDto);
}
@Authentication
@PostMapping("/delete/temp")
@ApiOperation("删除用户缓存的nft信息")
public ResponseModel<Boolean> deleteTemp(@RequestHeader(name = "Authorization") String token) {
String key = RedisConstant.PUBLISH_NFT_PREFIX + JwtUtil.getUserIdFromToken(token);
String str = redisUtil.get(key);
if (StringUtils.isNotBlank(str)) {
NftDto nftDto = JSONUtil.toBean(str, NftDto.class);
List<NftFile> fileList = nftDto.getFileList();
// 删除oss缓存的文件
fileList.forEach(file -> ossUtil.delete(file.getFileUrl()));
}
redisUtil.delete(key);
return ResponseModel.success(true);
}
@GetMapping("/list") @GetMapping("/list")
@ApiOperation(value = "获取nft列表") @ApiOperation(value = "获取nft列表")
public ResponseModel<List<Nft>> list(@ApiParam(value = "当前页码") @RequestParam Integer pageNum, public ResponseModel<List<Nft>> list(@ApiParam(value = "当前页码") @RequestParam Integer pageNum,
...@@ -99,15 +137,13 @@ public class NftController { ...@@ -99,15 +137,13 @@ public class NftController {
throw GlobalException.newException(ResultCode.DATA_ERROR, "没找到此nft的发布人的信息"); throw GlobalException.newException(ResultCode.DATA_ERROR, "没找到此nft的发布人的信息");
} }
NftVo nftVo = new NftVo(nft, user); NftVo nftVo = new NftVo(nft, user);
nftVo.setCategory(categoryService.getById(nft.getCategoryId()).getText()); nftVo.setFileList(nftFileService.getByNftId(id));
if (StringUtils.isNotBlank(Authorization)) { nftVo.setCategory(categoryService.getById(nft.getSecondCategoryId()).getText());
String realToken = Authorization.substring(TokenConstant.TOKEN_PREFIX.length()); if (StringUtils.isNotBlank(Authorization) && !Authorization.startsWith(SystemConstant.NULL_TOKEN)) {
if (StringUtils.isNotBlank(realToken) && !"null".equals(realToken)) {
Integer userId = JwtUtil.getUserIdFromToken(Authorization); Integer userId = JwtUtil.getUserIdFromToken(Authorization);
Boolean collection = redisUtil.sIsMember(RedisConstant.COLLECTION_USER_PREFIX + userId, id.toString()); Boolean collection = redisUtil.sIsMember(RedisConstant.COLLECTION_USER_PREFIX + userId, id.toString());
nftVo.setCollection(collection); nftVo.setCollection(collection);
} }
}
return ResponseModel.success(nftVo); return ResponseModel.success(nftVo);
} }
...@@ -116,10 +152,7 @@ public class NftController { ...@@ -116,10 +152,7 @@ public class NftController {
@ApiOperation(value = "获取我的nft列表") @ApiOperation(value = "获取我的nft列表")
public ResponseModel<Map<String, Object>> listCurrent(@ApiParam(value = "类目id,查询全部的时候传null") @RequestParam(required = false) Integer categoryId) throws Exception { public ResponseModel<Map<String, Object>> listCurrent(@ApiParam(value = "类目id,查询全部的时候传null") @RequestParam(required = false) Integer categoryId) throws Exception {
Integer userId = JwtUtil.getUserIdFromToken(request.getHeader("Authorization")); Integer userId = JwtUtil.getUserIdFromToken(request.getHeader("Authorization"));
List<Nft> list = nftService.listCurrent(categoryId, userId); List<CollectionNftVo> list = nftService.listCurrent(categoryId, userId);
List<CollectionNftVo> nftVoList = list.stream()
.map(nft -> new CollectionNftVo(nft, categoryService.getCategoryById(nft.getId())))
.collect(Collectors.toList());
User user = userService.getById(userId); User user = userService.getById(userId);
// 生成二维码 // 生成二维码
HashMap<String, Object> qrCodeMap = new HashMap<>(); HashMap<String, Object> qrCodeMap = new HashMap<>();
...@@ -128,21 +161,13 @@ public class NftController { ...@@ -128,21 +161,13 @@ public class NftController {
qrCodeMap.put("wallet", user.getWallet()); qrCodeMap.put("wallet", user.getWallet());
String qrCode = QRCodeUtil.encode(JsonUtil.toJson(qrCodeMap), null, false); String qrCode = QRCodeUtil.encode(JsonUtil.toJson(qrCodeMap), null, false);
HashMap<String, Object> result = new HashMap<>(8); HashMap<String, Object> result = new HashMap<>(8);
result.put("list", nftVoList); result.put("list", list);
result.put("size", nftVoList.size()); result.put("size", list.size());
result.put("qrCode", qrCode); result.put("qrCode", qrCode);
return ResponseModel.success(result); return ResponseModel.success(result);
} }
@Authentication @Authentication
@GetMapping("/generateNftId")
@ApiOperation(value = "生成nft编号")
public ResponseModel<String> generateNftId(@ApiParam(value = "类目id", required = true) @RequestParam Integer categoryId) {
String nftId = nftService.generateNftId(categoryId);
return ResponseModel.success(nftId);
}
@Authentication
@PostMapping("/file/md5") @PostMapping("/file/md5")
@ApiOperation(value = "获取文件的md5值") @ApiOperation(value = "获取文件的md5值")
public ResponseModel<String> getFileMd5Value(MultipartFile file) throws IOException { public ResponseModel<String> getFileMd5Value(MultipartFile file) throws IOException {
......
package com.fzm.portal.controller; package com.fzm.portal.controller;
import cn.hutool.json.JSONUtil;
import com.fzm.common.annotation.Authentication; import com.fzm.common.annotation.Authentication;
import com.fzm.common.constant.RedisConstant;
import com.fzm.common.entity.NftDto;
import com.fzm.common.entity.NftFile;
import com.fzm.common.model.ResponseModel; import com.fzm.common.model.ResponseModel;
import com.fzm.common.utils.JwtUtil;
import com.fzm.common.utils.OssUtil; import com.fzm.common.utils.OssUtil;
import com.fzm.common.utils.RedisUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping; import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -27,6 +32,9 @@ public class OssController { ...@@ -27,6 +32,9 @@ public class OssController {
@Resource @Resource
private OssUtil ossUtil; private OssUtil ossUtil;
@Resource
private RedisUtil redisUtil;
@Authentication @Authentication
@GetMapping("/policy") @GetMapping("/policy")
@ApiOperation("完成oss签名") @ApiOperation("完成oss签名")
...@@ -41,4 +49,27 @@ public class OssController { ...@@ -41,4 +49,27 @@ public class OssController {
public ResponseModel<String> upload(MultipartFile file) throws IOException { public ResponseModel<String> upload(MultipartFile file) throws IOException {
return ResponseModel.success(ossUtil.putObject(file)); return ResponseModel.success(ossUtil.putObject(file));
} }
@Authentication
@PostMapping("/delete")
@ApiOperation("删除文件")
public ResponseModel<Boolean> delete(@RequestParam String url, @RequestHeader(name = "Authorization") String token) {
Integer userId = JwtUtil.getUserIdFromToken(token);
String key = RedisConstant.PUBLISH_NFT_PREFIX + userId;
String str = redisUtil.get(key);
if (StringUtils.isNotBlank(str)) {
NftDto nftDto = JSONUtil.toBean(str, NftDto.class);
List<NftFile> list = nftDto.getFileList();
for (int i = 0; i < list.size(); i++) {
if (url.equals(list.get(i).getFileUrl())) {
list.remove(i);
break;
}
}
nftDto.setFileList(list);
redisUtil.set(key, JSONUtil.toJsonStr(nftDto));
}
ossUtil.delete(url);
return ResponseModel.success(true);
}
} }
...@@ -84,12 +84,12 @@ chain: ...@@ -84,12 +84,12 @@ chain:
title: user.p.joying. title: user.p.joying.
admin: 16naUoLwjNUgMhGVRmL3xTVpCso2DJp8JZ admin: 16naUoLwjNUgMhGVRmL3xTVpCso2DJp8JZ
admin-key: 8cd19e9bf39055f95e3e33cc1e08b9f9fc2e9be48a5b3a4d401e64041c97aec7 admin-key: 8cd19e9bf39055f95e3e33cc1e08b9f9fc2e9be48a5b3a4d401e64041c97aec7
contract-name: user.evm.0xd996a3a866c577596df260844a045a068ec5accd8d71ccaa3d578c9617ec5490 contract-name: user.evm.0x72ab91df57d70ddca74c219fee29a4e08632bb7b1109c1627fc11173961b180c
contract-address: 1iDWTHZQxPES4hLveZRcwJH6AMaMfZfZZ contract-address: 1ErrPnk5mocNL5k87Yx66ihqmprc8avjPJ
aliyun: aliyun:
oss: oss:
app-key: LTAI5tHGn7cVJdEtihTFLSeB app-key: LTAI5tHGn7cVJdEtihTFLSeB
app-secret: XYmfBSbLaZoblGXZwIXkbhfBD7a1eg app-secret: XYmfBSbLaZoblGXZwIXkbhfBD7a1eg
end-point: oss-cn-hangzhou.aliyuncs.com end-point: oss-cn-beijing.aliyuncs.com
bucket: test-zhuixin bucket: test-zhuixin
...@@ -77,9 +77,8 @@ aliyun: ...@@ -77,9 +77,8 @@ aliyun:
oss: oss:
app-key: LTAI5tHGn7cVJdEtihTFLSeB app-key: LTAI5tHGn7cVJdEtihTFLSeB
app-secret: XYmfBSbLaZoblGXZwIXkbhfBD7a1eg app-secret: XYmfBSbLaZoblGXZwIXkbhfBD7a1eg
end-point: oss-cn-hangzhou.aliyuncs.com end-point: oss-cn-beijing.aliyuncs.com
simple-bucket: test-nft bucket: test-zhuixin
encrypt-bucket: test-nft-2
sms: sms:
app-key: Yiru app-key: Yiru
...@@ -101,7 +100,7 @@ chain: ...@@ -101,7 +100,7 @@ chain:
title: user.p.joying. title: user.p.joying.
admin: 16naUoLwjNUgMhGVRmL3xTVpCso2DJp8JZ admin: 16naUoLwjNUgMhGVRmL3xTVpCso2DJp8JZ
admin-key: 8cd19e9bf39055f95e3e33cc1e08b9f9fc2e9be48a5b3a4d401e64041c97aec7 admin-key: 8cd19e9bf39055f95e3e33cc1e08b9f9fc2e9be48a5b3a4d401e64041c97aec7
contract-name: user.evm.0xd996a3a866c577596df260844a045a068ec5accd8d71ccaa3d578c9617ec5490 contract-name: user.evm.0x72ab91df57d70ddca74c219fee29a4e08632bb7b1109c1627fc11173961b180c
contract-address: 1iDWTHZQxPES4hLveZRcwJH6AMaMfZfZZ contract-address: 1ErrPnk5mocNL5k87Yx66ihqmprc8avjPJ
...@@ -88,8 +88,7 @@ chain: ...@@ -88,8 +88,7 @@ chain:
aliyun: aliyun:
oss: oss:
app-key: LTAI5tAAXBCtnQ2ytwagazjt app-key: LTAI5tHGn7cVJdEtihTFLSeB
app-secret: x0T6hyJvRFLtPjZYrNo5egEc4kShlU app-secret: XYmfBSbLaZoblGXZwIXkbhfBD7a1eg
end-point: oss-cn-shanghai.aliyuncs.com end-point: oss-cn-beijing.aliyuncs.com
simple-bucket: joying-file bucket: test-zhuixin
encrypt-bucket: joying-nft
...@@ -93,13 +93,12 @@ chain: ...@@ -93,13 +93,12 @@ chain:
title: user.p.joying. title: user.p.joying.
admin: 16naUoLwjNUgMhGVRmL3xTVpCso2DJp8JZ admin: 16naUoLwjNUgMhGVRmL3xTVpCso2DJp8JZ
admin-key: 8cd19e9bf39055f95e3e33cc1e08b9f9fc2e9be48a5b3a4d401e64041c97aec7 admin-key: 8cd19e9bf39055f95e3e33cc1e08b9f9fc2e9be48a5b3a4d401e64041c97aec7
contract-name: user.evm.0xd996a3a866c577596df260844a045a068ec5accd8d71ccaa3d578c9617ec5490 contract-name: user.evm.0x72ab91df57d70ddca74c219fee29a4e08632bb7b1109c1627fc11173961b180c
contract-address: 1iDWTHZQxPES4hLveZRcwJH6AMaMfZfZZ contract-address: 1ErrPnk5mocNL5k87Yx66ihqmprc8avjPJ
aliyun: aliyun:
oss: oss:
app-key: LTAI5tHGn7cVJdEtihTFLSeB app-key: LTAI5tHGn7cVJdEtihTFLSeB
app-secret: XYmfBSbLaZoblGXZwIXkbhfBD7a1eg app-secret: XYmfBSbLaZoblGXZwIXkbhfBD7a1eg
end-point: oss-cn-hangzhou.aliyuncs.com end-point: oss-cn-beijing.aliyuncs.com
simple-bucket: test-nft bucket: test-zhuixin
encrypt-bucket: test-nft-2
package com.fzm.portal; package com.fzm.portal;
import org.junit.jupiter.api.Test; import cn.fzm.chain.simplesdk.client.ParaChainClient;
import cn.hutool.core.collection.CollectionUtil;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//@SpringBootTest
class ArtPortalApplicationTests { class ArtPortalApplicationTests {
@Test
void contextLoads() { public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList( 2, 1, 3, 4, 5,1));
for (int i = 0; i < list.size(); i++) {
if (list.get(i)==1){
list.remove(i);
//i--;
}
}
list.forEach(System.out::println);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment