feat:更新UI

This commit is contained in:
2025-06-30 20:04:02 +08:00
parent 0346586548
commit 50991bb49a
3 changed files with 80 additions and 41 deletions

View File

@@ -21,9 +21,6 @@ const foodStore = useFoodStore()
const appStore = useAppStore() const appStore = useAppStore()
onMounted(async () => { onMounted(async () => {
foodStore.queryDateType = 'month'
await foodStore.refreshInfo()
const { month } = foodStore.queryRecord const { month } = foodStore.queryRecord
calendarRef.value.move(new Date(month)) calendarRef.value.move(new Date(month))
}) })

View File

@@ -1,16 +1,27 @@
<template> <template>
<div class="food-timeline"> <div class="food-timeline">
<div class="button-container">
<el-button :icon="CaretLeft" circle
type="primary" size="small"
@click="previousYearClick"/>
<el-date-picker <el-date-picker
v-model="currentYear" v-model="foodStore.queryRecord.year"
type="year" placeholder="请选择年份" type="year" placeholder="请选择年份"
:editable="false" :editable="false"
style="width: 100px;" style="width: 100px;"
@change="changeDateEvent" @change="changeDateEvent"
/> />
<el-button :icon="CaretRight" circle
type="primary" size="small"
@click="nextYearClick"/>
</div>
<el-timeline v-if="foodStore.recordList.length > 0"> <el-timeline v-if="foodStore.recordList.length > 0">
<el-timeline-item v-for="(item, index) in foodStore.recordList" <el-timeline-item v-for="(item, index) in foodStore.recordList"
:key="index" :timestamp="formatDate(item.date)" placement="top"> :key="index" :timestamp="formatDate(item.date)"
placement="top" color='var(--el-color-primary)'>
<div class="timeline-info card-item"> <div class="timeline-info card-item">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
<el-image :src="serviceFileRootPath + item.imageUrl" <el-image :src="serviceFileRootPath + item.imageUrl"
@@ -30,23 +41,32 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { CaretLeft, CaretRight } from '@element-plus/icons-vue'
import { useFoodStore } from '@/store/food.ts' import { useFoodStore } from '@/store/food.ts'
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { formatDate } from 'vue3-common/utils/dateUtil' import { formatDate, getLastDate, getNextDate } from 'vue3-common/utils/dateUtil'
import { serviceFileRootPath } from '@/utils' import { serviceFileRootPath } from '@/utils'
const currentYear = ref(new Date()) const currentYear = ref(new Date())
const foodStore = useFoodStore() const foodStore = useFoodStore()
onMounted(async () => {
foodStore.queryDateType = 'year'
await foodStore.refreshInfo()
})
const changeDateEvent = async (value: Date) => { const changeDateEvent = async (value: Date) => {
foodStore.queryRecord.year = String(value.getFullYear()) foodStore.queryRecord.year = String(value.getFullYear())
await foodStore.refreshInfo() await foodStore.refreshInfo()
} }
const previousYearClick = async () => {
const lastYear = getLastDate(foodStore.queryRecord.year, 1, 'years')
foodStore.queryRecord.year = String(new Date(lastYear).getFullYear())
await foodStore.refreshInfo()
}
const nextYearClick = async () => {
const lastYear = getNextDate(foodStore.queryRecord.year, 1, 'years')
foodStore.queryRecord.year = String(new Date(lastYear).getFullYear())
await foodStore.refreshInfo()
}
</script> </script>
<style lang="scss"> <style lang="scss">
@@ -54,13 +74,21 @@ const changeDateEvent = async (value: Date) => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.el-date-editor { .button-container {
align-self: center; align-self: center;
display: flex;
align-items: center;
gap: 10px;
} }
.el-timeline { .el-timeline {
padding: 10px; padding: 10px;
.el-timeline-item__timestamp {
font-weight: bold;
color: #000000;
}
.timeline-info { .timeline-info {
padding: 10px; padding: 10px;
display: flex; display: flex;

View File

@@ -1,32 +1,28 @@
<template> <template>
<div class="common-mobile-view food-record"> <div class="common-mobile-view food-record">
<div class="food-segment card-item"> <div class="food-query">
<el-input <el-input
v-model="foodInfo.query" v-model="foodInfo.query"
placeholder="请输入菜谱名称" :prefix-icon="Search" clearable placeholder="搜索菜友食谱" :prefix-icon="Search" clearable
:maxlength="20" show-word-limit :maxlength="20" show-word-limit
/> />
<div class="query-item">
<span>查看类型</span>
<el-segmented v-model="foodStore.recordSegment"
:options="recordSegmentList"/>
</div>
</div> </div>
<hr style="width: 100%;"/> <hr style="width: 100%;"/>
<div v-if="foodStore.recordSegment === 'recipe'" class="food-calendar"> <el-tabs v-model="foodStore.recordSegment"
stretch class="record-tabs"
@tab-click="handleClick">
<el-tab-pane label="菜谱" name="recipe">
<food-recipe /> <food-recipe />
</div> </el-tab-pane>
<el-tab-pane label="日历" name="daily">
<div v-if="foodStore.recordSegment === 'daily'" class="food-calendar">
<food-daily /> <food-daily />
</div> </el-tab-pane>
<el-tab-pane label="时间轴" name="timeline">
<div v-if="foodStore.recordSegment === 'timeline'" class="food-calendar">
<food-timeline /> <food-timeline />
</div> </el-tab-pane>
</el-tabs>
</div> </div>
</template> </template>
@@ -37,6 +33,7 @@ import FoodTimeline from '@/components/Food/FoodTimeline.vue'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import { reactive } from 'vue' import { reactive } from 'vue'
import { useFoodStore } from '@/store/food' import { useFoodStore } from '@/store/food'
import { TabsPaneContext } from 'element-plus'
const foodStore = useFoodStore() const foodStore = useFoodStore()
@@ -56,6 +53,23 @@ const recordSegmentList = [{
label: '时间轴', label: '时间轴',
value: 'timeline' value: 'timeline'
}] }]
const handleClick = async (tab: TabsPaneContext, event: Event) => {
switch (tab.paneName) {
case 'recipe':
break
case 'daily':
foodStore.queryDateType = 'month'
await foodStore.refreshInfo()
break
case 'timeline':
foodStore.queryDateType = 'year'
await foodStore.refreshInfo()
break
default:
break
}
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@@ -64,11 +78,11 @@ const recordSegmentList = [{
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
.food-segment { .food-query {
padding: 5px 10px; }
display: flex;
flex-direction: column; .record-tabs {
gap: 10px;
} }
} }
</style> </style>