mall_client/zyhs3_uniapp/pages/home/newPeopleOrSpecial.vue

196 lines
5.4 KiB
Vue
Raw Permalink Normal View History

2026-03-13 07:50:35 +00:00
<template>
<view class="main">
<image mode="widthFix" class="top" :src="staticUrl + 'home/class/' + type + '.png'"></image>
<view class="list">
<view class="list-item" v-for="(item, i) in list" :key="i" @click="jumpTo(item)">
<block v-if="item.goodsInfo">
<view><image :src="item.goodsInfo.mainImage" mode="" class="img"></image></view>
<view class="flex flex-column flex-wrap" style="width: 100%;">
<text class="line">{{item.goodsInfo.titleName}}</text>
<text class="font30 color-purple" style="margin-top: 10rpx;">¥{{item.goodsInfo.wholesalePrice}} {{type == 5 ? " - 赠"+(item.goodsInfo.bonusIntegral/100*item.goodsInfo.wholesalePrice).toFixed(2)+"积分":""}} - 已售{{item.goodsInfo.totalSales}}</text>
<view class="btn" v-if="type === 4">
<text class="left">{{item.groupNumber}}人拼团</text>
<text class="color-w flex-1">去拼团 ></text>
</view>
<view class="flex flex-between" style="margin-top: 20rpx;" v-else>
<button type="primary" class="bg-base mar" size="mini">立即抢购</button>
<block v-if="type === 2">
<text class="font26 color-b6" v-if="item.time">距结束还剩 {{item.time}}</text>
<text class="font26 color-b9" v-else>秒杀已结束</text>
</block>
</view>
</view>
</block>
</view>
</view>
<uni-load-more color="#ffffff" :status="loading"></uni-load-more>
</view>
</template>
<script>
import url from "@/common/http/url.js"
import uniLoadMore from "@/components/uni-load-more/uni-load-more.vue"
export default{
components: { uniLoadMore },
data(){
return {
staticUrl: this.$staticUrl,
type: 1, // 1-新人大礼、2-限时秒杀、3-今日特价、4-拼团、5-积分大送
loading: "nomore",
list: []
}
},
onLoad(opt) {
this.type = opt.type ? parseInt(opt.type) : this.type
uni.setNavigationBarTitle({
title: opt.title
})
this.getList()
},
onPullDownRefresh() {
this.list = []
this.getList()
},
onReachBottom() {
this.getList()
},
onHide() {
this.clear()
},
onUnload() {
this.clear()
},
methods:{
getList(){
let params = {
type: this.type,
pageNum: this.list.length
}
this.$http("GET", url.goods.goodsByType, params).then(res =>{
let list = res.data
if (list && list.length > 0 && this.type === 2) { // 限时秒杀 倒计时
list.map((v, i) => {
/* this.countDownReturn(v, i) */
v.time = this.countTime(v.dueDateTime);
})
}
this.list = this.list.concat(list)
this.loading = list.length < 12 ? 'nomore' : 'more'
uni.stopPullDownRefresh()
})
},
countTime(dueDateTime){
let timeReplace = dueDateTime.replace(/\.|\-/g, '/')
let startTime = new Date(); // 开始时间
let endTime = new Date(timeReplace); // 结束时间
let usedTime = endTime - startTime; // 相差的毫秒数
let days = Math.floor(usedTime / (24 * 3600 * 1000)); // 计算出天数
let leavel = usedTime % (24 * 3600 * 1000); // 计算天数后剩余的时间
let hours = Math.floor(leavel / (3600 * 1000)); // 计算剩余的小时数
let leavel2 = leavel % (3600 * 1000); // 计算剩余小时后剩余的毫秒数
let minutes = Math.floor(leavel2 / (60 * 1000)); // 计算剩余的分钟数
let timer = days + '天' + hours + '时' + minutes + '分';
console.log(timer)
return timer;
},
countDownReturn(item, i){
let _this = this
this.countDown(item, time => {
_this.list[i].time = time
_this.$forceUpdate()
})
},
countDown(item, callback){
let time = null
if (item.timer) {
clearInterval(item.timer)
item.timer = null
}
item.timer = setInterval(()=>{
let timeReplace = item.dueDateTime.replace(/\.|\-/g, '/')
let oldTime = new Date(timeReplace).getTime()
let newTime = new Date().getTime()
let result = parseInt(oldTime - newTime)
if (result >= 0) {
// let d = Math.floor(leftTime/1000/60/60/24);
let h = Math.floor(result/1000/60/60%24);
let m = Math.floor(result/1000/60%60);
let s = Math.floor(result/1000%60);
function checkTime(i){
if (i<10) {
i = "0"+i;
}
return i;
}
h = checkTime(h)
m = checkTime(m)
s = checkTime(s)
time = `${h}:${m}:${s}`
} else {
clearInterval(item.timer)
item.timer = null
time = null
}
callback(time)
}, 1000)
},
clear(){
this.list.map(v =>{
if (v.timer){
clearInterval(v.timer)
v.timer = null
v.time = null
}
})
},
jumpTo(row){
this.$navigateTo('details?id='+row.goodsId)
}
}
}
</script>
<style scoped lang="scss">
.main{
background-color: #865afd;
min-height: 100vh;
.top{
width: 100%;
}
.list{
margin: 0 20rpx;
&-item{
background-color: white;
border-radius: 20rpx;
padding: 20rpx;
margin-bottom: 20rpx;
display: flex;
.img{
width: 180rpx;
height: 180rpx;
border-radius: 16rpx;
margin-right: 20rpx;
}
.btn{
background: linear-gradient(to right, #F8D247 0%, #865afd 100%);
border-radius: 10rpx;
padding: 16rpx;
font-size: 24rpx;
display: flex;
margin-top: 10rpx;
.left{
color: #b9a1fe;
width: 65%;
text-align: center;
}
}
.mar{
margin: 0;
}
}
}
}
</style>