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 |  187 +++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 167 insertions(+), 20 deletions(-)

diff --git a/apps/cMiniApp/src/pages/home/index.vue b/apps/cMiniApp/src/pages/home/index.vue
index e3d38b0..d6483eb 100644
--- a/apps/cMiniApp/src/pages/home/index.vue
+++ b/apps/cMiniApp/src/pages/home/index.vue
@@ -1,22 +1,96 @@
 <template>
-  <PageLayoutWithBg class="index-page-wrapper" :title="'棣栭〉'" :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>
+    <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 { useUser } from '@/hooks';
 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 { 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();
 
@@ -25,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