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

272 lines
6.8 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>
<scroll-view class="scroll-view" scroll-x="true">
<view class="scroll-view-item" v-for="(item,index) in daysList" :key="index" :class="hIndex == index ? 'active' : ''" @click="changeDay(index)">
<view style="width: 100%;display: flex;flex-direction: column;align-items: center;">
<view>{{item.dateValue}}</view>
<view>{{item.weekValue}}</view>
<view class="activeLine" v-if="hIndex == index"></view>
</view>
</view>
</scroll-view>
<view class="tab-navigation">
<Tabs :tabList="tabList" @changeTab="changeTab" />
</view>
<view class="menuContent">
<scroll-view class="content-left" scroll-y="true">
<view class="scroll-view-item" v-for="(item,index) in typeList" :key="index" :class="tIndex == index ? 'active2' : ''" @click="changeModel(item,index)">
<view style="width: 100%;display: flex;flex-direction: column;align-items: center;">
<view>{{item.typeName}}</view>
</view>
</view>
</scroll-view>
<scroll-view class="content-right" scroll-y="true" :scroll-top="scrollLeftTop" scroll-with-animation="true">
<view v-for="(typeitem,typeindex) in typeList" :key="typeindex">
<view :id="'scroll'+typeitem.typeId" style="margin: 20rpx 10rpx;font-weight: bold;font-size: 28rpx;">{{typeitem.typeName}}</view>
<view class="scroll-right-item" v-for="(item,index) in typeitem.dishesList" :key="index" @click="goMenuList(item)">
<view style="width: 100%;display: flex;align-items: center;">
<view style="width: 26%;height: 100%;">
<image class="image" :src="item.dishesImgUrl"></image>
</view>
<view style="width: 70%;height: 100%;padding-left: 20px;">
<view>{{item.dishesDetailList[0].dishesName}}</view>
<view>食堂{{item.canteenName}}</view>
<view>档口{{item.stallName}}</view>
<view>{{(item.dishesDetailList[0].prefPrice/100).toFixed(2)}}</view>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import { getWeekDetailListAPI } from '../../api/week-menu/index'
import Tabs from '@/pages/components/Tabs.vue'
export default {
components: { Tabs },
data() {
return {
fontValue:uni.getStorageSync('fontSize') || 8,
daysList:[],//日期列表
hIndex:0,//日期选中index
stallId:"",
recipeId:"",//菜谱ID
menuData:[],//菜谱列表数据
tabList: [],//菜品类型名称
typeList:[],//菜品类型数据
typeNameList:[],
tIndex:0,
scrollLeftTop:0,//滚动位置
}
},
onLoad(options) {
console.log(options)
options = JSON.parse(options.params)
this.recipeId=options.recipeId;
this.stallId=options.stallId;
this.daysList = this.getRecentWeekDates()
this.getMenuListData()
},
methods: {
getRecentWeekDates() {
let currentDate = new Date(); // 获取当前日期
let weekDates = [];
for (let i = 0; i < 7; i++) {
let day = currentDate.getDate();
let month = currentDate.getMonth() + 1; // 月份是从0开始计数的所以要+1
let year = currentDate.getFullYear();
//日期
let formattedDate = `${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
let formattedDate2 = `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
//周几
var days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
var dayOfWeek = currentDate.getDay();
//对象
let obj = {
"data":formattedDate2,
"dateValue":formattedDate,
"weekValue":days[dayOfWeek]
}
weekDates.push(obj);
currentDate.setDate(currentDate.getDate() + 1); // 获取前一天的日期
}
return weekDates;
},
// 获取菜谱
async getMenuListData() {
let param = {
"recipeId":this.recipeId,
"applyDate":this.daysList[this.hIndex].data,
}
const res = await getWeekDetailListAPI(param)
console.log(res, '周菜谱')
if(res.code==200){
if(res.rows&&res.rows.length>0){
this.menuData = res.rows;
this.tabList=[]
//处理数据
this.menuData.forEach(item=>{//渲染类型
this.tabList.push(item.mealtimeName)
})
this.changeTab(0)
}else{
this.menuData = [];
this.tabList=[];
this.typeList=[]
this.typeNameList=[]
this.tIndex=0
}
}else{
uni.$u.toast(res.msg)
this.menuData = [];
this.tabList=[];
this.typeList=[]
this.typeNameList=[]
this.tIndex=0
}
},
//改变时间
changeDay(index){
this.hIndex=index;
this.getMenuListData()
},
//菜品类型1-早餐 2-午餐 3-下午茶 4-晚餐 5-夜宵)
changeTab(index) {
this.typeList = this.menuData[index].typeList;
//左侧类别列表
this.typeNameList=[]
this.typeList.forEach(item=>{
this.typeNameList.push(item.typeName)
})
//右侧菜列表
this.tIndex=0;
},
//菜品类型(面点,粗粮,精品菜,卤菜...
changeModel(item,index){
this.tIndex=index
var len = 0
if(index==0){
len=0
}else{
this.typeList.forEach((ite,i)=>{
console.log(i)
console.log(index)
if(i<index){
len = len+ite.dishesList.length
}
})
}
setTimeout(()=>{
uni.createSelectorQuery().in(this).select('#scroll'+item.typeId).boundingClientRect(res => {
console.log(res)
this.scrollLeftTop = 80 * len; // 设置滚动条距离左侧的距离
}).exec()
},100)
// this.dishesList = this.typeList[index].dishesList;
},
goMenuList(item){
uni.navigateTo({
url: `/pages/weeklyMenu/menuDetail?params=${JSON.stringify(item)}&stallId=${this.stallId}`
})
}
}
}
</script>
<style lang="scss" scoped>
page {
display: flex;
flex-direction: column;
box-sizing: border-box;
background-color: #fff;
min-height: 100%;
height: auto;
}
.scroll-view {
white-space: nowrap;
width: 100%;
}
.scroll-view-item {
display: inline-block;
width: 160rpx;
height: 100rpx;
// line-height: 100rpx;
text-align: center;
color: #959FA4;
font-size: 24rpx;
.activeLine{
background: #DD7D3C;
border-radius: 10upx;
width: 100rpx;
height: 6upx;
}
}
.active {
color: #DD7D3C;
font-weight: bolder;
font-size: 28rpx;
}
.tab-navigation {
display: flex;
background-color: white;
padding: 0px 16px 0 16px;
}
.menuContent{
width: 100%;
display: flex;
height: 83vh;
// background-color: #DD7D3C;
}
.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: auto;
font-size: 28rpx;
// background-color: #959FA4;
}
.image {
width: 150rpx;
height: 150rpx;
border-radius: 10rpx;
margin: 20rpx;
}
</style>