yuanyuan 3 ani în urmă
părinte
comite
acfd8e61c9
79 a modificat fișierele cu 4683 adăugiri și 381 ștergeri
  1. 18 2
      src/App.vue
  2. BIN
      src/assets/douyin-shuoming1.png
  3. BIN
      src/assets/douyin-shuoming2.png
  4. BIN
      src/assets/douyin-shuoming3.png
  5. BIN
      src/assets/icon-chaolian.png
  6. BIN
      src/assets/icon_OASISMETA.png
  7. BIN
      src/assets/icon_cangpin.png
  8. BIN
      src/assets/icon_douyin.png
  9. BIN
      src/assets/icon_fengcun.png
  10. BIN
      src/assets/icon_gouxuan_huise_domain.png
  11. BIN
      src/assets/icon_gouxuan_pre_domain.png
  12. BIN
      src/assets/icon_inter2.png
  13. BIN
      src/assets/icon_liutong.png
  14. BIN
      src/assets/icon_liutong@3x.png
  15. BIN
      src/assets/icon_mingcheng.png
  16. BIN
      src/assets/icon_mingpian.png
  17. BIN
      src/assets/icon_paimai.png
  18. BIN
      src/assets/icon_qiyongchaolian.png
  19. BIN
      src/assets/icon_sosuo.png
  20. BIN
      src/assets/icon_sosuo_dark.png
  21. BIN
      src/assets/icon_sosuofaxian@3x.png
  22. BIN
      src/assets/icon_web2.0.png
  23. BIN
      src/assets/icon_xingtu.png
  24. BIN
      src/assets/icon_zengsong.png
  25. BIN
      src/assets/icon_zhuli.png
  26. BIN
      src/assets/icon_zhuye.png
  27. BIN
      src/assets/info_icon_banquanshichangone@3x.png
  28. BIN
      src/assets/info_icon_banquanshichangtwo@3x.png
  29. BIN
      src/assets/info_icon_paimaixilieone@3x.png
  30. BIN
      src/assets/info_icon_yanshengpingone@3x.png
  31. BIN
      src/assets/info_icon_yanshengpingtwo@3x.png
  32. BIN
      src/assets/png-da-zi.png
  33. BIN
      src/assets/png-dabg-add.jpg
  34. BIN
      src/assets/png-dabg.jpg
  35. BIN
      src/assets/png-renwu.png
  36. BIN
      src/assets/png-searchAll-bg.png
  37. BIN
      src/assets/png-xiaobg-collection.png
  38. BIN
      src/assets/png-xiaobg-web.png
  39. BIN
      src/assets/search-all-newsBg.png
  40. BIN
      src/assets/searchBg.jpg
  41. BIN
      src/assets/search_sosuo.png
  42. 76 1
      src/components/ChatInfo.vue
  43. 41 1
      src/components/PayMethodPick.vue
  44. 3 0
      src/components/TeamInfo.vue
  45. 57 19
      src/components/asset/ownedBuy.vue
  46. 7 9
      src/components/asset/receiveQuotation.vue
  47. 167 0
      src/components/creator/CreatorInfoList.vue
  48. 73 1
      src/components/creator/CreatorSmall.vue
  49. 48 5
      src/components/order/BidOrderInfo.vue
  50. 99 71
      src/components/order/DomainInfo.vue
  51. 9 5
      src/components/rice/Share.vue
  52. 26 9
      src/components/rice/Task.vue
  53. 3 2
      src/mixins/list.js
  54. 14 0
      src/mixins/order.js
  55. 77 0
      src/mixins/superLink.js
  56. 63 3
      src/router/index.js
  57. 12 5
      src/styles/app.less
  58. 241 1
      src/views/Discover.vue
  59. 290 10
      src/views/DomainName.vue
  60. 14 0
      src/views/Home.vue
  61. 10 0
      src/views/Mine.vue
  62. 476 0
      src/views/OfferPriceSubmit.vue
  63. 92 21
      src/views/Store.vue
  64. 87 11
      src/views/asset/Detail.vue
  65. 13 8
      src/views/chat/Detail.vue
  66. 163 0
      src/views/domain/BindingImage.vue
  67. 257 0
      src/views/domain/BindingWeb.vue
  68. 224 0
      src/views/domain/ProductChoose.vue
  69. 118 35
      src/views/domain/Statistics.vue
  70. 0 3
      src/views/domain/SuperLink.vue
  71. 223 69
      src/views/domain/SuperLinkType.vue
  72. 37 2
      src/views/order/Orders.vue
  73. 317 87
      src/views/product/QuotationRecord.vue
  74. 275 0
      src/views/search/SearchAll.vue
  75. 671 0
      src/views/search/SearchDetail.vue
  76. 283 0
      src/views/search/SearchResult.vue
  77. 1 0
      src/views/user/BalanceRecord.vue
  78. 2 1
      src/views/user/Rice.vue
  79. 96 0
      src/views/user/SuperLink.vue

+ 18 - 2
src/App.vue

@@ -286,7 +286,10 @@ export default {
     }
 
     &.metaDomain,
-    &.shoppingCart {
+    &.shoppingCart,
+    &.searchAll,
+    &.searchResult,
+    &.statistics {
         background: #000000;
     }
 
@@ -323,7 +326,9 @@ export default {
     &.auction {
         background-color: #030001;
     }
-
+    // &.discover {
+    //     background: #0f1014;
+    // }
     &.domainname,
     &.domainSubmit,
     &.activityList,
@@ -334,6 +339,17 @@ export default {
     &.activityDetail {
         background-color: #181818;
     }
+
+    &.superLinkType,
+    &.domainProductChoose,
+    &.bindingWeb,
+    &.bindingImage {
+        background-color: #0f1014;
+    }
+
+    &.mineSuperLink {
+        background-color: #0f0f0f;
+    }
 }
 
 .scroll-wrappers {

BIN
src/assets/douyin-shuoming1.png


BIN
src/assets/douyin-shuoming2.png


BIN
src/assets/douyin-shuoming3.png


BIN
src/assets/icon-chaolian.png


BIN
src/assets/icon_OASISMETA.png


BIN
src/assets/icon_cangpin.png


BIN
src/assets/icon_douyin.png


BIN
src/assets/icon_fengcun.png


BIN
src/assets/icon_gouxuan_huise_domain.png


BIN
src/assets/icon_gouxuan_pre_domain.png


BIN
src/assets/icon_inter2.png


BIN
src/assets/icon_liutong.png


BIN
src/assets/icon_liutong@3x.png


BIN
src/assets/icon_mingcheng.png


BIN
src/assets/icon_mingpian.png


BIN
src/assets/icon_paimai.png


BIN
src/assets/icon_qiyongchaolian.png


BIN
src/assets/icon_sosuo.png


BIN
src/assets/icon_sosuo_dark.png


BIN
src/assets/icon_sosuofaxian@3x.png


BIN
src/assets/icon_web2.0.png


BIN
src/assets/icon_xingtu.png


BIN
src/assets/icon_zengsong.png


BIN
src/assets/icon_zhuli.png


BIN
src/assets/icon_zhuye.png


BIN
src/assets/info_icon_banquanshichangone@3x.png


BIN
src/assets/info_icon_banquanshichangtwo@3x.png


BIN
src/assets/info_icon_paimaixilieone@3x.png


BIN
src/assets/info_icon_yanshengpingone@3x.png


BIN
src/assets/info_icon_yanshengpingtwo@3x.png


BIN
src/assets/png-da-zi.png


BIN
src/assets/png-dabg-add.jpg


BIN
src/assets/png-dabg.jpg


BIN
src/assets/png-renwu.png


BIN
src/assets/png-searchAll-bg.png


BIN
src/assets/png-xiaobg-collection.png


BIN
src/assets/png-xiaobg-web.png


BIN
src/assets/search-all-newsBg.png


BIN
src/assets/searchBg.jpg


BIN
src/assets/search_sosuo.png


+ 76 - 1
src/components/ChatInfo.vue

@@ -27,6 +27,81 @@
             <van-image width="36" height="36" round :src="info.fromAvatar" />
         </div>
     </div>
+    <!-- <div class="chat-info" :class="{ isLeft: flow == 'in' }" :id="`chat_${info.id || info.time}`">
+        <div class="chat-time" v-if="timeStr">{{ timeStr }}</div>
+        <div class="chat-time" v-if="type == 'notification'">{{ noticeStr }}</div>
+        <div class="chat-content" v-else>
+            <div class="chat-box">
+                <div class="chat-name" v-if="flow == 'in'">{{ info.fromNick || info.fromNickName }}</div>
+                <van-image
+                    :src="body.msg"
+                    @click="preview(info)"
+                    fit="scale-down"
+                    v-if="isImage"
+                    :width="imgWidth"
+                    :height="imgHeight"
+                ></van-image>
+                <div class="chat-message" v-else-if="type === 'text'">
+                    <div style="padding: 4px 0">
+                        <div
+                            style="
+                                line-height: 40px;
+                                background: #06c04f;
+                                border-radius: 4px;
+                                padding: 0 12px;
+                                margin-bottom: 12px;
+                                font-weight: bold;
+                            "
+                        >
+                            RAEX绿洲:RID元域名称交易监控
+                        </div>
+                        <div style="display: flex; margin-bottom: 8px">
+                            <img
+                                style="width: 18px; height: 18px; margin: 5px 10px 0 0"
+                                src="https://cdn.raex.vip/image/2023-04-06-14-32-07vINcTaZP.png"
+                                alt=""
+                            />
+                            <span>RID: 058.nft【已出售】</span>
+                        </div>
+                        <div style="display: flex; margin-bottom: 8px">
+                            <img
+                                style="width: 18px; height: 18px; margin: 5px 10px 0 0"
+                                src="https://cdn.raex.vip/image/2023-04-06-14-28-32HcaKTDYb.png"
+                                alt=""
+                            />
+                            <span>分类: 【RID元域名】</span>
+                        </div>
+                        <div style="display: flex; margin-bottom: 8px">
+                            <img
+                                style="width: 18px; height: 18px; margin: 5px 10px 0 0"
+                                src="https://cdn.raex.vip/image/2023-04-06-14-31-49lldhGaqC.png"
+                                alt=""
+                            />
+                            <span>销售价格: 【3899.99 】</span>
+                        </div>
+                        <div style="display: flex">
+                            <img
+                                style="width: 18px; height: 18px; margin: 5px 10px 0 0"
+                                src="https://cdn.raex.vip/image/2023-04-06-14-32-21ciilInpO.png"
+                                alt=""
+                            />
+                            <span>交易时间:<br />【2023-03-08 11:23:37】</span>
+                        </div>
+                    </div>
+                </div>
+                <van-image
+                    :src="attach.url"
+                    @click="preview(attach.url)"
+                    :width="width"
+                    :height="height"
+                    fit="scale-down"
+                    v-else
+                ></van-image>
+            </div>
+
+            <van-image width="36" height="36" round :src="info.fromAvatar" />
+        </div>
+    </div> -->
 </template>
 <script setup>
 import { defineProps, defineEmits, computed, onMounted, nextTick, ref } from 'vue';
@@ -228,7 +303,7 @@ onMounted(() => {
         .chat-content {
             flex-direction: row-reverse;
             .chat-message {
-                background: #2a2a2a;
+                background: #242632;
                 border-radius: 2px 12px 12px 12px;
                 color: #ffffff;
             }

+ 41 - 1
src/components/PayMethodPick.vue

@@ -92,7 +92,7 @@ export default {
                 {
                     name: '余额',
                     key: 'BALANCE',
-                    icon: 'https://cdn.raex.vip/image/2022-05-18-17-46-19eDglIIAy.png',
+                    icon: 'https://cdn.raex.vip/image/2022-05-18-17-52-41NwCNOLDd.png',
                     show: true,
                     enabled: true
                 }
@@ -190,6 +190,46 @@ export default {
     }
 }
 
+.pay-items {
+    display: flex;
+    align-items: center;
+    height: 48px;
+    padding: 0px 16px;
+    background: #ffffff;
+    .icon {
+        height: 24px;
+        width: 24px;
+        object-fit: contain;
+        display: block;
+    }
+
+    .img-icon {
+        // width: 45px;
+        .flex();
+        justify-content: center;
+    }
+
+    span {
+        font-size: 14px;
+        font-weight: bold;
+        color: @text0;
+        line-height: 24px;
+        flex-grow: 1;
+        padding: 0 10px;
+    }
+
+    .choose-icon {
+        width: 24px;
+        height: 24px;
+    }
+
+    &.not {
+        span {
+            color: @text3;
+        }
+    }
+}
+
 .pay-items {
     display: flex;
     align-items: center;

+ 3 - 0
src/components/TeamInfo.vue

@@ -51,6 +51,9 @@ const desc = computed(() => {
     if (props.info.inTeam && msg.value.time) {
         let _msg = JSON.parse(msg.value.body).msg;
         let isImage = _msg.startsWith('https://');
+        if (msg.value.fromId === '9859') {
+            return 'RID元域名称交易监控';
+        }
         return msg.value.fromNickName + ': ' + (isImage ? '【图片消息】' : _msg);
     }
 

+ 57 - 19
src/components/asset/ownedBuy.vue

@@ -7,11 +7,11 @@
                         width="20"
                         height="20"
                         class="user-img"
-                        :src="info.minterAvatar || require('@assets/svgs/img_default_photo.svg')"
+                        :src="info.ownerAvatar || require('@assets/svgs/img_default_photo.svg')"
                         fit="cover"
                         radius="100"
                     />
-                    <div class="product_top_left_one_name">持有者昵称</div>
+                    <div class="product_top_left_one_name">{{ info.ownerName }}</div>
                 </div>
                 <div class="product_top_left_two">
                     <van-image
@@ -27,16 +27,18 @@
                         <div class="product_left_time">剩余时长&nbsp;{{ info.endTime }}</div>
                     </div>
                 </div>
-                <div class="product_top_left_three">02-20 22:08</div>
+                <div class="product_top_left_three">{{ timeOne }}&nbsp;{{ timeTwo }}</div>
             </div>
             <div class="product_top_right">
-                <div class="product_top_right_title">已出价</div>
-                <div class="product_top_right_price">¥1000</div>
+                <div class="product_top_right_title">{{ getLabelName(info.status, statusOfferPrice) }}</div>
+                <div class="product_top_right_price">¥{{ info.price }}</div>
             </div>
         </div>
-        <div class="product_bottom">
-            <div class="product_bottom_con" @click="btn">不想买了</div>
-            <!-- <div class="product_bottom_cons">23:59后可取消出价</div> -->
+        <div class="product_bottom" v-if="info.status == 'ASKING'">
+            <div class="product_bottom_cons" v-if="endTimes >= 0">
+                <van-count-down @finish="finish" :time="endTimes" format="HH:mm:ss" />后可取消出价
+            </div>
+            <div class="product_bottom_con" @click="btn()" v-else>不想买了</div>
         </div>
     </div>
 </template>
@@ -44,9 +46,16 @@
 <script>
 import asset from '../../mixins/asset';
 import product from '../../mixins/product';
+import order from '../../mixins/order';
 import { Dialog } from 'vant';
+import { addDays } from 'date-fns';
 export default {
-    mixins: [asset, product],
+    mixins: [asset, product, order],
+    data() {
+        return {
+            time: 1424341
+        };
+    },
     props: {
         info: {
             type: Object,
@@ -55,8 +64,22 @@ export default {
             }
         }
     },
-    computed: {},
+    computed: {
+        timeOne() {
+            return this.dayjs(this.info.createdAt).format('MM-DD');
+        },
+        timeTwo() {
+            return this.dayjs(this.info.createdAt).format('HH:mm');
+        },
+        endTimes() {
+            let createdAt = this.dayjs(this.info.createdAt).add(2, 'minute');
+            return createdAt.diff(this.dayjs());
+        }
+    },
     methods: {
+        finish() {
+            this.$emit('fatherMethods');
+        },
         btn() {
             Dialog.confirm({
                 title: '确认不想买该藏品了',
@@ -65,10 +88,20 @@ export default {
                 cancelButtonColor: '#3AB200',
                 confirmButtonColor: '#626366'
             })
-                .then(() => {})
-                .catch(() => {
-                    // on cancel
-                });
+                .then(() => {
+                    this.$http
+                        .post('/domainAsk/cancel', {
+                            id: this.info.id
+                        })
+                        .then(res => {
+                            this.$toast.success('取消成功');
+                            this.$emit('fatherMethods');
+                        })
+                        .catch(e => {
+                            this.$toast(e.error);
+                        });
+                })
+                .catch(() => {});
         }
     }
 };
@@ -127,11 +160,8 @@ export default {
             }
 
             .product_left_time {
-                max-width: 114px;
                 height: 17px;
-                background: #232323;
                 border-radius: 2px;
-                text-align: center;
                 font-size: 10px;
                 font-weight: 400;
                 color: #939599;
@@ -156,6 +186,7 @@ export default {
                 font-weight: 400;
                 color: #00fc1d;
                 line-height: 24px;
+                text-align: right;
             }
 
             .product_top_right_price {
@@ -171,7 +202,7 @@ export default {
         border-top: solid 1px #242424;
         padding-top: 10px;
         display: flex;
-        justify-content: end;
+        justify-content: flex-end;
 
         .product_bottom_con {
             width: 100px;
@@ -194,7 +225,14 @@ export default {
             font-weight: 400;
             color: #939599;
             line-height: 32px;
-            text-align: center;
+            justify-content: center;
+            display: flex;
+            align-items: center;
+            .van-count-down {
+                font-size: 14px;
+                font-weight: 400;
+                color: #939599;
+            }
         }
     }
 

+ 7 - 9
src/components/asset/receiveQuotation.vue

@@ -1,16 +1,16 @@
 <template>
-    <div class="product">
+    <div class="product" @click="viewQuote">
         <div class="product_top">
-            <van-image class="icon-img" width="40" height="40" :src="getImg(changeImgs(info.pic))" fit="contain" />
+            <van-image class="icon-img" width="40" height="40" :src="info.pic" fit="contain" />
             <img :src="require('@assets/png-da-zi@3x.png')" alt="" class="name_img" />
             <div class="product_left_title">
-                <div class="product_left_name">{{ info.name }}</div>
+                <div class="product_left_name">{{ info.picName }}</div>
                 <div class="product_left_time">剩余时长&nbsp;{{ info.endTime }}</div>
             </div>
         </div>
         <div class="product_bottom">
-            <div class="product_bottom_left">共10条报价</div>
-            <div class="product_bottom_right" @click="viewQuote">
+            <div class="product_bottom_left">共{{ info.count }}条报价</div>
+            <div class="product_bottom_right">
                 <div class="product_bottom_right_text">查看报价</div>
                 <img :src="require('@assets/icon-back@3x(3).png')" alt="" class="product_bottom_right_img" />
             </div>
@@ -38,7 +38,8 @@ export default {
             this.$router.push({
                 path: '/quotationRecord',
                 query: {
-                    id: this.info.id
+                    id: this.info.assetId,
+                    domainOrderId: this.info.domainOrderId
                 }
             });
         }
@@ -75,11 +76,8 @@ export default {
         }
 
         .product_left_time {
-            max-width: 114px;
             height: 17px;
-            background: #232323;
             border-radius: 2px;
-            text-align: center;
             font-size: 10px;
             font-weight: 400;
             color: #939599;

+ 167 - 0
src/components/creator/CreatorInfoList.vue

@@ -0,0 +1,167 @@
+<template>
+    <router-link
+        :to="{
+            path: '/creatorDetail',
+            query: {
+                id: info.id
+            }
+        }"
+        class="info"
+    >
+        <van-image :width="60" :height="60" :src="getImg(info.avatar)" fit="cover" radius="100" />
+
+        <div class="content">
+            <div class="text1 van-ellipsis">{{ info.nickname }}</div>
+            <div class="text2 van-ellipsis">
+                {{ info.intro }}
+            </div>
+            <div class="flex1"></div>
+
+            <div class="text3">
+                <div class="text4">
+                    <span>粉丝</span>
+                    <span>{{ info.followers }}</span>
+                </div>
+            </div>
+        </div>
+    </router-link>
+</template>
+
+<script>
+export default {
+    props: {
+        rank: {
+            type: Number,
+            default: 0
+        },
+        info: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        },
+        isFollow: {
+            type: Boolean,
+            default: false
+        },
+        size: {
+            type: String,
+            default: 'normal'
+        }
+    },
+    computed: {
+        NOInfo() {
+            if (this.rank) {
+                const colors = ['#FF8E12', '#C37BFF', '#3ACEFF'];
+                return {
+                    img1: require(`@assets/NO${this.rank}.png`),
+                    img2: require(`@assets/svgs/NOicon${this.rank}.svg`),
+                    color: colors[this.rank - 1]
+                };
+            }
+            return {};
+        }
+    },
+    methods: {
+        follow() {
+            this.checkLogin().then(() => {
+                if (!this.info.follow) {
+                    this.$http.get(`/user/${this.info.id}/follow`).then(res => {
+                        this.$emit('update:info', {
+                            ...this.info,
+                            follow: true,
+                            followers: this.info.followers + 1
+                        });
+                        this.$toast.success('关注成功');
+                    });
+                } else {
+                    this.$http.get(`/user/${this.info.id}/unfollow`).then(() => {
+                        this.$emit('update:info', {
+                            ...this.info,
+                            follow: false,
+                            followers: this.info.followers - 1
+                        });
+                        this.$toast.success('取消关注');
+                    });
+                }
+            });
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.info {
+    display: flex;
+    padding: 10px 13px;
+    position: relative;
+    align-items: center;
+    background: #2b2b2c;
+
+    .content {
+        flex-grow: 1;
+        padding-left: 10px;
+        display: flex;
+        flex-direction: column;
+        overflow: hidden;
+        height: 64px;
+
+        .text1 {
+            font-size: 14px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 24px;
+        }
+
+        .text2 {
+            font-size: 12px;
+            color: #939599;
+            line-height: 17px;
+        }
+
+        .text3 {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+
+            .text4 {
+                span {
+                    font-size: 12px;
+                    color: #939599;
+                    line-height: 17px;
+                    &:nth-child(2) {
+                        color: #fff;
+                        margin-left: 2px;
+                    }
+                }
+            }
+        }
+    }
+
+    .van-image {
+        flex-shrink: 0;
+    }
+
+    .NOImg {
+        position: absolute;
+        width: 80px;
+        height: 90px;
+        display: block;
+        left: 12px;
+        top: 15px;
+    }
+}
+
+.info + .info {
+    position: relative;
+    &::before {
+        content: '';
+        position: absolute;
+        left: 20px;
+        right: 20px;
+        top: 0;
+        height: 1px;
+        background-color: rgba(255, 255, 255, 0.08);
+    }
+}
+</style>

+ 73 - 1
src/components/creator/CreatorSmall.vue

@@ -7,6 +7,7 @@
             }
         }"
         class="info"
+        v-if="find"
     >
         <van-image
             width="100%"
@@ -25,6 +26,32 @@
             </div>
         </div>
     </router-link>
+    <router-link
+        :to="{
+            path: '/creatorDetail',
+            query: {
+                id: info.id
+            }
+        }"
+        class="find_info"
+        v-else
+    >
+        <van-image
+            height="70"
+            :src="info.bg ? info.bg : require('@assets/creatorBg.png')"
+            loading-icon=""
+            fit="cover"
+            class="find_bg-img"
+        />
+        <van-image class="find_logo" :width="32" :height="32" :src="getImg(info.avatar)" fit="cover" radius="100" />
+
+        <div class="find_content">
+            <div class="find_text1 van-ellipsis">{{ info.nickname }}</div>
+            <div class="find_text2 van-multi-ellipsis--l2">
+                {{ info.intro }}
+            </div>
+        </div>
+    </router-link>
 </template>
 
 <script>
@@ -34,6 +61,10 @@ export default {
             type: Number,
             default: 0
         },
+        find: {
+            type: Boolean,
+            default: true
+        },
         info: {
             type: Object,
             default: () => {
@@ -133,7 +164,10 @@ export default {
 .bg-img {
     display: block;
 }
-
+.find_bg-img {
+    width: calc(43vw - 1.25px);
+    display: block;
+}
 .logo {
     position: absolute;
     top: 102px;
@@ -142,4 +176,42 @@ export default {
     border: 3px solid #fff;
     background-color: #fff;
 }
+.find_info {
+    position: relative;
+    width: calc(43vw - 1.25px);
+    height: 127px;
+    background: #242632;
+    border-radius: 8px;
+    margin-right: 12px;
+    .find_logo {
+        position: absolute;
+        top: 43px;
+        left: 10px;
+        border: 2px solid #fff;
+        background-color: #fff;
+    }
+    .find_content {
+        flex-grow: 1;
+        display: flex;
+        flex-direction: column;
+        background: #242632;
+        padding: 13px 10px 0px;
+        box-sizing: border-box;
+        font-size: 12px;
+        line-height: 17px;
+        .find_text1 {
+            color: #ffffff;
+            font-weight: bold;
+            margin-bottom: 2px;
+        }
+        .find_text2 {
+            display: block;
+            width: 140px;
+            color: #939599;
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+        }
+    }
+}
 </style>

+ 48 - 5
src/components/order/BidOrderInfo.vue

@@ -2,7 +2,7 @@
     <div class="orderInfo" @click="pay(info.orderStatus)">
         <div class="orderInfo_top">
             <div class="orderInfo_top_left">
-                {{ info.nickname }}
+                {{ info.ownerName }}
             </div>
             <div class="orderInfo_top_right">
                 {{ getLabelName(info.status, statusOfferPrice) }}
@@ -35,8 +35,10 @@
             </div>
         </div>
         <div class="orderInfo_btn" v-if="info.status == 'ASKING'">
-            <!-- <div class="orderInfo_btn_one">23:59后可取消出价</div> -->
-            <div class="orderInfo_btn_two">不想买了</div>
+            <div class="orderInfo_btn_one" v-if="endTimes >= 0">
+                <van-count-down @finish="finish" :time="endTimes" format="HH:mm:ss" />后可取消出价
+            </div>
+            <div class="orderInfo_btn_two" @click="btn()" v-else>不想买了</div>
         </div>
         <!-- 
         <div class="btns">
@@ -47,6 +49,7 @@
 <script>
 import order from '../../mixins/order';
 import product from '../../mixins/product';
+import { Dialog } from 'vant';
 export default {
     props: {
         info: {
@@ -80,9 +83,39 @@ export default {
                 this.pad(parseInt(newEndTime / 60) % 60, 2) +
                 '分';
             return newEndTime;
+        },
+        endTimes() {
+            let createdAt = this.dayjs(this.info.createdAt).add(2, 'minute');
+            return createdAt.diff(this.dayjs());
         }
     },
     methods: {
+        finish() {
+            this.$emit('fatherMethods');
+        },
+        btn() {
+            Dialog.confirm({
+                title: '确认不想买该藏品了',
+                message: '一个工作日内将原路退回您的出价金额',
+                cancelButtonText: '再想想',
+                cancelButtonColor: '#3AB200',
+                confirmButtonColor: '#626366'
+            })
+                .then(() => {
+                    this.$http
+                        .post('/domainAsk/cancel', {
+                            id: this.info.id
+                        })
+                        .then(res => {
+                            this.$toast.success('取消成功');
+                            this.$emit('fatherMethods');
+                        })
+                        .catch(e => {
+                            this.$toast(e.error);
+                        });
+                })
+                .catch(() => {});
+        },
         pad(n, width, z) {
             z = z || '0';
             n = n + '';
@@ -172,8 +205,7 @@ export default {
         line-height: 24px;
         margin-bottom: 8px;
         color: #000000;
-
-        .status {
+        .orderInfo_top_right {
             color: #3ab200;
         }
     }
@@ -247,6 +279,17 @@ export default {
         background: rgba(0, 0, 0, 0.1);
         border-radius: 16px;
         color: #939599;
+        font-size: 14px;
+        font-weight: 400;
+        line-height: 32px;
+        justify-content: center;
+        display: flex;
+        align-items: center;
+        .van-count-down {
+            font-size: 14px;
+            font-weight: 400;
+            color: #939599;
+        }
     }
 
     .orderInfo_btn_two {

+ 99 - 71
src/components/order/DomainInfo.vue

@@ -1,16 +1,27 @@
 <template>
     <div class="orderInfo" @click="pay(info.orderStatus)">
-        <div class="order-top">
-            <span>{{ info.domainName }}</span>
-            <span v-if="info.status == 'SUCCESS' && info.orderStatus == 'FINISH'" class="status">{{
-                getLabelName(info.orderStatus, statusDomain)
-            }}</span>
-            <span v-if="info.status == 'PENDING' && info.orderStatus == 'NOT_PAID'" class="status">{{
-                getLabelName(info.orderStatus, statusDomain)
-            }}</span>
-            <span v-if="info.status == 'PENDING' && info.orderStatus == 'FINISH'" class="status">{{
-                getLabelName(info.status, statusDomain)
-            }}</span>
+        <div class="orderInfo_top">
+            <div class="orderInfo_top_left">
+                {{ info.userName }}
+            </div>
+            <div class="orderInfo_top_right">
+                <span v-if="info.status == 'SUCCESS' && info.orderStatus == 'FINISH'" class="status">{{
+                    getLabelName(info.orderStatus, statusDomain)
+                }}</span>
+                <span v-if="info.status == 'PENDING' && info.orderStatus == 'NOT_PAID'" class="status">{{
+                    getLabelName(info.orderStatus, statusDomain)
+                }}</span>
+                <span v-if="info.status == 'PENDING' && info.orderStatus == 'FINISH'" class="status">{{
+                    getLabelName(info.status, statusDomain)
+                }}</span>
+            </div>
+        </div>
+        <div class="orderInfo_information">
+            <van-image :radius="6" width="80" height="80" :src="getImg(changeImgs(info.pic))" fit="cover" />
+            <div class="orderInfo_information_con">
+                <div class="orderInfo_information_con_name">{{ info.domainName }}</div>
+                <div class="orderInfo_information_con_time">剩余时长:{{ endTime }}</div>
+            </div>
         </div>
         <!-- <div class="order">
             <van-image :radius="6" width="80" height="80" :src="getImg(changeImgs(info.pic))" fit="cover" />
@@ -30,10 +41,11 @@
                 <div class="total-price_right_one">实际支付</div>
                 <div class="total-price_right_two">¥{{ info.price }}</div>
             </div>
-            <!-- <span class="time flex1"></span>
-            <span></span>
-            <span></span> -->
         </div>
+        <!-- <div class="orderInfo_btn">
+            <div class="orderInfo_btn_one">23:59后可取消出价</div>
+            <div class="orderInfo_btn_two">不想买了</div>
+        </div> -->
         <!-- 
         <div class="btns">
             <van-button color="@text3" @click.prevent="del" plain size="mini" round> 删除订单 </van-button>
@@ -66,7 +78,25 @@ export default {
     //     return { click };
     // },
     mixins: [order, product],
+    computed: {
+        endTime() {
+            let newEndTime = this.dayjs(this.info.endTime).diff(this.dayjs(), 'second');
+            newEndTime =
+                Math.floor(newEndTime / 24 / 3600) +
+                '天' +
+                this.pad(parseInt(newEndTime / 3600) % 24, 2) +
+                '时' +
+                this.pad(parseInt(newEndTime / 60) % 60, 2) +
+                '分';
+            return newEndTime;
+        }
+    },
     methods: {
+        pad(n, width, z) {
+            z = z || '0';
+            n = n + '';
+            return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
+        },
         pay(orderStatus) {
             if (orderStatus == this.orderStatus) {
                 this.$router.push({
@@ -140,88 +170,70 @@ export default {
     background: @bg;
     border-radius: 12px;
     color: @text0;
-    padding: 12px 10px 10px;
-    margin: 20px 16px 0;
+    padding: 12px 10px;
+    margin: 16px 16px 0;
     display: block;
-}
-.order-top {
-    padding: 0px 10px;
-    box-sizing: border-box;
-    display: flex;
-    justify-content: space-between;
-    height: 44px;
-    background: #f5f7fa;
-    border-radius: 8px;
-    align-items: center;
-    margin-bottom: 12px;
-    span {
-        font-size: 16px;
-        color: #000000;
-        font-weight: bold;
-        line-height: 24px;
-    }
 
-    .status {
+    .orderInfo_top {
+        display: flex;
+        justify-content: space-between;
         font-size: 14px;
         font-weight: 400;
-        color: #3ab200;
         line-height: 24px;
-    }
-}
+        margin-bottom: 8px;
+        color: #000000;
 
-.order {
-    display: flex;
-    padding: 16px 0;
-    .van-image {
-        flex-shrink: 0;
+        .status {
+            color: #3ab200;
+        }
     }
-    .content {
-        flex-grow: 1;
-        margin-left: 10px;
+
+    .orderInfo_information {
         display: flex;
-        flex-direction: column;
-        overflow: hidden;
-        .name {
-            font-size: @font2;
-            font-weight: bold;
-            line-height: 22px;
-        }
-        .text {
-            font-size: @font2;
-            color: @text3;
-            line-height: 24px;
-            margin-top: 4px;
-        }
+        margin-bottom: 16px;
 
-        .price {
-            font-size: @font2;
-            font-weight: bold;
+        .orderInfo_information_con {
+            margin-left: 10px;
+            font-size: 14px;
             line-height: 24px;
+
+            .orderInfo_information_con_name {
+                color: #000000;
+                font-weight: bold;
+                margin-bottom: 4px;
+            }
+
+            .orderInfo_information_con_time {
+                font-weight: 400;
+                color: #939599;
+            }
         }
     }
 }
+
 .total-price {
     height: 24px;
     display: flex;
     justify-content: space-between;
-    align-items: center;
-    padding: 0px 10px;
-    box-sizing: border-box;
+    margin-bottom: 16px;
     .total-price_left {
         font-size: 12px;
         font-weight: 400;
         color: #c8c9cc;
         line-height: 24px;
     }
+
     .total-price_right {
         display: flex;
+
         .total-price_right_one {
-            font-size: 12px;
+            font-size: 14px;
             font-weight: bold;
             color: #000000;
             line-height: 24px;
             margin-right: 10px;
         }
+
         .total-price_right_two {
             font-size: 16px;
             font-weight: bold;
@@ -230,13 +242,29 @@ export default {
         }
     }
 }
-.btns {
-    border-top: 1px solid #202122;
-    padding: 16px 0;
+
+.orderInfo_btn {
     display: flex;
-    flex-direction: row-reverse;
-    .van-button {
-        padding: 3px 17px;
+    justify-content: flex-end;
+    font-size: 14px;
+    font-weight: 400;
+    text-align: center;
+    line-height: 32px;
+
+    .orderInfo_btn_one {
+        width: 162px;
+        height: 32px;
+        background: rgba(0, 0, 0, 0.1);
+        border-radius: 16px;
+        color: #939599;
+    }
+
+    .orderInfo_btn_two {
+        width: 100px;
+        height: 32px;
+        background: #000000;
+        border-radius: 16px;
+        color: #ffffff;
     }
 }
 </style>

+ 9 - 5
src/components/rice/Share.vue

@@ -23,7 +23,7 @@
 
     <van-overlay :show="showHelp" @click="showHelp = false" z-index="100">
         <div class="share" @click.stop>
-            <div class="share-text1" v-if="shareSucc === 1">谢谢你帮我助力得量</div>
+            <div class="share-text1" v-if="shareSucc === 1">谢谢你帮我助力得量</div>
             <div class="share-text2" v-else>{{ shareTips }}</div>
 
             <div class="share-user">
@@ -55,7 +55,7 @@ defineExpose({ init });
 
 const shareText = computed(() => {
     if (store.state.userInfo) {
-        return `『绿洲水稻——我在袁隆平的水稻田种植水稻,你也快来吧.』${resolveUrl(
+        return `『绿洲农耕2.0:袁梦计划——快来RAEX绿洲和我一起种植水稻吧.』${resolveUrl(
             http.baseUrl,
             '9th/rice?shareRiceId=' + store.state.userInfo.id + '&riceShare=true'
         )}`;
@@ -74,9 +74,13 @@ function share() {
 
 const inWeixin = /micromessenger/i.test(navigator.userAgent);
 function openWeixin() {
-    if (!inWeixin) {
-        window.location.href = 'weixin://';
-    }
+    gobal.$toast.success('复制成功');
+    setTimeout(() => {
+        if (!inWeixin) {
+            window.location.href = 'weixin://';
+        }
+        show.value = false;
+    }, 1000);
 }
 
 const showHelp = ref(false);

+ 26 - 9
src/components/rice/Task.vue

@@ -12,7 +12,7 @@
                         <img src="@assets/icon_qiandao.png" alt="" />
                         <div class="box-info">
                             <div class="text1">签到奖励({{ taskInfo.isSignedIn ? 1 : 0 }}/1)</div>
-                            <div class="text2">每天签到可免费领取1点量</div>
+                            <div class="text2">每天签到可免费领取1点量</div>
                         </div>
                         <van-button type="primary" :class="{ not: taskInfo.isSignedIn }" round @click="sign">{{
                             taskInfo.isSignedIn ? '已完成' : '签到'
@@ -21,27 +21,37 @@
                     <div class="box-item">
                         <img src="@assets/icon_yaoqing.png" alt="" />
                         <div class="box-info">
-                            <div class="text1">邀请互动({{ taskInfo.isInvited ? 1 : 0 }}/1)</div>
+                            <div class="text1">好友助力({{ taskInfo.isInvited ? 1 : 0 }}/1)</div>
 
-                            <div class="text2">邀请好友完成互动后领1点电量</div>
+                            <div class="text2">邀请好友助力可获得1点能量,每天可邀请助力上限1点能量</div>
                         </div>
                         <van-button class="not" v-if="taskInfo.isInvited" type="primary" round>已完成</van-button>
                         <van-button v-else type="primary" round @click="share">邀请</van-button>
                     </div>
+                    <div class="box-item">
+                        <img src="@assets/icon_zhuli.png" alt="" />
+                        <div class="box-info">
+                            <div class="text1">乐善好施({{ helpCount > 2 ? 2 : helpCount }}/2)</div>
+
+                            <div class="text2">帮助2名好友助力可获得1点能量,每天上限可获得1点能量</div>
+                        </div>
+                        <van-button class="not" v-if="helpCount >= 2" type="primary" round>已完成</van-button>
+                        <van-button v-else type="primary" round @click="show = false">去助力</van-button>
+                    </div>
                     <div class="box-item">
                         <img src="@assets/icon_jifen.png" alt="" />
                         <div class="box-info">
                             <div class="text1">积分兑换({{ taskInfo.exchangeCount }}/10)</div>
 
                             <div class="text2">
-                                每天寄售商品购买成功次数 ≤4 次获得1积分,4次以上获得2积分(2积分可兑换1点电量)
+                                寄售市场每日购买次数≤4次,每笔可获得10积分,购买第6、7、8次可获得20积分,10积分可兑换1点能量
+                                <!-- 每天寄售商品购买成功次数 ≤4 次获得1积分,4次以上获得2积分(2积分可兑换1点能量) -->
                             </div>
                         </div>
-
-                        <van-button type="primary" class="not" round v-if="taskInfo.exchangeCount" @click="exchange"
+                        <van-button type="primary" round v-if="taskInfo.isCanExchangeScore" @click="exchange"
                             >兑换</van-button
                         >
-                        <van-button type="primary" round v-else-if="taskInfo.isCanExchangeScore" @click="exchange"
+                        <van-button type="primary" class="not" round v-else-if="selfScore && selfScore >= 10"
                             >兑换</van-button
                         >
                         <van-button type="primary" round v-else @click="$router.push('/hopeMarket')">去看看</van-button>
@@ -51,7 +61,7 @@
                         <div class="box-info">
                             <div class="text1">活动积分兑换</div>
 
-                            <div class="text2">参与活动可兑换1点量,无上限</div>
+                            <div class="text2">参与活动可兑换1点量,无上限</div>
                         </div>
                         <van-button
                             type="primary"
@@ -67,7 +77,7 @@
                         <div class="box-info">
                             <div class="text1">数字产品质押</div>
 
-                            <div class="text2">特定产品质押兑换成量,兑换当天不可寄售</div>
+                            <div class="text2">特定产品质押兑换成量,兑换当天不可寄售</div>
                         </div>
                         <van-button type="primary" round>去看看</van-button>
                     </div> -->
@@ -102,10 +112,17 @@ function sign() {
 }
 
 const taskInfo = ref({});
+const helpCount = ref(0);
+const selfScore = ref(0);
 function getTask() {
     http.http.get('/rice/taskInitialization').then(res => {
         taskInfo.value = res.map;
     });
+    http.http.get('/rice/current').then(res => {
+        // this.info = res.data;
+        helpCount.value = Number(res.data.helpCount);
+        selfScore.value = Number(res.data.selfScore);
+    });
 }
 function init() {
     show.value = true;

+ 3 - 2
src/mixins/list.js

@@ -6,7 +6,8 @@ export default {
             finished: false,
             page: 0,
             totalElements: 0,
-            size: 20
+            size: 20,
+            isFormData: false
         };
     },
     methods: {
@@ -43,7 +44,7 @@ export default {
                     this.totalElements = Number(res.totalElements);
                 });
             } else {
-                return this.$http.post(this.url, data, { body: 'json' }).then(res => {
+                return this.$http.post(this.url, data, this.isFormData ? {} : { body: 'json' }).then(res => {
                     if (res.first) {
                         this.list = [];
                     }

+ 14 - 0
src/mixins/order.js

@@ -37,6 +37,20 @@ export default {
                     value: 'CANCELLED'
                 }
             ],
+            statusOfferPrice: [
+                {
+                    label: '已出价',
+                    value: 'ASKING'
+                },
+                {
+                    label: '已退款',
+                    value: 'REFUNDED'
+                },
+                {
+                    label: '已完成',
+                    value: 'FINISH'
+                }
+            ],
             payMethodOptions: [
                 {
                     label: '首信易快捷支付',

+ 77 - 0
src/mixins/superLink.js

@@ -0,0 +1,77 @@
+import { ImagePreview } from 'vant';
+export default {
+    data() {
+        return {
+            typeOptions: [
+                {
+                    label: 'RID云域名',
+                    name: '绑定RID元域名作为用户名',
+                    sub: '将元域名作为您的昵称',
+                    value: 'RID_CLOUD_DOMAIN_NAME'
+                },
+                {
+                    label: '个人主页',
+                    name: '绑定个人主页',
+                    sub: '增加主页曝光度,获得更多粉丝',
+                    value: 'HOMEPAGE'
+                },
+                {
+                    label: '藏品',
+                    name: '绑定指定藏品',
+                    sub: '一键触达指定数字藏品',
+                    value: 'COLLECTION'
+                },
+                {
+                    label: 'web2.0外部链接',
+                    name: '绑定指定web2.0浏览页面',
+                    sub: '您可以绑定您的电商网页或知乎链接等',
+                    value: 'EXTERNALLINK'
+                },
+                {
+                    label: '个人名片',
+                    name: '绑定个人名片',
+                    sub: '您可以绑定微信/微博二维码',
+                    value: 'PERSONAL_BUSINESS_CARD'
+                },
+                {
+                    label: '抖音视频',
+                    name: '绑定抖音视频',
+                    sub: '绑定抖音视频,让更多人看到你的精彩!',
+                    value: 'VIBRATO_VIDEO'
+                },
+                {
+                    label: '绿洲元宇宙',
+                    name: '关联OASISMETA绿洲元宇宙',
+                    sub: '关联个人土地空间',
+                    value: 'OASISMETA'
+                }
+            ]
+        };
+    },
+    methods: {
+        goReview(info) {
+            console.log(info);
+            switch (info.hyperLinkType) {
+                case 'HOMEPAGE':
+                case 'COLLECTION':
+                    console.log(info.address);
+                    this.$router.push(info.address);
+                    break;
+                case 'PERSONAL_BUSINESS_CARD':
+                    ImagePreview({ images: [info.address], startPosition: 0 });
+                    break;
+                case 'EXTERNALLINK':
+                case 'VIBRATO_VIDEO':
+                case 'OASISMETA':
+                    window.open(info.address);
+                    break;
+            }
+        },
+        getTypeLabel(info) {
+            let type = [...this.typeOptions].find(item => {
+                return item.value === info.hyperLinkType;
+            });
+            return type ? type.label : '';
+        }
+    }
+};

+ 63 - 3
src/router/index.js

@@ -637,6 +637,12 @@ const routes = [
             menuPage: true
         }
     },
+    {
+        path: '/offerPriceSubmit',
+        name: 'offerPriceSubmit',
+        component: () => import('../views/OfferPriceSubmit.vue'),
+        meta: {}
+    },
     {
         path: '/givesubmit',
         name: 'givesubmit',
@@ -833,9 +839,34 @@ const routes = [
         }
     },
     {
-        path: '/superLink',
-        name: 'superLink',
-        component: () => import('../views/domain/SuperLink.vue'),
+        path: '/mineSuperLink',
+        name: 'mineSuperLink',
+        component: () => import('../views/user/SuperLink.vue'),
+        meta: {
+            title: '我的超链',
+            tabColor: '#0F0F0F'
+        }
+    },
+    {
+        path: '/domainProductChoose',
+        name: 'domainProductChoose',
+        component: () => import('../views/domain/ProductChoose.vue'),
+        meta: {
+            menuPage: true
+        }
+    },
+    {
+        path: '/bindingWeb',
+        name: 'bindingWeb',
+        component: () => import('../views/domain/BindingWeb.vue'),
+        meta: {
+            menuPage: true
+        }
+    },
+    {
+        path: '/bindingImage',
+        name: 'bindingImage',
+        component: () => import('../views/domain/BindingImage.vue'),
         meta: {
             menuPage: true
         }
@@ -938,6 +969,35 @@ const routes = [
         meta: {
             menuPage: true
         }
+    },
+    {
+        path: '/searchAll',
+        name: 'searchAll',
+        component: () => import('../views/search/SearchAll.vue'),
+        meta: {
+            menuPage: true,
+            pageType: Page.Every
+        }
+    },
+    {
+        path: '/searchResult',
+        name: 'searchResult',
+        component: () => import('../views/search/SearchResult.vue'),
+        meta: {
+            title: '绿洲宇宙全域搜索',
+            tabColor: '#000000',
+            pageType: Page.Every
+        }
+    },
+    {
+        path: '/searchDetail',
+        name: 'searchDetail',
+        component: () => import('../views/search/SearchDetail.vue'),
+        meta: {
+            title: '绿洲宇宙全域搜索',
+            pageType: Page.Every,
+            tabColor: '#000000'
+        }
     }
 ];
 

+ 12 - 5
src/styles/app.less

@@ -178,11 +178,6 @@ input:-webkit-autofill {
     border-top: 1px solid #202122;
     background-color: transparent;
 }
-.statisticTab {
-    .van-tabs__nav--line.van-tabs__nav--complete {
-        border-top-width: 0;
-    }
-}
 
 .van-tabs__line {
     bottom: 20px;
@@ -306,6 +301,18 @@ input:-webkit-autofill {
     }
 }
 
+.statisticTab {
+    .van-tab.van-tab--active {
+        color: #00fe1e !important;
+    }
+    .van-tabs__line {
+        background-color: #00fe1e !important;
+    }
+    .van-tabs__nav--line.van-tabs__nav--complete {
+        border-top-width: 0;
+    }
+}
+
 .van-action-sheet {
     .van-action-sheet__header {
         border-bottom: 1px solid #f2f4f5;

+ 241 - 1
src/views/Discover.vue

@@ -8,9 +8,17 @@
     >
         <van-sticky ref="top">
             <div class="padding-safe-top">
+                <!-- <div class="top">
+                    <div class="search" @click="$router.push('/productSearch')">
+                        <img src="@assets/icon_sosuofaxian@3x.png" alt="" />
+                        <span>搜索你要的精彩</span>
+                    </div>
+                    <img src="@assets/icon_liutong@3x.png" class="logo" alt="" />
+                </div> -->
                 <div class="top">
                     <img src="@assets/nav_logo.png" class="logo" alt="" />
 
+                    <!-- <div class="search" @click="$router.push('/searchAll')"> -->
                     <div class="search" @click="$router.push('/productSearch')">
                         <img src="@assets/icon-sosuo.png" alt="" />
                         <span> 搜索你要的精彩 </span>
@@ -18,6 +26,50 @@
                 </div>
             </div>
         </van-sticky>
+        <!-- <div class="brand_products">
+            <div class="brand_tip">品牌商户</div>
+            <van-list
+                class="brand_products_list"
+                v-model:loading="loadings"
+                :finished="finisheds"
+                finished-text=""
+                @load="getProducts"
+            >
+                <template v-for="(item, index) in productsList" :key="item.id">
+                    <creator-small v-model:info="productsList[index]" :find="false"></creator-small>
+                </template>
+                <van-empty
+                    v-if="emptys"
+                    :description="`还没有个人藏品哦`"
+                    :image="require(`@assets/empty_img_asset_dark.png`)"
+                />
+            </van-list>
+        </div>
+        <div class="oasis_art">
+            <div class="oasis_art_tip">绿洲艺术</div>
+            <div class="oasis_art_list">
+                <div class="oasis_art_list_left" @click="$router.push('/hopeMarket')">
+                    <img
+                        :src="require(`@assets/info_icon_banquanshichangone@3x.png`)"
+                        alt=""
+                        class="oasis_art_list_left_img"
+                    />
+                    <div class="oasis_art_list_left_text1">寄售市场</div>
+                    <div class="oasis_art_list_left_text2">买卖你的元宇宙资产</div>
+                </div>
+                <div class="oasis_art_list_right">
+                    <div
+                        v-for="(item, index) in artList"
+                        :key="index"
+                        class="oasis_art_list_right_con"
+                        @click="artSelection(item.name)"
+                    >
+                        <img :src="item.img" alt="" class="oasis_art_list_right_con_img" />
+                        <div class="oasis_art_list_right_con_name">{{ item.name }}</div>
+                    </div>
+                </div>
+            </div>
+        </div> -->
         <!-- <swiper :slides-per-view="3" :space-between="16" class="mySwiper" :autoplay="{ delay: 3500 }"> 
             <swiper-slide v-for="(item, index) in banners" :key="item.id"> 
                 <van-image
@@ -260,10 +312,33 @@ export default {
             hots: [],
             miners: [],
             list: [],
+            productsList: [],
+            artList: [
+                {
+                    img: require(`@assets/info_icon_banquanshichangtwo@3x.png`),
+                    name: '铸造活动'
+                },
+                {
+                    img: require(`@assets/info_icon_paimaixilieone@3x.png`),
+                    name: '绿洲易拍'
+                },
+                {
+                    img: require(`@assets/info_icon_yanshengpingtwo@3x.png`),
+                    name: '元宇宙域名'
+                },
+                {
+                    img: require(`@assets/info_icon_yanshengpingone@3x.png`),
+                    name: '星图NFT'
+                }
+            ],
             loading: false,
+            loadings: false,
             finished: false,
+            finisheds: false,
             page: 0,
+            pages: 0,
             empty: false,
+            emptys: false,
             scrollTop: 0,
             sort: 'collection',
             icons: [
@@ -359,6 +434,17 @@ export default {
         });
     },
     methods: {
+        artSelection(name) {
+            if (name == '铸造活动') {
+                this.$router.push('/activityList');
+            } else if (name == '绿洲易拍') {
+                this.$router.push('/auction');
+            } else if (name == '元宇宙域名') {
+                this.$router.push('/domainname');
+            } else {
+                this.$router.push('/starMap');
+            }
+        },
         buyingSelling() {
             this.domainClassify = 1;
             this.getList(true);
@@ -367,6 +453,37 @@ export default {
             this.domainClassify = 2;
             this.getList(true);
         },
+        getProducts() {
+            this.loadings = true;
+            this.finisheds = false;
+            this.emptys = false;
+            let url = '/user/all';
+            let query = {
+                type: 'MINTER',
+                del: false
+            };
+            let sort = 'createdAt,desc';
+            return this.$http
+                .post(
+                    url,
+                    {
+                        page: this.pages,
+                        size: 20,
+                        query: query,
+                        sort: sort
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    this.productsList = [...this.productsList, ...res.content];
+                    this.emptys = res.empty;
+                    this.loadings = false;
+                    this.finisheds = res.last;
+                    if (!res.last) {
+                        this.pages = this.pages + 1;
+                    }
+                });
+        },
         getInit() {
             this.$toast.loading({
                 message: '加载中...',
@@ -606,8 +723,14 @@ export default {
     background-color: #272b2e;
     display: flex;
     align-items: center;
+    // display: flex;
+    // padding: 13px 16px 0px;
+    // background: #0f1014;
+    // justify-content: space-between;
+    // align-items: center;
 
     .logo {
+        // width: 24px;
         width: auto;
         height: 24px;
         display: block;
@@ -621,20 +744,137 @@ export default {
         margin-left: 10px;
         padding: 4px 20px;
         border-radius: 21px;
+        // width: calc(82vw - 0.5px);
+        // height: 37px;
+        // background: #242632;
+        // padding-left: 12px;
+        // opacity: 0.5;
+        // display: flex;
+        // align-items: center;
+        // border-radius: 21px;
+        // box-sizing: border-box;
 
         img {
             width: 16px;
             height: 16px;
             margin-right: 10px;
+            // margin-right: 4px;
         }
 
         font-size: 14px;
+        // color: #ffffff;
         color: @text3;
         line-height: 24px;
     }
 }
-
+.brand_products {
+    padding-left: 16px;
+    margin-top: 16px;
+    margin-bottom: 20px;
+    .brand_tip {
+        font-size: 16px;
+        font-family: AlimamaShuHeiTi;
+        color: #ffffff;
+        line-height: 24px;
+        margin-bottom: 16px;
+    }
+    .brand_products_list {
+        width: 100%;
+        height: 127px;
+        display: flex;
+        overflow-x: auto;
+    }
+}
+.oasis_art {
+    width: 100%;
+    padding: 0px 16px 0px;
+    box-sizing: border-box;
+    .oasis_art_tip {
+        font-size: 16px;
+        font-family: AlimamaShuHeiTi;
+        color: #ffffff;
+        line-height: 24px;
+        margin-bottom: 16px;
+    }
+    .oasis_art_list {
+        display: flex;
+        justify-content: space-between;
+        .oasis_art_list_left {
+            width: calc(29vw + 0.25px);
+            height: 152px;
+            padding-top: 38px;
+            padding-left: 14px;
+            background: linear-gradient(136deg, #1c1e1d 0%, rgba(35, 35, 35, 0) 100%);
+            box-shadow: inset 0px 1px 1px 0px #00fe1e;
+            border-radius: 8px;
+            backdrop-filter: blur(3px);
+            box-sizing: border-box;
+            .oasis_art_list_left_img {
+                width: 32px;
+                height: 32px;
+                margin-bottom: 4px;
+            }
+            .oasis_art_list_left_text1 {
+                font-size: 14px;
+                font-weight: bold;
+                color: #ffffff;
+                line-height: 14px;
+                text-shadow: 0px 0px 2px #1f001f;
+                margin-bottom: 4px;
+            }
+            .oasis_art_list_left_text2 {
+                font-size: 9px;
+                font-weight: bold;
+                color: #ffffff;
+                line-height: 12px;
+                text-shadow: 0px 0px 2px #1f001f;
+                opacity: 0.5;
+            }
+        }
+        .oasis_art_list_right {
+            width: calc(60vw - 1px);
+            display: flex;
+            justify-content: space-between;
+            flex-wrap: wrap;
+            .oasis_art_list_right_con {
+                display: flex;
+                flex-direction: column;
+                align-items: center;
+                width: calc(28vw + 1px);
+                height: 70px;
+                padding-top: 8px;
+                border-radius: 8px;
+                border: 1px solid #63fe75;
+                box-sizing: border-box;
+                // border-image: linear-gradient(
+                //         180deg,
+                //         rgba(0, 254, 30, 1),
+                //         rgba(99, 254, 117, 0.61),
+                //         rgba(255, 255, 255, 0)
+                //     )
+                //     1 1;
+                // clip-path: inset(0 round 8px);
+                .oasis_art_list_right_con_img {
+                    width: 32px;
+                    height: 32px;
+                    margin-bottom: 4px;
+                }
+                .oasis_art_list_right_con_name {
+                    font-size: 14px;
+                    font-weight: bold;
+                    color: #ffffff;
+                    line-height: 14px;
+                    text-shadow: 0px 0px 2px #006224;
+                }
+            }
+            .oasis_art_list_right_con:first-of-type {
+                margin-bottom: 12px;
+            }
+        }
+    }
+}
 .discover {
+    // background: #0f1014;
     background-color: #272b2e;
 }
 

+ 290 - 10
src/views/DomainName.vue

@@ -26,7 +26,10 @@
                             />
                             <div>市场</div>
                         </div>
-                        <div class="meta_domain_name_top_one_con_tip" @click="$router.push('/ranking')">
+                        <div
+                            class="meta_domain_name_top_one_con_tip meta_domain_name_top_one_con_tips"
+                            @click="$router.push('/ranking')"
+                        >
                             <img
                                 :src="require('@assets/icon_paihang@3x.png')"
                                 alt=""
@@ -34,6 +37,14 @@
                             />
                             <div>排行</div>
                         </div>
+                        <!-- <div class="meta_domain_name_top_one_con_tip" @click="$router.push('/statistics')">
+                            <img
+                                :src="require('@assets/icon_liutong.png')"
+                                alt=""
+                                class="meta_domain_name_top_img_right"
+                            />
+                            <div>流通</div>
+                        </div> -->
                     </div>
                 </div>
                 <div class="meta_domain_name_top_ones" v-if="action != 1">
@@ -309,8 +320,31 @@
                         </div>
                     </div>
                 </div>
-                <div class="meta_domain_name_list_con_right" @click="buy(index)">
-                    <div class="meta_domain_name_list_con_right_one">{{ item.sold ? '超链' : '购买' }}</div>
+                <div class="meta_domain_name_list_con_right">
+                    <!-- <div
+                        class="meta_domain_name_list_con_right_one"
+                        v-if="item.sold && item.canAsk && !item.collectionId"
+                        @click="offerShow(index)"
+                    >
+                        出价
+                    </div>
+                    <div
+                        class="meta_domain_name_list_con_right_one"
+                        v-if="item.sold && !item.canAsk && item.collectionId"
+                        @click="consignment(index)"
+                    >
+                        寄售中
+                    </div>
+                    <div
+                        class="meta_domain_name_list_con_right_one"
+                        v-if="item.sold && item.canAsk && item.collectionId"
+                        @click="consignment(index)"
+                    >
+                        仅展示
+                    </div> -->
+                    <div class="meta_domain_name_list_con_right_one" @click="buy(index)">
+                        {{ item.sold ? '超链' : '购买' }}
+                    </div>
                     <div
                         :class="
                             item.sold ? 'meta_domain_name_list_con_right_three' : 'meta_domain_name_list_con_right_two'
@@ -325,6 +359,43 @@
                 <div class="learn_more_btn_title">了解更多</div>
             </div>
         </div>
+        <van-popup v-model:show="show">
+            <div class="accept_offer_title">请输入价格</div>
+            <div class="accept_offer_title_tip">
+                <div class="accept_offer_title_tip_con">
+                    <img :src="require('@assets/png-xiao-zi@3x.png')" alt="" class="accept_offer_title_tip_con_img" />
+                    <div class="accept_offer_title_tip_con_text">{{ domainName }}</div>
+                </div>
+            </div>
+            <div class="accept_offer_take">
+                <div class="accept_offer_take_left">
+                    <div class="accept_offer_take_left_one">最高出价</div>
+                    <!-- <div class="accept_offer_take_left_two">出价记录</div> -->
+                </div>
+                <div class="accept_offer_take_right">¥{{ highestBid }}</div>
+            </div>
+            <van-stepper
+                v-model="price"
+                :default-value="''"
+                :show-plus="false"
+                :show-minus="false"
+                :decimal-length="2"
+                allow-empty
+                :min="minPrice"
+                max="100000"
+                placeholder="请输入"
+                @change="agreement = false"
+            />
+            <div class="accept_offer_tip">
+                指向持有者进行公开报出价格,进行叫价竞买行为。一旦确认叫价,<span>需支付全款以确保其叫价有效</span>。如果持有者“同意”其叫价,RAEX绿洲将自动扣除其保证金进行购买。如持有者七日内未进行回复,则默认为“拒绝”叫价。<span
+                    >期间叫价者可于叫价24小时后取消叫价。</span
+                >
+            </div>
+            <div class="accept_offer_btn">
+                <div class="accept_offer_btn_left" @click="show = false">取消</div>
+                <div class="accept_offer_btn_right" @click="domainSubmit">出价</div>
+            </div>
+        </van-popup>
         <!-- <img :src="require('@assets/png-huise-bg@3x.png')" alt="" class="meta_domain_name_bg" /> -->
     </div>
     <!-- <div>
@@ -374,14 +445,23 @@
 
 <script>
 import { mapState } from 'vuex';
+import superLink from '@/mixins/superLink';
 export default {
+    name: 'domainName',
+    inject: ['bar', 'setKeeps', 'scrollWrapper', 'changeScroll', 'bodyScroll'],
     data() {
         return {
             action: 1,
+            show: false,
+            domainName: '',
+            price: '',
+            minPrice: 0,
+            highestBid: 0,
             heightNumber: '500px',
             paddingTop: 0,
             heightBgNumber: '260px',
             moreHeight: 0,
+            collectionId: 0,
             domain: true,
             value: '',
             domainList: [],
@@ -389,9 +469,11 @@ export default {
             list: [],
             unregistered: require('@assets/png-da-lv@3x.png'),
             registered: require('@assets/png-da-zi@3x.png'),
-            timeId: 0
+            timeId: 0,
+            scrollTop: 0
         };
     },
+    mixins: [superLink],
     computed: {
         ...mapState(['userInfo'])
         // endTime() {
@@ -506,6 +588,32 @@ export default {
                 }
             }
         },
+        offerShow(index) {
+            this.domainName = this.list[index].domain;
+            this.collectionId = this.list[index].id;
+            this.$http
+                .post('/domainAsk/maxPrice', {
+                    domainOrderId: this.collectionId
+                })
+                .then(res => {
+                    this.highestBid = res;
+                })
+                .catch(e => {});
+            this.show = true;
+        },
+        domainSubmit() {
+            if (this.price == '') {
+                this.$toast('请输入价格');
+                return;
+            }
+            this.$router.push({
+                path: '/offerPriceSubmit',
+                query: {
+                    domainPrice: this.price,
+                    id: this.collectionId
+                }
+            });
+        },
         buy(index) {
             if (!this.list[index].sold) {
                 this.$router.push({
@@ -514,10 +622,20 @@ export default {
                         domain: this.list[index].domain
                     }
                 });
-            } else {
+            } else if (!this.list[index].isOpenHyperLink) {
                 this.$toast('持有人超链暂未开启');
+            } else {
+                this.goReview({
+                    hyperLinkType: this.list[index].HyperLinkType,
+                    address: this.list[index].Address
+                });
             }
         },
+        consignment(index) {
+            this.$router.push({
+                path: '/productDetail/' + this.list[index].collectionId
+            });
+        },
         fallback() {
             if (this.action == '3') {
                 this.action = 1;
@@ -532,6 +650,21 @@ export default {
                 this.moreHeight = 0;
             }
         }
+    },
+    activated() {
+        this.$nextTick(() => {
+            this.changeScroll(this.scrollTop || 0);
+        });
+    },
+    beforeRouteLeave(to, from, next) {
+        if (to.name === 'productDetail' || to.name === 'creatorDetail') {
+            this.scrollTop = this.scrollWrapper.scrollTop;
+            this.setKeeps(['domainName']);
+        } else {
+            this.scrollTop = 0;
+            this.setKeeps(['domainName'], false);
+        }
+        next();
     }
 };
 </script>
@@ -716,10 +849,9 @@ export default {
         // background-size: 100% 100%;
         // background-repeat: no-repeat;
         // background: #030001;
-        position: relative;
         transition: 0.5s;
         z-index: 2;
-
+        position: relative;
         .meta_domain_name_top_bgimg {
             position: absolute;
             top: 0;
@@ -744,8 +876,9 @@ export default {
             justify-content: space-between;
             box-sizing: border-box;
             // margin-bottom: 51px;
-            position: relative;
-            z-index: 3;
+            position: absolute;
+            z-index: 4;
+            right: 0;
 
             .meta_domain_name_top_img_left {
                 width: 24px;
@@ -794,7 +927,8 @@ export default {
             justify-content: center;
             margin-bottom: 54px;
             z-index: 3;
-            margin-top: -11px;
+            // margin-top: -11px;
+            padding-top: 120px;
 
             .meta_domain_name_top_two_img {
                 width: 220px;
@@ -1215,4 +1349,150 @@ export default {
 /deep/ .learn_more_bg {
     background: linear-gradient(90deg, #1b0222 0%, #23042e 100%, #23042e 100%) !important;
 }
+
+/deep/ .van-popup {
+    width: calc(80vw);
+    background: #161414;
+    border-radius: 8px;
+    border: 1px solid #302b30;
+    backdrop-filter: blur(11px);
+    padding: 24px 20px 30px;
+    box-sizing: border-box;
+
+    .accept_offer_title {
+        text-align: center;
+        font-size: 16px;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 24px;
+        margin-bottom: 24px;
+    }
+
+    .van-stepper {
+        width: 100%;
+
+        .van-stepper__input {
+            width: 100%;
+            height: 46px;
+            background: #211f1f;
+            border-radius: 8px;
+            border: 1px solid #353434;
+            margin: 0;
+            font-size: 24px;
+            font-weight: bold;
+            color: #ffffff;
+        }
+
+        input::placeholder {
+            font-size: 16px;
+            font-weight: 400;
+            color: #646363;
+        }
+    }
+
+    .accept_offer_title_tip {
+        display: flex;
+        justify-content: center;
+        margin-bottom: 20px;
+
+        .accept_offer_title_tip_con {
+            display: flex;
+            align-items: center;
+
+            .accept_offer_title_tip_con_img {
+                width: 10px;
+                height: 18px;
+                margin-right: 6px;
+            }
+
+            .accept_offer_title_tip_con_text {
+                width: 100%;
+                font-size: 20px;
+                font-weight: bold;
+                color: #ffffff;
+                line-height: 24px;
+                overflow: hidden;
+                white-space: nowrap;
+                text-overflow: ellipsis;
+            }
+        }
+    }
+
+    .accept_offer_take {
+        display: flex;
+        justify-content: space-between;
+        margin-bottom: 20px;
+
+        .accept_offer_take_left {
+            display: flex;
+            align-items: center;
+
+            .accept_offer_take_left_one {
+                font-size: 14px;
+                font-weight: 400;
+                color: #ffffff;
+                line-height: 24px;
+                margin-right: 9px;
+            }
+
+            .accept_offer_take_left_two {
+                width: 48px;
+                height: 17px;
+                background: #1d1b1b;
+                border-radius: 2px;
+                font-size: 10px;
+                font-weight: 400;
+                color: #939599;
+                line-height: 17px;
+                text-align: center;
+                margin-top: 2px;
+            }
+        }
+
+        .accept_offer_take_right {
+            font-size: 16px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 24px;
+        }
+    }
+
+    .accept_offer_tip {
+        font-size: 10px;
+        font-weight: 400;
+        color: #ffffff;
+        line-height: 16px;
+        margin-bottom: 30px;
+        margin-top: 16px;
+
+        span {
+            color: #00fe1e;
+        }
+    }
+
+    .accept_offer_btn {
+        display: flex;
+        justify-content: space-between;
+        font-size: 16px;
+        font-weight: bold;
+        line-height: 38px;
+        text-align: center;
+
+        .accept_offer_btn_left {
+            width: calc(32vw);
+            height: 38px;
+            background: #2d2b2b;
+            border-radius: 8px;
+            color: #ffffff;
+        }
+
+        .accept_offer_btn_right {
+            width: calc(32vw);
+            height: 38px;
+            background: #00fe1e;
+            border-radius: 8px;
+            color: #000000;
+        }
+    }
+}
 </style>

+ 14 - 0
src/views/Home.vue

@@ -22,6 +22,15 @@
                 :src="isLogin ? userInfo.avatar : require('@assets/img_default_photo.png')"
             >
             </van-image>
+
+            <!-- <img
+                src="@/assets/icon_sosuo_dark.png"
+                @click="$router.push('/searchAll')"
+                v-if="darkTheme"
+                alt=""
+                class="search-all"
+            />
+            <img src="@/assets/icon_sosuo.png" @click="$router.push('/searchAll')" v-else alt="" class="search-all" /> -->
         </div>
 
         <div class="card swiper-card">
@@ -883,6 +892,11 @@ export default {
             }
         }
     }
+
+    .search-all {
+        width: 54px;
+        height: 54px;
+    }
 }
 
 .listSwiper {

+ 10 - 0
src/views/Mine.vue

@@ -192,6 +192,16 @@
                 <div class="menus_list_division">
                     <div class="menus_list_division_con"></div>
                 </div> -->
+                <!-- <div class="menus_list_con" @click="$router.push('/mineSuperLink')">
+                    <div class="menus_list_con_left">
+                        <img src="@assets/icon-chaolian.png" alt="" class="menus_list_con_left_img" />
+                        <span>我的超链</span>
+                    </div>
+                    <img src="@assets/icon_inter@3x.png" alt="" class="menus_list_con_right_img" />
+                </div> -->
+                <div class="menus_list_division">
+                    <div class="menus_list_division_con"></div>
+                </div>
                 <div class="menus_list_con" @click="share" v-if="!$store.state.review">
                     <div class="menus_list_con_left">
                         <img src="@assets/icon-yaoqing@3x.png" alt="" class="menus_list_con_left_img" />

+ 476 - 0
src/views/OfferPriceSubmit.vue

@@ -0,0 +1,476 @@
+<template>
+    <div class="page">
+        <div class="page_top">
+            <div class="page_top_tip">出价订单</div>
+            <div class="page_top_con" :key="index">
+                <div class="pageTitle">{{ info.owner }}</div>
+                <div class="collection_information">
+                    <van-image width="80" height="80" :radius="6" :src="getImg(changeImgs(info.pic))" fit="cover" />
+                    <div class="collection_information_right">
+                        <div class="collection_information_right_name">{{ info.domainName || info.name }}</div>
+                        <div class="collection_information_right_no">剩余时长:{{ info.endTime }}</div>
+                        <div class="collection_information_right_price_one">¥{{ bidamount }}</div>
+                    </div>
+                </div>
+                <div class="collection_price">
+                    <div class="collection_price_left">出价金额</div>
+                    <div class="collection_price_right">¥{{ bidamount }}</div>
+                </div>
+                <div class="collection_price">
+                    <div class="collection_price_left">GAS费用</div>
+                    <div class="collection_price_right">¥{{ gas }}</div>
+                </div>
+            </div>
+        </div>
+        <pay-method-pick v-model="payType" cart></pay-method-pick>
+        <div class="page_btn van-safe-area-bottom">
+            <div class="page_btn_left">
+                <div class="page_btn_left_amount">总计</div>
+                <img :src="require('@assets/icon_jiagecat@3x.png')" alt="" class="page_btn_left_img" />
+                <div class="page_btn_left_price">{{ price }}</div>
+            </div>
+            <div class="page_btn_right" @click="submit">立即支付</div>
+        </div>
+        <van-number-keyboard v-model="tradeCode" :show="showKeyboard" @blur="showKeyboard = false" />
+        <van-dialog
+            v-model:show="showPwdDialog"
+            title="请输入支付密码"
+            confirmButtonText="立即支付"
+            show-cancel-button
+            confirmButtonColor="#3ab200"
+            @cancel="((showPwdDialog = false), (payName = '1')), $toast.clear()"
+            @confirm="pay"
+        >
+            <div style="padding: 20px 0">
+                <van-password-input
+                    :value="tradeCode"
+                    :focused="showKeyboard"
+                    @focus="showKeyboard = true"
+                    gutter="4px"
+                />
+            </div>
+        </van-dialog>
+    </div>
+</template>
+<script>
+import PayMethodPick from '../components/PayMethodPick';
+import { mapState } from 'vuex';
+import resolveUrl from 'resolve-url';
+import qs from 'qs';
+import encryptUtil from '../utils/encryptUtil';
+import product from '../mixins/product';
+export default {
+    components: { PayMethodPick },
+    mixins: [product],
+    data() {
+        return {
+            payType: null,
+            tradeCode: '',
+            showKeyboard: false,
+            showPwdDialog: false,
+            id: 0,
+            timerNum: 0,
+            gas: 0,
+            payName: '',
+            price: '',
+            bidamount: '',
+            info: {}
+        };
+    },
+    mounted() {
+        this.$http.get('/sysConfig/get/gas_fee').then(res => {
+            this.gas = res.value;
+            this.price = Number(this.$route.query.domainPrice) + Number(this.gas);
+            if (window.cordova && window.cordova.platformId === 'ios' && this.$store.state.review) {
+                this.gas = 0;
+            }
+            return Promise.resolve();
+        });
+        this.bidamount = Number(this.$route.query.domainPrice);
+        this.$toast.loading({
+            message: '加载中...',
+            forbidClick: true
+        });
+        if (this.$route.query.id) {
+            this.id = Number(this.$route.query.id);
+            this.$http.get('/domainOrder/get/' + this.id).then(res => {
+                res.endTime = this.dayjs(res.endTime).diff(this.dayjs(), 'second');
+                res.endTime =
+                    Math.floor(res.endTime / 24 / 3600) +
+                    '天' +
+                    this.pad(parseInt(res.endTime / 3600) % 24, 2) +
+                    '时' +
+                    this.pad(parseInt(res.endTime / 60) % 60, 2) +
+                    '分';
+                this.info = res;
+                setTimeout(() => {
+                    this.$toast.clear();
+                }, 100);
+            });
+        }
+    },
+    methods: {
+        pad(n, width, z) {
+            z = z || '0';
+            n = n + '';
+            return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
+        },
+        getOrder(next = false) {
+            this.$http.get('/domainAsk/get/' + this.id).then(res => {
+                res.endTime = this.dayjs(res.endTime).diff(this.dayjs(), 'second');
+                res.endTime =
+                    Math.floor(res.endTime / 24 / 3600) +
+                    '天' +
+                    this.pad(parseInt(res.endTime / 3600) % 24, 2) +
+                    '时' +
+                    this.pad(parseInt(res.endTime / 60) % 60, 2) +
+                    '分';
+                this.info = res;
+                if (this.timer) {
+                    clearTimeout(this.timer);
+                }
+                if (this.timerNum >= 20) {
+                    this.$toast.clear();
+                    this.$dialog
+                        .confirm({
+                            title: '提示',
+                            message: '订单是否已经支付',
+                            confirmButtonText: '已经支付',
+                            cancelButtonText: '未支付'
+                        })
+                        .then(() => {
+                            this.$dialog
+                                .alert({
+                                    title: '正在排队中...',
+                                    message: '您的出价订单正在排队,出价成功的藏品后续会直接出现在藏品室哦~'
+                                })
+                                .then(res => {
+                                    this.$router.back();
+                                });
+                        })
+                        .catch(e => {
+                            this.$dialog
+                                .confirm({
+                                    title: '提示',
+                                    message: '订单未支付是否重新支付?',
+                                    confirmButtonText: '重新支付',
+                                    cancelButtonText: '取消订单'
+                                })
+                                .then(() => {
+                                    this.timerNum = 0;
+                                    this.pay(false);
+                                })
+                                .catch(() => {
+                                    this.$router.back();
+                                });
+                        });
+                } else if (
+                    res.orderStatus === 'PROCESSING' ||
+                    res.orderStatus === 'FINISH' ||
+                    res.orderStatus === 'CANCELLED' ||
+                    res.orderStatus === 'SUCCESS' ||
+                    res.orderStatus === 'PENDING'
+                ) {
+                    this.$toast.clear();
+                    this.$dialog
+                        .alert({
+                            title: '提示',
+                            message:
+                                res.orderStatus === 'CANCELLED'
+                                    ? '出价失败,点击重新下单'
+                                    : '恭喜出价成功,请到藏品室查看'
+                        })
+                        .then(() => {
+                            if (res.orderStatus === 'PENDING') {
+                                this.$router.back();
+                            } else {
+                                this.$router.replace('/domainname');
+                            }
+                        });
+                } else if (next) {
+                    this.timerNum += 1;
+                    this.timer = setTimeout(() => {
+                        this.getOrder(next);
+                    }, 1500);
+                }
+            });
+        },
+        createOrder() {
+            return new Promise((resolve, reject) => {
+                let checkOrder = () => {
+                    this.$http
+                        .post('/domainAsk/create', {
+                            domainOrderId: this.id,
+                            price: this.price
+                        })
+                        .then(res => {
+                            if (res) {
+                                clearInterval(this.createOrderTimer);
+                                this.createOrderTimer = null;
+                                resolve(res);
+                            }
+                        })
+                        .catch(e => {
+                            clearInterval(this.createOrderTimer);
+                            this.createOrderTimer = null;
+                            reject(e);
+                        });
+                };
+                setTimeout(checkOrder, 500);
+                this.createOrderTimer = setInterval(checkOrder, 2000);
+            });
+        },
+        submit() {
+            if (this.payType == 'BALANCE') {
+                this.showPwdDialog = true;
+            }
+            if (this.payName == '1') {
+                if (this.payType != 'BALANCE') {
+                    this.pay();
+                }
+            } else {
+                this.createOrder()
+                    .then(res => {
+                        this.id = res.id;
+                        if (this.payType != 'BALANCE') {
+                            this.pay();
+                        }
+                    })
+                    .catch(e => {
+                        if (e) {
+                            this.showPwdDialog = false;
+                            this.$toast.clear();
+                            this.$dialog
+                                .alert({
+                                    title: '提示',
+                                    message: this.backReson(e.error)
+                                })
+                                .then(res => {
+                                    this.$router.back();
+                                });
+                        }
+                    });
+            }
+        },
+        pay() {
+            if (this.payType == 'BALANCE') {
+                this.$http
+                    .post('/payOrder/v2/ask/balance', {
+                        id: this.id,
+                        tradeCode: this.tradeCode
+                    })
+                    .then(res => {
+                        this.$toast.success('恭喜出价成功,请到藏品室查看');
+                        setTimeout(() => {
+                            this.$router.replace('/domainname');
+                        }, 1000);
+                    })
+                    .catch(e => {
+                        this.tradeCode = '';
+                        this.$toast(e.error || '出价失败');
+                        this.payName = '1';
+                    });
+            } else if (this.payType == 'ALI') {
+                this.$toast.loading({
+                    message: '支付中',
+                    forbidClick: true
+                });
+                this.$http
+                    .get('/payOrder/v2/ask/ali', { id: this.id })
+                    .then(res => {
+                        this.$toast.clear();
+                        document.location.href = res;
+                        //   this.payUrlScheme = res;
+                    })
+                    .then(() => {
+                        this.getOrder(true);
+                    })
+                    .catch(e => {
+                        this.$toast.clear();
+                        e = e || {};
+                        e.error = e.error || '出价失败';
+                        this.$dialog
+                            .alert({
+                                title: '提示',
+                                message: this.backReson(e.error)
+                            })
+                            .then(res => {
+                                this.$router.back();
+                            });
+                    });
+            } else if (this.payType === 'UNION') {
+                const url = resolveUrl(this.$baseUrl, '/payOrder/v2/ask/sandQuick?id=' + this.id)
+                    .replace('www.raex.vip', 'jump.raex.vip')
+                    .replace('test.raex.vip', 'jumptest.raex.vip')
+                    .replace(/http:\/\/192\.168.*?\//, 'https://jumptest.raex.vip/');
+                console.log(url);
+                document.location.href = url;
+                this.getOrder(true);
+            } else if (this.payType === 'QUICK_BIND') {
+                this.$http
+                    .get('/payOrder/v2/ask/sandQuickBind?id=' + this.id)
+                    .then(res => {
+                        document.location.href = res;
+                        this.getOrder(true);
+                    })
+                    .catch(e => {
+                        this.$toast.clear();
+                        e = e || {};
+                        e.error = e.error || '出价失败';
+                        this.$dialog
+                            .alert({
+                                title: '提示',
+                                message: this.backReson(e.error)
+                            })
+                            .then(res => {
+                                this.$router.back();
+                            });
+                    });
+            }
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.page {
+    background-color: @bg3;
+    padding-bottom: 170px;
+
+    .page_top_tip {
+        height: 28px;
+        background: #3ab200;
+        font-size: 12px;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 28px;
+        text-align: center;
+    }
+
+    .page_top_con {
+        padding: 10px 16px 0;
+        box-sizing: border-box;
+        background: #ffffff;
+
+        .pageTitle {
+            font-size: 14px;
+            font-weight: 400;
+            color: #000000;
+            line-height: 24px;
+            margin-bottom: 8px;
+        }
+
+        .collection_information {
+            display: flex;
+            margin-bottom: 17px;
+
+            .collection_information_right {
+                margin-left: 10px;
+
+                .collection_information_right_name {
+                    font-size: 14px;
+                    font-weight: bold;
+                    color: #000000;
+                    line-height: 24px;
+                    margin-bottom: 2px;
+                }
+
+                .collection_information_right_no {
+                    font-size: 12px;
+                    font-weight: 400;
+                    color: #939599;
+                    line-height: 24px;
+                    margin-bottom: 6px;
+                }
+
+                .collection_information_right_price_one {
+                    font-size: 14px;
+                    font-weight: bold;
+                    color: #000000;
+                    line-height: 24px;
+                }
+            }
+        }
+
+        .collection_price {
+            height: 49px;
+            display: flex;
+            align-items: center;
+            border-top: 1px solid #f5f7fa;
+            justify-content: space-between;
+
+            .collection_price_left {
+                font-size: 14px;
+                font-weight: 400;
+                color: #000000;
+            }
+
+            .collection_price_right {
+                font-size: 14px;
+                font-weight: 500;
+                color: #3ab200;
+            }
+        }
+    }
+
+    .van-number-keyboard {
+        z-index: 9999;
+    }
+
+    :deep(.van-password-input__item) {
+        background: @bg3;
+    }
+}
+
+.page_btn {
+    width: 100%;
+    height: 56px;
+    position: fixed;
+    left: 0;
+    bottom: 0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 0px 16px;
+    box-sizing: border-box;
+    background: #ffffff;
+
+    .page_btn_left {
+        display: flex;
+
+        .page_btn_left_amount {
+            font-size: 14px;
+            font-weight: 400;
+            color: #939599;
+            line-height: 24px;
+            margin-right: 6px;
+            padding-top: 3px;
+        }
+
+        .page_btn_left_img {
+            width: 11px;
+            height: 11px;
+            padding-top: 10px;
+        }
+
+        .page_btn_left_price {
+            font-size: 32px;
+            font-family: OSP-DIN, OSP;
+            font-weight: normal;
+            color: #3ab200;
+            line-height: 24px;
+        }
+    }
+
+    .page_btn_right {
+        width: 132px;
+        height: 38px;
+        background: #3ab200;
+        border-radius: 22px;
+        text-align: center;
+        font-size: 16px;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 38px;
+    }
+}
+</style>

+ 92 - 21
src/views/Store.vue

@@ -207,20 +207,32 @@
                     <domain-owned :info="asset" v-for="(asset, assetIndex) in item" :key="assetIndex"></domain-owned>
                 </template>
             </div>
-            <!-- <div v-else-if="metadomainType == 'myBid'">
+            <div v-else-if="metadomainType == 'myBid'">
                 <template v-for="(item, index) in showList" :key="index">
-                    <owned-buy :info="asset" v-for="(asset, assetIndex) in item" :key="assetIndex"></owned-buy>
+                    <owned-buy
+                        :info="asset"
+                        v-for="(asset, assetIndex) in item"
+                        :key="assetIndex"
+                        @fatherMethods="fatherMethod"
+                    ></owned-buy>
                 </template>
             </div>
             <div v-else-if="metadomainType == 'receiveQuotation'">
                 <template v-for="(item, index) in showList" :key="index">
-                    <receive-quotation :info="asset" v-for="(asset, assetIndex) in item"
-                        :key="assetIndex"></receive-quotation>
+                    <receive-quotation :info="item"></receive-quotation>
                 </template>
-            </div> -->
+            </div>
             <van-empty
                 v-if="empty || (showList.length === 0 && !loading)"
-                :description="active == 'coupon' ? '你还没有优惠券哦~' : '你还没有藏品哦~'"
+                :description="
+                    active == 'coupon'
+                        ? '你还没有优惠券哦~'
+                        : metadomainType == 'receiveQuotation'
+                        ? '你还没有收到的报价哦~'
+                        : metadomainType == 'myBid'
+                        ? '你还没有出价的域名哦~'
+                        : '你还没有藏品哦~'
+                "
                 :image="
                     require(`@assets/${active == 'coupon' ? 'kong_png_duihuanquanhei' : 'empty_img_asset_dark'}.png`)
                 "
@@ -271,8 +283,8 @@
 <script>
 import AssetInfo from '../components/asset/assetInfo.vue';
 import DomainOwned from '../components/asset/domainOwned.vue';
-// import OwnedBuy from '../components/asset/ownedBuy.vue';
-// import ReceiveQuotation from '../components/asset/receiveQuotation.vue';
+import OwnedBuy from '../components/asset/ownedBuy.vue';
+import ReceiveQuotation from '../components/asset/receiveQuotation.vue';
 import AssetInfoSe from '../components/asset/assetInfoSe.vue';
 import ShowInfo from '../components/asset/showInfo.vue';
 import CouponInfo from '../components/CouponInfo.vue';
@@ -292,9 +304,9 @@ export default {
         ShowInfo,
         starAssetInfo,
         ProductInfo,
-        DomainOwned
-        // OwnedBuy,
-        // ReceiveQuotation
+        DomainOwned,
+        OwnedBuy,
+        ReceiveQuotation
     },
     data() {
         return {
@@ -360,7 +372,7 @@ export default {
     computed: {
         typeOptions() {
             if (this.active === 'explore') {
-                if (!this.$store.state.reviewPay && !this.$store.state.review) {
+                if (!this.$store.state.reviewPay) {
                     return [
                         {
                             label: '全部',
@@ -479,6 +491,8 @@ export default {
                 });
             } else if (this.active == 'showRoom') {
                 return this.list;
+            } else if (this.metadomainType == 'receiveQuotation') {
+                return this.list;
             } else {
                 let list = [...this.list];
                 let _list = [];
@@ -511,7 +525,11 @@ export default {
             } else if (this.type === 'lock') {
                 return '/asset/all';
             } else if (this.type === 'metadomainName') {
-                return 'asset/all';
+                if (this.metadomainType == 'myBid') {
+                    return '/domainAsk/all';
+                } else {
+                    return 'asset/all';
+                }
             } else if (this.active === 'coupon') {
                 return '/userCoupon/all';
             } else if (this.active === 'showRoom') {
@@ -529,6 +547,8 @@ export default {
                 } else if (this.type === 'metadomainName') {
                     if (this.metadomainType == 'underReview') {
                         return 'PENDING';
+                    } else if (this.metadomainType == 'myBid') {
+                        return 'ASKING,FINISH,REFUNDED';
                     } else {
                         return 'NORMAL,TRADING,GIFTING,MINTING,AUCTIONING,PENDING';
                     }
@@ -546,6 +566,11 @@ export default {
         if (this.$route.query.type) {
             this.type = this.$route.query.type;
         }
+        if (this.$route.query.goBack) {
+            this.type = 'metadomainName';
+            this.metadomainType = 'receiveQuotation';
+            this.getReview();
+        }
         if (window.cordova && StatusBar && StatusBar.isVisible) {
             StatusBar.styleLightContent();
         }
@@ -669,6 +694,12 @@ export default {
         });
     },
     methods: {
+        fatherMethod() {
+            this.page = 0;
+            this.getList().then(() => {
+                this.isLoading = false;
+            });
+        },
         showMore(asset) {
             console.log(asset);
             this.moreTitle = asset.prefixName;
@@ -748,6 +779,11 @@ export default {
             return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
         },
         getList() {
+            if (this.metadomainType == 'receiveQuotation') {
+                this.loading = false;
+                this.getReview();
+                return;
+            }
             if (!this.isLogin) {
                 this.empty = true;
                 this.loading = false;
@@ -895,18 +931,48 @@ export default {
                 }, 100);
             }
         },
+        getReview() {
+            this.list = [];
+            this.$http.post('/domainAsk/groupInfo').then(res => {
+                res.forEach(item => {
+                    item.endTime = this.dayjs(item.endTime).diff(this.dayjs(), 'second');
+                    item.endTime =
+                        Math.floor(item.endTime / 24 / 3600) +
+                        '天' +
+                        this.pad(parseInt(item.endTime / 3600) % 24, 2) +
+                        '时' +
+                        this.pad(parseInt(item.endTime / 60) % 60, 2) +
+                        '分';
+                });
+                this.isLoading = false;
+                this.list = res;
+            });
+        },
         domainBtn(index) {
             this.metadomainType = this.metadomainList[index].type;
-            this.page = 0;
-            if (this.metadomainType == 'myBid' || this.metadomainType == 'receiveQuotation') {
-                this.$toast('版本升级中');
+            if (this.metadomainType == 'receiveQuotation') {
+                this.getReview();
             } else {
+                this.page = 0;
                 this.getList().then(() => {
                     this.isLoading = false;
                 });
             }
+
+            // if (this.metadomainType == 'myBid' || this.metadomainType == 'receiveQuotation') {
+            //     this.$toast("版本升级中")
+            // } else {
+            //     this.getList().then(() => {
+            //         this.isLoading = false;
+            //     });
+            // }
         },
         changeTab(info) {
+            if (info == 'metadomainName') {
+                this.metadomainType = 'owned';
+            } else {
+                this.metadomainType = 'owned';
+            }
             if (info.name === 'price') {
                 this.sortDes = this.sortDes == 'desc' ? 'asc' : 'desc';
             }
@@ -920,10 +986,14 @@ export default {
             this.changeScroll(0, true);
         },
         onRefresh() {
-            this.page = 0;
-            this.getList().then(() => {
-                this.isLoading = false;
-            });
+            if (this.metadomainType == 'receiveQuotation') {
+                this.getReview();
+            } else {
+                this.page = 0;
+                this.getList().then(() => {
+                    this.isLoading = false;
+                });
+            }
         },
         change() {
             this.$root.$el.scrollTop = 0;
@@ -1010,7 +1080,7 @@ export default {
         font-size: 12px;
         font-weight: 400;
         color: rgba(147, 149, 153, 0.6);
-        margin-right: 20px;
+        margin-right: 30px;
     }
 
     .metadomainName_list_con {
@@ -1021,6 +1091,7 @@ export default {
         color: #00fe1e;
         background: #0f0f0f;
         line-height: 28px;
+        margin-right: 30px;
     }
 }
 

+ 87 - 11
src/views/asset/Detail.vue

@@ -498,15 +498,37 @@
                 </div>
 
                 <div class="more-btns-content" v-else>
+                    <!-- <van-button v-if="!isOlder" @click="publish" color="#FF7F1F" block round> 竞价拍卖 </van-button> -->
                     <van-button v-if="!isOlder && !$store.state.review" @click="Consignment" type="primary" block round>
                         {{ info.consignment ? '取消一口价' : '一口价拍卖' }}
                     </van-button>
-                    <!-- <van-button v-if="!isOlder" @click="publish" color="#FF7F1F" block round> 竞价拍卖 </van-button> -->
                     <van-button @click="Add" color="#FFBF27" block round> 赠送 </van-button>
                     <van-button @click="showLock = true" v-if="info.category !== '元域名'" color="#515976" block round>
                         封存
                     </van-button>
                     <van-button @click="starCreate" v-if="canStar" color="#5D7DFF" block round> 铸造星图 </van-button>
+                    <!-- <div class="btn-img-list">
+                        <div class="btn-img" v-if="info.category === '元域名'" @click="superLink">
+                            <img src="@/assets/icon_qiyongchaolian.png" alt="" />
+                            <div>{{ info.openHyperLink ? '关闭超链' : '启用超链' }}</div>
+                        </div>
+                        <div class="btn-img" v-if="!isOlder && !$store.state.review" @click="Consignment">
+                            <img src="@/assets/icon_paimai.png" alt="" />
+                            <div>{{ info.consignment ? '取消一口价' : '一口价拍卖' }}</div>
+                        </div>
+                        <div class="btn-img" @click="Add">
+                            <img src="@/assets/icon_zengsong.png" alt="" />
+                            <div>赠送</div>
+                        </div>
+                        <div class="btn-img" @click="starCreate" v-if="canStar">
+                            <img src="@/assets/icon_xingtu.png" alt="" />
+                            <div>铸造星图</div>
+                        </div>
+                        <div class="btn-img" @click="showLock = true" v-if="info.category !== '元域名'">
+                            <img src="@/assets/icon_fengcun.png" alt="" />
+                            <div>封存</div>
+                        </div>
+                    </div> -->
                 </div>
             </van-action-sheet>
         </div>
@@ -911,16 +933,12 @@ export default {
                     });
                 }
 
-                if (res.orderId) {
-                    this.$http.get('/order/get/' + res.orderId).then(res => {
-                        this.orderInfo = res;
-                        this.$toast.clear();
-                        // if (this.orderInfo.type === 'BLIND_BOX' && !this.orderInfo.opened) {
-
-                        //     this.openBlindBox();
-                        // }
-                    });
-                }
+                // if (res.orderId) {
+                //     this.$http.get('/order/get/' + res.orderId).then(res => {
+                //         this.orderInfo = res;
+                //         this.$toast.clear();
+                //     });
+                // }
                 wx.updateAppMessageShareData({
                     title: 'RAEX绿洲-' + res.name,
                     desc: '全球首个基于区块链的游戏资产集换中心',
@@ -1213,6 +1231,43 @@ export default {
         },
         showStar() {
             this.$refs.starPost.init();
+        },
+        superLink() {
+            if (this.info.openHyperLink) {
+                this.$dialog
+                    .confirm({
+                        title: '提示',
+                        message: '确认要关闭超链吗?',
+                        confirmButtonText: '关闭'
+                    })
+                    .then(res => {
+                        this.$toast.loading({
+                            message: '加载中...',
+                            forbidClick: true
+                        });
+                        return this.$http.post('/domainOrder/addHyperLink', {
+                            assetId: this.assetId,
+                            openHyperLink: false,
+                            hyperLinkType: this.info.hyperLinkType,
+                            address: ''
+                        });
+                    })
+                    .then(res => {
+                        this.$toast.success('关闭成功');
+                        this.showAction = false;
+                        setTimeout(() => {
+                            this.getProduct();
+                        }, 1000);
+                    })
+                    .catch(e => {
+                        this.$toast.clear();
+                        if (e && e.error) {
+                            this.$toast(e.error);
+                        }
+                    });
+            } else {
+                this.$router.push('/superLinkType?id=' + this.assetId);
+            }
         }
     },
     beforeRouteLeave(from, to, next) {
@@ -2637,4 +2692,25 @@ export default {
 .product-title_cons {
     line-height: 44px;
 }
+
+.btn-img-list {
+    .flex();
+    justify-content: space-around;
+    .btn-img {
+        width: 25%;
+        .flex-col();
+        align-items: center;
+        img {
+            width: 50px;
+            height: 50px;
+            display: block;
+        }
+        div {
+            font-size: 14px;
+            color: #ffffff;
+            line-height: 24px;
+            margin-top: 10px;
+        }
+    }
+}
 </style>

+ 13 - 8
src/views/chat/Detail.vue

@@ -341,7 +341,6 @@ onMounted(() => {
     }
 
     console.log(dayjs(1672800458125).format('YYYY-MM-DD'));
-
     // getData(true).then(() => {
     //     goBottom();
     // });
@@ -436,11 +435,11 @@ const fixedHeight = computed(() => {
     overflow: auto;
 }
 .page {
-    background: #1c1c1c;
+    background: #0f1014;
 }
 
 .message-bottom {
-    background-color: #222426;
+    background-color: #0f1014;
     position: fixed;
     .bottom(0px);
     bottom: 0;
@@ -455,6 +454,7 @@ const fixedHeight = computed(() => {
         .file-btn {
             width: 28px;
             height: 28px;
+            margin-left: 16px;
         }
         .van-form {
             flex-grow: 1;
@@ -465,6 +465,8 @@ const fixedHeight = computed(() => {
             --van-cell-horizontal-padding: 12px;
             --van-field-placeholder-text-color: rgba(255, 255, 255, 0.4);
             --van-field-input-text-color: #fff;
+            --van-cell-background-color: #1c1f24;
+            border-radius: 100px;
         }
 
         .btn-content {
@@ -494,7 +496,7 @@ const fixedHeight = computed(() => {
 }
 
 .emoji-list {
-    background-color: #d8d8d810;
+    background-color: #242632;
     .flex();
     flex-wrap: wrap;
     padding: 10px 16px;
@@ -522,7 +524,7 @@ const fixedHeight = computed(() => {
         }
 
         &.prim {
-            background-color: #d8d8d810;
+            background-color: #242632;
         }
     }
     .emoji-btn + .emoji-btn {
@@ -530,7 +532,7 @@ const fixedHeight = computed(() => {
     }
 }
 .sticker-list {
-    background-color: #d8d8d810;
+    background-color: #242632;
     .flex();
     flex-wrap: wrap;
     padding: 10px 16px;
@@ -553,6 +555,9 @@ const fixedHeight = computed(() => {
 
 .file-upload {
     position: relative;
+    .file-btn {
+        margin-left: 0 !important;
+    }
     .van-uploader {
         position: absolute;
         top: 0;
@@ -569,7 +574,7 @@ const fixedHeight = computed(() => {
 }
 
 .van-nav-bar {
-    --van-nav-bar-background-color: #222426;
+    --van-nav-bar-background-color: #0f1014;
     --van-nav-bar-icon-color: #fff;
     --van-nav-bar-title-text-color: #fff;
     --van-nav-bar-text-color: #fff;
@@ -586,7 +591,7 @@ const fixedHeight = computed(() => {
 }
 
 .fixed-info {
-    --van-notice-bar-background-color: #222426;
+    --van-notice-bar-background-color: #0f1014;
     --van-notice-bar-text-color: @prim;
 }
 </style>

+ 163 - 0
src/views/domain/BindingImage.vue

@@ -0,0 +1,163 @@
+<template>
+    <div class="page" :style="{ backgroundImage: `url(${require('@assets/png-dabg-add.jpg')})` }">
+        <div class="page-top">
+            <div class="title">
+                <div class="text1">绑定个人名片</div>
+                <div class="text2">您可以绑定微信/微博二维码</div>
+            </div>
+        </div>
+        <van-uploader
+            :multiple="false"
+            v-model="fileList"
+            :after-read="afterRead"
+            upload-icon="plus"
+            upload-text="点击上传"
+            @delete="onDelete"
+        />
+
+        <div class="btns">
+            <van-button type="default" @click="$router.back()" round>返回</van-button>
+            <van-button type="primary" v-if="img" round @click="sure">确认</van-button>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            fileList: [],
+            img: ''
+        };
+    },
+    mounted() {
+        if (this.$route.query.assetId) {
+            this.assetId = this.$route.query.assetId;
+        }
+    },
+    methods: {
+        afterRead(e) {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.updateFile(e, 'avatar', 2000)
+                .then(img => {
+                    this.$toast.clear();
+                    this.img = img;
+                })
+                .catch(e => {
+                    this.$toast.clear();
+                    if (e && e.error) {
+                        this.$toast(e.error);
+                    }
+                });
+        },
+        onDelete() {
+            this.img = '';
+        },
+        sure() {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.addHyperLink(this.img)
+                .then(res => {
+                    this.$toast.success('设置成功');
+                    setTimeout(() => {
+                        this.$router.go(-2);
+                    }, 1500);
+                })
+                .catch(e => {
+                    this.$toast.clear();
+                    if (e && e.error) {
+                        this.$toast(e.error);
+                    }
+                });
+        },
+        addHyperLink(address) {
+            return this.$http.post('/domainOrder/addHyperLink', {
+                assetId: this.assetId,
+                openHyperLink: true,
+                hyperLinkType: 'PERSONAL_BUSINESS_CARD',
+                address: address
+            });
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+    background-color: #0a0b21;
+    min-height: var(--app-height) !important;
+    background-size: 100% auto;
+    background-repeat: no-repeat;
+}
+
+.page-top {
+    padding: calc(var(--safe-top) + 24px) 20px 12px;
+    .flex();
+    align-items: flex-end;
+    .title {
+        flex-grow: 1;
+        .text1 {
+            font-size: 20px;
+            font-family: AlimamaShuHeiTi;
+            color: #ffffff;
+            line-height: 30px;
+        }
+        .text2 {
+            font-size: 12px;
+            color: #ffffff60;
+            line-height: 24px;
+            margin-top: 3px;
+        }
+    }
+}
+
+.btns {
+    position: fixed;
+    bottom: 0;
+    right: 0;
+    left: 0;
+    .flex();
+    padding: 9px 16px;
+    background-color: #222426;
+    z-index: 20;
+    .bottom(9px);
+    .van-button {
+        flex-grow: 1;
+        box-sizing: border-box;
+        --van-button-primary-background-color: linear-gradient(138deg, #e611ff 0%, #6e44ff 100%);
+    }
+    .van-button + .van-button {
+        margin-left: 20px;
+    }
+
+    .van-button--default {
+        background: rgba(255, 255, 255, 0.2);
+        border-width: 0;
+        color: #fff;
+    }
+}
+
+/deep/.van-uploader {
+    --van-uploader-size: calc(100vw - 40px);
+    margin: 28px 20px;
+    border: 1px dashed rgba(255, 255, 255, 0.5);
+    border-radius: 12px;
+    --van-uploader-text-color: rgba(255, 255, 255, 0.5);
+    --van-uploader-icon-color: rgba(255, 255, 255, 0.5);
+    .van-uploader__upload {
+        height: 180px;
+        margin: 0;
+        &:nth-child(2) {
+            display: none;
+        }
+    }
+    .van-uploader__preview {
+        margin: 0;
+    }
+}
+</style>

+ 257 - 0
src/views/domain/BindingWeb.vue

@@ -0,0 +1,257 @@
+<template>
+    <div class="page" :style="{ backgroundImage: `url(${require('@assets/png-xiaobg-web.png')})` }">
+        <div class="page-top">
+            <div class="title">
+                <div class="text1">{{ typeInfo.name }}</div>
+                <div class="text2">{{ typeInfo.sub }}</div>
+            </div>
+        </div>
+        <div class="input">
+            <van-field
+                type="text"
+                :border="false"
+                right-icon="guide-o"
+                v-model="address"
+                placeholder="请输入指定的链接进行绑定"
+                @click-right-icon="goUrl"
+            />
+        </div>
+
+        <div class="btns">
+            <van-button type="default" @click="$router.back()" round>返回</van-button>
+            <van-button type="primary" v-if="address" round @click="sure">确认</van-button>
+        </div>
+
+        <van-overlay :show="show" @click="show = false" z-index="99">
+            <div class="notice" @click.stop="">
+                <div class="text1">抖音绑定说明</div>
+                <div class="text2">选择抖音视频 <span>复制链接</span> 来粘贴吧</div>
+                <div class="tips">
+                    <div class="tips-text">
+                        <span class="box">1</span>
+                        复制抖音链接
+                    </div>
+                    <img src="@/assets/douyin-shuoming1.png" alt="" />
+                    <img src="@/assets/douyin-shuoming2.png" alt="" />
+                    <div class="tips-text">
+                        <span class="box">2</span>
+                        粘贴链接
+                    </div>
+                    <img src="@/assets/douyin-shuoming3.png" alt="" />
+                </div>
+                <div class="btn">
+                    <van-button type="primary" block round @click="show = false">知道了</van-button>
+                </div>
+            </div>
+        </van-overlay>
+    </div>
+</template>
+<script>
+import superLink from '@/mixins/superLink';
+export default {
+    data() {
+        return {
+            address: '',
+            assetId: 0,
+            type: 'EXTERNALLINK',
+            show: false
+        };
+    },
+    computed: {
+        typeInfo() {
+            let info = [...this.typeOptions].find(item => {
+                return item.value === this.type;
+            });
+            return info || {};
+        }
+    },
+    mixins: [superLink],
+    mounted() {
+        if (this.$route.query.assetId) {
+            this.assetId = this.$route.query.assetId;
+        }
+        if (this.$route.query.type) {
+            this.type = this.$route.query.type;
+        }
+
+        if (this.type === 'VIBRATO_VIDEO') {
+            this.show = true;
+        }
+    },
+    methods: {
+        sure() {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.addHyperLink(this.address)
+                .then(res => {
+                    this.$toast.success('设置成功');
+                    setTimeout(() => {
+                        this.$router.go(-2);
+                    }, 1500);
+                })
+                .catch(e => {
+                    this.$toast.clear();
+                    if (e && e.error) {
+                        this.$toast(e.error);
+                    }
+                });
+        },
+        addHyperLink(address) {
+            return this.$http.post('/domainOrder/addHyperLink', {
+                assetId: this.assetId,
+                openHyperLink: true,
+                hyperLinkType: this.type,
+                address: address
+            });
+        },
+        goUrl() {
+            window.open(this.address);
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+    background-color: #0a0b21;
+    min-height: var(--app-height) !important;
+    background-size: 100% auto;
+    background-repeat: no-repeat;
+}
+
+.page-top {
+    padding: calc(var(--safe-top) + 24px) 20px 12px;
+    .flex();
+    align-items: flex-end;
+    .title {
+        flex-grow: 1;
+        .text1 {
+            font-size: 20px;
+            font-family: AlimamaShuHeiTi;
+            color: #ffffff;
+            line-height: 30px;
+        }
+        .text2 {
+            font-size: 12px;
+            color: #ffffff60;
+            line-height: 24px;
+            margin-top: 3px;
+        }
+    }
+}
+
+.btns {
+    position: fixed;
+    bottom: 0;
+    right: 0;
+    left: 0;
+    .flex();
+    padding: 9px 16px;
+    background-color: #222426;
+    z-index: 20;
+    .bottom(9px);
+    .van-button {
+        flex-grow: 1;
+        box-sizing: border-box;
+        --van-button-primary-background-color: linear-gradient(138deg, #e611ff 0%, #6e44ff 100%);
+    }
+    .van-button + .van-button {
+        margin-left: 20px;
+    }
+
+    .van-button--default {
+        background: rgba(255, 255, 255, 0.2);
+        border-width: 0;
+        color: #fff;
+    }
+}
+
+.input {
+    padding: 20px;
+    /deep/ .van-cell {
+        background: #ffffff;
+        border-radius: 19px;
+        --van-cell-vertical-padding: 7px;
+        --van-cell-horizontal-padding: 12px;
+        --van-field-placeholder-text-color: rgba(0, 0, 0, 0.3);
+        --van-field-right-icon-color: #000;
+
+        .van-field__control {
+            font-size: 14px;
+        }
+    }
+}
+
+.notice {
+    width: 300px;
+    height: 495px;
+    background: #161414;
+    border-radius: 8px;
+    border: 1px solid #302b30;
+    backdrop-filter: blur(11px);
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    .flex-col();
+    align-items: center;
+    padding: 20px 0;
+    box-sizing: border-box;
+
+    .text1 {
+        font-size: 18px;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 25px;
+    }
+
+    .text2 {
+        font-size: 14px;
+        color: #939599;
+        line-height: 24px;
+        margin-top: 4px;
+        span {
+            color: #00fe1e;
+        }
+    }
+}
+
+.tips {
+    background: #1f1d1d;
+    border-radius: 8px;
+    padding: 16px;
+    margin-top: 12px;
+
+    .tips-text {
+        .box {
+            width: 14px;
+            height: 14px;
+            background: #00fe1e;
+            border-radius: 14px;
+            display: inline-block;
+            font-size: 12px;
+            font-weight: bold;
+            color: #000000;
+            line-height: 14px;
+            text-align: center;
+        }
+
+        font-size: 12px;
+        color: #00fe1e;
+        line-height: 17px;
+        margin-bottom: 12px;
+    }
+
+    img {
+        width: 228px;
+        display: block;
+        margin-bottom: 16px;
+    }
+}
+
+.btn {
+    width: 160px;
+}
+</style>

+ 224 - 0
src/views/domain/ProductChoose.vue

@@ -0,0 +1,224 @@
+<template>
+    <div class="page" :style="{ backgroundImage: `url(${require('@assets/png-xiaobg-collection.png')})` }">
+        <div class="page-top">
+            <div class="title">
+                <div class="text1">绑定指定藏品</div>
+                <div class="text2">绑定的藏品只针对仅展示/正在寄售的状态</div>
+            </div>
+        </div>
+
+        <van-list v-model:loading="loading" :finished="finished" finished-text="" @load="getData">
+            <van-empty
+                v-if="empty"
+                description=" 你还没有藏品哦~"
+                :image="require(`../../assets/empty_img_asset_dark.png`)"
+            />
+            <div class="list">
+                <div class="box" v-for="(item, index) in list" :key="index" @click="choose(item)">
+                    <div class="box-img">
+                        <van-image
+                            :src="getImg(changeImgs(item.pic))"
+                            :width="80"
+                            :height="80"
+                            fit="coevr"
+                            radius="8"
+                        />
+                        <img
+                            v-if="chooseId === item.id"
+                            src="@assets/icon_gouxuan_pre_domain.png"
+                            alt=""
+                            class="choose-icon"
+                        />
+                        <img v-else src="@assets/icon_gouxuan_huise_domain.png" alt="" class="choose-icon" />
+                    </div>
+                </div>
+            </div>
+        </van-list>
+
+        <div class="btns">
+            <van-button type="info" @click="$router.back()" round>返回</van-button>
+            <van-button type="primary" v-if="chooseId" @click="sure" round>确认</van-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import list from '../../mixins/list';
+import product from '../../mixins/product';
+export default {
+    data() {
+        return {
+            info: {},
+            url: '/collection/all',
+            list: [],
+            chooseId: '',
+            maxCollection: 20,
+            assetId: 0
+        };
+    },
+    mixins: [list, product],
+    mounted() {
+        if (this.$route.query.assetId) {
+            this.assetId = this.$route.query.assetId;
+        }
+    },
+    methods: {
+        beforeData() {
+            return {
+                query: {
+                    ownerId: this.$store.state.userInfo.id
+                },
+                size: 99
+            };
+        },
+        choose(info) {
+            this.chooseId = info.id;
+        },
+        sure() {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.addHyperLink('/productDetail/' + this.chooseId)
+                .then(res => {
+                    this.$toast.success('设置成功');
+                    setTimeout(() => {
+                        this.$router.go(-2);
+                    }, 1500);
+                })
+                .catch(e => {
+                    this.$toast.clear();
+                    if (e && e.error) {
+                        this.$toast(e.error);
+                    }
+                });
+        },
+        addHyperLink(address) {
+            return this.$http.post('/domainOrder/addHyperLink', {
+                assetId: this.assetId,
+                openHyperLink: true,
+                hyperLinkType: 'COLLECTION',
+                address: address
+            });
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+    background-color: #0a0b21;
+    min-height: var(--app-height) !important;
+    background-size: 100% auto;
+    background-repeat: no-repeat;
+}
+
+.page-top {
+    padding: calc(var(--safe-top) + 24px) 20px 12px;
+    .flex();
+    align-items: flex-end;
+    .title {
+        flex-grow: 1;
+        .text1 {
+            font-size: 20px;
+            font-family: AlimamaShuHeiTi;
+            color: #ffffff;
+            line-height: 30px;
+        }
+        .text2 {
+            font-size: 12px;
+            color: #ffffff60;
+            line-height: 24px;
+            margin-top: 3px;
+        }
+    }
+}
+
+.list {
+    .flex();
+    flex-wrap: wrap;
+    padding-bottom: 80px;
+    .box {
+        padding: 10px 16px;
+        width: 33%;
+        box-sizing: border-box;
+        position: relative;
+
+        .choose-img {
+            width: 24px;
+            height: 24px;
+            position: absolute;
+            right: 0px;
+            top: 0px;
+            z-index: 2;
+        }
+
+        .box-img {
+            position: relative;
+            width: 80px;
+            height: 80px;
+            margin: auto;
+
+            .choose-icon {
+                width: 24px;
+                height: 24px;
+                position: absolute;
+                right: 0;
+                top: 0;
+            }
+        }
+
+        &.active {
+            .box-img {
+                &::after {
+                    content: '';
+                    position: absolute;
+                    left: 0;
+                    top: 0;
+                    right: 0;
+                    bottom: 0;
+                    z-index: 1;
+                    background-color: rgba(0, 0, 0, 0.3);
+                }
+            }
+        }
+
+        .num {
+            font-size: 12px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 17px;
+            position: absolute;
+            left: 5px;
+            top: 0px;
+            z-index: 2;
+        }
+    }
+}
+
+.btns {
+    position: fixed;
+    bottom: 0;
+    right: 0;
+    left: 0;
+    .flex();
+    padding: 9px 16px;
+    background-color: #222426;
+    z-index: 20;
+    .bottom(9px);
+    .van-button {
+        flex-grow: 1;
+        box-sizing: border-box;
+        --van-button-primary-background-color: linear-gradient(138deg, #e611ff 0%, #6e44ff 100%);
+    }
+    .van-button + .van-button {
+        margin-left: 20px;
+    }
+
+    .van-button--info {
+        background: rgba(255, 255, 255, 0.2);
+        border-width: 0;
+        color: #fff;
+    }
+}
+</style>

+ 118 - 35
src/views/domain/Statistics.vue

@@ -7,12 +7,13 @@
                 line-width="16"
                 line-height="2"
                 :ellipsis="false"
+                @change="changeType"
             >
                 <van-tab :title="item.label" :name="item.value" :key="index" v-for="(item, index) in typeOptions">
                 </van-tab>
             </van-tabs>
 
-            <div class="price-sort">
+            <div class="price-sort" :class="[{ prim: sort === 'price' }, priceSort]" @click="changeSort">
                 <span>价格排序</span>
                 <van-icon size="8" name="arrow-up" />
                 <van-icon size="8" name="arrow-down" />
@@ -23,75 +24,113 @@
             <div class="datas-card">
                 <div class="datas-item">
                     <div class="text1">流通量</div>
-                    <div class="text2">1000</div>
+                    <div class="text2">{{ datas.transferringCount || 0 }}</div>
                 </div>
                 <div class="datas-item">
-                    <div class="text1">流通量</div>
-                    <div class="text2">1000</div>
+                    <div class="text1">寄售中</div>
+                    <div class="text2">{{ datas.consignment || 0 }}</div>
                 </div>
                 <div class="datas-item">
-                    <div class="text1">流通量</div>
-                    <div class="text2">1000</div>
+                    <div class="text1">仅展示</div>
+                    <div class="text2">{{ datas.publicShow || 0 }}</div>
                 </div>
             </div>
         </div>
 
-        <div class="van-list">
-            <div class="collection">
-                <van-image
-                    width="128"
-                    height="128"
-                    fit="cover"
-                    src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
-                />
+        <van-list class="list" v-model:loading="loading" :finished="finished" finished-text="" @load="getData">
+            <div class="collection" v-for="(item, index) in list" :key="index">
+                <van-image width="128" height="128" radius="8" fit="cover" :src="getImg(changeImgs(item.pic, 600))" />
                 <div class="collection-info">
-                    <div class="text1">北京荣宝网络文物拍卖拍卖北京荣宝网络文物拍卖拍卖</div>
+                    <div class="text1">{{ item.name }}</div>
                     <div class="minter">
-                        <van-image
-                            width="18"
-                            height="18"
-                            fit="cover"
-                            round
-                            src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
-                        />
-                        <span>持有者名称</span>
+                        <van-image width="18" height="18" fit="cover" round :src="item.ownerAvatar" />
+                        <span>{{ item.owner }}</span>
                     </div>
-                    <div class="time">成交时间:2023.03.20</div>
+                    <div class="time">成交时间:{{ item.payTime }}</div>
                     <div class="flex1"></div>
                     <div class="price">
                         <span>成交价</span>
                         <img src="@assets/icon_jiage_lv.png" alt="" />
-                        <span>1000</span>
+                        <span>{{ item.price }}</span>
                     </div>
                 </div>
             </div>
-        </div>
+        </van-list>
     </div>
 </template>
 
 <script>
+import list from '../../mixins/list';
+import product from '../../mixins/product';
 export default {
     data() {
         return {
-            type: '',
+            type: 0,
             typeOptions: [
                 {
                     label: '百家姓',
-                    value: '',
+                    value: 0,
                     type: ''
                 },
                 {
                     label: '字符',
-                    value: 'xingtu',
+                    value: 1,
                     type: ''
                 },
                 {
                     label: '数字',
-                    value: 'metadomainName',
+                    value: 2,
                     type: ''
                 }
-            ]
+            ],
+            datas: {},
+            url: '/order/newestOrder',
+            isFormData: true,
+            size: 2,
+            sort: 'payTime,desc',
+            priceSort: 'asc'
         };
+    },
+    mixins: [list, product],
+    mounted() {
+        this.getStatics();
+    },
+    methods: {
+        changeType(type) {
+            console.log(type);
+            this.sort = 'payTime,desc';
+            this.getData(true);
+            this.getStatics();
+        },
+        getStatics() {
+            this.$http
+                .post('/order/domainOrderStatistic', {
+                    type: this.type
+                })
+                .then(res => {
+                    this.datas = res;
+                });
+        },
+        beforeData() {
+            return {
+                type: this.type,
+                sort: this.sort === 'price' ? this.sort + ',' + this.priceSort : this.sort
+            };
+        },
+        changeSort() {
+            console.log(this.sort);
+            if (this.sort === 'price') {
+                if (this.priceSort === 'asc') {
+                    this.priceSort = 'desc';
+                } else {
+                    this.sort = 'payTime,desc';
+                    this.priceSort = 'asc';
+                }
+            } else {
+                this.sort = 'price';
+            }
+            this.getData(true);
+        }
     }
 };
 </script>
@@ -105,7 +144,9 @@ export default {
     background-color: #161414;
 }
 .tabs {
-    position: relative;
+    position: sticky;
+    z-index: 20;
+    top: calc(var(--safe-top) + 46px);
 }
 .price-sort {
     position: absolute;
@@ -129,6 +170,31 @@ export default {
             bottom: 12px;
         }
     }
+
+    &.prim {
+        color: #00fe1e;
+        font-weight: bold;
+
+        &.desc {
+            .van-icon {
+                &.van-icon-arrow-down {
+                    color: #00fe1e;
+                }
+            }
+        }
+
+        &.asc {
+            .van-icon {
+                &.van-icon-arrow-up {
+                    color: #00fe1e;
+                }
+            }
+        }
+
+        &::after {
+            width: 34px;
+        }
+    }
 }
 
 .datas-box {
@@ -151,6 +217,20 @@ export default {
             color: #f4f4f4;
             line-height: 24px;
         }
+
+        .datas-item {
+            &:nth-child(2) {
+                .text2 {
+                    text-align: center;
+                }
+            }
+
+            &:nth-child(3) {
+                .text2 {
+                    text-align: right;
+                }
+            }
+        }
     }
 }
 .van-list {
@@ -199,9 +279,7 @@ export default {
             font-size: 10px;
             color: #939599;
             line-height: 18px;
-            background: rgba(255, 255, 255, 0.04);
             border-radius: 4px;
-            padding: 0 4px;
             align-self: flex-start;
             margin-top: 10px;
         }
@@ -209,12 +287,16 @@ export default {
         .price {
             font-size: 12px;
             font-weight: bold;
-            color: #00fe1e;
             line-height: 12px;
+            color: #00fe1e;
+            .flex();
+            align-items: flex-end;
 
             img {
                 width: 8px;
                 height: 8px;
+                margin-left: 2px;
+                margin-bottom: 1px;
             }
 
             span {
@@ -222,6 +304,7 @@ export default {
                     font-size: 20px;
                     font-family: OSP;
                     font-weight: normal;
+                    line-height: 14px;
                 }
             }
         }

+ 0 - 3
src/views/domain/SuperLink.vue

@@ -1,3 +0,0 @@
-<template>
-    <div></div>
-</template>

+ 223 - 69
src/views/domain/SuperLinkType.vue

@@ -1,49 +1,190 @@
 <template>
-    <div class="page">
+    <div class="page" :style="{ backgroundImage: `url(${require('@assets/png-dabg.jpg')})` }">
         <img src="@/assets/nft-logo.png" class="logo" alt="" />
         <div class="title">选择你要启用的超链类型</div>
-
-        <div class="select">
-            <img src="@/assets/link-type-select.png" alt="" class="select-bg" />
-            <div class="select-box">
-                <img src="@/assets/icon_zhuye.png" alt="" class="img" />
-                <div class="select-info">
-                    <div class="text1">个人主页</div>
-                    <div class="text2">增加主页曝光度,获得更多粉丝~</div>
-                </div>
-                <img src="@/assets/png-xiayibu.png" alt="" class="icon" />
-            </div>
-        </div>
-        <div class="select">
-            <img src="@/assets/link-type-select.png" alt="" class="select-bg" />
-            <div class="select-box">
-                <img src="@/assets/icon_zhuye.png" alt="" class="img" />
-                <div class="select-info">
-                    <div class="text1">个人主页</div>
-                    <div class="text2">增加主页曝光度,获得更多粉丝~</div>
-                </div>
-                <img src="@/assets/png-xiayibu.png" alt="" class="icon" />
-            </div>
+        <div class="back-content" @click="$router.go(-1)">
+            <img src="@assets/icon_fanhui2.png" alt="" />
         </div>
-        <div class="select">
-            <img src="@/assets/link-type-select.png" alt="" class="select-bg" />
-            <div class="select-box">
-                <img src="@/assets/icon_zhuye.png" alt="" class="img" />
+        <div class="select-list">
+            <div class="select" v-for="(item, index) in typeList" :key="index" @click="chooseType(item)">
+                <img :src="item.icon" alt="" class="img" />
                 <div class="select-info">
-                    <div class="text1">个人主页</div>
-                    <div class="text2">增加主页曝光度,获得更多粉丝~</div>
+                    <div class="text1">{{ item.name }}</div>
+                    <div class="text2">{{ item.sub }}</div>
                 </div>
-                <img src="@/assets/png-xiayibu.png" alt="" class="icon" />
+                <img src="@/assets/icon_inter2.png" alt="" class="icon" />
             </div>
         </div>
     </div>
 </template>
 
+<script setup>
+import { Dialog, Toast } from 'vant';
+import http from '@/plugins/http';
+import { ref, onMounted } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import { useStore } from 'vuex';
+
+const typeList = [
+    {
+        icon: require('@/assets/icon_mingcheng.png'),
+        name: '绑定RID元域名作为用户名',
+        sub: '将元域名作为您的昵称',
+        type: 'RID_CLOUD_DOMAIN_NAME'
+    },
+    {
+        icon: require('@/assets/icon_zhuye.png'),
+        name: '绑定个人主页',
+        sub: '增加主页曝光度,获得更多粉丝',
+        type: 'HOMEPAGE'
+    },
+    {
+        icon: require('@/assets/icon_cangpin.png'),
+        name: '绑定指定藏品',
+        sub: '一键触达指定数字藏品',
+        type: 'COLLECTION'
+    },
+    {
+        icon: require('@/assets/icon_web2.0.png'),
+        name: '绑定指定web2.0浏览页面',
+        sub: '您可以绑定您的电商网页或知乎链接等',
+        type: 'EXTERNALLINK'
+    },
+    {
+        icon: require('@/assets/icon_mingpian.png'),
+        name: '绑定个人名片',
+        sub: '您可以绑定微信/微博二维码',
+        type: 'PERSONAL_BUSINESS_CARD'
+    },
+    {
+        icon: require('@/assets/icon_douyin.png'),
+        name: '绑定抖音视频',
+        sub: '绑定抖音视频,让更多人看到你的精彩!',
+        type: 'VIBRATO_VIDEO'
+    },
+    {
+        icon: require('@/assets/icon_OASISMETA.png'),
+        name: '关联OASISMETA绿洲元宇宙',
+        sub: '关联个人土地空间',
+        type: 'OASISMETA'
+    }
+];
+
+const assetId = ref(0);
+const assetInfo = ref({});
+const route = useRoute();
+const router = useRouter();
+onMounted(() => {
+    if (route.query.id) {
+        assetId.value = route.query.id;
+        http.http.get('/asset/get/' + assetId.value).then(res => {
+            assetInfo.value = res;
+        });
+    }
+});
+
+const store = useStore();
+function chooseType(info) {
+    switch (info.type) {
+        case 'RID_CLOUD_DOMAIN_NAME':
+            Dialog.confirm({
+                title: '提示',
+                message: '确认要将元域名作为您的昵称吗?'
+            })
+                .then(res => {
+                    Toast.loading({
+                        message: '加载中...',
+                        forbidClick: true
+                    });
+                    return http.http.post('/user/update', {
+                        ...store.state.userInfo,
+                        nickname: assetInfo.value.name.replace(/RID元宇宙域名 /, '')
+                    });
+                })
+                .then(res => {
+                    Toast.success('设置成功');
+                })
+                .catch(e => {
+                    Toast.clear();
+                    if (e && e.error) {
+                        Toast(e.error);
+                    }
+                });
+            break;
+        case 'HOMEPAGE':
+            Dialog.confirm({
+                title: '提示',
+                message: '确认要绑定个人主页吗?'
+            })
+                .then(() => {
+                    Toast.loading({
+                        message: '加载中...',
+                        forbidClick: true
+                    });
+                    return addHyperLink(info.type, `/creatorDetail?id=${store.state.userInfo.id}&type=DEFAULT`);
+                })
+                .then(() => {
+                    Toast.success('设置成功');
+                    setTimeout(() => {
+                        router.back();
+                    }, 1500);
+                })
+                .catch(e => {
+                    Toast.clear();
+                    if (e && e.error) {
+                        Toast(e.error);
+                    }
+                });
+            break;
+        case 'COLLECTION':
+            router.push({
+                name: 'domainProductChoose',
+                query: {
+                    assetId: assetId.value
+                }
+            });
+            break;
+        case 'EXTERNALLINK':
+        case 'VIBRATO_VIDEO':
+        case 'OASISMETA':
+            router.push({
+                name: 'bindingWeb',
+                query: {
+                    assetId: assetId.value,
+                    type: info.type
+                }
+            });
+            break;
+        case 'PERSONAL_BUSINESS_CARD':
+            router.push({
+                name: 'bindingImage',
+                query: {
+                    assetId: assetId.value
+                }
+            });
+            break;
+    }
+}
+
+function addHyperLink(hyperLinkType, address) {
+    console.log(hyperLinkType);
+    return http.http.post('/domainOrder/addHyperLink', {
+        assetId: assetInfo.value.id,
+        openHyperLink: true,
+        hyperLinkType: hyperLinkType,
+        address: address
+    });
+}
+</script>
+
 <style lang="less" scoped>
 .page {
     min-height: var(--app-height) !important;
-    background-color: #23042e;
+    background-color: #0f1014;
     color: #fff;
+    background-size: 100% auto;
+    background-repeat: no-repeat;
+    padding-top: calc(var(--safe-top) + 40px);
 }
 
 .logo {
@@ -60,53 +201,66 @@
     text-align: center;
 }
 
+.select-list {
+    padding: 40px 20px;
+    .select + .select {
+        margin-top: 16px;
+    }
+}
+
 .select {
     position: relative;
-    padding: 10px 20px;
+    background: #242632;
+    border-radius: 12px;
 
-    .select-bg {
-        width: 100%;
-        position: relative;
+    .flex();
+    padding: 16px;
+
+    .img {
+        width: 50px;
+        height: 50px;
     }
 
-    .select-box {
-        position: absolute;
-        top: 10px;
-        left: 20px;
-        right: 20px;
-        bottom: 10px;
-        .flex();
-        padding: 0 16px;
-
-        .img {
-            width: 44px;
-            height: 44px;
-        }
+    .icon {
+        width: 18px;
+        height: 18px;
+    }
+
+    .select-info {
+        flex-grow: 1;
+        margin-left: 10px;
 
-        .icon {
-            width: 20px;
-            height: 20px;
+        .text1 {
+            font-size: 14px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 24px;
         }
 
-        .select-info {
-            flex-grow: 1;
-            padding: 0 10px;
-
-            .text1 {
-                font-size: 16px;
-                font-family: AlimamaShuHeiTi;
-                color: #ffffff;
-                line-height: 24px;
-                text-shadow: 0px 2px 4px rgba(0, 0, 0, 0.3);
-            }
-
-            .text2 {
-                font-size: 12px;
-                color: #e79af0;
-                line-height: 24px;
-                margin-top: 4px;
-            }
+        .text2 {
+            font-size: 12px;
+            color: #ffffff;
+            line-height: 24px;
         }
     }
 }
+
+.back-content {
+    width: 34px;
+    height: 34px;
+    background: rgba(0, 0, 0, 0.5);
+    backdrop-filter: blur(1px);
+    .flex();
+    justify-content: center;
+    border-radius: 100px;
+    box-sizing: border-box;
+    img {
+        width: 18px;
+        height: 18px;
+    }
+    position: fixed;
+    left: 16px;
+    top: calc(var(--safe-top) + 16px);
+    z-index: 20;
+}
 </style>

+ 37 - 2
src/views/order/Orders.vue

@@ -134,7 +134,18 @@
             @load="getData"
             v-if="type == 'METANAME'"
         >
-            <domain-info @delFn="delFn" v-for="item in list" :key="item.id" :info="item"></domain-info>
+            <template v-if="status != 'BID_ORDER'">
+                <domain-info @delFn="delFn" v-for="item in list" :key="item.id" :info="item"></domain-info>
+            </template>
+            <template v-else>
+                <bid-order-info
+                    @delFn="delFn"
+                    v-for="item in list"
+                    :key="item.id"
+                    :info="item"
+                    @fatherMethods="fatherMethod"
+                ></bid-order-info>
+            </template>
             <van-empty v-if="empty" description="你还没有订单哦~" :image="require('@assets/kong_png_wudingdan.png')" />
         </van-list>
     </van-pull-refresh>
@@ -144,6 +155,7 @@
 import OrderInfo from '../../components/order/OrderInfo.vue';
 import OrderInfoAct from '../../components/order/OrderInfoAct.vue';
 import DomainInfo from '../../components/order/DomainInfo.vue';
+import BidOrderInfo from '../../components/order/BidOrderInfo.vue';
 import OrderInfoAuction from '../../components/order/OrderInfoAuction.vue';
 import list from '../../mixins/list';
 export default {
@@ -154,7 +166,8 @@ export default {
         OrderInfo,
         OrderInfoAct,
         DomainInfo,
-        OrderInfoAuction
+        OrderInfoAuction,
+        BidOrderInfo
     },
     data() {
         return {
@@ -186,6 +199,10 @@ export default {
                     status: 'PENDING',
                     name: '审核中'
                 },
+                // {
+                //     status: 'BID_ORDER',
+                //     name: '出价订单'
+                // },
                 {
                     status: 'NOT_PAID',
                     name: '待支付'
@@ -245,9 +262,15 @@ export default {
         }
     },
     methods: {
+        fatherMethod() {
+            this.getData(true).then(() => {
+                this.isLoading = false;
+            });
+        },
         beforeData() {
             if (this.type == 'METANAME') {
                 if (this.status == 'PENDING') {
+                    this.url = '/domainOrder/all';
                     return {
                         query: {
                             userId: this.$store.state.userInfo.id,
@@ -256,6 +279,7 @@ export default {
                         }
                     };
                 } else if (this.status == 'FINISH') {
+                    this.url = '/domainOrder/all';
                     return {
                         query: {
                             userId: this.$store.state.userInfo.id,
@@ -263,7 +287,18 @@ export default {
                             status: 'SUCCESS'
                         }
                     };
+                } else if (this.status == 'BID_ORDER') {
+                    this.url = '/domainAsk/all';
+                    return {
+                        query: {
+                            companyId: 1,
+                            status: 'ASKING,FINISH,REFUNDED',
+                            type: 'DOMAIN',
+                            userId: this.$store.state.userInfo.id
+                        }
+                    };
                 } else {
+                    this.url = '/domainOrder/all';
                     return {
                         query: {
                             userId: this.$store.state.userInfo.id,

+ 317 - 87
src/views/product/QuotationRecord.vue

@@ -7,7 +7,7 @@
                         :src="require('@assets/icon-back@3x.png')"
                         alt=""
                         class="product_top_one_img"
-                        @click="$router.back()"
+                        @click="goBack"
                     />
                     收到报价
                 </div>
@@ -24,123 +24,204 @@
                             <div class="product_left_time">剩余时长&nbsp;{{ info.endTime }}</div>
                         </div>
                     </div>
-                    <div class="product_detailed_information_con_right_price">最高价:¥1000</div>
+                    <div class="product_detailed_information_con_right_price">最高价:¥{{ highestBid }}</div>
                 </div>
             </div>
         </div>
-        <div class="number_of_quotations">共10条报价</div>
-        <!-- <van-pull-refresh v-if="quotedPriceList.length == 0" success-text="加载成功" success-duration="500" class="search"
-            v-model="isLoading" :head-height="80" @refresh="onRefresh"> -->
-        <!-- <van-list style="padding-bottom: 100px" class="box-list" v-model:loading="loading" :finished="finished"
-                finished-text=""> -->
-        <div class="box-list">
-            <div class="box-list_con" v-for="(item, index) in quotedPriceList" :key="index">
-                <div class="box-list_con_left">
-                    <van-image
-                        width="40"
-                        height="40"
-                        class="user-img"
-                        :src="item.minterAvatar"
-                        fit="cover"
-                        radius="100"
-                    />
-                    <div>
-                        <div class="box-list_con_left_name">{{ item.name }}</div>
-                        <div class="box-list_con_left_time">{{ item.time }}</div>
-                    </div>
-                </div>
-                <div class="box-list_con_right">
-                    <div class="box-list_con_right_fu">
-                        <div class="box-list_con_right_con">
-                            <img
-                                :src="require('@assets/icon_jiage@3x (2).png')"
-                                alt=""
-                                class="box-list_con_right_img"
+        <div class="number_of_quotations">共{{ quotedPriceList.length }}条报价</div>
+        <van-pull-refresh
+            success-text="加载成功"
+            success-duration="500"
+            class="search"
+            v-model="isLoading"
+            :head-height="80"
+            @refresh="onRefresh"
+        >
+            <van-list
+                style="padding-bottom: 100px"
+                class="box-list"
+                v-model:loading="loading"
+                :finished="finished"
+                finished-text=""
+                @load="getList"
+            >
+                <div class="box-list">
+                    <div class="box-list_con" v-for="(item, index) in quotedPriceList" :key="index">
+                        <div class="box-list_con_left">
+                            <van-image
+                                width="40"
+                                height="40"
+                                class="user-img"
+                                :src="item.avatar"
+                                fit="cover"
+                                radius="100"
                             />
-                            <div class="box-list_con_right_con_price">{{ item.price }}</div>
+                            <div>
+                                <div class="box-list_con_left_name">{{ item.nickname }}</div>
+                                <div class="box-list_con_left_time">{{ item.createdAt }}</div>
+                            </div>
+                        </div>
+                        <div class="box-list_con_right">
+                            <div class="box-list_con_right_fu">
+                                <div class="box-list_con_right_con">
+                                    <img
+                                        :src="require('@assets/icon_jiage@3x (2).png')"
+                                        alt=""
+                                        class="box-list_con_right_img"
+                                    />
+                                    <div class="box-list_con_right_con_price">{{ item.price }}</div>
+                                </div>
+                            </div>
+                            <div class="box-list_con_right_con_btn" v-if="item.status != 'ASKING'">对方已取消</div>
+                            <div v-else class="box-list_con_right_con_btns" @click="acceptOffer(index)">接受</div>
                         </div>
                     </div>
-                    <div v-if="item.cancel" class="box-list_con_right_con_btn">对方已取消</div>
-                    <div v-else class="box-list_con_right_con_btns">接受</div>
+                </div>
+                <van-empty
+                    :image="require('@assets/empty_img_asset_dark.png')"
+                    v-if="empty"
+                    description="没有任何报价哦~"
+                />
+            </van-list>
+        </van-pull-refresh>
+        <van-popup v-model:show="show">
+            <div class="accept_offer_title">接受报价</div>
+            <div class="accept_offer_title_tip">
+                <div class="accept_offer_title_tip_con">
+                    <img :src="require('@assets/png-xiao-zi@3x.png')" alt="" class="accept_offer_title_tip_con_img" />
+                    <div class="accept_offer_title_tip_con_text">{{ info.name }}</div>
                 </div>
             </div>
-        </div>
-        <!-- <van-empty :image="require('@assets/empty_img_asset_dark.png')" v-if="empty" description="没有任何报价哦~" />
-            </van-list> -->
-        <!-- </van-pull-refresh> -->
+            <div class="accept_offer_list">
+                <div class="accept_offer_list_title">出售价格</div>
+                <div class="accept_offer_list_price">¥{{ price }}</div>
+            </div>
+            <div class="accept_offer_list">
+                <div class="accept_offer_list_title">版税({{ royalties }}%)</div>
+                <div class="accept_offer_list_price">¥{{ royaltiesAmount }}</div>
+            </div>
+            <div class="accept_offer_list">
+                <div class="accept_offer_list_title">技术服务费({{ serviceCharge }}%)</div>
+                <div class="accept_offer_list_price">¥{{ serviceChargeAmount }}</div>
+            </div>
+            <div class="accept_offer_list">
+                <div class="accept_offer_list_title">支付通道费({{ payChannel }}%)</div>
+                <div class="accept_offer_list_price">¥{{ payChannelAmount }}</div>
+            </div>
+            <div class="final_income">
+                <div class="final_income_title">最终收入</div>
+                <div class="final_income_price">¥{{ finalIncome }}</div>
+            </div>
+            <div class="accept_offer_btn">
+                <div class="accept_offer_btn_left" @click="show = false">取消</div>
+                <div class="accept_offer_btn_right" @click="affirmBtn">确认</div>
+            </div>
+        </van-popup>
     </div>
 </template>
 
 <script>
 import asset from '../../mixins/asset';
 import product from '../../mixins/product';
+let fromRoute = null;
 export default {
     mixins: [asset, product],
     data() {
         return {
+            fromRoute: null,
             assetId: 0,
+            domainOrderId: 0,
+            highestBid: 0,
             info: {},
-            quotedPriceList: [
-                {
-                    name: '用户昵称',
-                    time: '02-20 22:08',
-                    minterAvatar: require('@assets/svgs/img_default_photo.svg'),
-                    price: 1000,
-                    cancel: false
-                },
-                {
-                    name: '用户昵称',
-                    time: '02-20 22:08',
-                    minterAvatar: require('@assets/svgs/img_default_photo.svg'),
-                    price: 1000,
-                    cancel: false
-                },
-                {
-                    name: '用户昵称',
-                    time: '02-20 22:08',
-                    minterAvatar: require('@assets/svgs/img_default_photo.svg'),
-                    price: 1000,
-                    cancel: true
-                },
-                {
-                    name: '用户昵称',
-                    time: '02-20 22:08',
-                    minterAvatar: require('@assets/svgs/img_default_photo.svg'),
-                    price: 1000,
-                    cancel: false
-                }
-            ],
+            id: 0,
+            show: false,
+            quotedPriceList: [],
             loading: false,
             finished: false,
-            page: 0
+            page: 0,
+            price: 0,
+            royalties: 5,
+            serviceCharge: 5,
+            payChannel: 1,
+            royaltiesAmount: 0,
+            serviceChargeAmount: 0,
+            payChannelAmount: 0,
+            finalIncome: 0
         };
     },
-    computed: {},
+    computed: {
+        // timeOne() {
+        //     return this.quotedPriceList.forEach(item => {
+        //         this.dayjs(item.createdAt).format('MM-DD');
+        //     });
+        // },
+        // timeTwo() {
+        //     return this.dayjs(this.info.createdAt).format('HH:mm');
+        // }
+    },
     mounted() {
         if (this.$route.query.id) {
             this.assetId = this.$route.query.id;
+            this.domainOrderId = this.$route.query.domainOrderId;
             this.getDomain();
         }
+        this.emitter.on('updateFrom', from => {
+            fromRoute = from;
+        });
+    },
+    beforeRouteEnter(to, from) {
+        fromRoute = from;
     },
     methods: {
+        acceptOffer(index) {
+            this.id = this.quotedPriceList[index].id;
+            this.royalties = this.quotedPriceList[index].royalties;
+            if (this.quotedPriceList[index].serviceCharge >= 1) {
+                this.serviceCharge = this.quotedPriceList[index].serviceCharge - 1;
+                this.payChannel = 1;
+            } else {
+                this.serviceCharge = this.quotedPriceList[index].serviceCharge;
+                this.payChannel = 0;
+            }
+            this.show = true;
+            this.price = Number(this.quotedPriceList[index].price);
+            this.royaltiesAmount = Number((Math.floor(this.price * (this.royalties || 0)) / 100).toFixed(2));
+            this.serviceChargeAmount = Number((Math.floor(this.price * (this.serviceCharge || 0)) / 100).toFixed(2));
+            this.payChannelAmount = Number((Math.floor(this.price * (this.payChannel || 0)) / 100).toFixed(2));
+            this.finalIncome = this.price - (this.royaltiesAmount + this.serviceChargeAmount + this.payChannelAmount);
+            this.finalIncome = this.finalIncome.toFixed(2);
+        },
         pad(n, width, z) {
             z = z || '0';
             n = n + '';
             return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
         },
         getDomain() {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.$http
+                .post('/domainAsk/maxPrice', {
+                    domainOrderId: this.domainOrderId
+                })
+                .then(res => {
+                    this.highestBid = res;
+                })
+                .catch(e => {});
             return this.$http.get('/asset/get/' + this.assetId).then(res => {
-                if (res.endTime) {
-                    res.endTime = this.dayjs(res.endTime).diff(this.dayjs(), 'second');
-                    res.endTime =
-                        Math.floor(res.endTime / 24 / 3600) +
-                        '天' +
-                        this.pad(parseInt(res.endTime / 3600) % 24, 2) +
-                        '时' +
-                        this.pad(parseInt(res.endTime / 60) % 60, 2) +
-                        '分';
-                }
+                res.endTime = this.dayjs(res.endTime).diff(this.dayjs(), 'second');
+                res.endTime =
+                    Math.floor(res.endTime / 24 / 3600) +
+                    '天' +
+                    this.pad(parseInt(res.endTime / 3600) % 24, 2) +
+                    '时' +
+                    this.pad(parseInt(res.endTime / 60) % 60, 2) +
+                    '分';
                 this.info = res;
+                setTimeout(() => {
+                    this.$toast.clear();
+                }, 100);
             });
         },
         getList(isFirst = false) {
@@ -152,10 +233,14 @@ export default {
             this.finished = false;
             this.empty = false;
             let query = {
-                type: 'DOMAIN'
+                type: 'DOMAIN',
+                status: 'ASKING,FINISH,REFUNDED',
+                companyId: 1,
+                assetId: this.assetId,
+                ownerId: this.$store.state.userInfo.id
             };
-            let sort = 'likes,desc';
-            let url = 'collection/all';
+            let sort = 'price,desc';
+            let url = 'domainAsk/all';
             return this.$http
                 .post(
                     url,
@@ -163,8 +248,7 @@ export default {
                         page: this.page,
                         size: 20,
                         query: query,
-                        sort: sort,
-                        search: this.search
+                        sort: sort
                     },
                     { body: 'json' }
                 )
@@ -182,6 +266,39 @@ export default {
                     }
                 });
         },
+        affirmBtn() {
+            this.$http
+                .post('/domainAsk/accept', {
+                    id: this.id
+                })
+                .then(res => {
+                    this.show = false;
+                    this.$toast.success('接受成功');
+                    setTimeout(() => {
+                        this.$router.push({
+                            path: '/store',
+                            query: {
+                                goBack: true
+                            }
+                        });
+                    }, 1000);
+                })
+                .catch(e => {
+                    this.$toast(e.error || '接受报价失败');
+                    this.show = false;
+                    this.getList(true).then(() => {
+                        this.isLoading = false;
+                    });
+                });
+        },
+        goBack() {
+            this.$router.push({
+                path: '/store',
+                query: {
+                    goBack: true
+                }
+            });
+        },
         onRefresh() {
             this.getList(true).then(() => {
                 this.isLoading = false;
@@ -196,12 +313,127 @@ export default {
     background: #0f0f0f;
 }
 
+/deep/ .van-popup {
+    width: calc(80vw);
+    background: #161414;
+    border-radius: 8px;
+    border: 1px solid #302b30;
+    backdrop-filter: blur(11px);
+    padding: 24px 20px 30px;
+    box-sizing: border-box;
+
+    .accept_offer_title {
+        font-size: 16px;
+        font-weight: 400;
+        color: #ffffff;
+        line-height: 24px;
+        text-align: center;
+        margin-bottom: 20px;
+    }
+
+    .accept_offer_title_tip {
+        display: flex;
+        justify-content: center;
+        margin-bottom: 24px;
+
+        .accept_offer_title_tip_con {
+            display: flex;
+            align-items: center;
+
+            .accept_offer_title_tip_con_img {
+                width: 10px;
+                height: 18px;
+                margin-right: 6px;
+            }
+
+            .accept_offer_title_tip_con_text {
+                width: calc(62vw);
+                font-size: 20px;
+                font-weight: bold;
+                color: #ffffff;
+                line-height: 24px;
+                overflow: hidden;
+                white-space: nowrap;
+                text-overflow: ellipsis;
+            }
+        }
+    }
+
+    .accept_offer_list {
+        display: flex;
+        justify-content: space-between;
+        border-bottom: 1px #242424 solid;
+        padding-bottom: 10px;
+        margin-bottom: 10px;
+
+        .accept_offer_list_title {
+            font-size: 14px;
+            font-weight: 400;
+            color: #939599;
+            line-height: 24px;
+        }
+
+        .accept_offer_list_price {
+            font-size: 14px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 24px;
+        }
+    }
+
+    .final_income {
+        display: flex;
+        justify-content: space-between;
+        margin-bottom: 30px;
+
+        .final_income_title {
+            font-size: 14px;
+            font-weight: 400;
+            color: #ffffff;
+            line-height: 24px;
+        }
+
+        .final_income_price {
+            font-size: 16px;
+            font-weight: bold;
+            color: #00fe1e;
+            line-height: 24px;
+        }
+    }
+
+    .accept_offer_btn {
+        display: flex;
+        justify-content: space-between;
+        font-size: 16px;
+        font-weight: bold;
+        line-height: 38px;
+        text-align: center;
+
+        .accept_offer_btn_left {
+            width: calc(32vw);
+            height: 38px;
+            background: #2d2b2b;
+            border-radius: 8px;
+            color: #ffffff;
+        }
+
+        .accept_offer_btn_right {
+            width: calc(32vw);
+            height: 38px;
+            background: #00fe1e;
+            border-radius: 8px;
+            color: #000000;
+        }
+    }
+}
+
 .product_top_one {
     height: 50px;
     font-size: 16px;
     font-weight: bold;
     color: #ffffff;
     line-height: 50px;
+    background: #0f0f0f;
     text-align: center;
     position: relative;
 
@@ -254,11 +486,8 @@ export default {
                 }
 
                 .product_left_time {
-                    max-width: 114px;
                     height: 17px;
-                    background: #232323;
                     border-radius: 2px;
-                    text-align: center;
                     font-size: 10px;
                     font-weight: 400;
                     color: #939599;
@@ -362,6 +591,7 @@ export default {
         }
 
         .box-list_con_right_con_btns {
+            float: right;
             margin-top: 8px;
             width: 38px;
             height: 22px;

+ 275 - 0
src/views/search/SearchAll.vue

@@ -0,0 +1,275 @@
+<template>
+    <div class="page">
+        <img class="banner" src="@assets/png-searchAll-bg.png" alt="" />
+        <div class="search-box">
+            <van-field
+                class="search"
+                type="text"
+                enterkeyhint="search"
+                v-model="search"
+                placeholder="绿洲宇宙全域搜索,请输入"
+                @keyup="onKey"
+                @click-right-icon="clickRight"
+            >
+                <template #right-icon>
+                    <img class="search-right" src="@assets/search_sosuo.png" alt="" />
+                </template>
+            </van-field>
+        </div>
+
+        <div class="back-content" @click="goBack">
+            <img src="@assets/icon_fanhui2.png" alt="" />
+        </div>
+
+        <div class="hot-content" v-if="historys.length > 0">
+            <div class="title">
+                <span>最近搜索</span>
+                <img src="@assets/icon-delete.png" @click="clear" alt="" />
+            </div>
+            <div class="hot-list">
+                <span v-for="(item, index) in historys" :key="index" @click="getSearch(item)">{{ item }}</span>
+            </div>
+        </div>
+        <div style="height: 40px" v-else></div>
+
+        <div class="news-content">
+            <div class="title">绿洲宇宙全域公告</div>
+            <div class="news-list">
+                <div class="news" v-for="(item, index) in news" :key="index" @click="goDetail(item)">
+                    <div class="news-info">
+                        <div class="text1" :class="[item.obj.subtitle ? 'van-ellipsis' : 'van-multi-ellipsis--l2']">
+                            {{ item.obj.title }}
+                        </div>
+                        <div class="text2 van-ellipsis">{{ item.obj.subtitle }}</div>
+                        <div class="flex1"></div>
+                        <div class="time">{{ getTime(item.obj.createdAt) }}</div>
+                    </div>
+                    <van-image width="160" height="70" radius="8" :src="item.obj.pic" fit="cover" />
+                    <img src="@assets/search-all-newsBg.png" class="news-bg" alt="" />
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import search from '../../mixins/search';
+let fromRoute = null;
+export default {
+    mixins: [search],
+    data() {
+        return {
+            search: '',
+            news: []
+        };
+    },
+    mounted() {
+        this.getNews();
+    },
+    beforeRouteEnter(to, from) {
+        fromRoute = from;
+    },
+    methods: {
+        clear() {
+            this.$dialog
+                .confirm({
+                    message: '确定要清除全部搜索记录吗?'
+                })
+                .then(() => {
+                    this.clearHistory();
+                });
+        },
+        getSearch(item) {
+            this.$router.push('/searchResult?search=' + item);
+        },
+        clickRight() {
+            this.getSearch(this.search);
+        },
+        onKey(e) {
+            console.log(e.keyCode);
+            if (e.keyCode === 13) {
+                this.addHistory(this.search);
+                this.$router.push('/searchResult?search=' + this.search);
+            }
+        },
+        getNews() {
+            return this.$http.get('/collection/recommend').then(res => {
+                this.news = res
+                    .filter(item => {
+                        return item.type === 'news';
+                    })
+                    .slice(0, 3);
+                return Promise.resolve();
+            });
+        },
+        getTime(time) {
+            return this.dayjs(time).format('MM月DD hh:mm');
+        },
+        goDetail(info) {
+            this.$router.push({
+                path: '/newsDetail',
+                query: {
+                    id: info.id
+                }
+            });
+        },
+        goBack() {
+            if (!fromRoute || !fromRoute.name || fromRoute.meta.pageType === 1) {
+                this.$router.replace('/home');
+            } else {
+                this.$router.back();
+            }
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+    background-color: #000;
+    min-height: var(--app-height) !important;
+    position: relative;
+    padding-top: 45.3vw;
+}
+
+.banner {
+    width: 100%;
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+
+.search-box {
+    padding: 0 20px;
+    .search-right {
+        width: 16px;
+        height: 16px;
+        margin-top: 1px;
+        display: block;
+    }
+
+    .search {
+        background: linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(0, 0, 0, 0.1) 100%);
+        border-radius: 20px;
+        border: 1px solid #ffffff;
+        backdrop-filter: blur(4px);
+        --van-field-input-text-color: #fff;
+        --van-field-placeholder-text-color: #fff;
+        font-family: AlimamaShuHeiTi;
+        --van-cell-vertical-padding: 7px;
+    }
+}
+.hot-content {
+    padding: 24px 20px;
+    .title {
+        .flex();
+        font-size: 16px;
+        font-family: AlimamaShuHeiTi;
+        color: #ffffff;
+        line-height: 24px;
+        img {
+            width: 18px;
+            height: 18px;
+            margin-left: 5px;
+        }
+    }
+
+    .hot-list {
+        span {
+            background: rgba(255, 255, 255, 0.1);
+            border-radius: 4px;
+            font-size: 12px;
+            color: #6f6f70;
+            line-height: 22px;
+            padding: 0 10px;
+            margin: 12px 12px 0 0;
+            display: inline-block;
+        }
+    }
+}
+
+.news-content {
+    padding: 0 20px;
+
+    .news {
+        .flex();
+        align-items: stretch;
+        position: relative;
+        padding: 18px;
+        .van-image {
+            flex-shrink: 0;
+        }
+    }
+    .news + .news {
+        margin-top: 8px;
+    }
+    .title {
+        font-size: 16px;
+        font-family: AlimamaShuHeiTi;
+        color: #ffffff;
+        line-height: 24px;
+    }
+
+    .news-list {
+        padding: 16px 0 50px;
+    }
+
+    .news-info {
+        flex-grow: 1;
+        .flex-col();
+        overflow: hidden;
+
+        .text1 {
+            font-size: 14px;
+            color: #ffffff;
+            line-height: 24px;
+        }
+        .text2 {
+            font-size: 12px;
+            color: #6f6f70;
+            line-height: 24px;
+        }
+        .flex1 {
+            flex-grow: 1;
+        }
+
+        .time {
+            font-size: 12px;
+            color: #6f6f70;
+            line-height: 12px;
+        }
+    }
+
+    .news-bg {
+        position: absolute;
+        top: 0;
+        right: 0;
+        bottom: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+    }
+}
+
+.back-content {
+    width: 34px;
+    height: 34px;
+    background: rgba(0, 0, 0, 0.5);
+    backdrop-filter: blur(1px);
+    .flex();
+    justify-content: center;
+    border-radius: 100px;
+    box-sizing: border-box;
+
+    img {
+        width: 18px;
+        height: 18px;
+    }
+
+    position: fixed;
+    left: 16px;
+    top: calc(var(--safe-top) + 16px);
+    z-index: 90;
+}
+</style>

+ 671 - 0
src/views/search/SearchDetail.vue

@@ -0,0 +1,671 @@
+<template>
+    <div
+        class="search"
+        success-text="加载成功"
+        success-duration="500"
+        pageType="light"
+        :style="{ backgroundImage: `url(${require('@/assets/searchBg.jpg')})` }"
+    >
+        <van-sticky ref="top" class="list-top" :offset-top="bar && bar.show ? bar.height : 0">
+            <van-search
+                ref="top"
+                shape="round"
+                v-model="search"
+                placeholder="请输入"
+                show-action
+                autofocus
+                left-icon=""
+                @search="getSearch"
+            >
+                <template #action>
+                    <div v-if="!isSearch" @click="getSearch(search)">搜索</div>
+                    <div v-else @click="onCancel">取消</div>
+                </template>
+            </van-search>
+            <van-tabs
+                v-model:active="sort"
+                :ellipsis="false"
+                line-width="16"
+                line-height="2"
+                @click-tab="changeTab"
+                :class="{ trans: source == 'TRANSFER' }"
+            >
+                <van-tab
+                    :title="item.label"
+                    :name="item.value"
+                    :title-class="item.type === 'select' && sortDes ? sortDes : ''"
+                    :key="index"
+                    :lazy-render="false"
+                    v-for="(item, index) in selectOptions"
+                >
+                    <template v-if="item.type === 'select'" #title>
+                        <div class="tab">
+                            <span>{{ item.label }}</span>
+                            <van-icon size="8" name="arrow-up" />
+                            <van-icon size="8" name="arrow-down" />
+                        </div>
+                    </template>
+                </van-tab>
+            </van-tabs>
+            <!-- <van-checkbox
+                v-if="isSearch && source == 'TRANSFER' && !title"
+                @change="getData(true)"
+                class="sala"
+                v-model="salable"
+                >仅看在售</van-checkbox
+            > -->
+
+            <van-button
+                @click="changeSort"
+                v-if="isSearch && source == 'TRANSFER' && !title"
+                class="sala"
+                color="#F5F7FA"
+                type="primary"
+                size="small"
+                icon="arrow-down"
+                icon-position="right"
+                round
+                >{{ salable ? '在售中' : salable === false ? '仅展示' : '综合排序' }}</van-button
+            >
+        </van-sticky>
+
+        <van-action-sheet
+            v-model:show="showAction"
+            @select="selectAction"
+            :actions="actions"
+            cancel-text="取消"
+            close-on-click-action
+        />
+        <van-list
+            class="list"
+            v-model:loading="loading"
+            :immediate-check="false"
+            :finished="finished"
+            finished-text=""
+            @load="getData"
+            v-show="isSearch"
+        >
+            <template v-for="(item, index) in list" :key="index">
+                <product-info dark v-model:info="list[index]" @update:info="init"></product-info>
+            </template>
+            <van-empty v-if="empty" description="什么都没有搜到哦~" :image="require('@assets/kong_png_wusousuo.png')" />
+        </van-list>
+    </div>
+</template>
+
+<script>
+import ProductInfo from '../../components/product/productInfo.vue';
+import product from '../../mixins/product';
+import list from '../../mixins/list';
+import search from '../../mixins/search';
+export default {
+    name: 'productSearch',
+    components: { ProductInfo },
+    inject: ['bar', 'setKeeps', 'scrollWrapper', 'changeScroll'],
+    mixins: [product, list, search],
+    setup() {
+        let swiperRef = null;
+
+        const setSwiperRef = swiper => {
+            swiperRef = swiper;
+        };
+
+        return { swiperRef: null, setSwiperRef };
+    },
+    data() {
+        return {
+            list: [],
+            beforeSort: '',
+            empty: false,
+            search: '',
+            stiky: null,
+            type: '',
+            source: '',
+            minterId: '',
+            url: '/collection/all',
+            scrollTop: 0,
+            sort: 'id,desc',
+            sortDes: '',
+            title: '',
+            selectOptions: [
+                {
+                    label: '全部',
+                    value: 'id,desc'
+                },
+                {
+                    label: '最新',
+                    value: 'createdAt,desc'
+                },
+                {
+                    label: '最热',
+                    value: 'likes,desc'
+                },
+                {
+                    label: '价格',
+                    value: 'price',
+                    type: 'select'
+                }
+            ],
+            salable: '',
+            showAction: false,
+            showHall: false,
+            settings: [],
+            banners: []
+        };
+    },
+    watch: {
+        isSearch() {
+            this.changeScroll(0);
+        }
+    },
+    computed: {
+        actions() {
+            let list = [{ name: '综合排序' }, { name: '在售中' }, { name: '仅展示' }];
+            if (this.salable === '') {
+                list[0].color = this.$colors.prim;
+            }
+            if (this.salable === true) {
+                list[1].color = this.$colors.prim;
+            }
+            if (this.salable === false) {
+                list[2].color = this.$colors.prim;
+            }
+            return list;
+        },
+        tabs() {
+            let settings = [...this.settings];
+            let banners = [...this.banners];
+            return settings.map(item => {
+                return {
+                    ...item,
+                    children: banners.filter(banner => {
+                        return banner.settingId === item.id;
+                    })
+                };
+            });
+        }
+    },
+    mounted() {
+        this.$store.dispatch('getUsedBuy');
+        if (this.$route.query.type) {
+            this.type = this.$route.query.type;
+        }
+        if (this.$route.query.source) {
+            this.source = this.$route.query.source;
+            this.salable = true;
+            this.sort = 'createdAt,desc';
+        }
+        if (this.$route.query.minterId) {
+            this.minterId = this.$route.query.minterId;
+        }
+        if (this.$route.query.title) {
+            this.title = this.$route.query.title;
+        }
+        if (this.$route.query.search) {
+            this.search = this.$route.query.search;
+            this.getSearch(this.search);
+        }
+
+        this.$http
+            .get('/sysConfig/get/hall_show')
+            .then(res => {
+                if (res.value === true || res.value === '1') {
+                    this.showHall = true;
+                } else {
+                    return Promise.reject();
+                }
+            })
+            .catch(() => {
+                this.showHall = false;
+            });
+
+        this.$http
+            .post('/setting/byFlag', { flag: 1 })
+            .then(res => {
+                this.settings = res;
+                this.$http
+                    .post(
+                        '/banner/all',
+                        {
+                            query: {
+                                type: 'MARKET',
+                                del: false
+                            },
+                            size: 999,
+                            sort: 'sort,asc;createdAt,desc'
+                        },
+                        { body: 'json' }
+                    )
+                    .then(res => {
+                        this.banners = res.content;
+                        this.$nextTick(() => {
+                            if (this.swiperRef) {
+                                this.swiperRef.update();
+                            }
+                        });
+                    });
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+
+        this.emitter.on('updateList', info => {
+            let list = [...this.list];
+            list.forEach((item, index) => {
+                if (info.id === item.id) {
+                    list[index] = info;
+                }
+            });
+            this.list = list;
+        });
+    },
+    methods: {
+        onCancel() {
+            this.$router.back();
+        },
+        clear() {
+            this.$dialog
+                .confirm({
+                    message: '确定要清除全部搜索记录吗?'
+                })
+                .then(() => {
+                    this.clearHistory();
+                });
+        },
+        changeSort() {
+            this.showAction = true;
+        },
+        selectAction(action) {
+            if (action.name == '综合排序') {
+                this.salable = '';
+            }
+            if (action.name == '在售中') {
+                this.salable = true;
+            }
+            if (action.name == '仅展示') {
+                this.salable = false;
+            }
+            this.getData(true);
+        },
+        changeTab(info) {
+            this.$nextTick(() => {
+                if (info.name === 'price') {
+                    this.sortDes = this.sortDes == 'desc' ? 'asc' : 'desc';
+                }
+                this.getData(true);
+            });
+        },
+        beforeData() {
+            let sort = this.sort;
+            if (sort == 'price') {
+                sort = 'price,' + this.sortDes;
+            }
+            let type = this.type;
+            if (!type && !this.showHall) {
+                type = 'DEFAULT,BLIND_BOX';
+            }
+            return {
+                query: {
+                    onShelf: true,
+                    type: type,
+                    source: this.source,
+                    minterId: this.minterId,
+                    del: false,
+                    salable: this.salable
+                },
+                search: this.search,
+                sort: this.sort === 'id,desc' ? this.sortOptions[this.title] || sort : sort
+            };
+        },
+        onRefresh() {
+            if (this.isSearch) {
+                this.getData(true).then(() => {
+                    this.isLoading = false;
+                });
+            } else {
+                this.isLoading = false;
+                // this.$http.get('sysConfig/get/hot_search').then(res => {
+                //     this.hots = res.value.split(',').filter(item => {
+                //         return item !== ' ' && !!item;
+                //     });
+
+                //     this.isLoading = false;
+                // });
+                // this.getHistory();
+            }
+        },
+        isNew(info) {
+            let date1 = this.dayjs(info.createdAt).add(1, 'week');
+
+            return date1.isAfter(this.dayjs());
+        }
+    },
+    activated() {
+        this.$nextTick(() => {
+            this.changeScroll(this.scrollTop);
+
+            // setTimeout(() => {
+            //     this.sort = this.beforeSort;
+            // }, 1000);
+        });
+    },
+    beforeRouteLeave(to, from, next) {
+        if (to.name === 'productDetail') {
+            this.beforeSort = this.sort;
+            this.scrollTop = this.scrollWrapper.scrollTop;
+            this.setKeeps(['productSearch']);
+        } else {
+            this.beforeSort = '';
+            this.scrollTop = 0;
+            this.setKeeps(['productSearch'], false);
+        }
+        next();
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.search {
+    padding-bottom: 100px;
+    background-repeat: repeat-y;
+    background-size: 100% auto;
+}
+/deep/.van-search {
+    --van-search-background-color: transparent;
+    --van-search-content-background-color: linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(0, 0, 0, 0.1) 100%);
+    --van-field-input-text-color: #00fe1e;
+    .van-field__control {
+        font-size: 16px;
+        font-family: AlimamaShuHeiTi;
+        line-height: 24px;
+    }
+
+    .van-search__content {
+        border: 1px solid #ffffff;
+    }
+
+    .van-field__left-icon {
+        display: flex;
+        align-items: center;
+    }
+    .van-icon {
+        display: flex;
+        align-items: center;
+    }
+    .van-search__action {
+        color: @text4;
+    }
+}
+
+.top {
+    background-color: @bg3;
+    padding: 0 16px;
+    height: 50px;
+    display: flex;
+    align-items: center;
+    .name {
+        font-size: 20px;
+        // font-weight: bold;
+        color: @prim;
+        line-height: 30px;
+    }
+}
+
+/deep/.trans {
+    .van-tab {
+        margin-right: 30px;
+    }
+}
+
+.list-top {
+    position: relative;
+}
+/deep/.van-tabs {
+    .van-tabs__nav {
+        padding-left: 16px;
+    }
+}
+.list {
+    padding: 8px 8px 100px;
+}
+// /deep/.van-tab {
+// flex-grow: 0;
+// padding: 0 0 0 0;
+// margin-right: 50px;
+
+.tab {
+    position: relative;
+    padding-right: 14px;
+    .van-icon {
+        position: absolute;
+        right: 0;
+
+        &.van-icon-arrow-down {
+            top: 8px;
+        }
+
+        &.van-icon-arrow-up {
+            bottom: 8px;
+        }
+    }
+}
+/deep/.van-tab--active {
+    .tab {
+        .van-icon-arrow-up {
+            color: #646566;
+        }
+    }
+    &.asc {
+        .tab {
+            .van-icon-arrow-up {
+                color: @prim;
+            }
+            .van-icon-arrow-down {
+                color: #646566;
+            }
+        }
+    }
+}
+// .van-tabs {
+//     background-color: @bg;
+// }
+/deep/.van-tabs__nav--line.van-tabs__nav--complete {
+    border-width: 0;
+}
+
+/deep/.van-sticky--fixed {
+    background-color: #000;
+}
+
+.hot-content {
+    padding: 10px 0 6px 16px;
+
+    .title {
+        font-size: @font2;
+        color: #000000;
+        line-height: 24px;
+        font-weight: normal;
+        .flex();
+
+        img {
+            width: 18px;
+            height: 18px;
+            margin-left: 6px;
+        }
+    }
+
+    .hot-list {
+        span {
+            display: inline-block;
+            font-size: @font1;
+            color: @text4;
+            line-height: 22px;
+            padding: 0 12px;
+            margin: 6px 16px 0 0;
+            background: @bg;
+            border-radius: 12px;
+        }
+    }
+}
+
+/deep/.sala {
+    position: absolute;
+    right: 16px;
+    top: 60px;
+    color: @text3!important;
+    min-width: 92px;
+    font-size: 14px;
+    // .van-checkbox__icon {
+    //     color: #fff;
+    //     transform: scale(0.6);
+
+    //     .van-icon {
+    //         border-color: @text3;
+    //     }
+
+    //     &.van-checkbox__icon--checked {
+    //         .van-icon {
+    //             border-width: 0;
+    //             .linear();
+    //             &::before {
+    //                 color: #fff;
+    //             }
+    //         }
+    //     }
+    // }
+    // .van-checkbox__label {
+    //     color: @text3;
+    //     margin-left: 0px;
+    //     font-size: @font1;
+    // }
+}
+.mySwiper {
+    padding: 16px;
+}
+.tab-slide {
+    width: 240px;
+    background: #ffffff;
+    border-radius: 4px;
+    height: 457px;
+    overflow: auto;
+    position: relative;
+    .tab-top {
+        position: sticky;
+        top: 0;
+        z-index: 2;
+        img {
+            width: 240px;
+            height: 44px;
+        }
+        span {
+            position: absolute;
+            font-size: 14px;
+            font-weight: bold;
+            color: #3ab200;
+            line-height: 44px;
+            top: 0;
+            left: 12px;
+        }
+    }
+    .tab-item {
+        height: 37px;
+        .flex();
+        padding: 0 12px;
+        position: relative;
+        z-index: 1;
+        .text1 {
+            flex-grow: 1;
+            margin: 0 6px;
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
+        }
+
+        .num {
+            font-size: 12px;
+            color: #ffffff;
+            line-height: 14px;
+            background-color: #00000044;
+            width: 14px;
+            text-align: center;
+            flex-shrink: 0;
+        }
+
+        .new {
+            font-size: 10px;
+            color: #ff733c;
+            line-height: 14px;
+            width: 14px;
+            flex-shrink: 0;
+            background-color: #ff733c20;
+            text-align: center;
+        }
+        &:nth-child(1) {
+            .num {
+                background: linear-gradient(180deg, #f48753 0%, #e54f29 100%);
+            }
+        }
+        &:nth-child(2) {
+            .num {
+                background: linear-gradient(180deg, #ffa934 0%, #f16f25 100%);
+            }
+        }
+        &:nth-child(3) {
+            .num {
+                background: linear-gradient(180deg, #f8c246 0%, #ff9819 100%);
+            }
+        }
+
+        &::after {
+            content: '';
+            left: 12px;
+            right: 12px;
+            height: 1px;
+            background: #f4f5f7;
+            position: absolute;
+            bottom: 0;
+        }
+
+        &:last-child {
+            z-index: 3;
+            background-color: #fff;
+            &::after {
+                content: '';
+                height: 52px;
+                background: #fff;
+                position: absolute;
+                left: 0;
+                right: 0;
+                bottom: -52px;
+                z-index: 2;
+            }
+        }
+
+        &:nth-last-child(2) {
+            &::after {
+                content: none;
+            }
+        }
+    }
+
+    .more {
+        padding: 10px 0;
+        background-color: #fff;
+        .flex-col();
+        align-items: center;
+        img {
+            width: 16px;
+            height: 16px;
+        }
+        div {
+            font-size: 10px;
+            color: rgba(0, 0, 0, 0.2);
+            line-height: 10px;
+        }
+        position: sticky;
+        bottom: 0;
+        z-index: 2;
+    }
+}
+</style>

+ 283 - 0
src/views/search/SearchResult.vue

@@ -0,0 +1,283 @@
+<template>
+    <div class="page" :style="{ backgroundImage: `url(${require('@/assets/searchBg.jpg')})` }">
+        <van-sticky :offset-top="topHeight + 46">
+            <van-search
+                clearable
+                shape="round"
+                left-icon=""
+                v-model="search"
+                placeholder="请输入搜索关键词"
+                @search="getSearch"
+            />
+        </van-sticky>
+
+        <div class="content">
+            <van-tabs v-if="!loading" ref="tabs" v-model:active="active" scrollspy sticky :offset-top="topHeight + 106">
+                <van-tab
+                    v-for="(item, index) in options"
+                    :title-class="item.listKey && searchInfo[item.listKey].length <= 0 ? 'hideTab' : ''"
+                    :key="searchKey + index"
+                    :title="item.label"
+                >
+                    <div class="tab-title" v-if="item.listKey && searchInfo[item.listKey].length > 0">
+                        {{ item.label }}
+                    </div>
+                    <div
+                        class="van-list"
+                        :class="{
+                            list:
+                                item.listKey === 'news' || item.listKey === 'mintActivities' || item.listKey === 'users'
+                        }"
+                    >
+                        <template v-if="item.listKey">
+                            <component
+                                :is="item.com"
+                                dark
+                                v-model:info="searchInfo[item.listKey][infoIndex]"
+                                v-for="(info, infoIndex) in searchInfo[item.listKey]"
+                                :key="infoIndex"
+                                list
+                            ></component>
+                        </template>
+                    </div>
+                </van-tab>
+            </van-tabs>
+        </div>
+    </div>
+</template>
+
+<script>
+import ProductInfo from '@/components/product/productInfo.vue';
+import NewsRecord from '@/components/product/NewsRecord.vue';
+import ActivityRecord from '@/components/product/ActivityRecord.vue';
+import ShowInfo from '@/components/asset/showInfo.vue';
+import CreatorSmall from '@/components/creator/CreatorSmall.vue';
+import CreatorInfo from '@/components/creator/CreatorInfoList.vue';
+
+export default {
+    name: 'searchResult',
+    inject: ['setKeeps', 'scrollWrapper', 'changeScroll', 'bodyScroll', 'safeTop'],
+    data() {
+        return {
+            search: '',
+            searchKey: '',
+            active: 0,
+            loading: true,
+            options: [
+                {
+                    label: '数字商品',
+                    com: 'ProductInfo',
+                    listKey: 'collections'
+                },
+                {
+                    label: '元域名',
+                    com: 'ProductInfo',
+                    listKey: 'domains'
+                },
+                {
+                    label: '个人作品',
+                    com: 'ProductInfo',
+                    listKey: 'pictures'
+                },
+                {
+                    label: '新闻头条',
+                    com: 'NewsRecord',
+                    listKey: 'news'
+                },
+                {
+                    label: '铸造中心',
+                    com: 'ActivityRecord',
+                    listKey: 'mintActivities'
+                },
+                {
+                    label: '艺术机构',
+                    com: 'CreatorSmall',
+                    listKey: 'minters'
+                },
+                {
+                    label: '个人用户',
+                    com: 'CreatorInfo',
+                    listKey: 'users'
+                },
+                {
+                    label: '数字展览',
+                    com: 'ShowInfo',
+                    listKey: 'showrooms'
+                }
+            ],
+            searchInfo: {
+                collections: [],
+                domains: [],
+                pictures: [],
+                news: [],
+                mintActivities: [],
+                minters: [],
+                users: []
+            },
+            scrollTop: 0
+        };
+    },
+    components: {
+        NewsRecord,
+        ActivityRecord,
+        ProductInfo,
+        ShowInfo,
+        CreatorSmall,
+        CreatorInfo
+    },
+    computed: {
+        topHeight() {
+            let safeTop = this.safeTop.replace(/px/, '');
+            return Number(safeTop);
+        },
+        showOptions() {
+            let options = [...this.options];
+            return options.filter(item => {
+                return this.searchInfo[item.listKey] && this.searchInfo[item.listKey].length > 0;
+            });
+        }
+    },
+    mounted() {
+        if (this.$route.query.search) {
+            this.search = this.$route.query.search;
+        }
+        this.getSearch();
+    },
+    methods: {
+        getSearch() {
+            this.loading = true;
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.searchKey = this.search;
+            this.$http
+                .post('/statistic/globalSearch', {
+                    search: this.search
+                })
+                .then(res => {
+                    this.loading = false;
+                    this.$toast.clear();
+                    this.searchInfo = res;
+                    this.$nextTick(() => {
+                        this.$forceUpdate();
+                    });
+                });
+        }
+    },
+    activated() {
+        this.$nextTick(() => {
+            this.changeScroll(this.scrollTop);
+
+            // setTimeout(() => {
+            //     this.sort = this.beforeSort;
+            // }, 1000);
+        });
+    },
+    beforeRouteLeave(to, from, next) {
+        if (
+            to.name === 'productDetail' ||
+            to.path === '/newsDetail' ||
+            to.path === '/activityDetail' ||
+            to.path === '/creatorDetail' ||
+            to.path === '/hall'
+        ) {
+            this.beforeSort = this.sort;
+            this.scrollTop = this.scrollWrapper.scrollTop;
+            this.setKeeps(['searchResult']);
+        } else {
+            this.beforeSort = '';
+            this.scrollTop = 0;
+            this.setKeeps(['searchResult'], false);
+        }
+        next();
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+    min-height: var(--app-height);
+    background-repeat: repeat-y;
+    background-size: 100% auto;
+}
+/deep/.van-search {
+    --van-search-background-color: transparent;
+    --van-search-content-background-color: linear-gradient(90deg, rgba(255, 255, 255, 0.2) 0%, rgba(0, 0, 0, 0.1) 100%);
+    --van-field-input-text-color: #00fe1e;
+    .van-search__field {
+        padding: 8px var(--van-padding-xs) 8px 5px;
+    }
+    .van-field__control {
+        font-size: 16px;
+        font-family: AlimamaShuHeiTi;
+        line-height: 24px;
+    }
+
+    .van-search__content {
+        border: 1px solid #ffffff;
+    }
+}
+/deep/.van-tabs__nav--line.van-tabs__nav--complete {
+    border-top-width: 0;
+}
+/deep/.van-sticky--fixed {
+    background-color: #000;
+}
+
+/deep/.van-tabs__nav {
+    --van-tabs-nav-background-color: transparent;
+}
+
+/deep/.hideTab {
+    display: none;
+}
+
+/deep/.van-tabs__nav {
+    padding-left: 16px;
+    padding-right: 16px;
+}
+
+.tab-title {
+    font-size: 14px;
+    color: #ffffff;
+    line-height: 24px;
+    padding: 10px 16px 7px;
+    // position: sticky;
+    // z-index: 20;
+    // top: calc(var(--safe-top) + 148px);
+    // background-color: #000;
+}
+
+.block {
+    width: 100px;
+    height: 100px;
+}
+
+.van-list {
+    padding: 8px;
+    --bg2: #2b2b2c;
+    --text0: #fff;
+    --btnplaintBg: rgba(255, 255, 255, 0.08);
+    --btnplaintBorder: rgba(255, 255, 255, 0.08);
+    --border: rgba(255, 255, 255, 0.08);
+    .news-record {
+        border-radius: 0;
+    }
+    .showInfo {
+        background-color: #2b2b2c;
+        border-radius: 12px;
+        margin: 0 8px;
+    }
+    .showInfo + .showInfo {
+        margin-top: 16px;
+    }
+}
+
+.list {
+    margin: 8px 16px 0;
+    padding: 0;
+    border-radius: 8px;
+    overflow: hidden;
+}
+</style>

+ 1 - 0
src/views/user/BalanceRecord.vue

@@ -45,6 +45,7 @@ export default {
             balanceTypes: {
                 WITHDRAW: '提现',
                 SELL: '藏品出售',
+                ASK: '元域名出价出售',
                 RETURN: '打款失败',
                 PAY: '订单支付',
                 RECHARGE: '充值',

+ 2 - 1
src/views/user/Rice.vue

@@ -4,7 +4,7 @@
             <div class="back-conetnt" @click="goBack">
                 <img src="@assets/icon_fanhui2.png" alt="" />
             </div>
-            <span class="title">绿洲水稻</span>
+            <span class="title">绿洲农耕</span>
         </div>
         <iframe
             class="game"
@@ -143,6 +143,7 @@ export default {
 .page {
     min-height: var(--app-height) !important;
     background-color: #272b2e;
+    padding-bottom: var(--safe-bottom);
     // background: linear-gradient(181deg, #7dbdff 0%, #7ebdff 54%, #61c65e 61%, #61c65d 100%);
     // .flex-col();
     // justify-content: center;

+ 96 - 0
src/views/user/SuperLink.vue

@@ -0,0 +1,96 @@
+<template>
+    <div class="page">
+        <div class="list">
+            <div class="link" v-for="(item, index) in list" :key="index">
+                <van-image width="40" height="" :src="getImg(changeImgs(item.pic, 600))" type="contain" />
+                <img src="@assets/png-da-zi.png" alt="" class="hr" />
+                <div class="link-info">
+                    <div class="text1">{{ item.domainName }}</div>
+                    <div class="text2">已绑定{{ getTypeLabel(item) }}</div>
+                </div>
+                <div class="link-btns">
+                    <div class="link-btn" @click="goReview(item)">预览</div>
+                    <div class="link-btn" @click="goChange(item)">更改</div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import product from '@/mixins/product';
+import superLink from '@/mixins/superLink';
+export default {
+    data() {
+        return {
+            list: []
+        };
+    },
+    mixins: [product, superLink],
+    mounted() {
+        this.$http.get('/domainOrder/showMyHyperLink').then(res => {
+            this.list = res;
+        });
+    },
+    methods: {
+        goChange(info) {
+            this.$router.push('/superLinkType?id=' + info.createAssetId);
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+    background-color: #0f0f0f;
+    padding: 10px 16px;
+}
+
+.link {
+    .flex();
+    background: #1e1e1e;
+    border-radius: 8px;
+    padding: 12px;
+
+    .hr {
+        width: 10px;
+        margin: 0 8px;
+    }
+
+    .link-info {
+        flex-grow: 1;
+        .text1 {
+            font-size: 14px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 24px;
+        }
+
+        .text2 {
+            font-size: 10px;
+            color: #939599;
+            line-height: 17px;
+            margin-top: 2px;
+        }
+    }
+    .link-btns {
+        .flex();
+        .link-btn {
+            background: rgba(255, 225, 150, 0.1);
+            border-radius: 8px;
+            border: 1px solid #ffe196;
+            font-size: 13px;
+            color: #ffe196;
+            line-height: 24px;
+            padding: 0 10px;
+
+            &:nth-child(2) {
+                border: 1px solid #00fe1e;
+                color: #00fe1e;
+            }
+        }
+    }
+    .link-btn + .link-btn {
+        margin-left: 13px;
+    }
+}
+</style>