TakeOutShop/shopProDetail/evallist/evallist.vue
2025-04-15 20:33:17 +08:00

325 lines
9.2 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 class="mian">
<view class="head">
<view class="eval_tag" v-for="(item,index) in reviewTags" :key="index" @click="referClick(item,index)" :class="act == index?'eval_tag_active':''" ><image v-if="item.imgUrl" class="eval_tag_img" :src="item.imgUrl" mode="widthFix"></image>{{item.tag}} <text v-if="item.num >= 1">{{item.num >= 5000?'5000+':item.num}}</text></view>
</view>
<view class="eval_item" v-for="(item,index) in List" :key="index">
<view class="eval_item_top">
<view class="eval_item_l">
<image class="eval_item_userimg" :src="item.avatar" mode="widthFix"></image>
<view class="eval_item_username">{{item.nickname}}</view>
<!-- <view class="eval_item_userdesc">买过3次</view> -->
<view class="eval_item_usertext"><image class="eval_item_usertext_img" :src="item.evalImg" lazy-load mode="widthFix"></image>{{item.evalName}}</view>
</view>
<view class="eval_item_r"></view>
</view>
<view class="eval_item_text"><text>{{item.comment}}</text></view>
<view class="eval_item_ul">
<view class="eval_item_li" v-for="(pics,index) in item.pics" :key="index">
<image :src="pics" lazy-load mode="widthFix" @click.stop="previewImage(item,index)"></image>
</view>
</view>
<view class="eval_item_bottom">
<view class="eval_item_time">{{item.createTime}}</view>
<!-- <view class="eval_item_numa"><image src="../../static/eval/heart.png" lazy-load mode="widthFix"></image>67</view> -->
</view>
</view>
<view style="height: 200rpx;"></view>
<!-- 底部 -->
<view class="footer">
<view class="footer_cont">
<view class="footer_l">
<view class="footer_li">
<view class="footer_icon" @click="favorite">
<image class="footer_icon_img" :src="productInfo.favor_img" mode="widthFix"></image>
</view>
<view class="footer_name">收藏</view>
</view>
<view class="footer_li" @click="goCart()">
<view class="footer_icon">
<view class="footer_amount" v-if="cartcount > 0">{{cartcount}}</view>
<image class="footer_icon_img" src="../../static/shopdetail/cart.png" mode="widthFix"></image>
</view>
<view class="footer_name">购物车</view>
</view>
</view>
<view class="footer_r">
<view class="footer_btn footer_btn_bcg border_l" @click="addCartShop()">加入购物车</view>
<!-- <view class="footer_btn footer_btn_bcg border_r" @click="orderConfirm">立即下单</view> -->
</view>
</view>
</view>
<multi
ref="shopData"
@add-success="handleAddSuccess"
@add-error="handleAddError"
></multi>
</view>
</template>
<script setup>
import { loads } from '@/utils/index.js'
import multi from '@/components/multi/multi.vue'
import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from 'vue';
import { useCounterStore } from '@/store/counter'; // 引入 Pinia Store
import { storeToRefs } from 'pinia';//实现解构付值
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
const counterStore = useCounterStore(); // 使用 Store
const { proxy } = getCurrentInstance();
//使用piniastoreToRefs方法包裹(保持响应式更新,不使用视图无法更新)
const {statusHeight,headerHeight,statusBartop,token,cartcount } = storeToRefs(counterStore);
import { replyconfig,replylist,frontcartcount,frontdetail,collectcancel,collectadd } from '@/server/api'
const productId = ref('');//产品id
const havePics = ref('');//有图传1
const latest = ref('');//查最新传1
const limits = ref(10);//一页查多少条
const pages = ref(0);//第几页
const tag = ref('');//评论标名称
const type = ref(0);//评论等级:0全部1好评2中评3差评
const total = ref(0);
const reviewTags = ref([]);
const picsCount = ref('');
const sumCount = ref('');
const decs = ref('');
const List = ref([]);
const act = ref(0);
const productInfo = ref({})
const shopData = ref({});
const referClick=(item,index)=>{
if(act.value == index) return false;
act.value = index;
if(index == 0){
havePics.value = '';
latest.value = '';
tag.value = '';
type.type = 0;
}else if(index == 1 && item.tag == '图片'){
havePics.value = 1;
latest.value = '';
tag.value = '';
type.type = 0;
}else if(index == 2){
havePics.value = '';
latest.value = 1;
tag.value = '';
type.type = 0;
}else{
havePics.value = '';
latest.value = '';
tag.value = item.tag;
type.type = 0;
}
List.value = [];
total.value = 0;
decs.value = '';
pages.value = 0;
api_replylist()
}
const api_detail=()=>{
loads('', true);
return frontdetail(productId.value).then(({data}) => {
uni.hideLoading();
if(data.userCollect){
data.favor_img = "../../static/shopdetail/collect_acer.png"
}else{
data.favor_img = "../../static/shopdetail/collect.png"
}
productInfo.value = data;
})
.catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false
})
})
}
//购物车数量
const api_frontcartcount=()=>{
frontcartcount().then(({data}) => {cartcount.value = data.count;})
}
const addCartShop = () =>{
const item = {
image:productInfo.value.image,
storeName:productInfo.value.storeName,
price:productInfo.value.price,
otPrice:productInfo.value.otPrice,
specType:productInfo.value.specType,
id:productInfo.value.id
}
shopData.value.addCart(item,1);
}
// 加入购物车成功回调
const handleAddSuccess = (data) => {}
// 加入购物车失败回调
const handleAddError = (error) => {}
const api_replyconfig=()=>{
return replyconfig(productId.value).then(({data}) => {
let arr = [
{tag:"全部",num:data.sumCount},
{tag:'最新',num:0,imgUrl:'../../static/eval/newest.png'},
]
let imgArr = [
{tag:'图片',num:data.picsCount,imgUrl:'../../static/eval/img.png'}
]
if(data.picsCount >= 1){
arr.splice(1,0, ...imgArr); // 在索引 1 的位置插入,不删除任何元素
}
data.reviewTags.unshift(...arr);
if(tag.value){
data.reviewTags.forEach((item,index)=>{
if(tag.value == item.tag){act.value = index}
})
}
reviewTags.value = data.reviewTags;
picsCount.value = data.picsCount;
sumCount.value = data.sumCount;
})
.then(()=>api_replylist())
.then(()=>api_detail())
.then(()=>api_frontcartcount())
.catch(({message}) => {
uni.showModal({
content:message,
showCancel: false
})
})
}
const previewImage=(item,i)=>{
uni.previewImage({
current: i,
urls:item.pics
});
};
const api_replylist=()=>{
pages.value = pages.value + 1;
decs.value = "—— 加载中... ——";
if(List.value.length > 0 && List.value.length >= total.value){
decs.value = "—— 嗷呜,已经到底啦 ——";
return false
}
const params = {
productId:productId.value,
page:pages.value,
limit:limits.value
};
if(havePics.value){
params.havePics = havePics.value;
}
if(latest.value){
params.latest = latest.value;
}
if(tag.value){
params.tag = tag.value;
}
if(type.value == 1 || type.value == 2 || type.value == 3){
params.type = type.value
}else{
params.type = type.value;
}
return replylist(params).then(({data}) => {
total.value = data.total;
decs.value = '—— 上拉加载更多 ——'
data.list.forEach((item,index)=>{
if(item.score >= 4){
item.evalName = '好评',
item.evalImg = '../../static/eval/praise.png'
}else if(item.score > 2 && item.score < 4){
item.evalName = '中评',
item.evalImg = '../../static/eval/praise.png'
}else if(item.score <= 2){
item.evalName = '差评',
item.evalImg = '../../static/eval/praise.png'
}else{
item.evalName = '',
item.evalImg = ''
}
})
List.value = List.value.concat(data.list);
if(List.value < total.value){
decs.value = '—— 上拉加载更多 ——'
}else{
decs.value = '—— 嗷呜,已经到底啦 ——';
}
}).catch(({message}) => {
uni.showModal({
content:message,
showCancel: false
})
})
}
const favorite = ()=>{
if(productInfo.value.userCollect){
api_collectcancel();
}else{
api_collectadd();
}
}
const api_collectadd=()=>{
loads('', true);
let data = {
category:"store",
id:productInfo.value.id
}
return collectadd(data).then(({message}) => {
uni.hideLoading();
api_detail();
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false
})
})
}
const api_collectcancel=()=>{
loads('', true);
return collectcancel(productInfo.value.id).then(({message}) => {
uni.hideLoading();
api_detail();
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false
})
})
}
onLoad((options) => {
if(options.productId){
productId.value = options.productId;
}
if(options.havePics){
havePics.value = options.havePics;
}
if(options.latest){
latest.value = options.latest;
}
if(options.tag){
tag.value = options.tag;
}
if(options.type == 0 || options.type == 1 || options.type == 2 || options.type == 3){
type.value = options.type;;
}
api_replyconfig();
});
onShow(() => {});
onReady(()=>{})
onPullDownRefresh(()=>{
List.value = [];
total.value = 0;
decs.value = '';
pages.value = 0;
api_replyconfig();
uni.stopPullDownRefresh();
})
onReachBottom(()=>{
api_replylist();
})
</script>
<style lang="scss">
@import './style.scss';
</style>