panhui 4 лет назад
Родитель
Сommit
c92d397340

+ 4 - 0
src/main/java/com/izouma/nineth/TokenHistory.java

@@ -28,7 +28,11 @@ public class TokenHistory extends BaseEntity {
 
     private Long   fromUserId;
 
+    private String fromAvatar;
+
     private String toUser;
 
     private Long   toUserId;
+
+    private String toAvatar;
 }

+ 2 - 0
src/main/java/com/izouma/nineth/domain/Collection.java

@@ -125,4 +125,6 @@ public class Collection extends BaseEntity {
     private Long assetId;
 
     private BigDecimal originalPrice;
+
+    private Integer currentNumber;
 }

+ 3 - 0
src/main/java/com/izouma/nineth/domain/Order.java

@@ -145,4 +145,7 @@ public class Order extends BaseEntity {
     private boolean hide;
 
     private Long couponId;
+
+    private Long invitor;
+
 }

+ 5 - 0
src/main/java/com/izouma/nineth/domain/User.java

@@ -22,6 +22,7 @@ import javax.persistence.*;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -106,4 +107,8 @@ public class User extends BaseEntity implements Serializable {
     private String tradeCode;
 
     private boolean admin;
+
+    @ApiModelProperty("分成比例")
+    @Column(precision = 10, scale = 2)
+    private BigDecimal shareRatio;
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -19,4 +19,6 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     long countByIpfsUrlAndStatusNot(String ipfsUrl, AssetStatus status);
 
     List<Asset> findByCollectionId(Long collectionId);
+
+    List<Asset> findByCollectionIdAndStatusIn(Long collectionId, Iterable<AssetStatus> statuses);
 }

+ 6 - 0
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -58,8 +58,10 @@ public class AssetService {
                 .tokenId(asset.getTokenId())
                 .fromUser(collection.getMinter())
                 .fromUserId(collection.getMinterId())
+                .fromAvatar(collection.getMinterAvatar())
                 .toUser(user.getNickname())
                 .toUserId(user.getId())
+                .toAvatar(user.getAvatar())
                 .operation(type)
                 .price(price)
                 .build());
@@ -79,8 +81,10 @@ public class AssetService {
                 .tokenId(asset.getTokenId())
                 .fromUser(winItem.getMinter())
                 .fromUserId(winItem.getMinterId())
+                .fromAvatar(winItem.getMinterAvatar())
                 .toUser(user.getNickname())
                 .toUserId(user.getId())
+                .toAvatar(user.getAvatar())
                 .operation(type)
                 .price(price)
                 .build());
@@ -257,8 +261,10 @@ public class AssetService {
                 .tokenId(asset.getTokenId())
                 .fromUser(asset.getOwner())
                 .fromUserId(asset.getOwnerId())
+                .fromAvatar(asset.getOwnerAvatar())
                 .toUser(toUser.getNickname())
                 .toUserId(toUser.getId())
+                .toAvatar(toUser.getAvatar())
                 .operation(reason)
                 .build());
 

+ 8 - 2
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -265,7 +265,13 @@ public class CollectionService {
     }
 
     public synchronized Integer getNextNumber(Long collectionId) {
-        redisTemplate.opsForValue().increment("collectionNumber::" + collectionId);
-        return (Integer) redisTemplate.opsForValue().get("collectionNumber::" + collectionId);
+        Collection collection = collectionRepo.findById(collectionId).orElse(null);
+        if (collection == null) return 0;
+        if (collection.getCurrentNumber() == null) {
+            collection.setCurrentNumber(0);
+        }
+        collection.setCurrentNumber(collection.getCurrentNumber() + 1);
+        collectionRepo.save(collection);
+        return collection.getCurrentNumber();
     }
 }

+ 7 - 6
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -68,7 +68,7 @@ public class OrderService {
     }
 
     @Transactional
-    public Order create(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId) {
+    public Order create(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor) {
         if (qty <= 0) throw new BusinessException("数量必须大于0");
         User user = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("用户不存在"));
         Collection collection = collectionRepo.findById(collectionId).orElseThrow(new BusinessException("藏品不存在"));
@@ -135,6 +135,7 @@ public class OrderService {
                 .status(OrderStatus.NOT_PAID)
                 .assetId(collection.getAssetId())
                 .couponId(userCouponId)
+                .invitor(invitor)
                 .build();
         if (coupon != null) {
             coupon.setUsed(true);
@@ -358,11 +359,11 @@ public class OrderService {
     public void setNumber() {
         for (Collection collection : collectionRepo.findAll()) {
             if (collection.getSource() != CollectionSource.OFFICIAL) continue;
-            String key = "collectionNumber::" + collection.getId();
-            redisTemplate.opsForValue().set(key, 0);
-            for (Asset asset : assetRepo.findByCollectionId(collection.getId())) {
-                redisTemplate.opsForValue().increment(key);
-                asset.setNumber((Integer) redisTemplate.opsForValue().get(key));
+            collection.setCurrentNumber(0);
+            collectionRepo.save(collection);
+            for (Asset asset : assetRepo.findByCollectionIdAndStatusIn(collection.getId(),
+                    Arrays.asList(AssetStatus.NORMAL, AssetStatus.GIFTING, AssetStatus.TRADING))) {
+                asset.setNumber(collectionService.getNextNumber(collection.getId()));
                 assetRepo.save(asset);
             }
         }

+ 2 - 0
src/main/java/com/izouma/nineth/service/UserService.java

@@ -59,6 +59,7 @@ public class UserService {
     private FollowService    followService;
     private FollowRepo       followRepo;
     private IdentityAuthRepo identityAuthRepo;
+    private SysConfigService sysConfigService;
 
     @CacheEvict(value = "user", key = "#user.username")
     public User update(User user) {
@@ -102,6 +103,7 @@ public class UserService {
         }
         User user = new User();
         BeanUtils.copyProperties(userRegister, user);
+        user.setShareRatio(sysConfigService.getBigDecimal("share_ratio"));
         user.setAuthStatus(AuthStatus.NOT_AUTH);
         if (StringUtils.isNotBlank(userRegister.getPassword())) {
             user.setPassword(new BCryptPasswordEncoder().encode(userRegister.getPassword()));

+ 5 - 2
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -73,9 +73,12 @@ public class OrderController extends BaseController {
     }
 
     @PostMapping("/create")
-    public Order create(@RequestParam Long collectionId, @RequestParam int qty, @RequestParam(required = false) Long addressId, @RequestParam(required = false) Long couponId) {
+    public Order create(@RequestParam Long collectionId, @RequestParam int qty,
+                        @RequestParam(required = false) Long addressId,
+                        @RequestParam(required = false) Long couponId,
+                        @RequestParam(required = false) Long invitor) {
         return orderService.create(SecurityUtils.getAuthenticatedUser().getId(),
-                collectionId, qty, addressId, couponId);
+                collectionId, qty, addressId, couponId, invitor);
     }
 
     @PostMapping("/hide")

+ 2 - 0
src/main/nine-space/src/views/account/Authentication.vue

@@ -67,6 +67,8 @@ export default {
     .box {
         display: flex;
         align-items: center;
+        // justify-content: center;
+        margin: 0 auto;
         width: 303px;
         .line();
         height: 88px;

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

@@ -91,10 +91,12 @@
                 <div class="status" v-else>
                     {{ getLabelName(info.status, assetStatusOptions) }}
                 </div>
+                <div class="flex1"></div>
+
+                <span class="text1" v-if="info.number"> 编号 {{ info.number }} </span>
             </div>
             <!-- <div class="title">{{ info.name }}</div> -->
             <div class="info-bottom">
-                <span class="text1" v-if="info.number"> 编号 {{ info.number }} </span>
                 <!-- <van-button
           type="primary"
           plain
@@ -107,87 +109,99 @@
             </div>
         </div>
 
-        <driver />
-        <div class="user">
-            <van-cell class="creator">
-                <template #icon>
-                    <van-image
-                        width="40"
-                        height="40"
-                        class="user-img"
-                        :src="info.minterAvatar"
-                        fit="cover"
-                        radius="100"
-                    />
-                </template>
-                <template #title>
-                    <div class="text1 van-ellipsis">{{ info.minter }}</div>
-                    <div class="text2">铸造者</div>
-                </template>
-            </van-cell>
-            <van-cell class="creator">
-                <template #icon>
-                    <van-image
-                        width="40"
-                        height="40"
-                        class="user-img"
-                        :src="userInfo.avatar || require('../../assets/svgs/img_default_photo.svg')"
-                        fit="cover"
-                        radius="100"
-                    />
-                </template>
-                <template #title>
-                    <div class="text1 van-ellipsis">{{ userInfo.nickname }}</div>
-                    <div class="text2">持有者</div>
-                </template>
-            </van-cell>
-        </div>
-        <driver />
-
         <div class="goods">
-            <div class="top">
-                <div class="top1">
-                    <div class="text1">类型</div>
-                    <div v-if="info.category" class="text2">
-                        <span>{{ info.category }}</span>
+            <van-collapse v-model="activeNames">
+                <van-collapse-item name="01" 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">
+                            <template #icon>
+                                <van-image
+                                    width="40"
+                                    height="40"
+                                    class="user-img"
+                                    :src="info.minterAvatar"
+                                    fit="cover"
+                                    radius="100"
+                                />
+                            </template>
+                            <template #title>
+                                <div class="text1 van-ellipsis">{{ info.minter }}</div>
+                                <div class="text2">铸造者</div>
+                            </template>
+                        </van-cell>
+                        <van-cell class="creator">
+                            <template #icon>
+                                <van-image
+                                    width="40"
+                                    height="40"
+                                    class="user-img"
+                                    :src="userInfo.avatar || require('../../assets/svgs/img_default_photo.svg')"
+                                    fit="cover"
+                                    radius="100"
+                                />
+                            </template>
+                            <template #title>
+                                <div class="text1 van-ellipsis">{{ userInfo.nickname }}</div>
+                                <div class="text2">持有者</div>
+                            </template>
+                        </van-cell>
                     </div>
-                    <div v-else class="text5">铸造者未设置</div>
-                </div>
-                <div class="top1" @click="Whisper">
-                    <div class="text1">悄悄话</div>
-                    <div class="text2 text3" v-if="init2" :class="{ prim: init2.opened }">
-                        <img v-if="!init2.opened" class="img" :src="init2.icon[0]" alt="" />
-                        <img v-if="init2.opened" class="img" :src="init2.icon[2]" alt="" />
-                        <div class="text4" :class="{ prim: init2.opened }">
-                            {{ init2.opened ? '已打开' : '未打开' }}
+                </van-collapse-item>
+                <van-collapse-item name="002" class="goods-info">
+                    <template #title>
+                        <div class="page-title"><img src="../../assets/icon-lianshangxinxi.png" alt="" />类型</div>
+                    </template>
+                    <div class="top1">
+                        <div v-if="info.category" class="text2">
+                            <span>{{ info.category }}</span>
                         </div>
+                        <div v-else class="text5">铸造者未设置</div>
                     </div>
-                    <div class="text5" v-else>铸造者未设置</div>
-                </div>
-            </div>
-            <div class="page-title">持有特权<span>(灰色表示已使用)</span></div>
-            <div class="prive" v-if="privileges.length > 0">
-                <div v-for="(item, index) in init" :key="index">
-                    <div class="prive1" :class="{ prim: item.opened }">
-                        <img v-if="!item.opened" class="img" :src="item.icon[0]" alt="" />
-                        <div v-if="item.icon[2]">
-                            <img v-if="item.opened" class="img" :src="item.icon[2]" alt="" />
+                </van-collapse-item>
+                <van-collapse-item name="00" class="goods-info init">
+                    <template #title>
+                        <div class="page-title">
+                            <img src="../../assets/qiaoqiaohua-icon-weidakai.png" alt="" /> 悄悄话
                         </div>
-                        <!-- <img class="img" v-else :src="item.icon[0]" alt="" /> -->
-
-                        <div v-if="item.once" @click="privilegeFn2(item)" class="prive2">
-                            {{ item.name }}
+                    </template>
+                    <div class="top1">
+                        <div class="text2 text3" @click="Whisper" v-if="init2" :class="{ prim: init2.opened }">
+                            <img v-if="!init2.opened" class="img" :src="init2.icon[0]" alt="" />
+                            <img v-if="init2.opened" class="img" :src="init2.icon[2]" alt="" />
+                            <div class="text4" :class="{ prim: init2.opened }">
+                                {{ init2.opened ? '已打开' : '未打开' }}
+                            </div>
                         </div>
-                        <div v-else @click="privilegeFn(item)" class="prive2">
-                            {{ item.name }}
+                        <div class="text5" v-else>铸造者未设置</div>
+                    </div>
+                </van-collapse-item>
+                <van-collapse-item name="0" class="goods-info">
+                    <template #title>
+                        <div class="titleIcon page-title">
+                            <img src="../../assets/icon-lianshangxinxi.png" alt="" />持有特权<span
+                                >(灰色表示已使用)</span
+                            >
+                        </div>
+                    </template>
+                    <div class="prive" v-if="init.length > 0">
+                        <div v-for="(item, index) in init" :key="index">
+                            <div class="prive1">
+                                <img class="img" :src="item.icon[0]" alt="" />
+                                <div class="prive2">{{ item.name }}</div>
+                            </div>
                         </div>
                     </div>
-                </div>
-            </div>
-            <div v-if="privileges.length === 0" class="conName">铸造者未设置</div>
-            <div class="goods">
-                <div class="goods-info">
-                    <div class="page-title">商品特性</div>
+                    <div v-if="init.length === 0" class="tips">铸造者未设置</div>
+                </van-collapse-item>
+                <van-collapse-item name="1" class="goods-info">
+                    <template #title>
+                        <div class="page-title">
+                            <img src="../../assets/icon-lianshangxinxi(2).png" alt="" />商品特性
+                        </div>
+                    </template>
                     <div class="specific-list" v-if="properties.length > 0">
                         <div class="specific-item" v-for="(item, index) in properties" :key="index">
                             <div class="text1">{{ item.name }}</div>
@@ -195,22 +209,50 @@
                         </div>
                     </div>
                     <div v-else class="textName">铸造者未设置</div>
-                </div>
-                <div class="goods-info">
-                    <div class="page-title">链上信息</div>
+                </van-collapse-item>
+                <van-collapse-item name="2" class="goods-info">
+                    <template #title>
+                        <div class="page-title">
+                            <img src="../../assets/icon-lianshangxinxi(2).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>
-                </div>
-                <div class="goods-info">
-                    <div class="page-title">作品描述</div>
-                    <div v-if="info.detail" class="page-text" v-html="info.detail"></div>
+                </van-collapse-item>
+                <van-collapse-item name="4" class="goods-info">
+                    <template #title>
+                        <div class="page-title">
+                            <img src="../../assets/icon-lianshangxinxi(2).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>
-                </div>
-            </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="" /> -->
+                            <div class="init">
+                                <div style="width: 100%">
+                                    <div class="text1">{{ item.fromUser || '保密' }}</div>
+                                    <div class="text2">
+                                        <div class="text3">{{ item.operation }}{{ item.price }}</div>
+                                        <div class="text4">{{ item.createdAt }}</div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div v-else style="display: flex; justify-content: center; margin-top: 10px">暂无购买记录</div>
+                </van-collapse-item>
+            </van-collapse>
 
             <!-- <template v-if="info.detail">
                 <div class="page-title">作品描述</div>
@@ -241,44 +283,6 @@
                 }}</van-button>
             </div>
         </div>
-        <!-- <div > -->
-        <!-- <div class="goods">
-            <div style="padding-left: 16px" class="page-title">交易历史</div>
-            <div class="content" v-for="item in list" :key="item.id">
-                <div class="init">
-                    <div style="width: 100%">
-                        <div class="text1">{{ item.fromUser || '保密' }}</div>
-                        <div class="text2">
-                            <div class="text3">{{ item.operation }}{{ item.price }}</div>
-                            <div class="text4">{{ item.createdAt }}</div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div> -->
-        <van-collapse v-model="activeName" accordion>
-            <van-collapse-item class="activeName" title="交易记录" name="1">
-                <div v-if="list.length > 0">
-                    <div class="content" v-for="item in list" :key="item.id">
-                        <!-- <img class="img" :src="list.avatar" alt="" /> -->
-                        <div class="init">
-                            <div style="width: 100%">
-                                <div class="text1">{{ item.fromUser || '保密' }}</div>
-                                <div class="text2">
-                                    <div class="text3">{{ item.operation }}{{ item.price }}</div>
-                                    <div class="text4">{{ item.createdAt }}</div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div v-else style="display: flex; justify-content: center; margin-top: 10px">暂无购买记录</div>
-            </van-collapse-item>
-        </van-collapse>
-        <!-- </div> -->
-
-        <driver />
-        <!-- 其他三个 -->
         <van-popup v-model:show="show">
             <div class="title2">
                 <div class="top">
@@ -295,15 +299,23 @@
             </div>
             <div class="border"></div>
             <div class="name">{{ list2.description }}</div>
-            <div class="name1" v-if="list2.type != 'code' && list2.name != '版权权利'">
-                <img class="qrcodeImg" v-if="list2.type == 'qrcode'" :src="list2.detail" alt="" />
-                <div class="qrcode1" v-if="list2.type == 'qrcode'">扫描二维码进行票务核销</div>
-                说明:<span>{{ list2.remark || '暂无' }}</span>
+            <div class="name1" v-if="list2.type === 'text'">
+                <!-- <div>{{ list2.detail }}</div> -->
+                <span>{{ list2.detail || '暂无' }}</span>
+            </div>
+            <div class="name1" v-if="list2.type === 'exchange'">
+                <span>{{ list2.detail }}</span>
+            </div>
+            <div class="name1" v-if="list2.type == 'qrcode'">
+                <img class="qrcodeImg" :src="list2.detail" alt="" />
+                <div class="qrcode1">扫描二维码进行票务核销</div>
+                <span>{{ list2.remark || '暂无' }}</span>
             </div>
-            <div v-if="list2.type == 'code'">
+            <div v-if="list2.type === 'code'">
                 <div class="copy">
                     <div class="id">
-                        {{ list2.id }}
+                        <!-- {{ list2.detail }} -->
+                        yshsbn
                     </div>
                     <img class="copyImg" @click="copy" src="../../assets/svgs/copy_icon.svg" alt="" />
                 </div>
@@ -335,7 +347,7 @@
             <div class="border"></div>
             <div class="name">{{ init2.description }}</div>
             <div class="name1">
-                说明:<span>{{ init2.remark || '暂无' }}</span>
+                <span>{{ init2.detail || '暂无' }}</span>
             </div>
             <div v-if="init2.openTime" class="timename"><span class="time">开启时间:</span>{{ init2.openTime }}</div>
         </van-popup>
@@ -392,7 +404,7 @@ export default {
     mixins: [asset, product],
     data() {
         return {
-            activeName: '1',
+            activeNames: [],
             info: {},
             liked: false,
             show2: false,
@@ -682,7 +694,13 @@ export default {
     background: #181818 !important;
     padding: 0 !important;
 }
+/deep/ .van-collapse {
+    border: 0 !important;
+}
 .activeName {
+    /deep/ .van-collapse {
+        border: 0 !important;
+    }
     /deep/ .van-cell__title {
         font-size: @font2;
         font-family: PingFangSC-Medium, PingFang SC;
@@ -702,15 +720,15 @@ export default {
     padding: 10px 0 16px 16px;
 }
 .content {
-    padding: 0px 16px;
+    // padding: 0px 16px;
     display: flex;
     align-items: center;
     width: 343px;
     height: 68px;
     border-radius: 12px;
     .img {
-        width: 40px;
-        height: 40px;
+        width: 32px;
+        height: 32px;
         border-radius: 50%;
         margin-right: 10px;
     }
@@ -720,7 +738,7 @@ export default {
         justify-content: space-between;
         width: 100%;
         .text1 {
-            font-size: @font2;
+            font-size: @font1;
             font-weight: bold;
             color: #ffffff;
             line-height: 24px;
@@ -804,8 +822,6 @@ export default {
     .info-bottom {
         display: flex;
         position: relative;
-        margin-top: 4px;
-        height: 24px;
         .text1 {
             font-size: @font2;
             color: #949699;
@@ -1033,96 +1049,87 @@ export default {
 }
 .goods {
     // padding: 20px 16px;
-
-    .page-title {
-        font-size: @font2;
-        font-weight: bold;
-        color: #ffffff;
-        line-height: 24px;
-        margin-top: 14px;
-        &:not(:first-child) {
-            padding-top: 16px;
-        }
-    }
-
-    span {
-        font-size: @font2;
-        font-weight: 400;
-        color: @text3;
-        line-height: 24px;
-    }
-    .top {
-        padding: 20px 16px 0;
+    .top1 {
         display: flex;
         align-items: center;
-        justify-content: space-between;
-        .top1 {
-            display: flex;
-            align-items: center;
-            .text1 {
-                font-size: @font2;
-                font-weight: bold;
-                color: #ffffff;
-                line-height: 28px;
-            }
-            .text2 {
-                width: 94px;
-                height: 32px;
-                background: linear-gradient(135deg, @prim, @warn);
-                border-radius: 4px;
-                margin-left: 14px;
-                line-height: 30px;
-                text-align: center;
-                color: #ffffff;
+        margin-top: 12px;
+        .text1 {
+            font-size: @font2;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 28px;
+        }
+        .text2 {
+            width: 94px;
+            height: 32px;
+            background: linear-gradient(135deg, @prim, @warn);
+            border-radius: 4px;
+            margin-left: 14px;
+            line-height: 30px;
+            text-align: center;
+            color: #ffffff;
+            position: relative;
+            margin-left: 0;
+            * {
                 position: relative;
-                * {
-                    position: relative;
-                    z-index: 2;
-                }
+                z-index: 2;
+            }
 
-                &::after {
-                    content: '';
-                    position: absolute;
-                    left: 1px;
-                    top: 1px;
-                    right: 1px;
-                    bottom: 1px;
-                    background-color: @bg;
-                    z-index: 0;
-                    border-radius: 4px;
-                }
-                &.text3 {
-                    display: flex;
-                    align-items: center;
-                    justify-content: center;
-                }
-                .img {
-                    width: 18px;
-                    height: 18px;
-                    margin-right: 4px;
-                }
-                &.prim {
-                    color: @text3;
-                    border: 1px solid #303133;
-                    background: #202122;
-                }
+            &::after {
+                content: '';
+                position: absolute;
+                left: 1px;
+                top: 1px;
+                right: 1px;
+                bottom: 1px;
+                background-color: @bg;
+                z-index: 0;
+                border-radius: 4px;
             }
-            .text4 {
-                color: #fdfb60;
-                &.prim {
-                    color: @text3;
-                }
+            &.text3 {
+                display: flex;
+                align-items: center;
+                justify-content: center;
             }
-            .text5 {
-                font-size: @font2;
-                font-family: PingFangSC-Regular, PingFang SC;
-                font-weight: 400;
-                color: #939599;
-                line-height: 24px;
-                padding-left: 10px;
+            .img {
+                width: 18px;
+                height: 18px;
+                margin-right: 4px;
+            }
+            &.prim {
+                color: @text3;
+                border: 1px solid #303133;
+                background: #202122;
+            }
+        }
+        .text4 {
+            color: #fdfb60;
+            &.prim {
+                color: @text3;
             }
         }
+        .text5 {
+            font-size: @font2;
+            font-family: PingFangSC-Regular, PingFang SC;
+            font-weight: 400;
+            color: #939599;
+            line-height: 24px;
+            padding-left: 10px;
+        }
     }
+}
+span {
+    font-size: @font1;
+    font-weight: 400;
+    color: @text3;
+    line-height: 24px;
+}
+.top {
+    padding: 20px 16px 0;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+
     .prive {
         display: flex;
         align-items: center;
@@ -1156,43 +1163,56 @@ export default {
 }
 
 .page-title {
-    padding: 0 16px;
+    // padding: 0 16px;
     font-size: @font2;
     font-weight: bold;
     color: #ffffff;
     line-height: 28px;
 }
 .specific-list {
-    padding: 16px 0;
+    padding: 10px 0 0;
     display: flex;
     align-items: center;
-    justify-content: space-between;
+    overflow-x: auto;
 }
 .specific-item {
-    width: 94px;
-    height: 62px;
     border-radius: 4px;
-    border: solid 0px transparent;
-    padding: 1px;
-    background-image: linear-gradient(@bg, @bg), linear-gradient(135deg, #fdfb60, #ff8f3e);
-    background-origin: border-box;
-    box-sizing: border-box;
-    background-clip: content-box, border-box;
+    padding: 8px;
     display: flex;
     align-items: center;
     justify-content: center;
     flex-direction: column;
-    margin: 0 16px;
+    position: relative;
+    background: linear-gradient(135deg, @prim, @warn);
+    margin-right: 20px;
+    box-sizing: border-box;
+    min-width: 94px;
+
+    &::after {
+        content: '';
+        position: absolute;
+        top: 1px;
+        left: 1px;
+        right: 1px;
+        bottom: 1px;
+        background-color: @bg;
+        border-radius: 4px;
+        z-index: 0;
+    }
     .text1 {
-        font-size: @font2;
+        font-size: @font1;
         color: @text3;
-        line-height: 24px;
+        line-height: 18px;
+        z-index: 1;
+        white-space: nowrap;
     }
 
     .text2 {
-        font-size: @font2;
+        font-size: @font1;
         color: #ffffff;
-        line-height: 24px;
+        line-height: 18px;
+        z-index: 1;
+        white-space: nowrap;
     }
 }
 
@@ -1201,8 +1221,6 @@ export default {
     color: #ffffff;
     line-height: 28px;
     margin-top: 10px;
-    word-break: break-all;
-    padding: 0 16px 14px 16px;
     // p {
     //     font-size: @font2;
     //     color: #ffffff;
@@ -1261,6 +1279,7 @@ export default {
 
 .user {
     display: flex;
+    padding-top: 12px;
     .creator {
         width: 50%;
     }
@@ -1424,6 +1443,40 @@ export default {
         }
     }
 }
+.goods {
+    padding: 0 16px 0px;
+
+    .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;
+        }
+    }
+}
+.goods-info {
+    padding: 0 0 30px;
+}
+/deep/.goods-info {
+    .van-cell {
+        padding: 0 0;
+    }
+}
+
+.page-title {
+    span {
+        font-size: @font1;
+    }
+}
 
 .status-text {
     font-size: @font4;
@@ -1433,4 +1486,9 @@ export default {
     padding: 14px 50px !important;
     border-top: 1px solid #313233;
 }
+
+.tips {
+    font-size: @font1;
+    margin-top: 12px;
+}
 </style>

+ 53 - 26
src/main/nine-space/src/views/product/Detail.vue

@@ -89,7 +89,10 @@
             <van-collapse v-model="activeNames">
                 <van-collapse-item name="01" class="goods-info">
                     <template #title>
-                        <div class="page-title">用户信息</div>
+                        <div class="page-title">
+                            <img src="../../assets/fenxiang-icon.png" alt="" />
+                            用户信息
+                        </div>
                     </template>
                     <div class="user">
                         <van-cell
@@ -137,7 +140,7 @@
                 </van-collapse-item>
                 <van-collapse-item name="002" class="goods-info top1">
                     <template #title>
-                        <div class="page-title">类型</div>
+                        <div class="page-title"><img src="../../assets/icon-lianshangxinxi.png" alt="" /> 类型</div>
                     </template>
                     <div v-if="info.category" style="margin-top: 12px; font-size: 12px" class="text2">
                         {{ info.category }}
@@ -146,7 +149,9 @@
                 </van-collapse-item>
                 <van-collapse-item name="00" class="goods-info init">
                     <template #title>
-                        <div class="page-title">悄悄话</div>
+                        <div class="page-title">
+                            <img src="../../assets/qiaoqiaohua-icon-weidakai.png" alt="" /> 悄悄话
+                        </div>
                     </template>
                     <div class="qiaohua" v-if="init2">
                         <img class="img" :src="init2.icon[0]" alt="" />
@@ -158,7 +163,11 @@
                 </van-collapse-item>
                 <van-collapse-item name="0" class="goods-info">
                     <template #title>
-                        <div class="titleIcon">持有特权<span>(灰色表示已使用)</span></div>
+                        <div class="titleIcon page-title">
+                            <img src="../../assets/icon-lianshangxinxi.png" alt="" />
+                            持有特权
+                            <span>(灰色表示已使用)</span>
+                        </div>
                     </template>
                     <div class="prive" v-if="init.length > 0">
                         <div v-for="(item, index) in init" :key="index">
@@ -172,7 +181,9 @@
                 </van-collapse-item>
                 <van-collapse-item name="1" class="goods-info">
                     <template #title>
-                        <div class="page-title">商品特性</div>
+                        <div class="page-title">
+                            <img src="../../assets/icon-lianshangxinxi(2).png" alt="" />商品特性
+                        </div>
                     </template>
                     <div class="specific-list" v-if="properties.length > 0">
                         <div class="specific-item" v-for="(item, index) in properties" :key="index">
@@ -182,20 +193,9 @@
                     </div>
                     <div v-else class="textName">铸造者未设置</div>
                 </van-collapse-item>
-                <van-collapse-item name="2" class="goods-info">
-                    <template #title>
-                        <div class="page-title">链上信息</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="3" class="goods-info">
                     <template #title>
-                        <div class="page-title">盲盒详情</div>
+                        <div class="page-title"><img src="../../assets/icon-miaoshu.png" alt="" />盲盒详情</div>
                     </template>
                     <swiper v-if="boxs.length > 0" :slidesPerView="'auto'" :spaceBetween="20" class="detail-swiper">
                         <swiper-slide v-for="(item, index) in boxs" :key="index">
@@ -211,16 +211,31 @@
                     </swiper>
                     <div v-else class="textName">铸造者未设置</div>
                 </van-collapse-item>
+                <van-collapse-item name="2" class="goods-info">
+                    <template #title>
+                        <div class="page-title">
+                            <img src="../../assets/icon-lianshangxinxi(2).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="4" class="goods-info">
                     <template #title>
-                        <div class="page-title">作品描述</div>
+                        <div class="page-title">
+                            <img src="../../assets/icon-lianshangxinxi(2).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="5" class="goods-info">
                     <template #title>
-                        <div class="page-title">交易记录</div>
+                        <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">
@@ -631,13 +646,18 @@ export default {
     color: #ffffff;
     line-height: 24px;
     // padding: 30px 0 0 16px;
+    span {
+        font-size: @font2;
+        font-weight: 400;
+        color: #939599;
+        line-height: 24px;
+    }
 }
-span {
-    font-size: @font2;
-    font-weight: 400;
-    color: #939599;
-    line-height: 24px;
+
+.info {
+    min-height: 100px;
 }
+
 .top {
     padding: 20px 16px 0;
     display: flex;
@@ -744,9 +764,16 @@ span {
         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;
+        }
     }
 }
 .content {
@@ -757,8 +784,8 @@ span {
     height: 68px;
     border-radius: 12px;
     .img {
-        width: 40px;
-        height: 40px;
+        width: 32px;
+        height: 32px;
         border-radius: 50%;
         margin-right: 10px;
     }

+ 19 - 10
src/main/pc-space/src/views/AssetDetail.vue

@@ -265,7 +265,7 @@
             <div class="border"></div>
             <div class="name">藏有创作者填写的隐藏内容,持有者才能打开</div>
             <div class="name1">
-                说明:<span>{{ init2.remark || '暂无' }}</span>
+                <span>{{ init2.detail || '暂无' }}</span>
             </div>
             <div v-if="init2.openTime" class="timename"><span class="time">开启时间:</span>{{ init2.openTime }}</div>
         </el-dialog>
@@ -276,19 +276,27 @@
             </div>
             <div class="border"></div>
             <div class="name">{{ list2.description }}</div>
-            <div class="name1" v-if="list2.type != 'code' && list2.name != '版权权利'">
-                <img class="qrcodeImg" v-if="list2.type == 'qrcode'" :src="list2.detail" alt="" />
-                <div class="qrcode1" v-if="list2.type == 'qrcode'">扫描二维码进行票务核销</div>
-                说明:<span>{{ list2.remark || '暂无' }}</span>
+            <div class="name1" v-if="list2.type === 'text'">
+                <!-- <div>{{ list2.detail }}</div> -->
+                <span>{{ list2.detail || '暂无' }}</span>
+            </div>
+            <div class="name1" v-if="list2.type === 'exchange'">
+                <span>{{ list2.detail }}</span>
+            </div>
+            <div class="name1" v-if="list2.type == 'qrcode'">
+                <img class="qrcodeImg" :src="list2.detail" alt="" />
+                <div class="qrcode1">扫描二维码进行票务核销</div>
+                <span>{{ list2.remark || '暂无' }}</span>
             </div>
             <div v-if="list2.type == 'code'">
                 <div class="copy">
                     <div class="id">
-                        {{ list2.id }}
+                        <!-- {{ list2.detail }} -->
+                        yshsbn
                     </div>
                     <img class="copyImg" @click="copy" src="../assets/user/copy_icon@3x (1).png" alt="" />
                 </div>
-                <span class="span">说明:</span> <span>{{ list2.remark || '暂无' }}</span>
+                <span class="span"></span> <span>{{ list2.remark || '暂无' }}</span>
                 <div class="border"></div>
                 <div class="code">每次交易都会产生校验码</div>
             </div>
@@ -423,7 +431,6 @@ export default {
             }
         },
         privilegeFn(init) {
-            // console.log(111);
             this.list2 = init;
             this.show4 = true;
             this.$http
@@ -436,7 +443,6 @@ export default {
                 });
         },
         privilegeFn2(init) {
-            // console.log(222);
             // this.list2 = init;
             // this.show4 = true;
             if (init.once && init.opened == false) {
@@ -474,7 +480,7 @@ export default {
                 })
                 .then(res => {
                     this.tableData = res;
-                    console.log(this.tableData);
+                    // console.log(this.tableData);
                 });
         },
         getDetail() {
@@ -1301,6 +1307,9 @@ export default {
         /deep/ .el-table th.is-leaf {
             border-bottom: 1px solid #2b2e3e;
         }
+        /deep/ .el-collapse-item__content {
+            padding-bottom: 1px !important;
+        }
         .info {
             display: flex;
             align-items: center;

+ 15 - 7
src/main/pc-space/src/views/CollectionDetail.vue

@@ -112,8 +112,8 @@
                     <div class="name name2">持有特权<span>(灰色表示已使用)</span></div>
                 </div>
                 <div class="init1">
-                    <div class="name">{{ info.category || '铸造者未设置' }}</div>
-                    <!-- <div class="Notset">铸造者未设置</div> -->
+                    <div class="name" v-if="info.category">{{ info.category }}</div>
+                    <div class="Notset" v-else>铸造者未设置</div>
                     <div class="bor"></div>
                     <div class="box" v-if="init2 != ''">
                         <div
@@ -317,14 +317,14 @@ export default {
                     this.getRelated(res.ownerId);
                     if (res.assetId) {
                         this.$http.get('/asset/get/' + res.assetId).then(res => {
-                            console.log(res);
+                            // console.log(res);
                             this.$http
                                 .get('/asset/tokenHistory', {
                                     tokenId: res.tokenId,
                                     assetId: res.collectionId
                                 })
                                 .then(res => {
-                                    console.log(res);
+                                    // console.log(res);
                                     this.tableData = res;
                                 });
                         });
@@ -656,9 +656,14 @@ export default {
             background: #1f2230;
             margin-bottom: 30px;
             border-radius: 0px 0px 8px 8px;
-            // .Notset{
-
-            // }
+            .Notset {
+                font-size: 14px;
+                width: 128px;
+                font-weight: 400;
+                color: #939599;
+                line-height: 24px;
+                padding-left: 16px;
+            }
             .name {
                 width: 128px;
                 font-size: 14px;
@@ -809,6 +814,9 @@ export default {
         /deep/ .el-table th.is-leaf {
             border-bottom: 1px solid #2b2e3e;
         }
+        /deep/ .el-collapse-item__content {
+            padding-bottom: 1px !important;
+        }
         .info {
             display: flex;
             align-items: center;

+ 3 - 1
src/main/pc-space/src/views/Index.vue

@@ -19,7 +19,9 @@
             >
                 <div class="footer center-content">
                     <div class="footer-l">
-                        <img class="logo" src="../assets/nav_logo@3x (1).png" alt="" />
+                        <router-link class="logo-link" :to="{ path: '/' }">
+                            <img class="logo" src="../assets/nav_logo@3x (1).png" alt="" />
+                        </router-link>
                         <div>
                             <div class="text1">加入创造者生态</div>
                             <div class="text2">让我们成为一批游戏NFT的弄潮儿</div>

+ 6 - 3
src/main/vue/src/views/BannerEdit.vue

@@ -42,12 +42,13 @@
                     <el-form-item prop="link" label="跳转">
                         <el-switch v-model="formData.link"></el-switch>
                     </el-form-item>
-                    <el-form-item prop="linkType" label="跳转类型">
+                    <el-form-item prop="linkType" label="跳转类型" v-if="formData.link">
                         <el-select v-model="formData.linkType">
                             <el-option label="藏品/盲盒" value="collection"></el-option>
+                            <el-option label="铸造者" value="user"></el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item prop="linkContent" label="跳转内容">
+                    <el-form-item prop="linkContent" label="跳转内容" v-if="formData.link">
                         <el-input v-model="formData.linkContent" placeholder="输入ID"></el-input>
                     </el-form-item>
                     <el-form-item class="form-submit">
@@ -119,7 +120,9 @@ export default {
                         message: '请输入跳转',
                         trigger: 'blur'
                     }
-                ]
+                ],
+                linkType: [{ required: true, message: '请选择跳转类型' }],
+                linkContent: [{ required: true, message: '请输入跳转内容' }]
             },
             typeOptions: [
                 { label: '首页', value: 'HOME' },

+ 12 - 6
src/main/vue/src/views/IdentityAuthList.vue

@@ -9,7 +9,11 @@
             </el-button> -->
         </page-title>
         <div class="filters-container">
-            <el-select v-model="status" clearable placeholder="状态" @change="getData">
+            <el-select v-model="org" @change="getData" class="filter-item">
+                <el-option label="个人" :value="false"></el-option>
+                <el-option label="企业" :value="true"></el-option>
+            </el-select>
+            <el-select v-model="status" clearable placeholder="状态" @change="getData" class="filter-item">
                 <el-option
                     v-for="item in statusOptions.slice(1, 4)"
                     :key="item.value"
@@ -41,10 +45,11 @@
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
             <el-table-column prop="userId" label="用户ID" width="100"> </el-table-column>
-            <el-table-column prop="realName" label="姓名" min-width="100" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="phone" label="手机"  min-width="150" show-overflow-tooltip> </el-table-column>
+            <el-table-column prop="realName" :label="org ? '法人' : '姓名'" min-width="100" show-overflow-tooltip>
+            </el-table-column>
+            <el-table-column prop="phone" label="手机" min-width="150" show-overflow-tooltip> </el-table-column>
             <el-table-column prop="email" label="邮箱" min-width="200" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="idNo" label="身份证"  min-width="200" show-overflow-tooltip> </el-table-column>
+            <el-table-column prop="idNo" label="身份证" min-width="200" show-overflow-tooltip> </el-table-column>
             <el-table-column prop="idFront" label="身份正面照" width="120" align="center">
                 <template v-slot="{ row }">
                     <el-image
@@ -120,7 +125,8 @@ export default {
                 { label: '已认证', value: 'SUCCESS' },
                 { label: '失败', value: 'FAIL' }
             ],
-            status: 'PENDING'
+            status: 'PENDING',
+            org: false
         };
     },
     computed: {
@@ -137,7 +143,7 @@ export default {
             return '';
         },
         beforeGetData() {
-            return { search: this.search, query: { del: false, status: this.status } };
+            return { search: this.search, query: { del: false, status: this.status, org: this.org } };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;

+ 4 - 1
src/main/vue/src/views/UserEdit.vue

@@ -17,7 +17,7 @@
                     :model="formData"
                     :rules="rules"
                     ref="form"
-                    label-width="80px"
+                    label-width="90px"
                     label-position="right"
                     style="max-width: 500px"
                 >
@@ -54,6 +54,9 @@
                             </el-option>
                         </el-select>
                     </el-form-item>
+                    <el-form-item prop="shareRatio" label="分成比例(%)">
+                        <el-input-number :min="0" :max="99" v-model="formData.shareRatio"></el-input-number>
+                    </el-form-item>
                     <el-form-item>
                         <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                         <el-button @click="del" :disabled="saving" type="danger" v-if="formData.id && formData.id !== 1"

+ 1 - 1
src/test/java/com/izouma/nineth/service/OrderServiceTest.java

@@ -14,7 +14,7 @@ public class OrderServiceTest extends ApplicationTests {
 
     @Test
     public void create() throws EncoderException, WxPayException {
-        Order order = orderService.create(1110L, 1777L, 1, null, 1896L);
+        Order order = orderService.create(1110L, 1777L, 1, null, 1896L, null);
         assert order.getStatus() == OrderStatus.FINISH;
     }