Browse Source

[edit] treasure

wenliming 2 years ago
parent
commit
2ef3069182
5 changed files with 841 additions and 0 deletions
  1. 10 0
      nuxt.config.js
  2. 411 0
      pages/treasure/index.vue
  3. 413 0
      pages/treasure/invite.vue
  4. 6 0
      static/svg/icon-chrome-down.svg
  5. 1 0
      static/svg/icon-treasure.svg

+ 10 - 0
nuxt.config.js

@@ -91,6 +91,16 @@ export default {
           path: '/nft_group/:id',
           component: resolve(__dirname, 'pages/nft/group.vue')
         },
+        {
+          name: 'Treasure',
+          path: '/treasure/:id?',
+          component: resolve(__dirname, 'pages/treasure/index.vue')
+        },
+        {
+          name: 'TreasureInvite',
+          path: '/treasure/invite/:id/:channel?',
+          component: resolve(__dirname, 'pages/treasure/invite.vue')
+        },
         {
           name: 'custom',
           path: '*',

+ 411 - 0
pages/treasure/index.vue

@@ -0,0 +1,411 @@
+<template>
+    <div class="nft-content">
+        <template v-if="isLoading">
+            <img class="loading" src="../../static/svg/icon-loading.svg" />
+        </template>
+        <template v-else>
+            <template v-if="isMobile">
+                <div></div>
+            </template>
+            <template v-else>
+                <div class="logo">
+                    <img src="/img/icon-logo.png" alt />
+                </div>
+                <div class="show">
+                    <div class="center">
+                        <div class="content-wrapper">
+                            <img class="img img-left" :src="detail.postUserInfo.avatarUrl" alt="">
+                            <div class="middle">
+                                <div class="invite-txt">
+                                    @{{detail.postUserInfo.nickName}} invite you to
+                                </div>
+                                <div class="title">
+                                    Hunt the Treaure
+                                </div>
+                                <div class="up-gain-txt">
+                                    Each can gain up to <span class="amount"> ${{detail.upGainAmountValue}}</span>
+                                </div>
+                            </div>
+                            <img class="img" src="../../static/svg/icon-treasure.svg" alt="">
+                        </div>
+                        <div class="btn-wrapper" @click="clickBtn()">
+                            <template v-if="isChrome">
+                                Install Denet Chrome Extension
+                            </template>
+                            <template v-else>
+                                <img class="img"
+                                    src="../../static/svg/icon-chrome-down.svg" />
+                                    Open in Chrome to participate
+                            </template> 
+                        </div>
+                    </div>
+                </div>
+            </template>
+        </template>
+    </div>
+</template>
+
+<script>
+import axios from 'axios'
+import Cookies from 'js-cookie'
+import { Toast } from 'vant';
+import { isBrowser, appVersionCode, appType } from '../../utils/help.js'
+import Report from "@/log-center/log"
+
+const api = {
+    prod: 'https://api.denetme.net',
+    pre: 'https://preapi.denetme.net',
+    test: 'https://testapi.denetme.net'
+}
+const page = {
+    prod: "https://h5.denetme.net",
+    pre: "https://preh5.denetme.net",
+    test: 'https://testh5.denetme.net'
+}
+const jumpUrl = page[process.env.NUXT_ENV.MODE] + '/'
+const baseURL = api[process.env.NUXT_ENV.MODE]
+const ClipboardJS = require('clipboard')
+
+export default {
+    name: 'ntf',
+    data() {
+        return {
+            isLoading: true,
+            appVersionCode: appVersionCode,
+            jumpUrl: jumpUrl,
+            detail: {
+                postUserInfo: {
+                    avatarUrl: '',
+                    nickName: ''
+                }
+            },
+            config: {},
+            title: 'Treasure Hunt',
+            isMobile: false,
+            isChrome: false,
+            linkHref: '',
+            metaTitle: 'DeNet: An Easy Web3 Tool For GIVEAWAY / AIRDROP',
+        }
+    },
+    head() {
+        return {
+            type: '',
+            title: this.title,
+            appVersionCode: appVersionCode,
+            meta: [
+                // facebook
+                {
+                    name: 'og:title',
+                    content: this.metaTitle
+                },
+                {
+                    name: 'og:image',
+                    content: this.detail.imagePath || ''
+                },
+                // twitter
+                {
+                    name: 'twitter:card',
+                    content: 'summary_large_image'
+                },
+                {
+                    name: 'twitter:title',
+                    content: this.metaTitle
+                },
+                {
+                    name: 'twitter:image',
+                    content: this.detail.imagePath || ''
+                }
+            ]
+        }
+    },
+    async asyncData(params) {
+        let { route } = params;
+        let { data } = await axios.post(`${baseURL}/denet/post/treasure/detail`, {
+            baseInfo: {
+                appVersionCode: appVersionCode,
+                mid: function () {
+                    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+                        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+                        return v.toString(16);
+                    });
+                }()
+            },
+            params: {
+                postId: route.params.id || ''
+            }
+        })
+        if (data.code == 0) {
+            return {
+                detail: data.data,
+            }
+        }
+    },
+    created() {
+        this.setCookieMid();
+        this.getConfig();
+    },
+    mounted() {
+        setTimeout(() => {
+            this.checkInstall().then(() => {
+            }).catch(() => {
+                this.setTreasureInfo();
+            })
+        }, 600)
+        this.checkBrowser();
+        this.isLoading = false;
+
+        var clipboard = new ClipboardJS('.btn');
+        let that = this
+        clipboard.on('success', function (e) {
+            Toast('copy success');
+            // 埋点
+            that.trackingClick()
+            e.clearSelection();
+        });
+        this.pageSource = Report.pageSource.newUserLandingPage
+        // 埋点
+        if (this.isMobile) {
+            this.pageSource = Report.pageSource.mobileLandingPage
+        }
+        // Report.reportLog({
+        //     baseInfo: {
+        //         appVersionCode: appVersionCode,
+        //         mid: this.mid,
+        //         pageSource: this.pageSource,
+        //         appType,
+        //         machineCode: this.mid
+        //     },
+        //     params: {
+        //         eventData: {
+        //             businessType: Report.businessType.pageView,
+        //             postId: this.detail.postId,
+        //             srcContentId: this.detail.srcContentId,
+        //             senderId: this.detail.srcUserId,
+        //             redPacketType: 2,
+        //         }
+        //     }
+        // })
+    },
+    methods: {
+        clickBtn() {
+            if(this.isChrome) {
+                let { extensionsInstallUrl } = this.config;
+                window.open(extensionsInstallUrl)
+            } else {
+                installChrome();
+            }
+        },
+        checkInstall() {
+            return new Promise((resolve, reject) => {
+                let dom = document.querySelector('#denet_message');
+                if (dom) {
+                    resolve(true)
+                } else {
+                    reject(false)
+                }
+            })
+        },
+        trackingClick() {
+            // Report.reportLog({
+            //     baseInfo: {
+            //         appVersionCode: appVersionCode,
+            //         mid: this.mid,
+            //         pageSource: this.pageSource,
+            //         appType,
+            //         machineCode: this.mid
+            //     },
+            //     params: {
+            //         eventData: {
+            //             businessType: Report.businessType.buttonClick,
+            //             objectType: Report.objectType.installButton,
+            //             postId: this.detail.postId,
+            //             srcContentId: this.detail.srcContentId,
+            //             senderId: this.detail.srcUserId,
+            //             redPacketType: 2,
+            //         }
+            //     }
+            // })
+        },
+        guid() {
+            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+                var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+                return v.toString(16);
+            });
+        },
+        setCookieMid() {
+            let _cookie_mid_arr = Cookies.get('mid') || []
+            if (_cookie_mid_arr.length > 0) {
+                this.mid = JSON.parse(_cookie_mid_arr)[0].mid
+            } else {
+                this.mid = this.guid()
+                Cookies.set('mid', JSON.stringify([{ mid: this.mid }]), { expires: 1000 })
+            }
+        },
+        installExtension() {
+            // 埋点
+            this.trackingClick()
+            let { extensionsInstallUrl } = this.config;
+            window.open(extensionsInstallUrl)
+        },
+        installChrome() {
+            window.open('https://www.google.com/chrome')
+        },
+        async getConfig() {
+            let { data } = await axios.post(`${baseURL}/denet/base/config/getFrontConfig`, {
+                baseInfo: {
+                    appVersionCode: appVersionCode,
+                    mid: this.mid
+                },
+                params: {}
+            })
+            if (data.code == 0) {
+                this.config = data.data;
+            }
+        },
+        checkBrowser() {
+            this.linkHref = window.location.href;
+            this.isChrome = isBrowser() == 'chrome';
+            this.isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
+        },
+        setTreasureInfo() {
+            let treasureInfo = {
+                createTime: Date.now(),
+                jump_type: 'treasure_info',
+                postId: this.detail.srcContentId || '',
+                postNickName: this.detail.postUserInfo.nickName
+            };
+            Cookies.set('jump_info', JSON.stringify(treasureInfo), { expires: 100 });
+        },
+    }
+}
+</script>
+
+<style lang="scss">
+html,
+body,
+#__nuxt,
+#__layout {
+    width: 100%;
+    height: 100%;
+    padding: 0;
+    margin: 0;
+}
+
+.nft-content {
+    overflow: hidden;
+    width: 100%;
+    height: 100%;
+    background: linear-gradient(180deg, #D8EFFF 0%, #FFFFFF 44.3%);
+
+    .loading {
+        position: absolute;
+        transform: translate(-50%, -50%);
+        top: 50%;
+        left: 50%;
+        margin: auto;
+        width: 40px;
+        border-radius: 50%;
+    }
+
+    .logo {
+        display: flex;
+        align-items: center;
+        height: 70px;
+        margin-left: 25px;
+
+        img {
+            width: 99px;
+            height: 32px;
+        }
+    }
+
+    .show {
+        display: flex;
+        align-items: center;
+        height: calc(100% - 70px);
+
+        .center {
+            margin: -50px auto 0;
+            width: 480px;
+            height: 260px;
+            box-shadow: 0px 2px 18px rgba(0, 0, 0, 0.1);
+            border-radius: 12px;
+            display: flex;
+            justify-content: space-between;
+            flex-direction: column;
+            padding: 26px;
+            box-sizing: border-box;
+
+            .content-wrapper {
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                margin-top: 14px;
+
+                .img {
+                    width: 70px;
+                    height: 70px;
+                }
+
+                .img-left {
+                    border-radius: 50%;
+                }
+
+                .middle {
+                    padding: 0 20px;
+                    box-sizing: border-box;
+
+                    .invite-txt {
+                        color: #727272;
+                        font-weight: 400;
+                        font-size: 13px;
+                    }
+
+                    .title {
+                        font-weight: 800;
+                        font-size: 20px;
+                        margin: 6px 3px 0;
+                    }
+
+                    .up-gain-txt {
+                        color: #F8BC2B;
+                        font-weight: 600;
+                        font-size: 13px;
+                        display: flex;
+                        align-items: center;
+
+                        .amount {
+                            font-weight: 700;
+                            font-size: 22px;
+                        }
+                    }
+                }
+            }
+
+            .btn-wrapper {
+                margin-top: 54px;
+                padding: 16px;
+                box-sizing: border-box;
+                background: #1D9BF0;
+                border-radius: 100px;
+                color: #FFFFFF;
+                font-weight: 700;
+                font-size: 17px;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                cursor: pointer;
+
+                .img {
+                    width: 28px;
+                    height: 28px;
+                    margin-right: 8px;
+                }
+            }
+
+
+        }
+    }
+}
+
+</style>

+ 413 - 0
pages/treasure/invite.vue

@@ -0,0 +1,413 @@
+<template>
+    <div class="nft-content">
+        <template v-if="isLoading">
+            <img class="loading" src="../../static/svg/icon-loading.svg" />
+        </template>
+        <template v-else>
+            <template v-if="isMobile">
+                <div></div>
+            </template>
+            <template v-else>
+                <div class="logo">
+                    <img src="/img/icon-logo.png" alt />
+                </div>
+                <div class="show">
+                    <div class="center">
+                        <div class="content-wrapper">
+                            <img class="img img-left" 
+                                :src="detail.inviteUserInfo.avatarUrl" alt="">
+                            <div class="middle">
+                                <div class="invite-txt">
+                                    @{{detail.inviteUserInfo.nickName}} invite you to
+                                </div>
+                                <div class="title">
+                                    Hunt the Treaure
+                                </div>
+                                <div class="up-gain-txt">
+                                    Each can gain up to <span class="amount"> ${{detail.upGainAmountValue}}</span>
+                                </div>
+                            </div>
+                            <img class="img" src="../../static/svg/icon-treasure.svg" alt="">
+                        </div>
+                        <div class="btn-wrapper" @click="clickBtn()">
+                            <template v-if="isChrome">
+                                Install Denet Chrome Extension
+                            </template>
+                            <template v-else>
+                                <img class="img"
+                                    src="../../static/svg/icon-chrome-down.svg" />
+                                    Open in Chrome to participate
+                            </template> 
+                        </div>
+                    </div>
+                </div>
+            </template>
+        </template>
+    </div>
+</template>
+
+<script>
+import axios from 'axios'
+import Cookies from 'js-cookie'
+import { Toast } from 'vant';
+import { isBrowser, appVersionCode, appType } from '../../utils/help.js'
+import Report from "@/log-center/log"
+
+const api = {
+    prod: 'https://api.denetme.net',
+    pre: 'https://preapi.denetme.net',
+    test: 'https://testapi.denetme.net'
+}
+const page = {
+    prod: "https://h5.denetme.net",
+    pre: "https://preh5.denetme.net",
+    test: 'https://testh5.denetme.net'
+}
+const jumpUrl = page[process.env.NUXT_ENV.MODE] + '/'
+const baseURL = api[process.env.NUXT_ENV.MODE]
+const ClipboardJS = require('clipboard')
+
+export default {
+    name: 'ntf',
+    data() {
+        return {
+            isLoading: true,
+            appVersionCode: appVersionCode,
+            jumpUrl: jumpUrl,
+            detail: {
+                inviteUserInfo: {
+                    avatarUrl: "",
+                    nickName: ""
+                }
+            },
+            config: {},
+            title: 'Treasure Hunt',
+            isMobile: false,
+            isChrome: false,
+            linkHref: '',
+            metaTitle: 'DeNet: An Easy Web3 Tool For GIVEAWAY / AIRDROP',
+        }
+    },
+    head() {
+        return {
+            type: '',
+            title: this.title,
+            appVersionCode: appVersionCode,
+            meta: [
+                // facebook 
+                {
+                    name: 'og:title',
+                    content: this.metaTitle
+                },
+                {
+                    name: 'og:image',
+                    content: this.detail.imagePath || ''
+                },
+                // twitter
+                {
+                    name: 'twitter:card',
+                    content: 'summary_large_image'
+                },
+                {
+                    name: 'twitter:title',
+                    content: this.metaTitle
+                },
+                {
+                    name: 'twitter:image',
+                    content: this.detail.imagePath || ''
+                }
+            ]
+        }
+    },
+    async asyncData(params) {
+        let { route } = params;
+        let { data } = await axios.post(`${baseURL}/denet/post/treasure/invite/detail`, {
+            baseInfo: {
+                appVersionCode: appVersionCode,
+                mid: function () {
+                    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+                        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+                        return v.toString(16);
+                    });
+                }()
+            },
+            params: {
+                postId: route.params.id || ''
+            }
+        })
+        if (data.code == 0) {
+            return {
+                detail: data.data,
+            }
+        }
+    },
+    created() {
+        this.setCookieMid();
+        this.getConfig();
+    },
+    mounted() {
+        setTimeout(() => {
+            this.checkInstall().then(() => {
+
+            }).catch(() => {
+                this.setTreasureInfo();
+            })
+        }, 600)
+        this.checkBrowser();
+        this.isLoading = false;
+
+        var clipboard = new ClipboardJS('.btn');
+        let that = this
+        clipboard.on('success', function (e) {
+            Toast('copy success');
+            // 埋点
+            that.trackingClick()
+            e.clearSelection();
+        });
+        this.pageSource = Report.pageSource.newUserLandingPage
+        // 埋点
+        if (this.isMobile) {
+            this.pageSource = Report.pageSource.mobileLandingPage
+        }
+        // Report.reportLog({
+        //     baseInfo: {
+        //         appVersionCode: appVersionCode,
+        //         mid: this.mid,
+        //         pageSource: this.pageSource,
+        //         appType,
+        //         machineCode: this.mid
+        //     },
+        //     params: {
+        //         eventData: {
+        //             businessType: Report.businessType.pageView,
+        //             postId: this.detail.postId,
+        //             srcContentId: this.detail.srcContentId,
+        //             senderId: this.detail.srcUserId,
+        //             redPacketType: 2,
+        //         }
+        //     }
+        // })
+    },
+    methods: {
+        clickBtn() {
+            if(this.isChrome) {
+                let { extensionsInstallUrl } = this.config;
+                window.open(extensionsInstallUrl)
+            } else {
+                installChrome();
+            }
+        },
+        checkInstall() {
+            return new Promise((resolve, reject) => {
+                let dom = document.querySelector('#denet_message');
+                if (dom) {
+                    resolve(true)
+                } else {
+                    reject(false)
+                }
+            })
+        },
+        trackingClick() {
+            // Report.reportLog({
+            //     baseInfo: {
+            //         appVersionCode: appVersionCode,
+            //         mid: this.mid,
+            //         pageSource: this.pageSource,
+            //         appType,
+            //         machineCode: this.mid
+            //     },
+            //     params: {
+            //         eventData: {
+            //             businessType: Report.businessType.buttonClick,
+            //             objectType: Report.objectType.installButton,
+            //             postId: this.detail.postId,
+            //             srcContentId: this.detail.srcContentId,
+            //             senderId: this.detail.srcUserId,
+            //             redPacketType: 2,
+            //         }
+            //     }
+            // })
+        },
+        guid() {
+            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+                var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+                return v.toString(16);
+            });
+        },
+        setCookieMid() {
+            let _cookie_mid_arr = Cookies.get('mid') || []
+            if (_cookie_mid_arr.length > 0) {
+                this.mid = JSON.parse(_cookie_mid_arr)[0].mid
+            } else {
+                this.mid = this.guid()
+                Cookies.set('mid', JSON.stringify([{ mid: this.mid }]), { expires: 1000 })
+            }
+        },
+        installExtension() {
+            // 埋点
+            this.trackingClick()
+            let { extensionsInstallUrl } = this.config;
+            window.open(extensionsInstallUrl)
+        },
+        installChrome() {
+            window.open('https://www.google.com/chrome')
+        },
+        async getConfig() {
+            let { data } = await axios.post(`${baseURL}/denet/base/config/getFrontConfig`, {
+                baseInfo: {
+                    appVersionCode: appVersionCode,
+                    mid: this.mid
+                },
+                params: {}
+            })
+            if (data.code == 0) {
+                this.config = data.data;
+            }
+        },
+        checkBrowser() {
+            this.linkHref = window.location.href;
+            this.isChrome = isBrowser() == 'chrome';
+            this.isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
+        },
+        setTreasureInfo() {
+            let treasureInfo = {
+                createTime: Date.now(),
+                jump_type: 'treasure_info',
+                srcContentId: this.detail.srcContentId || '',
+                postNickName: this.detail.inviteUserInfo.nickName
+            };
+            Cookies.set('jump_info', JSON.stringify(treasureInfo), { expires: 100 });
+        },
+    }
+}
+</script>
+
+<style lang="scss">
+html,
+body,
+#__nuxt,
+#__layout {
+    width: 100%;
+    height: 100%;
+    padding: 0;
+    margin: 0;
+}
+
+.nft-content {
+    overflow: hidden;
+    width: 100%;
+    height: 100%;
+    background: linear-gradient(180deg, #D8EFFF 0%, #FFFFFF 44.3%);
+
+    .loading {
+        position: absolute;
+        transform: translate(-50%, -50%);
+        top: 50%;
+        left: 50%;
+        margin: auto;
+        width: 40px;
+        border-radius: 50%;
+    }
+
+    .logo {
+        display: flex;
+        align-items: center;
+        height: 70px;
+        margin-left: 25px;
+
+        img {
+            width: 99px;
+            height: 32px;
+        }
+    }
+
+    .show {
+        display: flex;
+        align-items: center;
+        height: calc(100% - 70px);
+
+        .center {
+            margin: -50px auto 0;
+            width: 480px;
+            height: 260px;
+            box-shadow: 0px 2px 18px rgba(0, 0, 0, 0.1);
+            border-radius: 12px;
+            display: flex;
+            justify-content: space-between;
+            flex-direction: column;
+            padding: 26px;
+            box-sizing: border-box;
+
+            .content-wrapper {
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                margin-top: 14px;
+
+                .img {
+                    width: 70px;
+                    height: 70px;
+                }
+
+                .img-left {
+                    border-radius: 50%;
+                }
+
+                .middle {
+                    padding: 0 20px;
+                    box-sizing: border-box;
+
+                    .invite-txt {
+                        color: #727272;
+                        font-weight: 400;
+                        font-size: 13px;
+                    }
+
+                    .title {
+                        font-weight: 800;
+                        font-size: 20px;
+                        margin: 6px 3px 0;
+                    }
+
+                    .up-gain-txt {
+                        color: #F8BC2B;
+                        font-weight: 600;
+                        font-size: 13px;
+                        display: flex;
+                        align-items: center;
+
+                        .amount {
+                            font-weight: 700;
+                            font-size: 22px;
+                        }
+                    }
+                }
+            }
+
+            .btn-wrapper {
+                margin-top: 54px;
+                padding: 16px;
+                box-sizing: border-box;
+                background: #1D9BF0;
+                border-radius: 100px;
+                color: #FFFFFF;
+                font-weight: 700;
+                font-size: 17px;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                cursor: pointer;
+
+                .img {
+                    width: 28px;
+                    height: 28px;
+                    margin-right: 8px;
+                }
+            }
+
+
+        }
+    }
+}
+
+</style>

File diff suppressed because it is too large
+ 6 - 0
static/svg/icon-chrome-down.svg


File diff suppressed because it is too large
+ 1 - 0
static/svg/icon-treasure.svg


Some files were not shown because too many files changed in this diff