From 61556a945a1a90e1c97bb2f7e1f990cd09de4318 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期二, 11 二月 2025 18:10:11 +0800
Subject: [PATCH] Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp

---
 apps/cMiniApp/src/components/Menu/Menu.vue                         |    8 
 apps/cMiniApp/src/pages/home/index.vue                             |   48 +++-
 apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.scss      |  119 +++++++++++
 packages/components/src/Card/TaskPrice.vue                         |    3 
 apps/cMiniApp/src/assets/task/icon-attention.png                   |    0 
 apps/cMiniApp/src/assets/task/icon-attention-active.png            |    0 
 apps/cMiniApp/src/components/Menu/menu.scss                        |    8 
 apps/cMiniApp/src/components/Chunk/Cell.vue                        |   10 
 packages/components/src/Card/TaskCard.vue                          |    6 
 packages/components/src/Tabs/tabs.ts                               |    4 
 apps/cMiniApp/src/assets/task/icon-share.png                       |    0 
 packages/components/src/index.ts                                   |    4 
 apps/cMiniApp/src/constants/router.ts                              |    4 
 apps/cMiniApp/src/app.config.ts                                    |    4 
 apps/bMiniApp/src/components/Menu/menu.scss                        |    4 
 apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue                 |   44 ++++
 apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.config.ts |    3 
 packages/components/src/Menu/QueryMenuItem.vue                     |   39 +++
 packages/components/src/Menu/QueryMenuView.vue                     |   47 ++++
 packages/components/src/Form/ProRadio.vue                          |   54 +++++
 apps/cMiniApp/project.private.config.json                          |    7 
 apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue        |  101 ++++++++++
 apps/cMiniApp/src/assets/task/icon-safe.png                        |    0 
 apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.vue       |   17 +
 apps/cMiniApp/project.config.json                                  |    2 
 packages/components/src/Tabs/ProTabs.vue                           |   33 +++
 26 files changed, 533 insertions(+), 36 deletions(-)

diff --git a/apps/bMiniApp/src/components/Menu/menu.scss b/apps/bMiniApp/src/components/Menu/menu.scss
index ed7a058..e8fbe15 100644
--- a/apps/bMiniApp/src/components/Menu/menu.scss
+++ b/apps/bMiniApp/src/components/Menu/menu.scss
@@ -16,8 +16,10 @@
   &.nut-menu {
     .nut-menu__bar {
       box-shadow: none;
-      padding: 0 48rpx;
+      // padding: 0 48rpx;
+      padding: 0;
       justify-content: space-between;
+      background-color: transparent;
       .nut-menu__item {
         flex: none;
         .nut-menu__title-text {
diff --git a/apps/cMiniApp/project.config.json b/apps/cMiniApp/project.config.json
index 75e8651..cc53dd5 100644
--- a/apps/cMiniApp/project.config.json
+++ b/apps/cMiniApp/project.config.json
@@ -51,5 +51,5 @@
         "ignore": [],
         "include": []
     },
-    "appid": "wx88251c84f5cd886b"
+    "appid": "wxb9e0baf4f87aa0de"
 }
\ No newline at end of file
diff --git a/apps/cMiniApp/project.private.config.json b/apps/cMiniApp/project.private.config.json
index 3cfa160..dbee23d 100644
--- a/apps/cMiniApp/project.private.config.json
+++ b/apps/cMiniApp/project.private.config.json
@@ -9,6 +9,13 @@
         "miniprogram": {
             "list": [
                 {
+                    "name": "浠诲姟璇︽儏",
+                    "pathName": "subpackages/task/taskDetail/taskDetail",
+                    "query": "id=c4cfe028-23e7-0be8-ee56-3a11e3743b9d",
+                    "launchMode": "default",
+                    "scene": null
+                },
+                {
                     "name": "",
                     "pathName": "pages/mine/index",
                     "query": "",
diff --git a/apps/cMiniApp/src/app.config.ts b/apps/cMiniApp/src/app.config.ts
index a6f856e..74b8cf2 100644
--- a/apps/cMiniApp/src/app.config.ts
+++ b/apps/cMiniApp/src/app.config.ts
@@ -82,6 +82,10 @@
         'setting/setting',
       ],
     },
+    {
+      root: 'subpackages/task',
+      pages: ['taskDetail/taskDetail'],
+    },
   ],
   // preloadRule: {
   //   'pages/mine/index': {
diff --git a/apps/cMiniApp/src/assets/task/icon-attention-active.png b/apps/cMiniApp/src/assets/task/icon-attention-active.png
new file mode 100644
index 0000000..b1c6265
--- /dev/null
+++ b/apps/cMiniApp/src/assets/task/icon-attention-active.png
Binary files differ
diff --git a/apps/cMiniApp/src/assets/task/icon-attention.png b/apps/cMiniApp/src/assets/task/icon-attention.png
new file mode 100644
index 0000000..eba95ca
--- /dev/null
+++ b/apps/cMiniApp/src/assets/task/icon-attention.png
Binary files differ
diff --git a/apps/cMiniApp/src/assets/task/icon-safe.png b/apps/cMiniApp/src/assets/task/icon-safe.png
new file mode 100644
index 0000000..0addf65
--- /dev/null
+++ b/apps/cMiniApp/src/assets/task/icon-safe.png
Binary files differ
diff --git a/apps/cMiniApp/src/assets/task/icon-share.png b/apps/cMiniApp/src/assets/task/icon-share.png
new file mode 100644
index 0000000..546e699
--- /dev/null
+++ b/apps/cMiniApp/src/assets/task/icon-share.png
Binary files differ
diff --git a/apps/cMiniApp/src/components/Chunk/Cell.vue b/apps/cMiniApp/src/components/Chunk/Cell.vue
index 81a39f9..4b91124 100644
--- a/apps/cMiniApp/src/components/Chunk/Cell.vue
+++ b/apps/cMiniApp/src/components/Chunk/Cell.vue
@@ -30,9 +30,9 @@
 
 .bole-cell-wrapper {
   background: #ffffff;
-  border-radius: 8px;
-  padding: 24px 28px;
-  margin-bottom: 24px;
+  border-radius: 12px;
+  padding: 36px 34px;
+  margin-bottom: 20px;
 
   .cell-title-wrapper {
     display: flex;
@@ -64,9 +64,9 @@
 
     .cell-title-large {
       font-weight: 600;
-      font-size: 32px;
+      font-size: 30px;
       color: boleGetCssVar('text-color', 'primary');
-      line-height: 44px;
+      line-height: 42px;
       @include ellipsis;
     }
   }
diff --git a/apps/cMiniApp/src/components/Menu/Menu.vue b/apps/cMiniApp/src/components/Menu/Menu.vue
index 309ad7d..dbf99e6 100644
--- a/apps/cMiniApp/src/components/Menu/Menu.vue
+++ b/apps/cMiniApp/src/components/Menu/Menu.vue
@@ -17,8 +17,8 @@
             <view class="nut-menu__title-text">{{ item.renderTitle() }}</view>
             <span class="nut-menu__title-icon">
               <slot name="icon">
-                <RectUp v-if="direction === 'up'" :size="12" />
-                <RectDown v-else :size="12" />
+                <TriangleUp v-if="direction === 'up'" :size="12" />
+                <TriangleDown v-else :size="12" />
               </slot>
             </span>
           </view>
@@ -30,7 +30,7 @@
 </template>
 <script lang="ts">
 import Taro, { usePageScroll } from '@tarojs/taro';
-import { RectUp, RectDown } from '@nutui/icons-vue-taro';
+import { RectUp, RectDown, TriangleDown, TriangleUp } from '@nutui/icons-vue-taro';
 import { useTaroRect } from 'senin-mini/hooks';
 import './menu.scss';
 
@@ -40,6 +40,8 @@
   components: {
     RectDown,
     RectUp,
+    TriangleDown,
+    TriangleUp,
   },
   props: {
     activeColor: {
diff --git a/apps/cMiniApp/src/components/Menu/menu.scss b/apps/cMiniApp/src/components/Menu/menu.scss
index ed7a058..4641c59 100644
--- a/apps/cMiniApp/src/components/Menu/menu.scss
+++ b/apps/cMiniApp/src/components/Menu/menu.scss
@@ -4,7 +4,7 @@
   color: boleGetCssVar('text-color', 'primary');
 
   .nut-menu__title-icon {
-    color: #000;
+    color: boleGetCssVar('text-color', 'secondary');
   }
 
   .nut-menu__title.active {
@@ -16,13 +16,15 @@
   &.nut-menu {
     .nut-menu__bar {
       box-shadow: none;
-      padding: 0 48rpx;
+      // padding: 0 48rpx;
+      padding: 0;
       justify-content: space-between;
+      background-color: transparent;
       .nut-menu__item {
         flex: none;
         .nut-menu__title-text {
           padding-left: 0;
-          font-size: 24rpx;
+          font-size: 26rpx;
           color: #000;
         }
       }
diff --git a/apps/cMiniApp/src/constants/router.ts b/apps/cMiniApp/src/constants/router.ts
index 14e0105..ae46868 100644
--- a/apps/cMiniApp/src/constants/router.ts
+++ b/apps/cMiniApp/src/constants/router.ts
@@ -10,12 +10,16 @@
   mine = '/pages/mine/index',
   editRichContent = '/subpackages/editRichContent/editRichContent',
 
+  taskDetail = '/subpackages/task/taskDetail/taskDetail',
+
   // userInfo = '/subpackages/setting/userInfo/userInfo',
   // setting = '/subpackages/setting/setting/setting',
   // privacyAgreement = '/subpackages/setting/privacyAgreement/privacyAgreement',
   // cooperation = '/subpackages/setting/cooperation/cooperation',
   // faq = '/subpackages/setting/faq/faq',
 
+  complaint = '/subpackages/user/complaint/complaint',
+
   authenticationHome = '/subpackages/authentication/authenticationHome/authenticationHome',
   authenticationResult = '/subpackages/authentication/authenticationResult/authenticationResult',
   authenticationFaRen = '/subpackages/authentication/authenticationFaRen/authenticationFaRen',
diff --git a/apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue b/apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue
new file mode 100644
index 0000000..a6e9304
--- /dev/null
+++ b/apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue
@@ -0,0 +1,44 @@
+<template>
+  <QueryMenuView @close="emit('close')">
+    <div class="home-query-menu-view">
+      <QueryMenuItem title="缁撶畻鏂瑰紡">
+        <ProRadio v-model="gender" :value-enum="GenderText" show-all-btn></ProRadio>
+      </QueryMenuItem>
+      <QueryMenuItem title="鍛樺伐绂忓埄">
+        <ProRadio v-model="gender" :value-enum="GenderText" show-all-btn></ProRadio>
+      </QueryMenuItem>
+      <QueryMenuItem title="鎬у埆瑕佹眰">
+        <ProRadio v-model="gender" :value-enum="GenderText" show-all-btn></ProRadio>
+      </QueryMenuItem>
+    </div>
+  </QueryMenuView>
+</template>
+
+<script setup lang="ts">
+import { QueryMenuView, QueryMenuItem, ProRadio } from '@12333/components';
+import { GenderText } from '@12333/constants';
+
+defineOptions({
+  name: 'HomeQueryMenuView',
+});
+
+// type Props = {};
+
+// const props = withDefaults(defineProps<Props>(), {});
+
+const emit = defineEmits<{
+  (e: 'close'): void;
+}>();
+
+const gender = defineModel<number | string>('gender');
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.home-query-menu-view {
+  max-height: 400px;
+  padding: 30px;
+  overflow: auto;
+}
+</style>
diff --git a/apps/cMiniApp/src/pages/home/index.vue b/apps/cMiniApp/src/pages/home/index.vue
index 62093b5..d6483eb 100644
--- a/apps/cMiniApp/src/pages/home/index.vue
+++ b/apps/cMiniApp/src/pages/home/index.vue
@@ -8,7 +8,12 @@
     <div class="home-header">
       <div class="home-searchbar-wrapper">
         <div class="searchbar-container">
-          <BlSearchbar v-model.trim="searchValue" placeholder="鎼滅储浠诲姟"></BlSearchbar>
+          <BlSearchbar
+            v-model.trim="searchValue"
+            placeholder="鎼滅储浠诲姟"
+            @search="handleSearch"
+            @change="handleSearch"
+          ></BlSearchbar>
         </div>
         <div class="city-btn" @click="goCitySelect">
           <Location2 :size="16" />
@@ -27,24 +32,22 @@
       v-model="queryState.orderType"
       name="home-tab"
       :showPaneContent="false"
+      :showSmile="false"
       class="home-tabs"
       isTransparent
-      title-gutter="12"
+      title-gutter="8"
       title-scroll
     >
       <ProTabPane :title="`鎺ㄨ崘`" :pane-key="HomeOrderType.Recommend"></ProTabPane>
       <ProTabPane :title="`鏈�鏂癭" :pane-key="HomeOrderType.LastShelfTime"></ProTabPane>
       <template #right>
         <Menu>
-          <MenuItem
-            v-model="queryState.orderByProperty"
-            title="绛涢��"
-            ref="selectItem"
-            :options="[
-              { text: '鎺掑簭', value: 'userId' },
-              { text: '鎸夊叧娉ㄦ椂闂�', value: 'creationTime' },
-            ]"
-          />
+          <MenuItem title="绛涢��" ref="selectItem">
+            <HomeQueryMenuView
+              v-model:gender="queryState.gender"
+              @close="handleMenuSelectClose"
+            ></HomeQueryMenuView>
+          </MenuItem>
         </Menu>
       </template>
     </ProTabs>
@@ -54,7 +57,7 @@
       :key="queryState.orderType"
     >
       <template #renderItem="{ item }">
-        <TaskCard />
+        <TaskCard @click="goTaskDetail(item)" />
       </template>
     </InfiniteLoading>
   </PageLayoutWithBg>
@@ -69,23 +72,20 @@
 import _ from 'lodash';
 import IconLogo from '@/assets/home/icon-logo.png';
 import { useInfiniteLoading } from '@12333/hooks';
-import { OrderInputType } from '@12333/constants';
+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();
-
-Taro.usePageScroll(() => {
-  console.log('11', 11);
-});
 
 const searchValue = ref('');
 
 const queryState = reactive({
   searchValueTrim: '',
   orderType: HomeOrderType.Recommend,
-  orderByProperty: 'userId',
+  gender: '' as any as Gender,
 });
 
 const handleSearch = _.debounce(function () {
@@ -129,6 +129,18 @@
     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">
diff --git a/apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue b/apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
new file mode 100644
index 0000000..8986d91
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
@@ -0,0 +1,101 @@
+<template>
+  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
+    <ContentScrollView style="background-color: transparent">
+      <Cell :title="'瀹㈡埧鏈嶅姟鍛�'" titleSize="large">
+        <template #title-right>
+          <img :src="IconAttentioActive" class="taskDetail-attention-icon" />
+        </template>
+        <div class="taskDetail-time">2025骞�2鏈�5鏃� 鑷� 2025骞�3鏈�5鏃�</div>
+        <div class="task-card-welfare-wrapper">
+          <div class="task-card-welfare-list">
+            <div class="task-card-welfare-list-item">鏃ョ粨</div>
+            <div class="task-card-welfare-list-item">鐢峰コ涓嶉檺</div>
+            <div class="task-card-welfare-list-item">鍖呬笁椁�</div>
+          </div>
+          <TaskPrice :value="212" />
+        </div>
+        <div class="taskDetail-address-wrapper">
+          <div class="taskDetail-address-title-wrapper">
+            <img :src="IconAttentioActive" class="taskDetail-address-title-icon" />
+            <div class="taskDetail-address-title">瀹佹尝鏌忔偊閰掑簵</div>
+          </div>
+          <div class="taskDetail-address-info-wrapper">
+            <div class="taskDetail-address-info">瀹佹尝甯傞劄宸炲尯涓滈挶婀栧ぇ鍫拌矾188鍙峰畞娉㈡煆鎮﹂厭搴�</div>
+            <RectRight :size="6" class="taskDetail-address-info-icon" />
+          </div>
+        </div>
+      </Cell>
+      <Cell>
+        <template #title>
+          <div class="safe-cell-title-wrapper">
+            <img :src="IconSafe" class="safe-cell-title-icon" />
+            <div class="safe-cell-title">瀹夊叏鎻愮ず</div>
+          </div>
+        </template>
+        <div class="safe-cell-content">
+          璇ヤ俊鎭敱鐢ㄦ埛鑷富鍙戝竷锛屽閬囪櫄鍋囦俊鎭�佽瘓楠椼�佷紶閿�绛夎繚娉曡繚瑙勮涓猴紝璇风珛鍗�
+          <div class="safe-cell-content-btn" @click="goComplaint">鎶曡瘔涓炬姤</div>
+        </div>
+      </Cell>
+    </ContentScrollView>
+    <PageFooter>
+      <PageFooterAction
+        :icon="IconShare"
+        text="鍒嗕韩"
+        :isFlex="false"
+        openType="share"
+      ></PageFooterAction>
+      <PageFooterBtn type="primary">鎶ュ悕</PageFooterBtn>
+    </PageFooter>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import Taro from '@tarojs/taro';
+import { useQuery } from '@tanstack/vue-query';
+import * as orderServices from '@12333/services/api/Order';
+import { useToggle } from 'senin-mini/hooks';
+import { TaskPrice } from '@12333/components';
+import IconAttention from '@/assets/task/icon-attention.png';
+import IconAttentioActive from '@/assets/task/icon-attention-active.png';
+import { RectRight } from '@nutui/icons-vue-taro';
+import IconShare from '@/assets/task/icon-share.png';
+import IconSafe from '@/assets/task/icon-safe.png';
+import './taskDetail.scss';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const router = Taro.useRouter();
+const taskId = router.params?.id ?? '';
+
+const {
+  isLoading,
+  isError,
+  data: detail,
+  refetch,
+} = useQuery({
+  queryKey: ['orderServices/getOrdeForDetail', taskId],
+  queryFn: async () => {
+    return await orderServices.getOrdeForDetail(
+      { id: taskId },
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.OrderInfoDto),
+  onSuccess(data) {
+    if (data.isExistTradeChatRecord) setTrue();
+  },
+});
+
+const { isCollapse, setTrue } = useToggle();
+
+function goComplaint() {
+  Taro.navigateTo({
+    url: `${RouterPath.complaint}?id=${taskId}`,
+  });
+}
+</script>
diff --git a/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.config.ts b/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.scss b/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.scss
new file mode 100644
index 0000000..3238fc8
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.scss
@@ -0,0 +1,119 @@
+@import '@/styles/common.scss';
+
+.taskDetail-page-wrapper {
+  .taskDetail-attention-icon {
+    margin-left: 10px;
+    width: 32px;
+    height: 32px;
+  }
+
+  .taskDetail-time {
+    font-size: 24px;
+    color: boleGetCssVar('text-color', 'regular');
+    line-height: 36px;
+    margin-bottom: 16px;
+  }
+
+  .task-card-welfare-wrapper {
+    display: flex;
+    align-items: flex-start;
+    padding-bottom: 48px;
+    border-bottom: 1px solid #d9d9d9;
+    margin-bottom: 12px;
+
+    .task-card-welfare-list {
+      flex: 1;
+      display: flex;
+      min-width: 0;
+      flex-wrap: wrap;
+      min-height: 40px;
+      row-gap: 6px;
+      column-gap: 18px;
+      margin-right: 10px;
+
+      .task-card-welfare-list-item {
+        font-size: 24px;
+        color: #ff7d00;
+        line-height: 36px;
+      }
+    }
+  }
+
+  .taskDetail-address-wrapper {
+    padding: 28px 32px 14px;
+    background: #f9fbff;
+    border-radius: 8px;
+
+    .taskDetail-address-title-wrapper {
+      display: flex;
+      align-items: center;
+      margin-bottom: 22px;
+
+      .taskDetail-address-title-icon {
+        width: 40px;
+        height: 40px;
+        margin-right: 8px;
+      }
+
+      .taskDetail-address-title {
+        flex: 1;
+        min-width: 0;
+        @include ellipsis;
+        font-size: 28px;
+        color: boleGetCssVar('text-color', 'primary');
+        line-height: 42px;
+      }
+    }
+
+    .taskDetail-address-info-wrapper {
+      display: flex;
+      align-items: center;
+
+      .taskDetail-address-info {
+        flex: 1;
+        min-width: 0;
+        @include ellipsis;
+        font-weight: 400;
+        font-size: 24px;
+        color: boleGetCssVar('text-color', 'regular');
+        line-height: 36px;
+      }
+
+      .taskDetail-address-info-icon {
+        color: boleGetCssVar('text-color', 'secondary');
+        margin-left: 10px;
+      }
+    }
+  }
+
+  .safe-cell-title-wrapper {
+    display: flex;
+    align-items: center;
+
+    .safe-cell-title-icon {
+      width: 32px;
+      height: 32px;
+      margin-right: 8px;
+
+      .safe-cell-title {
+        font-weight: 600;
+        font-size: 28px;
+        color: boleGetCssVar('text-color', 'primary');
+        line-height: 40px;
+      }
+    }
+  }
+
+  .safe-cell-content {
+    font-size: 24px;
+    color: boleGetCssVar('text-color', 'secondary');
+    text-align: left;
+    word-break: break-all;
+    line-height: 34px;
+
+    .safe-cell-content-btn {
+      color: boleGetCssVar('color', 'primary');
+      display: inline;
+    }
+  }
+}
diff --git a/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.vue b/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.vue
new file mode 100644
index 0000000..4e34093
--- /dev/null
+++ b/apps/cMiniApp/src/subpackages/task/taskDetail/taskDetail.vue
@@ -0,0 +1,17 @@
+<template>
+  <PageLayoutWithBg class="taskDetail-page-wrapper" title="浠诲姟璇︽儏">
+    <InnerPage />
+  </PageLayoutWithBg>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'taskDetail',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/packages/components/src/Card/TaskCard.vue b/packages/components/src/Card/TaskCard.vue
index 01186b3..7285ced 100644
--- a/packages/components/src/Card/TaskCard.vue
+++ b/packages/components/src/Card/TaskCard.vue
@@ -2,7 +2,7 @@
   <div class="task-card-wrapper">
     <div class="task-card-title-wrapper">
       <div class="task-card-title">瀹㈡埧鏈嶅姟鍛�</div>
-      <TaskPrice />
+      <TaskPrice :value="212" />
     </div>
     <div class="task-card-welfare-list">
       <div class="task-card-welfare-list-item">鏃ョ粨</div>
@@ -82,7 +82,7 @@
 
   .task-card-time {
     font-size: 24px;
-    color: boleGetCssVar('text-color', 'secondary');
+    color: boleGetCssVar('text-color', 'regular');
     line-height: 36px;
     margin-bottom: 6px;
   }
@@ -111,7 +111,7 @@
 
       .task-card-footer-address {
         font-size: 22px;
-        color: boleGetCssVar('text-color', 'secondary');
+        color: boleGetCssVar('text-color', 'regular');
         line-height: 36px;
         flex: 1;
         min-width: 0;
diff --git a/packages/components/src/Card/TaskPrice.vue b/packages/components/src/Card/TaskPrice.vue
index b359093..c2297c9 100644
--- a/packages/components/src/Card/TaskPrice.vue
+++ b/packages/components/src/Card/TaskPrice.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="task-price">
-    <div class="task-price-decimal">55</div>
+    <div class="task-price-decimal">{{ value }}</div>
     <div class="task-price-unit">鍏�/灏忔椂</div>
   </div>
 </template>
@@ -29,6 +29,7 @@
     font-size: 32px;
     line-height: 40px;
     margin-right: 8px;
+    font-weight: 600;
   }
 
   .task-price-unit {
diff --git a/packages/components/src/Form/ProRadio.vue b/packages/components/src/Form/ProRadio.vue
new file mode 100644
index 0000000..c08e029
--- /dev/null
+++ b/packages/components/src/Form/ProRadio.vue
@@ -0,0 +1,54 @@
+<template>
+  <nut-radio-group v-model="model" direction="horizontal">
+    <nut-radio
+      v-for="item in optionsWithAll"
+      :key="item.value"
+      :label="item.value"
+      :value="item.value"
+      shape="button"
+      >{{ item.text }}</nut-radio
+    >
+  </nut-radio-group>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue';
+import { convertOptions, ValueEnum } from 'senin-mini/utils';
+
+defineOptions({
+  name: 'ProRadio',
+});
+
+type Props = {
+  showAllBtn?: boolean;
+  allBtnLabel?: string;
+  allBtnValue?: string | number | null;
+  enumLabelKey?: string;
+  enumValueKey?: string;
+  valueEnum?: ValueEnum;
+};
+
+const props = withDefaults(defineProps<Props>(), {
+  allBtnLabel: '涓嶉檺',
+  allBtnValue: '',
+  enumLabelKey: 'name',
+  enumValueKey: 'id',
+});
+
+const model = defineModel<string | number>();
+
+const options = computed(() =>
+  convertOptions(props.valueEnum, props.enumLabelKey, props.enumValueKey)
+);
+
+const optionsWithAll = computed(() => {
+  if (props.showAllBtn) {
+    return [{ text: props.allBtnLabel, value: props.allBtnValue }, ...options.value];
+  }
+  return options.value;
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/packages/components/src/Menu/QueryMenuItem.vue b/packages/components/src/Menu/QueryMenuItem.vue
new file mode 100644
index 0000000..62ed33f
--- /dev/null
+++ b/packages/components/src/Menu/QueryMenuItem.vue
@@ -0,0 +1,39 @@
+<template>
+  <div class="query-menu-item">
+    <div class="query-menu-item-title">
+      {{ title }}
+    </div>
+    <slot></slot>
+  </div>
+</template>
+
+<script setup lang="ts">
+defineOptions({
+  name: 'QueryMenuItem',
+});
+
+type Props = {
+  title?: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.query-menu-item {
+  margin-bottom: 34px;
+
+  &:last-child {
+    margin-bottom: 0;
+  }
+
+  .query-menu-item-title {
+    font-size: 28px;
+    color: #536077;
+    line-height: 32px;
+    margin-bottom: 30px;
+  }
+}
+</style>
diff --git a/packages/components/src/Menu/QueryMenuView.vue b/packages/components/src/Menu/QueryMenuView.vue
new file mode 100644
index 0000000..1d34000
--- /dev/null
+++ b/packages/components/src/Menu/QueryMenuView.vue
@@ -0,0 +1,47 @@
+<template>
+  <div class="query-menu-view">
+    <slot></slot>
+    <div class="bole-menu-item__footer">
+      <div class="bole-menu-item__button-wrapper">
+        <nut-button
+          shape="square"
+          class="dark-btn"
+          type="primary"
+          :color="Colors.Info"
+          @click="handleCancel"
+        >
+          鍙栨秷
+        </nut-button>
+        <nut-button shape="square" type="primary" @click="handleConfirm">纭</nut-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { Colors } from '@12333/constants';
+
+defineOptions({
+  name: 'QueryMenuView',
+});
+
+// type Props = {};
+
+// const props = withDefaults(defineProps<Props>(), {});
+
+const emit = defineEmits<{
+  (e: 'close'): void;
+}>();
+
+function handleCancel() {
+  emit('close');
+}
+
+function handleConfirm() {
+  emit('close');
+}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/packages/components/src/Tabs/ProTabs.vue b/packages/components/src/Tabs/ProTabs.vue
index b2c7c8c..e4d8c51 100644
--- a/packages/components/src/Tabs/ProTabs.vue
+++ b/packages/components/src/Tabs/ProTabs.vue
@@ -2,7 +2,10 @@
   <view
     ref="container"
     class="nut-tabs"
-    :class="[direction, { fullHeight, noContent: !showPaneContent, flexTitle }]"
+    :class="[
+      direction,
+      { fullHeight, noContent: !showPaneContent, flexTitle, noSmile: !showSmile },
+    ]"
   >
     <div :class="['pro-tabs__titles_wrapper', { isTransparent }]">
       <scroll-view
@@ -533,4 +536,32 @@
     }
   }
 }
+
+.nut-tabs.noSmile {
+  .nut-tabs__titles.tabs-scrollview {
+    height: 86rpx;
+
+    .nut-tabs__list {
+      height: 86rpx;
+    }
+
+    .nut-tabs__titles-item__smile {
+      display: none !important;
+    }
+
+    .nut-tabs__titles-item {
+      .nut-tabs__titles-item__text {
+        padding-top: 8rpx;
+      }
+
+      &.active {
+        .nut-tabs__titles-item__text {
+          padding-top: 0;
+          font-size: 32rpx;
+          transition: all 0.3s ease;
+        }
+      }
+    }
+  }
+}
 </style>
diff --git a/packages/components/src/Tabs/tabs.ts b/packages/components/src/Tabs/tabs.ts
index 4647f84..5e1dfeb 100644
--- a/packages/components/src/Tabs/tabs.ts
+++ b/packages/components/src/Tabs/tabs.ts
@@ -90,6 +90,10 @@
     type: Boolean,
     default: false,
   },
+  showSmile: {
+    type: Boolean,
+    default: true,
+  },
 };
 
 export const TypeOfFun = (value: any) => {
diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts
index ea88ef9..1e67c8b 100644
--- a/packages/components/src/index.ts
+++ b/packages/components/src/index.ts
@@ -19,3 +19,7 @@
 export { default as Elevator } from './Elevator/Elevator.vue';
 export { default as TaskCard } from './Card/TaskCard.vue';
 export { default as MineAgreementSignCard } from './Card/MineAgreementSignCard.vue';
+export { default as TaskPrice } from './Card/TaskPrice.vue';
+export { default as QueryMenuView } from './Menu/QueryMenuView.vue';
+export { default as QueryMenuItem } from './Menu/QueryMenuItem.vue';
+export { default as ProRadio } from './Form/ProRadio.vue';

--
Gitblit v1.9.1