Bläddra i källkod

Merge branch 'dev' of http://git.izouma.com/xiongzhu/raex_front into 拍卖

panhui 4 år sedan
förälder
incheckning
88ab335db2
92 ändrade filer med 2443 tillägg och 754 borttagningar
  1. 1 0
      package.json
  2. 2 1
      src/App.vue
  3. BIN
      src/assets/._bg.png
  4. BIN
      src/assets/bg.png
  5. BIN
      src/assets/bg_wallet.png
  6. 0 0
      src/assets/empty_img_asset.png
  7. 0 0
      src/assets/empty_img_asset_dark.png
  8. BIN
      src/assets/icon-huodongguize.png
  9. BIN
      src/assets/icon-jifen1.png
  10. BIN
      src/assets/icon-julishangyiming.png
  11. BIN
      src/assets/icon-leijiyaoqing.png
  12. BIN
      src/assets/icon-lvzhoushi.png
  13. BIN
      src/assets/icon-paiming.png
  14. BIN
      src/assets/icon-yaoqingjilv.png
  15. BIN
      src/assets/icon-zhuye.png
  16. BIN
      src/assets/icon_RMB.png
  17. BIN
      src/assets/icon_balance.png
  18. BIN
      src/assets/icon_balance_add.png
  19. BIN
      src/assets/icon_balance_min.png
  20. BIN
      src/assets/icon_dialog_close.png
  21. BIN
      src/assets/icon_gouxuan_huise1.png
  22. BIN
      src/assets/kong_png_yongyoude (2).png
  23. BIN
      src/assets/kong_png_yongyoude .png
  24. BIN
      src/assets/png-yaoqingjilv.png
  25. BIN
      src/assets/records.png
  26. BIN
      src/assets/task_icon_no1.png
  27. BIN
      src/assets/task_icon_no2.png
  28. BIN
      src/assets/task_icon_no3.png
  29. 2 2
      src/components/PageBar.vue
  30. 111 0
      src/components/PayMethodPick.vue
  31. 3 3
      src/components/Post.vue
  32. 2 2
      src/components/asset/assetInfo.vue
  33. 2 2
      src/components/asset/showInfo.vue
  34. 141 0
      src/components/creator/CreatorSmall.vue
  35. 1 1
      src/components/order/OrderInfo.vue
  36. 2 2
      src/components/order/OrderOpen.vue
  37. 138 0
      src/components/phoneCode.vue
  38. 1 1
      src/components/product/NewsInfo.vue
  39. 1 1
      src/components/product/NewsLarge.vue
  40. 3 3
      src/components/product/Tasks.vue
  41. 2 2
      src/components/product/productInfo.vue
  42. 1 1
      src/components/product/productLarge.vue
  43. 7 0
      src/main.js
  44. 5 1
      src/mixins/banner.js
  45. 9 0
      src/mixins/common.js
  46. 80 54
      src/router/index.js
  47. 8 8
      src/styles/app.less
  48. 1 0
      src/views/Creator.vue
  49. 17 4
      src/views/Discover.vue
  50. 76 63
      src/views/Givesubmit.vue
  51. 1 1
      src/views/Home.vue
  52. 29 25
      src/views/Mine.vue
  53. 4 2
      src/views/Store.vue
  54. 133 214
      src/views/Submit.vue
  55. 1 0
      src/views/account/Login.vue
  56. 1 0
      src/views/account/Register.vue
  57. 7 7
      src/views/activity/ChooseProduct.vue
  58. 4 4
      src/views/activity/Detail1.vue
  59. 50 48
      src/views/activity/Submit.vue
  60. 1 1
      src/views/asset/Consignment.vue
  61. 50 7
      src/views/asset/Detail.vue
  62. 1 5
      src/views/asset/GiveSearch.vue
  63. 1 0
      src/views/asset/Search.vue
  64. 1 5
      src/views/creator/Detail.vue
  65. 264 0
      src/views/creator/Home.vue
  66. 1 5
      src/views/creator/List.vue
  67. 7 3
      src/views/hall/Detail.vue
  68. 38 5
      src/views/hall/List.vue
  69. 5 5
      src/views/hall/Post.vue
  70. 4 4
      src/views/hall/ProductAdd.vue
  71. 4 4
      src/views/hall/ProductChoose.vue
  72. 2 2
      src/views/order/ActivityDetail.vue
  73. 1 0
      src/views/order/ActivityOrders.vue
  74. 2 2
      src/views/order/Detail.vue
  75. 1 0
      src/views/order/Orders.vue
  76. 222 0
      src/views/pay/BankPay.vue
  77. 13 7
      src/views/product/Detail.vue
  78. 3 5
      src/views/product/HopeMarket.vue
  79. 1 6
      src/views/product/List.vue
  80. 2 2
      src/views/product/NewsDetail.vue
  81. 1 5
      src/views/product/NewsList.vue
  82. 447 7
      src/views/product/Tasks.vue
  83. 1 1
      src/views/user/AddressEdit.vue
  84. 130 0
      src/views/user/BalanceRecord.vue
  85. 22 9
      src/views/user/Banks.vue
  86. 81 47
      src/views/user/BanksAdd.vue
  87. 2 2
      src/views/user/Exchange.vue
  88. 4 4
      src/views/user/Level.vue
  89. 1 1
      src/views/user/Point.vue
  90. 3 2
      src/views/user/Rank.vue
  91. 276 156
      src/views/user/Wallet.vue
  92. 5 0
      yarn.lock

+ 1 - 0
package.json

@@ -51,6 +51,7 @@
         "@vue/cli-plugin-vuex": "~4.5.0",
         "@vue/cli-service": "~4.5.0",
         "@vue/compiler-sfc": "^3.0.0",
+        "@vue/composition-api": "^1.6.1",
         "@vue/eslint-config-prettier": "^6.0.0",
         "babel-eslint": "^10.1.0",
         "eslint": "^6.7.2",

+ 2 - 1
src/App.vue

@@ -87,7 +87,8 @@ export default {
 
 <style lang="less" scoped>
 .scroll-content {
-    min-height: 100vh;
+    min-height: calc(100vh - 46px);
+    min-height: calc(var(--app-height) - 46px);
     box-sizing: border-box;
     // padding-top: 46px;
 }

BIN
src/assets/._bg.png


BIN
src/assets/bg.png


BIN
src/assets/bg_wallet.png


+ 0 - 0
src/assets/kong_png_yongyoude (1).png → src/assets/empty_img_asset.png


+ 0 - 0
src/assets/kong_png_yongyoude hei.png → src/assets/empty_img_asset_dark.png


BIN
src/assets/icon-huodongguize.png


BIN
src/assets/icon-jifen1.png


BIN
src/assets/icon-julishangyiming.png


BIN
src/assets/icon-leijiyaoqing.png


BIN
src/assets/icon-lvzhoushi.png


BIN
src/assets/icon-paiming.png


BIN
src/assets/icon-yaoqingjilv.png


BIN
src/assets/icon-zhuye.png


BIN
src/assets/icon_RMB.png


BIN
src/assets/icon_balance.png


BIN
src/assets/icon_balance_add.png


BIN
src/assets/icon_balance_min.png


BIN
src/assets/icon_dialog_close.png


BIN
src/assets/icon_gouxuan_huise1.png


BIN
src/assets/kong_png_yongyoude (2).png


BIN
src/assets/kong_png_yongyoude .png


BIN
src/assets/png-yaoqingjilv.png


BIN
src/assets/records.png


BIN
src/assets/task_icon_no1.png


BIN
src/assets/task_icon_no2.png


BIN
src/assets/task_icon_no3.png


+ 2 - 2
src/components/PageBar.vue

@@ -2,7 +2,7 @@
     <div class="bar">
         <div>
             <div class="text1">
-                <slot>第九空间</slot>
+                <slot>绿洲宇宙</slot>
             </div>
             <div class="text2">
                 <span> <slot name="sub"></slot></span>
@@ -29,7 +29,7 @@ export default {};
 
     .text2 {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 22px;
         margin-top: 4px;
         .prim {

+ 111 - 0
src/components/PayMethodPick.vue

@@ -0,0 +1,111 @@
+<template>
+    <div>
+        <template v-for="(item, index) in payConfig" :key="index">
+            <div class="pay-item" @click="pick(item)" v-if="item.show" :key="index">
+                <div class="img-icon">
+                    <img class="icon" :src="item.icon" alt="" />
+                </div>
+                <span>{{ item.name }}</span>
+                <img
+                    class="choose-icon"
+                    :src="item.enabled ? (checked === item.key ? icons[1] : icons[0]) : icons[2]"
+                    alt=""
+                />
+            </div>
+        </template>
+    </div>
+</template>
+<script>
+export default {
+    props: { modelValue: {} },
+    created() {
+        if (this.value) {
+            this.checked = this.value;
+        }
+        this.$http.get('/sysConfig/get/pay_config').then(res => {
+            let configs = JSON.parse(res.value);
+            if (this.inWeixin) {
+                configs.forEach(item => {
+                    if (item.key === 'ALIPAY') {
+                        item.key = 'ALIPAY_BRIDGE';
+                    }
+                });
+            }
+            this.payConfig = configs.sort((a, b) => a.sort - b.sort);
+            if (window.cordova && window.cordova.platformId === 'ios' && this.$store.state.review) {
+                this.checked = 'IAP';
+            } else {
+                this.checked = (configs.find(i => i.show && i.enabled) || {}).key;
+            }
+        });
+    },
+    data() {
+        return {
+            checked: null,
+            payConfig: [],
+            icons: [
+                require('@assets/svgs/icon_gouxuan_huise.svg'),
+                require('@assets/icon_gouxuan_pre.png'),
+                require('@assets/icon_gouxuan_huise1.png')
+            ],
+            inWeixin: /micromessenger/i.test(navigator.userAgent),
+            inApp: /#cordova#/i.test(navigator.userAgent),
+            inIos: /iPhone|iPad|iPod/i.test(navigator.userAgent)
+        };
+    },
+    methods: {
+        pick(item) {
+            if (item.show && item.enabled) {
+                this.checked = item.key;
+            } else {
+                this.$toast('敬请期待');
+            }
+        }
+    },
+    watch: {
+        value(val) {
+            this.checked = val;
+        },
+        checked(val) {
+            this.$emit('update:modelValue', val);
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.pay-item {
+    display: flex;
+    align-items: center;
+    height: 60px;
+    border-bottom: 1px solid @tabBorder;
+    .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;
+        }
+    }
+}
+</style>

+ 3 - 3
src/components/Post.vue

@@ -379,7 +379,7 @@ export default {
     margin-top: 6px;
     span {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 22px;
         padding: 0 10px;
         background: @bg3;
@@ -390,7 +390,7 @@ export default {
 
 .status {
     font-size: 14px;
-    color: #939599;
+    color: @text3;
     line-height: 24px;
     padding-top: 11px;
 }
@@ -398,7 +398,7 @@ export default {
 .sold {
     background-color: #1c1e25;
     font-size: @font1;
-    color: #939599;
+    color: @text3;
     padding: 0 17px;
     border-radius: 13px;
     line-height: 24px;

+ 2 - 2
src/components/asset/assetInfo.vue

@@ -234,7 +234,7 @@ export default {
     left: 0;
     width: 21.3vw;
     font-size: 10px;
-    color: #939599;
+    color: @text3;
     line-height: 17px;
     background-color: fade(#000, 80%);
     padding: 0 5px;
@@ -265,7 +265,7 @@ export default {
     background-color: #fff;
     font-size: 12px;
     font-weight: bold;
-    color: #939599;
+    color: @text3;
     position: absolute;
     top: 4px;
     left: 3px;

+ 2 - 2
src/components/asset/showInfo.vue

@@ -163,7 +163,7 @@ export default {
 
     .text2 {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 12px;
     }
 }
@@ -180,7 +180,7 @@ export default {
         }
         span {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 17px;
         }
     }

+ 141 - 0
src/components/creator/CreatorSmall.vue

@@ -0,0 +1,141 @@
+<template>
+    <router-link
+        :to="{
+            path: '/creatorDetail',
+            query: {
+                id: info.id
+            }
+        }"
+        class="info"
+    >
+        <van-image
+            width="100%"
+            height="120"
+            :src="info.bg ? info.bg : require('@assets/creatorBg.png')"
+            loading-icon=""
+            fit="cover"
+            class="bg-img"
+        />
+        <van-image class="logo" :width="32" :height="32" :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>
+    </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: inline-block;
+    position: relative;
+    width: calc(50vw - 24px);
+    background: #373b3e;
+    border-radius: 8px;
+    overflow: hidden;
+    margin: 8px;
+
+    .content {
+        flex-grow: 1;
+        padding-left: 12px;
+        display: flex;
+        flex-direction: column;
+        overflow: hidden;
+        height: 80px;
+        background: #373b3e;
+        padding: 18px 10px 10px;
+        align-items: center;
+
+        .text1 {
+            font-size: 12px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 17px;
+        }
+
+        .text2 {
+            font-size: 12px;
+            color: @text3;
+            line-height: 17px;
+            width: 100%;
+            margin-top: 4px;
+        }
+    }
+}
+
+.bg-img {
+    display: block;
+}
+
+.logo {
+    position: absolute;
+    top: 102px;
+    left: 50%;
+    transform: translateX(-50%);
+}
+</style>

+ 1 - 1
src/components/order/OrderInfo.vue

@@ -32,7 +32,7 @@
         </div>
         <!-- 
         <div class="btns">
-            <van-button color="#939599" @click.prevent="del" plain size="mini" round> 删除订单 </van-button>
+            <van-button color="@text3" @click.prevent="del" plain size="mini" round> 删除订单 </van-button>
         </div> -->
     </router-link>
 </template>

+ 2 - 2
src/components/order/OrderOpen.vue

@@ -88,14 +88,14 @@ export default {
     .text {
         text-align: center;
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 17px;
         margin-top: 60px;
     }
 
     .text1 {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 17px;
         position: absolute;
         left: 50%;

+ 138 - 0
src/components/phoneCode.vue

@@ -0,0 +1,138 @@
+<template>
+    <van-popup class="popup-content" v-model:show="show" teleport="body" position="bottom">
+        <div class="popup">
+            <div class="cancel" @click="show = false">取消</div>
+            <div class="title">输入验证码</div>
+            <div class="phone">已发送到您{{ phoneText }}手机</div>
+            <div class="send" @click="onSubmit">未收到验证码?</div>
+            <van-password-input :value="code" :length="6" />
+            <!-- 数字键盘 -->
+            <van-number-keyboard
+                maxlength="6"
+                theme="custom"
+                v-model="code"
+                :show="show"
+                close-button-text="完成"
+                @close="bind"
+            />
+        </div>
+    </van-popup>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            show: false,
+            code: ''
+        };
+    },
+    watch: {
+        code() {
+            if (this.code && this.code.length === 6) {
+                this.$emit('bind', this.code);
+            }
+        }
+    },
+    methods: {
+        onSubmit(e) {
+            this.$emit('onSubmit', e);
+        },
+        bind() {
+            if (!this.code || this.code.length < 4) {
+                this.$toast('请输入验证码');
+            }
+            this.$emit('bind', this.code);
+        },
+        init() {
+            this.code = '';
+            this.show = true;
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+@bottom: 280px;
+@gray3: #c8c9cc;
+.popup {
+    color: #000;
+    position: relative;
+    padding-bottom: calc(@bottom+ constant(safe-area-inset-bottom));
+    padding-bottom: calc(@bottom + env(safe-area-inset-bottom));
+    .title {
+        text-align: center;
+        font-size: @font3;
+        padding: 20px 0;
+        border-bottom: 1px solid #f5f7fa;
+    }
+
+    .cancel {
+        position: absolute;
+        font-size: @font1;
+        font-family: PingFangSC-Regular, PingFang SC;
+        font-weight: 400;
+        color: @text3;
+        line-height: 22px;
+        padding: 21px 20px;
+        left: 0;
+        top: 0;
+    }
+
+    .send {
+        position: absolute;
+        font-size: @font1;
+        font-family: PingFangSC-Regular, PingFang SC;
+        font-weight: 400;
+        color: @text3;
+        line-height: 22px;
+        padding: 21px 20px;
+        right: 0;
+        top: 0;
+        text-decoration: underline;
+    }
+
+    .phone {
+        padding: 12px 0 20px;
+        text-align: center;
+        font-size: 12px;
+        color: #aaabad;
+        line-height: 24px;
+    }
+
+    /deep/.van-password-input {
+        margin: 0 80px;
+    }
+
+    /deep/.van-key {
+        &:hover {
+            background-color: @gray3;
+        }
+        &:focus {
+            background-color: @gray3;
+        }
+        &:active {
+            background-color: @gray3;
+        }
+        &:link {
+            background-color: @gray3;
+        }
+        &:visited {
+            background-color: @gray3;
+        }
+
+        &.van-key--active {
+            background-color: @gray3;
+        }
+    }
+
+    /deep/[class*='van-hairline']::after {
+        border-color: @gray3;
+    }
+
+    /deep/.van-key--blue {
+        background: linear-gradient(135deg, @prim 0%, @warn 100%);
+        color: @btnText;
+    }
+}
+</style>

+ 1 - 1
src/components/product/NewsInfo.vue

@@ -58,7 +58,7 @@ export default {
             white-space: nowrap;
         }
         .text2 {
-            color: #939599;
+            color: @text3;
             line-height: 17px;
             font-size: 12px;
             display: -webkit-box;

+ 1 - 1
src/components/product/NewsLarge.vue

@@ -220,7 +220,7 @@ export default {
 .sold {
     background-color: @bg2;
     font-size: @font1;
-    color: #939599;
+    color: @text3;
     padding: 0 17px;
     border-radius: 13px;
     line-height: 24px;

+ 3 - 3
src/components/product/Tasks.vue

@@ -122,7 +122,7 @@ export default {
 
 .title {
     font-size: 12px;
-    color: #939599;
+    color: @text3;
     line-height: 17px;
     padding: 10px 6px;
     text-align: center;
@@ -148,7 +148,7 @@ export default {
         .text1 {
             margin-top: 6px;
             font-size: 10px;
-            color: #939599;
+            color: @text3;
             line-height: 10px;
         }
 
@@ -181,7 +181,7 @@ export default {
 
 .tips {
     font-size: 12px;
-    color: #939599;
+    color: @text3;
     line-height: 17px;
     text-align: center;
     padding: 16px;

+ 2 - 2
src/components/product/productInfo.vue

@@ -212,7 +212,7 @@ export default {
 .sold {
     background-color: @bg2;
     font-size: @font1;
-    color: #939599;
+    color: @text3;
     padding: 0 17px;
     border-radius: 13px;
     line-height: 24px;
@@ -247,7 +247,7 @@ export default {
     left: 0;
     right: 0;
     font-size: 12px;
-    color: #939599;
+    color: @text3;
     line-height: 22px;
     background-color: fade(#000, 80%);
     padding: 0 10px;

+ 1 - 1
src/components/product/productLarge.vue

@@ -268,7 +268,7 @@ export default {
 .sold {
     background-color: @bg2;
     font-size: @font1;
-    color: #939599;
+    color: @text3;
     padding: 0 17px;
     border-radius: 13px;
     line-height: 24px;

+ 7 - 0
src/main.js

@@ -31,6 +31,13 @@ import smoothscroll from 'smoothscroll-polyfill';
 
 smoothscroll.polyfill();
 
+const appHeight = () => {
+    const doc = document.documentElement;
+    doc.style.setProperty('--app-height', `${window.innerHeight}px`);
+};
+window.addEventListener('resize', appHeight);
+appHeight();
+
 Toast.setDefaultOptions('loading', { duration: 0 });
 require('dayjs/locale/zh-cn');
 

+ 5 - 1
src/mixins/banner.js

@@ -20,7 +20,11 @@ export default {
                 info.linkContent = encodeURIComponent(info.linkContent);
                 this.$router.push(`/productSearch?search=${info.linkContent}${props}`);
             } else if (info.link && info.linkType === 'hyperlink') {
-                this.$router.push(`${info.linkContent}${props}`);
+                if (info.linkContent.indexOf('http') !== -1) {
+                    window.location.href = info.linkContent;
+                } else {
+                    this.$router.push(`${info.linkContent}${props}`);
+                }
             }
         }
     }

+ 9 - 0
src/mixins/common.js

@@ -231,6 +231,15 @@ export default {
             } else {
                 return num;
             }
+        },
+        openScheme(url) {
+            const a = document.createElement('a');
+            a.href = url;
+            document.body.appendChild(a);
+            a.click();
+            setTimeout(() => {
+                document.body.removeChild(a);
+            }, 5000);
         }
     }
 };

+ 80 - 54
src/router/index.js

@@ -37,14 +37,14 @@ function jsapiSign() {
                     });
                     wx.ready(function () {
                         wx.updateAppMessageShareData({
-                            title: '第九空间',
+                            title: '绿洲宇宙',
                             desc: '全球首个基于区块链的游戏资产集换中心',
                             link: location.origin + '/9th',
                             imgUrl:
                                 'https://9space-2021.oss-cn-shenzhen.aliyuncs.com/nft/2021-11-05-15-58-30YwqLzMjy.jpg'
                         });
                         wx.updateTimelineShareData({
-                            title: '第九空间-全球首个基于区块链的游戏资产集换中心',
+                            title: '绿洲宇宙-全球首个基于区块链的游戏资产集换中心',
                             link: location.origin + '/9th',
                             imgUrl:
                                 'https://9space-2021.oss-cn-shenzhen.aliyuncs.com/nft/2021-11-05-15-58-30YwqLzMjy.jpg'
@@ -74,7 +74,7 @@ const routes = [
                 meta: {
                     pageType: Page.Every,
                     menuPage: true,
-                    title: '第九空间'
+                    title: '绿洲宇宙'
                 }
             },
             {
@@ -84,7 +84,7 @@ const routes = [
                 meta: {
                     pageType: Page.Every,
                     menuPage: true,
-                    title: '第九空间'
+                    title: '绿洲宇宙'
                 }
             },
             {
@@ -94,7 +94,7 @@ const routes = [
                 meta: {
                     pageType: Page.Every,
                     menuPage: true,
-                    title: '第九空间'
+                    title: '绿洲宇宙'
                 }
             },
             {
@@ -104,7 +104,7 @@ const routes = [
                 meta: {
                     pageType: Page.Every,
                     menuPage: true,
-                    title: '第九空间'
+                    title: '绿洲宇宙'
                 }
             },
             {
@@ -114,7 +114,7 @@ const routes = [
                 meta: {
                     pageType: Page.Every,
                     menuPage: true,
-                    title: '第九空间'
+                    title: '绿洲宇宙'
                 }
             }
         ]
@@ -127,7 +127,7 @@ const routes = [
             pageType: Page.Every,
             menuPage: true,
             isHall: true,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -136,7 +136,7 @@ const routes = [
         component: () => import('../views/hall/Edit.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             isHall: true,
             tabColor: '#181818'
         }
@@ -147,7 +147,7 @@ const routes = [
         component: () => import('../views/hall/ProductAdd.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             isHall: true,
             tabColor: '#181818'
         }
@@ -158,7 +158,7 @@ const routes = [
         component: () => import('../views/hall/ProductChoose.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             isHall: true,
             tabColor: '#181818'
         }
@@ -256,7 +256,7 @@ const routes = [
         component: () => import('../views/account/About.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -265,7 +265,7 @@ const routes = [
         component: () => import('../views/account/Introduction.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -274,7 +274,7 @@ const routes = [
         component: () => import('../views/account/Question.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -293,7 +293,7 @@ const routes = [
         component: () => import('../views/product/Detail.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             tabColor: '#181818'
         }
     },
@@ -303,7 +303,7 @@ const routes = [
         component: () => import('../views/product/NewsDetail.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -312,7 +312,7 @@ const routes = [
         component: () => import('../views/product/NewsList.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -322,7 +322,7 @@ const routes = [
         meta: {
             pageType: Page.Every,
             menuPage: true,
-            title: '第九空间',
+            title: '绿洲宇宙',
             tabColor: '#181818'
         }
     },
@@ -332,7 +332,7 @@ const routes = [
         component: () => import('../views/product/DetailMode.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -341,7 +341,7 @@ const routes = [
         component: () => import('../views/product/List.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -350,7 +350,7 @@ const routes = [
         component: () => import('../views/hall/List.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             tabColor: '#222426'
         }
     },
@@ -424,7 +424,7 @@ const routes = [
         component: () => import('../views/product/Search.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -433,7 +433,17 @@ const routes = [
         component: () => import('../views/creator/Detail.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
+        }
+    },
+    {
+        path: '/creatorHome',
+        name: 'creatorHome',
+        component: () => import('../views/creator/Home.vue'),
+        meta: {
+            pageType: Page.Every,
+            title: '绿洲宇宙',
+            tabColor: '#222426'
         }
     },
     {
@@ -442,7 +452,7 @@ const routes = [
         component: () => import('../views/creator/List.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -451,7 +461,7 @@ const routes = [
         component: () => import('../views/creator/Search.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -460,7 +470,7 @@ const routes = [
         component: () => import('../views/asset/Detail.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             tabColor: '#181818'
         }
     },
@@ -470,7 +480,7 @@ const routes = [
         component: () => import('../views/asset/Consignment.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -488,7 +498,7 @@ const routes = [
         component: () => import('../views/asset/Agreement.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -496,7 +506,7 @@ const routes = [
         name: 'assetSearch',
         component: () => import('../views/asset/Search.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -504,7 +514,7 @@ const routes = [
         name: 'giveSearch',
         component: () => import('../views/asset/GiveSearch.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -512,7 +522,7 @@ const routes = [
         name: 'submit',
         component: () => import('../views/Submit.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -520,7 +530,7 @@ const routes = [
         name: 'couponList',
         component: () => import('../views/order/CouponList.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -528,7 +538,7 @@ const routes = [
         name: 'givesubmit',
         component: () => import('../views/Givesubmit.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -537,7 +547,7 @@ const routes = [
         component: () => import('../views/creator/Detail.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -545,7 +555,7 @@ const routes = [
         name: 'orders',
         component: () => import('../views/order/Orders.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -553,7 +563,7 @@ const routes = [
         name: 'orderDetail',
         component: () => import('../views/order/Detail.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -561,7 +571,7 @@ const routes = [
         name: 'activityOrders',
         component: () => import('../views/order/ActivityOrders.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -569,7 +579,7 @@ const routes = [
         name: 'activityOrderDetail',
         component: () => import('../views/order/ActivityDetail.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -594,7 +604,7 @@ const routes = [
         component: () => import('../views/activity/List1.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             tabColor: '#181818'
         }
     },
@@ -604,7 +614,7 @@ const routes = [
         component: () => import('../views/activity/Detail1.vue'),
         meta: {
             pageType: Page.Every,
-            title: '第九空间',
+            title: '绿洲宇宙',
             tabColor: '#181818'
         }
     },
@@ -613,7 +623,7 @@ const routes = [
         name: 'activitySubmit',
         component: () => import('../views/activity/Submit.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -621,7 +631,7 @@ const routes = [
         name: 'chooseProduct',
         component: () => import('../views/activity/ChooseProduct.vue'),
         meta: {
-            title: '第九空间',
+            title: '绿洲宇宙',
             needBack: true
         }
     },
@@ -630,7 +640,7 @@ const routes = [
         name: 'mineFollows',
         component: () => import('../views/user/Follows.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -638,7 +648,7 @@ const routes = [
         name: 'mineFollowers',
         component: () => import('../views/user/Followers.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -646,7 +656,15 @@ const routes = [
         name: 'mineLikes',
         component: () => import('../views/user/Likes.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
+        }
+    },
+    {
+        path: '/bankPay',
+        name: 'bankPay',
+        component: () => import('../views/pay/BankPay.vue'),
+        meta: {
+            title: '首信易快捷支付'
         }
     },
     {
@@ -654,7 +672,7 @@ const routes = [
         name: 'mineBanks',
         component: () => import('../views/user/Banks.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -662,7 +680,7 @@ const routes = [
         name: 'mineBanksAdd',
         component: () => import('../views/user/BanksAdd.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -670,7 +688,7 @@ const routes = [
         name: 'mineAddress',
         component: () => import('../views/user/Address.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -678,7 +696,7 @@ const routes = [
         name: 'mineAddressEdit',
         component: () => import('../views/user/AddressEdit.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -686,7 +704,7 @@ const routes = [
         name: 'mineWallet',
         component: () => import('../views/user/Wallet.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -694,7 +712,7 @@ const routes = [
         name: 'minePoint',
         component: () => import('../views/user/Point.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -702,7 +720,7 @@ const routes = [
         name: 'mineExchange',
         component: () => import('../views/user/Exchange.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -710,7 +728,7 @@ const routes = [
         name: 'mineLevel',
         component: () => import('../views/user/Level.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
         }
     },
     {
@@ -718,7 +736,15 @@ const routes = [
         name: 'rank',
         component: () => import('../views/user/Rank.vue'),
         meta: {
-            title: '第九空间'
+            title: '绿洲宇宙'
+        }
+    },
+    {
+        path: '/balanceRecord',
+        name: 'balanceRecord',
+        component: () => import('../views/user/BalanceRecord.vue'),
+        meta: {
+            title: '绿洲宇宙'
         }
     }
 ];

+ 8 - 8
src/styles/app.less

@@ -58,9 +58,10 @@ textarea {
 body {
     font-family: BlinkMacSystemFont, 'Helvetica Neue', Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', miui,
         'Hiragino Sans GB', 'Microsoft Yahei', sans-serif;
-}
-body {
     -webkit-text-size-adjust: none;
+    font-size: 14px;
+    color: var(--van-text-color);
+    background-color: #272b2e;
 }
 html,
 body,
@@ -69,6 +70,7 @@ body,
     padding: 0;
     margin: 0;
     height: 100vh;
+    height: var(--app-height);
     overflow: hidden;
     -webkit-overflow-scrolling: touch;
     -webkit-font-smoothing: antialiased;
@@ -81,11 +83,6 @@ body,
     display: none;
     opacity: 0;
 }
-body {
-    font-size: 14px;
-    color: var(--van-text-color);
-}
-
 input:-webkit-autofill {
     box-shadow: 0 0 0px 1000px @bg inset;
     -webkit-text-fill-color: @text0;
@@ -193,7 +190,9 @@ input:-webkit-autofill {
 .barTop {
     // padding-top: var(--safe-top);
 }
-
+.van-tabs.dark {
+    background-color: #181818;
+}
 .van-nav-bar.dark {
     background-color: #181818;
 }
@@ -226,6 +225,7 @@ input:-webkit-autofill {
     position: fixed;
     width: 100vw;
     height: 100vh;
+    // height: var(--app-height);
     top: 0;
     left: 0;
     right: 0;

+ 1 - 0
src/views/Creator.vue

@@ -113,6 +113,7 @@ export default {
     background-color: @bg3;
     padding-bottom: 100px;
     min-height: 100vh;
+    min-height: var(--app-height);
 }
 
 /deep/.van-tab {

+ 17 - 4
src/views/Discover.vue

@@ -34,8 +34,7 @@
         </swiper>
 
         <div class="menu">
-            <!-- <router-link class="menu-item" :to="{ path: '/hallList' }"> -->
-            <div class="menu-item" @click="wait">
+            <div class="menu-item" @click="goHall">
                 <div class="text1">
                     <img src="../assets/info_icon_yishuzhanguan.png" alt="" />
                     <span>艺术展览</span>
@@ -47,7 +46,7 @@
                 class="menu-item"
                 @click="
                     goWin(
-                        'https://shop103867459.m.youzan.com/v2/showcase/tag?alias=3nqup0zng9n2z&reft=1649311498407_1649311507717&spm=f.100904662_f.100129498_f.100904662'
+                        'https://shop103867459.m.youzan.com/v2/showcase/homepage?alias=Zp3noaegLR&reft=1649311507717_1652343999681&spm=f.100904662_f.100904662_t.1688564850'
                     )
                 "
             >
@@ -91,7 +90,7 @@
                 </template>
             </van-grid-item>
 
-            <van-grid-item text="艺术机构" :to="{ path: '/creatorList' }">
+            <van-grid-item text="艺术机构" :to="{ path: '/creatorHome' }">
                 <template v-slot:icon>
                     <img class="grid-img" src="@assets/info_icon_zhuzaozhe.png" />
                 </template>
@@ -318,6 +317,20 @@ export default {
             Promise.all([this.getInit(), this.getList(), this.$store.dispatch('getUsedBuy')]).then(res => {
                 this.isLoading = false;
             });
+        },
+        goHall() {
+            this.$http
+                .get('/sysConfig/get/hall_show')
+                .then(res => {
+                    if (res.value === true || res.value === '1') {
+                        this.$router.push('/hallList');
+                    } else {
+                        return Promise.reject();
+                    }
+                })
+                .catch(() => {
+                    this.wait();
+                });
         }
     },
     activated() {

+ 76 - 63
src/views/Givesubmit.vue

@@ -47,11 +47,33 @@
             </div>
 
             <div class="pay">
-                <div class="pay-item" @click="payType = item.type" v-for="(item, index) in payInfos" :key="index">
-                    <img class="icon" :src="item.icon" alt="" />
+                <pay-method-pick v-model="payType"></pay-method-pick>
+                <!-- <div class="pay-item" @click="payType = item.type" v-for="(item, index) in payInfos" :key="index">
+                    <div class="img-icon"><img class="icon" :src="item.icon" alt="" /></div>
                     <span>{{ item.name }}</span>
                     <img class="choose" :src="payType === item.type ? icons[1] : icons[0]" alt="" />
                 </div>
+                <div class="pay-item not" @click="wait">
+                    <div class="img-icon">
+                        <img class="icon" src="@assets/icon_RMB.png" alt="" />
+                    </div>
+                    <span>数字人民币</span>
+                    <img class="choose-icon" :src="icons[2]" alt="" />
+                </div>
+                <div class="pay-item not" @click="wait">
+                    <div class="img-icon">
+                        <img class="icon" src="@assets/icon-jifen1.png" alt="" />
+                    </div>
+                    <span>积分</span>
+                    <img class="choose-icon" :src="icons[2]" alt="" />
+                </div>
+                <div class="pay-item not" @click="wait">
+                    <div class="img-icon">
+                        <img class="icon" src="@assets/icon-lvzhoushi.png" alt="" />
+                    </div>
+                    <span>绿洲石</span>
+                    <img class="choose-icon" :src="icons[2]" alt="" />
+                </div> -->
             </div>
         </div>
 
@@ -73,10 +95,12 @@ import resolveUrl from 'resolve-url';
 import { add } from 'mathjs';
 import { mapState } from 'vuex';
 import product from '../mixins/product';
+import PayMethodPick from '../components/PayMethodPick.vue';
 // import Driver from '../components/Driver.vue';
 let inWeixin = /micromessenger/i.test(navigator.userAgent);
 let inApp = /#cordova#/i.test(navigator.userAgent);
 export default {
+    components: { PayMethodPick },
     name: 'Submit',
     mixins: [product],
     data() {
@@ -86,25 +110,29 @@ export default {
             password: '',
             enable_wx_lite: false,
             enable_wx_pub: false,
-            payType: inWeixin ? 'WEIXIN' : 'ALIPAY',
+            payType: null,
             // payType: 'ALIPAY',
-            payInfos: [
-                {
-                    icon: require('@assets/svgs/zhifubao.svg'),
-                    name: '支付宝',
-                    type: 'ALIPAY'
-                },
-                {
-                    icon: require('@assets/svgs/wechat.svg'),
-                    name: '微信',
-                    type: 'WEIXIN'
-                }
-                // {
-                //   icon: require("@assets/svgs/png-decp.svg"),
-                //   name: "DCEP",
-                // },
+            // payInfos: [
+            //     {
+            //         icon: require('@assets/svgs/zhifubao.svg'),
+            //         name: '支付宝',
+            //         type: 'ALIPAY'
+            //     },
+            //     {
+            //         icon: require('@assets/svgs/wechat.svg'),
+            //         name: '微信',
+            //         type: 'WEIXIN'
+            //     }
+            //     // {
+            //     //   icon: require("@assets/svgs/png-decp.svg"),
+            //     //   name: "DCEP",
+            //     // },
+            // ],
+            icons: [
+                require('@assets/icon_gouxuan_huise.png'),
+                require('@assets/icon_gouxuan_pre.png'),
+                require('@assets/icon_gouxuan_huise1.png')
             ],
-            icons: [require('@assets/icon_gouxuan_huise.png'), require('@assets/icon_gouxuan_pre.png')],
             bottom: null,
             orderId: 0,
             gas: 1,
@@ -138,48 +166,11 @@ export default {
                 console.log(this.info);
             });
         }
-
-        Promise.all([
-            this.$http.get('/sysConfig/get/gift_gas_fee').then(res => {
-                this.gas = res.value;
-                return Promise.resolve();
-            }),
-            inWeixin
-                ? this.$http.get('/sysConfig/get/enable_wx_pub').then(res => {
-                      this.enable_wx_pub = res.value === '1';
-                      return Promise.resolve();
-                  })
-                : Promise.resolve(),
-            this.$http.get('/sysConfig/get/enable_wx_lite').then(res => {
-                this.enable_wx_lite = res.value === '1';
-                return Promise.resolve();
-            })
-        ]).then(() => {
-            if (!(this.enable_wx_lite || this.enable_wx_pub)) {
-                this.payInfos.splice(1, 1);
-                this.payType = 'ALIPAY';
-            } else if (this.enable_wx_pub) {
-                this.payChannel = 'wx_pub';
-            } else {
-                this.payChannel = 'wx_lite';
-            }
-
-            this.$http.get('/sysConfig/get/enable_sand_quick').then(res => {
-                // eslint-disable-next-line no-extra-boolean-cast
-                if (res.value === 'true' || res.value === true || res.value === '1') {
-                    this.payType = 'H5PAY';
-                    this.payInfos = [
-                        {
-                            icon: require('@assets/icon_yinlian.png'),
-                            name: '银联快捷付',
-                            type: 'H5PAY'
-                        }
-                    ];
-                }
-            });
-
-            this.passFn();
+        this.$http.get('/sysConfig/get/gift_gas_fee').then(res => {
+            this.gas = res.value;
+            return Promise.resolve();
         });
+        this.passFn();
     },
     methods: {
         passFn() {
@@ -242,8 +233,12 @@ export default {
                             })
                             .then(res => {
                                 this.orderId = res.id;
+                                console.log(this.payType);
                                 this.$nextTick(() => {
-                                    if (this.payType === 'ALIPAY') {
+                                    if (this.payType === 'SYXPAY') {
+                                        this.$toast.clear();
+                                        this.$router.replace('/bankPay?id=' + this.orderId + '&type=gift');
+                                    } else if (this.payType === 'ALIPAY') {
                                         // document.location.replace(
                                         //     resolveUrl(this.$baseUrl, 'payOrder/v2/gift/alipay?id=' + res.id)
                                         // );
@@ -308,11 +303,14 @@ export default {
                                                 resolveUrl(this.$baseUrl, 'payOrder/gift/weixin_h5?id=' + res.id)
                                             );
                                         }
-                                    } else if (this.payType === 'H5PAY') {
+                                    } else if (this.payType === 'UNION') {
                                         document.location.href = resolveUrl(
                                             this.$baseUrl,
                                             '/payOrder/v2/gift/sandQuick?id=' + this.orderId
-                                        );
+                                        )
+                                            .replace('www.raex.vip', 'jump.raex.vip')
+                                            .replace('test.raex.vip', 'jumptest.raex.vip')
+                                            .replace(/http:\/\/192\.168.*?\//, 'https://jumptest.raex.vip/');
                                     }
                                 });
                             })
@@ -539,6 +537,11 @@ export default {
         height: 24px;
         display: block;
     }
+    .img-icon {
+        width: 45px;
+        .flex();
+        justify-content: center;
+    }
     span {
         font-size: 14px;
         font-weight: bold;
@@ -552,6 +555,16 @@ export default {
         width: 24px;
         height: 24px;
     }
+    .choose-icon {
+        width: 24px;
+        height: 24px;
+    }
+
+    &.not {
+        span {
+            color: @text3;
+        }
+    }
 }
 
 .bottom {

+ 1 - 1
src/views/Home.vue

@@ -493,7 +493,7 @@ export default {
     justify-content: center;
     .text1 {
         font-size: 16px;
-        color: #939599;
+        color: @text3;
         line-height: 24px;
         padding: 8px 40px 16px;
 

+ 29 - 25
src/views/Mine.vue

@@ -296,30 +296,34 @@ export default {
                 });
         },
         share() {
-            this.getProduct()
-                .then(() => {
-                    return new Promise((resolve, reject) => {
-                        this.$nextTick(() => {
-                            if (this.$refs.level.money <= this.shareMoney) {
-                                this.$dialog.alert({
-                                    title: '提示',
-                                    message: '绿洲石大于' + this.shareMoney + '的用户才能参加该活动'
-                                });
-                                resolve();
-                            } else if (this.shareProduct.openQuota) {
-                                this.$refs.post.init();
-                                resolve();
-                            } else {
-                                reject('活动藏品分享已关闭');
-                            }
+            this.checkLogin().then(() => {
+                this.getProduct()
+                    .then(() => {
+                        return new Promise((resolve, reject) => {
+                            this.$nextTick(() => {
+                                if (this.$refs.level.money <= this.shareMoney) {
+                                    this.$dialog.alert({
+                                        title: '提示',
+                                        message: '绿洲石大于' + this.shareMoney + '的用户才能参加该活动'
+                                    });
+                                    resolve();
+                                } else if (this.shareProduct.openQuota) {
+                                    this.$router.push(
+                                        `/productTasks?id=${this.shareProduct.id}&invitor=${this.$store.state.userInfo.id}`
+                                    );
+                                    resolve();
+                                } else {
+                                    reject('活动藏品分享已关闭');
+                                }
+                            });
                         });
+                    })
+                    .catch(e => {
+                        if (e) {
+                            this.$toast(e);
+                        }
                     });
-                })
-                .catch(e => {
-                    if (e) {
-                        this.$toast(e);
-                    }
-                });
+            });
         },
         onRefresh() {
             this.refreshFlag++;
@@ -697,7 +701,7 @@ export default {
             font-weight: bold;
             color: @bg;
             line-height: 24px;
-            margin-top: 10px;
+            margin-top: 15px;
             .flex();
             // img {
             //     width: 18px;
@@ -713,7 +717,7 @@ export default {
             line-height: 24px;
             display: flex;
             align-items: center;
-            margin-top: 2px;
+            margin-top: 5px;
             img {
                 display: block;
                 margin-left: 6px;
@@ -733,7 +737,7 @@ export default {
                 }
                 span {
                     font-size: 12px;
-                    color: #939599;
+                    color: @text3;
                     line-height: 18px;
                     background: #373b3e;
                     border-radius: 2px;

+ 4 - 2
src/views/Store.vue

@@ -104,7 +104,7 @@
                 v-if="empty || (showList.length === 0 && !loading)"
                 :description="active == 'coupon' ? '你还没有优惠券哦~' : '你还没有藏品哦~'"
                 :image="
-                    require(`@assets/${active == 'coupon' ? 'kong_png_duihuanquanhei' : 'kong_png_yongyoude hei'}.png`)
+                    require(`@assets/${active == 'coupon' ? 'kong_png_duihuanquanhei' : 'empty_img_asset_dark'}.png`)
                 "
             />
             <img src="../assets/icon_zhiding.png" @click="goTop" class="goTop" v-if="bodyScroll.value > 100" alt="" />
@@ -526,6 +526,7 @@ export default {
 .discover {
     background-color: #0f0f0f;
     min-height: 100vh;
+    min-height: var(--app-height);
     box-sizing: border-box;
 }
 .grid-img {
@@ -608,7 +609,8 @@ export default {
 .goTop {
     position: fixed;
     right: 16px;
-    bottom: 30vh;
+    bottom: 70px;
+    bottom: calc(env(safe-area-inset-bottom) + 70px);
     width: 44px;
     height: 44px;
     display: block;

+ 133 - 214
src/views/Submit.vue

@@ -31,11 +31,7 @@
                 <!-- <van-field type="text" label="订单留言" placeholder="选填" v-model="message" /> -->
 
                 <div class="pay" v-if="!($store.state.review && inIos)">
-                    <div class="pay-item" @click="payType = item.type" v-for="(item, index) in payInfos" :key="index">
-                        <img class="icon" :src="item.icon" alt="" />
-                        <span>{{ item.name }}</span>
-                        <img class="choose-icon" :src="payType === item.type ? icons[1] : icons[0]" alt="" />
-                    </div>
+                    <pay-method-pick v-model="payType"></pay-method-pick>
                 </div>
             </div>
         </div>
@@ -49,15 +45,33 @@
                         round
                         :color="`linear-gradient(135deg, ${$colors.prim} 0%, ${$colors.warn} 100%)`"
                         @click="submit"
-                        :disabled="!!orderId"
                     >
                         立即支付
                     </van-button>
                 </div>
-                <a id="pay" :href="hrefUrl"></a>
+                <a id="pay" :href="payUrlScheme"></a>
                 <!-- <wx-open-launch-weapp id="launch-btn" :username="launchName" :path="launchPath"> </wx-open-launch-weapp> -->
             </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), $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>
 
@@ -68,17 +82,19 @@ import { mapState } from 'vuex';
 import resolveUrl from 'resolve-url';
 import qs from 'qs';
 import encryptUtil from '../utils/encryptUtil';
+import PayMethodPick from '../components/PayMethodPick';
 let inWeixin = /micromessenger/i.test(navigator.userAgent);
 let inApp = /#cordova#/i.test(navigator.userAgent);
 let inIos = /iPhone|iPad|iPod/i.test(navigator.userAgent);
 export default {
     name: 'Submit',
     mixins: [product, coupon],
+    components: { PayMethodPick },
     data() {
         return {
             info: {},
             message: '',
-            payType: inWeixin ? 'WEIXIN' : 'ALIPAY',
+            payType: null,
             payChannel: null,
             payInfos: [
                 {
@@ -96,7 +112,11 @@ export default {
                 //   name: "DCEP",
                 // },
             ],
-            icons: [require('@assets/svgs/icon_gouxuan_huise.svg'), require('@assets/icon_gouxuan_pre.png')],
+            icons: [
+                require('@assets/svgs/icon_gouxuan_huise.svg'),
+                require('@assets/icon_gouxuan_pre.png'),
+                require('@assets/icon_gouxuan_huise1.png')
+            ],
             bottom: null,
             orderId: 0,
             gas: 1,
@@ -106,14 +126,15 @@ export default {
             couponList: [],
             collectionId: 0,
             timer: null,
-            hrefUrl: '',
-            enable_wx_lite: false,
-            enable_wx_pub: false,
+            payUrlScheme: '',
             launchName: '',
             launchPath: '',
             createOrderTimer: null,
             timerNum: 0,
-            weixinOptions: {}
+            weixinOptions: {},
+            showPwdDialog: false,
+            showKeyboard: false,
+            tradeCode: ''
         };
     },
     computed: {
@@ -125,7 +146,6 @@ export default {
             if (this.gas && (!this.couponInfo || this.couponInfo.needGas)) {
                 money = this.accAdd(money, this.gas);
             }
-
             return money;
         },
         ...mapState(['couponInfo']),
@@ -143,48 +163,12 @@ export default {
         next();
     },
     mounted() {
-        Promise.all([
-            this.$http.get('/sysConfig/get/gas_fee').then(res => {
-                this.gas = res.value;
-                if (window.cordova && window.cordova.platformId === 'ios' && this.$store.state.review) {
-                    this.gas = 0;
-                }
-                return Promise.resolve();
-            }),
-            inWeixin
-                ? this.$http.get('/sysConfig/get/enable_wx_pub').then(res => {
-                      this.enable_wx_pub = res.value.split(',').findIndex(i => i === this.$route.query.id) > -1;
-                      return Promise.resolve();
-                  })
-                : Promise.resolve(),
-            this.$http.get('/sysConfig/get/enable_wx_lite').then(res => {
-                this.enable_wx_lite =
-                    res.value.split(',').findIndex(i => i === this.$route.query.id) > -1 &&
-                    !/AliApp/i.test(navigator.userAgent);
-                return Promise.resolve();
-            })
-        ]).then(() => {
-            if (!(this.enable_wx_lite || this.enable_wx_pub)) {
-                this.payInfos.splice(1, 1);
-                this.payType = 'ALIPAY';
-            } else if (this.enable_wx_pub) {
-                this.payChannel = 'wx_pub';
-            } else {
-                this.payChannel = 'wx_lite';
+        this.$http.get('/sysConfig/get/gas_fee').then(res => {
+            this.gas = res.value;
+            if (window.cordova && window.cordova.platformId === 'ios' && this.$store.state.review) {
+                this.gas = 0;
             }
-            this.$http.get('/sysConfig/get/enable_sand_quick').then(res => {
-                // eslint-disable-next-line no-extra-boolean-cast
-                if (res.value === 'true' || res.value === true || res.value === '1') {
-                    this.payType = 'H5PAY';
-                    this.payInfos = [
-                        {
-                            icon: require('@assets/icon_yinlian.png'),
-                            name: '银联快捷付',
-                            type: 'H5PAY'
-                        }
-                    ];
-                }
-            });
+            return Promise.resolve();
         });
 
         this.$toast.loading({
@@ -299,6 +283,9 @@ export default {
                 });
         },
         createOrder() {
+            if (this.orderId) {
+                return Promise.resolve({ id: this.orderId });
+            }
             if (!this.payType) {
                 this.$toast('请选择支付方式');
                 return;
@@ -378,169 +365,84 @@ export default {
                 });
         },
         pay(saveOrder = true) {
-            this.paySubmit(saveOrder).then(() => {
-                if (this.money) {
-                    this.$nextTick(() => {
-                        if (window.cordova && window.cordova.platformId === 'ios' && this.$store.state.review) {
-                            window.store.order('358');
-                            this.getOrder(true);
-                        } else if (this.payType === 'ALIPAY') {
-                            if (this.inWeixin) {
-                                document.location.replace(
-                                    resolveUrl(this.$baseUrl, '/payOrder/v2/alipay_wx?id=' + this.orderId)
-                                );
-                            } else {
-                                this.$nextTick(() => {
-                                    document.getElementById('pay').click();
-                                });
-
-                                this.$toast.loading({
-                                    message: '加载中...',
-                                    forbidClick: true
-                                });
-                                this.getOrder(true);
-                            }
-                        } else if (this.payType === 'WEIXIN') {
-                            this.$toast.loading('加载中');
-                            if ('wx_pub' === this.payChannel) {
-                                wx.chooseWXPay({
-                                    ...this.weixinOptions,
-                                    success(res) {
-                                        this.$toast.success('支付成功');
-                                        setTimeout(() => {
-                                            this.$router.replace('/orders');
-                                        }, 1000);
-                                    },
-                                    fail(e) {
-                                        console.log(e);
-                                        this.$toast('支付失败,请稍后再试');
-                                    }
-                                });
-                            } else {
-                                this.$toast.clear();
-                                this.$nextTick(() => {
-                                    document.getElementById('pay').click();
-                                });
+            console.log('pay saveOrder=' + saveOrder);
+            if (this.money === 0) {
+                this.$toast.success('支付成功');
+                setTimeout(() => {
+                    this.$router.replace('/orderDetail?id=' + this.orderId);
+                }, 1000);
+                return;
+            }
+            if (this.payType === 'SYXPAY') {
+                this.$toast.clear();
+                this.$router.replace('/bankPay?id=' + this.orderId);
+            } else if (this.payType === 'IAP') {
+                window.store.order('358');
+                this.getOrder(true);
+            } else if (this.payType === 'ALIPAY_BRIDGE') {
+                document.location.replace(resolveUrl(this.$baseUrl, '/payOrder/v2/alipay_wx?id=' + this.orderId));
+            } else if (this.payType === 'ALIPAY') {
+                this.$toast.loading({
+                    message: '支付中',
+                    forbidClick: true
+                });
+                (this.payUrlScheme
+                    ? Promise.resolve()
+                    : this.$http.get(`/payOrder/v2/alipay?id=${this.orderId}`).then(res => {
+                          this.payUrlScheme = res;
+                      })
+                )
+                    .then(() => {
+                        this.$nextTick(() => {
+                            document.getElementById('pay').click();
+                        });
 
-                                this.$toast.loading({
-                                    message: '加载中...',
-                                    forbidClick: true
-                                });
-                                this.getOrder(true);
-                            }
-                        } else if (this.payType === 'H5PAY') {
-                            document.location.href = resolveUrl(
-                                this.$baseUrl,
-                                '/payOrder/v2/sandQuick?id=' + this.orderId
-                            );
-                        }
-                    });
-                } else {
-                    this.$toast.success('支付成功');
-                    setTimeout(() => {
-                        this.$router.replace('/orderDetail?id=' + this.orderId);
-                    }, 1000);
-                }
-            });
-        },
-        paySubmit(saveOrder = true) {
-            return new Promise((resolve, reject) => {
-                if (this.money && saveOrder) {
-                    this.$toast.clear();
-                    this.$router.replace({ query: { ...this.$route.query, orderId: this.orderId } });
-                    this.$nextTick(() => {
-                        if (window.cordova && window.cordova.platformId === 'ios' && this.$store.state.review) {
-                            resolve();
-                        } else if (this.payType === 'ALIPAY') {
-                            if (this.inWeixin) {
-                                resolve();
-                            } else {
-                                this.$http
-                                    .get(`/payOrder/v2/alipay?id=${this.orderId}`)
-                                    .then(res => {
-                                        this.$toast.clear();
-                                        this.hrefUrl = res;
-                                        resolve();
-                                    })
-                                    .catch(e => {
-                                        if (e && e.error) {
-                                            this.$toast.clear();
-                                            this.$dialog
-                                                .alert({
-                                                    title: '提示',
-                                                    message: this.backReson(e.error)
-                                                })
-                                                .then(res => {
-                                                    this.$router.back();
-                                                });
-                                            reject();
-                                        }
-                                    });
-                            }
-                        } else if (this.payType === 'WEIXIN') {
-                            this.$toast.loading('加载中');
-                            this.$http
-                                .post('/payOrder/weixin', {
-                                    id: this.orderId,
-                                    channel: this.payChannel,
-                                    openId: localStorage.getItem('openId') || 'oWJG55wLnwdVzXoKka1-DzQKOd_Y'
-                                })
-                                .then(res => {
-                                    if ('wx_pub' === this.payChannel) {
-                                        this.weixinOptions = res;
-                                        resolve();
-                                    } else {
-                                        this.$toast.clear();
-                                        this.hrefUrl = res.scheme_code;
-                                        resolve();
-                                    }
-                                    // console.log({
-                                    //     ...res,
-                                    //     package: res.package || res.packageValue
-                                    // });
-                                    // let _this = this;
-                                    // wx.chooseWXPay({
-                                    //     ...res,
-                                    //     package: res.package || res.packageValue,
-                                    //     timestamp: res.timeStamp,
-                                    //     success(res) {
-                                    //         _this.$toast.success('支付成功');
-                                    //         setTimeout(() => {
-                                    //             _this.$router.replace('/orders');
-                                    //         }, 1000);
-                                    //     },
-                                    //     fail(e) {
-                                    //         console.log(e);
-                                    //         _this.$toast('支付失败,请稍后再试');
-                                    //     }
-                                    // });
-                                })
-                                .catch(e => {
-                                    this.$toast.clear();
-                                    this.$dialog
-                                        .alert({
-                                            title: '提示',
-                                            message: this.backReson(e.error || '支付失败请稍后再试')
-                                        })
-                                        .then(res => {
-                                            this.$router.back();
-                                        });
-                                    reject();
-                                });
-                        } else if (this.payType === 'H5PAY') {
-                            this.$router.replace({
-                                path: '/submit',
-                                query: {
-                                    orderId: this.orderId
-                                }
+                        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();
                             });
-                            resolve();
-                        }
                     });
-                } else {
-                    resolve();
+            } else if (this.payType === 'UNION') {
+                const url = resolveUrl(this.$baseUrl, '/payOrder/v2/sandQuick?id=' + this.orderId)
+                    .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 === 'BALANCE') {
+                if (!this.tradeCode) {
+                    this.$toast.clear();
+                    this.showPwdDialog = true;
+                    return;
                 }
-            });
+                this.$toast.loading({
+                    message: '支付中',
+                    forbidClick: true
+                });
+                this.$http
+                    .post('/payOrder/v2/balance', { id: this.orderId, tradeCode: this.tradeCode })
+                    .then(res => {
+                        this.$toast.success('支付成功');
+                        setTimeout(() => {
+                            this.$router.replace('/orderDetail?id=' + this.orderId);
+                        }, 1000);
+                    })
+                    .catch(e => {
+                        this.tradeCode = '';
+                        this.$toast(e.error || '支付失败');
+                    });
+            }
         },
         goCoupon() {
             if (!this.orderId) {
@@ -684,6 +586,11 @@ export default {
         height: 24px;
         display: block;
     }
+    .img-icon {
+        width: 45px;
+        .flex();
+        justify-content: center;
+    }
     span {
         font-size: 14px;
         font-weight: bold;
@@ -696,6 +603,12 @@ export default {
         width: 24px;
         height: 24px;
     }
+
+    &.not {
+        span {
+            color: @text3;
+        }
+    }
 }
 
 .bottom {
@@ -753,4 +666,10 @@ export default {
         }
     }
 }
+.van-number-keyboard {
+    z-index: 9999;
+}
+:deep(.van-password-input__item) {
+    background: @bg3;
+}
 </style>

+ 1 - 0
src/views/account/Login.vue

@@ -223,6 +223,7 @@ export default {
 }
 .loginHeight {
     min-height: calc(100vh - 46px);
+    min-height: calc(var(--app-height) - 46px);
 }
 /deep/input:-webkit-autofill {
     box-shadow: 0 0 0px 1000px #101010 inset;

+ 1 - 0
src/views/account/Register.vue

@@ -231,6 +231,7 @@ export default {
 }
 .loginHeight {
     min-height: calc(100vh - 46px);
+    min-height: calc(var(--app-height) - 46px);
 }
 .tabs {
     display: flex;

+ 7 - 7
src/views/activity/ChooseProduct.vue

@@ -26,7 +26,7 @@
             <van-empty
                 v-if="empty"
                 description="没有符合兑换的藏品哦~"
-                :image="require('../../assets/kong_png_yongyoude  (1).png')"
+                :image="require('../../assets/empty_img_asset.png')"
             />
 
             <div class="list">
@@ -68,7 +68,7 @@
         <div class="tips" v-if="showTips">当前可兑换藏品不足</div>
 
         <div class="action-btn">
-            <!-- <van-button round color="#939599" plain>取消</van-button> -->
+            <!-- <van-button round color="@text3" plain>取消</van-button> -->
             <van-button type="primary" round @click="goHome" v-if="empty || showTips">去购买</van-button>
             <van-button type="primary" @click="submit" v-else :disabled="!canNext" round>确认</van-button>
         </div>
@@ -216,7 +216,7 @@ export default {
 
     .sub {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 22px;
         .flex();
         justify-content: space-between;
@@ -234,11 +234,11 @@ export default {
             display: inline-block;
             min-width: 60px;
             height: 20px;
-            background: #f5f7fa;
+            background: @bg3;
             border-radius: 10px;
             text-align: center;
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 17px;
             margin-top: 4px;
         }
@@ -277,7 +277,7 @@ export default {
 
             .text2 {
                 font-size: 12px;
-                color: #939599;
+                color: @text3;
                 line-height: 17px;
             }
         }
@@ -299,7 +299,7 @@ export default {
         flex-grow: 1;
         // &.van-button--disabled {
         //     background: #303133;
-        //     color: #939599;
+        //     color: @text3;
         //     opacity: 1;
         // }
     }

+ 4 - 4
src/views/activity/Detail1.vue

@@ -39,7 +39,7 @@ export default {
     },
     computed: {
         isSolded() {
-            return !this.info.stock;
+            return this.info.stock && this.info.stock > 0;
         }
     },
     mounted() {
@@ -130,7 +130,7 @@ export default {
 
     div {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 22px;
         padding: 0 8px 0 6px;
 
@@ -139,7 +139,7 @@ export default {
             font-size: 12px;
             color: #000000;
             line-height: 22px;
-            background: #939599;
+            background: @text3;
         }
     }
 }
@@ -159,7 +159,7 @@ export default {
         width: 132px;
         &.van-button--disabled {
             background: #303133;
-            color: #939599;
+            color: @text3;
             opacity: 1;
         }
     }

+ 50 - 48
src/views/activity/Submit.vue

@@ -34,11 +34,28 @@
         </div>
 
         <div class="pay" v-if="!$store.state.review">
-            <div class="pay-item" @click="payType = item.type" v-for="(item, index) in payInfos" :key="index">
-                <img class="icon" :src="item.icon" alt="" />
-                <span>{{ item.name }}</span>
-                <img class="choose-icon" :src="payType === item.type ? icons[1] : icons[0]" alt="" />
+            <pay-method-pick v-model="payType"></pay-method-pick>
+
+            <!-- <div class="img-icon">
+                    <img class="icon" src="@assets/icon_RMB.png" alt="" />
+                </div>
+                <span>数字人民币</span>
+                <img class="choose-icon" :src="icons[2]" alt="" />
+            </div>
+            <div class="pay-item not" @click="wait">
+                <div class="img-icon">
+                    <img class="icon" src="@assets/icon-jifen1.png" alt="" />
+                </div>
+                <span>积分</span>
+                <img class="choose-icon" :src="icons[2]" alt="" />
             </div>
+            <div class="pay-item not" @click="wait">
+                <div class="img-icon">
+                    <img class="icon" src="@assets/icon-lvzhoushi.png" alt="" />
+                </div>
+                <span>绿洲石</span>
+                <img class="choose-icon" :src="icons[2]" alt="" />
+            </div> -->
         </div>
 
         <div class="bottom van-safe-area-bottom" ref="bottom">
@@ -66,10 +83,12 @@
 import asset from '../../mixins/asset';
 import product from '../../mixins/product';
 import resolveUrl from 'resolve-url';
+import PayMethodPick from '../../components/PayMethodPick.vue';
 let inWeixin = /micromessenger/i.test(navigator.userAgent);
 let inApp = /#cordova#/i.test(navigator.userAgent);
 let inIos = /iPhone|iPad|iPod/i.test(navigator.userAgent);
 export default {
+    components: { PayMethodPick },
     name: 'activitySubmit',
     inject: ['setKeeps'],
     mixins: [asset, product],
@@ -77,7 +96,7 @@ export default {
         return {
             addressInfo: {},
             list: [],
-            payType: inWeixin ? 'WEIXIN' : 'ALIPAY',
+            payType: null,
             payChannel: null,
             payInfos: [
                 {
@@ -95,7 +114,11 @@ export default {
                 //   name: "DCEP",
                 // },
             ],
-            icons: [require('@assets/svgs/icon_gouxuan_huise.svg'), require('@assets/icon_gouxuan_pre.png')],
+            icons: [
+                require('@assets/svgs/icon_gouxuan_huise.svg'),
+                require('@assets/icon_gouxuan_pre.png'),
+                require('@assets/icon_gouxuan_huise1.png')
+            ],
             inWeixin,
             inApp,
             inIos,
@@ -158,44 +181,6 @@ export default {
                     });
             });
         }
-
-        Promise.all([
-            inWeixin
-                ? this.$http.get('/sysConfig/get/enable_wx_pub').then(res => {
-                      this.enable_wx_pub = res.value.split(',').findIndex(i => i === this.$route.query.id) > -1;
-                      return Promise.resolve();
-                  })
-                : Promise.resolve(),
-            this.$http.get('/sysConfig/get/enable_wx_lite').then(res => {
-                this.enable_wx_lite =
-                    res.value.split(',').findIndex(i => i === this.$route.query.id) > -1 &&
-                    !/AliApp/i.test(navigator.userAgent);
-                return Promise.resolve();
-            })
-        ]).then(() => {
-            if (!(this.enable_wx_lite || this.enable_wx_pub)) {
-                this.payInfos.splice(1, 1);
-                this.payType = 'ALIPAY';
-            } else if (this.enable_wx_pub) {
-                this.payChannel = 'wx_pub';
-            } else {
-                this.payChannel = 'wx_lite';
-            }
-
-            this.$http.get('/sysConfig/get/enable_sand_quick').then(res => {
-                // eslint-disable-next-line no-extra-boolean-cast
-                if (res.value === 'true' || res.value === true || res.value === '1') {
-                    this.payType = 'H5PAY';
-                    this.payInfos = [
-                        {
-                            icon: require('@assets/icon_yinlian.png'),
-                            name: '银联快捷付',
-                            type: 'H5PAY'
-                        }
-                    ];
-                }
-            });
-        });
     },
     methods: {
         onAdd() {
@@ -277,7 +262,10 @@ export default {
                         this.$router.replace({ query: { ...this.$route.query, orderId: res.id } });
 
                         this.$nextTick(() => {
-                            if (this.$store.state.review) {
+                            if (this.payType === 'SYXPAY') {
+                                this.$toast.clear();
+                                this.$router.replace('/bankPay?id=' + this.orderId + '&type=mint');
+                            } else if (this.$store.state.review) {
                                 window.store.order('358');
                                 this.getOrder(true);
                             } else if (this.payType === 'ALIPAY') {
@@ -368,11 +356,14 @@ export default {
                                     .catch(e => {
                                         this.$toast(e.error || '支付失败请稍后再试');
                                     });
-                            } else if (this.payType === 'H5PAY') {
+                            } else if (this.payType === 'UNION') {
                                 document.location.href = resolveUrl(
                                     this.$baseUrl,
                                     '/payOrder/v2/mint/sandQuick?id=' + this.orderId
-                                );
+                                )
+                                    .replace('www.raex.vip', 'jump.raex.vip')
+                                    .replace('test.raex.vip', 'jumptest.raex.vip')
+                                    .replace(/http:\/\/192\.168.*?\//, 'https://jumptest.raex.vip/');
                             }
                         });
                     } else {
@@ -466,7 +457,7 @@ export default {
 
         .text2 {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 17px;
         }
     }
@@ -485,6 +476,11 @@ export default {
         height: 24px;
         display: block;
     }
+    .img-icon {
+        width: 45px;
+        .flex();
+        justify-content: center;
+    }
     span {
         font-size: 14px;
         font-weight: bold;
@@ -497,6 +493,12 @@ export default {
         width: 24px;
         height: 24px;
     }
+
+    &.not {
+        span {
+            color: @text3;
+        }
+    }
 }
 .pay {
     padding: 0 16px;

+ 1 - 1
src/views/asset/Consignment.vue

@@ -412,7 +412,7 @@ export default {
             .flex();
             justify-content: space-between;
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 24px;
 
             .val {

+ 50 - 7
src/views/asset/Detail.vue

@@ -652,13 +652,13 @@ export default {
                     });
                 }
                 wx.updateAppMessageShareData({
-                    title: '第九空间-' + res.name,
+                    title: '绿洲宇宙-' + res.name,
                     desc: '全球首个基于区块链的游戏资产集换中心',
                     link: location.origin + '/9th/assetDetail?id=' + res.id,
                     imgUrl: this.getImg(this.changeImgs(this.banners), '', 600)
                 });
                 wx.updateTimelineShareData({
-                    title: '第九空间-' + res.name,
+                    title: '绿洲宇宙-' + res.name,
                     link: location.origin + '/9th/assetDetail?id=' + res.id,
                     imgUrl: this.getImg(this.changeImgs(this.banners), '', 600)
                 });
@@ -826,7 +826,7 @@ export default {
 .conName {
     font-size: @font2;
     font-weight: 400;
-    color: #939599;
+    color: @text3;
     line-height: 24px;
     padding: 10px 0 16px 16px;
 }
@@ -1103,6 +1103,25 @@ export default {
         }
         span {
             color: #303133;
+    }
+    .border {
+        height: 1px;
+        background: #f2f3f5;
+        border-radius: 1px;
+        margin: 12px 0 6px;
+    }
+    .name1 {
+        width: 208px;
+        padding: 10px;
+        background: @bg3;
+        border-radius: 4px;
+        color: @text3;
+        margin-bottom: 11px;
+        .qrcodeImg {
+            width: 93px;
+            height: 93px;
+            border-radius: 11px;
+            margin-left: 60px;
         }
         .span {
             color: @text3;
@@ -1113,6 +1132,30 @@ export default {
             color: @text3;
             line-height: 18px;
             padding-bottom: 12px;
+            margin: 12px 0px 12px 44px;
+        }
+    }
+    .timename {
+        color: #ff4f50;
+        font-size: @font1;
+        padding-bottom: 12px;
+    }
+    .time {
+        color: @text3;
+        font-size: @font1;
+    }
+    .copy {
+        width: 220px;
+        height: 42px;
+        background: @bg3;
+        border-radius: 24px;
+        margin-bottom: 16px;
+        justify-content: center;
+        display: flex;
+        align-items: center;
+        .id {
+            font-size: @font2;
+            color: #303133;
         }
         .name {
             font-size: @font1;
@@ -1127,7 +1170,7 @@ export default {
 .textName {
     font-size: @font2;
     font-weight: 400;
-    color: #939599;
+    color: @text3;
     line-height: 24px;
     // padding-top: 10px;
     // padding: 10px 0 0 16px;
@@ -1204,7 +1247,7 @@ export default {
         .text5 {
             font-size: @font2;
             font-weight: 400;
-            color: #939599;
+            color: @text3;
             line-height: 24px;
             // padding-left: 10px;
         }
@@ -1385,7 +1428,7 @@ export default {
     }
 
     .no-btn {
-        color: #939599;
+        color: @text3;
         font-size: 12px;
     }
 }
@@ -1617,7 +1660,7 @@ export default {
 
 .status-text {
     font-size: @font4;
-    color: #939599;
+    color: @text3;
     line-height: 28px;
     text-align: center;
     padding: 14px 50px !important;

+ 1 - 5
src/views/asset/GiveSearch.vue

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

+ 1 - 0
src/views/asset/Search.vue

@@ -185,6 +185,7 @@ export default {
 .discover {
     background-color: @bg3;
     min-height: 100vh;
+    min-height: var(--app-height);
     box-sizing: border-box;
 }
 

+ 1 - 5
src/views/creator/Detail.vue

@@ -147,11 +147,7 @@
                 <show-info v-if="isShowType" v-model:info="list[index]" list></show-info>
                 <product-info v-else v-model:info="list[index]"></product-info>
             </template>
-            <van-empty
-                v-if="empty"
-                :image="require('@assets/kong_png_yongyoude  (1).png')"
-                description="没有任何收藏品哦~"
-            />
+            <van-empty v-if="empty" :image="require('@assets/empty_img_asset.png')" description="没有任何收藏品哦~" />
         </van-list>
     </van-pull-refresh>
 </template>

+ 264 - 0
src/views/creator/Home.vue

@@ -0,0 +1,264 @@
+<template>
+    <van-pull-refresh
+        success-text="加载成功"
+        success-duration="500"
+        class="follow"
+        v-model="isLoading"
+        :head-height="80"
+        @refresh="onRefresh"
+    >
+        <van-sticky ref="top" :offset-top="46">
+            <div class="top">
+                <div class="name">艺术机构</div>
+                <div class="search" @click="$router.push('/creatorSearch')">
+                    <img src="@assets/icon-sosuo.png" alt="" />
+                    <span>搜索你要的精彩</span>
+                </div>
+            </div>
+        </van-sticky>
+
+        <swiper pagination :space-between="16" class="mySwiper" :autoplay="{ delay: 3500 }" v-if="banners.length > 0">
+            <swiper-slide v-for="item in banners" :key="item.id">
+                <van-image radius="10" height="37.3vw" :src="item.pic" fit="cover" />
+            </swiper-slide>
+        </swiper>
+
+        <van-sticky :offset-top="96">
+            <van-tabs
+                class="dark"
+                v-model:active="sort"
+                :ellipsis="false"
+                line-width="16"
+                line-height="2"
+                @change="getData(true)"
+            >
+                <van-tab
+                    :title="item.label"
+                    :name="
+                        item.type === 'select' ? (sort === item.value[0] ? item.value[1] : item.value[0]) : item.value
+                    "
+                    :title-class="item.type === 'select' && sort === item.value[0] ? '' : 'asc'"
+                    :key="index"
+                    v-for="(item, index) in sourceOptions"
+                >
+                    <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-sticky>
+
+        <van-list class="list" v-model:loading="loading" :finished="finished" finished-text="" @load="getData">
+            <template v-for="(item, index) in list" :key="index">
+                <creator-small v-model:info="list[index]"></creator-small>
+            </template>
+            <van-empty :image="require('@assets/empty_img_asset.png')" v-if="empty" description="没有任何藏品哦~" />
+        </van-list>
+    </van-pull-refresh>
+</template>
+
+<script>
+import list from '../../mixins/list';
+import { Swiper, SwiperSlide } from 'swiper/vue';
+
+import 'swiper/swiper.min.css';
+import 'swiper/swiper-bundle.min.css';
+
+import SwiperCore, { Pagination, Autoplay } from 'swiper';
+import CreatorSmall from '../../components/creator/CreatorSmall.vue';
+
+// install Swiper modules
+SwiperCore.use([Pagination, Autoplay]);
+export default {
+    name: 'creatorList',
+    components: { Swiper, SwiperSlide, CreatorSmall },
+    inject: ['bar', 'setKeeps', 'scrollWrapper', 'changeScroll'],
+    mixins: [list],
+    data() {
+        return {
+            list: [],
+            empty: false,
+            sort: 'id,desc',
+            sourceOptions: [
+                {
+                    label: '全部',
+                    value: 'id,desc'
+                },
+                {
+                    label: '最新',
+                    value: 'createdAt,desc'
+                },
+                {
+                    label: '最热',
+                    value: 'followers,desc'
+                },
+                {
+                    label: '销量',
+                    value: ['sales,desc', 'sales,asc'],
+                    type: 'select'
+                }
+            ],
+            url: '/user/all',
+            scrollTop: 0,
+            banners: []
+        };
+    },
+    mounted() {
+        this.getBanner();
+    },
+    methods: {
+        beforeData() {
+            return {
+                query: { minter: true },
+                sort: this.sort
+            };
+        },
+        getBanner() {
+            return this.$http
+                .post(
+                    '/banner/all',
+                    {
+                        query: {
+                            type: 'MINTER',
+                            del: false
+                        },
+                        sort: 'sort,asc;createdAt,desc'
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    this.banners = res.content;
+                    this.$toast.clear();
+                    if (this.swiperRef) {
+                        this.swiperRef.update();
+                    }
+                });
+        },
+        onRefresh() {
+            this.getData(true).then(() => {
+                this.isLoading = false;
+            });
+        }
+    },
+    activated() {
+        this.$nextTick(() => {
+            this.changeScroll(this.scrollTop);
+        });
+    },
+    beforeRouteLeave(to, from, next) {
+        if (!to.meta.menuPage) {
+            this.scrollTop = this.scrollWrapper.value.scrollTop;
+            this.setKeeps(['creatorList']);
+        } else {
+            this.scrollTop = 0;
+            this.setKeeps(['creatorList'], false);
+        }
+        next();
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.follow {
+    background-color: #272b2e;
+    padding-bottom: 100px;
+}
+/deep/.van-tabs__nav--line.van-tabs__nav--complete {
+    border-color: #303133;
+}
+.top {
+    background-color: #222426;
+    padding: 0 16px;
+    height: 50px;
+    display: flex;
+    align-items: center;
+    position: relative;
+    .flex();
+    .name {
+        font-size: @font3;
+        font-weight: bold;
+        color: #fff;
+        line-height: 30px;
+    }
+    .search {
+        .flex();
+        flex-grow: 1;
+        background: #373b3e;
+        border-radius: 21px;
+        margin-left: 14px;
+        height: 32px;
+        padding: 0 20px;
+        img {
+            width: 16px;
+            height: 16px;
+        }
+        span {
+            font-size: 14px;
+            color: @text3;
+            line-height: 24px;
+            margin-left: 10px;
+        }
+    }
+}
+.tab {
+    position: relative;
+    padding-right: 14px;
+    .van-icon {
+        position: absolute;
+        right: 0;
+
+        &.van-icon-arrow-down {
+            top: 8px;
+        }
+
+        &.van-icon-arrow-up {
+            bottom: 8px;
+        }
+    }
+}
+.list {
+    padding: 8px;
+}
+::v-deep(.mySwiper) {
+    // height: 255px;
+    padding: 16px 0;
+    margin: 0 16px;
+    box-sizing: border-box;
+    // padding-bottom: 35px;
+
+    .swiper-pagination {
+        bottom: 30px;
+    }
+
+    .swiper-pagination-bullet {
+        width: 5px;
+        height: 5px;
+        border-radius: 5px;
+        background: @text3;
+        margin: 0 4px;
+        opacity: 1;
+    }
+
+    .swiper-pagination-bullet-active {
+        background: @prim;
+    }
+}
+
+/deep/.van-sticky--fixed {
+    background-color: #181818;
+
+    &:after {
+        content: '';
+        background-color: #181818;
+        position: absolute;
+        left: 0;
+        right: 0;
+        bottom: -4px;
+        height: 5px;
+    }
+}
+</style>

+ 1 - 5
src/views/creator/List.vue

@@ -36,11 +36,7 @@
             <template v-for="(item, index) in list" :key="index">
                 <creator-info v-model:info="list[index]"></creator-info>
             </template>
-            <van-empty
-                :image="require('@assets/kong_png_yongyoude  (1).png')"
-                v-if="empty"
-                description="没有任何藏品哦~"
-            />
+            <van-empty :image="require('@assets/empty_img_asset.png')" v-if="empty" description="没有任何藏品哦~" />
         </van-list>
     </van-pull-refresh>
 </template>

+ 7 - 3
src/views/hall/Detail.vue

@@ -583,6 +583,7 @@ export default {
     overflow: auto;
     width: 100vw;
     height: 100vh;
+    height: var(--app-height);
 }
 .swiper-content {
     position: relative;
@@ -592,6 +593,7 @@ export default {
         flex-shrink: 0;
     }
     height: 100vh;
+    height: var(--app-height);
 }
 .user-bg {
     background-size: 100% 100%;
@@ -758,7 +760,7 @@ export default {
             }
 
             &.status1 {
-                color: #939599;
+                color: @text3;
             }
         }
     }
@@ -948,6 +950,7 @@ export default {
     }
     .img-bg {
         min-height: calc(100vh - 95vw);
+        min-height: calc(var(--app-height) - 95vh);
     }
     .user-bg-img {
         height: 100vw;
@@ -1039,6 +1042,7 @@ export default {
         bottom: 0;
         left: auto;
         height: 100vh;
+        height: var(--app-height);
         width: 40px;
         flex-direction: column;
         right: 5px;
@@ -1088,12 +1092,12 @@ export default {
 
     .text2 {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 18px;
         padding-top: 6px;
         margin-top: 10px;
         text-indent: 24px;
-        background: #f5f7fa;
+        background: @bg3;
         border-radius: 4px;
         padding: 10px;
         margin: 10px 16px 0;

+ 38 - 5
src/views/hall/List.vue

@@ -15,14 +15,14 @@
         </van-sticky>
 
         <van-list v-model:loading="loading" :finished="finished" finished-text="" @load="getData">
-            <template v-for="(item, index) in list" :key="index">
-                <show-info v-model:info="list[index]" list></show-info>
+            <template v-for="(item, index) in showList" :key="index">
+                <show-info v-model:info="list[item.index]" list></show-info>
             </template>
 
             <van-empty
-                :image="require('@assets/kong_png_yongyoude hei.png')"
+                :image="require('@assets/empty_img_asset_dark.png')"
                 v-if="empty"
-                description="没有任何藏品哦~"
+                description="没有任何展厅哦~"
             />
         </van-list>
     </van-pull-refresh>
@@ -32,6 +32,8 @@
 import list from '../../mixins/list';
 import ShowInfo from '../../components/asset/showInfo.vue';
 export default {
+    name: 'hallList',
+    inject: ['bar', 'setKeeps', 'scrollWrapper', 'changeScroll'],
     mixins: [list],
     components: { ShowInfo },
     data() {
@@ -39,9 +41,25 @@ export default {
             list: [],
             empty: false,
             url: '/showroom/all',
-            type: 'COMPANY'
+            type: 'COMPANY',
+            scrollTop: 0
         };
     },
+    computed: {
+        showList() {
+            let list = [...this.list];
+            return list
+                .map((item, index) => {
+                    return {
+                        ...item,
+                        index: index
+                    };
+                })
+                .filter(item => {
+                    return item.collections && item.collections.length > 0;
+                });
+        }
+    },
     methods: {
         beforeData() {
             return {
@@ -64,6 +82,21 @@ export default {
                 this.getData(true);
             });
         }
+    },
+    activated() {
+        this.$nextTick(() => {
+            this.changeScroll(this.scrollTop);
+        });
+    },
+    beforeRouteLeave(to, from, next) {
+        if (to.name == 'hall') {
+            this.scrollTop = this.scrollWrapper.value.scrollTop;
+            this.setKeeps(['hallList']);
+        } else {
+            this.scrollTop = 0;
+            this.setKeeps(['hallList'], false);
+        }
+        next();
     }
 };
 </script>

+ 5 - 5
src/views/hall/Post.vue

@@ -250,7 +250,7 @@ export default {
             }
             .text2 {
                 font-size: 12px;
-                color: #939599;
+                color: @text3;
                 transform: scale(0.8);
                 width: 200px;
                 position: absolute;
@@ -274,7 +274,7 @@ export default {
         }
         .text1 {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 12px;
             transform: scale(0.8);
         }
@@ -325,7 +325,7 @@ export default {
     margin-top: 6px;
     span {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 22px;
         padding: 0 10px;
         background: @bg3;
@@ -336,7 +336,7 @@ export default {
 
 .status {
     font-size: 14px;
-    color: #939599;
+    color: @text3;
     line-height: 24px;
     padding-top: 11px;
 }
@@ -344,7 +344,7 @@ export default {
 .sold {
     background-color: #1c1e25;
     font-size: @font1;
-    color: #939599;
+    color: @text3;
     padding: 0 17px;
     border-radius: 13px;
     line-height: 24px;

+ 4 - 4
src/views/hall/ProductAdd.vue

@@ -16,7 +16,7 @@
             <van-empty
                 v-if="empty"
                 description=" 你还没有藏品哦~"
-                :image="require(`../../assets/kong_png_yongyoude hei.png`)"
+                :image="require(`../../assets/empty_img_asset_dark.png`)"
             />
             <div class="list">
                 <div
@@ -48,7 +48,7 @@
         </van-list>
 
         <div class="btns">
-            <van-button color="#939599" @click="$router.back()" plain round>取消</van-button>
+            <van-button color="@text3" @click="$router.back()" plain round>取消</van-button>
             <van-button round type="primary" @click="sure">确认</van-button>
         </div>
     </div>
@@ -153,7 +153,7 @@ export default {
         }
         .text2 {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 22px;
         }
     }
@@ -162,7 +162,7 @@ export default {
         .flex();
         .text1 {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 22px;
         }
 

+ 4 - 4
src/views/hall/ProductChoose.vue

@@ -16,7 +16,7 @@
             <van-empty
                 v-if="empty"
                 description=" 你还没有藏品哦~"
-                :image="require(`../../assets/kong_png_yongyoude hei.png`)"
+                :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)">
@@ -34,7 +34,7 @@
         </van-list>
 
         <div class="btns">
-            <van-button color="#939599" @click="$router.back()" plain round>取消</van-button>
+            <van-button color="@text3" @click="$router.back()" plain round>取消</van-button>
         </div>
     </div>
 </template>
@@ -129,7 +129,7 @@ export default {
         }
         .text2 {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 22px;
         }
     }
@@ -138,7 +138,7 @@ export default {
         .flex();
         .text1 {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 22px;
         }
 

+ 2 - 2
src/views/order/ActivityDetail.vue

@@ -66,7 +66,7 @@
             <div class="tips-item">
                 <div class="text1">订单编号</div>
                 <div class="text2">
-                    <van-button @click="copy" color="#939599" plain size="mini">复制</van-button>
+                    <van-button @click="copy" color="@text3" plain size="mini">复制</van-button>
                     <span>{{ info.id }}</span>
                 </div>
             </div>
@@ -364,7 +364,7 @@ export default {
 
     .text2 {
         font-size: 13px;
-        color: #939599;
+        color: @text3;
         line-height: 24px;
         .flex();
         img {

+ 1 - 0
src/views/order/ActivityOrders.vue

@@ -166,6 +166,7 @@ export default {
 .discover {
     background-color: @bg3;
     min-height: 100vh;
+    min-height: var(--app-height);
 }
 
 .list {

+ 2 - 2
src/views/order/Detail.vue

@@ -59,7 +59,7 @@
             <div class="tips-item">
                 <div class="text1">订单编号</div>
                 <div class="text2">
-                    <van-button @click="copy" color="#939599" plain size="mini">复制</van-button>
+                    <van-button @click="copy" color="@text3" plain size="mini">复制</van-button>
                     <span>{{ info.id }}</span>
                 </div>
             </div>
@@ -162,7 +162,7 @@ export default {
             });
         }
     },
-    beforeRouteLeave() {
+    beforeUnmount() {
         if (this.timer) {
             clearInterval(this.timer);
             this.timer = null;

+ 1 - 0
src/views/order/Orders.vue

@@ -152,6 +152,7 @@ export default {
 .discover {
     background-color: @bg3;
     min-height: 100vh;
+    min-height: var(--app-height);
 }
 
 .list {

+ 222 - 0
src/views/pay/BankPay.vue

@@ -0,0 +1,222 @@
+<template>
+    <div class="pay">
+        <div class="title">总计</div>
+        <div class="price">
+            <img src="@assets/jiage_huang.png" alt="" />
+            <span>{{ price }}</span>
+        </div>
+
+        <van-cell title="支付银行卡" isLink @click="chooseBanK">
+            <div class="code" v-if="bankInfo.bindCardId">{{ bankName }}</div>
+            <div class="code not" v-else>请选择</div>
+        </van-cell>
+
+        <div class="btn">
+            <van-button type="primary" block round :disabled="!this.bankInfo.bindCardId" @click="submit"
+                >确认支付</van-button
+            >
+        </div>
+
+        <phone-code ref="code" @onSubmit="onSubmit" @bind="bind"></phone-code>
+    </div>
+</template>
+
+<script>
+import phoneCode from '../../components/phoneCode.vue';
+export default {
+    components: { phoneCode },
+    data() {
+        return {
+            orderId: 0,
+            price: 0,
+            bankInfo: {},
+            payOrder: {},
+            type: 'order'
+        };
+    },
+    computed: {
+        bankName() {
+            if (this.bankInfo.bindCardId) {
+                return this.bankInfo.bankName + '(' + this.bankInfo.bankNo.slice(-4) + ')';
+            }
+            return '';
+        }
+    },
+    mounted() {
+        if (this.$route.query.id) {
+            this.orderId = this.$route.query.id;
+            if (this.$route.query.type) {
+                this.type = this.$route.query.type;
+            }
+            if (this.type === 'gift') {
+                this.$http.get('/giftOrder/get/' + this.orderId).then(res => {
+                    this.price = res.gasPrice;
+                });
+            } else if (this.type === 'mint') {
+                this.$http.get('/mintOrder/get/' + this.orderId).then(res => {
+                    this.price = res.gasPrice;
+                });
+            } else {
+                this.$http.get('/order/get/' + this.orderId).then(res => {
+                    this.price = res.totalPrice;
+                });
+            }
+
+            this.$http.get('/user/myBankCard').then(res => {
+                if (res.length !== 0) {
+                    this.bankInfo = res[0];
+                }
+            });
+        }
+    },
+    methods: {
+        submit(e) {
+            if (!this.checkWebDriver(e)) {
+                return;
+            }
+            if (!this.bankInfo.bindCardId) {
+                this.$toast('请选择银行卡');
+                return;
+            }
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            if (this.type === 'gift') {
+                this.$http
+                    .post('/payOrder/v2/gift/agreement?id=' + this.orderId, {
+                        bindCardId: this.bankInfo.bindCardId
+                    })
+                    .then(res => {
+                        this.payOrder = res;
+                        if (res.needCaptcha) {
+                            this.onSubmit(e);
+                        }
+                    })
+                    .catch(e => {
+                        this.$toast(e.error);
+                    });
+            } else if (this.type === 'mint') {
+                this.$http
+                    .post('/payOrder/v2/mint/agreement?id=' + this.orderId, {
+                        bindCardId: this.bankInfo.bindCardId
+                    })
+                    .then(res => {
+                        this.payOrder = res;
+                        if (res.needCaptcha) {
+                            this.onSubmit(e);
+                        }
+                    })
+                    .catch(e => {
+                        this.$toast(e.error);
+                    });
+            } else {
+                this.$http
+                    .post('/payOrder/v2/agreement?id=' + this.orderId, {
+                        bindCardId: this.bankInfo.bindCardId
+                    })
+                    .then(res => {
+                        this.payOrder = res;
+                        if (res.needCaptcha) {
+                            this.onSubmit(e);
+                        }
+                    })
+                    .catch(e => {
+                        this.$toast(e.error);
+                    });
+            }
+        },
+        onSubmit(e) {
+            if (!this.checkWebDriver(e)) {
+                return;
+            }
+
+            this.$toast.success('发送成功');
+            this.$refs.code.init();
+        },
+        bind(code) {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.$http
+                .post(
+                    `/payOrder/v2/confirmAgreement?requestId=${this.payOrder.requestId}&paymentOrderId=${this.payOrder.paymentOrderId}&code=${code}`
+                )
+                .then(() => {
+                    this.$toast.success('支付成功');
+                    setTimeout(() => {
+                        if (this.type == 'gift') {
+                            this.$router.go(-2);
+                        } else if (this.type === 'mint') {
+                            this.$router.replace('/activityOrderDetail?id=' + this.orderId);
+                        } else {
+                            this.$router.replace('/orderDetail?id=' + this.orderId);
+                        }
+                    }, 1000);
+                })
+                .catch(e => {
+                    this.$toast(e.error);
+                    setTimeout(() => {
+                        this.$router.go(-1);
+                    }, 1000);
+                });
+        },
+        chooseBanK() {
+            if (!this.bankInfo.bindCardId) {
+                this.$router.push('/mineBanksAdd');
+            }
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.title {
+    font-size: 14px;
+    font-weight: bold;
+    color: #000000;
+    line-height: 24px;
+}
+.pay {
+    padding: 30px 0;
+    .flex-col();
+    align-items: center;
+}
+.van-cell {
+    margin-top: 58px;
+}
+
+.price {
+    .flex();
+    align-items: flex-end;
+    margin-top: 14px;
+    img {
+        width: 10px;
+        height: 11px;
+        margin-bottom: 5px;
+    }
+    span {
+        font-size: 36px;
+        font-family: OSP-DIN, OSP;
+        color: #3ab200;
+        line-height: 30px;
+    }
+}
+
+.btn {
+    width: 100%;
+    box-sizing: border-box;
+    padding: 188px 48px;
+}
+
+.code {
+    font-size: 14px;
+    color: #000;
+    line-height: 24px;
+
+    &.not {
+        color: #c8c9cc;
+    }
+}
+</style>

+ 13 - 7
src/views/product/Detail.vue

@@ -281,6 +281,12 @@
                     <van-button class="no-btn" v-else-if="limit.limit > 0 && limit.count >= limit.limit" block round>
                         限购{{ limit.limit }}件
                     </van-button>
+                    <div
+                        class="btn-assignments"
+                        v-else-if="isLogin && userInfo.vipPurchase && info.openQuota && info.vipPurchase > 0"
+                    >
+                        <van-button @click="vipAssignment" class="vip" type="danger" block round> vip通道 </van-button>
+                    </div>
                     <template v-else-if="assignment && ((isLogin && userInfo.vipPoint < 1) || !isLogin)">
                         <div class="btn-assignments" v-if="isLogin && userInfo.vipPurchase && info.openQuota">
                             <van-button @click="vipAssignment" class="vip" type="danger" block round>
@@ -499,13 +505,13 @@ export default {
                     }
                     if (this.inWeixin) {
                         wx.updateAppMessageShareData({
-                            title: '第九空间-' + res.name,
+                            title: '绿洲宇宙-' + res.name,
                             desc: '全球首个基于区块链的游戏资产集换中心',
                             link: location.origin + '/9th/productDetail/' + res.id,
                             imgUrl: this.getImg(this.changeImgs(this.banners), '', 300)
                         });
                         wx.updateTimelineShareData({
-                            title: '第九空间-' + res.name,
+                            title: '绿洲宇宙-' + res.name,
                             link: location.origin + '/9th/productDetail/' + res.id,
                             imgUrl: this.getImg(this.changeImgs(this.banners), '', 300)
                         });
@@ -934,7 +940,7 @@ export default {
 .conName {
     font-size: @font2;
     font-weight: 400;
-    color: #939599;
+    color: @text3;
     line-height: 24px;
     // padding: 10px 0 0 16px;
 }
@@ -947,7 +953,7 @@ export default {
     span {
         font-size: @font2;
         font-weight: 400;
-        color: #939599;
+        color: @text3;
         line-height: 24px;
     }
 }
@@ -1100,7 +1106,7 @@ export default {
 .textName {
     font-size: @font2;
     font-weight: 400;
-    color: #939599;
+    color: @text3;
     line-height: 24px;
     // padding-top: 10px;
 }
@@ -1196,7 +1202,7 @@ export default {
             border-width: 0px;
         }
         .no-btn {
-            color: #939599;
+            color: @text3;
             background-color: #303133;
             border-width: 0;
 
@@ -1257,7 +1263,7 @@ export default {
 
 .status-text {
     font-size: @font4;
-    color: #939599;
+    color: @text3;
     line-height: 28px;
     text-align: center;
     padding: 14px 50px !important;

+ 3 - 5
src/views/product/HopeMarket.vue

@@ -108,11 +108,7 @@
                     <product-info dark v-model:info="list[index]" @update:info="init"></product-info>
                 </template>
 
-                <van-empty
-                    :image="require('@assets/kong_png_yongyoude  (1).png')"
-                    v-if="empty"
-                    description="没有任何藏品哦~"
-                />
+                <van-empty :image="require('@assets/empty_img_asset.png')" v-if="empty" description="没有任何藏品哦~" />
             </van-list>
         </van-pull-refresh>
     </div>
@@ -419,6 +415,7 @@ export default {
     padding: 8px;
     box-sizing: border-box;
     min-height: calc(100vh - 200px);
+    min-height: calc(var(--app-height) - 200px);
 }
 .top {
     background-color: #222426;
@@ -597,6 +594,7 @@ export default {
     position: absolute;
     width: 100vw;
     height: 100vh;
+    height: var(--app-height);
     background-color: transparent;
     top: 0;
     left: 0;

+ 1 - 6
src/views/product/List.vue

@@ -66,11 +66,7 @@
                 <product-info v-model:info="list[index]" @update:info="init"></product-info>
             </template>
 
-            <van-empty
-                :image="require('@assets/kong_png_yongyoude  (1).png')"
-                v-if="empty"
-                description="没有任何藏品哦~"
-            />
+            <van-empty :image="require('@assets/empty_img_asset.png')" v-if="empty" description="没有任何藏品哦~" />
         </van-list>
     </van-pull-refresh>
 </template>
@@ -263,7 +259,6 @@ export default {
 .van-list {
     padding: 8px;
     box-sizing: border-box;
-    min-height: calc(100vh - 200px);
 }
 .top {
     background-color: @bg;

+ 2 - 2
src/views/product/NewsDetail.vue

@@ -137,7 +137,7 @@ export default {
     /deep/.van-button {
         &.van-button--disabled {
             background: #303133;
-            color: #939599;
+            color: @text3;
             opacity: 1;
         }
     }
@@ -158,7 +158,7 @@ export default {
     }
     span {
         font-size: 14px;
-        color: #939599;
+        color: @text3;
         margin-left: 3px;
         line-height: 32px;
     }

+ 1 - 5
src/views/product/NewsList.vue

@@ -5,11 +5,7 @@
                 <news-large v-model:info="list[index]"></news-large>
             </template>
 
-            <van-empty
-                :image="require('@assets/kong_png_yongyoude  (1).png')"
-                v-if="empty"
-                description="没有任何藏品哦~"
-            />
+            <van-empty :image="require('@assets/empty_img_asset.png')" v-if="empty" description="没有任何藏品哦~" />
         </van-list>
     </div>
 </template>

+ 447 - 7
src/views/product/Tasks.vue

@@ -1,7 +1,8 @@
 <template>
-    <div class="tasks">
-        <van-image class="bg" width="100%" :src="registerBg" fit="scale-down" />
-        <div class="box">
+    <div class="tasks" :class="{ isMine: isMine }">
+        <!-- <van-image class="bg" width="100%" :src="registerBg" fit="scale-down" /> -->
+        <img class="bg" :src="registerBg" alt="" />
+        <div class="box" v-if="!isMine">
             <div class="title">帮好友助力获得白名单权限</div>
             <van-form ref="form">
                 <van-field
@@ -48,14 +49,110 @@
                 </div>
             </van-form>
         </div>
+
+        <div class="rank">
+            <div class="title">排行榜</div>
+            <div class="table">
+                <div class="tr">
+                    <div class="th">排名</div>
+                    <div class="th">用户信息</div>
+                    <div class="th">邀请人数</div>
+                </div>
+
+                <div class="tr" v-for="(item, index) in ranks" :key="index">
+                    <div class="td">
+                        <img v-if="index < 3" :src="ranksImg[index]" alt="" />
+                        <div class="td-no" v-else>{{ index + 1 }}</div>
+                    </div>
+                    <div class="td">{{ item.nickName }}</div>
+                    <div class="td">{{ item.count || 0 }}人</div>
+                </div>
+                <div class="tr empty" v-if="ranks.length === 0">
+                    <div class="not">暂无数据</div>
+                </div>
+            </div>
+        </div>
+
+        <div class="float">
+            <div class="float-btn" v-if="isMine" @click="showRecords = true">
+                <img src="@assets/icon-yaoqingjilv.png" alt="" />
+                <span class="text">邀请记录</span>
+            </div>
+            <div class="float-btn" v-if="rule" @click="showRule = true">
+                <img src="@assets/icon-huodongguize.png" alt="" />
+                <span class="text">活动规则</span>
+            </div>
+        </div>
+
+        <img src="@assets/icon-zhuye.png" @click="goHome" alt="" class="home" />
+
+        <van-overlay :show="showRule" @click="showRule = false">
+            <div class="rule" @click.stop="">
+                <div class="rule-title">活动规则</div>
+                <div class="rule-content" v-html="rule"></div>
+            </div>
+        </van-overlay>
+
+        <van-overlay :lock-scroll="false" :show="showRecords" @click="showRecords = false">
+            <div class="record" @click.stop="">
+                <img src="@assets/records.png" class="record-bg" alt="" />
+                <img class="record-title" src="@assets/png-yaoqingjilv.png" alt="" />
+                <div class="record-order">
+                    <div class="order-item">
+                        <div class="text1">
+                            <img src="@assets/icon-leijiyaoqing.png" alt="" />
+                            <span>累计邀请</span>
+                        </div>
+                        <div class="text2">{{ mineRecord.count }}人</div>
+                    </div>
+                    <div class="order-item">
+                        <div class="text1">
+                            <img src="@assets/icon-paiming.png" alt="" />
+                            <span>当前排名</span>
+                        </div>
+                        <div class="text2">{{ mineRecord.index ? '第' + mineRecord.index + '名' : '暂未入榜' }}</div>
+                    </div>
+                    <div class="order-item">
+                        <div class="text1">
+                            <img src="@assets/icon-julishangyiming.png" alt="" />
+                            <span>距离上一名</span>
+                        </div>
+                        <div class="text2">{{ mineRecord.lastCount ? mineRecord.lastCount + '人' : '暂无数据' }}</div>
+                    </div>
+                </div>
+                <div class="record-content">
+                    <div class="record-info empty" v-if="records.length === 0">
+                        <div class="status not">暂无数据</div>
+                    </div>
+                    <div class="record-info" v-for="(item, index) in records" :key="index">
+                        <van-image width="24" height="24" radius="30" :src="item.avatar" />
+                        <div class="record-info-text">
+                            <div class="text1">{{ item.phone }}</div>
+                            <div class="text2">{{ item.time }}</div>
+                        </div>
+                        <div class="status">{{ item.authStatus === 'SUCCESS' ? '已认证' : '未认证' }}</div>
+                    </div>
+                </div>
+            </div>
+        </van-overlay>
+
+        <post ref="post" :info="shareProduct" noButton></post>
+
+        <div class="btn" v-if="isMine">
+            <van-button color="#FF4F50" @click="share" type="primary" block round>立即邀请</van-button>
+        </div>
     </div>
 </template>
 
 <script>
 import { mapState } from 'vuex';
 import phone from '../../mixins/phone';
+import Post from '../../components/Post.vue';
 export default {
     mixins: [phone],
+    components: {
+        Post
+    },
     data() {
         return {
             form: {
@@ -66,18 +163,70 @@ export default {
             },
             checked: false,
             registerBg: '',
-            checkTimer: null
+            checkTimer: null,
+            rule: '',
+            showRule: false,
+            showRecords: false,
+            shareProduct: {},
+            ranks: [],
+            ranksImg: [
+                require('@assets/task_icon_no1.png'),
+                require('@assets/task_icon_no2.png'),
+                require('@assets/task_icon_no3.png')
+            ],
+            mineRecord: {},
+            records: []
         };
     },
     computed: {
-        ...mapState(['productId', 'invitor'])
+        ...mapState(['productId', 'invitor']),
+        isMine() {
+            return this.isLogin && this.invitor && this.invitor.toString() === this.$store.state.userInfo.id.toString();
+        }
     },
     mounted() {
+        if (this.$route.query.invitor) {
+            this.$store.commit('setInvitor', this.$route.query.invitor);
+
+            if (this.$route.query.id) {
+                this.$store.commit('setProductId', this.$route.query.id);
+            }
+        }
         if (this.productId) {
             this.form.collectionId = this.productId;
             this.$http.get('/collection/get/' + this.productId).then(res => {
                 this.registerBg = res.registerBg;
+                this.rule = res.rule;
+                this.shareProduct = res;
+            });
+
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
             });
+            this.$http
+                .post('/user/collectionInvitorList?collectionId=' + this.productId)
+                .then(res => {
+                    this.ranks = res.slice(0, 10);
+                    this.$toast.clear();
+                })
+                .catch(() => {
+                    this.$toast.clear();
+                });
+
+            if (this.isLogin) {
+                this.$http
+                    .post(
+                        '/user/findMyInviteRecord?collectionId=' +
+                            this.productId +
+                            '&userId=' +
+                            this.$store.state.userInfo.id
+                    )
+                    .then(res => {
+                        this.mineRecord = res;
+                        this.records = res.invitedUserDTOS;
+                    });
+            }
         }
         if (this.invitor) {
             this.form.invitor = this.invitor;
@@ -87,6 +236,9 @@ export default {
         this.clearTimer();
     },
     methods: {
+        share() {
+            this.$refs.post.init();
+        },
         sendPhone(e) {
             this.$refs.form.validate('手机号码').then(() => {
                 if (!this.checkWebDriver(e)) {
@@ -153,6 +305,9 @@ export default {
                 clearInterval(this.checkTimer);
                 this.checkTimer = null;
             }
+        },
+        goHome() {
+            this.$router.push('/home');
         }
     }
 };
@@ -165,17 +320,104 @@ export default {
 }
 .bg {
     display: block;
+    min-height: 100vh;
+    min-height: var(--app-height);
+    width: 100%;
+    height: auto;
 }
 .box {
     width: calc(100vw - 40px);
     background: #ffffff;
     border-radius: 30px;
     position: absolute;
-    top: 268px;
+    top: 71.5vw;
     left: 20px;
     padding-bottom: 14px;
 }
 
+.rank {
+    width: calc(100vw - 40px);
+    background: #ffffff;
+    border-radius: 30px;
+    padding: 0 16px 16px;
+    top: 216.5vw;
+    position: absolute;
+    box-sizing: border-box;
+    left: 20px;
+    min-height: 500px;
+    .table {
+        .tr {
+            .flex();
+
+            .th {
+                font-size: 12px;
+                color: @text3;
+                line-height: 17px;
+                &:first-child {
+                    width: 20%;
+                }
+                &:nth-child(2) {
+                    width: 60%;
+                }
+
+                &:last-child {
+                    width: 20%;
+                    text-align: center;
+                }
+            }
+
+            .td {
+                font-size: 14px;
+                color: #000000;
+                line-height: 24px;
+                .td-no {
+                    width: 38px;
+                    text-align: center;
+                    font-size: 16px;
+                    font-family: AlibabaPuHuiTi-Bold, AlibabaPuHuiTi;
+                    font-weight: bold;
+                    color: @text3;
+                    line-height: 38px;
+                }
+                &:first-child {
+                    width: 20%;
+                    img {
+                        width: 38px;
+                        height: 38px;
+                        display: block;
+                    }
+                }
+                &:nth-child(2) {
+                    width: 60%;
+                    overflow: hidden;
+                    white-space: nowrap;
+                    text-overflow: ellipsis;
+                }
+
+                &:last-child {
+                    width: 20%;
+                    text-align: center;
+                    font-weight: bold;
+                }
+            }
+        }
+
+        .tr + .tr {
+            margin-top: 10px;
+        }
+
+        .empty {
+            .not {
+                text-align: center;
+                font-size: 12px;
+                color: @text3;
+                flex-grow: 1;
+                padding: 20px;
+            }
+        }
+    }
+}
+
 .title {
     font-size: 16px;
     font-weight: bold;
@@ -189,7 +431,7 @@ export default {
     padding: 0 20px;
 
     .van-field__control {
-        background: #f5f7fa;
+        background: @bg3;
         border-radius: 22px;
         height: 38px;
         padding: 0 10px 0 20px;
@@ -212,4 +454,202 @@ export default {
         min-width: 98px;
     }
 }
+
+.float-btn {
+    .flex();
+    border-radius: 100px 0px 0px 100px;
+    position: fixed;
+    right: 0;
+    padding: 0 16px;
+    height: 38px;
+
+    img {
+        width: 18px;
+        height: 18px;
+    }
+    span {
+        font-size: 14px;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 24px;
+        margin-left: 4px;
+    }
+
+    &:first-child {
+        bottom: 315px;
+        background: linear-gradient(360deg, #ff4e37 0%, #ff7373 100%);
+    }
+    &:last-child {
+        bottom: 255px;
+        background: linear-gradient(180deg, #ffab27 0%, #ff7f1f 100%);
+    }
+}
+
+.isMine {
+    height: calc(71.5vw + 653px);
+    overflow: hidden;
+
+    .bottom(56px);
+    .rank {
+        top: 71.5vw;
+    }
+}
+
+.rule {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    background-color: #ffffff;
+    width: 300px;
+    border-radius: 8px;
+    padding: 0 16px 16px;
+    .rule-title {
+        font-size: 14px;
+        font-weight: bold;
+        color: #000000;
+        line-height: 24px;
+        text-align: center;
+        padding: 12px 0 16px;
+    }
+
+    /deep/.rule-content {
+        ol {
+            list-style-type: none;
+            counter-reset: sectioncounter;
+        }
+        ol li:before {
+            content: counter(sectioncounter) '、';
+            counter-increment: sectioncounter;
+        }
+    }
+}
+
+.record {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    background-color: #ffecea;
+    width: 300px;
+    border-radius: 8px;
+    overflow: hidden;
+    padding: 16px 12px 16px;
+    .record-bg {
+        width: 100%;
+        height: 206px;
+        display: block;
+        position: absolute;
+        top: 0;
+        left: 0;
+        z-index: -1;
+    }
+
+    .record-title {
+        width: 120px;
+        height: 30px;
+        display: block;
+        margin: auto;
+    }
+
+    .record-order {
+        height: 70px;
+        background: #ffffff;
+        border-radius: 8px;
+        margin-top: 16px;
+        .flex();
+        .order-item {
+            .flex-col();
+            align-items: center;
+            width: 33%;
+            .text1 {
+                .flex();
+                img {
+                    width: 18px;
+                    height: 18px;
+                    display: block;
+                }
+
+                span {
+                    font-size: 12px;
+                    color: #000000;
+                    line-height: 17px;
+                }
+            }
+
+            .text2 {
+                font-size: 14px;
+                font-weight: bold;
+                color: #ff4f50;
+                line-height: 24px;
+                margin-top: 6px;
+            }
+        }
+    }
+}
+.record-content {
+    background: #ffffff;
+    border-radius: 8px;
+    margin-top: 12px;
+    padding: 0 10px;
+    max-height: 372px;
+    overflow: auto;
+    min-height: 100px;
+    .record-info {
+        .flex();
+        height: 50px;
+
+        .record-info-text {
+            flex-grow: 1;
+            margin-left: 6px;
+            .text1 {
+                font-size: 12px;
+                color: #000000;
+                line-height: 17px;
+            }
+            .text2 {
+                font-size: 10px;
+                color: @text3;
+                line-height: 10px;
+                margin-top: 2px;
+            }
+        }
+
+        .status {
+            font-size: 12px;
+            color: #000000;
+            line-height: 17px;
+
+            &.not {
+                color: @text3;
+            }
+        }
+
+        &.empty {
+            .status {
+                text-align: center;
+                flex-grow: 1;
+            }
+        }
+    }
+}
+
+.btn {
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    padding: 9px 40px;
+    background-color: #fff;
+    .bottom(9px);
+    z-index: 20;
+}
+
+.home {
+    position: fixed;
+    top: 16px;
+    left: 16px;
+    width: 32px;
+    height: 32px;
+}
 </style>

+ 1 - 1
src/views/user/AddressEdit.vue

@@ -15,7 +15,7 @@
         />
 
         <div class="back-list" v-if="!isEdit">
-            <van-button color="#939599" @click="$router.go(-1)" round block plain>返回</van-button>
+            <van-button color="@text3" @click="$router.go(-1)" round block plain>返回</van-button>
         </div>
     </div>
 </template>

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

@@ -0,0 +1,130 @@
+<template>
+    <van-pull-refresh
+        success-text="加载成功"
+        success-duration="500"
+        class="balance-record"
+        v-model="refreshing"
+        @refresh="onRefresh"
+    >
+        <van-list :loading="loading" :finished="finished" finished-text="" @load="getData">
+            <div class="record-item" v-for="item in list" :key="item.id" :class="item.amount > 0 ? 'add' : 'min'">
+                <img
+                    :src="
+                        item.amount > 0
+                            ? require('../../assets/icon_balance_add.png')
+                            : require('../../assets/icon_balance_min.png')
+                    "
+                    class="icon"
+                />
+                <div class="info">
+                    <div class="type">{{ balanceTypes[item.type] }}</div>
+                    <div class="time">{{ item.createdAt }}</div>
+                </div>
+                <div class="amount">{{ item.amount > 0 ? '+' : '' }}{{ item.amount }}</div>
+            </div>
+            <van-empty :image="require('@assets/empty_img_asset.png')" v-if="empty" description="没有任何记录哦~" />
+        </van-list>
+    </van-pull-refresh>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            refreshing: false,
+            loading: false,
+            finished: false,
+            empty: false,
+            page: 0,
+            list: [],
+            balanceTypes: {
+                WITHDRAW: '提现',
+                SELL: '藏品出售',
+                RETURN: '失败退回',
+                PAY: '订单支付',
+                RECHARGE: '充值'
+            }
+        };
+    },
+    created() {},
+    methods: {
+        getData() {
+            this.loading = true;
+            this.$http.get('/userBalance/my/record', { page: this.page, sort: 'createdAt,desc' }).then(res => {
+                this.empty = res.empty;
+                this.finished = res.last;
+                this.loading = false;
+                this.refreshing = false;
+                if (this.page === 0) {
+                    this.list = [];
+                }
+                this.list = this.list.concat(res.content);
+                this.page++;
+            });
+        },
+        onRefresh() {
+            this.page = 0;
+            this.getData();
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.balance-record {
+    background: @bg3;
+    .record-item {
+        height: 64px;
+        padding: 0 20px;
+        .flex();
+        background: white;
+        position: relative;
+        &::after {
+            .setBottomLine();
+            left: 20px;
+            right: 20px;
+        }
+        .icon {
+            width: 32px;
+            height: 32px;
+        }
+        .info {
+            margin-left: 10px;
+            flex-grow: 1;
+            .flex-col();
+            .type {
+                font-size: 14px;
+                color: black;
+                line-height: 24px;
+            }
+            .time {
+                color: @text3;
+                font-size: 12px;
+                line-height: 17px;
+            }
+        }
+        .amount {
+            font-size: 16px;
+            font-weight: bold;
+        }
+        &.min {
+            .info {
+                .type {
+                    color: #ff7f1f;
+                }
+            }
+            .amount {
+                color: #ff7f1f;
+            }
+        }
+        &.add {
+            .info {
+                .type {
+                    color: #3ab200;
+                }
+            }
+            .amount {
+                color: #3ab200;
+            }
+        }
+    }
+}
+</style>

+ 22 - 9
src/views/user/Banks.vue

@@ -9,7 +9,7 @@
 
         <div class="list">
             <van-swipe-cell :name="index" v-for="(item, index) in list" :key="index" :before-close="beforeClose">
-                <div class="bank-info">
+                <div class="bank-info" :style="{ background: getColor(item.bankNo) }">
                     <div class="info1">
                         <div class="text1">{{ item.bankName }}</div>
                         <div class="text2">{{ getNum(item.bankNo) }}</div>
@@ -34,6 +34,7 @@
 export default {
     data() {
         return {
+            colorList: ['#6b73a1', '#ea4f56', '#36a0b9', '#f79439'],
             list: []
         };
     },
@@ -41,6 +42,25 @@ export default {
         this.getBank();
     },
     methods: {
+        getColor(bank) {
+            const cyrb53 = function (str, seed = 0) {
+                let h1 = 0xdeadbeef ^ seed,
+                    h2 = 0x41c6ce57 ^ seed;
+                for (let i = 0, ch; i < str.length; i++) {
+                    ch = str.charCodeAt(i);
+                    h1 = Math.imul(h1 ^ ch, 2654435761);
+                    h2 = Math.imul(h2 ^ ch, 1597334677);
+                }
+                h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
+                h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
+                return 4294967296 * (2097151 & h2) + (h1 >>> 0);
+            };
+            if (bank) {
+                console.log(cyrb53(bank));
+                return this.colorList[cyrb53(bank) % 4];
+            }
+            return this.colorList[0];
+        },
         getBank() {
             this.$http.get('/user/myBankCard').then(res => {
                 this.list = res;
@@ -81,7 +101,7 @@ export default {
                 forbidClick: true
             });
             this.$http
-                .post('/user/removeBankCard')
+                .post('/userBankCard/unbind')
                 .then(res => {
                     this.$toast.success('解绑成功');
                     this.getBank();
@@ -150,13 +170,6 @@ export default {
 .bank-info {
     color: #fff;
     border-radius: 8px;
-    each(@colorList,{
-        &:nth-child( 4n + @{index} ){
-            background:  linear-gradient(90deg, @value, lighten(@value , 10%) 100%);
-        }
-    
-    });
-
     height: 100px;
     .flex-col();
     // margin: 20px 16px;

+ 81 - 47
src/views/user/BanksAdd.vue

@@ -6,6 +6,7 @@
             <template #sub-prim>不能修改</template>
         </page-bar>
         <van-form @submit="onSubmit" class="form">
+            <van-field class="name" type="digit" name="持卡人" label="持卡人" :maxlength="23" v-model="name" disabled />
             <van-field
                 type="digit"
                 name="卡号"
@@ -36,38 +37,36 @@
             </div>
         </van-form>
 
-        <van-popup class="popup-content" v-model:show="show" teleport="body" position="bottom">
-            <div class="popup">
-                <div class="cancel" @click="show = false">取消</div>
-                <div class="title">输入验证码</div>
-                <div class="phone">已发送到您{{ phoneText }}手机</div>
-                <div class="send" @click="onSubmit">未收到验证码?</div>
-                <van-password-input :value="form.code" :length="4" />
-                <!-- 数字键盘 -->
-                <van-number-keyboard
-                    maxlength="4"
-                    theme="custom"
-                    v-model="form.code"
-                    :show="show"
-                    close-button-text="完成"
-                    @close="bind"
-                />
-            </div>
-        </van-popup>
+        <phone-code ref="code" @onSubmit="onSubmit" @bind="bind"></phone-code>
     </div>
 </template>
 
 <script>
+import phoneCode from '../../components/phoneCode.vue';
 import phone from '../../mixins/phone';
 export default {
+    components: { phoneCode },
     mixins: [phone],
     data() {
         return {
             form: {},
-            show: false
+            show: false,
+            identityAuthInfo: {},
+            bindCardId: 0
         };
     },
     computed: {
+        name() {
+            let name = '';
+            if (this.identityAuthInfo.realName) {
+                for (let i = 0; i < this.identityAuthInfo.realName.length - 1; i++) {
+                    name += '*';
+                }
+            }
+
+            name += (this.identityAuthInfo.realName || '').slice(-1);
+            return name;
+        },
         canNext() {
             return this.form.bankNo && this.form.phone;
         },
@@ -80,38 +79,56 @@ export default {
             return '';
         }
     },
+    mounted() {
+        this.$http.post('/identityAuth/my').then(res => {
+            this.identityAuthInfo = res;
+        });
+    },
     methods: {
         onSubmit(e) {
             if (!this.checkWebDriver(e)) {
                 return;
             }
-            this.sendMsg(this.form.phone);
-            this.form.code = '';
-            this.show = true;
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            let bankNo = this.form.bankNo.replace(/ /g, '');
+            this.$http
+                .post('/userBankCard/bindCard?phone=' + this.form.phone + '&bankNo=' + bankNo)
+                .then(res => {
+                    this.bindCardId = res.bindCardId;
+                    this.$toast.success('发送成功');
+                    this.$refs.code.init();
+                    // return this.$http.post('/userBankCard/bindCardCaptcha?bindCardId=' + res.bindCardId);
+                })
+                .catch(e => {
+                    if (e.error.indexOf('渠道系统异常') !== -1) {
+                        this.$toast('暂不支持该银行');
+                    } else {
+                        this.$toast(e.error);
+                    }
+                });
         },
-        bind() {
-            if (!this.form.code || this.form.code.length < 4) {
-                this.$toast('请输入验证码');
-            } else {
-                this.$toast.loading({
-                    message: '加载中...',
-                    forbidClick: true
+        bind(code) {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            let bankNo = this.form.bankNo.replace(/ /g, '');
+            this.$http
+                .post(`/userBankCard/bindCardConfirm?bindCardId=${this.bindCardId}&code=${code}`)
+                .then(res => {
+                    this.$toast.success('添加成功');
+                    setTimeout(() => {
+                        this.$router.go(-1);
+                    }, 1000);
+                })
+                .catch(e => {
+                    if (e) {
+                        this.$toast(e.error);
+                    }
                 });
-                let bankNo = this.form.bankNo.replace(/ /g, '');
-                this.$http
-                    .post(`/user/addBankCard?bankNo=${bankNo}&phone=${this.form.phone}&code=${this.form.code}`)
-                    .then(res => {
-                        this.$toast.success('添加成功');
-                        setTimeout(() => {
-                            this.$router.go(-1);
-                        }, 1000);
-                    })
-                    .catch(e => {
-                        if (e) {
-                            this.$toast(e.error);
-                        }
-                    });
-            }
         },
         bankFormatter(val) {
             let _val = val.replace(/ /g, '');
@@ -141,7 +158,7 @@ export default {
         .van-field__body {
             line-height: 48px;
             border-radius: 8px;
-            border: 1px solid #939599;
+            border: 1px solid @text3;
             padding: 0 16px;
             margin-top: 6px;
 
@@ -160,6 +177,7 @@ export default {
 }
 @bottom: 280px;
 @gray3: #c8c9cc;
+@text3: #939599;
 .popup {
     color: #000;
     position: relative;
@@ -177,7 +195,7 @@ export default {
         font-size: @font1;
         font-family: PingFangSC-Regular, PingFang SC;
         font-weight: 400;
-        color: #939599;
+        color: @text3;
         line-height: 22px;
         padding: 21px 20px;
         left: 0;
@@ -189,7 +207,7 @@ export default {
         font-size: @font1;
         font-family: PingFangSC-Regular, PingFang SC;
         font-weight: 400;
-        color: #939599;
+        color: @text3;
         line-height: 22px;
         padding: 21px 20px;
         right: 0;
@@ -240,4 +258,20 @@ export default {
         color: @btnText;
     }
 }
+
+/deep/.name {
+    .van-field__body {
+        border-top-width: 0 !important;
+        border-left-width: 0 !important;
+        border-right-width: 0 !important;
+        border-color: #f5f7fa !important;
+        border-radius: 0 !important;
+        padding: 0 0 !important;
+    }
+    .van-field__control:disabled {
+        font-size: 16px !important;
+        color: #000;
+        -webkit-text-fill-color: #000;
+    }
+}
 </style>

+ 2 - 2
src/views/user/Exchange.vue

@@ -188,7 +188,7 @@ export default {
 .tab-title {
     padding: 0 16px 12px;
     font-size: 14px;
-    color: #939599;
+    color: @text3;
     line-height: 24px;
 }
 .bg {
@@ -223,7 +223,7 @@ export default {
 
 .text3 {
     font-size: 12px;
-    color: #939599;
+    color: @text3;
     line-height: 17px;
     margin-top: 6px;
     span + span {

+ 4 - 4
src/views/user/Level.vue

@@ -113,7 +113,7 @@ export default {
 
     .text2 {
         font-size: 12px;
-        color: #939599;
+        color: @text3;
         line-height: 17px;
     }
 }
@@ -127,7 +127,7 @@ export default {
 }
 .table-title {
     font-size: 12px;
-    color: #939599;
+    color: @text3;
     line-height: 17px;
     .flex();
     justify-content: center;
@@ -163,7 +163,7 @@ export default {
 
             &.td {
                 font-size: 12px;
-                color: #939599;
+                color: @text3;
                 line-height: 17px;
                 white-space: nowrap;
                 flex-shrink: 0;
@@ -174,7 +174,7 @@ export default {
         }
 
         &:nth-child(2n + 1) {
-            background: #f5f7fa;
+            background: @bg3;
         }
     }
 }

+ 1 - 1
src/views/user/Point.vue

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

+ 3 - 2
src/views/user/Rank.vue

@@ -80,6 +80,7 @@ export default {
     }
     padding: 48vw 10px 0;
     min-height: calc(100vh - 46px);
+    min-height: calc(var(--app-height) - 46px);
 
     .top-text {
         position: absolute;
@@ -128,7 +129,7 @@ export default {
         .flex();
         .th {
             font-size: 12px;
-            color: #939599;
+            color: @text3;
             line-height: 17px;
             padding: 15px 0;
 
@@ -192,7 +193,7 @@ export default {
             width: 38px;
             font-size: 20px;
             font-family: 'AlibabaPuHuiTi';
-            color: #939599;
+            color: @text3;
             font-weight: bold;
             line-height: 20px;
         }

+ 276 - 156
src/views/user/Wallet.vue

@@ -1,192 +1,312 @@
 <template>
     <div class="wallet">
-        <div class="top">
-            <div class="text1">个人账户余额</div>
-            <div class="text2">
-                <img src="@assets/svgs/icon_jiage.svg" alt="" />
-                <span>0</span>
-            </div>
+        <div class="wallet-card">
+            <div class="label">账户余额(元)</div>
+            <div class="value">{{ Number(userBalance.balance || 0).toFixed(2) }}</div>
             <div class="btns">
-                <van-button @click="wait" plain round color="#939599" size="mini">提现</van-button>
-                <van-button @click="wait" plain round type="primary" size="mini">充值</van-button>
+                <div class="btn btn-card" @click="$router.push({ name: 'mineBanks' })">我的银行卡</div>
+                <div class="btn btn-record" @click="$router.push({ name: 'balanceRecord' })">余额记录</div>
             </div>
-            <img src="@assets/svgs/topBg.svg" class="top-img" alt="" />
-        </div>
-
-        <div class="title">
-            <span>收入明细</span>
-            <van-popover v-model:show="showPopover" :actions="actions" theme="dark" @select="onSelect">
-                <template #reference>
-                    <van-button
-                        class="select"
-                        size="mini"
-                        color="#1C1E25"
-                        icon-position="right"
-                        :icon="require('@assets/svgs/icon_shaixuan_sanjiao.svg')"
-                        >2021年9月</van-button
-                    >
-                </template>
-            </van-popover>
         </div>
-        <div class="list">
-            <!-- <div class="info">
-                <div class="info-text">
-                    <div class="text1">提现</div>
-                    <div class="text2">奶盖</div>
-                    <div class="text2">09-03 09:56</div>
+        <div class="recharge-card">
+            <div class="title">选择金额</div>
+            <div class="amount">
+                <div
+                    class="item"
+                    v-for="item in amountOptions"
+                    :key="item"
+                    :class="{ active: amount === item }"
+                    @click="amount = item"
+                >
+                    {{ item }}
                 </div>
-                <div class="text3">-320</div>
             </div>
-            <div class="info">
-                <div class="info-text">
-                    <div class="text1">提现</div>
-                    <div class="text2">奶盖</div>
-                    <div class="text2">09-03 09:56</div>
-                </div>
-                <div class="text3">-320</div>
-            </div> -->
-            <van-empty :image="require('@assets/kong_png_yongyoude  (1).png')" description="暂时没有任何记录哦~" />
+            <div class="custom-amount">
+                <span class="yuan">¥</span>
+                <div class="placeholder" v-if="amount == undefined || amount === ''">请输入自定义金额</div>
+                <input type="number" v-model="amount" />
+            </div>
+            <div class="tip">
+                充值说明<br />1、本次充值仅限于平台消费,无法跨地区款站点使用<br />2、若遇到充值未到账,请联系客服
+            </div>
+            <div class="bottom">
+                <div class="btn-withdraw" @click="withdraw">提现</div>
+                <div class="btn-recharge" @click="recharge">充值</div>
+            </div>
         </div>
+        <van-action-sheet v-model:show="showWithdrawDialog" :closeable="false">
+            <div class="recharge-dialog">
+                <div class="title">
+                    <div class="text">充值详情</div>
+                    <div class="close">
+                        <img src="@assets/icon_dialog_close.png" />
+                    </div>
+                </div>
+            </div>
+        </van-action-sheet>
     </div>
 </template>
-
 <script>
-import { ref } from 'vue';
 export default {
-    setup() {
-        const showPopover = ref(false);
-
-        // 通过 actions 属性来定义菜单选项
-        const actions = [{ text: '2021年9月' }];
-
+    data() {
         return {
-            actions,
-            showPopover
+            userBalance: {
+                balance: 0
+            },
+            amountOptions: [100, 500, 1000, 2000, 5000, 10000],
+            amount: null,
+            minAmount: 100,
+            showWithdrawDialog: true
         };
     },
+    created() {
+        this.$http.get('/sysConfig/get/min_recharge_amount').then(res => {
+            this.minAmount = Number(res.value);
+        });
+        this.$http.get('/userBalance/my').then(res => {
+            this.userBalance = res;
+        });
+    },
     methods: {
-        onSelect(action) {
-            console.log(action);
+        recharge() {
+            if (!this.amount) {
+                this.$toast('请输入充值金额');
+                return;
+            }
+            const amount = Number(this.amount);
+            if (amount < this.minAmount) {
+                this.$toast('充值金额不能小于' + this.minAmount + '元');
+                return;
+            }
+            if (amount > 50000) {
+                this.$toast('充值金额不能大于50000');
+                return;
+            }
+            this.$toast.loading('充值中');
+            this.$http
+                .post('/payOrder/v2/recharge', { amount: this.amount })
+                .then(res => {
+                    this.openScheme(res);
+                    setTimeout(() => {
+                        this.$toast.clear();
+                    }, 1000);
+                })
+                .catch(e => {
+                    this.$toast(e.error || '充值失败');
+                });
+        },
+        withdraw() {
+            this.$dialog
+                .confirm({
+                    message: '是否申请提现?'
+                })
+                .then(() => {
+                    this.$toast.loading('申请提现');
+                    setTimeout(() => {
+                        this.$toast.clear();
+                        this.$dialog.alert({ message: '申请提现成功,预计1个工作日后到账' });
+                    }, 1000);
+                });
         }
     }
 };
 </script>
-
 <style lang="less" scoped>
-.top {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    padding: 50px 16px 53px;
-    background-color: @bg3;
-    position: relative;
-    .text1 {
-        font-size: 13px;
-        color: #939599;
-        line-height: 18px;
-    }
-    .text2 {
-        span {
+.wallet {
+    background: @bg3;
+    padding-top: 16px;
+    .flex-col();
+    .wallet-card {
+        height: 138px;
+        margin: 0 16px;
+        background: #404569;
+        background-image: url(../../assets/bg_wallet.png);
+        background-size: 182px 94px;
+        background-repeat: no-repeat;
+        background-position-x: right;
+        background-position-y: top;
+        border-radius: 9px;
+        color: white;
+        position: relative;
+        overflow: hidden;
+        .flex-col();
+        .label {
+            font-size: 14px;
+            line-height: 24px;
+            margin: 16px 0 0 16px;
+        }
+        .value {
+            font-family: OSP;
             font-size: 36px;
-            font-family: DIN;
-            font-weight: bold;
-            color: #fdfb60;
-            line-height: 44px;
-            background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
-            background-clip: text;
-            -webkit-background-clip: text;
-            -webkit-text-fill-color: transparent;
+            line-height: 30px;
+            margin: 4px 0 0 16px;
+            flex-grow: 1;
         }
-    }
-
-    .btns {
-        margin-top: 20px;
-        .van-button {
-            width: 90px;
-
-            &.van-button--primary {
-                border: solid 0px transparent;
-                padding: 1px;
-                background-image: linear-gradient(@bg, @bg), linear-gradient(135deg, #fdfb60, #ff8f3e);
-                background-origin: border-box;
-                box-sizing: border-box;
-                background-clip: content-box, border-box;
+        .btns {
+            color: @text3;
+            font-size: 14px;
+            background: #292a52;
+            .flex();
+            .btn {
+                flex-basis: 0;
+                flex-grow: 1;
+                height: 44px;
+                .flex();
+                align-items: center;
+                justify-content: center;
+                transition: color 0.1s;
+                &:active {
+                    color: fade(@text3, 20%);
+                }
+            }
+            .btn-card {
+                position: relative;
+                &:after {
+                    content: '';
+                    width: 1px;
+                    height: 20px;
+                    background: @text3;
+                    border-radius: 1px;
+                    position: absolute;
+                    top: 0;
+                    bottom: 0;
+                    right: 0;
+                    margin: auto;
+                }
             }
         }
-
-        .van-button + .van-button {
-            margin-left: 32px;
-        }
-    }
-}
-
-.top-img {
-    display: block;
-    width: 100%;
-    position: absolute;
-    bottom: 0;
-    left: 0;
-}
-
-.title {
-    padding: 20px 16px;
-    font-size: 16px;
-    font-weight: bold;
-    color: @text0;
-    line-height: 22px;
-    display: flex;
-    justify-content: space-between;
-}
-.select {
-    min-width: 100px;
-    height: 32px;
-    color: #939599 !important;
-
-    /deep/.van-icon__image {
-        width: 20px;
-        height: 20px;
-        display: block;
     }
-}
-
-.info {
-    display: flex;
-    padding: 0 16px;
-    height: 90px;
-    align-items: center;
-    position: relative;
-    .info-text {
+    .recharge-card {
+        margin: 16px 16px 0 16px;
+        padding-top: 16px;
+        border-radius: 16px 16px 0px 0px;
+        background: white;
         flex-grow: 1;
-        .text1 {
+        .title {
+            font-size: 16px;
+            font-weight: bold;
+            margin-left: 16px;
+        }
+        .amount {
+            margin: 16px 16px 0 0;
+            .flex();
+            flex-wrap: wrap;
+            .item {
+                width: calc((100vw - 96px) / 3);
+                margin-left: 16px;
+                margin-bottom: 16px;
+                border-radius: 4px;
+                background: fade(#393d62, 20%);
+                font-size: 32px;
+                font-family: OSP;
+                color: white;
+                height: 40px;
+                line-height: 40px;
+                text-align: center;
+                &.active {
+                    background: #393d62;
+                }
+            }
+        }
+        .custom-amount {
+            background: @bg3;
+            margin: 0 16px 16px 16px;
+            height: 48px;
+            border-radius: 4px;
+            color: @text3;
+            .flex();
+            padding-left: 12px;
+            padding-right: 16px;
             font-size: 14px;
-            color: @text0;
-            line-height: 20px;
-            margin-bottom: 4px;
+            font-weight: bold;
+            line-height: 48px;
+            position: relative;
+            .placeholder {
+                position: absolute;
+                left: 28px;
+                top: 0;
+                bottom: 0;
+                right: 16px;
+                text-align: center;
+                margin: auto;
+                font-weight: 400;
+                color: @text3;
+                font-size: 14px;
+                line-height: 48px;
+            }
+            input {
+                flex-grow: 1;
+                border: none;
+                background: none;
+                font-size: 24px;
+                color: black;
+                margin-left: 6px;
+                line-height: 48px;
+                padding: 0;
+                .flex();
+                font-family: OSP;
+                letter-spacing: 1px;
+                text-align: center;
+                z-index: 1;
+            }
         }
-
-        .text2 {
+        .tip {
             font-size: 12px;
-            color: #969799;
-            line-height: 17px;
-            margin-bottom: 2px;
+            color: @text3;
+            margin: 16px;
         }
     }
-
-    .text3 {
-        font-size: 16px;
-        font-weight: bold;
-        color: @text0;
-        line-height: 24px;
+    .bottom {
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        .flex();
+        height: 56px;
+        padding-bottom: env(safe-area-inset-bottom);
+        padding: 0 16px;
+        background: white;
+        border-top: 1px solid @border2;
+        .btn-withdraw {
+            flex: 1 0 0;
+            border-radius: 19px;
+            margin-right: 20px;
+            height: 38px;
+            font-size: 16px;
+            font-weight: bold;
+            color: #373a60;
+            background: fade(#393d62, 20%);
+            .flex();
+            justify-content: center;
+            &:active {
+                background: fade(#393d62, 30%);
+            }
+        }
+        .btn-recharge {
+            flex: 1 0 0;
+            border-radius: 19px;
+            height: 38px;
+            font-size: 16px;
+            font-weight: bold;
+            color: white;
+            background: #373a60;
+            .flex();
+            justify-content: center;
+            &:active {
+                background: fade(#393d62, 80%);
+            }
+        }
     }
-
-    &::before {
-        content: '';
-        position: absolute;
-        left: 16px;
-        right: 16px;
-        top: 0;
-        height: 1px;
-        background-color: #202122;
+}
+.recharge {
+    .title {
+        .flex();
+        .text {
+            margin-left: 16px;
+            font-size: 14px;
+            color: black;
+            font-weight: bold;
+        }
     }
 }
 </style>

+ 5 - 0
yarn.lock

@@ -1621,6 +1621,11 @@
   optionalDependencies:
     "prettier" "^1.18.2 || ^2.0.0"
 
+"@vue/composition-api@^1.6.1":
+  version "1.6.1"
+  resolved "https://registry.npmmirror.com/@vue/composition-api/-/composition-api-1.6.1.tgz#3b809802979af9ec06678437bead7617f0f85be5"
+  integrity sha512-QNeduwRllSRzo9ZOzZjtzCeGUx0sEfrEDHmQlf+goLw4calBPBbpYWf8ueh6VSBrWJGQRJPsRPmTVEeTKRKBMg==
+
 "@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.0.0-beta.18":
   "integrity" "sha512-2nM84dzo3B63pKgxwoArlT1d/yqSL0y2lG2GiyyGhwpyPTwkfIuJHlCNbputCoSCNnT6MMfenK1g7nv7Mea19A=="
   "resolved" "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.5.tgz"