From 3c7cbba6d64ca8bf7b1307023072b505414f7d5d Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期二, 05 八月 2025 13:42:14 +0800
Subject: [PATCH] feat: 名片

---
 apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.vue               |   17 +
 apps/bMiniApp/src/subpackages/businessCard/businessCard/InnerPage.vue                  |   39 ++++
 apps/bMiniApp/src/assets/businessCard/icon-company.png                                 |    0 
 apps/bMiniApp/src/constants/router.ts                                                  |    3 
 apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailItem.vue       |   42 ++++
 apps/bMiniApp/src/assets/businessCard/icon-position.png                                |    0 
 apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.vue       |   17 +
 apps/bMiniApp/src/assets/businessCard/icon-wechat.png                                  |    0 
 apps/bMiniApp/project.private.config.json                                              |    7 
 apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardView.vue             |   60 ++++++
 apps/bMiniApp/src/app.config.ts                                                        |    4 
 apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/InnerPage.vue              |  137 +++++++++++++++
 apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardHolderView.vue       |   65 +++++++
 apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.config.ts         |    3 
 apps/bMiniApp/src/pages/mine/index.vue                                                 |    6 
 apps/bMiniApp/src/assets/businessCard/icon-address.png                                 |    0 
 apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.config.ts |    3 
 apps/bMiniApp/src/assets/businessCard/icon-email.png                                   |    0 
 apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailInfoView.vue   |   82 +++++++++
 19 files changed, 484 insertions(+), 1 deletions(-)

diff --git a/apps/bMiniApp/project.private.config.json b/apps/bMiniApp/project.private.config.json
index 05123c7..34009f7 100644
--- a/apps/bMiniApp/project.private.config.json
+++ b/apps/bMiniApp/project.private.config.json
@@ -77,6 +77,13 @@
                     "query": "",
                     "launchMode": "default",
                     "scene": null
+                },
+                {
+                    "name": "",
+                    "pathName": "subpackages/businessCard/businessCard/businessCard",
+                    "query": "",
+                    "launchMode": "default",
+                    "scene": null
                 }
             ]
         }
diff --git a/apps/bMiniApp/src/app.config.ts b/apps/bMiniApp/src/app.config.ts
index 65805de..34f147c 100644
--- a/apps/bMiniApp/src/app.config.ts
+++ b/apps/bMiniApp/src/app.config.ts
@@ -75,6 +75,10 @@
       ],
     },
     {
+      root: 'subpackages/businessCard',
+      pages: ['businessCard/businessCard', 'businessCardEdit/businessCardEdit'],
+    },
+    {
       root: 'subpackages/task',
       pages: [
         'publishTask/publishTask',
diff --git a/apps/bMiniApp/src/assets/businessCard/icon-address.png b/apps/bMiniApp/src/assets/businessCard/icon-address.png
new file mode 100644
index 0000000..a79999f
--- /dev/null
+++ b/apps/bMiniApp/src/assets/businessCard/icon-address.png
Binary files differ
diff --git a/apps/bMiniApp/src/assets/businessCard/icon-company.png b/apps/bMiniApp/src/assets/businessCard/icon-company.png
new file mode 100644
index 0000000..d584ad6
--- /dev/null
+++ b/apps/bMiniApp/src/assets/businessCard/icon-company.png
Binary files differ
diff --git a/apps/bMiniApp/src/assets/businessCard/icon-email.png b/apps/bMiniApp/src/assets/businessCard/icon-email.png
new file mode 100644
index 0000000..5c19060
--- /dev/null
+++ b/apps/bMiniApp/src/assets/businessCard/icon-email.png
Binary files differ
diff --git a/apps/bMiniApp/src/assets/businessCard/icon-position.png b/apps/bMiniApp/src/assets/businessCard/icon-position.png
new file mode 100644
index 0000000..2232e99
--- /dev/null
+++ b/apps/bMiniApp/src/assets/businessCard/icon-position.png
Binary files differ
diff --git a/apps/bMiniApp/src/assets/businessCard/icon-wechat.png b/apps/bMiniApp/src/assets/businessCard/icon-wechat.png
new file mode 100644
index 0000000..eaaa4a0
--- /dev/null
+++ b/apps/bMiniApp/src/assets/businessCard/icon-wechat.png
Binary files differ
diff --git a/apps/bMiniApp/src/constants/router.ts b/apps/bMiniApp/src/constants/router.ts
index 51db33e..489c816 100644
--- a/apps/bMiniApp/src/constants/router.ts
+++ b/apps/bMiniApp/src/constants/router.ts
@@ -33,6 +33,9 @@
   mineFavorites = '/subpackages/mine/mineFavorites/mineFavorites',
   mineContactRecord = '/subpackages/mine/mineContactRecord/mineContactRecord',
 
+  businessCard = '/subpackages/businessCard/businessCard/businessCard',
+  businessCardEdit = '/subpackages/businessCard/businessCardEdit/businessCardEdit',
+
   publishTask = '/subpackages/task/publishTask/publishTask',
   taskCheck = '/subpackages/task/taskCheck/taskCheck',
   taskCheckDetail = '/subpackages/task/taskCheckDetail/taskCheckDetail',
diff --git a/apps/bMiniApp/src/pages/mine/index.vue b/apps/bMiniApp/src/pages/mine/index.vue
index 3dada20..0f60b4c 100644
--- a/apps/bMiniApp/src/pages/mine/index.vue
+++ b/apps/bMiniApp/src/pages/mine/index.vue
@@ -43,7 +43,7 @@
           </div>
         </template>
         <div class="mine-business-card">
-          <div class="mine-business-card-item">
+          <div class="mine-business-card-item" @click="goBusinessCard">
             <img class="mine-business-card-item-icon" :src="IconBusinessCard" alt="" />
             <div class="mine-business-card-item-text">鎴戠殑鐢靛瓙鍚嶇墖</div>
           </div>
@@ -152,6 +152,10 @@
   goPage(RouterPath.mineContactRecord);
 }
 
+function goBusinessCard() {
+  goPage(RouterPath.businessCard);
+}
+
 async function handleLoginout() {
   try {
     await Message.confirm({
diff --git a/apps/bMiniApp/src/subpackages/businessCard/businessCard/InnerPage.vue b/apps/bMiniApp/src/subpackages/businessCard/businessCard/InnerPage.vue
new file mode 100644
index 0000000..752d047
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/businessCard/InnerPage.vue
@@ -0,0 +1,39 @@
+<template>
+  <ProTabs
+    v-model="businessCardType"
+    name="home-tab"
+    class="home-tabs"
+    isTransparent
+    title-gutter="12"
+    title-scroll
+  >
+    <ProTabPane :title="`鎴戠殑鍚嶇墖`" pane-key="1">
+      <BusinessCardView></BusinessCardView>
+    </ProTabPane>
+    <ProTabPane :title="`鎴戠殑鍚嶇墖澶筦" pane-key="2">
+      <BusinessCardHolderView></BusinessCardHolderView>
+    </ProTabPane>
+  </ProTabs>
+</template>
+
+<script setup lang="ts">
+import { ProTabs, ProTabPane } from '@12333/components';
+import BusinessCardView from '../components/BusinessCardView.vue';
+import BusinessCardHolderView from '../components/BusinessCardHolderView.vue';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const businessCardType = ref('1');
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.businessCard-page-wrapper {
+  .nut-tab-pane {
+    background-color: transparent;
+  }
+}
+</style>
diff --git a/apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.config.ts b/apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.vue b/apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.vue
new file mode 100644
index 0000000..e435389
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/businessCard/businessCard.vue
@@ -0,0 +1,17 @@
+<template>
+  <PageLayoutWithBg class="businessCard-page-wrapper" :title="'鐢靛瓙鍚嶇墖'">
+    <InnerPage></InnerPage>
+  </PageLayoutWithBg>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'businessCard',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/InnerPage.vue b/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/InnerPage.vue
new file mode 100644
index 0000000..d120841
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/InnerPage.vue
@@ -0,0 +1,137 @@
+<template>
+  <ContentScrollView :paddingH="false">
+    <nut-form :model-value="form" ref="formRef" :rules="rules">
+      <nut-form-item label="澶村儚:" class="bole-form-item" prop="avatarUrl">
+        <Uploader v-model:file-list="form.avatarUrl" :maximum="1" class="bole-uploader"> </Uploader>
+      </nut-form-item>
+      <nut-form-item label="濮撳悕:" class="bole-form-item" prop="name">
+        <nut-input v-model="form.name" placeholder="璇疯緭鍏ユ偍鐨勫鍚�"> </nut-input>
+      </nut-form-item>
+      <nut-form-item label="寰俊鍙�:" class="bole-form-item" prop="name">
+        <nut-input v-model="form.name" placeholder="璇疯緭鍏ユ偍鐨勫井淇″彿"> </nut-input>
+      </nut-form-item>
+      <nut-form-item label="鑱屼綅:" class="bole-form-item" prop="name">
+        <nut-input v-model="form.name" placeholder="璇疯緭鍏ユ偍鐨勮亴浣�"> </nut-input>
+      </nut-form-item>
+      <nut-form-item label="閭:" class="bole-form-item" prop="name">
+        <nut-input v-model="form.name" placeholder="璇疯緭鍏ユ偍鐨勯偖绠�"> </nut-input>
+      </nut-form-item>
+      <nut-form-item label="鍏徃鍚�:" class="bole-form-item" prop="name">
+        <nut-input v-model="form.name" placeholder="璇疯緭鍏ユ偍鐨勫叕鍙稿悕"> </nut-input>
+      </nut-form-item>
+      <nut-form-item label="鍏徃鎵�鍦ㄥ湴" class="bole-form-item" prop="areaList" required>
+        <ChooseInputWithAreaPicker
+          :columns="areaTreeList"
+          v-model="form.areaList"
+          placeholder="璇烽�夋嫨鎮ㄥ叕鍙哥殑鎵�鍦ㄥ湴"
+        ></ChooseInputWithAreaPicker>
+      </nut-form-item>
+      <nut-form-item label="鍏徃绠�浠�:" class="bole-form-item alignTop" prop="name">
+        <nut-textarea
+          placeholder="璇疯緭鍏ュ叕鍙哥畝浠�"
+          placeholderClass="bole-input-text-placeholder"
+          autoSize
+          class="bole-input-textarea"
+          v-model="form.name"
+          :max-length="500"
+          show-word-limit
+        >
+        </nut-textarea>
+      </nut-form-item>
+    </nut-form>
+  </ContentScrollView>
+  <PageFooter>
+    <PageFooterBtn type="primary" plain @click="handleCancel">鍙栨秷</PageFooterBtn>
+    <PageFooterBtn type="primary" @click="handleConfirm">纭</PageFooterBtn>
+  </PageFooter>
+</template>
+
+<script setup lang="ts">
+import { useUser } from '@/hooks';
+import { ChooseInputWithAreaPicker } from '@12333/components';
+import { FormValidator, Message } from '@12333/utils';
+import * as flexWorkerServices from '@12333/services/api/FlexWorker';
+import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
+import Taro from '@tarojs/taro';
+import { goBack } from '@/utils';
+import { useAllAreaList } from '@12333/hooks';
+import { useQuery } from '@tanstack/vue-query';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const { userDetail } = useUser();
+const { areaTreeList } = useAllAreaList();
+const router = Taro.useRouter();
+const taskId = router.params?.taskId ?? '';
+
+const form = reactive({
+  avatarUrl: [],
+  name: '',
+  areaList: [] as number[],
+});
+
+const rules = reactive<FormRules>({
+  name: [{ required: true, message: '璇疯緭鍏ュ鍚�' }],
+
+  areaList: [
+    { required: true, message: '璇烽�夋嫨鍏徃鎵�鍦ㄥ湴', validator: FormValidator.validatorArray },
+  ],
+});
+
+const {
+  isLoading,
+  isError,
+  data: detail,
+  refetch,
+} = useQuery({
+  queryKey: ['flexWorkerServices/getFlexTaskDto', taskId],
+  queryFn: async () => {
+    return await flexWorkerServices.getFlexTaskDto(
+      { id: taskId },
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetFlexTaskDtoOutput),
+  onSuccess(data) {},
+});
+
+const formRef = ref<any>(null);
+function handleConfirm() {
+  if (!formRef.value) return;
+  formRef.value.validate().then(({ valid, errors }: any) => {
+    if (valid) {
+      confirm();
+    }
+  });
+}
+
+async function confirm() {
+  try {
+    let params: {};
+    let res = await flexWorkerServices.addEidtFlexTask(params);
+    if (res) {
+      Message.success('缂栬緫鎴愬姛', {
+        onClosed() {
+          goBack();
+        },
+      });
+    }
+  } catch (error) {}
+}
+
+function handleCancel() {
+  Taro.navigateBack();
+}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.businessCardEdit-page-wrapper {
+  //
+}
+</style>
diff --git a/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.config.ts b/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.vue b/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.vue
new file mode 100644
index 0000000..2865c74
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/businessCardEdit/businessCardEdit.vue
@@ -0,0 +1,17 @@
+<template>
+  <PageLayout class="businessCardEdit-page-wrapper" :title="'鐢靛瓙鍚嶇墖'" has-border>
+    <InnerPage></InnerPage>
+  </PageLayout>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'businessCardEdit',
+});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailInfoView.vue b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailInfoView.vue
new file mode 100644
index 0000000..4b5c95d
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailInfoView.vue
@@ -0,0 +1,82 @@
+<template>
+  <ContentScrollView class="business-card-detail-info-wrapper">
+    <TaskCheckPersonalView :name="'1231231'" :contactPhone="'133'">
+      <template #actions>
+        <nut-button type="primary" @click="emit('edit')">缂栬緫</nut-button>
+      </template>
+    </TaskCheckPersonalView>
+    <div class="business-card-detail">
+      <BusinessCardDetailItem :icon="IconWechat" :value="`寰俊锛�${'13333333333'}`" />
+      <BusinessCardDetailItem :icon="IconPosition" :value="`鑱屼綅锛�${'缁忕悊'}`" />
+      <BusinessCardDetailItem :icon="IconEmail" :value="`閭锛�${'yangyang@123.com'}`" />
+      <BusinessCardDetailItem :icon="IconCompany" :value="`鍏徃锛�${'鏉窞浜哄姏鏃犲咖绉戞妧'}`" />
+      <BusinessCardDetailItem :icon="IconAddress" :value="`鍦板潃锛�${'鏉窞甯備笂鍩庡尯'}`" />
+    </div>
+  </ContentScrollView>
+  <div class="business-card-detail-company-intro">
+    <div class="business-card-detail-company-intro-title">鍏徃绠�浠�</div>
+    <div class="business-card-detail-company-intro-content">
+      {{
+        '鎴戞槸鍏徃鐨勪笟鍔$畝浠嬫垜鏄叕鍙哥殑涓氬姟绠�浠嬫垜鏄叕鍙哥殑涓氬姟绠� 浠嬫垜鏄叕鍙哥殑涓氬姟绠�浠嬫垜鏄叕鍙哥殑涓氬姟绠�浠嬫垜鏄叕鍙哥殑涓氬姟 绠�浠嬫垜鏄叕鍙哥殑涓氬姟绠�浠嬫垜鏄叕鍙哥殑涓氬姟绠�浠嬫垜鏄叕鍙哥殑涓� 鍔$畝浠嬫垜鏄叕鍙哥殑涓氬姟绠�浠嬫垜鏄叕鍙哥殑涓氬姟绠�浠�'
+      }}
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import TaskCheckPersonalView from '../../task/components/TaskCheckPersonalView.vue';
+import BusinessCardDetailItem from './BusinessCardDetailItem.vue';
+import IconWechat from '@/assets/businessCard/icon-wechat.png';
+import IconPosition from '@/assets/businessCard/icon-position.png';
+import IconEmail from '@/assets/businessCard/icon-email.png';
+import IconCompany from '@/assets/businessCard/icon-company.png';
+import IconAddress from '@/assets/businessCard/icon-address.png';
+
+defineOptions({
+  name: 'BusinessCardDetailInfoView',
+});
+
+const emit = defineEmits<{
+  (e: 'edit'): void;
+}>();
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.business-card-detail-info-wrapper {
+  background-color: #ffffff;
+  padding-top: 20px;
+
+  .flexJob-card-top-wrapper {
+    padding-top: 40px;
+    padding-bottom: 32px;
+    border-bottom: 1px solid #d9d9d9;
+  }
+
+  .business-card-detail {
+    padding: 20px 0 10px;
+  }
+}
+
+.business-card-detail-company-intro {
+  background-color: #ffffff;
+  margin-top: 30px;
+  padding: 30px 24px;
+
+  .business-card-detail-company-intro-title {
+    font-size: 28px;
+    line-height: 40px;
+    color: boleGetCssVar('text-color', 'primary');
+    font-weight: 600;
+    margin-bottom: 10px;
+  }
+
+  .business-card-detail-company-intro-content {
+    font-size: 24px;
+    line-height: 36px;
+    color: #4e5969;
+    font-weight: 400;
+  }
+}
+</style>
diff --git a/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailItem.vue b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailItem.vue
new file mode 100644
index 0000000..4586ecd
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardDetailItem.vue
@@ -0,0 +1,42 @@
+<template>
+  <div class="business-card-detail-item">
+    <img :src="icon" class="business-card-detail-item-icon" />
+    <div class="business-card-detail-item-value">{{ value }}</div>
+  </div>
+</template>
+
+<script setup lang="ts">
+defineOptions({
+  name: 'BusinessCardDetailItem',
+});
+
+type Props = {
+  icon?: string;
+  value?: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.business-card-detail-item {
+  margin-bottom: 24px;
+  display: flex;
+  align-items: center;
+
+  .business-card-detail-item-icon {
+    width: 32px;
+    height: 32px;
+    margin-right: 14px;
+  }
+
+  .business-card-detail-item-value {
+    font-weight: 400;
+    font-size: 24px;
+    color: #4e5969;
+    line-height: 36px;
+  }
+}
+</style>
diff --git a/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardHolderView.vue b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardHolderView.vue
new file mode 100644
index 0000000..7072562
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardHolderView.vue
@@ -0,0 +1,65 @@
+<template>
+  <InfiniteLoading scrollViewClassName="common-infinite-scroll-list" v-bind="infiniteLoadingProps">
+    <template #renderItem="{ item }">
+      <FlexJobCard
+        :name="item.name"
+        :age="item.age"
+        :genderType="item.genderType"
+        :workExperience="item.workExperience"
+      >
+        <template #footerLeft>
+          <div class="flexJob-card-footer-text">{{ FlexTaskWorkerHireEnum[item.hireStatus] }}</div>
+        </template>
+        <template #footerRight>
+          <nut-button type="primary" @click="handleDelete()">鍒犻櫎</nut-button>
+          <nut-button type="primary" @click="goForward()">杞彂</nut-button>
+        </template>
+      </FlexJobCard>
+    </template>
+  </InfiniteLoading>
+</template>
+
+<script setup lang="ts">
+import { OrderInputType } from '@12333/constants';
+import { RouterPath } from '@/constants';
+import { FlexTaskWorkerHireEnum } from '@12333/constants/task';
+import { useInfiniteLoading } from '@12333/hooks';
+import * as flexWorkerServices from '@12333/services/api/FlexWorker';
+import { FlexJobCard } from '@12333/components';
+import Taro from '@tarojs/taro';
+
+defineOptions({
+  name: 'BusinessCardHolderView',
+});
+
+const router = Taro.useRouter();
+const id = router.params?.id ?? '';
+
+const { infiniteLoadingProps } = useInfiniteLoading(
+  ({ pageParam }) => {
+    let params: API.GetFlexTaskWorkerApplyListInput = {
+      // flexTaskId: id,
+      pageModel: {
+        rows: 20,
+        page: pageParam,
+        orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }],
+      },
+    };
+
+    return flexWorkerServices.getFlexTaskWorkerApplyList(params, {
+      showLoading: false,
+    });
+  },
+  {
+    queryKey: ['flexWorkerServices/getFlexTaskWorkerApplyList'],
+  }
+);
+
+function handleDelete() {}
+
+function goForward() {}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+</style>
diff --git a/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardView.vue b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardView.vue
new file mode 100644
index 0000000..aa1186c
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/businessCard/components/BusinessCardView.vue
@@ -0,0 +1,60 @@
+<template>
+  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
+    <BusinessCardDetailInfoView @edit="goEditBusinessCard"></BusinessCardDetailInfoView>
+    <PageFooterBtn type="primary" class="business-card-btn">閫掑悕鐗�</PageFooterBtn>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import { useQuery } from '@tanstack/vue-query';
+import Taro from '@tarojs/taro';
+import * as flexWorkerServices from '@12333/services/api/FlexWorker';
+import BusinessCardDetailInfoView from './BusinessCardDetailInfoView.vue';
+
+defineOptions({
+  name: 'BusinessCardView',
+});
+
+const router = Taro.useRouter();
+
+const id = router.params?.id;
+
+const {
+  isLoading,
+  isError,
+  data: detail,
+  refetch,
+} = useQuery({
+  queryKey: ['flexWorkerServices/getFlexTaskDto', id],
+  queryFn: async () => {
+    return await flexWorkerServices.getFlexTaskDto(
+      { id: id },
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetFlexTaskDtoOutput),
+  onSuccess(data) {},
+});
+
+function goEditBusinessCard() {
+  Taro.navigateTo({
+    url: `${RouterPath.businessCardEdit}?id=${id}`,
+  });
+}
+
+function handleBusinessCard() {}
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.businessCard-page-wrapper {
+  .business-card-btn {
+    width: 100%;
+    margin: 40px auto 0;
+    font-size: 28px;
+  }
+}
+</style>

--
Gitblit v1.9.1