feat:增加vant预览图片组件

This commit is contained in:
2026-02-12 19:23:57 +08:00
parent 8940b3972a
commit 2fbae7f80f
7 changed files with 21 additions and 164 deletions

View File

@@ -2,10 +2,7 @@
<div class="life-record-card card-item">
<el-image v-if="props.foodItem?.recordList.length > 0"
:src="AListUrl + props.foodItem?.recordList[0].imageUrl"
:preview-src-list="previewImageList"
:initial-index="0"
show-progress
fit="contain" alt="暂无成果">
fit="contain" alt="暂无成果" @click="viewImageClick">
<template #error>
<div class="image-slot">
<span>暂无图片</span>
@@ -62,12 +59,13 @@
<script setup lang="ts">
import { useFoodStore } from '@/store/food.ts'
import { computed, defineProps, onMounted, PropType, reactive } from 'vue'
import { defineProps, onMounted, PropType, reactive } from 'vue'
import { IFoodRecipe } from '@/types/food.ts'
import { useRouter } from 'vue-router'
import { formatDate } from 'vue3-common/utils/dateUtil'
import { commonElMessageBox } from 'vue3-common/utils/elUtil'
import { AListUrl } from '@/utils'
import { showImagePreview } from 'vant'
const router = useRouter()
const foodStore = useFoodStore()
@@ -88,9 +86,10 @@ onMounted(() => {
foodCardInfo.recommendRate = props.foodItem?.recommendRate as number
})
const previewImageList = computed(() => {
return props.foodItem?.recordList.map((item) => `${AListUrl}${item.imageUrl}`)
})
const viewImageClick = () => {
const imageList = props.foodItem?.recordList.map((item) => `${AListUrl}${item.imageUrl}`)
showImagePreview(imageList)
}
const editFoodRecipeClick = async () => {
const id = props.foodItem?.id

View File

@@ -1,57 +0,0 @@
<template>
<div class="food-daily-list">
<el-date-picker v-model="foodStore.queryRecord.year"
type="year" :editable="false" style="width: 120px;"
@change="foodStore.refreshInfo()"/>
<el-empty v-if="foodDailyInfo.dateList.length === 0"/>
<el-scrollbar>
<food-daily-item v-for="(item, index) in foodDailyInfo.dateList"
:key="index" :date="item"/>
</el-scrollbar>
</div>
</template>
<script setup lang="ts">
import FoodDailyItem from '@/components/Food/FoodDailyItem.vue'
import { reactive, watch } from 'vue'
import { useFoodStore } from '@/store/food.ts'
const foodStore = useFoodStore()
watch(() => foodStore.isRefresh, () => {
updateInfo()
})
const foodDailyInfo = reactive({
dateList: [] as string[]
})
const updateInfo = () => {
const dateList = foodStore.foodRecordList.map((item) => item.date)
foodDailyInfo.dateList = [...new Set(dateList)] as string[]
}
</script>
<style lang="scss">
.food-daily-list {
height: calc(100vh - 120px);
overflow: auto;
display: flex;
flex-direction: column;
gap: 1vh;
.el-date-editor {
align-self: center;
}
.el-scrollbar {
.el-scrollbar__view {
display: flex;
flex-direction: column;
gap: 2vh;
}
}
}
</style>

View File

@@ -1,45 +0,0 @@
<template>
<div class="food-list card-item">
<el-empty v-if="foodStore.foodRecipeList.length === 0" description="暂无美食记录"/>
<div v-else class="list">
<food-card v-for="(item, index) in foodStore.foodRecipeList"
:key="index" :food-item="item"/>
</div>
<el-pagination
v-model:current-page="foodStore.pageInfo.currentPage"
:page-size="foodStore.pageInfo.pageSize"
layout="total, prev, pager, next"
:total="foodStore.pageInfo.totalSize"
@change="changePageEvent"
/>
<el-button v-if="isLargeScreen()"
type="primary" :icon="Plus" circle
@click="addFoodRecipeClick" class="add-new" />
</div>
</template>
<script setup lang="ts">
import { Plus } from '@element-plus/icons-vue'
import FoodCard from '@/components/Food/FoodCard.vue'
import { useFoodStore } from '@/store/food.ts'
import { isLargeScreen } from '@/utils'
const foodStore = useFoodStore()
const addFoodRecipeClick = () => {
foodStore.foodRecipeApiType = 'ADD'
foodStore.foodRecipeDialog = {
title: '新增菜谱',
visible: true,
data: foodStore.getEmptyFoodRecipe()
}
}
const changePageEvent = (value: number) => {
foodStore.pageInfo.currentPage = value
foodStore.queryFoodRecipeList()
}
</script>

View File

@@ -4,17 +4,10 @@
gap: 10px;
.food-list {
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
//align-items: center;
gap: 1vh;
.list {
display: flex;
flex-direction: column;
gap: 10px;
}
}
}

View File

@@ -1,39 +0,0 @@
.food-view {
.food-list {
background-color: #F5F5F5;
flex-grow: 1;
overflow: auto;
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
//align-items: center;
gap: 1vh;
padding: 10px;
.list {
display: grid;
grid-template-columns: repeat(3, 1fr);
column-gap: 2vw;
row-gap: 2vh;
}
@media (min-width: 1280px) and (max-width: 1500px) {
.list {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 1280px) {
.list {
grid-template-columns: repeat(1, 1fr);
}
}
.el-pagination {
align-self: center;
}
}
}

View File

@@ -2,14 +2,12 @@
<div ref="foodRecipeRef" class="mobile-food-view common-mobile-view">
<food-query />
<div class="food-list">
<el-empty v-if="foodStore.foodRecipeList.length === 0" description="暂无美食记录"/>
<div v-else class="list">
<div v-else class="food-list">
<food-card v-for="(item, index) in foodStore.foodRecipeList"
:key="index" :food-item="item"/>
</div>
</div>
<van-floating-bubble icon="plus" @click="addClick" style="top: -60px;"/>

View File

@@ -25,7 +25,8 @@
<div class="timeline-info card-item">
<span>{{ item.name }}</span>
<el-image :src="AListUrl + item.imageUrl"
fit="contain" alt="暂无成果">
fit="contain" alt="暂无成果"
@click="viewImageClick(item)">
<template #error>
<div class="image-slot">
<span>暂无图片</span>
@@ -46,6 +47,8 @@ import { useFoodStore } from '@/store/food.ts'
import { formatDate, getLastDate, getNextDate } from 'vue3-common/utils/dateUtil'
import { AListUrl } from '@/utils'
import { onMounted } from 'vue'
import { showImagePreview } from 'vant'
import { IFoodRecord } from '@/types/food.ts'
const foodStore = useFoodStore()
@@ -54,6 +57,11 @@ onMounted(async () => {
await foodStore.queryFoodRecordList()
})
const viewImageClick = (item: IFoodRecord) => {
const imageList = [AListUrl + item.imageUrl]
showImagePreview(imageList)
}
const changeDateEvent = async (value: Date) => {
foodStore.queryRecord.year = String(value.getFullYear())
await foodStore.queryFoodRecordList()