2025-07-25 09:52:05 +08:00

656 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<div class="header">
<div
class="searchBox"
:style="{ height: localHeight + 'px', paddingTop: top + 'px' }"
>
<div class="searchBox_left" @click="back">
<u-icon name="arrow-left" size="20px" color="#000"></u-icon>
</div>
</div>
</div>
<div class="swiper">
<swiper
:indicator-dots="false"
:autoplay="true"
:interval="3000"
:duration="1000"
@change="changeIndex"
>
<swiper-item
v-for="(item, index) in currentGG.goods_carousel"
:key="index"
>
<image :src="picUrl + item"></image>
</swiper-item>
</swiper>
<div class="NumDot">
{{ currentIndex }} /{{ currentGG.goods_carousel.length }}
</div>
</div>
<div class="Money">
<div class="MoneyMark"></div>
{{ currentGG.sales_price }}
<div class="MoneyUnit">/{{ currentGG.goods_unit }}</div>
<div class="oldMoney">{{ currentGG.market_price }}</div>
</div>
<!-- 规格 -->
<!-- @click="changeGG2(item, index)" :class="index == currentGGIndex ? 'active' : ''"> -->
<div class="GGBox">
<div class="GG_left">
<div
class="GG_Item"
v-for="(item, index) in info.commodity_goods_info_list"
:key="item.id"
@click="changeGG(item, index)"
:class="index == currentGGIndex ? 'active' : ''"
>
{{ item.goods_spec }} / {{ item.goods_unit }}
</div>
</div>
<div class="GG_rigth">
{{ info.commodity_goods_info_list.length }}<u-icon
size="26rpx"
name="arrow-right"
></u-icon>
</div>
</div>
<div class="Tit">{{ currentGG.goods_name }}</div>
<div class="Msg">{{ currentGG.commodity_brief }}</div>
<div class="fenge"></div>
<!-- 促销信息区域 -->
<div class="promotions-container">
<div class="promotion-item">
<div class="promotion-tag">优惠</div>
<div class="promotion-content promotion-content1">满100减10</div>
</div>
<div class="promotion-item">
<div class="promotion-tag">限购</div>
<div class="promotion-content">限购5件</div>
</div>
<div class="promotion-item">
<div class="promotion-tag">阶梯价</div>
<div class="promotion-content">1~9 9.5/;>10 8.0/</div>
</div>
<div class="promotion-item">
<div class="promotion-tag">满赠</div>
<div class="promotion-content">满5赠1满10赠3</div>
</div>
<div class="promotion-item">
<div class="promotion-tag">满减</div>
<div class="promotion-content">满100减5满200减20</div>
</div>
</div>
<div class="fenge"></div>
<div class="Msg_Item">
<div class="Msg_ItemTit">质检</div>
<div class="Msg_ItemCon">质检报告</div>
</div>
<div class="Msg_Item">
<div class="Msg_ItemTit">押金</div>
<div class="Msg_ItemCon">需另付押金:30.00(30天可退)</div>
</div>
<div class="Msg_Item">
<div class="Msg_ItemTit">配送</div>
<text class="Msg_ItemCon">
12:00前下单,预计8月21日送达;
12:00前下单,预计8月21日送达;
</text>
</div>
<div class="fenge"></div>
<!-- 评价部分 -->
<div class="reviews-section">
<div class="reviews-header">
<h3>评价({{ comments.length }})</h3>
<view class="view-all" @click="showPopup">查看全部 ></view>
</div>
<div class="reviews-list" v-if="comments.length > 0">
<div
class="review-item"
v-for="(comment, index) in comments"
:key="index"
>
<div class="review-user">
<image :src="comment.avatar" class="user-avatar"></image>
<div class="user-info">
<div class="user-name">{{ comment.username }}</div>
</div>
<div class="review-time">{{ comment.time }}</div>
</div>
<div class="user-purchase">已购 {{ comment.product }}</div>
<div class="review-content">{{ comment.content }}</div>
<div class="review-images" v-if="comment.images.length > 0">
<image
:src="img"
class="review-img"
v-for="(img, idx) in comment.images"
:key="idx"
></image>
</div>
</div>
</div>
</div>
<div class="fenge"></div>
<h3 class="GoodsMsg">商品详情</h3>
<div class="Msg_Item">
<div class="Msg_ItemTit">商品编号</div>
<div class="Msg_ItemCon" @click="copys(currentGG.goods_no)">
{{ currentGG.goods_no }}
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_copy.png"
></image>
</div>
</div>
<div class="Msg_Item">
<div class="Msg_ItemTit">规格说明</div>
<div class="Msg_ItemCon">{{ currentGG.goods_spec }}</div>
</div>
<div class="Msg_Item">
<div class="Msg_ItemTit">售卖单位</div>
<div class="Msg_ItemCon">{{ currentGG.goods_unit }}</div>
</div>
<div class="GoosMsg">
<image
v-for="item in currentGG.goods_detail_pic"
:src="picUrl + item"
mode="widthFix"
></image>
</div>
<div class="priceInfo">
<h3 class="priceInfo-title">价格说明</h3>
<div class="priceInfo-content">
<view>
<text class="priceInfo-content-title">划线价格</text>
指商品的厂商指导价正品零售价市面常见价或该商品曾经展示过的销售价等并非原价仅供参考
</view>
<view>
<text class="priceInfo-content-title">未划线价格</text>
指商品的实时价格不因表述的差异改变性质具体成交价格根据商品参加活动或使用优惠券等发生变化最终以订单结算价格为准
</view>
</div>
</div>
<!-- 底部购物车 -->
<div class="Car">
<div class="car_left">
<div class="share" @click="share">
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share.png"
mode="widthFix"
></image>
分享
</div>
<div class="cars" @click="car">
<u-badge
numberType="limit"
:type="type"
max="99"
:value="carNum"
></u-badge>
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_car.png"
mode="widthFix"
></image>
购物车
</div>
</div>
<div
class="car_right"
v-if="
!info.commodity_goods_info_list[currentGGIndex].cart_count ||
info.commodity_goods_info_list[currentGGIndex].cart_count.count == 0
"
@click="addCar"
>
加入购物车
</div>
<div
class="car_right"
v-if="
info.commodity_goods_info_list[currentGGIndex].cart_count.count > 0
"
>
<u-number-box
v-model="
info.commodity_goods_info_list[currentGGIndex].cart_count.count
"
@change="changeCar"
min="0"
>
<view slot="minus" class="minus">
<u-icon name="minus" size="36" bold></u-icon>
</view>
<text
slot="input"
style="width: 200rpx; text-align: center"
class="input"
>
{{
info.commodity_goods_info_list[currentGGIndex].cart_count.count
}}</text
>
<view slot="plus" class="plus">
<u-icon name="plus" color="#FFFFFF" size="36" bold></u-icon>
</view>
</u-number-box>
</div>
</div>
<!-- 分享 -->
<div class="shadow" @click.stop="changeShadow" v-if="boxshadow1">
<div class="shadowBox1">
<div class="shadowBox1Item" @click="shareFriend">
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_WX.png"
mode="aspectFill"
></image>
微信好友
</div>
<div class="shadowBox1Item" @click="openSave">
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_saveImg.png"
mode="aspectFill"
></image>
生成海报
</div>
</div>
</div>
<!-- 海报 -->
<div class="shadow" @click="changeShadow2" v-if="boxshadow2">
<div class="shadowBox2">
<div class="shadowBox_img">
<div class="boxshadow_tit">今日商品推荐</div>
<div class="boxshadow_img">
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share_img.png"
>
</image>
</div>
<div class="line"></div>
<div class="shadowBoxInfo">
<div class="shadowboxInfo_left">二维码</div>
<div class="shadowboxInfo_right">
<div class="shadowboxInfo_right_1">正鲜生</div>
<div class="shadowboxInfo_right_2">
长按识别小程序 <br />
数量有限马上抢购
</div>
</div>
</div>
</div>
<div class="shadowBox_btn" @click.stop="saveImg">保存海报</div>
</div>
</div>
<!-- 评价 查看详情 -->
<u-popup
:show="show"
round="20rpx"
mode="bottom"
@close="close"
@open="open"
>
<div class="reviews-section">
<div class="reviews-header">
<h3>评价</h3>
</div>
<div class="reviews-list" v-if="comments.length > 0">
<div
class="review-item"
v-for="(comment, index) in comments"
:key="index"
>
<div class="review-user">
<image :src="comment.avatar" class="user-avatar"></image>
<div class="user-info">
<div class="user-name">{{ comment.username }}</div>
</div>
<div class="review-time">{{ comment.time }}</div>
</div>
<div class="user-purchase">已购 {{ comment.product }}</div>
<div class="review-content">{{ comment.content }}</div>
<div class="review-images" v-if="comment.images.length > 0">
<image
:src="img"
class="review-img"
v-for="(img, idx) in comment.images"
:key="idx"
></image>
</div>
</div>
</div>
</div>
</u-popup>
</view>
</template>
<script>
import { apiArr } from "../../../api/shop";
import { picUrl, menuButtonInfo, request, NavgateTo } from "../../../utils";
export default {
data() {
return {
picUrl,
top: "",
localHeight: "",
carNum: "",
prevCarNum: "",
currentNum: "0", //当前商品的数量
type: "error",
boxshadow1: false,
boxshadow2: false,
id: "",
info: "",
currentIndex: "1", //当前轮播图
currentGG: "", //当前选中规格
currentGGIndex: "", //当前规格index
carOrderList: [],
// 新增评论数据
showReviewPopup: false,
comments: [
{
avatar: "http://localhost:8080/test.png",
username: "TP",
product: "库尔勒香梨 10kg/箱",
content:
"踏入这家位于街角的餐厅,木质门框与暖黄灯光交织出温馨氛围,墙面上手绘的食材插画画透着文艺气息,开放式厨房的设计让食客能看见厨师处理食材的全过程,第一印象便给人以干净与安心。",
images: ["http://localhost:8080/test.png"],
time: "2025-03-01 11:24:20",
},
{
avatar: "http://localhost:8080/test.png",
username: "TP",
product: "库尔勒香梨 10kg/箱",
content:
"踏入这家位于街角的餐厅木质门框与暖黄灯光交织出温馨氛围墙面上手绘的食材插_draw着文艺气息开放式厨房的设计让食客能看见厨师处理食材的全过程第一印象便给人以干净与安心。",
images: [
"http://localhost:8080/test.png",
"http://localhost:8080/test.png",
"http://localhost:8080/test.png",
],
time: "2025-03-01 11:24:20",
},
],
show: false,
};
},
methods: {
changeIndex(e) {
this.currentIndex = e.detail.current + 1;
},
back() {
uni.navigateBack({
delta: 1,
});
},
// 分享微信
shareFriend() {
this.boxshadow2 = false;
return;
// uniapp 分享微信好友
uni.share({
provider: "weixin",
type: "link",
scene: "session",
link: "https://uniapp.dcloud.net.cn/",
title: "商品名称",
imageUrl: "",
success: (res) => {
uni.showToast({
title: "分享成功",
icon: "success",
duration: 2000,
});
this.boxshadow1 = false;
},
fail: (err) => {
console.log("分享失败", err);
this.boxshadow1 = false;
},
});
},
changeShadow() {
this.boxshadow1 = false;
},
openSave() {
this.boxshadow1 = false;
this.boxshadow2 = true;
},
// 保存海报
saveImg() {
this.boxshadow2 = false;
// 微信小程序保存图片
uni.downloadFile({
url: "https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share_img.png",
success: (res) => {
if (res.statusCode === 200) {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: (res) => {
uni.showToast({
title: "保存成功",
icon: "success",
duration: 2000,
});
},
fail: (err) => {
console.log("保存失败", err);
},
});
}
},
fail: (err) => {
console.log("下载失败", err);
},
});
},
changeShadow2() {
this.boxshadow2 = false;
},
// 点分享按钮
share() {
this.boxshadow1 = true;
},
//商品详情
getGoodsInfo() {
request(apiArr.getGoodsInfo, "POST", {
id: this.id,
}).then((res) => {
console.log(res);
// 分割图片
res.commodity_goods_info_list.forEach((item) => {
item.goods_detail_pic = item.goods_detail_pic.split(",");
item.goods_carousel = item.goods_carousel.split(",");
item.commodity_pic = item.commodity_pic.split(",");
});
//根据购物车列表 和 当前商品列表 来更新当前商品列表在购物车中的数量
if (this.carOrderList) {
this.carOrderList.forEach((items) => {
res.commodity_goods_info_list.forEach((item) => {
if (items.goods_id == item.id) {
item.cart_count = { count: 0 };
item.cart_count.count = items.count;
}
});
});
}
this.info = res;
this.currentGG = res.commodity_goods_info_list[0];
this.currentGGIndex = 0;
});
},
copys(e) {
uni.setClipboardData({
data: e,
success: (res) => {
uni.showToast({
title: "复制成功",
icon: "success",
duration: 2000,
});
},
});
},
// 切换规格
changeGG(item, index) {
this.currentGG = item;
this.currentGGIndex = index;
if (this.currentGG.cart_count) {
this.currentNum = this.currentGG.cart_count.count;
} else {
this.currentGG.cart_count = { count: 0 };
}
},
car() {
NavgateTo("../shopCar/index");
},
//获取购物车数量
getShopCar() {
request(apiArr.getCarCount, "POST", {}).then((res) => {
this.carNum = res.total;
this.prevCarNum = res.total;
});
},
getShopCarList() {
request(apiArr.getCar, "POST", {}).then((res) => {
this.carOrderList = res.commodity_cart_list;
});
},
addCar() {
let that = this;
//如果没有当前商品 直接添加一个
let goods_id_and_count = [];
this.info.commodity_goods_info_list[this.currentGGIndex].cart_count = {
count: 1,
};
this.info.commodity_goods_info_list.forEach((item) => {
console.log(item.cart_count);
goods_id_and_count.push({
goods_id: item.id,
count: item.cart_count ? item.cart_count.count : 0,
});
});
console.log(goods_id_and_count);
//因为是当前商品没有 调用update就是增加商品。增加商品之后再获取购物车数量
request(apiArr.updateCar, "POST", {
goods_id_and_count,
}).then((res) => {
that.getShopCar();
that.getShopCarList();
});
},
// 购物车更改
changeCar(newValue) {
// // 修改当前商品在购物车中的数量
// this.info.commodity_goods_info_list[this.currentGGIndex].cart_count.count = newValue.value
// // 修改购物车列表中的数量
// this.carOrderList.forEach(item => {
// if (item.commodity_goods_info.id == this.info.commodity_goods_info_list[this.currentGGIndex].id) {
// item.count = newValue.value
// }
// })
// // 计算购物车数量
// let carNum = 0
// this.carOrderList.forEach(item => {
// carNum += item.count
// })
// this.carNum = carNum
//商品数量变化
const params = {
user_id: uni.getStorageSync("userId"),
goods_id_and_count: [
{
goods_id:
this.info.commodity_goods_info_list[this.currentGGIndex].id,
count: newValue.value,
},
],
};
request(apiArr.updateCar, "POST", params).then((res) => {
console.log(res);
this.getShopCarList();
uni.showToast({
title: "操作成功!",
success() {},
});
});
},
showPopup() {
console.log("🚀 ~ showPopup ~ showPopup:");
this.show = true;
},
close() {
this.show = false;
},
},
onLoad(options) {
const itemObj = JSON.parse(decodeURIComponent(options.item));
const meun = menuButtonInfo();
this.top = meun.top;
this.localHeight = meun.height;
this.id = itemObj.id;
},
onReachBottom() {},
onShow() {
this.getShopCarList();
this.getGoodsInfo();
this.getShopCar();
},
//离开页面的时候直接更新购物车数量(目前接口是 传入商品id 数量。如果有当前商品就更新数量。如果没有就增加商品。如果删除某个商品 count 为0 就删除)
onHide() {
let goods_id_and_count = [];
this.info.commodity_goods_info_list.forEach((item) => {
goods_id_and_count.push({
goods_id: item.id,
count: item.cart_count ? item.cart_count.count : 0,
});
});
request(apiArr.updateCar, "POST", {
goods_id_and_count,
}).then((res) => {
console.log("Cart updated on hide");
});
return;
},
};
</script>
<style>
@import url("./index.css");
</style>