安徽博创起重uniapp
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

670 lines
14 KiB

<template>
<view class="goods-details">
<u-navbar id="navbar" :border-bottom="false"
:background="{ background: 'rgba(256,256,256, '+ navStyle.backgroundBg +')', }"
:back-bg="'rgba(0,0,0,' + navStyle.backBg + ')'" :back-icon-color="navStyle.backColor" :immersive="true">
<tabs sticky-bg-color="transparent" v-if="navStyle.backgroundBg > 0.1" :show-bar="true" :bar-width="60"
:is-scroll="false" :current="active" bg-color="transparent"
:style="{width: '100%', opacity: navStyle.backgroundBg}" @change="changeActive">
<tab name="资料"></tab>
<tab name="详情"></tab>
</tabs>
</u-navbar>
<view class="contain" v-if="!isNull" id="goods" @touchstart="isTouchStart = true">
<bubble-tips top="200rpx"></bubble-tips>
<product-swiper :imgUrls="swiperList" ></product-swiper>
<view class="goods-info bg-white">
<view class="info-header flex">
<view class="price flex flex-1">
<view class="primary m-r-10">
<text style="font-weight: 500" class="price-format">
<text style="font-size: 46rpx;margin-right: 1rpx" >{{resourceDetail.price_str}}</text>
</text>
</view>
</view>
<!-- <image class="icon-share" src="/static/images/icon_share.png" @tap="showShareBtn = true"></image> -->
</view>
<view class="flex">
<view class="name lg bold">{{ resourceDetail.title }}</view>
</view>
<view class="flex row-between xs lighter" style="padding: 0 24rpx 20rpx">
<text>区域: {{ resourceDetail.address }}</text>
<text>下载量: {{ resourceDetail.download }}</text>
<text>浏览量: {{ resourceDetail.visit }}</text>
</view>
</view>
<view>
<get-coupon :wrap-style="{'margin-top': '20rpx'}" :goods-id="resourceDetail.id"></get-coupon>
</view>
<view class="details m-t-20 bg-white" id="details">
<view class="title lg">资料简介</view>
<view class="content">
<u-parse :html="resourceDetail.content" :lazy-load="true" :show-with-animation="true"></u-parse>
</view>
</view>
<view class="footer flex bg-white fixed">
<template>
<view class="right-buy br60 white m-r-20 m-l-10 md" @click="doFun()" >{{ btnText.red }}</view>
</template>
</view>
</view>
<view v-else>
<view class="details-null flex-col col-center">
<image class="img-null" src="/static/images/goods_null.png"></image>
<view class="xs muted">该资料已经去星球外啦,去看看别的吧~</view>
</view>
<goods-column></goods-column>
</view>
<share-popup :show="showShareBtn" @close="showShareBtn = false" :goods-id="id" :img-url="goodsDetail.image"
:summary="goodsDetail.remark" :share-title="goodsDetail.name"></share-popup>
<!-- 悬浮按钮 -->
<float-tab></float-tab>
<loading-view v-if="isFirstLoading"></loading-view>
</view>
</template>
team_min_price
<script>
import {
getResourceDetail,
getGoodsDetail,
addCart
} from '@/api/store';
import {
collectGoods
} from '@/api/user';
import {
getCouponList,
teamCheck
} from '@/api/activity';
import {
mapActions,
mapGetters
} from 'vuex';
import {
toLogin
} from '@/utils/login';
import Cache from '@/utils/cache';
import {
strToParams,
arraySlice,
getRect,
getcu
} from '@/utils/tools'
const app = getApp()
export default {
data() {
return {
active: 0,
isTouchStart: false,
topArr: [],
isFirstLoading: true,
isNull: false,
isGroup: 0,
showSpec: false,
showCoupon: false,
showShareBtn: false,
showCommission: true,
popupType: '',
swiperList: [],
goodsDetail: {},
goodsType: 0,
checkedGoods: {},
comment: {},
countTime: 0,
team: {},
teamFound: [],
showtxt:[],
resourceDetail:{},
navStyle: {
backBg: 0.4,
backgroundBg: 0,
backColor: 'rgba(256,256,256,1)'
},
id: '',
shop: {},
// 分销
distribution: {}
};
},
onLoad() {
const options = this.$Route.query;
if (options && options.scene) {
const scene = strToParams(decodeURIComponent(options.scene));
options.id = scene.id;
}
this.id = options.id;
this.getResourceDetailFun();
},
onShow() {
},
onPageScroll(e) {
const top = uni.upx2px(500)
const {
scrollTop
} = e
const percent = scrollTop / top
this.navStyle.backgroundBg = percent
this.navStyle.backBg = 0.4 * (0.5 - percent)
this.navStyle.backColor = percent < 0.5 ? 'rgba(256,256,256,' + (0.5 - percent) * 2 + ')' : 'rgba(0,0,0,' +
(
percent - 0.5) * 2 + ')'
if (!this.isTouchStart) return
const topList = this.topArr.map((item, index) => ({
index,
top: item
}))
.filter(item => item.top <= scrollTop)
if (topList.length) {
const index = topList.sort((a, b) => b.top - a.top)[0].index
if (this.active == index) return
this.active = index
}
},
methods: {
...mapActions([ 'wxShare']),
doFun(){
console.log(1111)
const {
goodsType,
isLogin
} = this
if (!isLogin) {
uni.navigateTo({
url: '/pages/login/login'
});
return true;
}
//免费下载
if(goodsType == 0){
uni.downloadFile({
url: this.goodsDetail.path, //仅为示例,并非真实的资源
success: (res) => {
if (res.statusCode === 200) {
console.log('下载成功');
}
}
});
}else if(goodsType == 1){ //vip会员开通页面
uni.navigateTo({
url: '/pages/user/vip'
});
}else if(goodsType == 2){ //下单购买页面
console.log('购买页')
}
},
changeActive(index) {
this.isTouchStart = false
uni.pageScrollTo({
scrollTop: this.topArr[index],
duration: 200
});
},
getRectInfo() {
if (this.topArr.length) return
getRect('#goods').then((res) => {
this.topArr[0] = res.top - this.navHeight
})
getRect('#evaluation').then((res) => {
this.topArr[1] = res.top - this.navHeight
})
getRect('#details').then((res) => {
this.topArr[2] = res.top - this.navHeight
})
},
async getResourceDetailFun() {
const {
data,
code
} = await getResourceDetail({
id: this.id
});
if (code == 1) {
const {
image,
title,
content,
visit,
likes,
intro,
path,
price_str,
type,
goodsType,
address
} = data;
this.intro = intro || {}
this.image = image
this.resourceDetail = data;
this.swiperList = [{id:data.id,uri:image}];
console.log(this.swiperList)
this.goodsType = goodsType;
console.log(goodsType)
this.$nextTick(() => {
// 滚动到顶部,防止h5端出现问题
uni.pageScrollTo({
scrollTop: 0,
duration: 0,
});
this.isFirstLoading = false;
this.getRectInfo()
});
// #ifdef H5
const options = {
shareTitle: data.title,
shareImage: data.image,
shareDesc: data.intro
};
this.wxShare(options);
// #endif
} else {
this.isNull = true
this.isFirstLoading = false;
}
},
showCouponFun() {
if (!this.isLogin) return toLogin();
this.showCoupon = true;
},
showSpecFun(type) {
this.popupType = type;
this.showSpec = true;
},
onBuy(e) {
if (!this.isLogin) return this.$Router.push('/pages/login/login')
const {
id,
goodsNum
} = e.detail;
const params = {
goods: [{
item_id: id,
num: goodsNum,
goods_id: this.id,
shop_id: this.shop.id,
delivery_type: this.goodsDetail.type
}],
type: 'buy'
};
this.showSpec = false
this.goodsType == 2 ? (params.teamId = this.team.id) : '';
this.foundId ? (params.foundId = this.foundId) : '';
this.$Router.push({
path: '/pages/confirm_order/confirm_order',
query: {
data: params
}
})
},
onConfirm(e) {
const {
team: {
team_id
}
} = this;
teamCheck({
team_id: this.foundId,
// found_id: this.foundId,
goods_id: e.detail.goods_id,
item_id: e.detail.id,
count: e.detail.goodsNum
}).then(res => {
if (res.code == 1) {
this.onBuy(e);
}
});
}
},
async onShareAppMessage() {
const {
goodsDetail,
inviteCode,
team
} = this;
return {
title: team.share_title || goodsDetail.name,
imageUrl: goodsDetail.image,
path: '/pages/goods_details/goods_details?id=' + this.id + "&invite_code=" + inviteCode
};
},
computed: {
...mapGetters(['cartNum', 'inviteCode', 'sysInfo', 'appConfig', 'userInfo']),
btnText() {
const {
goodsType
} = this;
console.log(goodsType,222333)
switch (goodsType) {
case 0:
return {
red: '立即下载'
};
case 1:
return {
red: '开通vip'
};
default:
return {
red: '立即购买'
};
}
},
getTeamCountTime() {
return time => time - Date.now() / 1000;
},
navHeight() {
return this.sysInfo.navHeight
},
enableCommission() {
const {
goodsType,
distribution: {
earnings,
is_show
}
} = this
return goodsType == 0 && earnings > 0 && is_show == 1
}
}
};
</script>
<style lang="scss" scoped>
@import '@/styles/base.scss';
.goods-details {
padding-bottom: calc(120rpx + env(safe-area-inset-bottom));
.seckill {
height: 100rpx;
background: #ffd4d8;
.price {
width: 504rpx;
height: 100%;
background: url(../../static/images/bg_seckill.png) no-repeat;
background-size: 100%;
}
.down {
flex: 1;
}
}
.group {
height: 100rpx;
width: 100%;
background-image: url(../../static/images/pintuan_bg.png);
background-size: 100%;
.group-num {
border: 1px solid #ffffff;
border-radius: 4rpx;
.group-icon {
background: #fff;
padding: 3rpx 7rpx;
}
}
.down {
height: 100%;
background-color: #fff5e1;
padding: 0 20rpx;
}
}
.goods-info {
position: relative;
.info-header {
padding: 20rpx 0 0rpx 24rpx;
.price {
align-items: baseline;
}
}
.name {
padding: 20rpx 24rpx;
flex: 1;
}
.icon-share {
width: 134rpx;
height: 60rpx;
}
.vip-price {
margin: 0 24rpx;
background-color: #FFE9BA;
line-height: 36rpx;
border-radius: 6rpx;
overflow: hidden;
.price-name {
background-color: #101010;
padding: 3rpx 12rpx;
color: #FFD4B7;
position: relative;
overflow: hidden;
&::after {
content: '';
display: block;
width: 20rpx;
height: 20rpx;
position: absolute;
right: -15rpx;
background-color: #FFE9BA;
border-radius: 50%;
top: 50%;
transform: translateY(-50%);
box-sizing: border-box;
}
}
}
}
.details-null {
padding-top: 140rpx;
margin-bottom: 100rpx;
}
.spec {
padding: 24rpx 24rpx;
.text {
width: 100rpx;
}
}
.evaluation {
.title {
height: 100rpx;
border-bottom: $-solid-border;
padding: 0 24rpx;
}
.con {
padding: 30rpx 24rpx;
}
.user-info .avatar {
width: 60rpx;
height: 60rpx;
border-radius: 50%;
}
}
.details {
// overflow: hidden;
.title {
line-height: 88rpx;
text-align: center;
}
&>.content {
padding: 0 20rpx 20rpx;
::v-deep image {
vertical-align: middle;
}
// #ifdef H5
::v-deep img {
vertical-align: middle;
}
// #endif
// #ifdef MP-WEIXIN || APP-PLUS
::v-deep ._img {
display: block;
}
// #endif
}
}
.footer {
height: 100rpx;
position: fixed;
bottom: 0;
left: 0;
right: 0;
box-sizing: content-box;
padding-bottom: env(safe-area-inset-bottom);
.btn {
width: 100rpx;
height: 100rpx;
position: relative;
line-height: 1.3;
}
.cart-num {
position: absolute;
left: 60rpx;
top: 6rpx;
}
.add-cart,
.right-buy,
.consult-btn{
flex: 1;
text-align: center;
padding: 16rpx 0;
}
.add-cart {
background-color: #ffa630;
}
.right-buy {
background-color: $-color-primary;
}
.consult-btn {
background: linear-gradient(to right, #ff8e00 0%, #ff2c3c 100%);
}
}
.group-play {
.title {
padding: 20rpx 28rpx;
border-bottom: $-solid-border;
}
.steps {
padding: 20rpx 28rpx;
.step {
flex: none;
}
.line {
flex: 1;
border: 1px dashed #999999;
margin: 0 20rpx;
}
.number {
border: 1rpx solid #707070;
width: 28rpx;
height: 28rpx;
border-radius: 50%;
line-height: 28rpx;
text-align: center;
margin-right: 6rpx;
}
}
}
.group-list {
.group-item {
padding: 20rpx 24rpx;
&:not(:last-of-type) {
border-bottom: $-solid-border;
}
.group-btn {
background: linear-gradient(90deg, #f95f2f 0%, #ff2c3c 100%);
height: 58rpx;
padding-left: 28rpx;
padding-right: 28rpx;
margin-left: 30rpx;
box-shadow: 0px 6rpx 12rpx rgba(249, 47, 138, 0.4);
}
}
}
.share-money {
position: fixed;
left: 20rpx;
bottom: calc(130rpx + env(safe-area-inset-bottom));
transform: scale(0);
transition: all .3s;
&.show {
transform: scale(1);
}
.share-close {
width: 34rpx;
height: 34rpx;
background: #a7a7a7;
border-radius: 50%;
}
.share-con {
background: url('../../static/images/bg_packet_img.png');
width: 241rpx;
height: 208rpx;
background-size: 100%;
padding-top: 20rpx;
text-align: center;
}
}
}
</style>