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