wupengfei
2025-02-12 5f0482f43a5c9caad2185d6e99e8dc16432f33c0
feat: mine
12个文件已修改
17个文件已添加
5个文件已删除
762 ■■■■ 已修改文件
apps/cMiniApp/project.private.config.json 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/app.config.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/constants/router.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/constants/task.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/editMineInfo/InnerPage.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/editMineInfo/constants/index.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/editMineInfo/editMineInfo.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineAgreementSign/InnerPage.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineAgreementSign/constants/index.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineAgreementSignDetail/constants/index.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCertificate/InnerPage.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCertificate/mineCertificate.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCertificate/mineCertificate.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCertificateAddOrEdit/InnerPage.vue 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCollectTask/InnerPage.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCurriculumVitae/InnerPage.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineDetailedInfo/InnerPage.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineDetailedInfo/mineDetailedInfo.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineDetailedInfo/mineDetailedInfo.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineHire/InnerPage.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineHire/constants/index.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineJobIntention/InnerPage.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineJobIntention/mineJobIntention.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineJobIntention/mineJobIntention.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineSign/InnerPage.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineSign/constants/index.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineWorkExperience/InnerPage.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineWorkExperience/mineWorkExperience.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineWorkExperience/mineWorkExperience.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Input/ChooseInputWithDatePicker.vue 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.private.config.json
@@ -16,29 +16,8 @@
                    "scene": null
                },
                {
                    "name": "公司详情",
                    "pathName": "subpackages/task/companyDetail/companyDetail",
                    "query": "id=c4cfe028-23e7-0be8-ee56-3a11e3743b9d",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "任务详情",
                    "pathName": "subpackages/task/taskDetail/taskDetail",
                    "query": "id=c4cfe028-23e7-0be8-ee56-3a11e3743b9d",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "",
                    "pathName": "pages/mine/index",
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "",
                    "pathName": "subpackages/mine/mineCurriculumVitae/mineCurriculumVitae",
                    "pathName": "subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit",
                    "query": "",
                    "launchMode": "default",
                    "scene": null
apps/cMiniApp/src/app.config.ts
@@ -81,6 +81,11 @@
        'mineAgreementSignDetail/mineAgreementSignDetail',
        'mineCurriculumVitae/mineCurriculumVitae',
        'editMineInfo/editMineInfo',
        'mineJobIntention/mineJobIntention',
        'mineWorkExperience/mineWorkExperience',
        'mineCertificate/mineCertificate',
        'mineCertificateAddOrEdit/mineCertificateAddOrEdit',
        'mineDetailedInfo/mineDetailedInfo',
        'setting/setting',
      ],
    },
apps/cMiniApp/src/constants/index.ts
@@ -2,3 +2,4 @@
export * from './tabBar';
export * from './router';
export * from './img';
export * from './task';
apps/cMiniApp/src/constants/router.ts
@@ -35,5 +35,10 @@
  mineAgreementSignDetail = '/subpackages/mine/mineAgreementSignDetail/mineAgreementSignDetail',
  mineCurriculumVitae = '/subpackages/mine/mineCurriculumVitae/mineCurriculumVitae',
  editMineInfo = '/subpackages/mine/editMineInfo/editMineInfo',
  mineJobIntention = '/subpackages/mine/mineJobIntention/mineJobIntention',
  mineWorkExperience = '/subpackages/mine/mineWorkExperience/mineWorkExperience',
  mineCertificate = '/subpackages/mine/mineCertificate/mineCertificate',
  mineCertificateAddOrEdit = '/subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit',
  mineDetailedInfo = '/subpackages/mine/mineDetailedInfo/mineDetailedInfo',
  setting = '/subpackages/mine/setting/setting',
}
apps/cMiniApp/src/constants/task.ts
New file
@@ -0,0 +1,19 @@
export enum TaskStatus {
  All = 0,
  WaitSign = 10,
  Effect = 20,
  Terminated = 30,
}
export const TaskStatusText = {
  [TaskStatus.All]: '全部',
  [TaskStatus.WaitSign]: '待签约',
  [TaskStatus.Effect]: '生效中',
  [TaskStatus.Terminated]: '已终止',
};
export const TaskStatusColor = {
  [TaskStatus.WaitSign]: '#FF7D00',
  [TaskStatus.Effect]: '#3A71FF',
  [TaskStatus.Terminated]: '#9FA4AC',
};
apps/cMiniApp/src/subpackages/mine/editMineInfo/InnerPage.vue
@@ -1,17 +1,34 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <nut-form-item label="姓名:" prop="name">
      <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.trim="form.name" placeholder="请输入企业名称" />
      </nut-form-item>
      <nut-form-item label="手机号:" prop="phone" required>
      <nut-form-item label="手机号:" class="bole-form-item" prop="phone" required>
        <nut-input v-model.trim="form.phone" placeholder="请输入手机号" type="text" />
      </nut-form-item>
      <nut-form-item label="身份:" class="bole-form-item" prop="gender">
        <ChooseInputWithPicker
          v-model="form.gender"
          placeholder="请选择身份"
          :value-enum="MineHireTypeText"
          :value-enum="TaskStatusText"
        />
      </nut-form-item>
      <nut-form-item label="学历:" class="bole-form-item" prop="gender">
        <ChooseInputWithPicker
          v-model="form.gender"
          placeholder="请选择学历"
          :value-enum="TaskStatusText"
        />
      </nut-form-item>
      <nut-form-item label="常驻城市:" class="bole-form-item" prop="gender">
        <ChooseInputWithPicker
          v-model="form.gender"
          placeholder="请选择常驻城市"
          :value-enum="TaskStatusText"
        />
      </nut-form-item>
    </nut-form>
@@ -22,21 +39,23 @@
</template>
<script setup lang="ts">
import { useUserStore } from '@/stores/modules/user';
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { ChooseInputWithPicker } from '@12333/components';
import { MineHireTypeText, MineHireType } from './constants';
import { TaskStatusText, TaskStatus } from '@/constants';
import { convertApi2FormUrlOnlyOne } from '@12333/utils';
import { useUser } from '@/hooks';
defineOptions({
  name: 'InnerPage',
});
const userStore = useUserStore();
const { userDetail } = useUser();
const form = reactive({
  avatarUrl: convertApi2FormUrlOnlyOne(userDetail.value?.originalAvatarUrl),
  name: '',
  phone: '',
  gender: MineHireType.All,
  gender: TaskStatus.All,
});
const rules = reactive<FormRules>({
@@ -57,9 +76,4 @@
<style lang="scss">
@import '@/styles/common.scss';
.task-card-actions-text {
  font-size: 24px;
  line-height: 42px;
}
</style>
apps/cMiniApp/src/subpackages/mine/editMineInfo/constants/index.ts
File was deleted
apps/cMiniApp/src/subpackages/mine/editMineInfo/editMineInfo.vue
@@ -1,5 +1,5 @@
<template>
  <PageLayout class="index-page-wrapper" :title="'编辑个人信息'">
  <PageLayout class="index-page-wrapper" :title="'编辑个人信息'" has-border>
    <InnerPage></InnerPage>
  </PageLayout>
</template>
apps/cMiniApp/src/subpackages/mine/mineAgreementSign/InnerPage.vue
@@ -8,10 +8,10 @@
    title-gutter="12"
    title-scroll
  >
    <ProTabPane :title="`全部`" :pane-key="MineAgreementSignType.All"></ProTabPane>
    <ProTabPane :title="`待签约`" :pane-key="MineAgreementSignType.WaitSign"></ProTabPane>
    <ProTabPane :title="`生效中`" :pane-key="MineAgreementSignType.Effect"></ProTabPane>
    <ProTabPane :title="`已终止`" :pane-key="MineAgreementSignType.Terminated"></ProTabPane>
    <ProTabPane :title="`全部`" :pane-key="0"></ProTabPane>
    <ProTabPane :title="`待签约`" :pane-key="10"></ProTabPane>
    <ProTabPane :title="`生效中`" :pane-key="20"></ProTabPane>
    <ProTabPane :title="`已终止`" :pane-key="30"></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list home-list"
@@ -21,8 +21,8 @@
    <template #renderItem="{ item }">
      <MineAgreementSignCard @click="goDetail">
        <template #actions>
          <div class="task-card-actions-text" :style="{ color: MineAgreementSignTypeColor[10] }">
            {{ MineAgreementSignTypeText[10] }}
          <div class="task-card-actions-text" :style="{ color: TaskStatusColor[10] }">
            {{ TaskStatusText[10] }}
          </div>
        </template>
      </MineAgreementSignCard>
@@ -33,11 +33,7 @@
<script setup lang="ts">
import { MineAgreementSignCard, ProTabs, ProTabPane } from '@12333/components';
import { useUserStore } from '@/stores/modules/user';
import {
  MineAgreementSignType,
  MineAgreementSignTypeColor,
  MineAgreementSignTypeText,
} from './constants';
import { TaskStatusText, TaskStatusColor, TaskStatus } from '@/constants';
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as orderServices from '@12333/services/api/Order';
@@ -48,7 +44,7 @@
});
const queryState = reactive({
  mineAgreementSignType: MineAgreementSignType.All,
  mineAgreementSignType: TaskStatus.All,
});
const userStore = useUserStore();
@@ -60,7 +56,7 @@
        rows: 20,
        page: pageParam,
        orderInput: [
          queryState.mineAgreementSignType === MineAgreementSignType.All
          queryState.mineAgreementSignType === TaskStatus.All
            ? { property: 'isRecommend', order: OrderInputType.Desc }
            : { property: 'lastShelfTime', order: OrderInputType.Desc },
        ],
apps/cMiniApp/src/subpackages/mine/mineAgreementSign/constants/index.ts
File was deleted
apps/cMiniApp/src/subpackages/mine/mineAgreementSignDetail/constants/index.ts
File was deleted
apps/cMiniApp/src/subpackages/mine/mineCertificate/InnerPage.vue
New file
@@ -0,0 +1,43 @@
<template>
  <ContentScrollView :paddingH="false">
    <List>
      <ListItem title="健康证" @click="handleEdit"> </ListItem>
      <ListItem title="健康证" @click="handleEdit"> </ListItem>
      <ListItem title="健康证" @click="handleEdit"> </ListItem>
      <ListItem title="健康证" @click="handleEdit"> </ListItem>
      <ListItem title="健康证" @click="handleEdit"> </ListItem>
      <ListItem title="健康证" @click="handleEdit"> </ListItem>
    </List>
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" @click="handleAdd">添加证书</PageFooterBtn>
  </PageFooter>
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
import { List, ListItem } from '@12333/components';
import Taro from '@tarojs/taro';
import { RouterPath } from '@/constants';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const form = reactive({
  workYear: '',
});
function handleAdd() {
  Taro.navigateTo({
    url: RouterPath.mineCertificateAddOrEdit,
  });
}
function handleEdit() {}
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/mine/mineCertificate/mineCertificate.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/cMiniApp/src/subpackages/mine/mineCertificate/mineCertificate.vue
New file
@@ -0,0 +1,17 @@
<template>
  <PageLayout class="index-page-wrapper" :title="'资格证书'" has-border>
    <InnerPage></InnerPage>
  </PageLayout>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'mineCertificate',
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/mine/mineCertificateAddOrEdit/InnerPage.vue
New file
@@ -0,0 +1,120 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <nut-form-item label="证书类型:" class="bole-form-item" prop="type">
        <ChooseInputWithPicker
          v-model="form.type"
          placeholder="请选择证书类型"
          :value-enum="TaskStatusText"
        />
      </nut-form-item>
      <nut-form-item label="证书编号:" class="bole-form-item" prop="certificateNumber">
        <nut-input v-model="form.certificateNumber" type="number" placeholder="请输入"> </nut-input>
      </nut-form-item>
      <nut-form-item label="开始日期:" class="bole-form-item" prop="startDate">
        <ChooseInputWithDatePicker v-model="form.startDate"></ChooseInputWithDatePicker>
      </nut-form-item>
      <nut-form-item label="结束日期:" class="bole-form-item" prop="endDate">
        <ChooseInputWithDatePicker v-model="form.endDate"></ChooseInputWithDatePicker>
      </nut-form-item>
      <nut-form-item
        label="永久证书:"
        class="bole-form-item permanent-certificate"
        prop="isPermanentCertificate"
      >
        <nut-switch v-model="form.isPermanentCertificate" />
      </nut-form-item>
      <nut-form-item label="发证单位:" class="bole-form-item" prop="certificateNumber">
        <nut-input v-model="form.certificateNumber" placeholder="请输入"> </nut-input>
      </nut-form-item>
      <div class="certificate-upload">
        <div class="certificate-upload-title">上传证书</div>
        <nut-form-item
          label="证书正面照片(请确保证书号、头像照片等清晰可见)"
          class="bole-form-item"
          prop="photo"
          label-position="top"
        >
          <Uploader v-model:file-list="form.photo" :maximum="1" class="bole-uploader"> </Uploader>
        </nut-form-item>
        <nut-form-item
          label="证书反面照片(或其他有内容页)"
          class="bole-form-item"
          prop="photo"
          label-position="top"
        >
          <Uploader v-model:file-list="form.photo" :maximum="1" class="bole-uploader"> </Uploader>
        </nut-form-item>
      </div>
    </nut-form>
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" @click="handleConfirm">保存</PageFooterBtn>
  </PageFooter>
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
import { ChooseInputWithPicker, ChooseInputWithDatePicker } from '@12333/components';
import { TaskStatusText, TaskStatus } from '@/constants';
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const form = reactive({
  type: TaskStatus.All,
  certificateNumber: '',
  startDate: '',
  endDate: '',
  isPermanentCertificate: false,
  photo: [],
});
const rules = reactive<FormRules>({
  type: [{ required: true, message: '请输入手机号' }],
  startDate: [{ required: true, message: '请选择开始日期' }],
  endDate: [{ required: true, message: '请选择结束日期' }],
  photo: [{ required: true, message: '请上传证书正面照' }],
});
const formRef = ref<any>(null);
function handleConfirm() {
  if (!formRef.value) return;
  formRef.value.validate().then(({ valid, errors }: any) => {
    if (valid) {
      confirm();
    }
  });
}
function confirm() {}
</script>
<style lang="scss">
@import '@/styles/common.scss';
.nut-form .nut-cell.bole-form-item:not(.alignTop),
page .nut-form .nut-cell.bole-form-item:not(.alignTop) {
  align-items: flex-start !important;
}
.permanent-certificate {
  --nut-form-item-body-slots-text-align: right;
}
.certificate-upload {
  .certificate-upload-title {
    font-size: 28px;
    padding: 26px 32px 0;
  }
  .nut-form-item__label {
    padding-right: 0;
    font-size: 24px;
    width: 98%;
  }
}
</style>
apps/cMiniApp/src/subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/cMiniApp/src/subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit.vue
New file
@@ -0,0 +1,17 @@
<template>
  <PageLayout class="index-page-wrapper" :title="'资格证书'" has-border>
    <InnerPage></InnerPage>
  </PageLayout>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'mineCertificateAddOrEdit',
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/mine/mineCollectTask/InnerPage.vue
@@ -67,10 +67,4 @@
    color: boleGetCssVar('text-color', 'regular');
  }
}
.task-card-actions-text {
  font-size: 24px;
  line-height: 42px;
  color: #9fa4ac;
}
</style>
apps/cMiniApp/src/subpackages/mine/mineCurriculumVitae/InnerPage.vue
@@ -38,7 +38,7 @@
      <div class="mine-curriculum-intention-content">
        <div class="mine-curriculum-intention-title">
          <div class="mine-curriculum-intention-title-text">求职意向</div>
          <div class="mine-curriculum-intention-title-edit">
          <div class="mine-curriculum-intention-title-edit" @click="goMineJobIntention">
            编辑
            <img :src="IconArrow" class="mine-curriculum-intention-title-edit-icon" />
          </div>
@@ -65,17 +65,21 @@
        </MineAgreementSignDetailItem>
      </div>
      <ListItem title="资格证书">
      <ListItem title="资格证书" @click="goMineCertificate">
        <template #extra>
          <div class="mine-curriculum-intention-enit-btn">编辑</div>
        </template>
      </ListItem>
      <ListItem title="工作经验">
      <ListItem title="工作经验" @click="goMineWorkExperience">
        <template #extra>
          <div class="mine-curriculum-intention-enit-btn">编辑</div>
        </template>
      </ListItem>
      <ListItem title="详细信息" class="mine-curriculum-intention-detail">
      <ListItem
        title="详细信息"
        class="mine-curriculum-intention-detail"
        @click="goMineDetailedInfo"
      >
        <template #extra>
          <div class="mine-curriculum-intention-enit-btn">编辑</div>
        </template>
@@ -101,11 +105,26 @@
const userStore = useUserStore();
const isLogin = useIsLogin();
function goEditMineInfo() {
function goPage(routeName: string) {
  Taro.navigateTo({
    url: RouterPath.editMineInfo,
    url: routeName,
  });
}
function goEditMineInfo() {
  goPage(RouterPath.editMineInfo);
}
function goMineJobIntention() {
  goPage(RouterPath.mineJobIntention);
}
function goMineDetailedInfo() {
  goPage(RouterPath.mineDetailedInfo);
}
function goMineWorkExperience() {
  goPage(RouterPath.mineWorkExperience);
}
function goMineCertificate() {
  goPage(RouterPath.mineCertificate);
}
</script>
<style lang="scss">
apps/cMiniApp/src/subpackages/mine/mineDetailedInfo/InnerPage.vue
New file
@@ -0,0 +1,61 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef">
      <nut-form-item label="身高:" class="bole-form-item" prop="height">
        <NumberInput v-model="form.height" placeholder="请输入">
          <template #right>cm</template>
        </NumberInput>
      </nut-form-item>
      <nut-form-item label="体重:" class="bole-form-item" prop="weight">
        <NumberInput v-model="form.weight" placeholder="请输入">
          <template #right>kg</template>
        </NumberInput>
      </nut-form-item>
      <nut-form-item
        label="个人生活照(单张照片不超过5m,最多不超过6张):"
        class="bole-form-item person-photo"
        prop="photo"
        label-position="top"
      >
        <Uploader v-model:file-list="form.photo" :maximum="6" class="bole-uploader"> </Uploader>
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" @click="handleConfirm">保存</PageFooterBtn>
  </PageFooter>
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
import { NumberInput } from '@12333/components';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const form = reactive({
  height: '',
  weight: '',
  photo: [],
});
function handleConfirm() {}
</script>
<style lang="scss">
@import '@/styles/common.scss';
.person-photo {
  .nut-form-item__label {
    padding-right: 0;
  }
}
.nut-form .nut-cell.bole-form-item:not(.alignTop),
page .nut-form .nut-cell.bole-form-item:not(.alignTop) {
  align-items: flex-start !important;
}
</style>
apps/cMiniApp/src/subpackages/mine/mineDetailedInfo/mineDetailedInfo.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/cMiniApp/src/subpackages/mine/mineDetailedInfo/mineDetailedInfo.vue
New file
@@ -0,0 +1,17 @@
<template>
  <PageLayout class="index-page-wrapper" :title="'详细信息'" has-border>
    <InnerPage></InnerPage>
  </PageLayout>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'mineDetailedInfo',
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/mine/mineHire/InnerPage.vue
@@ -8,10 +8,10 @@
    title-gutter="12"
    title-scroll
  >
    <ProTabPane :title="`全部`" :pane-key="MineHireType.All"></ProTabPane>
    <ProTabPane :title="`进行中`" :pane-key="MineHireType.InProgress"></ProTabPane>
    <ProTabPane :title="`待验收`" :pane-key="MineHireType.WaitCheck"></ProTabPane>
    <ProTabPane :title="`已完成`" :pane-key="MineHireType.Finished"></ProTabPane>
    <ProTabPane :title="`全部`" :pane-key="0"></ProTabPane>
    <ProTabPane :title="`进行中`" :pane-key="10"></ProTabPane>
    <ProTabPane :title="`待验收`" :pane-key="20"></ProTabPane>
    <ProTabPane :title="`已完成`" :pane-key="30"></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list home-list"
@@ -21,8 +21,8 @@
    <template #renderItem="{ item }">
      <TaskCard>
        <template #actions>
          <div class="task-card-actions-text" :style="{ color: MineHireTypeColor[10] }">
            {{ MineHireTypeText[10] }}
          <div class="task-card-actions-text" :style="{ color: TaskStatusColor[10] }">
            {{ TaskStatusText[10] }}
          </div>
        </template>
      </TaskCard>
@@ -33,7 +33,7 @@
<script setup lang="ts">
import { TaskCard, ProTabs, ProTabPane } from '@12333/components';
import { useUserStore } from '@/stores/modules/user';
import { MineHireType, MineHireTypeColor, MineHireTypeText } from './constants';
import { TaskStatusText, TaskStatusColor, TaskStatus } from '@/constants';
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as orderServices from '@12333/services/api/Order';
@@ -43,7 +43,7 @@
});
const queryState = reactive({
  mineHireType: MineHireType.All,
  mineHireType: TaskStatus.All,
});
const userStore = useUserStore();
@@ -55,7 +55,7 @@
        rows: 20,
        page: pageParam,
        orderInput: [
          queryState.mineHireType === MineHireType.All
          queryState.mineHireType === TaskStatus.All
            ? { property: 'isRecommend', order: OrderInputType.Desc }
            : { property: 'lastShelfTime', order: OrderInputType.Desc },
        ],
apps/cMiniApp/src/subpackages/mine/mineHire/constants/index.ts
File was deleted
apps/cMiniApp/src/subpackages/mine/mineJobIntention/InnerPage.vue
New file
@@ -0,0 +1,66 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <nut-form-item label="期望岗位:" class="bole-form-item" prop="job">
        <ChooseInputWithPicker
          v-model="form.job"
          placeholder="请选择期望岗位"
          :value-enum="TaskStatusText"
        />
      </nut-form-item>
      <nut-form-item label="空闲时间:" class="bole-form-item" prop="job">
        <ChooseInputWithPicker
          v-model="form.job"
          placeholder="请选择空闲时间"
          :value-enum="TaskStatusText"
        />
      </nut-form-item>
      <nut-form-item label="求职状态:" class="bole-form-item" prop="job">
        <ChooseInputWithPicker
          v-model="form.job"
          placeholder="请选择求职状态"
          :value-enum="TaskStatusText"
        />
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" @click="handleConfirm">保存</PageFooterBtn>
  </PageFooter>
</template>
<script setup lang="ts">
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { ChooseInputWithPicker } from '@12333/components';
import { TaskStatusText, TaskStatus } from '@/constants';
import { useUser } from '@/hooks';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const form = reactive({
  job: TaskStatus.All,
});
const rules = reactive<FormRules>({
  job: [{ required: true, message: '请选择' }],
});
const formRef = ref<any>(null);
function handleConfirm() {
  if (!formRef.value) return;
  formRef.value.validate().then(({ valid, errors }: any) => {
    if (valid) {
      confirm();
    }
  });
}
function confirm() {}
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/mine/mineJobIntention/mineJobIntention.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/cMiniApp/src/subpackages/mine/mineJobIntention/mineJobIntention.vue
New file
@@ -0,0 +1,17 @@
<template>
  <PageLayout class="index-page-wrapper" :title="'求职意向'" has-border>
    <InnerPage></InnerPage>
  </PageLayout>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'mineJobIntention',
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/mine/mineSign/InnerPage.vue
@@ -8,9 +8,9 @@
    title-gutter="12"
    title-scroll
  >
    <ProTabPane :title="`全部`" :pane-key="MineSignType.All"></ProTabPane>
    <ProTabPane :title="`待确认`" :pane-key="MineSignType.WaitConfirm"></ProTabPane>
    <ProTabPane :title="`待签约`" :pane-key="MineSignType.WaitSign"></ProTabPane>
    <ProTabPane :title="`全部`" :pane-key="0"></ProTabPane>
    <ProTabPane :title="`待确认`" :pane-key="10"></ProTabPane>
    <ProTabPane :title="`待签约`" :pane-key="20"></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list home-list"
@@ -20,8 +20,8 @@
    <template #renderItem="{ item }">
      <TaskCard>
        <template #actions>
          <div class="task-card-actions-text" :style="{ color: MineSignTypeColor[10] }">
            {{ MineSignTypeText[10] }}
          <div class="task-card-actions-text" :style="{ color: TaskStatusColor[10] }">
            {{ TaskStatusText[10] }}
          </div>
        </template>
      </TaskCard>
@@ -32,7 +32,7 @@
<script setup lang="ts">
import { TaskCard, ProTabs, ProTabPane } from '@12333/components';
import { useUserStore } from '@/stores/modules/user';
import { MineSignType, MineSignTypeColor, MineSignTypeText } from './constants';
import { TaskStatusText, TaskStatusColor, TaskStatus } from '@/constants';
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as orderServices from '@12333/services/api/Order';
@@ -42,7 +42,7 @@
});
const queryState = reactive({
  mineSignType: MineSignType.All,
  mineSignType: TaskStatus.All,
});
const userStore = useUserStore();
@@ -54,7 +54,7 @@
        rows: 20,
        page: pageParam,
        orderInput: [
          queryState.mineSignType === MineSignType.All
          queryState.mineSignType === TaskStatus.All
            ? { property: 'isRecommend', order: OrderInputType.Desc }
            : { property: 'lastShelfTime', order: OrderInputType.Desc },
        ],
apps/cMiniApp/src/subpackages/mine/mineSign/constants/index.ts
File was deleted
apps/cMiniApp/src/subpackages/mine/mineWorkExperience/InnerPage.vue
New file
@@ -0,0 +1,35 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef">
      <nut-form-item label="工作年限:" class="bole-form-item" prop="workYear">
        <nut-input v-model="form.workYear" placeholder="请输入"> </nut-input>
      </nut-form-item>
      <nut-form-item label="工作经验:" class="bole-form-item" prop="workYear">
        <nut-input v-model="form.workYear" type="textarea" placeholder="请输入"> </nut-input>
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
  <PageFooter>
    <PageFooterBtn type="primary" @click="handleConfirm">保存</PageFooterBtn>
  </PageFooter>
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const form = reactive({
  workYear: '',
});
function handleConfirm() {}
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/mine/mineWorkExperience/mineWorkExperience.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/cMiniApp/src/subpackages/mine/mineWorkExperience/mineWorkExperience.vue
New file
@@ -0,0 +1,17 @@
<template>
  <PageLayout class="index-page-wrapper" :title="'工作经验'" has-border>
    <InnerPage></InnerPage>
  </PageLayout>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'mineWorkExperience',
});
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
packages/components/src/Input/ChooseInputWithDatePicker.vue
New file
@@ -0,0 +1,58 @@
<template>
  <ChooseInput :modelValue="modelValue" @click="handleOpen()"></ChooseInput>
</template>
<script setup lang="ts">
import ChooseInput from './ChooseInput.vue';
import { Popup, DatePicker } from '@nutui/nutui-taro';
import { Portal } from 'senin-mini/components';
import { h } from 'vue';
import dayjs from 'dayjs';
defineOptions({
  name: 'ChooseInputWithDatePicker',
});
type Props = {
  modelValue: string | number;
};
const props = withDefaults(defineProps<Props>(), {});
const emit = defineEmits<{
  (e: 'update:modelValue', val: string | number): void;
}>();
function handleOpen() {
  const _modelValue = [props.modelValue];
  Portal.add((key) => {
    return h(
      Portal.Container,
      { keyNumber: key, delayOpen: true },
      {
        default: ({ open, onClose }) =>
          h(
            Popup,
            {
              visible: open.value,
              'onUpdate:visible': (value) => !value && onClose(),
              position: 'bottom',
            },
            {
              default: () =>
                h(DatePicker, {
                  modelValue: _modelValue,
                  onCancel: onClose,
                  onConfirm: ({ selectedValue }) => {
                    console.log('selectedValue: ', selectedValue);
                    emit('update:modelValue', dayjs(selectedValue).format('YYYY-MM-DD'));
                    onClose();
                  },
                }),
            }
          ),
      }
    );
  });
}
</script>
packages/components/src/index.ts
@@ -10,6 +10,7 @@
export { default as ListItem } from './List/ListItem.vue';
export { default as NumberInput } from './Input/NumberInput.vue';
export { default as ChooseInputWithPicker } from './Input/ChooseInputWithPicker.vue';
export { default as ChooseInputWithDatePicker } from './Input/ChooseInputWithDatePicker.vue';
export { default as ChooseInputWithAreaPicker } from './Input/ChooseInputWithAreaPicker.vue';
export { default as ChooseInputWithAreaSheet } from './Input/ChooseInputWithAreaSheet.vue';
export { default as PreviewImage } from './Image/PreviewImage.vue';