573 lines
19 KiB
Vue
573 lines
19 KiB
Vue
<template>
|
||
<div class="goods-detail" v-if="data" :style="{ paddingBottom: paddingBottom + 'px' }">
|
||
<swiper class="swiper-container" :options="swiperOption">
|
||
<swiper-slide v-for="(cover, index) in data.details.covers" :key="index">
|
||
<div style="height: 100vw" class="picture">
|
||
<img :src="cover" alt="" />
|
||
</div>
|
||
</swiper-slide>
|
||
</swiper>
|
||
<div class="monk-profile">
|
||
<h1 class="position">{{ data.details.title }}</h1>
|
||
<div class="bar">
|
||
<span class="status">进行中</span>
|
||
<span>已有{{ data.details.sales || 0 }}人参与</span>
|
||
</div>
|
||
</div>
|
||
<!-- <div class="temple-info">-->
|
||
<!-- <img class="temple-img" :src="data.temple.picture" alt="">-->
|
||
<!-- <div class="temple-name">-->
|
||
<!-- <h4 class="name">{{data.temple.unit_name}}</h4>-->
|
||
<!-- <p class="visitor">已有 <span>{{data.temple.visit}}</span> 人到访过</p>-->
|
||
<!-- </div>-->
|
||
<!-- </div>-->
|
||
<div class="divider"></div>
|
||
<div class="panel">
|
||
<div class="panel-head">
|
||
<span class="title">详情</span>
|
||
</div>
|
||
<div v-html="data.details.content" class="goods-content"></div>
|
||
</div>
|
||
<div class="divider"></div>
|
||
<div class="support">
|
||
<div class="support-head">
|
||
<span class="label">感恩功德</span>
|
||
<ul class="external">
|
||
<li :class="[listType === lType.id && 'active']" v-for="lType in listTypes" :key="lType.id" @click="getPayRecords(lType, 1)">{{ lType.name }}</li>
|
||
</ul>
|
||
</div>
|
||
<div>
|
||
<user-merit v-for="pay in payList" :key="pay.id" :data="pay"></user-merit>
|
||
<div class="read-more" v-if="noMore">没有更多了</div>
|
||
<div class="read-more" v-else @click="loadMoreFn">查看更多</div>
|
||
</div>
|
||
</div>
|
||
|
||
<fixed-bottom ref="fixedBottom">
|
||
<button class="iconfont icon-home" v-if="query.no_login === '1'" @click="backHome"></button>
|
||
<button class="merit-button" @click="onLightAction">点击供灯</button>
|
||
</fixed-bottom>
|
||
|
||
<van-popup v-model="showSpec" position="bottom" closeable :style="{ height: 'auto' }" safe-area-inset-bottom :close-on-click-overlay="false" :close-on-popstate="true">
|
||
<div class="caret-spec">
|
||
<div class="head">
|
||
<span>参与流程: </span>
|
||
<ul class="step-inline">
|
||
<li :class="[current === 0 && 'current']">选择类型</li>
|
||
<li :class="[current === 1 && 'current']">填写信息</li>
|
||
<li :class="[current === 2 && 'current']">参与成功</li>
|
||
</ul>
|
||
</div>
|
||
<transition>
|
||
<div class="light-container">
|
||
<div class="light-wrapper">
|
||
<h1>选择祈福类型</h1>
|
||
<div class="light-group">
|
||
<van-swipe :loop="false">
|
||
<van-swipe-item v-for="(item, index) in lights" :key="index">
|
||
<van-grid :border="false" class="home-grid-nav" column-num="4">
|
||
<van-grid-item icon="photo-o" :text="nav.name" v-for="(nav, _index) in item" :key="_index" @click="onSelectLight(nav)">
|
||
<div class="light" :class="[currentLight.id === nav.id && 'current-light']">
|
||
<img :src="nav.picture" class="light-icon" />
|
||
<span class="light-name">{{ nav.name }}</span>
|
||
</div>
|
||
</van-grid-item>
|
||
</van-grid>
|
||
</van-swipe-item>
|
||
</van-swipe>
|
||
</div>
|
||
</div>
|
||
<div class="light-size">
|
||
<span>灯型</span>
|
||
<van-radio-group v-model="currentLightSize" direction="horizontal">
|
||
<van-radio :name="size.id" v-for="size in currentLight.children" :key="size.id" shape="square">{{ size.name }}</van-radio>
|
||
</van-radio-group>
|
||
</div>
|
||
<div class="light-count">
|
||
<span>数量</span>
|
||
<van-stepper v-model="buy_quantity" :min="1" input-width="40px" button-size="30px" />
|
||
</div>
|
||
</div>
|
||
</transition>
|
||
<div class="next-group">
|
||
<span class="total"
|
||
>合计:<em>¥{{ totalPrice }}</em></span
|
||
>
|
||
<button class="next" @click="onNextStep">下一步</button>
|
||
</div>
|
||
</div>
|
||
</van-popup>
|
||
|
||
<!-- 随喜金额-->
|
||
<random-money v-if="showAnyAmount" :value.sync="showAnyAmount" @change="onReceiveAnyAmount"></random-money>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import "swiper/css/swiper.css";
|
||
import { swiper, swiperSlide } from "vue-awesome-swiper";
|
||
import { getGoodsLightDetail, getOrderCompare, hasLogin } from "@/api";
|
||
|
||
export default {
|
||
components: {
|
||
swiper,
|
||
swiperSlide,
|
||
},
|
||
data() {
|
||
return {
|
||
result: [],
|
||
showAnyAmount: false,
|
||
paddingBottom: 0,
|
||
fixedBottomHeight: 0,
|
||
query: this.$route.query,
|
||
showSpec: false,
|
||
checked: false,
|
||
current: 0,
|
||
data: null,
|
||
value: "",
|
||
spec_id: "",
|
||
step: 0,
|
||
dreamInfo: null,
|
||
anyPrice: 0, // 随喜金额
|
||
swiperOption: {
|
||
autoplay: 8000,
|
||
initialSlide: 1,
|
||
loop: false,
|
||
pagination: ".swiper-pagination",
|
||
onSlideChangeEnd: (swiper) => {
|
||
console.log("onSlideChangeEnd", swiper.realIndex);
|
||
},
|
||
},
|
||
listType: 1,
|
||
listTypes: [
|
||
{ id: 1, name: "实时" },
|
||
{ id: 2, name: "月榜" },
|
||
{ id: 3, name: "总榜" },
|
||
],
|
||
page: 1,
|
||
payList: [],
|
||
currentLight: null,
|
||
currentLightPrice: 0,
|
||
currentLightSize: 53,
|
||
buy_quantity: 1, // 购买数量
|
||
noMore: false,
|
||
};
|
||
},
|
||
computed: {
|
||
lightSize() {
|
||
const { currentLight, currentLightSize } = this;
|
||
if (!this.currentLightSize) return 0;
|
||
return currentLight.children.find((item) => item.id === currentLightSize);
|
||
},
|
||
lights() {
|
||
const data = this.data;
|
||
if (!data) return [];
|
||
const { goods } = data;
|
||
const sliceNumber = 16;
|
||
const len = Math.ceil(goods.length / sliceNumber);
|
||
const lights = [];
|
||
for (let i = 0; i < len; i++) {
|
||
lights.push(goods.slice(sliceNumber * i, i * sliceNumber + sliceNumber));
|
||
}
|
||
return lights;
|
||
},
|
||
totalPrice() {
|
||
if (!this.lightSize) return 0;
|
||
return this.lightSize.price * this.buy_quantity;
|
||
},
|
||
},
|
||
mounted() {
|
||
this.getGoodsLightDetail("common");
|
||
},
|
||
methods: {
|
||
backHome() {
|
||
const { query } = this.$router.currentRoute;
|
||
const name = query.temple_id === "1" ? "home" : "temple-home";
|
||
this.$router.replace({ name, query: { temple_id: query.temple_id } });
|
||
},
|
||
async onLightAction() {
|
||
await hasLogin();
|
||
this.showSpec = true;
|
||
},
|
||
// 选择供灯种类
|
||
onSelectLight(light) {
|
||
this.currentLight = light;
|
||
this.currentLightSize = light.children[0].id;
|
||
},
|
||
// 接收随喜金额
|
||
onReceiveAnyAmount(anyObj) {
|
||
this.anyPrice = anyObj.money;
|
||
this.onToFillMeritName();
|
||
},
|
||
// dreamInfo: 心愿信息
|
||
onDreamInfoChange(dreamInfo) {
|
||
this.dreamInfo = dreamInfo;
|
||
},
|
||
|
||
onNextStep() {
|
||
if (!this.currentLightSize) {
|
||
this.$toast.fail("请选择灯型");
|
||
return;
|
||
}
|
||
this.current += 1;
|
||
if (this.current > 0) {
|
||
this.onToFillMeritName();
|
||
}
|
||
},
|
||
// 获取更多感恩功德1
|
||
loadMoreFn() {
|
||
this.page += 1;
|
||
this.getPayRecords({ id: this.listType }, this.page, 10);
|
||
},
|
||
onToFillMeritName() {
|
||
this.$router.push({
|
||
name: "fill-name",
|
||
query: {
|
||
...this.query,
|
||
goods_id: this.currentLight.id,
|
||
spec_id: this.lightSize.id,
|
||
friendly_time: this.number,
|
||
quantity: this.buy_quantity,
|
||
title: this.data.details.title,
|
||
subTitle: this.currentLight.name + ":" + this.lightSize.name,
|
||
amount: this.totalPrice,
|
||
is_die: this.currentLight.is_die,
|
||
from: "goods_light", // 标识为通用商品
|
||
},
|
||
});
|
||
},
|
||
async getGoodsLightDetail(type) {
|
||
const { goods_id, temple_id } = this.$route.query;
|
||
const response = await getGoodsLightDetail(type, goods_id, temple_id);
|
||
this.data = response;
|
||
this.currentLight = response.goods[0];
|
||
this.currentLightSize = this.currentLight.children[0].id;
|
||
await this.getPayRecords({ id: 1 }, 1);
|
||
this.$nextTick(() => {
|
||
this.paddingBottom = this.$refs.fixedBottom.getOffsetHeight() - 50;
|
||
});
|
||
this.wechatReady({
|
||
...this.data.shareConfig,
|
||
link: location.href,
|
||
});
|
||
},
|
||
// 获取感恩功德
|
||
async getPayRecords(lType, page, size = 3) {
|
||
this.listType = lType.id;
|
||
this.page = page;
|
||
const res = await getOrderCompare(this.query.temple_id, this.page, this.listType, "", this.query.goods_type, size);
|
||
if (this.page === 1) {
|
||
this.payList = [];
|
||
}
|
||
this.payList = this.payList.concat(res.list);
|
||
this.noMore = res.list.length < 3;
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
$lightWidth: 1.15rem;
|
||
.goods-detail {
|
||
.goods-content {
|
||
padding-left: 0.3rem;
|
||
padding-right: 0.3rem;
|
||
* {
|
||
max-width: 100%;
|
||
font-size: 0.35rem;
|
||
}
|
||
}
|
||
.light-container {
|
||
padding-left: 0.4rem;
|
||
padding-right: 0.4rem;
|
||
max-height: 13rem;
|
||
overflow: auto;
|
||
.light-wrapper {
|
||
border-top: 1px solid #ddd;
|
||
h1 {
|
||
font-size: 0.35rem;
|
||
margin-top: 0.4rem;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
.light-group {
|
||
.light {
|
||
padding: 5px;
|
||
text-align: center;
|
||
border: 1px solid transparent;
|
||
}
|
||
.van-swipe {
|
||
padding-bottom: 0.5rem;
|
||
}
|
||
.van-grid-item__content {
|
||
padding-bottom: 0;
|
||
padding-left: 0;
|
||
padding-right: 0;
|
||
}
|
||
.current-light {
|
||
border: 1px solid #cf9e3b;
|
||
border-radius: 4px;
|
||
span {
|
||
color: #cf9e3b;
|
||
}
|
||
}
|
||
img.light-icon {
|
||
width: $lightWidth;
|
||
height: $lightWidth;
|
||
vertical-align: top;
|
||
}
|
||
span {
|
||
font-size: 0.35rem;
|
||
display: block;
|
||
text-align: center;
|
||
padding-top: 0.3rem;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
}
|
||
.van-grid-item__content {
|
||
padding-top: 0.1rem;
|
||
}
|
||
}
|
||
.van-swipe__indicators {
|
||
bottom: 0rem;
|
||
.van-swipe__indicator {
|
||
width: 20px;
|
||
height: 2px;
|
||
border-radius: 10px;
|
||
background: #bbb;
|
||
}
|
||
.van-swipe__indicator--active {
|
||
background: #cf9e3b;
|
||
}
|
||
}
|
||
}
|
||
.light-size,
|
||
.light-count {
|
||
font-size: 0.4rem;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
span {
|
||
color: black;
|
||
opacity: 1;
|
||
}
|
||
}
|
||
.light-size {
|
||
margin-top: 0.4rem;
|
||
margin-bottom: 0.4rem;
|
||
|
||
.van-radio__label {
|
||
margin-left: 4px;
|
||
font-size: 0.35rem;
|
||
}
|
||
.van-radio__icon .van-icon {
|
||
width: 0.45rem;
|
||
height: 0.45rem;
|
||
line-height: 0.45rem;
|
||
}
|
||
.van-radio__icon--checked .van-icon {
|
||
background: #cf9e3b;
|
||
border-color: #cf9e3b;
|
||
}
|
||
}
|
||
.light-count {
|
||
align-items: center;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
}
|
||
.support {
|
||
margin-bottom: 0.5rem;
|
||
.support-head {
|
||
padding: 0 0.4rem;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
height: 1.07rem;
|
||
line-height: 1.07rem;
|
||
.label {
|
||
font-size: 0.4rem;
|
||
font-weight: bold;
|
||
}
|
||
.external {
|
||
display: flex;
|
||
align-items: center;
|
||
li {
|
||
margin-left: 0.3rem;
|
||
font-size: 0.35rem;
|
||
color: #666;
|
||
}
|
||
li.active {
|
||
color: #333;
|
||
font-weight: bold;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
.swiper-container {
|
||
background: #f5f5f5;
|
||
.picture,
|
||
img {
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
}
|
||
.monk-profile {
|
||
padding: 0.4rem;
|
||
.position {
|
||
font-size: 0.5rem;
|
||
padding-top: 0.2rem;
|
||
color: #19282e;
|
||
line-height: 1.3;
|
||
}
|
||
|
||
.introduction {
|
||
font-size: 0.37rem;
|
||
margin-top: 0.4rem;
|
||
line-height: 1.3;
|
||
text-align: justify;
|
||
color: #666;
|
||
}
|
||
.bar {
|
||
margin-top: 0.27rem;
|
||
}
|
||
.status {
|
||
padding: 0.2rem 0.3rem;
|
||
background: orange;
|
||
color: white;
|
||
display: inline-block;
|
||
border-radius: 0.04rem;
|
||
margin-right: 0.3rem;
|
||
font-size: 0.3rem;
|
||
}
|
||
span {
|
||
color: #666;
|
||
font-size: 0.28rem;
|
||
}
|
||
}
|
||
.temple-info {
|
||
border-top: 1px solid #ddd;
|
||
padding: 0.3rem 0.4rem;
|
||
display: flex;
|
||
align-items: center;
|
||
.temple-img {
|
||
width: 1rem;
|
||
height: 1rem;
|
||
border-radius: 1rem;
|
||
margin-right: 0.3rem;
|
||
}
|
||
.temple-name {
|
||
flex: 1;
|
||
.name {
|
||
font-size: 0.35rem;
|
||
color: #333;
|
||
}
|
||
.visitor {
|
||
color: #666;
|
||
font-size: 0.3rem;
|
||
margin-top: 0.2rem;
|
||
display: block;
|
||
}
|
||
}
|
||
}
|
||
.detail-button-group {
|
||
text-align: center;
|
||
position: fixed;
|
||
bottom: 0;
|
||
z-index: 10;
|
||
left: 0;
|
||
right: 0;
|
||
background: white;
|
||
border-top: 0.01rem solid #ddd;
|
||
padding: 0.3rem;
|
||
}
|
||
.merit-button {
|
||
display: block;
|
||
background: #cf9e3b;
|
||
color: white;
|
||
height: 1.2rem;
|
||
font-size: 0.37rem;
|
||
min-width: 60%;
|
||
padding: 0 0.53rem;
|
||
margin-top: 0.3rem;
|
||
margin-left: auto;
|
||
margin-right: auto;
|
||
border: 0.01rem solid #cf9e3b;
|
||
border-radius: 0.13rem;
|
||
margin-bottom: 0.3rem;
|
||
}
|
||
.caret-spec {
|
||
.head {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
font-size: 0.4rem;
|
||
padding: 0.4rem;
|
||
align-items: center;
|
||
margin-top: 0.13rem;
|
||
.iconfont {
|
||
font-size: 0.7rem;
|
||
}
|
||
.step-inline {
|
||
display: inline-block;
|
||
flex: 1;
|
||
font-size: 0.35rem;
|
||
li {
|
||
display: inline-block;
|
||
& ~ li:before {
|
||
content: "-";
|
||
padding: 0 0.1rem;
|
||
}
|
||
}
|
||
li.current {
|
||
color: #cf9e3b;
|
||
}
|
||
}
|
||
}
|
||
|
||
.auto-donate-time {
|
||
padding: 0.4rem;
|
||
margin-top: 0.4rem;
|
||
margin-bottom: 1rem;
|
||
.donate {
|
||
.label {
|
||
font-size: 0.4rem;
|
||
}
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
}
|
||
.time-cycle {
|
||
display: flex;
|
||
align-items: flex-end;
|
||
.unit {
|
||
font-size: 0.3rem;
|
||
color: #666;
|
||
padding-left: 0.2rem;
|
||
}
|
||
}
|
||
}
|
||
.next-group {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
padding: 0.2rem 0.4rem;
|
||
background: white;
|
||
align-items: center;
|
||
border-top: 1px solid #ededed;
|
||
.total {
|
||
font-size: 0.4rem;
|
||
em {
|
||
color: #cf9e3b;
|
||
font-size: 0.4rem;
|
||
font-weight: bold;
|
||
}
|
||
}
|
||
.next {
|
||
font-size: 0.4rem;
|
||
padding: 0.3rem 1rem;
|
||
background: #cf9e3b;
|
||
border: 1px solid #cf9e3b;
|
||
color: white;
|
||
border-radius: 0.1rem;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style>
|