Эх сурвалжийг харах

Merge branch 'master' of http://git.izouma.com/xiongzhu/9th

panhui 4 жил өмнө
parent
commit
df76404d37
34 өөрчлөгдсөн 819 нэмэгдсэн , 500 устгасан
  1. 23 0
      src/main/java/com/izouma/nineth/event/TransferAssetEvent.java
  2. 3 0
      src/main/java/com/izouma/nineth/repo/IdentityAuthRepo.java
  3. 25 152
      src/main/java/com/izouma/nineth/service/AssetService.java
  4. 173 0
      src/main/java/com/izouma/nineth/service/GiftOrderService.java
  5. 22 11
      src/main/java/com/izouma/nineth/service/OrderService.java
  6. 17 11
      src/main/java/com/izouma/nineth/service/UserService.java
  7. 5 3
      src/main/java/com/izouma/nineth/web/AssetController.java
  8. 4 2
      src/main/java/com/izouma/nineth/web/OrderNotifyController.java
  9. 9 7
      src/main/java/com/izouma/nineth/web/OrderPayController.java
  10. BIN
      src/main/pc-space/src/assets/bg-moren备份 2@3x.png
  11. BIN
      src/main/pc-space/src/assets/icon_youhuiquan_01@3x (1).png
  12. BIN
      src/main/pc-space/src/assets/icon_youhuiquan_01@3x.png
  13. 6 5
      src/main/pc-space/src/components/AssetInfo.vue
  14. 10 5
      src/main/pc-space/src/components/CollectionInfo.vue
  15. 74 85
      src/main/pc-space/src/components/CouponInfo.vue
  16. 19 14
      src/main/pc-space/src/styles/list.less
  17. 104 9
      src/main/pc-space/src/views/AssetDetail.vue
  18. 13 3
      src/main/pc-space/src/views/Casting.vue
  19. 36 6
      src/main/pc-space/src/views/CastingDetail.vue
  20. 61 25
      src/main/pc-space/src/views/CollectionDetail.vue
  21. 14 2
      src/main/pc-space/src/views/Send.vue
  22. 155 133
      src/main/pc-space/src/views/Submit.vue
  23. 12 3
      src/main/pc-space/src/views/user/AccountData.vue
  24. 1 0
      src/main/pc-space/src/views/user/Authentication.vue
  25. 4 2
      src/main/pc-space/src/views/user/CollectionOrder.vue
  26. 1 2
      src/main/pc-space/src/views/user/EnterpriseAuthentication.vue
  27. 1 0
      src/main/pc-space/src/views/user/Modifypad.vue
  28. 8 4
      src/main/pc-space/src/views/user/OrderValue.vue
  29. 4 2
      src/main/pc-space/src/views/user/PayRecord.vue
  30. 1 0
      src/main/pc-space/src/views/user/Security.vue
  31. 1 0
      src/main/pc-space/src/views/user/Transaction.vue
  32. 2 1
      src/main/pc-space/src/views/user/UserAuthentication.vue
  33. 6 13
      src/test/java/com/izouma/nineth/CommonTest.java
  34. 5 0
      src/test/java/com/izouma/nineth/service/UserServiceTest.java

+ 23 - 0
src/main/java/com/izouma/nineth/event/TransferAssetEvent.java

@@ -0,0 +1,23 @@
+package com.izouma.nineth.event;
+
+import com.izouma.nineth.domain.Asset;
+import org.springframework.context.ApplicationEvent;
+
+public class TransferAssetEvent extends ApplicationEvent {
+    private final boolean success;
+    private final Asset   asset;
+
+    public TransferAssetEvent(Object source, boolean success, Asset asset) {
+        super(source);
+        this.success = success;
+        this.asset = asset;
+    }
+
+    public Asset getAsset() {
+        return asset;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+}

+ 3 - 0
src/main/java/com/izouma/nineth/repo/IdentityAuthRepo.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.IdentityAuth;
+import com.izouma.nineth.enums.AuthStatus;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
@@ -18,5 +19,7 @@ public interface IdentityAuthRepo extends JpaRepository<IdentityAuth, Long>, Jpa
 
     List<IdentityAuth> findByUserIdAndDelFalse(Long userId);
 
+    Optional<IdentityAuth> findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(Long userId, AuthStatus status);
+
     Optional<IdentityAuth> findByIdAndDelFalse(Long id);
 }

+ 25 - 152
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -1,45 +1,30 @@
 package com.izouma.nineth.service;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.alipay.api.AlipayClient;
-import com.alipay.api.request.AlipayTradeWapPayRequest;
-import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
-import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
 import com.izouma.nineth.TokenHistory;
-import com.izouma.nineth.config.AlipayProperties;
-import com.izouma.nineth.config.WxPayProperties;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.PageQuery;
-import com.izouma.nineth.enums.*;
+import com.izouma.nineth.enums.AssetStatus;
+import com.izouma.nineth.enums.CollectionSource;
+import com.izouma.nineth.enums.CollectionType;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.event.TransferAssetEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.lock.RedisLockable;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
-import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.EncoderException;
-import org.apache.commons.codec.net.URLCodec;
 import org.springframework.beans.BeanUtils;
 import org.springframework.context.ApplicationContext;
-import org.springframework.core.env.Environment;
 import org.springframework.data.domain.Page;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.AsyncResult;
 import org.springframework.stereotype.Service;
-import org.springframework.ui.Model;
 
-import javax.transaction.Transactional;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Future;
 
@@ -50,18 +35,10 @@ public class AssetService {
 
     private AssetRepo          assetRepo;
     private UserRepo           userRepo;
-    private NFTService         nftService;
     private CollectionRepo     collectionRepo;
     private ApplicationContext applicationContext;
     private OrderRepo          orderRepo;
-    private SysConfigService   sysConfigService;
-    private GiftOrderRepo      giftOrderRepo;
     private TokenHistoryRepo   tokenHistoryRepo;
-    private AlipayProperties   alipayProperties;
-    private AlipayClient       alipayClient;
-    private WxPayProperties    wxPayProperties;
-    private WxPayService       wxPayService;
-    private Environment        env;
     private AssetMintService   assetMintService;
 
     public Page<Asset> all(PageQuery pageQuery) {
@@ -245,130 +222,8 @@ public class AssetService {
         assetRepo.save(asset);
     }
 
-    @Transactional
-    public GiftOrder gift(Long userId, Long assetId, Long toUserId) {
-        Asset asset = assetRepo.findById(assetId).orElseThrow(new BusinessException("资产不存在"));
-        if (!(asset.getStatus() == AssetStatus.NORMAL)) {
-            throw new BusinessException("当前状态不可转赠");
-        }
-        if (asset.isConsignment()) {
-            throw new BusinessException("请先取消寄售");
-        }
-        if (asset.isPublicShow()) {
-            cancelPublic(asset);
-        }
-
-        asset.setStatus(AssetStatus.GIFTING);
-        assetRepo.save(asset);
-
-        GiftOrder giftOrder = GiftOrder.builder()
-                .userId(userId)
-                .assetId(assetId)
-                .toUserId(toUserId)
-                .gasPrice(sysConfigService.getBigDecimal("gas_fee"))
-                .status(OrderStatus.NOT_PAID)
-                .build();
-        return giftOrderRepo.save(giftOrder);
-    }
-
-    public void payOrderAlipay(Long id, Model model) {
-        try {
-            GiftOrder order = giftOrderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
-
-            if (order.getStatus() != OrderStatus.NOT_PAID) {
-                throw new BusinessException("订单状态错误");
-            }
-
-            JSONObject bizContent = new JSONObject();
-            bizContent.put("notifyUrl", alipayProperties.getNotifyUrl());
-            bizContent.put("returnUrl", alipayProperties.getReturnUrl());
-            bizContent.put("out_trade_no", String.valueOf(new SnowflakeIdWorker(0, 0).nextId()));
-            bizContent.put("total_amount", order.getGasPrice().stripTrailingZeros().toPlainString());
-            bizContent.put("disable_pay_channels", "pcredit,creditCard");
-            if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
-                // 测试环境设为1分
-                bizContent.put("total_amount", "0.01");
-            }
-            bizContent.put("subject", "转赠GAS费");
-            bizContent.put("product_code", "QUICK_WAP_PAY");
-            JSONObject body = new JSONObject();
-            body.put("action", "payGiftOrder");
-            body.put("userId", order.getUserId());
-            body.put("orderId", order.getId());
-            bizContent.put("body", body.toJSONString());
-
-            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
-            alipayRequest.setReturnUrl(alipayProperties.getReturnUrl());
-            alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
-            alipayRequest.setBizContent(JSON.toJSONString(bizContent));
-
-            String form = alipayClient.pageExecute(alipayRequest).getBody();
-            model.addAttribute("form", form);
-        } catch (BusinessException err) {
-            model.addAttribute("errMsg", err.getError());
-        } catch (Exception e) {
-            model.addAttribute("errMsg", e.getMessage());
-        }
-    }
-
-    public Object payOrderWeixin(Long id, String tradeType, String openId) throws WxPayException, EncoderException {
-        GiftOrder order = giftOrderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
-        if (order.getStatus() != OrderStatus.NOT_PAID) {
-            throw new BusinessException("订单状态错误");
-        }
-
-        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
-        request.setBody("转赠GAS费");
-        request.setOutTradeNo(String.valueOf(new SnowflakeIdWorker(1, 1).nextId()));
-        request.setTotalFee(order.getGasPrice().multiply(BigDecimal.valueOf(100)).intValue());
-        if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
-            // 测试环境设为1分
-//                    request.setTotalFee(1);
-        }
-        request.setSpbillCreateIp("180.102.110.170");
-        request.setNotifyUrl(wxPayProperties.getNotifyUrl());
-        request.setTradeType(tradeType);
-        request.setOpenid(openId);
-        request.setSignType("MD5");
-        JSONObject body = new JSONObject();
-        body.put("action", "payGiftOrder");
-        body.put("userId", order.getUserId());
-        body.put("orderId", order.getId());
-        request.setAttach(body.toJSONString());
-
-        if (WxPayConstants.TradeType.MWEB.equals(tradeType)) {
-            WxPayMwebOrderResult result = wxPayService.createOrder(request);
-            return result.getMwebUrl() + "&redirect_url=" + new URLCodec().encode(wxPayProperties.getReturnUrl());
-        } else if (WxPayConstants.TradeType.JSAPI.equals(tradeType)) {
-            return wxPayService.<WxPayMpOrderResult>createOrder(request);
-        }
-        throw new BusinessException("不支持此付款方式");
-    }
-
-    @Transactional
-    public void giftNotify(Long orderId, PayMethod payMethod, String transactionId) {
-        GiftOrder giftOrder = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
-        Asset asset = assetRepo.findById(giftOrder.getAssetId()).orElseThrow(new BusinessException("资产不存在"));
-        User newOwner = userRepo.findById(giftOrder.getToUserId()).orElseThrow(new BusinessException("用户不存在"));
-
-        giftOrder.setPayMethod(payMethod);
-        giftOrder.setStatus(OrderStatus.FINISH);
-        giftOrder.setTransactionId(transactionId);
-        giftOrder.setPayTime(LocalDateTime.now());
-        giftOrder.setPayMethod(PayMethod.ALIPAY);
-
-        transfer(asset, newOwner);
-
-        tokenHistoryRepo.save(TokenHistory.builder()
-                .fromUser(asset.getOwner())
-                .fromUserId(asset.getOwnerId())
-                .toUser(newOwner.getNickname())
-                .toUserId(newOwner.getId())
-                .operation("转赠")
-                .build());
-    }
-
-    public void transfer(Asset asset, User toUser) {
+    @Async
+    public void transfer(Asset asset, BigDecimal price, User toUser, String reason, Long orderId) {
         Asset newAsset = new Asset();
         BeanUtils.copyProperties(asset, newAsset);
         newAsset.setId(null);
@@ -377,17 +232,35 @@ public class AssetService {
         newAsset.setOwnerId(toUser.getId());
         newAsset.setOwnerAvatar(toUser.getAvatar());
         newAsset.setPublicShow(false);
+        newAsset.setConsignment(false);
         newAsset.setPublicCollectionId(null);
         newAsset.setStatus(AssetStatus.NORMAL);
+        newAsset.setPrice(price);
+        newAsset.setSellPrice(null);
+        newAsset.setOrderId(orderId);
         assetRepo.save(newAsset);
 
         asset.setPublicShow(false);
+        asset.setConsignment(false);
         asset.setPublicCollectionId(null);
         asset.setStatus(AssetStatus.GIFTED);
         asset.setOwner(toUser.getNickname());
         asset.setOwnerId(toUser.getId());
         asset.setOwnerAvatar(toUser.getAvatar());
         assetRepo.save(asset);
+
+        tokenHistoryRepo.save(TokenHistory.builder()
+                .tokenId(asset.getTokenId())
+                .fromUser(asset.getOwner())
+                .fromUserId(asset.getOwnerId())
+                .toUser(toUser.getNickname())
+                .toUserId(toUser.getId())
+                .operation(reason)
+                .build());
+
+        if (orderId != null) {
+            applicationContext.publishEvent(new TransferAssetEvent(this, true, newAsset));
+        }
     }
 
     public List<TokenHistory> tokenHistory(String tokenId, Long assetId) {

+ 173 - 0
src/main/java/com/izouma/nineth/service/GiftOrderService.java

@@ -0,0 +1,173 @@
+package com.izouma.nineth.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.request.AlipayTradeWapPayRequest;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.izouma.nineth.config.AlipayProperties;
+import com.izouma.nineth.config.WxPayProperties;
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.GiftOrder;
+import com.izouma.nineth.domain.User;
+import com.izouma.nineth.enums.AssetStatus;
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.*;
+import com.izouma.nineth.utils.SnowflakeIdWorker;
+import lombok.AllArgsConstructor;
+import org.apache.commons.codec.EncoderException;
+import org.apache.commons.codec.net.URLCodec;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.Model;
+
+import javax.transaction.Transactional;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+
+@Service
+@AllArgsConstructor
+public class GiftOrderService {
+
+    private AssetRepo          assetRepo;
+    private UserRepo           userRepo;
+    private NFTService         nftService;
+    private CollectionRepo     collectionRepo;
+    private ApplicationContext applicationContext;
+    private OrderRepo          orderRepo;
+    private SysConfigService   sysConfigService;
+    private GiftOrderRepo      giftOrderRepo;
+    private TokenHistoryRepo   tokenHistoryRepo;
+    private AlipayProperties   alipayProperties;
+    private AlipayClient       alipayClient;
+    private WxPayProperties    wxPayProperties;
+    private WxPayService       wxPayService;
+    private Environment        env;
+    private AssetMintService   assetMintService;
+    private AssetService       assetService;
+
+    @Transactional
+    public GiftOrder gift(Long userId, Long assetId, Long toUserId) {
+        Asset asset = assetRepo.findById(assetId).orElseThrow(new BusinessException("资产不存在"));
+        if (!(asset.getStatus() == AssetStatus.NORMAL)) {
+            throw new BusinessException("当前状态不可转赠");
+        }
+        if (asset.isConsignment()) {
+            throw new BusinessException("请先取消寄售");
+        }
+        if (asset.isPublicShow()) {
+            assetService.cancelPublic(asset);
+        }
+
+        asset.setStatus(AssetStatus.GIFTING);
+        assetRepo.save(asset);
+
+        GiftOrder giftOrder = GiftOrder.builder()
+                .userId(userId)
+                .assetId(assetId)
+                .toUserId(toUserId)
+                .gasPrice(sysConfigService.getBigDecimal("gas_fee"))
+                .status(OrderStatus.NOT_PAID)
+                .build();
+        return giftOrderRepo.save(giftOrder);
+    }
+
+
+    @Transactional
+    public void giftNotify(Long orderId, PayMethod payMethod, String transactionId) {
+        GiftOrder giftOrder = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
+        Asset asset = assetRepo.findById(giftOrder.getAssetId()).orElseThrow(new BusinessException("资产不存在"));
+        User newOwner = userRepo.findById(giftOrder.getToUserId()).orElseThrow(new BusinessException("用户不存在"));
+
+        giftOrder.setPayMethod(payMethod);
+        giftOrder.setStatus(OrderStatus.FINISH);
+        giftOrder.setTransactionId(transactionId);
+        giftOrder.setPayTime(LocalDateTime.now());
+        giftOrder.setPayMethod(PayMethod.ALIPAY);
+
+        assetService.transfer(asset, asset.getPrice(), newOwner, "转赠", null);
+    }
+
+    public void payOrderAlipay(Long id, Model model) {
+        try {
+            GiftOrder order = giftOrderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
+
+            if (order.getStatus() != OrderStatus.NOT_PAID) {
+                throw new BusinessException("订单状态错误");
+            }
+
+            JSONObject bizContent = new JSONObject();
+            bizContent.put("notifyUrl", alipayProperties.getNotifyUrl());
+            bizContent.put("returnUrl", alipayProperties.getReturnUrl());
+            bizContent.put("out_trade_no", String.valueOf(new SnowflakeIdWorker(0, 0).nextId()));
+            bizContent.put("total_amount", order.getGasPrice().stripTrailingZeros().toPlainString());
+            bizContent.put("disable_pay_channels", "pcredit,creditCard");
+            if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
+                // 测试环境设为1分
+                bizContent.put("total_amount", "0.01");
+            }
+            bizContent.put("subject", "转赠GAS费");
+            bizContent.put("product_code", "QUICK_WAP_PAY");
+            JSONObject body = new JSONObject();
+            body.put("action", "payGiftOrder");
+            body.put("userId", order.getUserId());
+            body.put("orderId", order.getId());
+            bizContent.put("body", body.toJSONString());
+
+            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
+            alipayRequest.setReturnUrl(alipayProperties.getReturnUrl());
+            alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
+            alipayRequest.setBizContent(JSON.toJSONString(bizContent));
+
+            String form = alipayClient.pageExecute(alipayRequest).getBody();
+            model.addAttribute("form", form);
+        } catch (BusinessException err) {
+            model.addAttribute("errMsg", err.getError());
+        } catch (Exception e) {
+            model.addAttribute("errMsg", e.getMessage());
+        }
+    }
+
+    public Object payOrderWeixin(Long id, String tradeType, String openId) throws WxPayException, EncoderException {
+        GiftOrder order = giftOrderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+
+        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+        request.setBody("转赠GAS费");
+        request.setOutTradeNo(String.valueOf(new SnowflakeIdWorker(1, 1).nextId()));
+        request.setTotalFee(order.getGasPrice().multiply(BigDecimal.valueOf(100)).intValue());
+        if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
+            // 测试环境设为1分
+//                    request.setTotalFee(1);
+        }
+        request.setSpbillCreateIp("180.102.110.170");
+        request.setNotifyUrl(wxPayProperties.getNotifyUrl());
+        request.setTradeType(tradeType);
+        request.setOpenid(openId);
+        request.setSignType("MD5");
+        JSONObject body = new JSONObject();
+        body.put("action", "payGiftOrder");
+        body.put("userId", order.getUserId());
+        body.put("orderId", order.getId());
+        request.setAttach(body.toJSONString());
+
+        if (WxPayConstants.TradeType.MWEB.equals(tradeType)) {
+            WxPayMwebOrderResult result = wxPayService.createOrder(request);
+            return result.getMwebUrl() + "&redirect_url=" + new URLCodec().encode(wxPayProperties.getReturnUrl());
+        } else if (WxPayConstants.TradeType.JSAPI.equals(tradeType)) {
+            return wxPayService.<WxPayMpOrderResult>createOrder(request);
+        }
+        throw new BusinessException("不支持此付款方式");
+    }
+}

+ 22 - 11
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -17,6 +17,7 @@ import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.event.CreateAssetEvent;
+import com.izouma.nineth.event.TransferAssetEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.JpaUtils;
@@ -299,7 +300,7 @@ public class OrderService {
             } else {
                 if (collection.getSource() == CollectionSource.TRANSFER) {
                     Asset asset = assetRepo.findById(collection.getAssetId()).orElse(null);
-                    assetService.transfer(asset, user);
+                    assetService.transfer(asset, order.getPrice(), user, "转让", order.getId());
                     collectionRepo.delete(collection);
                 } else {
                     order.setStatus(OrderStatus.PROCESSING);
@@ -321,25 +322,20 @@ public class OrderService {
                 .orElseThrow(new BusinessException("藏品不存在"));
         User user = userRepo.findById(order.getUserId()).orElseThrow(new BusinessException("用户不存在"));
         if (order.getStatus() == OrderStatus.NOT_PAID) {
+            order.setStatus(OrderStatus.PROCESSING);
+            order.setPayTime(LocalDateTime.now());
+            order.setTransactionId(transactionId);
+            order.setPayMethod(payMethod);
             if (order.getType() == CollectionType.BLIND_BOX) {
                 BlindBoxItem winItem = collectionService.draw(collection.getId());
-
-                order.setStatus(OrderStatus.PROCESSING);
-                order.setPayTime(LocalDateTime.now());
-                order.setTransactionId(transactionId);
-                order.setPayMethod(payMethod);
                 orderRepo.save(order);
                 assetService.createAsset(winItem, user, order.getId(), order.getPrice(), "出售");
             } else {
                 if (collection.getSource() == CollectionSource.TRANSFER) {
                     Asset asset = assetRepo.findById(collection.getAssetId()).orElse(null);
-                    assetService.transfer(asset, user);
+                    assetService.transfer(asset, order.getPrice(), user, "转让", order.getId());
                     collectionRepo.delete(collection);
                 } else {
-                    order.setStatus(OrderStatus.PROCESSING);
-                    order.setPayTime(LocalDateTime.now());
-                    order.setTransactionId(transactionId);
-                    order.setPayMethod(payMethod);
                     orderRepo.save(order);
                     assetService.createAsset(collection, user, order.getId(), order.getPrice(), "出售");
                 }
@@ -363,6 +359,21 @@ public class OrderService {
         }
     }
 
+    @EventListener
+    public void onTransferAsset(TransferAssetEvent event) {
+        Asset asset = event.getAsset();
+        Order order = orderRepo.findById(asset.getOrderId()).orElseThrow(new BusinessException("订单不存在"));
+        if (event.isSuccess()) {
+            order.setTxHash(asset.getTxHash());
+            order.setGasUsed(asset.getGasUsed());
+            order.setBlockNumber(asset.getBlockNumber());
+            order.setStatus(OrderStatus.FINISH);
+            orderRepo.save(order);
+        } else {
+            log.error("创建asset失败");
+        }
+    }
+
     public void cancel(Long id) {
         Order order = orderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
         cancel(order);

+ 17 - 11
src/main/java/com/izouma/nineth/service/UserService.java

@@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.domain.Follow;
+import com.izouma.nineth.domain.IdentityAuth;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.UserDTO;
@@ -13,6 +14,7 @@ import com.izouma.nineth.enums.AuthStatus;
 import com.izouma.nineth.enums.AuthorityName;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.FollowRepo;
+import com.izouma.nineth.repo.IdentityAuthRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.security.JwtTokenUtil;
@@ -47,15 +49,16 @@ import java.util.stream.Collectors;
 @Slf4j
 @AllArgsConstructor
 public class UserService {
-    private UserRepo       userRepo;
-    private WxMaService    wxMaService;
-    private WxMpService    wxMpService;
-    private SmsService     smsService;
-    private StorageService storageService;
-    private JwtTokenUtil   jwtTokenUtil;
-    private CaptchaService captchaService;
-    private FollowService  followService;
-    private FollowRepo     followRepo;
+    private UserRepo         userRepo;
+    private WxMaService      wxMaService;
+    private WxMpService      wxMpService;
+    private SmsService       smsService;
+    private StorageService   storageService;
+    private JwtTokenUtil     jwtTokenUtil;
+    private CaptchaService   captchaService;
+    private FollowService    followService;
+    private FollowRepo       followRepo;
+    private IdentityAuthRepo identityAuthRepo;
 
     @CacheEvict(value = "user", key = "#user.username")
     public User update(User user) {
@@ -366,11 +369,14 @@ public class UserService {
         if (AuthStatus.SUCCESS != user.getAuthStatus()) {
             throw new BusinessException("用户不存在或未认证");
         }
+        String realName = identityAuthRepo.findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(
+                        user.getId(), AuthStatus.SUCCESS)
+                .map(IdentityAuth::getRealName).orElse("").replaceAll(".*(?=.)", "**");
         Map<String, Object> map = new HashMap<>();
         map.put("id", user.getId());
         map.put("avatar", user.getAvatar());
-        map.put("phone", user.getPhone().replaceAll("(?<=.{3}).*(?=.{4})", "****"));
-        map.put("realName", Optional.ofNullable(user.getRealName()).orElse("").replaceAll(".*(?=.)", "**"));
+        map.put("phone", user.getPhone().replaceAll("(?<=.{3}).*(?=.{4})", "**"));
+        map.put("realName", realName);
         return map;
     }
 

+ 5 - 3
src/main/java/com/izouma/nineth/web/AssetController.java

@@ -7,6 +7,7 @@ import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.service.AssetService;
+import com.izouma.nineth.service.GiftOrderService;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
@@ -24,8 +25,9 @@ import java.util.List;
 @RequestMapping("/asset")
 @AllArgsConstructor
 public class AssetController extends BaseController {
-    private AssetService assetService;
-    private AssetRepo    assetRepo;
+    private AssetService     assetService;
+    private AssetRepo        assetRepo;
+    private GiftOrderService giftOrderService;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -95,7 +97,7 @@ public class AssetController extends BaseController {
     @PostMapping("/gift")
     @ApiOperation("转赠")
     public GiftOrder gift(@RequestParam Long assetId, @RequestParam Long toUserId) {
-        return assetService.gift(SecurityUtils.getAuthenticatedUser().getId(), assetId, toUserId);
+        return giftOrderService.gift(SecurityUtils.getAuthenticatedUser().getId(), assetId, toUserId);
     }
 
     @GetMapping("/tokenHistory")

+ 4 - 2
src/main/java/com/izouma/nineth/web/OrderNotifyController.java

@@ -11,6 +11,7 @@ import com.github.binarywang.wxpay.service.WxPayService;
 import com.izouma.nineth.config.AlipayProperties;
 import com.izouma.nineth.enums.PayMethod;
 import com.izouma.nineth.service.AssetService;
+import com.izouma.nineth.service.GiftOrderService;
 import com.izouma.nineth.service.OrderService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -38,6 +39,7 @@ public class OrderNotifyController {
     private final OrderService     orderService;
     private final WxPayService     wxPayService;
     private final AssetService     assetService;
+    private final GiftOrderService giftOrderService;
 
     @PostMapping("/order/alipay")
     @ResponseBody
@@ -74,7 +76,7 @@ public class OrderNotifyController {
                 }
                 case "payGiftOrder": {
                     Long orderId = body.getLong("orderId");
-                    assetService.giftNotify(orderId, PayMethod.ALIPAY, MapUtils.getString(params, "trade_no"));
+                    giftOrderService.giftNotify(orderId, PayMethod.ALIPAY, MapUtils.getString(params, "trade_no"));
                     break;
                 }
             }
@@ -99,7 +101,7 @@ public class OrderNotifyController {
             }
             case "payGiftOrder": {
                 Long orderId = attach.getLong("orderId");
-                assetService.giftNotify(orderId, PayMethod.WEIXIN, notifyResult.getTransactionId());
+                giftOrderService.giftNotify(orderId, PayMethod.WEIXIN, notifyResult.getTransactionId());
                 break;
             }
         }

+ 9 - 7
src/main/java/com/izouma/nineth/web/OrderPayController.java

@@ -5,6 +5,7 @@ import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.constant.WxPayConstants;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.izouma.nineth.service.AssetService;
+import com.izouma.nineth.service.GiftOrderService;
 import com.izouma.nineth.service.OrderService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -24,9 +25,10 @@ import java.util.regex.Pattern;
 @Slf4j
 @AllArgsConstructor
 public class OrderPayController {
-    private final OrderService orderService;
-    private final AssetService assetService;
-    private final WxMpService  wxMpService;
+    private final OrderService     orderService;
+    private final AssetService     assetService;
+    private final WxMpService      wxMpService;
+    private final GiftOrderService giftOrderService;
 
     @RequestMapping(value = "/alipay", method = RequestMethod.GET)
     public String payOrderAlipay(Long id, Model model, @RequestHeader(value = "User-Agent") String userAgent) {
@@ -60,14 +62,14 @@ public class OrderPayController {
     @RequestMapping(value = "/gift/alipay", method = RequestMethod.GET)
     public String payGiftOrderAlipay(Long id, Model model, @RequestHeader(value = "User-Agent") String userAgent) {
         detectUA(userAgent, model);
-        assetService.payOrderAlipay(id, model);
+        giftOrderService.payOrderAlipay(id, model);
         return "AlipayHtml";
     }
 
     @RequestMapping(value = "/gift/weixin_h5")
     public String payGiftOrderWeixinH5(Long id, Model model, @RequestHeader(value = "User-Agent") String userAgent) throws EncoderException, WxPayException {
         detectUA(userAgent, model);
-        model.addAttribute("payUrl", assetService.payOrderWeixin(id, WxPayConstants.TradeType.MWEB, null));
+        model.addAttribute("payUrl", giftOrderService.payOrderWeixin(id, WxPayConstants.TradeType.MWEB, null));
         return "WeixinPayHtml";
     }
 
@@ -75,7 +77,7 @@ public class OrderPayController {
     public String payGiftOrderWeixinPC(@RequestParam Long id, @RequestParam String code, Model model) throws WxPayException, EncoderException, WxErrorException {
         WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);
         WxMpUser user = wxMpService.oauth2getUserInfo(accessToken, null);
-        WxPayMpOrderResult payParams = (WxPayMpOrderResult) assetService.payOrderWeixin(id, WxPayConstants.TradeType.JSAPI, user.getOpenId());
+        WxPayMpOrderResult payParams = (WxPayMpOrderResult) giftOrderService.payOrderWeixin(id, WxPayConstants.TradeType.JSAPI, user.getOpenId());
         model.addAttribute("payParams", JSON.toJSONString(payParams));
         return "PayOrderPC";
     }
@@ -92,6 +94,6 @@ public class OrderPayController {
     @RequestMapping(value = "/gift/weixin")
     @ResponseBody
     public Object payGiftOrderWeixin(@RequestParam Long id, @RequestParam String openId) throws WxPayException, EncoderException {
-        return assetService.payOrderWeixin(id, WxPayConstants.TradeType.JSAPI, openId);
+        return giftOrderService.payOrderWeixin(id, WxPayConstants.TradeType.JSAPI, openId);
     }
 }

BIN
src/main/pc-space/src/assets/bg-moren备份 2@3x.png


BIN
src/main/pc-space/src/assets/icon_youhuiquan_01@3x (1).png


BIN
src/main/pc-space/src/assets/icon_youhuiquan_01@3x.png


+ 6 - 5
src/main/pc-space/src/components/AssetInfo.vue

@@ -120,7 +120,7 @@ export default {
         padding: 10px 16px 6px;
         font-size: 14px;
         font-weight: 400;
-        color: #939599;
+        color: #ffffff;
         line-height: 20px;
     }
     .price {
@@ -131,7 +131,7 @@ export default {
         .img1 {
             width: 10px;
             height: 11px;
-            margin-top: 10px;
+            margin-top: 8px;
         }
         .num {
             font-size: 30px;
@@ -166,14 +166,14 @@ export default {
     }
     .border {
         height: 1px;
-        background: #494a4d;
+        background: #2b2e3e;
         border-radius: 1px;
         margin: 0 16px;
     }
     .fans {
         display: flex;
         align-items: center;
-        justify-content: space-between;
+        // justify-content: space-between;
         padding: 19px 16px 20px;
         .text {
             display: flex;
@@ -181,7 +181,7 @@ export default {
             .text1 {
                 display: flex;
                 align-items: center;
-                max-width: 70px;
+                // max-width: 80px;
                 overflow: hidden;
                 &.name1 {
                     margin-right: 22px;
@@ -200,6 +200,7 @@ export default {
                 .text3 {
                     font-size: 14px;
                     font-weight: 400;
+                    width: 90px;
                     .ellipsis();
                     color: #939599;
                     line-height: 24px;

+ 10 - 5
src/main/pc-space/src/components/CollectionInfo.vue

@@ -42,6 +42,7 @@
 <script>
 import product from '../mixins/product';
 import LikeButton from './LikeButton.vue';
+import { mapState } from 'vuex';
 export default {
     components: { LikeButton },
     props: {
@@ -57,6 +58,9 @@ export default {
         }
     },
     mixins: [product],
+    computed: {
+        ...mapState(['userInfo'])
+    },
     methods: {
         likeProduct() {
             if (!this.info.liked) {
@@ -136,7 +140,7 @@ export default {
         padding: 10px 16px 10px;
         font-size: 14px;
         font-weight: 400;
-        color: #939599;
+        color: #ffffff;
         line-height: 20px;
     }
     .init {
@@ -155,7 +159,7 @@ export default {
         .img1 {
             width: 10px;
             height: 11px;
-            margin-top: 10px;
+            margin-top: 8px;
         }
         .num {
             font-size: 30px;
@@ -184,14 +188,14 @@ export default {
     }
     .border {
         height: 1px;
-        background: #494a4d;
+        background: #2b2e3e;
         border-radius: 1px;
         margin: 0 16px;
     }
     .fans {
         display: flex;
         align-items: center;
-        justify-content: space-between;
+        // justify-content: space-between;
         padding: 19px 16px 20px;
         .text {
             display: flex;
@@ -199,7 +203,7 @@ export default {
             .text1 {
                 display: flex;
                 align-items: center;
-                max-width: 70px;
+                // max-width: 70px;
                 overflow: hidden;
                 &.name1 {
                     margin-right: 22px;
@@ -218,6 +222,7 @@ export default {
                 .text3 {
                     font-size: 14px;
                     font-weight: 400;
+                    width: 60px;
                     .ellipsis();
                     color: #939599;
                     line-height: 24px;

+ 74 - 85
src/main/pc-space/src/components/CouponInfo.vue

@@ -2,16 +2,21 @@
     <div class="page" v-if="list">
         <div v-for="(item, index) in list" :key="index">
             <div class="coupon" @click="choose">
-                <div class="coupon-top">
-                    <div class="text1">{{ item.name }}</div>
-                    <div class="text2">
-                        <span>兑换券编码</span>
-                        <span>{{ item.id }}</span>
+                <div class="box">
+                    <img class="img" src="../assets/icon_youhuiquan_01@3x.png" alt="" />
+                    <div class="coupon-top">
+                        <div class="text1">{{ item.name }}</div>
+                        <div class="text2" v-if="!item.limited">仅限规定商品可用</div>
                     </div>
                 </div>
-                <div class="coupon-bottom">
-                    <span>有效期至:{{ item.expiration }}</span>
-                    <span v-if="!item.limited">规定商品可用</span>
+                <div class="box1">
+                    <div>
+                        <span class="text3"
+                            >兑换券编码<span class="text4"> {{ item.id }}</span></span
+                        >
+                        <div class="text5">有效期至:{{ item.expiration }}</div>
+                    </div>
+                    <div class="btn">立即使用</div>
                 </div>
             </div>
         </div>
@@ -72,92 +77,76 @@ export default {
 }
 .coupon {
     border-radius: 8px;
-    background: linear-gradient(135deg, rgba(253, 251, 96, 1), rgba(255, 143, 62, 1));
-    position: relative;
+    display: flex;
     padding: 0 10px;
-    margin: 0 16px 16px;
-    &::after {
-        content: '';
-        position: absolute;
-        top: 1px;
-        right: 1px;
-        left: 1px;
-        bottom: 1px;
-        border-radius: 8px;
-        background-color: #181818;
-        z-index: 0;
-    }
-
-    div {
-        position: relative;
-        z-index: 1;
-    }
-
-    .coupon-top {
-        padding: 16px 0;
-
-        .text1 {
-            font-size: 18px;
-            font-weight: bold;
-            color: #939599;
-            line-height: 24px;
-            background: linear-gradient(0deg, #fdfb60 0%, #ff8f3e 100%);
-            -webkit-background-clip: text;
-            -webkit-text-fill-color: transparent;
+    margin-bottom: 16px;
+    .box {
+        display: flex;
+        .img {
+            width: 189px;
+            height: 120px;
+            position: relative;
+            z-index: 1;
         }
-
-        .text2 {
-            padding-top: 6px;
-            font-size: 12px;
-            line-height: 17px;
-            color: #939599;
-            span {
-                &:last-child {
-                    color: #fff;
-                    margin-left: 6px;
-                }
+        .coupon-top {
+            padding: 16px 0;
+            position: absolute;
+            z-index: 2;
+            .text1 {
+                text-align: center;
+                font-size: 24px;
+                font-family: PingFangSC-Medium, PingFang SC;
+                font-weight: bold;
+                color: #1a1a1a;
+                line-height: 36px;
+                margin: 15px 0 0 27px;
+            }
+            .text2 {
+                font-size: 12px;
+                font-weight: 400;
+                color: #1a1a1a;
+                line-height: 22px;
+                margin-left: 30px;
             }
         }
     }
-
-    .coupon-bottom {
-        border-top: 1px dashed #ebebeb;
-        color: #939599;
-        font-size: 11px;
-        line-height: 17px;
-        padding: 9px 0;
+    .box1 {
+        background: #1f2230;
+        width: 100%;
         display: flex;
         justify-content: space-between;
-        position: relative;
-        &::before {
-            content: '';
-            position: absolute;
-            background-color: #181818;
-            width: 16px;
-            height: 16px;
-            left: -18px;
-            top: -8px;
-            border-radius: 16px;
+        padding: 16px 20px;
+        .text3 {
+            font-size: 14px;
+            font-weight: 400;
+            color: #939599;
+            line-height: 24px;
         }
-        &::after {
-            content: '';
-            position: absolute;
-            background-color: #181818;
-            width: 16px;
-            height: 16px;
-            right: -18px;
-            top: -8px;
-            border-radius: 16px;
+        .text4 {
+            font-size: 14px;
+            font-weight: 400;
+            color: #ffffff;
+            line-height: 24px;
+            text-align: bottom;
+        }
+        .text5 {
+            font-size: 11px;
+            font-weight: 400;
+            color: #939599;
+            line-height: 16px;
+            margin-top: 45px;
+        }
+        .btn {
+            width: 180px;
+            height: 28px;
+            background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
+            border-radius: 14px;
+            font-size: 12px;
+            color: #1a1a1a;
+            line-height: 28px;
+            text-align: center;
+            margin-top: 30px;
         }
-    }
-
-    .icon {
-        position: absolute;
-        width: 24px;
-        height: 24px;
-        right: 10px;
-        top: 30px;
-        z-index: 3;
     }
 }
 </style>

+ 19 - 14
src/main/pc-space/src/styles/list.less

@@ -17,8 +17,9 @@
 }
 .border {
     height: 1px;
-    background: #494a4d;
+    background: #2B2E3E;
     border-radius: 1px;
+    margin: 0 16px;
 }
 .container {
     background: #1a1a1a;
@@ -113,19 +114,23 @@
                 color: #939599;
                 line-height: 24px;
             }
-            .follow {
-                width: 70px;
-                height: 26px;
-                color: @prim;
-                font-size: 14px;
-                border-radius: 16px;
-                border: 1px solid;
-                text-align: center;
-                line-height: 26px;
-                // &::before {
-                //     color: red;
-                // }
-            }
+              .el-button {
+                  background-color: transparent;
+                  min-width: 76px;
+                  height: 28px;
+
+                  &.prim {
+                      .line(@radius: 28px);
+                      border: 0;
+                      text-align: center;
+
+                      /deep/span {
+                          color: @prim;
+                          position: relative;
+                          z-index: 1;
+                      }
+                  }
+              }
         }
     }
 }

+ 104 - 9
src/main/pc-space/src/views/AssetDetail.vue

@@ -127,9 +127,17 @@
                     <div class="name">{{ info.category || '暂无' }}</div>
                     <div class="bor"></div>
                     <div class="box" v-if="init2 != ''">
-                        <div v-if="init2">
+                        <div
+                            v-if="init2"
+                            @mouseenter="isShowPopover(init2.name, true)"
+                            @mouseleave="isShowPopover(init2.name, false)"
+                            style="position: relative; width: 24px; margin-left: 16px"
+                        >
                             <img @click="Whisper" v-if="init2.opened" class="img" :src="init2.icon[2]" alt="" />
                             <img @click="Whisper" v-else class="img" :src="init2.icon[0]" alt="" />
+                            <div class="hoverTips1" v-if="popoverStatus[init2.name]">
+                                <p>{{ init2.description }}</p>
+                            </div>
                         </div>
                         <div class="del" v-else>铸造者未设置</div>
                     </div>
@@ -138,9 +146,19 @@
                     <!-- <div v-if="init"> -->
                     <div class="iconBox" v-if="init.length > 0">
                         <div v-for="(item, index) in init" :key="index">
-                            <div @click.stop="privilegeFn(item)">
-                                <img v-if="item.opened" class="img2" :src="item.icon[2]" alt="" />
-                                <img v-if="!item.opened" class="img2" :src="item.icon[3]" alt="" />
+                            <div
+                                style="position: relative"
+                                @mouseenter="isShowPopover(item.name, true)"
+                                @mouseleave="isShowPopover(item.name, false)"
+                            >
+                                <div @click.stop="privilegeFn(item)">
+                                    <img v-if="item.opened" class="img2" :src="item.icon[2]" alt="" />
+                                    <img v-if="!item.opened" class="img2" :src="item.icon[3]" alt="" />
+                                </div>
+                                <div class="hoverTips" v-if="popoverStatus[item.name]">
+                                    <div class="span">{{ item.name }}</div>
+                                    <p>{{ item.description }}</p>
+                                </div>
                             </div>
                         </div>
                     </div>
@@ -183,7 +201,7 @@
                             <img class="imgs" src="../assets/info_icon_jiaoyijilu.png" alt="" />
                             <span>交易历史</span>
                         </template>
-                        <el-table :data="tableData" stripe style="width: 100%">
+                        <el-table class="elTable" :data="tableData" stripe style="width: 100%">
                             <el-table-column prop="fromUser" label="用户" width="555"> </el-table-column>
                             <el-table-column prop="operation" label="操作" width="455"> </el-table-column>
                             <el-table-column prop="createdAt" label="时间"> </el-table-column>
@@ -280,6 +298,14 @@ export default {
     mixins: [asset, product],
     data() {
         return {
+            popoverStatus: {
+                悄悄话: false,
+                版权权利: false,
+                加密空间: false,
+                票务: false,
+                兑换锁链: false,
+                铸造: false
+            },
             show: false,
             show2: false,
             show3: false,
@@ -337,6 +363,13 @@ export default {
         }
     },
     methods: {
+        isShowPopover(type, flag) {
+            for (let key in this.popoverStatus) {
+                if (type === key) {
+                    this.popoverStatus[key] = flag;
+                }
+            }
+        },
         copy() {
             this.$copyText(this.list2.id).then(
                 e => {
@@ -823,7 +856,7 @@ export default {
             .bor {
                 width: 1px;
                 height: 62px;
-                background: #494a4d;
+                background: #2b2e3e;
                 border-radius: 1px;
             }
             .box {
@@ -840,7 +873,7 @@ export default {
             .img {
                 width: 24px;
                 height: 24px;
-                padding-left: 21px;
+                padding-left: 2px;
                 cursor: pointer;
             }
             .iconBox {
@@ -854,6 +887,65 @@ export default {
                     cursor: pointer;
                 }
             }
+            .hoverTips {
+                position: absolute;
+                width: 188px;
+                background: #fff;
+                border-radius: 4px;
+                top: 40px;
+                left: 30px;
+                .span {
+                    font-size: 16px;
+                    color: #000000;
+                    line-height: 24px;
+                    text-align: center;
+                    padding-top: 12px;
+                }
+                p {
+                    padding: 12px 16px;
+                    font-size: 14px;
+                    color: #939599;
+                    line-height: 24px;
+                }
+            }
+            .hoverTips::before {
+                width: 0;
+                height: 0;
+                border-left: 7px solid transparent;
+                border-right: 7px solid transparent;
+                border-bottom: 10px solid #fff;
+                content: '';
+                display: block;
+                position: absolute;
+                left: 12px; //给小三角定位,更具实际需求调整
+                top: -10px; //给小三角定位,更具实际需求调整
+            }
+            .hoverTips1 {
+                position: absolute;
+                width: 188px;
+                background: #fff;
+                border-radius: 4px;
+                top: 40px;
+                left: -4px;
+                p {
+                    padding: 12px 16px;
+                    font-size: 14px;
+                    color: #939599;
+                    line-height: 24px;
+                }
+            }
+            .hoverTips1::before {
+                width: 0;
+                height: 0;
+                border-left: 7px solid transparent;
+                border-right: 7px solid transparent;
+                border-bottom: 10px solid #fff;
+                content: '';
+                display: block;
+                position: absolute;
+                left: 12px; //给小三角定位,更具实际需求调整
+                top: -10px; //给小三角定位,更具实际需求调整
+            }
         }
         .works {
             display: flex;
@@ -908,7 +1000,7 @@ export default {
             }
             .border {
                 height: 1px;
-                background: #494a4d;
+                background: #2b2e3e;
                 border-radius: 1px;
                 margin: 0 16px;
             }
@@ -1149,6 +1241,9 @@ export default {
                 height: 24px;
             }
         }
+        .elTable {
+            border: 1px solid red;
+        }
         .border {
             height: 1px;
             background: #494a4d;
@@ -1364,7 +1459,7 @@ export default {
 }
 .btn-content {
     padding: 20px 0;
-    border-top: 1px solid #494a4d;
+    border-top: 1px solid #2b2e3e;
 }
 
 .btn-list {

+ 13 - 3
src/main/pc-space/src/views/Casting.vue

@@ -29,7 +29,7 @@
             >
                 <el-image
                     class="imgBox"
-                    :src="item.bg || require('../assets/defaultBg.jpg')"
+                    :src="item.bg || require('../assets/bg-moren备份 2@3x.png')"
                     fit="cover"
                     :lazy="true"
                 ></el-image>
@@ -49,9 +49,19 @@
                         <div class="text3">{{ item.followers }}</div>
                         <div class="text4">粉丝</div>
                     </div>
-                    <div class="follow" :class="{ followed: item.follow }" @click.prevent="like(item)">
+                    <el-button
+                        style="color: #939599"
+                        plain
+                        round
+                        :class="{ prim: !item.follow }"
+                        size="mini"
+                        @click="like(item)"
+                    >
                         {{ item.follow ? '已关注' : '关注' }}
-                    </div>
+                    </el-button>
+                    <!-- <div class="follow" :class="{ followed: item.follow }" @click.prevent="like(item)">
+                        {{ item.follow ? '已关注' : '关注' }}
+                    </div> -->
                 </div>
             </router-link>
 

+ 36 - 6
src/main/pc-space/src/views/CastingDetail.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="detail">
-        <el-image class="bg" :src="info.bg || require('../assets/defaultBg.jpg')" fit="cover"></el-image>
+        <el-image class="bg" :src="info.bg || require('../assets/img/bg-moren@3x.png')" fit="cover"></el-image>
         <div class="detail-content center-content">
             <el-image :src="info.avatar" fit="cover" class="avatar"></el-image>
             <div class="info">
@@ -66,7 +66,7 @@
                     @change="onSearch"
                 >
                 </el-input>
-                <!-- <el-select class="select" v-model="sortStr" placeholder="请选择">
+                <!-- <el-select class="select" v-model="value" @change="getList" placeholder="请选择">
                     <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
                     </el-option>
                 </el-select> -->
@@ -123,18 +123,19 @@ export default {
                     value: false
                 }
             ],
+            value: '',
             typeOptions: [
                 {
                     label: '全部',
-                    type: ''
+                    value: ''
                 },
                 {
                     label: '售卖',
-                    type: 'ON_SALE'
+                    value: 'ON_SALE'
                 },
                 {
                     label: '仅展示',
-                    type: 'NORMAL'
+                    value: 'NORMAL'
                 }
             ],
             sortList: [
@@ -159,7 +160,8 @@ export default {
             url: '/collection/all',
             list: [],
             isOwner: true,
-            isList: false
+            isList: false,
+            page: 0
         };
     },
     mounted() {
@@ -181,6 +183,34 @@ export default {
         },
         setList(list) {
             this.list = list;
+        },
+        getList() {
+            let form = {
+                page: this.page,
+                size: 20,
+                query: {
+                    userId: this.info.id
+                    // status: 'NORMAL,TRADING,GIFTING'
+                },
+                sort: 'createdAt,desc'
+            };
+            if (this.value === 'NORMAL') {
+                form.query = {
+                    ...form.query,
+                    salable: false
+                    // consignment: false
+                };
+            }
+            if (this.value === 'ON_SALE') {
+                form.query = {
+                    ...form.query,
+                    consignment: true
+                };
+            }
+            this.$http.post('/asset/all', form, { body: 'json' }).then(res => {
+                this.list = [...this.list, ...res.content];
+                console.log(this.list);
+            });
         }
     }
 };

+ 61 - 25
src/main/pc-space/src/views/CollectionDetail.vue

@@ -86,7 +86,7 @@
                     </div>
                     <div class="price1 num">
                         <div class="num1">
-                            <div class="price2 num2">单限购 1 件</div>
+                            <div class="price2 num2">单限购 1 件</div>
                             <!-- <span class="span">{{ info.total }}</span> -->
                         </div>
                         <div class="price2 num2">已售 {{ info.sale }} / 剩余 {{ info.stock }}</div>
@@ -123,8 +123,8 @@
                         >
                             <img v-if="init2.opened" class="img" :src="init2.icon[2]" alt="" />
                             <img v-else class="img" :src="init2.icon[0]" alt="" />
-                            <div class="hoverTips" v-if="popoverStatus[init2.name]">
-                                <p>这是一段文字描述</p>
+                            <div class="hoverTips1" v-if="popoverStatus[init2.name]">
+                                <p>{{ init2.description }}</p>
                             </div>
                         </div>
                         <div class="del" v-else>铸造者未设置</div>
@@ -142,6 +142,7 @@
                                 <img v-if="item.opened" class="img2" :src="item.icon[2]" alt="" />
                                 <img v-if="!item.opened" class="img2" :src="item.icon[3]" alt="" />
                                 <div class="hoverTips" v-if="popoverStatus[item.name]">
+                                    <div class="span">{{ item.name }}</div>
                                     <p>{{ item.description }}</p>
                                 </div>
                             </div>
@@ -399,6 +400,7 @@ export default {
             width: 460px;
             flex-shrink: 0;
         }
+
         .top-info {
             flex-grow: 1;
             margin-left: 30px;
@@ -525,8 +527,6 @@ export default {
             }
         }
         .price {
-            // width: 678px;
-            // height: 220px;
             padding: 0 16px;
             background: #1f2230;
             border-radius: 0px 0px 8px 8px;
@@ -534,7 +534,7 @@ export default {
             .price1 {
                 display: flex;
                 padding: 18px 0 24px 0;
-                border-bottom: 1px solid #494a4d;
+                border-bottom: 1px solid #2b2e3e;
                 &.num {
                     justify-content: space-between;
                     border-bottom: 0;
@@ -638,7 +638,7 @@ export default {
             .bor {
                 width: 1px;
                 height: 62px;
-                background: #494a4d;
+                background: #2b2e3e;
                 border-radius: 1px;
             }
             .box {
@@ -657,12 +657,6 @@ export default {
                 line-height: 24px;
                 padding-left: 16px;
             }
-            // .img {
-            //     width: 24px;
-            //     height: 24px;
-            //     padding-left: 16px;
-            //     cursor: pointer;
-            // }
             .iconBox {
                 margin-left: -22px;
                 display: flex;
@@ -674,23 +668,65 @@ export default {
                     cursor: pointer;
                 }
             }
-
             .hoverTips {
                 position: absolute;
-                width: 220px;
-                height: 50px;
+                width: 188px;
                 background: #fff;
-                border-radius: 5px;
-                top: 34px;
-                left: 0px;
-                &::before {
-                    display: inline-block;
-                    width: 10px;
-                    height: 10px;
-                    border: 5px solid transparent;
-                    border-bottom-color: red;
+                border-radius: 4px;
+                top: 40px;
+                left: 30px;
+                .span {
+                    font-size: 16px;
+                    color: #000000;
+                    line-height: 24px;
+                    text-align: center;
+                    padding-top: 12px;
+                }
+                p {
+                    padding: 12px 16px;
+                    font-size: 14px;
+                    color: #939599;
+                    line-height: 24px;
+                }
+            }
+            .hoverTips::before {
+                width: 0;
+                height: 0;
+                border-left: 7px solid transparent;
+                border-right: 7px solid transparent;
+                border-bottom: 10px solid #fff;
+                content: '';
+                display: block;
+                position: absolute;
+                left: 12px; //给小三角定位,更具实际需求调整
+                top: -10px; //给小三角定位,更具实际需求调整
+            }
+            .hoverTips1 {
+                position: absolute;
+                width: 188px;
+                background: #fff;
+                border-radius: 4px;
+                top: 40px;
+                left: -4px;
+                p {
+                    padding: 12px 16px;
+                    font-size: 14px;
+                    color: #939599;
+                    line-height: 24px;
                 }
             }
+            .hoverTips1::before {
+                width: 0;
+                height: 0;
+                border-left: 7px solid transparent;
+                border-right: 7px solid transparent;
+                border-bottom: 10px solid #fff;
+                content: '';
+                display: block;
+                position: absolute;
+                left: 12px; //给小三角定位,更具实际需求调整
+                top: -10px; //给小三角定位,更具实际需求调整
+            }
         }
         .card {
             height: 112px;

+ 14 - 2
src/main/pc-space/src/views/Send.vue

@@ -223,6 +223,19 @@ export default {
                 }, 1000);
             }
         },
+        // payWatch() {
+        //     //监控支付状态
+        //     this.payTimeout = setInterval(() => {
+        //         this.$http.get('/order/gift/get/' + this.idOrder).then(res => {
+        //             console.log(res);
+        //             if (res.status === 'FINISH') {
+        //                 clearInterval(this.payTimeout);
+        //                 // this.status = res.status;
+        //                 this.show = false;
+        //             }
+        //         });
+        //     }, 1000);
+        // },
         submit() {
             // if (this.payMethods === 'DCEP') {
             //     this.wait();
@@ -241,8 +254,7 @@ export default {
                             this.initTime(res.id, res.createdAt);
                             this.status = res.status;
                             this.idOrder = res.id;
-                            console.log(this.idOrder);
-                            console.log(this.payUrl);
+                            // this.payWatch();
                             // console.log(res);
                         })
                         .catch(e => {

+ 155 - 133
src/main/pc-space/src/views/Submit.vue

@@ -1,27 +1,35 @@
 <template>
     <div>
         <el-dialog center title="支付订单" :visible.sync="show" width="680px" :before-close="handleClose">
+            <div class="border"></div>
             <div class="page" v-loading="loading">
                 <div v-if="list2">
-                    <div>选择兑换券</div>
+                    <div class="title">选择兑换券</div>
                     <div class="coupon" @click="choose(list2)">
-                        <div class="coupon-top">
-                            <div class="text1">{{ list2.name }}</div>
-                            <div class="text2">
-                                <span>兑换券编码</span>
-                                <span>{{ list2.id }}</span>
+                        <div class="box">
+                            <img class="img" src="../assets/icon_youhuiquan_01@3x.png" alt="" />
+                            <div class="coupon-top">
+                                <div class="text1">{{ list2.name }}</div>
+                                <div class="text2" v-if="!list2.limited">仅限规定商品可用</div>
                             </div>
                         </div>
-                        <div class="coupon-bottom">
-                            <span>有效期至:{{ list2.expiration }}</span>
-                            <span v-if="!list2.limited">规定商品可用</span>
+                        <div class="box1">
+                            <div>
+                                <span class="text3"
+                                    >兑换券编码<span class="text4"> {{ list2.id }}</span></span
+                                >
+                                <div class="text5">有效期至:{{ list2.expiration }}</div>
+                            </div>
+                            <img
+                                v-if="chooseId === list2.id"
+                                class="icon"
+                                src="../assets/icon_gouxuan_pre.png"
+                                alt=""
+                            />
+                            <img v-else class="icon" src="../assets/icon_gouxuan_huise.png" alt="" />
                         </div>
-
-                        <img v-if="chooseId === list2.id" class="icon" src="../assets/icon_gouxuan_pre.png" alt="" />
-                        <img v-else class="icon" src="../assets/icon_gouxuan_huise.png" alt="" />
-                        <el-empty v-if="empty" description="暂无兑换券哦~" />
                     </div>
-                    <div @click="all">查看更多</div>
+                    <div class="all" @click="all">查看更多</div>
                 </div>
 
                 <div class="info">
@@ -32,13 +40,13 @@
                         <span class="text3">(含gas费¥{{ gas }})</span>
                     </div>
                     <div class="flex1"></div>
-                    <!-- <div class="order">
-                    <span class="text1">订单编号</span>
-                    <span class="text2">{{ orderInfo.id }}</span>
-                    <el-button type="info" @click="copy" size="mini" plain>复制</el-button>
-                </div> -->
+                    <div class="order">
+                        <span class="text1">订单编号</span>
+                        <span class="text2">{{ info.id }}</span>
+                        <el-button type="info" @click="copy" size="mini" plain>复制</el-button>
+                    </div>
                 </div>
-
+                <div class="border"></div>
                 <div class="payMethods">
                     <div class="title">选择支付方式</div>
                     <div class="pay-list">
@@ -55,7 +63,6 @@
                         <div class="qrcode">
                             <vue-qrcode :value="payUrl" :options="{ width: 140, margin: 1 }" class="code"></vue-qrcode>
                         </div>
-                        <!-- <div class="qrcode-text">二维码有效时常为5分钟,请尽快支付</div> -->
                         <h3 class="qrcode-text">
                             二维码有效时常为5分钟,<span v-if="minters < 10">0</span>{{ minters }}分<span
                                 v-if="seconds < 10"
@@ -85,20 +92,21 @@
             <div class="page">
                 <div v-for="(item, index) in list3" :key="index" @click="IdFn(item)">
                     <div class="coupon" @click="choose">
-                        <div class="coupon-top">
-                            <div class="text1">{{ item.name }}</div>
-                            <div class="text2">
-                                <span>兑换券编码</span>
-                                <span>{{ item.id }}</span>
+                        <div class="box">
+                            <img class="img" src="../assets/icon_youhuiquan_01@3x.png" alt="" />
+                            <div class="coupon-top">
+                                <div class="text1">{{ item.name }}</div>
+                                <div class="text2" v-if="!item.limited">仅限规定商品可用</div>
                             </div>
                         </div>
-                        <div class="coupon-bottom">
-                            <span>有效期至:{{ item.expiration }}</span>
-                            <span v-if="!item.limited">规定商品可用</span>
+                        <div class="box1">
+                            <div>
+                                <span class="text3"
+                                    >兑换券编码<span class="text4"> {{ item.id }}</span></span
+                                >
+                                <div class="text5">有效期至:{{ item.expiration }}</div>
+                            </div>
                         </div>
-
-                        <!-- <img v-if="chooseId === item.id" class="icon" src="../assets/icon_gouxuan_pre.png" alt="" />
-                <img v-else class="icon" src="../assets/icon_gouxuan_huise.png" alt="" /> -->
                         <el-empty v-if="empty" description="暂无兑换券哦~" />
                     </div>
                 </div>
@@ -251,8 +259,8 @@ export default {
                     }
                 )
                 .then(res => {
-                    this.list2 = res[0];
-                    this.list3 = res;
+                    this.list2 = res.content[0];
+                    this.list3 = res.content;
                 });
         },
         IdFn(e) {
@@ -264,6 +272,7 @@ export default {
         },
         choose(info) {
             // console.log(info);
+
             this.chooseId = info.id;
             this.$store.commit('setCouponInfo', info);
         },
@@ -275,24 +284,33 @@ export default {
         },
         payWatch() {
             //监控支付状态
-            let url = '/order/create?collectionId=' + this.$route.query.id + '&qty=1';
-            if (this.status != 'PROCESSING') {
-                this.payTimeout = setInterval(() => {
-                    this.$http.post(url).then(res => {
-                        if (res.status === 'PROCESSING') {
-                            clearInterval(this.payTimeout);
-                            // this.status = res.status;
-                            this.show = false;
-                        }
-                    });
-                }, 10000);
-            }
+            this.payTimeout = setInterval(() => {
+                this.$http.get('/order/get/' + this.id).then(res => {
+                    console.log(res);
+                    if (res.status === 'FINISH') {
+                        clearInterval(this.payTimeout);
+                        // this.status = res.status;
+                        this.show = false;
+                        setTimeout(() => {
+                            this.init2();
+                        }, 1000);
+                    }
+                });
+            }, 1000);
+        },
+        init2() {
+            this.$confirm('您购买成功的商品将在柜子中展示', '支付成功', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                customClass: 'myClass',
+                center: true
+            }).then(() => {});
         },
         submit() {
             // console.log(this.$baseUrl);
             // if (this.payMethods === 'DCEP') {
             //     this.wait();
-            // }搞
+            // }
             let url = '/order/create?collectionId=' + this.$route.query.id + '&qty=1';
             if (this.couponInfo) {
                 url += '&couponId=' + this.couponInfo.id;
@@ -343,7 +361,7 @@ export default {
                 });
         },
         copy() {
-            this.$copyText(this.orderInfo.id).then(
+            this.$copyText(this.info.id).then(
                 e => {
                     this.$message.success('复制成功');
                 },
@@ -358,8 +376,28 @@ export default {
     }
 };
 </script>
-
+<style lang="less">
+.myClass {
+    width: 340px;
+    .el-button {
+        background: linear-gradient(133deg, @prim 0%, @warn 100%);
+        border-radius: 4px;
+        border: 0;
+    }
+    .el-button:nth-last-child(2) {
+        background: #c4c7cc;
+        color: #ffffff;
+        font-size: 13px;
+    }
+}
+</style>
 <style lang="less" scoped>
+.border {
+    height: 1px;
+
+    background: #f2f3f5;
+    border-radius: 1px;
+}
 .info {
     .flex();
     height: 94px;
@@ -411,100 +449,84 @@ export default {
         }
     }
 }
+.all {
+    cursor: pointer;
+}
 /deep/.el-loading-mask {
     background-color: #ffffffee;
 }
+/deep/ .el-dialog {
+    border-radius: 8px;
+}
 .list {
     padding: 24px 0 50px;
 }
 .coupon {
     border-radius: 8px;
-    background: linear-gradient(135deg, rgba(253, 251, 96, 1), rgba(255, 143, 62, 1));
-    position: relative;
-    padding: 0 10px;
-    margin: 0 16px 16px;
-    &::after {
-        content: '';
-        position: absolute;
-        top: 1px;
-        right: 1px;
-        left: 1px;
-        bottom: 1px;
-        border-radius: 8px;
-        background-color: #181818;
-        z-index: 0;
-    }
-
-    div {
-        position: relative;
-        z-index: 1;
-    }
-
-    .coupon-top {
-        padding: 16px 0;
-
-        .text1 {
-            font-size: 18px;
-            font-weight: bold;
-            color: #939599;
-            line-height: 24px;
-            background: linear-gradient(0deg, #fdfb60 0%, #ff8f3e 100%);
-            -webkit-background-clip: text;
-            -webkit-text-fill-color: transparent;
+    display: flex;
+    margin-bottom: 16px;
+    .box {
+        display: flex;
+        .img {
+            width: 189px;
+            height: 120px;
+            position: relative;
+            z-index: 1;
         }
-
-        .text2 {
-            padding-top: 6px;
-            font-size: 12px;
-            line-height: 17px;
-            color: #939599;
-            span {
-                &:last-child {
-                    color: #fff;
-                    margin-left: 6px;
-                }
+        .coupon-top {
+            padding: 16px 0;
+            position: absolute;
+            z-index: 2;
+            .text1 {
+                text-align: center;
+                font-size: 24px;
+                font-family: PingFangSC-Medium, PingFang SC;
+                font-weight: bold;
+                color: #1a1a1a;
+                line-height: 36px;
+                margin: 15px 0 0 27px;
+            }
+            .text2 {
+                font-size: 12px;
+                font-weight: 400;
+                color: #1a1a1a;
+                line-height: 22px;
+                margin-left: 30px;
             }
         }
     }
-
-    .coupon-bottom {
-        border-top: 1px dashed #ebebeb;
-        color: #939599;
-        font-size: 11px;
-        line-height: 17px;
-        padding: 9px 0;
+    .box1 {
+        background: #e5e5e5;
+        border-radius: 0px 8px 8px 0px;
+        width: 100%;
         display: flex;
         justify-content: space-between;
-        position: relative;
-        &::before {
-            // content: '' !important;
-            // position: absolute;
-            // background-color: #181818;
-            // width: 16px;
-            // height: 16px;
-            // left: -18px;
-            // top: -8px;
-            // border-radius: 16px;
+        padding: 16px 20px;
+        .text3 {
+            font-size: 14px;
+            font-weight: 400;
+            color: #939599;
+            line-height: 24px;
         }
-        &::after {
-            // content: '';
-            // position: absolute;
-            // background-color: #181818;
-            // width: 16px;
-            // height: 16px;
-            // right: -18px;
-            // top: -8px;
-            // border-radius: 16px;
+        .text4 {
+            font-size: 14px;
+            font-weight: 400;
+            color: #000000;
+            line-height: 24px;
+            text-align: bottom;
+        }
+        .text5 {
+            font-size: 11px;
+            font-weight: 400;
+            color: #939599;
+            line-height: 16px;
+            margin-top: 45px;
+        }
+        .icon {
+            width: 24px;
+            height: 24px;
+            margin-top: 33px;
         }
-    }
-
-    .icon {
-        position: absolute;
-        width: 24px;
-        height: 24px;
-        right: 10px;
-        top: 30px;
-        z-index: 3;
     }
 }
 /deep/.el-radio {
@@ -565,14 +587,14 @@ export default {
         }
     }
 }
+.title {
+    font-size: 16px;
+    color: #000000;
+    line-height: 24px;
+    padding-bottom: 20px;
+}
 .payMethods {
     padding: 30px 0;
-    .title {
-        font-size: 16px;
-        color: #000000;
-        line-height: 24px;
-        padding-bottom: 20px;
-    }
 }
 /deep/.el-radio.is-bordered + .el-radio.is-bordered {
     margin-left: 0;

+ 12 - 3
src/main/pc-space/src/views/user/AccountData.vue

@@ -52,6 +52,7 @@
                                         </div>
                                     </div>
                                     <el-button
+                                        style="color: #939599"
                                         plain
                                         round
                                         :class="{ prim: !item.follow }"
@@ -119,7 +120,7 @@
                     <div class="text1">
                         <img class="icon" src="../../assets/user/icon_zhanghao@3x.png" alt="" />
                     </div>
-                    <div class="text2">登录账号</div>
+                    <div class="text6">登录账号</div>
                     <div class="text3">{{ Phone }}</div>
                 </div>
                 <div class="text4" @click="all('security')">修改</div>
@@ -129,7 +130,7 @@
                     <div class="text1">
                         <img class="icon" src="../../assets/user/icon_mima@3x (1).png" alt="" />
                     </div>
-                    <div class="text2">登录密码</div>
+                    <div class="text6">登录密码</div>
                     <div class="text3">********</div>
                 </div>
                 <div class="text4" @click="all('modifypad')">修改</div>
@@ -139,7 +140,7 @@
                     <div class="text1">
                         <img class="icon" src="../../assets/user/icon_mima@3x (1).png" alt="" />
                     </div>
-                    <div class="text2">交易密码</div>
+                    <div class="text6">交易密码</div>
                     <div class="text3">付款时用来认证身份信息</div>
                 </div>
                 <div class="text4" @click="all('/transaction')">修改</div>
@@ -582,6 +583,14 @@ export default {
                     }
                 }
                 .text2 {
+                    font-size: 17px;
+                    font-weight: 400;
+                    color: #ffffff;
+                    line-height: 24px;
+                    width: 94px;
+                    margin: -1px 0 0 10px;
+                }
+                .text6 {
                     font-size: 17px;
                     font-weight: 400;
                     color: #ffffff;

+ 1 - 0
src/main/pc-space/src/views/user/Authentication.vue

@@ -50,6 +50,7 @@ export default {
     .title {
         height: 42px;
         font-size: 32px;
+        font-family: ZhenyanGB-Regular, ZhenyanGB;
         font-weight: 400;
         color: #ffffff;
         line-height: 42px;

+ 4 - 2
src/main/pc-space/src/views/user/CollectionOrder.vue

@@ -70,11 +70,13 @@
                     <template slot-scope="scope">
                         <div style="display: flex">
                             <img
-                                style="width: 10px; height: 11px; margin-top: 8px"
+                                style="width: 10px; height: 11px; margin-top: 9px"
                                 src="../../assets/img/icon_jiage@3x.png"
                                 alt=""
                             />
-                            <div style="color: #fdfb60; font-size: 26px">
+                            <div
+                                style="color: #fdfb60; font-size: 30px; font-family: OSP-DIN, OSP; font-weight: normal"
+                            >
                                 {{ scope.row.price }}
                             </div>
                         </div>

+ 1 - 2
src/main/pc-space/src/views/user/EnterpriseAuthentication.vue

@@ -24,8 +24,6 @@
                 <div class="botn" v-if="userInfo.authStatus !== 'FAIL'" @click="all('accountdata')">返回</div>
                 <div class="botn" v-if="userInfo.authStatus === 'FAIL'" @click="Jump2">重新认证</div>
             </div>
-            <!-- v-loading="loading"
-    element-loading-text="拼命加载中" -->
             <div>
                 <div v-if="userInfo.authStatus === 'NOT_AUTH'">
                     <el-form ref="form" :label-position="labelPosition" :model="sizeForm" :rules="registerRule">
@@ -309,6 +307,7 @@ export default {
         height: 42px;
         font-size: 32px;
         font-weight: 400;
+        font-family: ZhenyanGB-Regular, ZhenyanGB;
         color: #ffffff;
         line-height: 42px;
         padding: 60px 0;

+ 1 - 0
src/main/pc-space/src/views/user/Modifypad.vue

@@ -201,6 +201,7 @@ export default {
         height: 42px;
         font-size: 32px;
         font-weight: 400;
+        font-family: ZhenyanGB-Regular, ZhenyanGB;
         color: #ffffff;
         line-height: 42px;
         padding: 60px 0;

+ 8 - 4
src/main/pc-space/src/views/user/OrderValue.vue

@@ -31,11 +31,13 @@
                     <template slot-scope="scope">
                         <div style="display: flex">
                             <img
-                                style="width: 10px; height: 11px; margin-top: 7px"
+                                style="width: 10px; height: 11px; margin-top: 9px"
                                 src="../../assets/user/icon_jiage@3x (5).png"
                                 alt=""
                             />
-                            <div style="color: #ffffff; font-size: 24px">
+                            <div
+                                style="color: #ffffff; font-size: 30px; font-family: OSP-DIN, OSP; font-weight: normal"
+                            >
                                 {{ scope.row.totalPrice }}
                             </div>
                         </div>
@@ -47,11 +49,13 @@
                     <template slot-scope="scope">
                         <div style="display: flex">
                             <img
-                                style="width: 10px; height: 11px; margin-top: 7px"
+                                style="width: 10px; height: 11px; margin-top: 9px"
                                 src="../../assets/img/icon_jiage@3x.png"
                                 alt=""
                             />
-                            <div style="color: #fdfb60; font-size: 24px">
+                            <div
+                                style="color: #fdfb60; font-size: 30px; font-family: OSP-DIN, OSP; font-weight: normal"
+                            >
                                 {{ scope.row.price }}
                             </div>
                         </div>

+ 4 - 2
src/main/pc-space/src/views/user/PayRecord.vue

@@ -54,11 +54,13 @@
                     <template slot-scope="scope">
                         <div style="display: flex">
                             <img
-                                style="width: 10px; height: 11px; margin-top: 8px"
+                                style="width: 10px; height: 11px; margin-top: 9px"
                                 src="../../assets/img/icon_jiage@3x.png"
                                 alt=""
                             />
-                            <div style="color: #fdfb60; font-size: 26px">
+                            <div
+                                style="color: #fdfb60; font-size: 30px; font-family: OSP-DIN, OSP; font-weight: normal"
+                            >
                                 {{ scope.row.price }}
                             </div>
                         </div>

+ 1 - 0
src/main/pc-space/src/views/user/Security.vue

@@ -191,6 +191,7 @@ export default {
         font-size: 32px;
         font-weight: 400;
         color: #ffffff;
+        font-family: ZhenyanGB-Regular, ZhenyanGB;
         line-height: 42px;
         padding: 60px 0;
     }

+ 1 - 0
src/main/pc-space/src/views/user/Transaction.vue

@@ -194,6 +194,7 @@ export default {
         font-weight: 400;
         color: #ffffff;
         line-height: 42px;
+        font-family: ZhenyanGB-Regular, ZhenyanGB;
         padding: 60px 0;
     }
     .box {

+ 2 - 1
src/main/pc-space/src/views/user/UserAuthentication.vue

@@ -26,7 +26,7 @@
             </div>
             <div v-if="userInfo.authStatus === 'NOT_AUTH'">
                 <el-form ref="form" :label-position="labelPosition" :model="sizeForm" :rules="registerRule">
-                    <el-form-item label="姓名" prop="nickname">
+                    <el-form-item label="姓名" prop="realName">
                         <el-input
                             style="width: 300px"
                             placeholder="请输入您的真实姓名"
@@ -227,6 +227,7 @@ export default {
         height: 42px;
         font-size: 32px;
         font-weight: 400;
+        font-family: ZhenyanGB-Regular, ZhenyanGB;
         color: #ffffff;
         line-height: 42px;
         padding: 60px 0;

+ 6 - 13
src/test/java/com/izouma/nineth/CommonTest.java

@@ -1,42 +1,31 @@
 package com.izouma.nineth;
 
-import com.aliyun.oss.OSS;
-import com.aliyun.oss.OSSClient;
-import com.aliyun.oss.model.SetBucketCORSRequest;
 import com.github.kevinsawicki.http.HttpRequest;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.domain.BaseEntity;
 import com.izouma.nineth.domain.BlindBoxItem;
 import com.izouma.nineth.domain.User;
-import com.izouma.nineth.enums.AuthorityName;
-import com.izouma.nineth.security.Authority;
-import com.izouma.nineth.utils.UrlUtils;
 import com.izouma.nineth.web.BaseController;
 import io.ipfs.api.IPFS;
 import io.ipfs.api.MerkleNode;
 import io.ipfs.api.NamedStreamable;
-import io.ipfs.cid.Cid;
 import io.ipfs.multihash.Multihash;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import lombok.SneakyThrows;
 import net.coobird.thumbnailator.Thumbnails;
-import net.coobird.thumbnailator.name.Rename;
 import org.apache.commons.codec.EncoderException;
 import org.apache.commons.codec.net.URLCodec;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.Range;
 import org.apache.commons.text.CaseUtils;
-import org.apache.http.client.utils.URLEncodedUtils;
 import org.apache.poi.util.TempFile;
 import org.bouncycastle.util.encoders.Base64;
-import org.bouncycastle.util.encoders.UrlBase64Encoder;
 import org.bytedeco.javacv.FFmpegFrameGrabber;
 import org.bytedeco.javacv.Frame;
 import org.bytedeco.javacv.Java2DFrameConverter;
-import org.junit.Assert;
 import org.junit.Test;
 import org.libjpegturbo.turbojpeg.processor.api.ImageProcessException;
 import org.libjpegturbo.turbojpeg.processor.api.ImageProcessInfo;
@@ -61,12 +50,11 @@ import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Method;
-import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.*;
 import java.util.List;
+import java.util.*;
 import java.util.regex.Pattern;
 
 import static java.nio.file.StandardOpenOption.CREATE;
@@ -371,4 +359,9 @@ public class CommonTest {
         System.out.println(claims.getSubject());
         System.out.println(claims.getExpiration());
     }
+
+    @Test
+    public void testReplace(){
+        System.out.println("15077886171".replaceAll("(?<=.{3}).*(?=.{4})", "**"));
+    }
 }

+ 5 - 0
src/test/java/com/izouma/nineth/service/UserServiceTest.java

@@ -20,4 +20,9 @@ public class UserServiceTest extends ApplicationTests {
         userRepo.findByUsernameAndDelFalse("admin");
         userRepo.findByUsernameAndDelFalse("admin");
     }
+
+    @Test
+    public void searchByPhone() {
+        System.out.println(userService.searchByPhone("15077886171"));
+    }
 }