3
0
Fork 0
web-store-retail-h5/pages/index/index.vue

751 lines
16 KiB
Vue
Raw Normal View History

2025-03-23 09:29:40 +08:00
<template>
2025-06-09 17:22:32 +08:00
<view :class="userInfo && userInfo.skin ? 'content1' : 'content'">
2025-03-23 09:29:40 +08:00
<view class="content_a">
<!-- 商品专区入口 先别删 -->
<!-- <view @tap="goSpecialArea">会员专区</view> -->
2025-06-09 17:22:32 +08:00
<view :class="userInfo && userInfo.skin ? 'index-top1' : 'index-top'">
</view>
2025-03-23 09:29:40 +08:00
<view class="banner" v-if="isEmpty(goodsList.advertBannerList) == false">
<view class="uni-margin-wrap">
<swiper
class="swiper"
circular
:indicator-dots="indicatorDots"
:autoplay="autoplay"
:interval="interval"
:duration="duration"
>
<swiper-item
v-for="(item, index) in goodsList.advertBannerList"
:key="index"
2025-03-23 09:29:40 +08:00
@click="bannerTap(item.link)"
>
<view class="swiper-item uni-bg-red">
<image :src="item.picture"></image>
</view>
</swiper-item>
</swiper>
</view>
</view>
<special-area-wrapper size="small" />
2025-03-23 09:29:40 +08:00
<view class="goods-sort">
2025-06-09 17:22:32 +08:00
<view class="goods_content" style="padding-bottom: 130rpx">
2025-03-23 09:29:40 +08:00
<view
class="goods-center-lists"
2025-06-09 17:22:32 +08:00
v-for="item in goodsList"
:key="item.waresId"
2025-03-23 09:29:40 +08:00
@click="goDetails(item)"
>
<view
class="fly"
v-show="item.preSaleStatus == 3 || item.isSale == 1"
></view>
<view class="goods-flex-s">
<view class="goods-img">
<image :src="item.cover1"></image>
</view>
<view class="padding_s goods-info">
2025-03-23 09:29:40 +08:00
<view class="goods-name">{{ item.waresName }}</view>
<view class="goods-sales-wrapper">
2025-06-09 17:22:32 +08:00
<view class="goods-sales"
>累计销量{{ formatSales(item.sales) }}</view
>
<view
class="goods-price"
v-if="item.specialArea == 31 && userInfo.isMakerSpace == 1"
>
<span v-if="priceSymbolVisible" class="price-symbol">
{{ priceSymbol }}
</span>
2025-04-28 09:49:59 +08:00
<span>{{ formatCurrency(item.vipPrice) }}</span>
</view>
<view class="goods-price" v-if="item.specialArea != 31">
<span v-if="priceSymbolVisible" class="price-symbol">
{{ priceSymbol }}
</span>
2025-04-28 09:49:59 +08:00
<span>{{ formatCurrency(item.waresPrice) }}</span>
</view>
<view
class="goods-price"
v-if="item.specialArea == 31 && userInfo.isMakerSpace == 0"
>
<span v-if="priceSymbolVisible" class="price-symbol">
{{ priceSymbol }}
</span>
2025-04-28 09:49:59 +08:00
<span>{{ formatCurrency(item.waresPrice) }}</span>
</view>
2025-03-23 09:29:40 +08:00
</view>
</view>
</view>
</view>
</view>
</view>
<cl-tabbar :current="0"></cl-tabbar>
<div>
<!-- 公告弹窗 -->
<notice-popup
@getTree="getTree"
:userInfo="userInfo"
ref="child"
:publishLocationIndex="10"
></notice-popup>
2025-04-01 16:17:59 +08:00
<!-- 植树弹窗
2025-03-23 09:29:40 +08:00
<getTree ref="tree"></getTree>
2025-04-01 16:17:59 +08:00
-->
2025-03-23 09:29:40 +08:00
<!-- 站内信弹窗 -->
<znNewsPopup
ref="child2"
@childMethodTrigger="callChildMethod"
></znNewsPopup>
2025-04-01 16:17:59 +08:00
<!-- 直推排行弹窗
2025-03-23 09:29:40 +08:00
<directrank-popup
@callznMethodTrigger="callznMethod"
></directrank-popup>
2025-04-01 16:17:59 +08:00
-->
2025-06-09 14:39:09 +08:00
<!-- <u-modal
2025-03-23 09:29:40 +08:00
:show="promptFlag"
title="提示"
:closeOnClickOverlay="true"
showCancelButton
:confirmText="confirmText"
confirmColor="#DE3932"
@close="promptFlag = false"
@cancel="promptFlag = false"
2025-06-09 17:22:32 +08:00
@confirm="confirmHandle"
2025-03-23 09:29:40 +08:00
:content="promptMsg"
2025-06-09 14:39:09 +08:00
></u-modal> -->
2025-03-23 09:29:40 +08:00
</div>
</view>
</view>
</template>
<script>
// import titleLine from '@/components/titleLine.vue'
import * as api from '@/config/login.js'
import * as apis from '@/config/index.js'
import * as ban from '@/config/balance.js'
import { getAreaGoods } from '@/config/special-area'
import clTabbar from '@/components/cl-tabbar.vue'
import noticePopup from '@/components/noticePopup.vue'
import getTree from '@/components/getTree.vue'
import znNewsPopup from '@/components/znNewsPopup.vue'
import { formatCurrency } from '@/util/index.js'
import { mapGetters } from 'vuex'
2025-06-09 17:22:32 +08:00
import SpecialAreaWrapper from '@/components/area-product-list/special-area-wrapper.vue'
import {
REGIEST_AREA,
REISSUE_AREA,
UPGRADE_AREA,
REPURCHASE_AREA,
} from '@/util/specialAreaMap'
import { MEMBER_SIGN } from '@/util/common.js'
2025-03-23 09:29:40 +08:00
export default {
components: {
noticePopup,
znNewsPopup,
'cl-tabbar': clTabbar,
2025-03-23 09:29:40 +08:00
getTree,
2025-06-09 17:22:32 +08:00
'special-area-wrapper': SpecialAreaWrapper,
2025-03-23 09:29:40 +08:00
},
filters: {
seles(value) {
if (value > 999) {
return 999 + '+'
2025-03-23 09:29:40 +08:00
} else {
return value
2025-03-23 09:29:40 +08:00
}
},
},
data() {
return {
promptFlag: false,
promptMsg: '',
confirmText: '',
userInfo: uni.getStorageSync('User'),
2025-03-23 09:29:40 +08:00
moreFlag: false,
index: 0,
indicatorDots: true,
interval: 5000,
autoplay: true,
duration: 500,
goodsList: [],
2025-04-28 09:49:59 +08:00
recommendSpecialAreaList: [],
}
},
computed: {
2025-06-09 17:22:32 +08:00
...mapGetters(['priceSymbol', 'priceSymbolVisible', 'isZeroLevel']),
2025-03-23 09:29:40 +08:00
},
onLoad() {
if (
uni.getStorageSync('showInfo') == undefined ||
uni.getStorageSync('showInfo') == 0
2025-03-23 09:29:40 +08:00
) {
}
this.getAreaGoods(
this.userInfo.memberSign == MEMBER_SIGN.ZERO_LEVEL
? REPURCHASE_AREA.id
: REGIEST_AREA.id
)
2025-04-07 16:26:25 +08:00
// this.getLanguage();
2025-06-09 14:39:09 +08:00
// this.getService()
2025-03-23 09:29:40 +08:00
},
onShow() {
this.$store.dispatch('getCarLength')
2025-03-23 09:29:40 +08:00
},
2025-06-09 17:22:32 +08:00
// onPullDownRefresh() {
// let that = this
// setTimeout(() => {
// that.getGoodsInfo()
// uni.stopPullDownRefresh() //停止刷新
// }, 1000)
// },
2025-03-23 09:29:40 +08:00
methods: {
formatCurrency,
2025-04-28 09:49:59 +08:00
formatSales(value) {
if (value > 999) {
return '999+'
2025-04-28 09:49:59 +08:00
} else {
return value
2025-04-28 09:49:59 +08:00
}
},
2025-03-23 09:29:40 +08:00
goAreaUrl() {
ban.agreementName().then(res => {
2025-03-23 09:29:40 +08:00
if (res.data == 0) {
uni.navigateTo({
url:
'/pages/specialArea/list?label=续约专区' +
'&specialArea=30' +
'&children=[]',
})
2025-03-23 09:29:40 +08:00
} else {
uni.showModal({
title: '提示',
content: '请先进行实名认证',
success: res => {
2025-03-23 09:29:40 +08:00
if (res.confirm) {
uni.navigateTo({
url: '/pages/selfService/realName/realName',
})
2025-03-23 09:29:40 +08:00
}
},
})
2025-03-23 09:29:40 +08:00
}
})
2025-03-23 09:29:40 +08:00
},
2025-06-09 17:22:32 +08:00
getAreaGoods(areaId) {
getAreaGoods({
pageNum: 1,
pageSize: 3,
specialArea: areaId,
}).then(res => {
if (res.code == 200) {
this.goodsList = res.data || []
}
2025-04-28 09:49:59 +08:00
})
},
2025-06-09 17:22:32 +08:00
confirmHandle() {
this.promptFlag = false
2025-03-23 09:29:40 +08:00
if (this.jumpPage == 1) {
uni.navigateTo({
url: '/pages/selfService/realName/realName',
})
2025-03-23 09:29:40 +08:00
} else {
// uni.navigateTo({
// url:
// '/pages/specialArea/list?label=续约专区' +
// '&specialArea=30' +
// '&children=[]',
// })
2025-03-23 09:29:40 +08:00
}
},
getService() {
api.agreement_expire().then(res => {
2025-03-23 09:29:40 +08:00
if (res.code == 200) {
this.promptFlag = res.data.promptFlag ? false : true
this.promptMsg = res.data.promptMsg
this.jumpPage = res.data.jumpPage
2025-03-23 09:29:40 +08:00
// confirmText
if (this.jumpPage == 1) {
this.confirmText = '实名认证'
2025-03-23 09:29:40 +08:00
} else {
this.confirmText = '确定'
// this.confirmText = '立即续约'
2025-03-23 09:29:40 +08:00
}
}
})
2025-03-23 09:29:40 +08:00
},
callChildMethod() {
this.$refs.child.getUserTc()
2025-03-23 09:29:40 +08:00
},
callznMethod() {
this.$refs.child2.getUserTc2()
2025-03-23 09:29:40 +08:00
},
// 植树弹层
getTree() {
this.$refs.tree.getData()
2025-03-23 09:29:40 +08:00
},
isEmpty(v) {
switch (typeof v) {
case 'undefined':
return true
case 'string':
if (v.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0)
return true
break
case 'boolean':
if (!v) return true
break
case 'number':
if (0 === v || isNaN(v)) return true
break
case 'object':
if (null === v || v.length === 0) return true
2025-03-23 09:29:40 +08:00
for (var i in v) {
return false
2025-03-23 09:29:40 +08:00
}
return true
2025-03-23 09:29:40 +08:00
}
return false
2025-03-23 09:29:40 +08:00
},
more() {
this.moreFlag = true
2025-03-23 09:29:40 +08:00
},
openKf() {
let userInfo = uni.getStorageSync('User')
2025-03-23 09:29:40 +08:00
let src =
'https://im1c5366d.7x24cc.com/phone_webChat.html?accountId=N000000033467&chatId=302384fb-eda1-436e-a5e9-c03a2dbd6e97&visitorId=' +
2025-03-23 09:29:40 +08:00
userInfo.memberCode +
'&nickName=' +
userInfo.memberCode
window.open(src, '_blank')
2025-03-23 09:29:40 +08:00
},
bannerTap(urls) {
if (urls) {
window.location.href = urls
2025-03-23 09:29:40 +08:00
}
},
getGoodsInfo() {
2025-06-09 17:22:32 +08:00
// apis.userIndex().then(res => {
// this.goodsList = res.data
// })
2025-03-23 09:29:40 +08:00
},
2025-03-23 09:29:40 +08:00
goUrl(item) {
ban.agreementName().then(res => {
2025-03-23 09:29:40 +08:00
if (res.data == 0) {
uni.navigateTo({
url:
'/pages/specialArea/details?waresCode=' +
2025-03-23 09:29:40 +08:00
item.waresCode +
'&specialArea=' +
2025-03-23 09:29:40 +08:00
item.specialArea,
})
2025-03-23 09:29:40 +08:00
} else {
uni.showModal({
title: '提示',
content: '请先进行实名认证',
success: res => {
2025-03-23 09:29:40 +08:00
if (res.confirm) {
uni.navigateTo({
url: '/pages/selfService/realName/realName',
})
2025-03-23 09:29:40 +08:00
}
},
})
2025-03-23 09:29:40 +08:00
}
})
2025-03-23 09:29:40 +08:00
},
goDetails(item) {
if (item.preSaleStatus == 3 || item.isSale == 1) {
} else {
if (item.specialArea == 30) {
this.goUrl(item)
2025-03-23 09:29:40 +08:00
} else {
uni.navigateTo({
url:
'/pages/specialArea/details?waresCode=' +
2025-03-23 09:29:40 +08:00
item.waresCode +
'&specialArea=' +
2025-03-23 09:29:40 +08:00
item.specialArea,
})
2025-03-23 09:29:40 +08:00
}
}
},
goSpecialArea() {
uni.navigateTo({
url: '/pages/index/specialArea/index',
})
2025-03-23 09:29:40 +08:00
},
},
}
2025-03-23 09:29:40 +08:00
</script>
<style lang="scss" scoped>
.content {
// background: url('~@/static/images/fBgd.jpg') no-repeat;
background-size: 100% 100%;
height: 100vh;
.content_a {
overflow: auto;
height: 100%;
}
}
.content1 {
background: url('~@/static/images/fBgd.jpg') no-repeat;
2025-03-23 09:29:40 +08:00
background-size: 100% 100%;
height: 100vh;
.content_a {
overflow: auto;
height: 100%;
}
}
.more {
color: #333;
background-color: #fff;
height: 80rpx;
line-height: 80rpx;
text-align: center;
border-radius: 30rpx;
width: 690rpx;
margin: 0 auto 30rpx auto;
}
:v-deep uni-swiper {
2025-03-23 09:29:40 +08:00
height: 300rpx;
}
header {
display: none !important;
}
.padding_s {
padding: 0 20rpx;
}
.goods-name {
width: 100%;
2025-03-23 09:29:40 +08:00
margin-top: 10rpx;
color: #333;
2025-06-09 17:22:32 +08:00
font-size: 32rpx;
2025-03-23 09:29:40 +08:00
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
word-break: break-word;
line-height: 1.4;
// min-height: calc(26rpx * 1.4 * 2);
2025-03-23 09:29:40 +08:00
}
.goods-center-lists {
width: calc(100% - 40rpx); // height: 450rpx;
2025-03-23 09:29:40 +08:00
background: #ffffff;
margin-left: 20rpx;
margin-right: 20rpx;
2025-03-23 09:29:40 +08:00
border-radius: 15rpx;
border-bottom: 20rpx;
margin-bottom: 20rpx;
// padding-bottom: 30rpx;
2025-03-23 09:29:40 +08:00
position: relative;
.goods-flex-s {
display: flex;
padding: 20rpx;
.goods-img {
flex-shrink: 0;
width: 236rpx;
height: 236rpx;
image {
width: 100%;
height: 100%;
border-radius: 10rpx;
}
}
}
.goods-info {
flex: 1;
padding-left: 20rpx;
width: 0;
display: flex;
flex-direction: column;
.goods-sales-wrapper {
display: flex;
flex: 1;
flex-direction: column;
2025-06-09 17:22:32 +08:00
justify-content: space-between;
.goods-sales {
font-size: 24rpx;
color: #999;
margin-top: 10rpx;
}
.goods-price {
color: #f82c1a;
margin-top: 10rpx;
font-style: 22rpx;
margin-left: -7rpx;
.price-symbol {
font-size: 22rpx;
}
span {
font-size: 36rpx;
font-weight: bold;
}
}
.goods-price1 {
color: #999;
font-size: 10px;
margin-left: -7rpx;
span {
font-size: 10rpx;
}
}
}
}
2025-03-23 09:29:40 +08:00
}
.swiper-s {
height: 495rpx;
}
.goods-lists {
width: 340rpx;
margin-bottom: 0rpx;
margin-left: 20rpx;
}
.goods_content {
display: flex;
flex-direction: column;
2025-03-23 09:29:40 +08:00
padding: 0;
flex-wrap: wrap;
}
.price {
height: 40rpx;
line-height: 40rpx;
background: #fde9e9;
border-radius: 14rpx;
color: #e7141a;
font-size: 22rpx;
text-align: center;
width: max-content;
padding: 0 10rpx;
margin: 0 auto;
}
.goods-cen {
display: flex;
margin-top: 20rpx;
2025-04-28 09:49:59 +08:00
gap: 20rpx;
// justify-content: space-between;
2025-03-23 09:29:40 +08:00
}
.goods-list {
// display: flex;
2025-04-28 09:49:59 +08:00
width: 33%;
2025-03-23 09:29:40 +08:00
}
.goods-content {
2025-04-28 09:49:59 +08:00
width: 100%;
height: 200rpx;
2025-03-23 09:29:40 +08:00
text-align: center;
.goods {
image {
2025-04-28 09:49:59 +08:00
width: 100%;
height: 200rpx;
2025-03-23 09:29:40 +08:00
}
}
}
.goods-flexs {
.goods-view {
position: relative;
2025-04-28 09:49:59 +08:00
// width: 302rpx; // height: 180rpx;
// margin-left: 20rpx;
// background: #ffffff;
2025-03-23 09:29:40 +08:00
border-radius: 15rpx;
padding: 0 20rpx;
2025-03-23 09:29:40 +08:00
margin-bottom: 20rpx;
.goods-top {
z-index: 1;
position: relative;
display: flex;
.title {
color: #333;
font-size: 32rpx;
font-weight: bold;
}
.lables {
height: 28rpx;
background: #f82c1a;
border-radius: 10rpx;
line-height: 24rpx;
font-size: 22rpx;
padding: 5rpx 15rpx;
color: #fff;
max-width: 100rpx;
margin: 5rpx 0 0 10rpx;
}
}
}
.lefts {
margin-left: 15rpx;
}
}
:v-deep .swiper-s .swiper-items uni-image {
2025-03-23 09:29:40 +08:00
height: 495rpx;
}
.swiper-items {
// height: 495rpx;
2025-04-28 11:31:27 +08:00
// width: 340rpx;
2025-03-23 09:29:40 +08:00
border-radius: 12rpx;
image {
border-radius: 12rpx;
height: 450rpx;
width: 340rpx;
}
}
.swiper-item {
height: 300rpx;
text-align: center;
2025-04-28 11:31:27 +08:00
padding: 0 20rpx;
width: 100%;
box-sizing: border-box;
2025-03-23 09:29:40 +08:00
image {
border-radius: 24rpx;
height: 300rpx;
2025-04-28 11:31:27 +08:00
width: 100%;
2025-03-23 09:29:40 +08:00
}
}
.banner {
padding: 30rpx 0 0 0;
2025-03-23 09:29:40 +08:00
text-align: center;
width: 100%;
2025-04-28 11:11:55 +08:00
margin-bottom: 20rpx;
2025-03-23 09:29:40 +08:00
}
.changeLanguages {
position: absolute;
right: 0rpx;
top: 45rpx;
}
.select-text {
display: flex;
margin-right: 20px;
}
.selIcon {
width: 40rpx;
height: 40rpx;
}
.paswwrod_btn {
color: #666666;
font-size: 26rpx;
margin: 40rpx auto;
text-align: center;
}
page {
background-color: #f2f2f2;
}
.index-left {
font-weight: bold;
.english {
font-size: 24rpx;
color: #333;
}
.text {
font-size: 30rpx;
color: #333;
margin-top: 2rpx;
letter-spacing: 16rpx;
}
}
.index-top {
// background: url('~@/static/images/tBgd.jpg') no-repeat;
background-size: 100% 100%;
// padding: 30rpx 20rpx; // height: 100rpx;
background-color: #fff;
display: flex;
justify-content: space-between;
position: fixed;
z-index: 10;
width: 100%;
height: 20rpx;
2025-03-23 09:29:40 +08:00
.index_t {
padding: 30rpx 20rpx;
}
}
.index-top1 {
background: url('~@/static/images/tBgd.jpg') no-repeat;
2025-03-23 09:29:40 +08:00
background-size: 100% 100%;
// padding: 30rpx 20rpx; // height: 100rpx;
// background-color: #fff;
display: flex;
justify-content: space-between;
position: fixed;
z-index: 10;
width: 100%;
height: 100%;
2025-03-23 09:29:40 +08:00
.index_t {
padding: 30rpx 20rpx;
}
}
.index-right {
display: flex;
}
.kf_A {
position: fixed;
background: rgba(256, 256, 256, 0.8);
width: 62px;
// height: 60px;
z-index: 10;
right: 40rpx;
top: 11%;
border-radius: 10px;
text-align: center;
padding: 20rpx 0;
}
.kf {
image {
width: 48rpx;
height: 48rpx;
margin-bottom: 10rpx;
}
font-size: 10px;
color: #333333;
}
.fly {
position: absolute;
width: 100%;
height: 100%;
top: 0;
background: #eee;
opacity: 0.5;
z-index: 1;
}
</style>