jyy-smart-canteen-h5/pages/weeklyMenu/menuDetail.vue

355 lines
11 KiB
Vue
Raw Normal View History

2025-05-27 10:30:44 +08:00
<template>
<page-meta :page-font-size="fontValue+'px'" :root-font-size="fontValue+'px'"></page-meta>
<view>
<view class="image-box">
2025-06-04 14:54:23 +08:00
<image style="width: 100%;height: 100%;" :src="dashesData.dishesImgUrl"></image>
2025-05-27 10:30:44 +08:00
<!-- <image style="width: 100%;height: 100%;" src="../../static/images/code.png"></image> -->
</view>
<view class="menuContent">
<view class="menuInfo">
<view style="color:#DD7D3C;font-size: 36rpx;font-weight: 600;margin-bottom: 10px;margin-left: 20px;">{{(menuData.dishesDetailList[0].prefPrice/100).toFixed(2)}}</view>
<view style="width: 100%;height: 30px;display: flex;align-items: center;justify-content: space-between;">
<view style="font-size: 36rpx;font-weight: 600;margin-left: 20px;">{{dashesData.dishesName}}</view>
<view class="star-icon" style="display: flex;" @click="addCollect" v-if="dashesData.isFavorites==2">
<u-icon name="star" size="22" color="#ccc"></u-icon><text style="font-size: 30rpx;"></text>
</view>
<view class="star-icon" style="display: flex;" @click="cancelCollect" v-if="dashesData.isFavorites==1">
<u-icon name="star-fill" size="22" color="#ff9900"></u-icon><text style="font-size: 30rpx;"></text>
</view>
</view>
</view>
<view class="tab-navigation">
<Tabs :tabList="tabList" @changeTab="changeTab" />
</view>
<view class="tab-content">
<view class="info-box" v-if="hIndex==0">
<view style="margin-bottom: 20px;word-break: break-all;">
<text style="color: #959FA4;margin-right: 20px;">菜品简介</text>
<text style="word-break: break-all;">{{dashesData.intro||'-'}}</text>
</view>
<view style="margin-bottom: 20px;word-break: break-all;">
<text style="color: #959FA4;margin-right: 20px;">主料</text>
<text>
{{dashesData.mainMaterialStr||'-'}}
</text>
</view>
<view style="margin-bottom: 20px;word-break: break-all;">
<text style="color: #959FA4;margin-right: 20px;">辅料</text>
<text>
{{dashesData.subMaterialStr||'-'}}
</text>
</view>
<!-- <view style="margin-bottom: 20px;">
<text style="color: #959FA4;">口味</text>
<text style="margin-left: 20px;word-break: break-all;">-</text>
</view> -->
</view>
<view class="nutrition-box" v-if="hIndex==1">
<view class="nutrition-box-item">
<view>项目()</view>
<view>热量()</view>
<view>蛋白质()</view>
<view>脂肪()</view>
<view>碳水化合物()</view>
<view>膳食纤维()</view>
<view>胆固醇()</view>
<view>()</view>
<view>()</view>
</view>
<view class="nutrition-box-item">
<view>含量</view>
2025-06-10 09:41:35 +08:00
<view>{{dashesData.dishesDetailList[0].calories||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].protein||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].fat||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].carbohydrate||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].dietaryFiber||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].cholesterol||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].carotene||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].calcium||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].sodium||'-'}}</view>
2025-05-27 10:30:44 +08:00
</view>
<view class="nutrition-box-item">
<view>NRV%</view>
2025-06-10 09:41:35 +08:00
<view>{{dashesData.dishesDetailList[0].caloriesNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].proteinNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].fatNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].carbohydrateNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].dietaryFiberNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].cholesterolNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].caroteneNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].calciumNrv||'-'}}</view>
<view>{{dashesData.dishesDetailList[0].sodiumNrv||'-'}}</view>
2025-05-27 10:30:44 +08:00
</view>
</view>
<view class="evaluate-box" v-if="hIndex==2">
<view style="width: 100%;height: 30vh;display: flex;justify-content: center;align-items: center;" v-if="totalCount==0">
暂无评论...
</view>
<view style="width: 92%;height: 30px;margin: 10rpx auto; display: flex;justify-content: space-between;align-items: center;" v-if="totalCount>0">
<text style="font-size: 28rpx;font-weight: bold;margin-left: 20rpx;">评价</text>
<text style="font-size: 24rpx;margin-left: 20rpx;" @click="goAllEvaluate">查看全部{{totalCount}}></text>
</view>
<view style="width: 100%;height: 40vh;padding: 20rpx;" v-if="totalCount>0">
2025-06-10 09:41:35 +08:00
<view v-for="(item,index) in evaluaList" :key="index" v-if="index<3" style="width: 100%;height: auto;border-bottom: 1px solid #ccc;">
2025-05-27 10:30:44 +08:00
<view style="width: 94%;margin: 10rpx auto;display: flex;">
<view style="width: 100rpx;height: 100rpx;margin: 10rpx;">
<image :src="item.custPhotoUrl? item.custPhotoUrl:'../../static/images/user.png'" mode="" style="width: 100rpx;height: 100rpx;"></image>
</view>
<view style="width: 80%;height: 100rpx;">
<view style="width: 100%;display: flex;align-items: center;justify-content: space-between;margin-bottom: 20rpx;padding-top: 10rpx;">
<text>{{item.userName}}</text>
<text>{{item.evaluaTime}}</text>
</view>
<view style="display: flex;margin-bottom: 10rpx;">
<u-icon v-for="n in 5" :key="n" :name="n <= item.starLevel ? 'star-fill' : 'star-fill'"
:color="n <= item.starLevel ? '#ff9933' : '#ccc'" size="20"></u-icon>
</view>
</view>
</view>
<view style="width: 100%;padding: 10rpx;padding-left: 20rpx;display: flex;align-items: center;" v-if="item.pictureList&&item.pictureList.length>0">
<view v-for="(imgItem,imgIndex) in item.pictureList" :key="imgIndex" style="margin-bottom: 10rpx;">
2025-06-10 09:41:35 +08:00
<image :src="imgItem" mode="" style="width: 100rpx;height: 100rpx;"></image>
2025-05-27 10:30:44 +08:00
</view>
</view>
<view style="width: 100%;padding: 10rpx;padding-left: 20rpx;">
{{item.description||"该用户没做评价"}}
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
2025-06-04 14:54:23 +08:00
import { getMenudishesDetailAPI,addCollectionDishesAPI,delCollectionDishesAPI,getMenuEvaluaorderAPI } from '../../api/week-menu/index'
2025-05-27 10:30:44 +08:00
import Tabs from '@/pages/components/Tabs.vue'
export default {
components: { Tabs },
data() {
return {
fontValue:uni.getStorageSync('fontSize') || 8,
menuData:{},
dashesData:{},
tabList: ["菜品信息","营养信息","评价"],//tab列表
hIndex:0,
evaluaList:[],
totalCount:0
}
},
onLoad(options) {
console.log(options)
2025-06-10 09:41:35 +08:00
this.menuData = JSON.parse(options.params)
2025-05-27 10:30:44 +08:00
this.getMenudishesDetail()
2025-06-03 11:23:21 +08:00
console.log(this.menuData)
2025-06-10 09:41:35 +08:00
this.getMenuEvaluaorderList()
2025-05-27 10:30:44 +08:00
},
methods: {
//获取菜品详情
async getMenudishesDetail(){
2025-06-10 09:41:35 +08:00
let param = {
"userId": uni.getStorageSync('userId'),
"dishesId": this.menuData.dishesDetailList[0].dishesId,
"detailId": this.menuData.detailId,
// "delFlag": 2
}
const res = await getMenudishesDetailAPI(param)
if(res.code==200){
this.dashesData = res.data;
2025-05-27 10:30:44 +08:00
if(this.dashesData.materialList&&this.dashesData.materialList.length>0){
let arr1=[]
let arr2=[]
this.dashesData.materialList.forEach(item=>{
if(item.materialType==1){ arr1.push(item.materialName) }
if(item.materialType==2){ arr2.push(item.materialName) }
})
this.dashesData.mainMaterialStr = arr1.join("、")
this.dashesData.subMaterialStr = arr2.join("、")
}else{
this.dashesData.mainMaterialStr = ""
this.dashesData.subMaterialStr = ""
}
this.$forceUpdate()
// this.$modal.msgError("收藏成功")
2025-06-10 09:41:35 +08:00
}
console.log(res)
2025-06-04 14:54:23 +08:00
},
2025-05-27 10:30:44 +08:00
//获取菜品评价
async getMenuEvaluaorderList(){
console.log(this.menuData)
let param = {
2025-06-10 09:41:35 +08:00
"pageNum": 1,
"pageSize": 10,
"mealId": this.menuData.dishesDetailList[0].dishesId,
2025-05-27 10:30:44 +08:00
}
const res = await getMenuEvaluaorderAPI(param)
if(res.code==200){
2025-06-04 14:54:23 +08:00
this.evaluaList = res.rows||[]
this.totalCount = res.total
2025-05-27 10:30:44 +08:00
}
console.log(res)
},
goAllEvaluate(){
console.log(this.menuData)
uni.navigateTo({
url: `/pages/weeklyMenu/evaluateCenter?params=${JSON.stringify(this.menuData)}`
})
},
changeTab(index) {
this.hIndex=index
console.log(this.hIndex)
},
//收藏
async addCollect(){
let param = {
"dishesId":this.dashesData.dishesDetailList[0].dishesId,
"userId":uni.getStorageSync('userId'),
2025-06-10 09:41:35 +08:00
"stallId":this.menuData.stallId
2025-05-27 10:30:44 +08:00
}
const res = await addCollectionDishesAPI(param)
console.log(res)
if(res.code==200){
// this.$modal.msgError("收藏成功")
uni.$u.toast('收藏成功')
this.getMenudishesDetail()
}
},
//取消收藏
async cancelCollect(){
let param = {
"dishesIds":[this.dashesData.dishesDetailList[0].dishesId],
// "userId":uni.getStorageSync('userId'),
}
const res = await delCollectionDishesAPI(param)
console.log(res)
if(res.code==200){
// this.$modal.msgError("收藏成功")
uni.$u.toast('取消收藏成功')
this.getMenudishesDetail()
}
}
// goMenuList(item){
// uni.navigateTo({
// url: `/pages/weeklyMenu/menuList?params=${JSON.stringify(item)}`
// })
// }
}
}
</script>
<style lang="scss" scoped>
page {
display: flex;
flex-direction: column;
box-sizing: border-box;
background-color: #fff;
min-height: 100%;
height: auto;
}
.image-box{
width: 100%;
height: 30vh;
// background-color: #666;
}
.menuContent{
width: 100%;
height: 64vh;
background-color: #fff;
// border-top-right-radius: 20px;
// border-top-left-radius: 20px;
// background-color: #DD7D3C;
// z-index: 999;
// margin-top: -2.5vh;
}
.menuInfo{
width: 94%;
margin: 10rpx auto;
height: auto;
}
.star-icon {
padding: 8px;
}
.tab-navigation {
display: flex;
background-color: white;
padding: 0px 16px 0 16px;
margin-bottom: 10px;
}
.tab-content{
width: 94%;
margin: 10rpx auto;
height: 50vh;
.info-box{
width: 94%;
margin: 10rpx auto;
height: 100%;
}
.nutrition-box{
width: 94%;
margin: 10rpx auto;
height: 100%;
color: #959FA4;
// background-color: #DD7D3C;
display: flex;
justify-content: space-between;
overflow-y: auto;
.nutrition-box-item{
width: 30%;
margin: 0 2%;
height: 100%;
text-align: center;
// background-color: #DD7D3C;
view{
margin-bottom: 10px;
height: 20px;
}
}
}
}
.content-left{
width: 20%;
height: 82vh;
}
.active2 {
color: #DD7D3C;
font-weight: bolder;
font-size: 26rpx;
}
.content-right{
width: 80%;
height: 82vh;
}
.scroll-right-item{
width: 100%;
height: 300rpx;
// background-color: #959FA4;
}
.image {
width: 200rpx;
height: 200rpx;
border-radius: 10rpx;
margin: 20rpx;
}
</style>