xiaokuaisong-xiaochengxu/uniapp04/pages/merchant/sort.vue

406 lines
8.2 KiB
Vue
Raw Normal View History

2024-10-18 07:53:00 +00:00
<script setup>
import {
onMounted,
ref,
defineEmits,
onBeforeMount,
onBeforeUnmount
} from 'vue'
import merchantVue from './merchant.vue';
import {
watch
} from 'vue';
import {
apiImageUrl
} from '../../API/api'
const resultArray = ref([]);
const orderTabs = ref([{
orderState: 0,
url: '/pages/sort/sort',
title: '点餐'
},
{
orderState: 1,
url: '/pages/evaluate/evaluate',
title: '评价'
},
{
orderState: 2,
url: '/pages/details/details',
title: '商家'
},
])
const currentIndex = ref(0);
const tabs = ref([]);
//1234265296552582582
const businessId = ref('');
const merchantId = ref(props.merchantId)
const props = defineProps({
merchantId: {
type: String,
required: true
}
});
watch(() => props.merchantId, async (newVal) => {
console.log('传过来的商家id', newVal);
businessId.value = newVal;
await leftGroup();
await rightList();
});
onMounted(() => {});
const leftGroup = async () => {
try {
console.log(businessId.value);
const res = await uni.request({
url: apiImageUrl + '/api/dishesGroup/list/dishesGroup',
method: 'POST',
data: {
businessId: businessId.value
},
});
if (res.data.code === 0) {
console.log(res.data.data);
const length = res.data.data.length;
for (let i = 0; i < length; i++) {
const index = i + 1;
const groupName = res.data.data[i].groupName;
resultArray.value.push(groupName);
}
console.log(resultArray.value);
}
} catch (error) {
console.log('error', error);
}
};
const rightList = async () => {
try {
const res = await uni.request({
url: apiImageUrl + '/api/dishes/list/dishes',
method: 'POST',
data: {
businessId: businessId.value
},
});
if (res.data.code === 0) {
const filteredData = res.data.data.filter(item => item.status !== '1');
historyList.value = filteredData;
console.log('更新后的菜品列表:', historyList.value);
} else {
console.error('请求失败:', res.data.message);
}
} catch (error) {
console.error('Error fetching data:', error);
}
};
const contentArea = ref(null);
const switchTab = async (index) => {
currentIndex.value = index;
const updatedDishesQueryRequest = {
businessId: businessId.value,
dishesGroupId: index + 1,
};
try {
const res = await uni.request({
url: apiImageUrl + '/api/dishes/list/dishesVO',
method: 'POST',
data: JSON.stringify(updatedDishesQueryRequest),
});
if (res.data.code === 0) {
const filteredData = res.data.data.filter(item => item.status !== '1');
historyList.value = filteredData;
} else {
console.error('请求失败:', res.data.message);
}
} catch (error) {
console.error('Error fetching data:', error);
}
uni.scrollIntoView({
id: 'contentArea',
duration: 300,
});
};
const historyList = ref()
// 口味的数组
//const flavors = ref(['麻辣', '微辣', '酸甜', '清淡']);
/* const showFlavorOptions = () => {
uni.showActionSheet({
itemList: flavors.value,
success: (res) => {
console.log('选择的口味:', flavors.value[res.tapIndex]);
},
fail: () => {
console.log('取消选择');
}
});
}; */
const emit = defineEmits(['update-cart'])
const cartItems = ref([]);
const addToCart = (item) => {
cartItems.value.push({
...item,
quantity: 1
});
uni.setStorageSync('cartItems', (cartItems.value));
cartItems.value.forEach(item => {
console.log(item.dishesName);
});
emit('update-cart', cartItems.value);
};
</script>
<template>
<view class="viewport">
<view class="categories">
<scroll-view class="primary" scroll-y>
<view class="item" v-for="(tab, index) in resultArray" :key="index"
:class="{ active: currentIndex === index }" @click="switchTab(index)">
{{ tab }}
</view>
</scroll-view>
<scroll-view class="secondary" scroll-y>
<block v-if="currentIndex === 0">
</block>
<view class="panel">
<view class="container">
<view class="history-list">
<view class="history-item" v-for="(item, index) in historyList" :key="index">
<image class="history-img" :src="item.dishesImage"></image>
<view class="history-info">
<text class="history-title">{{ item.dishesName }}</text>
<text class="history-description">玉米蘑菇</text>
<text class="history-time">月售234</text>
<text class="history-money">{{ item.dishesPrice }}</text>
</view>
<view class="icon plus-animated" @click="() => addToCart(item)">
<uni-icons type="plus-filled" size="30" color="#4095e5"></uni-icons>
</view>
<!-- 模态框 -->
<!-- <view v-if="isModalVisible" class="modal-mask">
<view class="modal-dialog">
<view class="modal-content">
<view class="modal-header">
请选择口味
</view>
<view class="modal-body">
<picker mode="selector" :range="flavors" range-key="name" @change="handleFlavorChange">
<view class="picker">
{{ selectedFlavor.value.name }}
</view>
</picker>
</view>
<view class="modal-footer">
<button type="primary" @tap="addToCart">加入购物车</button>
</view>
</view>
</view>
</view> -->
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<style lang="scss">
page {
height: 100%;
overflow: hidden;
}
.viewport {
height: 100%;
display: flex;
flex-direction: column;
}
.search {
padding: 0 30rpx 20rpx;
background-color: #fff;
.input {
display: flex;
align-items: center;
justify-content: space-between;
height: 64rpx;
padding-left: 26rpx;
color: #8b8b8b;
font-size: 28rpx;
border-radius: 32rpx;
background-color: #f3f4f4;
}
}
.icon-search {
&::before {
margin-right: 10rpx;
}
}
.primary {
overflow: hidden;
width: 180rpx;
flex: none;
background-color: #f6f6f6;
.item {
display: flex;
justify-content: center;
align-items: center;
height: 96rpx;
font-size: 26rpx;
color: #595c63;
position: relative;
&::after {
content: '';
position: absolute;
left: 42rpx;
bottom: 0;
width: 96rpx;
border-top: 1rpx solid #e3e4e7;
}
}
.active {
background-color: #fff;
&::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 8rpx;
height: 100%;
background-color: #4095e5;
}
}
}
.primary .item:last-child::after,
.primary .active::after {
display: none;
}
.secondary {
background-color: #fff;
width: 100%;
.carousel {
height: 400rpx;
margin: 0 30rpx 20rpx;
border-radius: 4rpx;
overflow: hidden;
}
.panel {
margin: 0 30rpx 0rpx;
}
.container {
display: flex;
flex-direction: column;
align-items: center;
padding: 20rpx;
}
.history-list {
width: 100%;
}
.history-item {
display: flex;
margin-bottom: 20rpx;
flex-direction: row;
}
.history-img {
width: 200rpx;
height: 150rpx;
margin-right: 20rpx;
border-radius: 10px;
}
.history-info {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 100px;
}
.history-title {
font-size: 32rpx;
font-weight: bold;
}
.history-description {
font-size: 28rpx;
}
.history-time {
font-size: 20rpx;
color: #999;
}
.history-money {
font-size: 30rpx;
color: black;
font-weight: 700;
}
}
.icon {
margin-top: 30rpx;
}
@keyframes plus-slide-down {
0% {
transform: translateY(0);
}
50% {
transform: translateY(10px);
}
100% {
transform: translateY(0);
}
}
.plus-animated {
animation-name: plus-slide-down;
animation-duration: 0.5s;
animation-timing-function: ease-in-out;
animation-iteration-count: 1;
animation-fill-mode: forwards;
}
</style>