1
This commit is contained in:
1 parent
e6acab2fea
commit
01aca6f3ee
1 file changed
+58
-21
@@ -1,7 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout-padding">
|
<div class="layout-padding">
|
||||||
<div class="layout-padding-view">
|
<div class="layout-padding-view">
|
||||||
<div ref="containerRef" class="relative h-full w-full overflow-y-auto bg-gradient-to-br from-[#232e55] to-[#040a1b] p-2">
|
<div
|
||||||
|
ref="containerRef"
|
||||||
|
class="relative h-full w-full overflow-y-scroll scrollbar-hidden bg-gradient-to-br from-[#232e55] to-[#040a1b] py-2"
|
||||||
|
>
|
||||||
<!-- 背景圆点 -->
|
<!-- 背景圆点 -->
|
||||||
<div class="pointer-events-none absolute inset-0 pattern-dots opacity-[0.08]"></div>
|
<div class="pointer-events-none absolute inset-0 pattern-dots opacity-[0.08]"></div>
|
||||||
|
|
||||||
@@ -36,27 +39,21 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 菜品展示区域 -->
|
<!-- 菜品展示区域 -->
|
||||||
<div class="w-full">
|
<div class="w-full flex flex-wrap items-center" v-for="(hourType, index) in foodData" :key="index">
|
||||||
<div class="w-full flex flex-wrap items-center justify-center" v-for="(hourType, index) in foodData" :key="index">
|
<div v-for="dish in hourType" :key="dish.id" class="p-2" :style="cardStyle">
|
||||||
<div v-for="dish in hourType" :key="dish.id" class="w-60 p-2">
|
<div class="relative overflow-hidden rounded-tl rounded-tr" :style="foodCardStyle">
|
||||||
<div class="relative h-32 overflow-hidden">
|
<img :src="imageBaseUrl + dish.picUrl" :alt="dish.name" class="h-full w-full object-cover" />
|
||||||
<img :src="imageBaseUrl + dish.picUrl" :alt="dish.name" class="h-full w-full object-cover" />
|
<div class="ribbon">午餐</div>
|
||||||
<div class="absolute left-1 top-1">
|
<div class="absolute left-1 top-1">
|
||||||
<star-medal text="午餐" />
|
<star-medal :text="canteenCategoryOption?.find((v: any) => v.id == dish.categoryId)?.name" />
|
||||||
</div>
|
|
||||||
<div class="absolute left-1 top-1">
|
|
||||||
<star-medal :text="canteenCategoryOption?.find((v: any) => v.id == dish.categoryId)?.name" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="w-full flex items-center justify-between bg-[#AEBBF9]/40 px-2 pb-4 backdrop-blur-sm rounded-bl-[50%] rounded-br-[50%]"
|
|
||||||
>
|
|
||||||
<h3 class="text-2xl font-bold text-[#8ab4ff] drop-shadow-lg line-clamp-1 whitespace-nowrap">
|
|
||||||
{{ dish.name }}
|
|
||||||
</h3>
|
|
||||||
<p class="text-3xl font-bold text-[#4a88ff] drop-shadow-lg whitespace-nowrap">¥{{ displayPrice(dish.price) }}</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="w-full flex items-center justify-between bg-[#AEBBF9]/40 px-2 py-2 backdrop-blur-sm rounded-bl rounded-br">
|
||||||
|
<h3 class="text-2xl font-bold text-[#7cacff] drop-shadow-lg line-clamp-1 whitespace-nowrap">
|
||||||
|
{{ dish.name }}
|
||||||
|
</h3>
|
||||||
|
<p class="text-3xl font-bold text-[#a9c7ff] drop-shadow-lg whitespace-nowrap">¥{{ displayPrice(dish.price) }}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -65,7 +62,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted, onUnmounted } from "vue"
|
import { ref, onMounted, onUnmounted, computed } from "vue"
|
||||||
import { selectTimeFoodApi } from "/@/api/canteen/canteenDailyMenu"
|
import { selectTimeFoodApi } from "/@/api/canteen/canteenDailyMenu"
|
||||||
import { getAllSimple as getCanteenCategory } from "/@/api/canteen/canteenCategory"
|
import { getAllSimple as getCanteenCategory } from "/@/api/canteen/canteenCategory"
|
||||||
import { displayPrice } from "/@/utils/formatMoney"
|
import { displayPrice } from "/@/utils/formatMoney"
|
||||||
@@ -79,6 +76,7 @@ const currentDate = ref(dayjs().format("YYYY/MM/DD"))
|
|||||||
const currentTime = ref(dayjs().format("HH:mm:ss"))
|
const currentTime = ref(dayjs().format("HH:mm:ss"))
|
||||||
const isFullscreen = ref(false)
|
const isFullscreen = ref(false)
|
||||||
const imageBaseUrl = import.meta.env.VITE_IMAGE_BASE_PATH
|
const imageBaseUrl = import.meta.env.VITE_IMAGE_BASE_PATH
|
||||||
|
const clientWidth = ref<number>(0)
|
||||||
|
|
||||||
interface FoodItem {
|
interface FoodItem {
|
||||||
categoryId: string
|
categoryId: string
|
||||||
@@ -105,6 +103,8 @@ onMounted(async () => {
|
|||||||
timer = setInterval(() => (currentTime.value = dayjs().format("HH:mm:ss")), 1000)
|
timer = setInterval(() => (currentTime.value = dayjs().format("HH:mm:ss")), 1000)
|
||||||
await getDishByType()
|
await getDishByType()
|
||||||
await getCanteenDishesCategory()
|
await getCanteenDishesCategory()
|
||||||
|
await nextTick()
|
||||||
|
clientWidth.value = containerRef.value?.clientWidth || 0
|
||||||
|
|
||||||
// 监听全屏变化事件
|
// 监听全屏变化事件
|
||||||
const handleFullscreenChange = () => {
|
const handleFullscreenChange = () => {
|
||||||
@@ -114,6 +114,7 @@ onMounted(async () => {
|
|||||||
(document as any).mozFullScreenElement ||
|
(document as any).mozFullScreenElement ||
|
||||||
(document as any).msFullscreenElement
|
(document as any).msFullscreenElement
|
||||||
)
|
)
|
||||||
|
clientWidth.value = containerRef.value?.clientWidth || 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// 全屏api兼容性
|
// 全屏api兼容性
|
||||||
@@ -130,6 +131,19 @@ onMounted(async () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const cardStyle = computed(() => {
|
||||||
|
const width = clientWidth.value / 5
|
||||||
|
return {
|
||||||
|
width: `${width}px`,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const foodCardStyle = computed(() => {
|
||||||
|
const width = clientWidth.value / 5
|
||||||
|
return {
|
||||||
|
height: `${(width * 9) / 16}px`,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// 全屏切换
|
// 全屏切换
|
||||||
const toggleFullScreen = async () => {
|
const toggleFullScreen = async () => {
|
||||||
const element = containerRef.value
|
const element = containerRef.value
|
||||||
@@ -210,4 +224,27 @@ const getCanteenDishesCategory = async () => {
|
|||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
}
|
}
|
||||||
|
.scrollbar-hidden::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.scrollbar-hidden {
|
||||||
|
scrollbar-width: none;
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
}
|
||||||
|
::selection {
|
||||||
|
background: #1879ff;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.ribbon {
|
||||||
|
width: 80px;
|
||||||
|
height: 20px;
|
||||||
|
background: #1879ff99;
|
||||||
|
position: absolute;
|
||||||
|
right: -20px;
|
||||||
|
top: 10px;
|
||||||
|
transform: rotateZ(45deg);
|
||||||
|
text-align: center;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 24rpx;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
Reference in new issue
Block a user