|
|
@@ -0,0 +1,448 @@
|
|
|
+<template>
|
|
|
+ <div class="detail">
|
|
|
+ <swiper pagination class="mySwiper" v-if="banners.length > 0">
|
|
|
+ <swiper-slide v-for="(item, index) in banners" :key="index">
|
|
|
+ <img :src="item" />
|
|
|
+ </swiper-slide>
|
|
|
+ </swiper>
|
|
|
+
|
|
|
+ <div class="info">
|
|
|
+ <div class="price-line">
|
|
|
+ <!-- <div class="price">
|
|
|
+ <i class="font_family icon-icon_jiage"></i>{{ info.price }}
|
|
|
+ </div>
|
|
|
+ <div class="sub">含 <span>5%</span> 版税</div>
|
|
|
+ <div class="text">
|
|
|
+ <span>已售 {{ info.sale }}</span>
|
|
|
+ <span>剩余 {{ info.stock }}</span>
|
|
|
+ </div> -->
|
|
|
+ <div class="status">
|
|
|
+ {{ getLabelName(info.status, assetStatusOptions) }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="title">{{ info.name }}</div>
|
|
|
+ <div class="info-bottom">
|
|
|
+ <span class="text1"> 编号 {{ info.number }} </span>
|
|
|
+ <!-- <van-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ size="mini"
|
|
|
+ >选择其他编号</van-button
|
|
|
+ >
|
|
|
+ <like-button :isLike="info.liked" @click="likeProduct">
|
|
|
+ {{ info.likes }}
|
|
|
+ </like-button> -->
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <driver />
|
|
|
+ <van-cell
|
|
|
+ is-link
|
|
|
+ class="creator"
|
|
|
+ :to="{
|
|
|
+ path: '/creatorDetail',
|
|
|
+ query: {
|
|
|
+ id: info.minterId,
|
|
|
+ },
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <template #icon>
|
|
|
+ <van-image
|
|
|
+ width="40"
|
|
|
+ height="40"
|
|
|
+ :src="info.minterAvatar"
|
|
|
+ fit="cover"
|
|
|
+ radius="100"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <template #title>
|
|
|
+ <div class="text1">{{ info.minter }}</div>
|
|
|
+ <div class="text2">铸造者</div>
|
|
|
+ </template>
|
|
|
+ </van-cell>
|
|
|
+ <van-cell
|
|
|
+ is-link
|
|
|
+ class="creator"
|
|
|
+ :to="{
|
|
|
+ path: '/creatorDetail',
|
|
|
+ query: {
|
|
|
+ id: info.minterId,
|
|
|
+ },
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <template #icon>
|
|
|
+ <van-image
|
|
|
+ width="40"
|
|
|
+ height="40"
|
|
|
+ :src="info.minterAvatar"
|
|
|
+ fit="cover"
|
|
|
+ radius="100"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <template #title>
|
|
|
+ <div class="text1">{{ info.minter }}</div>
|
|
|
+ <div class="text2">持有者</div>
|
|
|
+ </template>
|
|
|
+ </van-cell>
|
|
|
+ <driver />
|
|
|
+
|
|
|
+ <div class="goods">
|
|
|
+ <div class="page-title">商品特性</div>
|
|
|
+ <div class="specific-list">
|
|
|
+ <div
|
|
|
+ class="specific-item"
|
|
|
+ v-for="(item, index) in properties"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <div class="text1">{{ item.name }}</div>
|
|
|
+ <div class="text2">{{ item.value }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="page-title">链上信息</div>
|
|
|
+ <div class="page-text">
|
|
|
+ Hash地址:{{ info.txHash }}<br />
|
|
|
+ 区块高度: {{ info.blockNumber }}<br />
|
|
|
+ 令牌ID: {{ info.tokenId }}
|
|
|
+ </div>
|
|
|
+ <div class="page-title">作品描述</div>
|
|
|
+ <div class="page-text" v-html="info.detail"></div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="btn van-safe-area-bottom" ref="btn" v-if="isBuy">
|
|
|
+ <div class="btns">
|
|
|
+ <van-button type="primary" block round @click="buy"
|
|
|
+ >立即购买</van-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- <driver /> -->
|
|
|
+
|
|
|
+ <!-- <van-collapse v-model="activeName" accordion>
|
|
|
+ <van-collapse-item title="交易记录" name="1">
|
|
|
+ <van-cell title="单元格" value="内容"> </van-cell>
|
|
|
+ </van-collapse-item>
|
|
|
+ </van-collapse> -->
|
|
|
+
|
|
|
+ <driver />
|
|
|
+
|
|
|
+ <post :info="info" />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import { Swiper, SwiperSlide } from "swiper/vue";
|
|
|
+
|
|
|
+import "swiper/swiper.min.css";
|
|
|
+import "swiper/swiper-bundle.min.css";
|
|
|
+
|
|
|
+import SwiperCore, { Pagination } from "swiper";
|
|
|
+import Post from "../../components/Post.vue";
|
|
|
+import asset from "../../mixins/asset";
|
|
|
+
|
|
|
+// install Swiper modules
|
|
|
+SwiperCore.use([Pagination]);
|
|
|
+
|
|
|
+export default {
|
|
|
+ components: {
|
|
|
+ Swiper,
|
|
|
+ SwiperSlide,
|
|
|
+ Post,
|
|
|
+ },
|
|
|
+ inject: ["bs"],
|
|
|
+ mixins: [asset],
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ activeName: "1",
|
|
|
+ info: {},
|
|
|
+ liked: false,
|
|
|
+ btn: null,
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ banners() {
|
|
|
+ return this.info.pic || [];
|
|
|
+ },
|
|
|
+ properties() {
|
|
|
+ return this.info.properties || [];
|
|
|
+ },
|
|
|
+ isBuy() {
|
|
|
+ return this.info.stock && this.info.onShelf;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.getProduct();
|
|
|
+ },
|
|
|
+ beforeUnmount() {
|
|
|
+ if (this.btn) {
|
|
|
+ document.body.removeChild(this.btn);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ getProduct() {
|
|
|
+ this.$toast.loading({
|
|
|
+ message: "加载中...",
|
|
|
+ forbidClick: true,
|
|
|
+ });
|
|
|
+ this.$http.get("/asset/get/" + this.$route.query.id).then((res) => {
|
|
|
+ this.info = res;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ if (this.isBuy) {
|
|
|
+ this.btn = this.$refs.btn;
|
|
|
+ }
|
|
|
+ document.body.appendChild(this.$refs.btn);
|
|
|
+ });
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ this.$toast.clear();
|
|
|
+ this.bs.value.refresh();
|
|
|
+ }, 100);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ likeProduct() {
|
|
|
+ if (!this.info.liked) {
|
|
|
+ this.$http.get(`/collection/${this.info.id}/like`).then(() => {
|
|
|
+ this.getProduct();
|
|
|
+ this.$toast.success("收藏成功");
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ this.$http.get(`/collection/${this.info.id}/unlike`).then(() => {
|
|
|
+ this.getProduct();
|
|
|
+ this.$toast.success("取消收藏");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ buy() {
|
|
|
+ this.checkLogin().then(() => {
|
|
|
+ this.$router.push({
|
|
|
+ path: "/submit",
|
|
|
+ query: {
|
|
|
+ id: this.$route.query.id,
|
|
|
+ },
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+.detail {
|
|
|
+ padding-bottom: 100px;
|
|
|
+}
|
|
|
+.info {
|
|
|
+ // height: 164px;
|
|
|
+ background-color: @bg;
|
|
|
+ border-radius: 20px 20px 0 0;
|
|
|
+ transform: translateY(-16px);
|
|
|
+ position: relative;
|
|
|
+ z-index: 2;
|
|
|
+ padding: 16px 16px 0;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ .price {
|
|
|
+ font-size: 36px;
|
|
|
+ font-family: OSP;
|
|
|
+ color: #fdfb60;
|
|
|
+ line-height: 36px;
|
|
|
+ transform: translateY(3px);
|
|
|
+
|
|
|
+ .font_family {
|
|
|
+ font-size: 10px;
|
|
|
+ line-height: 24px;
|
|
|
+ vertical-align: middle;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .price-line {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-end;
|
|
|
+ .sub {
|
|
|
+ flex-grow: 1;
|
|
|
+ margin-left: 5px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #949699;
|
|
|
+ line-height: 16px;
|
|
|
+ span {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .text {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #939599;
|
|
|
+ line-height: 16px;
|
|
|
+ span {
|
|
|
+ margin-left: 10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .title {
|
|
|
+ font-size: 20px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #ffffff;
|
|
|
+ line-height: 28px;
|
|
|
+ margin-top: 12px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-bottom {
|
|
|
+ display: flex;
|
|
|
+ position: relative;
|
|
|
+ margin-top: 4px;
|
|
|
+ height: 24px;
|
|
|
+ .text1 {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #949699;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+ .van-button {
|
|
|
+ font-size: 13px;
|
|
|
+ color: #fdfb60;
|
|
|
+ line-height: 24px;
|
|
|
+ background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
|
|
|
+ -webkit-background-clip: text;
|
|
|
+ -webkit-text-fill-color: transparent;
|
|
|
+ border-width: 0px;
|
|
|
+ margin-left: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .like {
|
|
|
+ position: absolute;
|
|
|
+ right: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/deep/.creator {
|
|
|
+ align-items: center;
|
|
|
+ padding: 24px 16px 24px;
|
|
|
+ .van-cell__title {
|
|
|
+ margin-left: 12px;
|
|
|
+ .text1 {
|
|
|
+ font-size: 16px;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+ .text2 {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #939599;
|
|
|
+ line-height: 22px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .van-cell__value {
|
|
|
+ font-size: 13px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/deep/ .mySwiper {
|
|
|
+ width: 100vw;
|
|
|
+ height: 100vw;
|
|
|
+ z-index: 1;
|
|
|
+
|
|
|
+ .swiper-pagination {
|
|
|
+ bottom: 22px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .swiper-pagination-bullet {
|
|
|
+ width: 6px;
|
|
|
+ height: 2px;
|
|
|
+ border-radius: 1px;
|
|
|
+ background: #d7d7d7;
|
|
|
+ }
|
|
|
+
|
|
|
+ .swiper-pagination-bullet-active {
|
|
|
+ background: @prim;
|
|
|
+ }
|
|
|
+
|
|
|
+ .swiper-slide img {
|
|
|
+ display: block;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: cover;
|
|
|
+ border-radius: 4px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.goods {
|
|
|
+ padding: 20px 16px;
|
|
|
+
|
|
|
+ .page-title {
|
|
|
+ &:not(:first-child) {
|
|
|
+ padding-top: 16px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.page-title {
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #ffffff;
|
|
|
+ line-height: 28px;
|
|
|
+}
|
|
|
+.specific-list {
|
|
|
+ padding: 16px 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+}
|
|
|
+.specific-item {
|
|
|
+ width: 94px;
|
|
|
+ height: 62px;
|
|
|
+ border-radius: 4px;
|
|
|
+ border: solid 0px transparent;
|
|
|
+ padding: 1px;
|
|
|
+ background-image: linear-gradient(@bg, @bg),
|
|
|
+ linear-gradient(135deg, #fdfb60, #ff8f3e);
|
|
|
+ background-origin: border-box;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background-clip: content-box, border-box;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ flex-direction: column;
|
|
|
+
|
|
|
+ .text1 {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #939599;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .text2 {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #ffffff;
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.page-text {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #ffffff;
|
|
|
+ line-height: 28px;
|
|
|
+ margin-top: 10px;
|
|
|
+ word-break: break-all;
|
|
|
+}
|
|
|
+
|
|
|
+.btn {
|
|
|
+ position: fixed;
|
|
|
+ z-index: 20;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ background: #202122ee;
|
|
|
+ .btns {
|
|
|
+ padding: 6px 42px;
|
|
|
+ }
|
|
|
+ .van-button {
|
|
|
+ background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
|
|
|
+ color: #333230;
|
|
|
+ font-size: 16px;
|
|
|
+ border-width: 0px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.status {
|
|
|
+ font-size: 22px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #fdfb60;
|
|
|
+ line-height: 24px;
|
|
|
+}
|
|
|
+</style>
|