From d4afc7562a9e2eab52e552834dd7c4c653da6c01 Mon Sep 17 00:00:00 2001 From: zhengyiming <540361168@qq.com> Date: 星期二, 11 二月 2025 18:04:32 +0800 Subject: [PATCH] feat: 任务详情 --- apps/cMiniApp/src/pages/home/index.vue | 198 ++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 168 insertions(+), 30 deletions(-) diff --git a/apps/cMiniApp/src/pages/home/index.vue b/apps/cMiniApp/src/pages/home/index.vue index 18dcab0..d6483eb 100644 --- a/apps/cMiniApp/src/pages/home/index.vue +++ b/apps/cMiniApp/src/pages/home/index.vue @@ -1,31 +1,96 @@ <template> - <PageLayoutWithBg - class="index-page-wrapper" - :title="MatchMakingIdentityEnumTitle[matchMakingIdentity]" - :need-auth="false" - > + <PageLayoutWithBg class="index-page-wrapper" :title="''" :need-auth="false"> <template #left> - <div class="menu-btn-wrapper city-btn" @click="goCitySelect"> - <div class="city-btn-text">{{ locationCity }}</div> - <RectDown :size="12" /> + <div class="menu-btn-wrapper menu-logo"> + <img :src="IconLogo" class="logo" /> </div> </template> - <FrontOrderList v-if="matchMakingIdentity === MatchMakingIdentityEnum.Contributors" /> - <FrontResourceList v-else-if="matchMakingIdentity === MatchMakingIdentityEnum.Employing" /> + <div class="home-header"> + <div class="home-searchbar-wrapper"> + <div class="searchbar-container"> + <BlSearchbar + v-model.trim="searchValue" + placeholder="鎼滅储浠诲姟" + @search="handleSearch" + @change="handleSearch" + ></BlSearchbar> + </div> + <div class="city-btn" @click="goCitySelect"> + <Location2 :size="16" /> + <div class="city-btn-text">{{ locationCity }}</div> + </div> + </div> + <div class="home-banner-wrapper"> + <nut-swiper :auto-play="3000"> + <nut-swiper-item v-for="(item, index) in list" :key="index"> + <img :src="item" class="banner-img" draggable="false" /> + </nut-swiper-item> + </nut-swiper> + </div> + </div> + <ProTabs + v-model="queryState.orderType" + name="home-tab" + :showPaneContent="false" + :showSmile="false" + class="home-tabs" + isTransparent + title-gutter="8" + title-scroll + > + <ProTabPane :title="`鎺ㄨ崘`" :pane-key="HomeOrderType.Recommend"></ProTabPane> + <ProTabPane :title="`鏈�鏂癭" :pane-key="HomeOrderType.LastShelfTime"></ProTabPane> + <template #right> + <Menu> + <MenuItem title="绛涢��" ref="selectItem"> + <HomeQueryMenuView + v-model:gender="queryState.gender" + @close="handleMenuSelectClose" + ></HomeQueryMenuView> + </MenuItem> + </Menu> + </template> + </ProTabs> + <InfiniteLoading + scrollViewClassName="common-infinite-scroll-list home-list" + v-bind="infiniteLoadingProps" + :key="queryState.orderType" + > + <template #renderItem="{ item }"> + <TaskCard @click="goTaskDetail(item)" /> + </template> + </InfiniteLoading> </PageLayoutWithBg> </template> <script setup lang="ts"> -import FrontOrderList from './FrontOrderList.vue'; -import FrontResourceList from './FrontResourceList.vue'; import { useUser } from '@/hooks'; -import { MatchMakingIdentityEnum, MatchMakingIdentityEnumTitle } from '@12333/constants'; import { useUserStore } from '@/stores/modules/user'; -import { RectDown } from '@nutui/icons-vue-taro'; +import { RectDown, Location2 } from '@nutui/icons-vue-taro'; import Taro from '@tarojs/taro'; -import { LocationUtils } from '@12333/utils'; +import { LocationUtils, trim } from '@12333/utils'; +import _ from 'lodash'; +import IconLogo from '@/assets/home/icon-logo.png'; +import { useInfiniteLoading } from '@12333/hooks'; +import { OrderInputType, Gender } from '@12333/constants'; +import * as orderServices from '@12333/services/api/Order'; +import { TaskCard, ProTabs, ProTabPane } from '@12333/components'; +import { HomeOrderType } from './constants'; +import HomeQueryMenuView from './HomeQueryMenuView.vue'; -const { matchMakingIdentity, isSetMatchMakingIdentity, locationCity } = useUser(); +const { locationCity } = useUser(); + +const searchValue = ref(''); + +const queryState = reactive({ + searchValueTrim: '', + orderType: HomeOrderType.Recommend, + gender: '' as any as Gender, +}); + +const handleSearch = _.debounce(function () { + queryState.searchValueTrim = trim(searchValue.value); +}, 300); const userStore = useUserStore(); @@ -34,28 +99,101 @@ url: RouterPath.citySelect, }); } -// onMounted(async () => { -// if (!isSetMatchMakingIdentity.value) { -// Taro.navigateTo({ -// url: RouterPath.toggleMatchMakingIdentity, -// }); -// } -// }); + +const list = ref([ + 'https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg', + 'https://storage.360buyimg.com/jdc-article/NutUItaro2.jpg', + 'https://storage.360buyimg.com/jdc-article/welcomenutui.jpg', + 'https://storage.360buyimg.com/jdc-article/fristfabu.jpg', +]); + +const { infiniteLoadingProps } = useInfiniteLoading( + ({ pageParam }) => { + let params: API.FrontOrderListInput = { + pageModel: { + rows: 20, + page: pageParam, + orderInput: [ + queryState.orderType === HomeOrderType.Recommend + ? { property: 'isRecommend', order: OrderInputType.Desc } + : { property: 'lastShelfTime', order: OrderInputType.Desc }, + ], + }, + }; + + return orderServices.getFrontOrderList(params, { + showLoading: false, + }); + }, + { + queryKey: ['orderServices/getFrontOrderList', queryState], + } +); + +const selectItem = ref(); + +function handleMenuSelectClose() { + selectItem.value?.toggle?.(); +} + +function goTaskDetail(item: API.FrontOrderList) { + Taro.navigateTo({ + url: `${RouterPath.taskDetail}?id=${item.id}`, + }); +} </script> <style lang="scss"> @import '@/styles/common.scss'; .index-page-wrapper { - .city-btn { - display: flex; - align-items: center; + .menu-logo { + padding: 0; - .city-btn-text { - max-width: 200px; - @include ellipsis; - margin-right: 12px; + .logo { + width: 96px; + height: 64px; } } + + .home-searchbar-wrapper { + padding: 32px 0; + display: flex; + + .searchbar-container { + flex: 1; + min-width: 0; + } + + .city-btn { + display: flex; + align-items: center; + padding-left: 36px; + color: boleGetCssVar('text-color', 'primary'); + + .city-btn-text { + max-width: 200px; + @include ellipsis; + margin-left: 12px; + font-size: 30px; + } + } + } + + .home-banner-wrapper { + .banner-img { + width: 100%; + height: 260px; + object-fit: cover; + } + } + + .home-header { + padding: 0 boleGetCssVar('size', 'body-padding-h'); + } +} + +.home-list { + @include infiniteLoadingInTabBarPage; } </style> -- Gitblit v1.9.1