diff --git a/src/locale/en.json b/src/locale/en.json index b481b8e..ea2b2b3 100644 --- a/src/locale/en.json +++ b/src/locale/en.json @@ -241,7 +241,8 @@ "mustEatList": "CHEFLINK Must-Eat", "newCalendar": "New Arrival Calendar", "newCalendarNav": "Today's New", - "freshSeafoodToday": "Fresh Seafood Today" + "freshSeafoodToday": "Fresh Seafood Today", + "energyMeal": "Energy Meals" }, "mustEatListTabs": { "merchant": "Merchant Rank", @@ -589,6 +590,12 @@ "voucherUploadFailed": "Upload failed, please try again", "pleaseBindCreditCard": "No bank card linked. Please add a card before paying." }, + "energyMeal": { + "title": "Energy Meals", + "addAllToCart": "Add all to cart", + "empty": "No energy meals yet", + "unavailable": "This bundle is unavailable" + }, "store": { "addToCart": "Add to cart", "appetizers": "Appetizers", diff --git a/src/locale/zh-Hans.json b/src/locale/zh-Hans.json index 91b8363..f845d35 100644 --- a/src/locale/zh-Hans.json +++ b/src/locale/zh-Hans.json @@ -241,7 +241,8 @@ "mustEatList": "CHEFLINK必吃榜", "newCalendar": "上新日历", "newCalendarNav": "今日上新", - "freshSeafoodToday": "今日现打海鲜" + "freshSeafoodToday": "今日现打海鲜", + "energyMeal": "能量餐" }, "mustEatListTabs": { "merchant": "商家榜单", @@ -589,6 +590,12 @@ "voucherUploadFailed": "上传失败,请重试", "pleaseBindCreditCard": "未绑定银行卡,请先绑定后再支付" }, + "energyMeal": { + "title": "能量餐", + "addAllToCart": "一键加入购物车", + "empty": "暂无能量餐", + "unavailable": "套餐暂不可购买" + }, "store": { "addToCart": "加入购物车", "appetizers": "开胃菜", diff --git a/src/manifest.json b/src/manifest.json index f352b99..874148c 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,8 +2,8 @@ "name" : "CHEFLINK delivery", "appid" : "__UNI__06509BE", "description" : "", - "versionName" : "3.2.4", - "versionCode" : 324, + "versionName" : "3.2.5", + "versionCode" : 325, "transformPx" : false, /* 5+App特有相关 */ "app-plus" : { diff --git a/src/pages-store/pages/dishes/utils/featured-dish-query.ts b/src/pages-store/pages/dishes/utils/featured-dish-query.ts index a58eb1e..bfc7cc0 100644 --- a/src/pages-store/pages/dishes/utils/featured-dish-query.ts +++ b/src/pages-store/pages/dishes/utils/featured-dish-query.ts @@ -13,8 +13,10 @@ export type FeaturedDishQueryBody = { /** 运营入口固定参数(精选菜品列表 operationalEntry) */ export const OPERATIONAL_ENTRY = { + FEATURED: 'featured', FRESH_SEAFOOD_TODAY: 'fresh-seafood-today', LIMITED_AIR_SEAFOOD: 'limited-air-seafood', + NEW_DISH_CALENDAR: 'new-dish-calendar', } as const export type RouteQueryMap = Record @@ -63,41 +65,10 @@ export function buildMustEatListQuery(routeQuery?: RouteQueryMap): FeaturedDishQ return mergeRouteQueryIntoBody({ salesSort: 'desc' }, routeQuery) } -/** 当天 00:00:00 ~ 23:59:59(本地时区,10 位秒级时间戳) */ -export function getTodayCreateTimeRange(): { createBeginTime: number; createEndTime: number } { - const now = new Date() - const createBeginTime = Math.floor( - new Date( - now.getFullYear(), - now.getMonth(), - now.getDate(), - 0, - 0, - 0, - 0, - ).getTime() / 1000, - ) - const createEndTime = Math.floor( - new Date( - now.getFullYear(), - now.getMonth(), - now.getDate(), - 23, - 59, - 59, - 0, - ).getTime() / 1000, - ) - return { createBeginTime, createEndTime } -} - -/** 上新日历:当天创建 + 新品(isNew = 1) */ +/** 今日上新/上新日历:运营入口 new-dish-calendar(全量新品,按上架时间倒序) */ export function buildNewCalendarQuery(routeQuery?: RouteQueryMap): FeaturedDishQueryBody { return mergeRouteQueryIntoBody( - { - ...getTodayCreateTimeRange(), - isNew: 1, - }, + { operationalEntry: OPERATIONAL_ENTRY.NEW_DISH_CALENDAR }, routeQuery, ) } diff --git a/src/pages-store/pages/dishes/utils/quick-topic-route.ts b/src/pages-store/pages/dishes/utils/quick-topic-route.ts index 304ea29..4007f69 100644 --- a/src/pages-store/pages/dishes/utils/quick-topic-route.ts +++ b/src/pages-store/pages/dishes/utils/quick-topic-route.ts @@ -32,6 +32,7 @@ export function resolveQuickTopicFromMerchantCategory( /** 快捷入口 topic 与 operationalEntry 固定映射 */ export const TOPIC_OPERATIONAL_ENTRY: Partial> = { 'live-seafood-air': 'limited-air-seafood', + 'new-calendar': 'new-dish-calendar', 'fresh-seafood-today': 'fresh-seafood-today', } diff --git a/src/pages-store/pages/energy-meal/components/energy-meal-skeleton.vue b/src/pages-store/pages/energy-meal/components/energy-meal-skeleton.vue new file mode 100644 index 0000000..8d8507d --- /dev/null +++ b/src/pages-store/pages/energy-meal/components/energy-meal-skeleton.vue @@ -0,0 +1,139 @@ + + + diff --git a/src/pages-store/pages/energy-meal/index.vue b/src/pages-store/pages/energy-meal/index.vue new file mode 100644 index 0000000..22d68f6 --- /dev/null +++ b/src/pages-store/pages/energy-meal/index.vue @@ -0,0 +1,436 @@ + + + + + diff --git a/src/pages.json b/src/pages.json index 5fd319d..d638172 100644 --- a/src/pages.json +++ b/src/pages.json @@ -284,6 +284,12 @@ }, { "path": "pages/home-store/index" + }, + { + "path": "pages/energy-meal/index", + "style": { + "onReachBottomDistance": 80 + } } ] } diff --git a/src/pages/home/components/tabbar-home/components/tabs-type.vue b/src/pages/home/components/tabbar-home/components/tabs-type.vue index 2f9ddf8..56eb001 100644 --- a/src/pages/home/components/tabbar-home/components/tabs-type.vue +++ b/src/pages/home/components/tabbar-home/components/tabs-type.vue @@ -3,7 +3,7 @@ import { computed } from 'vue' import { useI18n } from 'vue-i18n' const props = defineProps({ - /** 外部列表(菜谱页等);首页不传则使用固定五项 */ + /** 外部列表(菜谱页等);首页不传则使用固定六项 */ list: { type: Array, default: () => [], @@ -55,6 +55,11 @@ const fixedTabs = [ nameKey: 'pages.home.quickTabs.freshSeafoodToday', logoUrl: '/static/app/images/home/xiandahaixian.png', }, + { + id: 'energy-meal', + nameKey: 'pages.home.quickTabs.energyMeal', + logoUrl: '/static/app/images/home/nengliangcan.png', + }, ] const useFixedTabs = computed(() => !props.list || props.list.length === 0) @@ -63,10 +68,6 @@ function selectTab(item: Record) { emit('changeType', item[props.valueKey]) } -function imageWidthByIndex(index: number) { - return (index + 1) % 2 === 1 ? '104rpx' : '210rpx' -} - function getTabName(item: Record) { if (useFixedTabs.value && item.nameKey) { return t(String(item.nameKey)) @@ -97,8 +98,7 @@ const displayList = computed(() => {{ getTabName(item as Record) }} @@ -122,7 +122,6 @@ const displayList = computed(() => .tab-img { height: 144rpx; - width: auto; display: block; margin-bottom: 10rpx; } diff --git a/src/pages/home/components/tabbar-home/tabbar-home.vue b/src/pages/home/components/tabbar-home/tabbar-home.vue index da17a5b..efee085 100644 --- a/src/pages/home/components/tabbar-home/tabbar-home.vue +++ b/src/pages/home/components/tabbar-home/tabbar-home.vue @@ -236,6 +236,10 @@ function handleItemClick(e) { } function tabsTypeChange(id: string | number) { const topic = String(id) + if (topic === 'energy-meal') { + navigateTo('/pages-store/pages/energy-meal/index') + return + } if (!isQuickTopicSlug(topic)) { return } @@ -310,6 +314,9 @@ function handleClickSwiper(item: any) { case 3: // 会员 navigateTo('/pages-user/pages/member/index') break + case 5: // 钱包 + navigateTo('/pages-user/pages/balance/index') + break // case 4: // navigateTo('/pages/ai/chat/index') // break diff --git a/src/service/energyMeal.ts b/src/service/energyMeal.ts new file mode 100644 index 0000000..01475d0 --- /dev/null +++ b/src/service/energyMeal.ts @@ -0,0 +1,86 @@ +/* eslint-disable */ +// @ts-ignore +import request from '@/http/vue-query'; +import type { CustomRequestOptions } from '@/http/types'; + +export interface EnergyMealListQueryBo { + merchantId?: number | string; + mealName?: string; + merchantName?: string; +} + +export interface EnergyMealItemVo { + id?: number | string; + energyMealId?: number | string; + dishId?: number | string; + quantity?: number; + sort?: number; + delFlag?: number; + merchantDishVo?: Record; +} + +export interface EnergyMealVo { + id?: number | string; + merchantId?: number | string; + mealName?: string; + coverImage?: string; + sort?: number; + delFlag?: number; + remark?: string; + merchant?: { + id?: number | string; + merchantName?: string; + logo?: string; + merchantAddress?: string; + }; + itemList?: EnergyMealItemVo[]; +} + +export interface EnergyMealAddCartBo { + energyMealId: number | string; + count?: number; +} + +/** 能量餐分页列表 POST /app/energyMeal/list */ +export async function appEnergyMealListPost({ + params, + body, + options, +}: { + params: { pageNum: number; pageSize: number }; + body?: EnergyMealListQueryBo; + options?: CustomRequestOptions; +}) { + return request<{ rows?: EnergyMealVo[]; total?: number }>( + '/app/energyMeal/list', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + params: { + ...params, + }, + data: body ?? {}, + ...(options || {}), + } + ); +} + +/** 能量餐一键加入购物车 POST /app/energyMeal/addCart */ +export async function appEnergyMealAddCartPost({ + body, + options, +}: { + body: EnergyMealAddCartBo; + options?: CustomRequestOptions; +}) { + return request<{ data?: number[] }>('/app/energyMeal/addCart', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/src/service/index.ts b/src/service/index.ts index f98aed0..91e7371 100644 --- a/src/service/index.ts +++ b/src/service/index.ts @@ -44,3 +44,4 @@ export * from './automaticCookingMachine'; export * from './userCoupon'; export * from './marketingActivity'; export * from './marketActivity'; +export * from './energyMeal'; diff --git a/src/static/app/images/home/nengliangcan.png b/src/static/app/images/home/nengliangcan.png new file mode 100644 index 0000000..e650ded Binary files /dev/null and b/src/static/app/images/home/nengliangcan.png differ