Procházet zdrojové kódy

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

xuqiang před 4 roky
rodič
revize
d3c87aac52
51 změnil soubory, kde provedl 753 přidání a 285 odebrání
  1. 1 3
      src/main/java/com/izouma/nineth/repo/CollectionRepo.java
  2. 40 0
      src/main/java/com/izouma/nineth/repo/UserRepo.java
  3. 5 0
      src/main/java/com/izouma/nineth/service/CollectionService.java
  4. 18 15
      src/main/java/com/izouma/nineth/service/UserService.java
  5. binární
      src/main/nine-space/src/assets/NO1.png
  6. binární
      src/main/nine-space/src/assets/NO2.png
  7. binární
      src/main/nine-space/src/assets/NO3.png
  8. binární
      src/main/nine-space/src/assets/icon_gouxuan.png
  9. binární
      src/main/nine-space/src/assets/info_icon_ershoushichang.png
  10. binární
      src/main/nine-space/src/assets/info_icon_jiaoyijilu1.png
  11. binární
      src/main/nine-space/src/assets/info_icon_jingxuanxilie.png
  12. binární
      src/main/nine-space/src/assets/info_icon_paimaixilie.png
  13. binární
      src/main/nine-space/src/assets/info_icon_zhuzaozhe.png
  14. binární
      src/main/nine-space/src/assets/png-biaokuag-01.png
  15. binární
      src/main/nine-space/src/assets/png-biaokuag-02.png
  16. binární
      src/main/nine-space/src/assets/renzheng-icon-geren-pre.png
  17. binární
      src/main/nine-space/src/assets/renzheng-icon-geren.png
  18. binární
      src/main/nine-space/src/assets/renzheng-icon-qiye-pre.png
  19. binární
      src/main/nine-space/src/assets/renzheng-icon-qiye.png
  20. 1 1
      src/main/nine-space/src/components/AppBar.vue
  21. 1 0
      src/main/nine-space/src/components/LikeButton.vue
  22. 11 11
      src/main/nine-space/src/components/Loading.vue
  23. 5 1
      src/main/nine-space/src/components/asset/assetInfo.vue
  24. 10 11
      src/main/nine-space/src/components/creator/CreatorInfo.vue
  25. 2 2
      src/main/nine-space/src/components/order/OrderInfo.vue
  26. 124 0
      src/main/nine-space/src/components/product/HashCode.vue
  27. 33 0
      src/main/nine-space/src/components/product/ProductTitle.vue
  28. 20 1
      src/main/nine-space/src/components/product/productInfo.vue
  29. 15 1
      src/main/nine-space/src/components/product/productLarge.vue
  30. 2 0
      src/main/nine-space/src/mixins/banner.js
  31. 8 0
      src/main/nine-space/src/mixins/product.js
  32. 8 4
      src/main/nine-space/src/router/index.js
  33. 8 0
      src/main/nine-space/src/styles/app.less
  34. 60 2
      src/main/nine-space/src/styles/common/common.less
  35. 9 44
      src/main/nine-space/src/views/Discover.vue
  36. 15 20
      src/main/nine-space/src/views/Home.vue
  37. 12 5
      src/main/nine-space/src/views/Mine.vue
  38. 1 1
      src/main/nine-space/src/views/Store.vue
  39. 18 1
      src/main/nine-space/src/views/Submit.vue
  40. 109 8
      src/main/nine-space/src/views/account/Authentication.vue
  41. 63 63
      src/main/nine-space/src/views/asset/Detail.vue
  42. 5 1
      src/main/nine-space/src/views/asset/GiveSearch.vue
  43. 6 2
      src/main/nine-space/src/views/asset/Search.vue
  44. 34 18
      src/main/nine-space/src/views/creator/Detail.vue
  45. 18 1
      src/main/nine-space/src/views/creator/List.vue
  46. 5 2
      src/main/nine-space/src/views/creator/Search.vue
  47. 36 54
      src/main/nine-space/src/views/product/Detail.vue
  48. 38 4
      src/main/nine-space/src/views/product/List.vue
  49. 10 7
      src/main/nine-space/src/views/product/Search.vue
  50. 1 1
      src/main/nine-space/src/views/user/Point.vue
  51. 1 1
      src/main/nine-space/src/views/user/Wallet.vue

+ 1 - 3
src/main/java/com/izouma/nineth/repo/CollectionRepo.java

@@ -40,11 +40,9 @@ public interface CollectionRepo extends JpaRepository<Collection, Long>, JpaSpec
 
     @Nonnull
     @CachePut(value = "collection", key = "#collection.id")
-    @CacheEvict(value = {"recommend"})
     Collection save(@Nonnull Collection collection);
 
     @Query("select c from Collection c join Recommend r on c.id = r.collectionId " +
-            "where c.del = false and c.onShelf = true order by r.sort desc")
-    @Cacheable("recommend")
+            "where c.del = false and c.onShelf = true and r.type = ?1 order by r.sort desc")
     List<Collection> recommend(String type);
 }

+ 40 - 0
src/main/java/com/izouma/nineth/repo/UserRepo.java

@@ -95,4 +95,44 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     List<User> findByPhoneInAndDelFalse(Iterable<String> phone);
 
     List<User> findByIdInAndDelFalse(Iterable<Long> userId);
+
+    @Query(value = "update asset join user on asset.minter_id = user.id " +
+            "set asset.minter        = user.nickname, " +
+            "    asset.minter_avatar = user.avatar " +
+            "where user.id = ?1 ", nativeQuery = true)
+    @Modifying
+    @Transactional
+    void updateAssetMinter(Long userId);
+
+    @Query(value = "update asset join user on asset.owner_id = user.id " +
+            "set asset.owner        = user.nickname, " +
+            "    asset.owner_avatar = user.avatar " +
+            "where user.id = ?1 ", nativeQuery = true)
+    @Modifying
+    @Transactional
+    void updateAssetOwner(Long userId);
+
+    @Query(value = "update collection_info join user on collection_info.minter_id = user.id " +
+            "set collection_info.minter        = user.nickname, " +
+            "    collection_info.minter_avatar = user.avatar " +
+            "where user.id = ?1 ", nativeQuery = true)
+    @Modifying
+    @Transactional
+    void updateCollectionMinter(Long userId);
+
+    @Query(value = "update collection_info join user on collection_info.owner_id = user.id " +
+            "set collection_info.owner        = user.nickname, " +
+            "    collection_info.owner_avatar = user.avatar " +
+            "where user.id = ?1 ", nativeQuery = true)
+    @Modifying
+    @Transactional
+    void updateCollectionOwner(Long userId);
+
+    @Query(value = "update order_info join user on order_info.minter_id = user.id " +
+            "set order_info.minter        = user.nickname, " +
+            "    order_info.minter_avatar = user.avatar " +
+            "where user.id = ?1 ", nativeQuery = true)
+    @Modifying
+    @Transactional
+    void updateOrderMinter(Long userId);
 }

+ 5 - 0
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -16,6 +16,7 @@ import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.Range;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
@@ -43,6 +44,10 @@ public class CollectionService {
     private AssetService                  assetService;
     private RedisTemplate<String, Object> redisTemplate;
 
+    @CacheEvict(value = "collection", allEntries = true)
+    public void clearCache() {
+    }
+
     public Page<Collection> all(PageQuery pageQuery) {
         pageQuery.getQuery().put("del", false);
         String type = MapUtils.getString(pageQuery.getQuery(), "type", "DEFAULT");

+ 18 - 15
src/main/java/com/izouma/nineth/service/UserService.java

@@ -49,27 +49,30 @@ 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 IdentityAuthRepo identityAuthRepo;
-    private SysConfigService sysConfigService;
+    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;
+    private SysConfigService  sysConfigService;
+    private CollectionService collectionService;
 
     @CacheEvict(value = "user", key = "#user.username")
     public User update(User user) {
         User orig = userRepo.findById(user.getId()).orElseThrow(new BusinessException("无记录"));
         ObjUtils.merge(orig, user);
         orig = userRepo.save(orig);
-        userRepo.updateMinterForCollection(orig.getId());
-        userRepo.updateOwnerForCollection(orig.getId());
-        userRepo.updateMinterForOrder(orig.getId());
-        userRepo.updateMinterForAsset(orig.getId());
+        userRepo.updateAssetMinter(orig.getId());
+        userRepo.updateAssetOwner(orig.getId());
+        userRepo.updateCollectionMinter(orig.getId());
+        userRepo.updateCollectionOwner(orig.getId());
+        userRepo.updateOrderMinter(orig.getId());
+        collectionService.clearCache();
         return orig;
     }
 

binární
src/main/nine-space/src/assets/NO1.png


binární
src/main/nine-space/src/assets/NO2.png


binární
src/main/nine-space/src/assets/NO3.png


binární
src/main/nine-space/src/assets/icon_gouxuan.png


binární
src/main/nine-space/src/assets/info_icon_ershoushichang.png


binární
src/main/nine-space/src/assets/info_icon_jiaoyijilu1.png


binární
src/main/nine-space/src/assets/info_icon_jingxuanxilie.png


binární
src/main/nine-space/src/assets/info_icon_paimaixilie.png


binární
src/main/nine-space/src/assets/info_icon_zhuzaozhe.png


binární
src/main/nine-space/src/assets/png-biaokuag-01.png


binární
src/main/nine-space/src/assets/png-biaokuag-02.png


binární
src/main/nine-space/src/assets/renzheng-icon-geren-pre.png


binární
src/main/nine-space/src/assets/renzheng-icon-geren.png


binární
src/main/nine-space/src/assets/renzheng-icon-qiye-pre.png


binární
src/main/nine-space/src/assets/renzheng-icon-qiye.png


+ 1 - 1
src/main/nine-space/src/components/AppBar.vue

@@ -39,7 +39,7 @@ export default {
             actions: [
                 { text: '首页', icon: require('../assets/menu1.png'), value: '/home' },
                 { text: '发现', icon: require('../assets/menu2.png'), value: '/discover' },
-                { text: '柜子', icon: require('../assets/menu3.png'), value: '/store' },
+                { text: '藏品室', icon: require('../assets/menu3.png'), value: '/store' },
                 { text: '我的', icon: require('../assets/menu4.png'), value: '/mine' }
             ]
         };

+ 1 - 0
src/main/nine-space/src/components/LikeButton.vue

@@ -38,6 +38,7 @@ export default {
     display: inline-block;
     color: #949699;
     line-height: 24px;
+    flex-shrink: 0;
 
     img {
         vertical-align: middle;

+ 11 - 11
src/main/nine-space/src/components/Loading.vue

@@ -65,7 +65,7 @@
     animation: spinner 2.5s cubic-bezier(0.75, 0, 0.5, 1) infinite normal;
     width: 50px;
     height: 50px;
-    background-color: #FFB178;
+    background-color: #ffb178;
 }
 
 /* Create shadow and set animation*/
@@ -88,11 +88,11 @@
     50% {
         -webkit-border-radius: 50%;
         -webkit-transform: scale(0.5) rotate(360deg);
-        background-color: #FFFECB;
+        background-color: #fffecb;
     }
     100% {
         -webkit-transform: scale(1) rotate(720deg);
-        background-color: #FFB178;
+        background-color: #ffb178;
     }
 }
 
@@ -100,11 +100,11 @@
     50% {
         -moz-border-radius: 50%;
         -moz-transform: scale(0.5) rotate(360deg);
-        background-color: #FFFECB;
+        background-color: #fffecb;
     }
     100% {
         -moz-transform: scale(1) rotate(720deg);
-        background-color: #FFB178;
+        background-color: #ffb178;
     }
 }
 
@@ -112,11 +112,11 @@
     50% {
         -mos-border-radius: 50%;
         -mos-transform: scale(0.5) rotate(360deg);
-        background-color: #FFFECB;
+        background-color: #fffecb;
     }
     100% {
         -mos-transform: scale(1) rotate(720deg);
-        background-color: #FFB178;
+        background-color: #ffb178;
     }
 }
 
@@ -124,11 +124,11 @@
     50% {
         -o-border-radius: 50%;
         -o-transform: scale(0.5) rotate(360deg);
-        background-color: #FFFECB;
+        background-color: #fffecb;
     }
     100% {
         -o-transform: scale(1) rotate(720deg);
-        background-color: #FFB178;
+        background-color: #ffb178;
     }
 }
 
@@ -136,11 +136,11 @@
     50% {
         border-radius: 50%;
         transform: scale(0.5) rotate(360deg);
-        background-color: #FFFECB;
+        background-color: #fffecb;
     }
     100% {
         transform: scale(1) rotate(720deg);
-        background-color: #FFB178;
+        background-color: #ffb178;
     }
 }
 

+ 5 - 1
src/main/nine-space/src/components/asset/assetInfo.vue

@@ -30,7 +30,7 @@
             <div class="text">
                 <div class="minter">
                     <van-image width="18" height="18" radius="18" :src="info.minterAvatar" fit="cover" />
-                    <span>铸造者</span>
+                    <span class="van-ellipsis">{{ info.minter }}</span>
                 </div>
                 <!-- <van-image width="18" height="18" :radius="100" :src="info.minterAvatar" fit="cover" />
                 <span>{{ info.minter }}</span> -->
@@ -169,8 +169,12 @@ export default {
     color: @text3;
     line-height: 22px;
     align-items: center;
+    overflow: hidden;
     span {
         margin-left: 4px;
     }
+    .van-image {
+        flex-shrink: 0;
+    }
 }
 </style>

+ 10 - 11
src/main/nine-space/src/components/creator/CreatorInfo.vue

@@ -36,7 +36,6 @@
                     <span>{{ info.sales }}</span>
                 </div>
                 <van-button
-                    v-if="!isFollow"
                     @click.prevent="follow"
                     :class="{ follow: info.follow }"
                     plain
@@ -44,7 +43,7 @@
                     size="mini"
                     round
                 >
-                    {{ info.follow ? '已关注' : '关注' }}
+                    {{ info.follow ? (isFollow ? '互相关注' : '已关注') : '关注' }}
                 </van-button>
             </div>
         </div>
@@ -117,7 +116,7 @@ export default {
 <style lang="less" scoped>
 .info {
     display: flex;
-    padding: 24px 16px;
+    padding: 22px 16px;
     position: relative;
 
     .content {
@@ -128,7 +127,6 @@ export default {
 
         .text1 {
             font-size: @font2;
-            font-weight: bold;
             color: #ffffff;
             line-height: 24px;
         }
@@ -148,7 +146,7 @@ export default {
             .sale {
                 display: flex;
                 align-items: center;
-                font-size: @font2;
+                font-size: @font1;
                 line-height: 24px;
 
                 .font_family {
@@ -174,6 +172,7 @@ export default {
                 background-origin: border-box;
                 box-sizing: border-box;
                 background-clip: content-box, border-box;
+                font-size: @font1;
 
                 &.follow {
                     background-image: linear-gradient(@bg, @bg), linear-gradient(135deg, @text3, @text3);
@@ -200,11 +199,11 @@ export default {
 
     .NOImg {
         position: absolute;
-        width: 98px;
-        height: 104px;
+        width: 80px;
+        height: 90px;
         display: block;
-        left: 11px;
-        top: 14px;
+        left: 12px;
+        top: 10px;
     }
 }
 
@@ -213,8 +212,8 @@ export default {
     &::before {
         content: '';
         position: absolute;
-        left: 8px;
-        right: 0;
+        left: 20px;
+        right: 20px;
         top: 0;
         height: 1px;
         background-color: #202122;

+ 2 - 2
src/main/nine-space/src/components/order/OrderInfo.vue

@@ -20,7 +20,7 @@
                 <div class="name van-multi-ellipsis--l2">
                     {{ info.name }}
                 </div>
-                <div class="text">编号:{{ info.collectionId }}</div>
+                <div class="text">编号:{{ info.id }}</div>
                 <div class="flex1"></div>
                 <div class="price">¥{{ info.price }}</div>
             </div>
@@ -31,7 +31,7 @@
         </div>
 
         <div class="btns">
-            <van-button color="@text3" @click.prevent="del" plain size="mini" round> 删除订单 </van-button>
+            <van-button color="#939599" @click.prevent="del" plain size="mini" round> 删除订单 </van-button>
         </div>
     </router-link>
 </template>

+ 124 - 0
src/main/nine-space/src/components/product/HashCode.vue

@@ -0,0 +1,124 @@
+<template>
+    <van-collapse-item name="hashCode" class="goods-info">
+        <template #title>
+            <div class="page-title"><img src="../../assets/icon-lianshangxinxi(3).png" alt="" />链上信息</div>
+        </template>
+        <div class="page-text" v-if="info.txHash">
+            <div class="text-info">
+                <span class="text1">Hash地址:</span>
+                <span class="flex1"></span>
+                <img @click="copy(info.txHash)" src="../../assets/svgs/copy_icon.svg" alt="" />
+                <span class="van-ellipsis">{{ info.txHash }}</span>
+            </div>
+            <div class="text-info">
+                <span class="text1">区块高度: </span>
+                <span class="flex1"></span>
+                <span>{{ info.blockNumber }}</span>
+            </div>
+            <div class="text-info">
+                <span class="text1">令牌ID: </span>
+                <span class="flex1"></span>
+                <img @click="copy(info.tokenId)" src="../../assets/svgs/copy_icon.svg" alt="" />
+                <span class="van-ellipsis">{{ info.tokenId }}</span>
+            </div>
+        </div>
+        <div v-else class="textName">铸造者未设置</div>
+    </van-collapse-item>
+</template>
+
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        }
+    },
+    methods: {
+        copy(text) {
+            this.$copyText(text).then(
+                e => {
+                    this.$toast.success('复制成功');
+                    console.log(e);
+                },
+                e => {
+                    this.$toast('复制失败');
+                    console.log(e);
+                }
+            );
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.goods-info {
+    .van-cell {
+        // padding: 0 0;
+        &::after {
+            content: none;
+        }
+    }
+}
+.page-title {
+    // padding: 0 16px;
+    font-size: @font2;
+    font-weight: bold;
+    color: #ffffff;
+    line-height: 28px;
+    span {
+        color: @text3;
+        font-size: @font1;
+    }
+}
+
+.page-title {
+    font-size: @font2;
+    font-weight: bold;
+    color: #ffffff;
+    line-height: 24px;
+    display: flex;
+    align-items: center;
+    &:not(:first-child) {
+        padding-top: 16px;
+    }
+    img {
+        width: 18px;
+        height: 18px;
+        margin-right: 6px;
+    }
+}
+.page-text {
+    font-size: @font2;
+    color: @text3;
+    line-height: 28px;
+    word-break: break-all;
+    // margin-top: 10px;
+    // p {
+    //     font-size: @font2;
+    //     color: #ffffff;
+    //     line-height: 28px;
+    //     // margin-top: 10px;
+    //     word-break: break-all;
+    // }
+
+    .text-info {
+        .flex();
+        .text1 {
+            min-width: 80px;
+        }
+        .van-ellipsis {
+            width: 200px;
+        }
+
+        img {
+            width: 18px;
+            height: 18px;
+            flex-shrink: 0;
+            margin-right: 6px;
+        }
+    }
+}
+</style>

+ 33 - 0
src/main/nine-space/src/components/product/ProductTitle.vue

@@ -0,0 +1,33 @@
+<template>
+    <div class="product-title">
+        <span><slot></slot></span>
+        <img class="img1" src="../../assets/png-biaokuag-01.png" alt="" />
+        <img class="img2" src="../../assets/png-biaokuag-02.png" alt="" />
+    </div>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style lang="less" scoped>
+.product-title {
+    font-size: @font4;
+    color: #ffffff;
+    line-height: 44px;
+    padding: 0 20px;
+    position: relative;
+    img {
+        width: 20px;
+        height: 44px;
+        position: absolute;
+        top: 0;
+        &.img1 {
+            left: 0;
+        }
+        &.img2 {
+            right: 0;
+        }
+    }
+}
+</style>

+ 20 - 1
src/main/nine-space/src/components/product/productInfo.vue

@@ -29,13 +29,14 @@
             <div class="text">
                 <div class="minter">
                     <van-image width="18" height="18" radius="18" :src="info.minterAvatar" fit="cover" />
-                    <span>铸造者</span>
+                    <span class="van-ellipsis">{{ info.minter }}</span>
                 </div>
                 <div class="flex1"></div>
                 <like-button :isLike="info.liked" @click="likeProduct">
                     {{ info.likes }}
                 </like-button>
             </div>
+            <div class="sold" v-if="isSold">已售馨</div>
         </div>
     </router-link>
 </template>
@@ -86,6 +87,7 @@ export default {
     display: inline-block;
     border-radius: 8px;
     overflow: hidden;
+    position: relative;
 
     .van-image {
         overflow: hidden;
@@ -153,8 +155,25 @@ export default {
     color: @text3;
     line-height: 22px;
     align-items: center;
+    margin-right: 10px;
+    overflow: hidden;
+    .van-image {
+        flex-shrink: 0;
+    }
     span {
         margin-left: 4px;
     }
 }
+.sold {
+    background-color: #303133;
+    font-size: @font1;
+    color: #939599;
+    padding: 0 6px;
+    border-radius: 13px;
+    line-height: 24px;
+    position: absolute;
+    top: 6px;
+    left: 6px;
+    z-index: 5;
+}
 </style>

+ 15 - 1
src/main/nine-space/src/components/product/productLarge.vue

@@ -41,8 +41,10 @@
             <span>即将开售:{{ time }}</span>
         </div>
 
+        <div class="sold" v-if="isSold">已售馨</div>
+
         <img class="bg" src="../../assets/png-diwen.png" alt="" />
-        <img class="top-bg" src="../../assets/collecbg.png" alt="" />
+        <img class="top-bg" v-if="time" src="../../assets/collecbg.png" alt="" />
     </router-link>
 </template>
 
@@ -219,4 +221,16 @@ export default {
     font-size: @font2;
     color: #fff;
 }
+.sold {
+    background-color: #303133;
+    font-size: @font1;
+    color: #939599;
+    padding: 0 17px;
+    border-radius: 13px;
+    line-height: 24px;
+    position: absolute;
+    top: 16px;
+    left: 16px;
+    z-index: 3;
+}
 </style>

+ 2 - 0
src/main/nine-space/src/mixins/banner.js

@@ -3,6 +3,8 @@ export default {
         goNext(info) {
             if (info.link && info.linkType === 'collection') {
                 this.$router.push(`/productDetail?id=${info.linkContent}`);
+            } else if (info.link && info.linkType === 'user') {
+                this.$router.push(`/creatorDetail?id=${info.linkContent}`);
             }
         }
     }

+ 8 - 0
src/main/nine-space/src/mixins/product.js

@@ -28,6 +28,11 @@ export default {
                     value: 'AUCTION'
                 }
             ],
+            sourceOptions: [
+                { label: '官方', value: 'OFFICIAL' },
+                { label: '用户铸造', value: 'USER' },
+                { label: '二手市场', value: 'TRANSFER' }
+            ],
             picsTypes: [
                 {
                     label: '视频',
@@ -49,6 +54,9 @@ export default {
             } else {
                 return false;
             }
+        },
+        isSold() {
+            return this.info.sale === this.info.total
         }
     },
     methods: {

+ 8 - 4
src/main/nine-space/src/router/index.js

@@ -42,7 +42,7 @@ function jsapiSign() {
                         });
                     });
                 })
-                .catch(e => {});
+                .catch(e => { });
         }
     }, 200);
 }
@@ -189,7 +189,11 @@ const routes = [
     {
         path: '/about',
         name: 'about',
-        component: () => import('../views/account/About.vue')
+        component: () => import('../views/account/About.vue'),
+        meta: {
+            pageType: Page.Every,
+            title: '第九空间'
+        }
     },
     {
         path: '/connect',
@@ -433,8 +437,8 @@ router.beforeEach((to, from, next) => {
     }
     console.log(to);
 
-    if(to.query.invitor){
-        sessionStorage.setItem('invitor',to.query.invitor)
+    if (to.query.invitor) {
+        sessionStorage.setItem('invitor', to.query.invitor);
     }
 
     if (!store.state.userInfo && to.meta.pageType !== Page.Login) {

+ 8 - 0
src/main/nine-space/src/styles/app.less

@@ -127,3 +127,11 @@ input:-webkit-autofill {
     width: 235px;
     height: 170px;
 }
+
+.van-tab {
+    color: @text3 !important;
+    &.van-tab--active {
+        color: @prim !important;
+        font-weight: bold;
+    }
+}

+ 60 - 2
src/main/nine-space/src/styles/common/common.less

@@ -126,6 +126,64 @@
     hyphens: auto;
 }
 
-.linear(){
+.linear() {
     background: linear-gradient(135deg, @prim, @warn);
-}
+}
+
+@keyframes flipY {
+    0% {
+        transform: perspective(500px) rotateX(0deg) rotateY(15deg);
+    }
+    50% {
+        transform: perspective(500px) rotateX(0deg) rotateY(-15deg);
+    }
+    100% {
+        transform: perspective(500px) rotateX(0deg) rotateY(15deg);
+    }
+}
+@keyframes flipYLight {
+    0% {
+        left: -100vw;
+        opacity: 0.3;
+        width: 25px;
+    }
+    25% {
+        left: 45vw;
+        opacity: 0;
+        width: 45px;
+    }
+    50% {
+        left: 150vw;
+        opacity: 0.3;
+        width: 25px;
+    }
+    75% {
+        left: 45vw;
+        opacity: 0;
+        width: 45px;
+    }
+    100% {
+        left: -100vw;
+        opacity: 0.3;
+        width: 25px;
+    }
+}
+
+.detail-animate() {
+    animation: flipY 6s ease-in-out infinite;
+    position: relative;
+    &::after {
+        content: '';
+        background-color: #fff;
+        position: absolute;
+        background: #fff;
+        width: 25px;
+        height: 100vw;
+        top: 0;
+        left: 45px;
+        opacity: 0;
+        transform: skewX(-25deg);
+        z-index: 2;
+        animation: flipYLight 6s ease-in-out infinite;
+    }
+}

+ 9 - 44
src/main/nine-space/src/views/Discover.vue

@@ -23,30 +23,14 @@
                     <img class="grid-img" src="../assets/info_icon_jingxuanxilie.png" />
                 </template>
             </van-grid-item>
-            <van-grid-item
-                text="原创系列"
-                :to="{
-                    path: '/productList',
-                    query: {
-                        type: 'DEFAULT'
-                    }
-                }"
-            >
+            <van-grid-item text="二手市场" :to="{ path: '/productList', query: { source: 'TRANSFER' } }">
                 <template v-slot:icon>
-                    <img class="grid-img" src="../assets/info_icon_yuanchangxilie.png" />
+                    <img class="grid-img" src="../assets/info_icon_ershoushichang.png" />
                 </template>
             </van-grid-item>
-            <van-grid-item
-                text="数字盲盒"
-                :to="{
-                    path: '/productList',
-                    query: {
-                        type: 'BLIND_BOX'
-                    }
-                }"
-            >
+            <van-grid-item text="铸造者" :to="{ path: '/creatorList' }">
                 <template v-slot:icon>
-                    <img class="grid-img" src="../assets/info_icon_manghexilie.png" />
+                    <img class="grid-img" src="../assets/info_icon_zhuzaozhe.png" />
                 </template>
             </van-grid-item>
             <van-grid-item text="拍卖系列" @click="wait">
@@ -54,26 +38,11 @@
                     <img class="grid-img" src="../assets/info_icon_paimaixilie.png" />
                 </template>
             </van-grid-item>
-            <van-grid-item text="二手市场" @click="wait">
-                <template v-slot:icon>
-                    <img class="grid-img" src="../assets/info_icon_ershoushichang.png" />
-                </template>
-            </van-grid-item>
-            <van-grid-item text="铸造商店" @click="wait">
+            <!-- <van-grid-item text="铸造商店" @click="wait">
                 <template v-slot:icon>
                     <img class="grid-img" src="../assets/info_icon_zhuzaoshangdian.png" />
                 </template>
-            </van-grid-item>
-            <van-grid-item text="铸造者" :to="{ path: '/creatorList' }">
-                <template v-slot:icon>
-                    <img class="grid-img" src="../assets/info_icon_zhuzaozhe.png" />
-                </template>
-            </van-grid-item>
-            <van-grid-item text="系列活动" @click="wait">
-                <template v-slot:icon>
-                    <img class="grid-img" src="../assets/info_icon_xiliehuodong.png" />
-                </template>
-            </van-grid-item>
+            </van-grid-item> -->
         </van-grid>
 
         <div class="box" v-if="box.length > 0">
@@ -102,18 +71,14 @@
         <div class="casting" v-if="miners.length > 0">
             <page-title title="最受欢迎铸造者" :to="{ path: '/creatorList' }"></page-title>
             <template v-for="(item, index) in miners" :key="index">
-                <creator-info
-                    :rank="index < 3 ? index + 1 : 0"
-                    v-model:info="miners[index]"
-                    size="large"
-                ></creator-info>
+                <creator-info :rank="index < 3 ? index + 1 : 0" v-model:info="miners[index]"></creator-info>
             </template>
         </div>
 
         <div class="box">
             <page-title title="更多藏品" :isLink="false"></page-title>
             <van-list
-                style="padding-bottom: 100px"
+                style="padding-bottom: 100px;"
                 class="box-list"
                 v-model:loading="loading"
                 :finished="finished"
@@ -203,7 +168,7 @@ export default {
                             onShelf: true,
                             del: false
                         },
-                        sort: 'createdAt,desc'
+                        sort: 'sort,desc'
                     },
                     { body: 'json' }
                 )

+ 15 - 20
src/main/nine-space/src/views/Home.vue

@@ -8,7 +8,7 @@
             :autoplay="{ delay: 3500 }"
             v-if="banners.length > 0"
         >
-            <swiper-slide v-for="item in products" :key="item.id">
+            <swiper-slide v-for="item in banners" :key="item.id">
                 <product-small :info="item"></product-small>
             </swiper-slide>
         </swiper>
@@ -63,29 +63,24 @@ export default {
                 message: '加载中...',
                 forbidClick: true
             });
-            this.getBanner();
-            this.getProduct().then(res => {
-                this.products = res;
+            Promise.all([
+                this.getProduct().then(res => {
+                    this.banners = res;
+                }),
+                this.getProduct('LIST').then(res => {
+                    this.products = res;
+                })
+            ]).then(() => {
+                this.$toast.clear();
             });
         },
-        getProduct(type = '') {
+        getProduct(type = 'BANNER') {
             return this.$http
-                .post(
-                    '/collection/all',
-                    {
-                        page: 0,
-                        size: 4,
-                        query: {
-                            type: type,
-                            onShelf: true,
-                            del: false
-                        },
-                        sort: 'createdAt,desc'
-                    },
-                    { body: 'json' }
-                )
+                .get('/collection/recommend', {
+                    type: type
+                })
                 .then(res => {
-                    return Promise.resolve(res.content);
+                    return Promise.resolve(res);
                 });
         },
         getBanner() {

+ 12 - 5
src/main/nine-space/src/views/Mine.vue

@@ -16,7 +16,12 @@
                         <div class="text1 van-ellipsis">
                             <span>{{ userInfo.nickname }}</span>
 
-                            <img v-if="authStatus === '已认证'" src="../assets/renzheng_icon_pre.png" alt="" />
+                            <img
+                                @click="$router.push('/verifiedSuc')"
+                                v-if="authStatus === '已认证'"
+                                src="../assets/renzheng_icon_pre.png"
+                                alt=""
+                            />
                         </div>
                         <div class="text2">
                             <span>
@@ -43,7 +48,7 @@
                     </div>
                     <van-button
                         plain
-                        color="@text3"
+                        color="#939599"
                         size="mini"
                         :icon="require('../assets/renzheng_icon.png')"
                         round
@@ -73,14 +78,14 @@
                 <div class="text2">立即登录获取精彩服务</div>
             </div>
         </div>
-        <van-cell class="title" title="我的订单" :border="false" is-link value="查看全部" :to="{ path: '/orders' }" />
+        <van-cell class="title" title="我的订单" :border="false" />
 
         <div class="orderList">
             <div class="order-info" @click="$router.push('/orders?type=DEFAULT')">
                 <img src="../assets/info_icon_shangpindingdan.png" alt="" />
                 <span>商品订单</span>
             </div>
-            <div class="order-info" @click="$router.push('/orders?type=BLIND_BOX')">
+            <div class="order-info" @click="wait">
                 <img src="../assets/info_icon_zhuzaodingdan.png" alt="" />
                 <span>铸造订单</span>
             </div>
@@ -124,7 +129,7 @@
                     <van-icon :name="require('../assets/icon-guanyuwomen.png')" class="search-icon" />
                 </template>
             </van-grid-item>
-            <van-grid-item text="账号与安全">
+            <van-grid-item text="账号与安全" :to="{ path: '/security' }">
                 <template #icon>
                     <van-icon :name="require('../assets/icon-anquan.png')" class="search-icon" />
                 </template>
@@ -396,6 +401,7 @@ export default {
 .userInfo-top {
     display: flex;
     align-items: center;
+    transform: translateX(-5px);
     .van-image {
         border: 5px solid @bg;
         flex-shrink: 0;
@@ -409,6 +415,7 @@ export default {
             font-weight: bold;
             color: #ffffff;
             line-height: 24px;
+            .flex();
             img {
                 width: 18px;
                 height: 18px;

+ 1 - 1
src/main/nine-space/src/views/Store.vue

@@ -120,7 +120,7 @@ export default {
                         value: ''
                     },
                     {
-                        label: '售',
+                        label: '售',
                         value: 'ON_SALE'
                     },
                     {

+ 18 - 1
src/main/nine-space/src/views/Submit.vue

@@ -22,6 +22,7 @@
                 <div class="text2">¥{{ gas }}</div>
             </div>
             <div
+                v-if="couponList.length > 0"
                 class="info"
                 :class="{ not: !couponInfo }"
                 @click="$router.push('/couponList?collectionId=' + info.id)"
@@ -94,7 +95,8 @@ export default {
             bottom: null,
             orderId: 0,
             gas: 1,
-            inWeixin
+            inWeixin,
+            couponList: []
         };
     },
     computed: {
@@ -164,6 +166,21 @@ export default {
         this.bottom = this.$refs.bottom;
     },
     methods: {
+        getCouponList() {
+            this.$http
+                .post(
+                    '/userCoupon/all',
+                    {
+                        query: { userId: this.$store.state.userInfo.id, used: false }
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    this.couponList = [...res.content].filter(item => {
+                        return this.checkTime(item) && this.checkUse(item, this.collectionId);
+                    });
+                });
+        },
         submit() {
             this.$toast.loading('加载中');
             let url = '/order/create?collectionId=' + this.$route.query.id + '&qty=1';

+ 109 - 8
src/main/nine-space/src/views/account/Authentication.vue

@@ -2,12 +2,8 @@
     <div class="container">
         <div class="title">实名认证请选择</div>
         <div class="name">账户实名认证后不能修改,<span>请使用本人身份信息完成认证</span></div>
-        <div class="box" @click="$router.push('/verified')">
-            <img
-                class="img"
-                src="https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2021-11-11-10-16-06dTNltVml.png"
-                alt=""
-            />
+        <!-- <div class="box" @click="$router.push('/verified')">
+            <img class="img" :src="require(`../../assets/renzheng-icon-geren.png`)" alt="" />
             <div class="text">个人认证</div>
             <div class="btn">下一步</div>
         </div>
@@ -19,6 +15,25 @@
             />
             <div class="text">企业认证</div>
             <div class="btn">下一步</div>
+        </div> -->
+
+        <div class="auth-list">
+            <div
+                class="auth"
+                :class="{ active: chooseIndex === index }"
+                v-for="(item, index) in authOptions"
+                :key="index"
+                @click="chooseIndex = index"
+            >
+                <img :src="chooseIndex === index ? item.imgPre : item.img" alt="" class="img1" />
+                <span class="text1">{{ item.title }}</span>
+                <img v-if="chooseIndex === index" src="../../assets/icon_gouxuan_pre.png" alt="" class="img2" />
+                <img v-else src="../../assets/icon_gouxuan.png" alt="" class="img2" />
+            </div>
+        </div>
+
+        <div class="btn-content">
+            <van-button type="primary" block round @click="next">下一步</van-button>
         </div>
     </div>
 </template>
@@ -26,10 +41,32 @@
 <script>
 export default {
     data() {
-        return {};
+        return {
+            chooseIndex: 0,
+            authOptions: [
+                {
+                    img: require(`../../assets/renzheng-icon-geren.png`),
+                    imgPre: require(`../../assets/renzheng-icon-geren-pre.png`),
+                    title: '个人认证'
+                },
+                {
+                    img: require(`../../assets/renzheng-icon-qiye.png`),
+                    imgPre: require(`../../assets/renzheng-icon-qiye-pre.png`),
+                    title: '企业认证'
+                }
+            ]
+        };
     },
     computed: {},
-    methods: {}
+    methods: {
+        next() {
+            if (this.chooseIndex) {
+                this.$router.push('/verifiedSucs');
+            } else {
+                this.$router.push('/verified');
+            }
+        }
+    }
 };
 </script>
 
@@ -90,4 +127,68 @@ export default {
         }
     }
 }
+
+.auth-list {
+    padding: 20px 30px;
+    .auth {
+        .flex();
+        position: relative;
+        background: #1f2021;
+        height: 88px;
+        padding: 0 30px;
+        border-radius: 8px;
+        .img1 {
+            width: 38px;
+            height: 38px;
+        }
+        .text1 {
+            font-size: @font2;
+            color: @text3;
+            line-height: 24px;
+            margin-left: 16px;
+        }
+        .img2 {
+            width: 24px;
+            height: 24px;
+            position: absolute;
+            right: -12px;
+            top: 50%;
+            transform: translateY(-50%);
+        }
+        * {
+            z-index: 2;
+        }
+
+        &.active {
+            background: linear-gradient(135deg, rgba(253, 251, 96, 1), rgba(255, 143, 62, 1));
+            .text1 {
+                color: #fff;
+            }
+        }
+
+        &::after {
+            content: '';
+            position: absolute;
+            left: 1px;
+            top: 1px;
+            right: 1px;
+            bottom: 1px;
+            background: #1f2021;
+            z-index: 0;
+            border-radius: 8px;
+        }
+    }
+    .auth + .auth {
+        margin-top: 30px;
+    }
+}
+.btn-content {
+    margin: 40px 48px;
+    .van-button {
+        background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
+        color: #333230;
+        font-size: @font2;
+        border-width: 0px;
+    }
+}
 </style>

+ 63 - 63
src/main/nine-space/src/views/asset/Detail.vue

@@ -69,17 +69,21 @@
 
         <div class="info">
             <div class="info-title">
-                <div class="detail-name">
+                <!-- <div class="detail-name">
                     <span>{{ info.name }}</span>
                     <img src="../../assets/svgs/png-biaotikuang-01.svg" alt="" />
                     <img src="../../assets/svgs/png-biaotikuang-02.svg" alt="" />
                     <img src="../../assets/svgs/png-biaotikuang-03.svg" alt="" />
                     <img src="../../assets/svgs/png-biaotikuang-04.svg" alt="" />
-                </div>
+                </div> -->
+                <product-title>{{ info.name }}</product-title>
             </div>
             <div class="price-line">
                 <template v-if="info.consignment">
-                    <div class="price"><i class="font_family icon-icon_jiage"></i>{{ info.sellPrice || 0 }}</div>
+                    <div class="price">
+                        <img src="../../assets/jiage_huang.png" alt="" />
+                        <span>{{ info.sellPrice || 0 }}</span>
+                    </div>
                     <div class="sub" v-if="info.royalties">
                         含 <span>{{ info.royalties }}%</span> 版税
                     </div>
@@ -111,18 +115,26 @@
 
         <div class="goods">
             <van-collapse v-model="activeNames">
-                <van-collapse-item name="01" class="goods-info">
+                <van-collapse-item name="1" class="goods-info">
                     <template #title>
                         <div class="page-title"><img src="../../assets/fenxiang-icon.png" alt="" />用户信息</div>
                     </template>
                     <div class="user">
-                        <van-cell class="creator">
+                        <van-cell
+                            class="creator"
+                            :to="{
+                                path: '/creatorDetail',
+                                query: {
+                                    id: info.minterId
+                                }
+                            }"
+                        >
                             <template #icon>
                                 <van-image
                                     width="40"
                                     height="40"
                                     class="user-img"
-                                    :src="info.minterAvatar"
+                                    :src="info.minterAvatar || require('../../assets/svgs/img_default_photo.svg')"
                                     fit="cover"
                                     radius="100"
                                 />
@@ -151,14 +163,14 @@
                     </div>
                 </van-collapse-item>
 
-                <van-collapse-item name="4" class="goods-info">
+                <van-collapse-item name="2" class="goods-info">
                     <template #title>
                         <div class="page-title"><img src="../../assets/icon-miaoshu.png" alt="" />作品描述</div>
                     </template>
                     <div v-if="info.detail" class="page-text page-detail" v-html="info.detail"></div>
                     <div v-else class="textName">铸造者未设置</div>
                 </van-collapse-item>
-                <van-collapse-item name="002" class="goods-info">
+                <van-collapse-item name="3" class="goods-info">
                     <template #title>
                         <div class="page-title"><img src="../../assets/icon-lianshangxinxi.png" alt="" />类型</div>
                     </template>
@@ -169,7 +181,7 @@
                         <div v-else class="text5">铸造者未设置</div>
                     </div>
                 </van-collapse-item>
-                <van-collapse-item name="00" class="goods-info init">
+                <van-collapse-item name="4" class="goods-info init">
                     <template #title>
                         <div class="page-title">
                             <img src="../../assets/qiaoqiaohua-icon-weidakai.png" alt="" /> 悄悄话<span
@@ -188,7 +200,7 @@
                         <div class="text5" v-else>铸造者未设置</div>
                     </div>
                 </van-collapse-item>
-                <van-collapse-item name="0" class="goods-info">
+                <van-collapse-item name="5" class="goods-info">
                     <template #title>
                         <div class="titleIcon page-title">
                             <img src="../../assets/icon-lianshangxinxi(1).png" alt="" />持有特权<span
@@ -197,7 +209,7 @@
                         </div>
                     </template>
                     <div class="prive" v-if="init.length > 0">
-                        <div class="prive1" v-for="(item, index) in init" :key="index">
+                        <div class="prive1" :class="{ opened: item.opened }" v-for="(item, index) in init" :key="index">
                             <img v-if="!item.opened" class="img" :src="item.icon[0]" alt="" />
                             <div style="margin-top: 4px;" v-if="item.icon[2]">
                                 <img v-if="item.opened" class="img" :src="item.icon[2]" alt="" />
@@ -214,7 +226,7 @@
                     </div>
                     <div v-if="init.length === 0" class="tips">铸造者未设置</div>
                 </van-collapse-item>
-                <van-collapse-item name="1" class="goods-info">
+                <van-collapse-item name="6" class="goods-info">
                     <template #title>
                         <div class="page-title">
                             <img src="../../assets/icon-lianshangxinxi(2).png" alt="" />商品特性
@@ -228,23 +240,13 @@
                     </div>
                     <div v-else class="textName">铸造者未设置</div>
                 </van-collapse-item>
-                <van-collapse-item name="2" class="goods-info">
+                <hash-code :info="info"></hash-code>
+                <van-collapse-item name="8" class="goods-info">
                     <template #title>
                         <div class="page-title">
-                            <img src="../../assets/icon-lianshangxinxi(3).png" alt="" />链上信息
+                            <img src="../../assets/info_icon_jiaoyijilu1.png" alt="" />交易记录
                         </div>
                     </template>
-                    <div class="page-text" v-if="info.txHash || info.blockNumber || info.tokenId">
-                        Hash地址:{{ info.txHash }}<br />
-                        区块高度: {{ info.blockNumber }}<br />
-                        令牌ID: {{ info.tokenId }}
-                    </div>
-                    <div v-else class="textName">铸造者未设置</div>
-                </van-collapse-item>
-                <van-collapse-item name="5" class="goods-info">
-                    <template #title>
-                        <div class="page-title"><img src="../../assets/info_icon_jiaoyijilu.png" alt="" />交易记录</div>
-                    </template>
                     <div v-if="list.length > 0">
                         <div class="user-detail" v-for="item in list" :key="item.id">
                             <div class="text1 van-ellipsis">{{ item.fromUser || '保密' }}</div>
@@ -400,6 +402,8 @@ import { mapState } from 'vuex';
 import { ImagePreview } from 'vant';
 import Vue from 'vue';
 import { Dialog } from 'vant';
+import HashCode from '../../components/product/HashCode.vue';
+import ProductTitle from '../../components/product/ProductTitle.vue';
 // install Swiper modules
 SwiperCore.use([Pagination]);
 
@@ -407,13 +411,15 @@ export default {
     components: {
         Swiper,
         SwiperSlide,
-        Post
+        Post,
+        HashCode,
+        ProductTitle
     },
 
     mixins: [asset, product],
     data() {
         return {
-            activeNames: ['01', '4'],
+            activeNames: ['1', '2', '3', '4', '5', '6', 'hashCode', '8'],
             info: {},
             liked: false,
             show2: false,
@@ -778,16 +784,17 @@ export default {
     box-sizing: border-box;
 
     .price {
-        font-size: @font4;
+        font-size: 32px;
         font-family: OSP;
         color: #fdfb60;
-        line-height: 36px;
+        line-height: 32px;
         transform: translateY(3px);
+        .flex();
 
-        .font_family {
-            font-size: 8px;
-            line-height: 24px;
-            vertical-align: middle;
+        img {
+            width: 10px;
+            height: 11px;
+            margin-top: 10px;
         }
     }
 
@@ -797,7 +804,7 @@ export default {
         .sub {
             flex-grow: 1;
             margin-left: 5px;
-            font-size: 14px;
+            font-size: @font1;
             color: #949699;
             line-height: 16px;
             span {
@@ -805,8 +812,8 @@ export default {
             }
         }
 
-        .text {
-            font-size: 14px;
+        .text1 {
+            font-size: @font1;
             color: @text3;
             line-height: 16px;
             span {
@@ -855,11 +862,11 @@ export default {
     .van-cell__title {
         margin-left: 12px;
         .text1 {
-            font-size: 16px;
+            font-size: @font1;
             line-height: 24px;
         }
         .text2 {
-            font-size: 12px;
+            font-size: @font1;
             color: @text3;
             line-height: 22px;
         }
@@ -909,29 +916,11 @@ export default {
     }
 }
 
-@keyframes flipY {
-    0% {
-        transform: perspective(500px) rotateX(0deg) rotateY(0deg);
-    }
-    27% {
-        transform: perspective(500px) rotateX(0deg) rotateY(15deg);
-    }
-    50% {
-        transform: perspective(500px) rotateX(0deg) rotateY(0deg);
-    }
-    73% {
-        transform: perspective(500px) rotateX(0deg) rotateY(-15deg);
-    }
-    100% {
-        transform: perspective(500px) rotateX(0deg) rotateY(0deg);
-    }
-}
-
 /deep/ .mySwiper {
     width: calc(100vw - 120px);
     height: calc(100vw - 120px);
     z-index: 1;
-    animation: flipY 6s linear infinite;
+    .detail-animate();
 
     .swiper-pagination {
         bottom: 22px;
@@ -1079,7 +1068,7 @@ export default {
         align-items: center;
         // margin-top: 12px;
         .text1 {
-            font-size: @font2;
+            font-size: @font1;
             font-weight: bold;
             color: #ffffff;
             line-height: 28px;
@@ -1094,6 +1083,7 @@ export default {
             text-align: center;
             color: #ffffff;
             position: relative;
+            font-size: @font1;
             margin-left: 0;
             * {
                 position: relative;
@@ -1128,9 +1118,15 @@ export default {
             }
         }
         .text4 {
-            color: #fdfb60;
+            color: #ffffff;
+            line-height: 22px;
+            background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
             &.prim {
                 color: @text3;
+                background: transparent;
+                -webkit-text-fill-color: @text3;
             }
         }
         .text5 {
@@ -1170,12 +1166,17 @@ export default {
             background: #202122;
             color: @text3;
         }
+
+        &.opened {
+            background: @bg;
+            border: 1px solid #303133;
+        }
     }
     .prive2 {
         font-size: @font1;
         text-align: center;
         margin-left: 2px;
-        color: #303133;
+        color: @text3;
     }
     .img {
         text-align: center;
@@ -1299,8 +1300,8 @@ export default {
     }
 }
 .status {
-    font-size: @font4;
-    font-weight: bold;
+    font-size: @font3;
+    // font-weight: bold;
     color: #fdfb60;
     line-height: 24px;
 }
@@ -1540,7 +1541,6 @@ export default {
     background-color: #131313 !important;
 }
 
-
 .user-detail {
     .flex();
     width: 100%;

+ 5 - 1
src/main/nine-space/src/views/asset/GiveSearch.vue

@@ -36,7 +36,11 @@
                     <linear-com class="btn">赠送</linear-com>
                 </div>
             </div>
-            <van-empty v-if="empty" description="没有任何藏品哦~" />
+            <van-empty
+                :image="require('../../assets/kong_png_yongyoude  (1).png')"
+                v-if="empty"
+                description="没有任何藏品哦~"
+            />
         </van-list>
     </div>
 </template>

+ 6 - 2
src/main/nine-space/src/views/asset/Search.vue

@@ -10,8 +10,11 @@
                 autofocus
                 :left-icon="require('../../assets/svgs/icon-sosuo.svg')"
                 @search="getSearch"
-                @cancel="$router.go(-1)"
-            />
+            >
+                <template #action>
+                    <div @click="getSearch(search)">搜索</div>
+                </template>
+            </van-search>
         </van-sticky>
 
         <van-list
@@ -88,6 +91,7 @@ export default {
             };
         },
         getSearch(search) {
+            console.log(search);
             this.search = search;
             this.getData(true);
         }

+ 34 - 18
src/main/nine-space/src/views/creator/Detail.vue

@@ -6,8 +6,8 @@
                 <div class="userInfo-top">
                     <van-image
                         round
-                        width="79"
-                        height="79"
+                        width="70"
+                        height="70"
                         :src="info.avatar || require('../../assets/svgs/img_default_photo.svg')"
                         fit="cover"
                         @click="$router.push('/setting')"
@@ -15,7 +15,10 @@
                     <img class="rank-icon" :src="rankInfo.img1" v-if="rankInfo.img1" alt="" />
 
                     <div class="text">
-                        <div class="text1 van-ellipsis">{{ info.nickname }}</div>
+                        <div class="text1">
+                            <span class="van-ellipsis">{{ info.nickname }}</span>
+                            <img v-if="info.authStatus === 'SUCCESS'" src="../../assets/renzheng_icon_pre.png" alt="" />
+                        </div>
                         <div class="text2">
                             <span>{{ info.id }}</span>
                             <img @click="copy" src="../../assets/svgs/copy_icon.svg" alt="" />
@@ -24,7 +27,7 @@
                 </div>
 
                 <div class="sub">
-                    {{ info.intro }}
+                    {{ info.intro || '该铸造者什么都没留下~' }}
                 </div>
 
                 <div class="btns">
@@ -83,7 +86,11 @@
             <template v-for="(item, index) in list" :key="index">
                 <product-info v-model:info="list[index]"></product-info
             ></template>
-            <van-empty v-if="empty" description="没有任何收藏品哦~" />
+            <van-empty
+                v-if="empty"
+                :image="require('../../assets/kong_png_yongyoude  (1).png')"
+                description="没有任何收藏品哦~"
+            />
         </div>
     </div>
 </template>
@@ -238,12 +245,12 @@ export default {
     padding: 0 16px;
     z-index: 2;
     position: relative;
-    transform: translateY(-8px);
+    transform: translateY(-16px);
     .sub {
         font-size: 14px;
         color: @text3;
         line-height: 22px;
-        padding: 16px 0;
+        padding: 6px 0;
     }
 
     .btns {
@@ -257,13 +264,13 @@ export default {
             align-items: center;
             justify-content: flex-end;
             .text1 {
-                font-size: 16px;
+                font-size: @font2;
                 color: #ffffff;
                 line-height: 24px;
                 margin-left: 6px;
             }
             .text2 {
-                font-size: 14px;
+                font-size: @font2;
                 color: @text3;
                 line-height: 24px;
             }
@@ -271,6 +278,7 @@ export default {
 
         /deep/.van-button {
             width: 70px;
+            font-size: @font1;
             .van-icon__image {
                 display: block;
                 width: 18px;
@@ -300,32 +308,41 @@ export default {
     display: flex;
     align-items: center;
     position: relative;
+    transform: translateX(-5px);
     .van-image {
         border: 5px solid @bg;
         flex-shrink: 0;
     }
 
     .rank-icon {
-        width: 90px;
+        width: 80px;
+        height: 90px;
         display: block;
         height: auto;
         position: absolute;
-        top: -5px;
-        left: 0px;
+        top: -8px;
+        left: 1px;
     }
 
     .text {
         margin: 0 40px 0 12px;
         overflow: hidden;
         .text1 {
-            font-size: 24px;
+            font-size: @font3;
             font-weight: bold;
             color: #ffffff;
-            line-height: 34px;
+            line-height: 24px;
+            .flex();
+
+            img {
+                width: 18px;
+                height: 18px;
+                margin-left: 10px;
+            }
         }
         .text2 {
-            font-size: 16px;
-            color: #949699;
+            font-size: @font2;
+            color: @text3;
             line-height: 24px;
             display: flex;
             align-items: center;
@@ -346,13 +363,12 @@ export default {
     background-color: @bg3;
     .menu-item {
         font-size: 16px;
-        font-weight: bold;
         color: @text3;
         line-height: 24px;
         margin-right: 30px;
         &.active {
             color: @prim;
-            font-size: 18px;
+            font-weight: bold;
         }
     }
 }

+ 18 - 1
src/main/nine-space/src/views/creator/List.vue

@@ -3,6 +3,7 @@
         <van-sticky ref="top" :offset-top="bar.value.show ? 46 : 0">
             <div class="top">
                 <div class="name">铸造者</div>
+                <img src="../../assets/icon-sosuo.png" @click="$router.push('/creatorSearch')" alt="" class="search" />
             </div>
             <van-tabs v-model:active="sort" :ellipsis="false" line-width="16" line-height="2" @change="getData(true)">
                 <van-tab
@@ -28,7 +29,11 @@
             <template v-for="(item, index) in list" :key="index">
                 <creator-info v-model:info="list[index]"></creator-info>
             </template>
-            <van-empty v-if="empty" description="没有任何藏品哦~" />
+            <van-empty
+                :image="require('../../assets/kong_png_yongyoude  (1).png')"
+                v-if="empty"
+                description="没有任何藏品哦~"
+            />
         </van-list>
     </div>
 </template>
@@ -89,12 +94,20 @@ export default {
     height: 50px;
     display: flex;
     align-items: center;
+    position: relative;
     .name {
         font-size: @font3;
         font-weight: bold;
         color: @prim;
         line-height: 30px;
     }
+    .search {
+        width: 24px;
+        height: 24px;
+        position: absolute;
+        right: 16px;
+        top: 13px;
+    }
 }
 
 // /deep/.van-tab {
@@ -132,6 +145,10 @@ export default {
 /deep/.van-tabs__nav {
     padding-left: 16px;
 }
+/deep/ .van-tabs__line {
+    bottom: 20px;
+}
+
 /deep/.van-tab--active {
     .tab {
         .van-icon-arrow-up {

+ 5 - 2
src/main/nine-space/src/views/creator/Search.vue

@@ -10,8 +10,11 @@
                 autofocus
                 :left-icon="require('../../assets/svgs/icon-sosuo.svg')"
                 @search="getSearch"
-                @cancel="$router.go(-1)"
-            />
+            >
+                <template #action>
+                    <div @click="getSearch(search)">搜索</div>
+                </template>
+            </van-search>
         </van-sticky>
         <van-list
             class="list"

+ 36 - 54
src/main/nine-space/src/views/product/Detail.vue

@@ -43,13 +43,7 @@
 
         <div class="info">
             <div class="info-title">
-                <div class="detail-name">
-                    <span>{{ info.name }}</span>
-                    <img src="../../assets/svgs/png-biaotikuang-01.svg" alt="" />
-                    <img src="../../assets/svgs/png-biaotikuang-02.svg" alt="" />
-                    <img src="../../assets/svgs/png-biaotikuang-03.svg" alt="" />
-                    <img src="../../assets/svgs/png-biaotikuang-04.svg" alt="" />
-                </div>
+                <product-title>{{ info.name }}</product-title>
             </div>
             <div class="name" v-if="info.salable && startTime">
                 <div class="name1">首发抢购倒计时</div>
@@ -57,7 +51,7 @@
             </div>
 
             <div class="price-line" v-if="info.salable">
-                <div class="flex1" v-if="info.number"></div>
+                <div class="text" v-if="info.number">编号 {{ info.number }}</div>
                 <div class="text" v-if="info.salable && info.total > 0">
                     <span>已售 {{ info.sale }}</span>
                     <span>剩余 {{ info.stock }}</span>
@@ -65,7 +59,7 @@
             </div>
             <!-- <div class="title">{{ info.name }}</div> -->
             <div class="info-bottom">
-                <span class="text1" v-if="info.number"> 编号 {{ info.number }} </span>
+                <!-- <span class="text1" v-if="info.number"> 编号 {{ info.number }} </span> -->
                 <!-- <van-button
           v-if="info.type !== 'DEFAULT'"
           type="primary"
@@ -82,7 +76,7 @@
         <!-- </template> -->
         <div class="goods">
             <van-collapse v-model="activeNames">
-                <van-collapse-item name="01" class="goods-info">
+                <van-collapse-item name="1" class="goods-info">
                     <template #title>
                         <div class="page-title">
                             <img src="../../assets/fenxiang-icon.png" alt="" />
@@ -100,7 +94,13 @@
                             }"
                         >
                             <template #icon>
-                                <van-image width="32" height="32" :src="info.minterAvatar" fit="cover" radius="100" />
+                                <van-image
+                                    width="32"
+                                    height="32"
+                                    :src="info.minterAvatar || require('../../assets/svgs/img_default_photo.svg')"
+                                    fit="cover"
+                                    radius="100"
+                                />
                             </template>
                             <template #title>
                                 <div class="text1">{{ info.minter }}</div>
@@ -134,7 +134,7 @@
                     </div>
                 </van-collapse-item>
 
-                <van-collapse-item name="4" class="goods-info">
+                <van-collapse-item name="2" class="goods-info">
                     <template #title>
                         <div class="page-title"><img src="../../assets/icon-miaoshu.png" alt="" />作品描述</div>
                     </template>
@@ -152,7 +152,7 @@
                     </swiper>
                     <div v-if="info.detail" class="page-text page-detail" v-html="info.detail"></div>
                 </van-collapse-item>
-                <van-collapse-item name="002" class="goods-info top1">
+                <van-collapse-item name="3" class="goods-info top1">
                     <template #title>
                         <div class="page-title"><img src="../../assets/icon-lianshangxinxi.png" alt="" /> 类型</div>
                     </template>
@@ -163,7 +163,7 @@
                         <div v-else class="tips">铸造者未设置</div>
                     </div>
                 </van-collapse-item>
-                <van-collapse-item name="00" class="goods-info">
+                <van-collapse-item name="4" class="goods-info">
                     <template #title>
                         <div class="page-title">
                             <img src="../../assets/qiaoqiaohua-icon-weidakai.png" alt="" /> 悄悄话<span
@@ -179,7 +179,7 @@
                     </div>
                     <div class="tips" v-else>铸造者未设置</div>
                 </van-collapse-item>
-                <van-collapse-item name="0" class="goods-info">
+                <van-collapse-item name="5" class="goods-info">
                     <template #title>
                         <div class="titleIcon page-title">
                             <img src="../../assets/icon-lianshangxinxi(1).png" alt="" />
@@ -197,7 +197,7 @@
                     </div>
                     <div v-if="init.length === 0" class="tips">铸造者未设置</div>
                 </van-collapse-item>
-                <van-collapse-item name="1" class="goods-info">
+                <van-collapse-item name="6" class="goods-info">
                     <template #title>
                         <div class="page-title">
                             <img src="../../assets/icon-lianshangxinxi(2).png" alt="" />商品特性
@@ -211,24 +211,13 @@
                     </div>
                     <div v-else class="textName">铸造者未设置</div>
                 </van-collapse-item>
-
-                <van-collapse-item name="2" class="goods-info">
+                <hash-code :info="info"></hash-code>
+                <van-collapse-item name="8" class="goods-info">
                     <template #title>
                         <div class="page-title">
-                            <img src="../../assets/icon-lianshangxinxi(3).png" alt="" />链上信息
+                            <img src="../../assets/info_icon_jiaoyijilu1.png" alt="" />交易记录
                         </div>
                     </template>
-                    <div class="page-text" v-if="info.txHash || info.blockNumber || info.tokenId">
-                        Hash地址:{{ info.txHash }}<br />
-                        区块高度: {{ info.blockNumber }}<br />
-                        令牌ID: {{ info.tokenId }}
-                    </div>
-                    <div v-else class="textName">铸造者未设置</div>
-                </van-collapse-item>
-                <van-collapse-item name="5" class="goods-info">
-                    <template #title>
-                        <div class="page-title"><img src="../../assets/info_icon_jiaoyijilu.png" alt="" />交易记录</div>
-                    </template>
                     <div v-if="list.length > 0">
                         <div class="content" v-for="item in list" :key="item.id">
                             <!-- <img class="img" :src="list.avatar" alt="" /> -->
@@ -297,12 +286,16 @@ import { ImagePreview } from 'vant';
 // install Swiper modules
 SwiperCore.use([Pagination]);
 import product from '../../mixins/product';
+import HashCode from '../../components/product/HashCode.vue';
+import ProductTitle from '../../components/product/ProductTitle.vue';
 
 export default {
     components: {
         Swiper,
         SwiperSlide,
-        Post
+        Post,
+        HashCode,
+        ProductTitle
     },
     mixins: [product],
     data() {
@@ -315,7 +308,7 @@ export default {
             init: [],
             init2: null,
             list: [],
-            activeNames: ['01', '4']
+            activeNames: ['1', '2', '3', '4', '5', '6', 'hashCode', '8']
         };
     },
     computed: {
@@ -541,7 +534,7 @@ export default {
     .price-line {
         display: flex;
         justify-content: center;
-        margin-top: 12px;
+        margin-top: 4px;
         .sub {
             flex-grow: 1;
             margin-left: 5px;
@@ -563,11 +556,18 @@ export default {
         .text {
             font-size: @font1;
             color: @text3;
-            line-height: 16px;
-            span {
+            line-height: 26px;
+            background-color: #202122;
+            border-radius: 4px;
+            padding: 0 10px;
+
+            span + span {
                 margin-left: 10px;
             }
         }
+        .text + .text {
+            margin-left: 10px;
+        }
     }
 
     .title {
@@ -943,24 +943,6 @@ export default {
     background-color: @bg;
 }
 
-@keyframes flipY {
-    0% {
-        transform: perspective(500px) rotateX(0deg) rotateY(0deg);
-    }
-    27% {
-        transform: perspective(500px) rotateX(0deg) rotateY(15deg);
-    }
-    50% {
-        transform: perspective(500px) rotateX(0deg) rotateY(0deg);
-    }
-    73% {
-        transform: perspective(500px) rotateX(0deg) rotateY(-15deg);
-    }
-    100% {
-        transform: perspective(500px) rotateX(0deg) rotateY(0deg);
-    }
-}
-
 .detail-top {
     position: relative;
     .detail-info {
@@ -980,7 +962,7 @@ export default {
     .mySwiper {
         border-radius: 8px;
         border: 2px solid #ffffff;
-        animation: flipY 6s linear infinite;
+        .detail-animate();
         .swiper-slide {
             display: flex;
             align-items: center;

+ 38 - 4
src/main/nine-space/src/views/product/List.vue

@@ -3,6 +3,7 @@
         <van-sticky ref="top" :offset-top="bar.value.show ? 46 : 0">
             <div class="top">
                 <div class="name">{{ pageName }}</div>
+                <img src="../../assets/icon-sosuo.png" alt="" @click="goSearch" class="search" />
             </div>
             <van-tabs v-model:active="sort" :ellipsis="false" line-width="16" line-height="2" @change="getData(true)">
                 <van-tab
@@ -12,7 +13,7 @@
                     "
                     :title-class="item.type === 'select' && sort === item.value[0] ? '' : 'asc'"
                     :key="index"
-                    v-for="(item, index) in sourceOptions"
+                    v-for="(item, index) in selectOptions"
                 >
                     <template v-if="item.type === 'select'" #title>
                         <div class="tab">
@@ -30,7 +31,11 @@
                 <product-info v-model:info="list[index]" @update:info="init"></product-info>
             </template>
 
-            <van-empty v-if="empty" description="没有任何藏品哦~" />
+            <van-empty
+                :image="require('../../assets/kong_png_yongyoude  (1).png')"
+                v-if="empty"
+                description="没有任何藏品哦~"
+            />
         </van-list>
     </div>
 </template>
@@ -49,7 +54,8 @@ export default {
             empty: false,
             sort: 'id,desc',
             type: '',
-            sourceOptions: [
+            source: '',
+            selectOptions: [
                 {
                     label: '全部',
                     value: 'id,desc'
@@ -73,24 +79,39 @@ export default {
     },
     computed: {
         pageName() {
-            return this.getLabelName(this.type, this.typeOptions);
+            return this.getLabelName(this.source, this.sourceOptions) || this.getLabelName(this.type, this.typeOptions);
         }
     },
     mounted() {
         if (this.$route.query.type) {
             this.type = this.$route.query.type;
         }
+
+        if (this.$route.query.source) {
+            this.source = this.$route.query.source;
+        }
     },
     methods: {
         beforeData() {
             return {
                 query: {
                     type: this.type,
+                    source: this.source,
                     onShelf: true,
                     del: false
                 },
                 sort: this.sort
             };
+        },
+        goSearch() {
+            let url = '/productSearch';
+            if (this.type) {
+                url += '?type=' + this.type;
+            }
+            if (this.source) {
+                url += '?source=' + this.source;
+            }
+            this.$router.push(url);
         }
     }
 };
@@ -110,12 +131,21 @@ export default {
     height: 50px;
     display: flex;
     align-items: center;
+    position: relative;
     .name {
         font-size: @font3;
         font-weight: bold;
         color: @prim;
         line-height: 30px;
     }
+
+    .search {
+        width: 24px;
+        height: 24px;
+        position: absolute;
+        right: 16px;
+        top: 13px;
+    }
 }
 // /deep/.van-tab {
 // flex-grow: 0;
@@ -152,6 +182,10 @@ export default {
 /deep/.van-tabs__nav {
     padding-left: 16px;
 }
+/deep/ .van-tabs__line {
+    bottom: 20px;
+}
+
 /deep/.van-tab--active {
     .tab {
         .van-icon-arrow-up {

+ 10 - 7
src/main/nine-space/src/views/product/Search.vue

@@ -10,8 +10,11 @@
                 autofocus
                 :left-icon="require('../../assets/svgs/icon-sosuo.svg')"
                 @search="getSearch"
-                @cancel="$router.go(-1)"
-            />
+            >
+                <template #action>
+                    <div @click="getSearch(search)">搜索</div>
+                </template>
+            </van-search>
         </van-sticky>
         <van-list
             class="list"
@@ -49,19 +52,18 @@ export default {
             search: '',
             stiky: null,
             type: '',
+            source: '',
             minterId: '',
             url: '/collection/all'
         };
     },
-    computed: {
-        pageName() {
-            return this.getLabelName(this.type, this.typeOptions);
-        }
-    },
     mounted() {
         if (this.$route.query.type) {
             this.type = this.$route.query.type;
         }
+        if (this.$route.query.source) {
+            this.source = this.$route.query.source;
+        }
         if (this.$route.query.minterId) {
             this.minterId = this.$route.query.minterId;
         }
@@ -72,6 +74,7 @@ export default {
                 query: {
                     onShelf: true,
                     type: this.type,
+                    source: this.source,
                     minterId: this.minterId,
                     del: false
                 },

+ 1 - 1
src/main/nine-space/src/views/user/Point.vue

@@ -42,7 +42,7 @@
                 <div class="text3">-320</div>
             </div> -->
             <lottie :options="defaultOptions" :height="50" :width="400" v-on:animCreated="handleAnimation" />
-            <van-empty description="暂时没有任何记录哦~" />
+            <van-empty :image="require('../../assets/kong_png_yongyoude  (1).png')" description="暂时没有任何记录哦~" />
         </div>
     </div>
 </template>

+ 1 - 1
src/main/nine-space/src/views/user/Wallet.vue

@@ -45,7 +45,7 @@
                 </div>
                 <div class="text3">-320</div>
             </div> -->
-            <van-empty description="暂时没有任何记录哦~" />
+            <van-empty :image="require('../../assets/kong_png_yongyoude  (1).png')" description="暂时没有任何记录哦~" />
         </div>
     </div>
 </template>