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

272 lines
6.8 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>
<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>