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