wupengfei
4 天以前 e3ae5da789eb35217a4a377cab0ff3241ceaf72a
feat: 接口对接
10个文件已修改
329 ■■■■■ 已修改文件
apps/cMiniApp/src/hooks/user.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/stores/modules/user.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Input/ChooseInputWithAreaPicker.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/area.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/hooks/user.ts
@@ -10,7 +10,7 @@
export function useUser() {
  const userStore = useUserStore();
  const { userDetail, userInfo, locationCity } = storeToRefs(userStore);
  const { userDetail, userInfo, locationCity, userId } = storeToRefs(userStore);
  function updateUserInfo() {
    return userStore.getCurrentUserInfo();
@@ -43,6 +43,7 @@
    isCompanyAudited,
    isCertified,
    locationCity,
    userId,
  };
}
apps/cMiniApp/src/stores/modules/user.ts
@@ -87,6 +87,10 @@
    accountInfo(): Partial<AccountInfo> {
      return getAccountInfoFromAccessToken(this.userInfo?.accessToken);
    },
    userId: (state) => {
      return state.userInfo?.id ?? '';
    },
  },
  actions: {
    // 手机号授权Code登录
@@ -188,19 +192,19 @@
    },
    async getCurrentUserInfo() {
      try {
        let res = await userServices.getUserInfo({ showLoading: false });
        if (res) {
          // res.frontStatus = getUserCertificationFrontStatusAdapter(
          //   res.userCertificationStatus,
          //   res.userCertificationAuditStatus
          // );
          // res.originalAvatarUrl = res.avatarUrl;
          // res.avatarUrl = res.avatarUrl ? setOSSLink(res.avatarUrl) : DefaultAvatar;
          // this.setUserDetail(res);
          // this.firstGetUserDetail = false;
        }
      } catch (error) {}
      // try {
      //   let res = await userServices.getUserInfo({ showLoading: false });
      //   if (res) {
      //     res.frontStatus = getUserCertificationFrontStatusAdapter(
      //       res.userCertificationStatus,
      //       res.userCertificationAuditStatus
      //     );
      //     res.originalAvatarUrl = res.avatarUrl;
      //     res.avatarUrl = res.avatarUrl ? setOSSLink(res.avatarUrl) : DefaultAvatar;
      //     this.setUserDetail(res);
      //     this.firstGetUserDetail = false;
      //   }
      // } catch (error) {}
    },
    setTokenAction(tokenInfo: API.LoginCommandCallback) {
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -1,32 +1,32 @@
<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 label="头像:" class="bole-form-item" prop="avatar">
        <Uploader v-model:file-list="form.avatar" :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-input v-model.trim="form.name" placeholder="请输入姓名" />
      </nut-form-item>
      <nut-form-item label="手机号:" class="bole-form-item" prop="phoneNumber" required>
        <nut-input v-model.trim="form.phoneNumber" placeholder="请输入手机号" type="text" />
      <nut-form-item label="手机号:" class="bole-form-item" prop="contactPhoneNumber" required>
        <nut-input v-model.trim="form.contactPhoneNumber" placeholder="请输入手机号" type="text" />
      </nut-form-item>
      <nut-form-item label="身份:" class="bole-form-item" prop="socialIdentity">
      <nut-form-item label="身份:" class="bole-form-item" prop="personalIdentityCode">
        <ChooseInputWithPicker
          v-model="form.socialIdentity"
          v-model="form.personalIdentityCode"
          placeholder="请选择身份"
          :value-enum="IdentityTypeList"
          :value-enum="identityList"
        />
      </nut-form-item>
      <nut-form-item label="学历:" class="bole-form-item" prop="educationalLevel">
      <nut-form-item label="学历:" class="bole-form-item" prop="educationalBackgroundCode">
        <ChooseInputWithPicker
          v-model="form.educationalLevel"
          v-model="form.educationalBackgroundCode"
          placeholder="请选择学历"
          :value-enum="EducationTypeList"
          :value-enum="educationList"
        />
      </nut-form-item>
      <nut-form-item label="常驻城市:" class="bole-form-item" prop="areaList">
        <ChooseInputWithAreaPicker
          :columns="cityAreaTree"
          :columns="completeAreaTree"
          v-model="form.areaList"
          placeholder="请选择常驻城市"
        ></ChooseInputWithAreaPicker>
@@ -41,11 +41,10 @@
<script setup lang="ts">
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { ChooseInputWithPicker, ChooseInputWithAreaPicker } from '@12333/components';
import { TaskStatusText } from '@/constants';
import { convertApi2FormUrlOnlyOne, Message, setOSSLink } from '@12333/utils';
import { useAllAreaList, useArea, useSearchSettingType } from '@12333/hooks';
import { Gender, SearchType } from '@12333/constants';
import * as userResumeServices from '@12333/services/api/userResume';
import { useArea, useDictionaryDataSelect } from '@12333/hooks';
import { CategoryCode } from '@12333/constants';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
@@ -53,23 +52,24 @@
  name: 'InnerPage',
});
const { searchSettingTypeList: EducationTypeList } = useSearchSettingType({
  searchType: SearchType.Education,
});
const { searchSettingTypeList: IdentityTypeList } = useSearchSettingType({
  searchType: SearchType.Identity,
const { dictionaryDataList: identityList } = useDictionaryDataSelect({
  categoryCode: CategoryCode.Identity,
});
const { findAreaNameFromCode, cityAreaTree } = useAllAreaList();
const { dictionaryDataList: educationList } = useDictionaryDataSelect({
  categoryCode: CategoryCode.Education,
});
const { completeAreaTree } = useArea();
const form = reactive({
  avatarUrl: [],
  avatar: [],
  name: '',
  phoneNumber: '',
  gender: Gender.Male,
  socialIdentity: '',
  educationalLevel: '',
  areaList: [] as number[],
  identity: '',
  contactPhoneNumber: '',
  personalIdentityCode: '',
  educationalBackgroundCode: '',
  areaList: [] as string[],
});
const {
@@ -78,29 +78,43 @@
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResumeBaseInfo'],
  queryKey: ['userResumeServices/getUserResumePersonal'],
  queryFn: async () => {
    return await userResumeServices.getUserResumeBaseInfo({
      showLoading: false,
    });
    return await userResumeServices.getUserResumePersonal(
      {},
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.UserResumeBaseInfoOutput),
  placeholderData: () => ({} as API.GetUserResumePersonalQueryResult),
  onSuccess(data) {
    form.avatarUrl = convertApi2FormUrlOnlyOne(setOSSLink(data.avatarUrl));
    form.avatar = convertApi2FormUrlOnlyOne(setOSSLink(data.avatar));
    form.name = data.name;
    form.phoneNumber = data.phoneNumber;
    form.gender = data.genderType;
    form.socialIdentity = data.socialIdentity;
    form.educationalLevel = data.educationalLevel;
    form.areaList = [data.residentProvinceCode, data.residentCityCode];
    form.identity = data.identity;
    form.contactPhoneNumber = data.contactPhoneNumber;
    form.personalIdentityCode = data.personalIdentityCode ?? '';
    form.educationalBackgroundCode = data.educationalBackgroundCode ?? '';
    form.areaList =
      data.provinceCode && data.cityCode ? [data.provinceCode, data.cityCode] : ['', ''];
  },
});
const rules = reactive<FormRules>({
  phoneNumber: [{ required: true, message: '请输入手机号' }],
  socialIdentity: [{ required: true, message: '请选择身份' }],
  educationalLevel: [{ required: true, message: '请选择学历' }],
  areaList: [{ required: true, message: '请选择常驻城市' }],
  contactPhoneNumber: [{ required: true, message: '请输入手机号' }],
  personalIdentityCode: [{ required: true, message: '请选择身份' }],
  educationalBackgroundCode: [{ required: true, message: '请选择学历' }],
  areaList: [
    {
      required: true,
      validator: () => {
        if (!form.areaList.length) {
          return Promise.reject('请选择常驻城市');
        }
        return Promise.resolve();
      },
    },
  ],
});
const formRef = ref<any>(null);
function handleConfirm() {
@@ -114,18 +128,17 @@
async function confirm() {
  try {
    let params: API.SaveUserResumeBaseInfoInput = {
    let params: API.SaveUserResumePersonalCommand = {
      name: form.name,
      avatarUrl: form.avatarUrl[0]?.path,
      phoneNumber: form.phoneNumber,
      educationalLevel: form.educationalLevel,
      socialIdentity: form.socialIdentity,
      residentProvinceCode: form.areaList[0],
      residentProvinceName: findAreaNameFromCode(form.areaList[0]),
      residentCityCode: form.areaList[1],
      residentCityName: findAreaNameFromCode(form.areaList[1]),
      identity: form.identity,
      avatar: form.avatar[0]?.path,
      contactPhoneNumber: form.contactPhoneNumber,
      educationalBackgroundCode: form.educationalBackgroundCode,
      personalIdentityCode: form.personalIdentityCode,
      provinceCode: form.areaList[0],
      cityCode: form.areaList[1],
    };
    let res = await userResumeServices.saveUserResumeBaseInfo(params);
    let res = await userResumeServices.saveUserResumePersonal(params);
    if (res) {
      Message.success('保存成功', {
        onClosed() {
apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue
@@ -6,12 +6,12 @@
    <div class="expect-position-page-footer">
      <div class="expect-position-select-wrapper" v-if="checkdList.length > 0">
        <div class="expect-position-select-item" v-for="(item, index) in checkdList" :key="index">
          <div class="expect-position-select-item-text">{{ item.name }}</div>
          <div class="expect-position-select-item-text">{{ item.label }}</div>
          <div class="expect-position-select-item-icon-wrapper">
            <Close
              :size="8"
              class="expect-position-select-item-icon"
              @click="handleDelete(item.id)"
              @click="handleDelete(item.value)"
            />
          </div>
        </div>
@@ -23,8 +23,8 @@
<script setup lang="ts">
import { PositionSelectView } from '@12333/components';
import { SearchType } from '@12333/constants';
import { useSearchSettingType } from '@12333/hooks';
import { CategoryCode } from '@12333/constants';
import { useDictionaryDataSelect } from '@12333/hooks';
import { Close } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro';
import { size } from 'lodash';
@@ -44,13 +44,13 @@
const positionList = ref([]);
const { searchSettingTypeList: position } = useSearchSettingType({
  searchType: SearchType.Position,
const { dictionaryDataList: position } = useDictionaryDataSelect({
  categoryCode: CategoryCode.Position,
});
const checkdList = computed(() => {
  if (!positionList.value.length) return [];
  return position.value.filter((x) => positionList.value.includes(x.id));
  return position.value.filter((x) => positionList.value.includes(x.value));
});
function handleDelete(id: string) {
apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue
@@ -19,6 +19,8 @@
import { List, ListItem } from '@12333/components';
import Taro from '@tarojs/taro';
import { RouterPath } from '@/constants';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import { useQuery } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
@@ -30,6 +32,25 @@
  workYear: '',
});
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResumeCredentials'],
  queryFn: async () => {
    return await userResumeServices.getUserResumeCredentials(
      {},
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => [] as API.GetUserResumeCredentialsQueryResultItem[],
  onSuccess(data) {},
});
function handleAdd() {
  Taro.navigateTo({
    url: RouterPath.mineCertificateAddOrEdit,
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
@@ -1,7 +1,7 @@
<template>
  <ContentView>
    <nut-noticebar
      text="个人简历已完善50%,完善简历可提升录用率"
      :text="`个人简历已完善${detail?.completeRate ?? 0},完善简历可提升录用率`"
      :left-icon="false"
      background="transparent"
      close-mode
@@ -35,14 +35,18 @@
          <div class="mine-curriculum-info-item-left">
            <img :src="IconPhone" class="mine-curriculum-info-item-phone-icon" />
            <div class="mine-curriculum-info-item-phone">
              {{ detail?.phoneNumber ?? '' }}
              {{ detail?.contactPhoneNumber ?? '' }}
            </div>
          </div>
          <div class="mine-curriculum-info-item-detail">
            {{
              `${detail?.age ?? ''}岁 | ${detail?.personalIdentityContent} | ${
                detail?.educationalBackgroundContent
              }`
              `${detail?.age ? `${detail?.age}岁` : ''}
              ${detail?.personalIdentityContent ? `| ${detail?.personalIdentityContent}` : ''}
                ${
                  detail?.educationalBackgroundContent
                    ? `| ${detail?.educationalBackgroundContent}`
                    : ''
                }`
            }}
          </div>
        </div>
@@ -103,7 +107,6 @@
<script setup lang="ts">
import { useUserStore } from '@/stores/modules/user';
import { useIsLogin } from '@/hooks';
import MineAgreementSignDetailItem from '../../mine/mineAgreementSignDetail/MineAgreementSignDetailItem.vue';
import { List, ListItem, JobTagList, Avatar } from '@12333/components';
import {
@@ -121,19 +124,13 @@
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
import { setOSSLink } from '@12333/utils';
import { useEvent, useEventChannel } from 'senin-mini/hooks';
import { useEvent } from 'senin-mini/hooks';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUserStore();
const isLogin = useIsLogin();
const router = Taro.useRouter();
const usrId = computed(() => userDetail?.userId ?? '');
const eventChannel = useEventChannel();
const { userId } = useUser();
useEvent('updateResume', function (data: { content: boolean }) {
  if (data.content) {
@@ -143,9 +140,7 @@
  }
});
const jobTag = computed(
  () => detail?.value?.userExpectJobs?.map((x) => x.personalIdentityContent) ?? []
);
const jobTag = computed(() => detail?.value?.userExpectJobs?.map((x) => x.expectJobContent) ?? []);
const {
  isLoading,
@@ -153,17 +148,17 @@
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResume', usrId],
  queryKey: ['userResumeServices/getUserResume', userId],
  queryFn: async () => {
    return await userResumeServices.getUserResume(
      { userId: usrId.value },
      { userId: userId.value },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.GetUserResumeQueryResult),
  enabled: !!usrId.value,
  enabled: computed(() => !!userId.value),
});
function goPage(routeName: string) {
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
@@ -1,7 +1,12 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <nut-form-item label="期望岗位:" class="bole-form-item" prop="jobIdList" label-position="top">
      <nut-form-item
        label="期望岗位:"
        class="bole-form-item"
        prop="userExpectJobs"
        label-position="top"
      >
        <CommonInputField class="job-common-input-field" @click="goExpectPosition">
          <JobTagList :jobTagList="jobTagList" />
        </CommonInputField>
@@ -10,14 +15,14 @@
        <ChooseInputWithPicker
          v-model="form.freeTime"
          placeholder="请选择空闲时间"
          :value-enum="UserResumeFreeTimeEnumText"
          :value-enum="EnumPersonalFreeTimeText"
        />
      </nut-form-item>
      <nut-form-item label="求职状态:" class="bole-form-item" prop="jobSeekingStatus">
        <ChooseInputWithPicker
          v-model="form.jobSeekingStatus"
          placeholder="请选择求职状态"
          :value-enum="UserResumeJobSeekingStatusEnumText"
          :value-enum="EnumPersonalJobSeekingStatusText"
        />
      </nut-form-item>
    </nut-form>
@@ -31,35 +36,37 @@
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { ChooseInputWithPicker, JobTagList, CommonInputField } from '@12333/components';
import {
  UserResumeFreeTimeEnumText,
  UserResumeJobSeekingStatusEnumText,
  UserResumeFreeTimeEnum,
  UserResumeJobSeekingStatusEnum,
  SearchType,
  CategoryCode,
  EnumPersonalFreeTime,
  EnumPersonalJobSeekingStatus,
  EnumPersonalFreeTimeText,
  EnumPersonalJobSeekingStatusText,
} from '@12333/constants';
import Taro from '@tarojs/taro';
import * as userResumeServices from '@12333/services/api/userResume';
import { useSearchSettingType } from '@12333/hooks';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import { useDictionaryDataSelect } from '@12333/hooks';
import { Message } from '@12333/utils';
import { goBack } from '@/utils';
import { useQuery } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
});
const { searchSettingTypeList: positionList } = useSearchSettingType({
  searchType: SearchType.Position,
const { dictionaryDataList: positionList } = useDictionaryDataSelect({
  categoryCode: CategoryCode.Position,
});
const jobTagList = computed(() => {
  return positionList.value?.filter((x) => form.jobIdList.includes(x.id)).map((x) => x.name) || [];
  return (
    positionList.value?.filter((x) => form.userExpectJobs.includes(x.value)).map((x) => x.label) ||
    []
  );
});
const form = reactive({
  jobIdList: [] as string[],
  freeTime: UserResumeFreeTimeEnum.NoLimit,
  jobSeekingStatus: UserResumeJobSeekingStatusEnum.Activing,
  userExpectJobs: [] as string[],
  freeTime: EnumPersonalFreeTime.NoLimit,
  jobSeekingStatus: EnumPersonalJobSeekingStatus.Active,
});
const {
@@ -68,26 +75,29 @@
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getResumeExpectationJob'],
  queryKey: ['userResumeServices/getUserResumeJobSeeking'],
  queryFn: async () => {
    return await userResumeServices.getResumeExpectationJob({
      showLoading: false,
    });
    return await userResumeServices.getUserResumeJobSeeking(
      {},
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.UserResumeExpectationJobOutput),
  placeholderData: () => ({} as API.GetUserResumeJobSeekingQueryResult),
  onSuccess(data) {
    form.jobIdList = data.jobIdList.map((x) => x.id);
    form.userExpectJobs = data.userExpectJobs.map((x) => x.expectJobCode);
    form.freeTime = data.freeTime;
    form.jobSeekingStatus = data.jobSeekingStatus;
  },
});
const rules = reactive<FormRules>({
  jobIdList: [
  userExpectJobs: [
    {
      required: true,
      validator() {
        if (form.jobIdList.length) return Promise.resolve(true);
        if (form.userExpectJobs.length) return Promise.resolve(true);
        return Promise.reject('请选择期望岗位');
      },
    },
@@ -107,12 +117,12 @@
async function confirm() {
  try {
    let params: API.SaveUserResumeExpectationJobInput = {
      jobIdList: form.jobIdList,
    let params: API.SaveUserResumeJobSeekingCommand = {
      userExpectJobsExpectJobCode: form.userExpectJobs,
      freeTime: form.freeTime,
      jobSeekingStatus: form.jobSeekingStatus,
    };
    let res = await userResumeServices.saveUserResumeExpectationJob(params);
    let res = await userResumeServices.saveUserResumeJobSeeking(params);
    if (res) {
      Message.success('保存成功', {
        onClosed() {
@@ -133,11 +143,12 @@
    url: `${RouterPath.expectPosition}`,
    events: {
      addPosition: function (data: { content: string[] }) {
        form.jobIdList = data.content?.length ? data.content : [];
        form.userExpectJobs = data.content?.length ? data.content : [];
      },
    },
    success: function (res) {
      res.eventChannel.emit('updatePosition', { content: form.jobIdList });
      console.log('res: ', res);
      res.eventChannel.emit('updatePosition', { content: form.userExpectJobs });
    },
  });
}
packages/components/src/Input/ChooseInputWithAreaPicker.vue
@@ -18,7 +18,7 @@
type Props = {
  fieldNames?: object;
  columns: API.AreaTreeNode[];
  modelValue: Array<string | number>;
  modelValue: Array<string>;
  title?: string;
};
@@ -30,12 +30,11 @@
    children: 'children',
  }),
});
const inputValue = computed(() =>
  props.modelValue.map((x) => findAreaNameFromCode(Number(x))).join(',')
);
console.log('props: ', props);
const inputValue = computed(() => props.modelValue.map((x) => findAreaNameFromCode(x)).join(','));
const emit = defineEmits<{
  (e: 'update:modelValue', val: Array<string | number>): void;
  (e: 'update:modelValue', val: Array<string>): void;
}>();
function handleOpen() {
packages/hooks/area.ts
@@ -12,10 +12,11 @@
    categoryCode: CategoryCode.Area,
    staleTime: Infinity,
    all: true,
    maxDeep: AreaType.Area,
    maxDeep: AreaType.City,
  });
  const areaList = computed(() => dictionaryDataList.value.map(convertDictionaryToAreaTreeNode));
  console.log('areaList: ', areaList);
  const areaTree = computed(() => formatAreaListToTree(areaList.value));
@@ -43,7 +44,7 @@
  return {
    children: [],
    areaCode: item.data?.code,
    parentCode: '',
    parentCode: item.data?.field1,
    areaName: item.label,
    layer: Number(item.data?.field4),
    quickQuery: item.data?.field2,
packages/services/apiV2/typings.d.ts
@@ -1543,7 +1543,7 @@
    /** 体重 */
    weight?: number;
    /** 生活照 */
    photos?: string[];
    photoImgs?: string[];
  }
  type GetUserResumeJobSeekingQuery = Record<string, any>;
@@ -1571,6 +1571,8 @@
    avatar?: string;
    /** 姓名 */
    name?: string;
    /** 手机号 */
    contactPhoneNumber?: string;
    /** 身份证号 */
    identity?: string;
    /** 身份编号 */
@@ -1594,12 +1596,14 @@
  interface GetUserResumeQueryResult {
    /** 用户Id */
    id?: string;
    /** 完善度 */
    completeRate?: number;
    /** 头像 */
    avatar?: string;
    /** 姓名 */
    name?: string;
    /** 手机号 */
    phoneNumber?: string;
    contactPhoneNumber?: string;
    /** 身份证号 */
    identity?: string;
    gender?: EnumUserGender;
@@ -1665,10 +1669,12 @@
  }
  interface GetUserResumeQueryResultExpectJob {
    /** 期望岗位上级编号 */
    expectJobParentCode?: string;
    /** 期望岗位编号 */
    personalIdentityCode?: string;
    expectJobCode?: string;
    /** 期望岗位 */
    personalIdentityContent?: string;
    expectJobContent?: string;
  }
  type GetUserResumeWorkExperienceQuery = Record<string, any>;
@@ -1681,6 +1687,8 @@
  }
  interface LoginCommandCallback {
    /** 用户Id */
    id?: string;
    /** 用户访问令牌 */
    accessToken?: string;
    /** 刷新令牌 */
@@ -2040,12 +2048,12 @@
    /** 体重 */
    weight?: number;
    /** 生活照 */
    photos?: string[];
    photosImg?: string[];
  }
  interface SaveUserResumeJobSeekingCommand {
    /** 用户信息期望岗位 */
    userExpectJobs: string[];
    userExpectJobsExpectJobCode: string[];
    freeTime: EnumPersonalFreeTime;
    jobSeekingStatus: EnumPersonalJobSeekingStatus;
  }
@@ -2055,6 +2063,8 @@
    avatar?: string;
    /** 姓名 */
    name?: string;
    /** 手机号 */
    contactPhoneNumber?: string;
    /** 身份证号 */
    identity: string;
    /** 身份编号 */