7个文件已添加
25个文件已修改
917 ■■■■■ 已修改文件
apps/bMiniApp/src/components/Avatar/UserAvatar.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/components/JobDetailContent/components/curriculumView.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/pages/mine/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/app.config.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/components/Avatar/UserAvatar.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/constants/router.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/task/InnerPage.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationFace/InnerPage.vue 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationFace/authenticationFace.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationFace/authenticationFace.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationHome/InnerPage.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/InnerPage.vue 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/authenticationRealName.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/authenticationRealName.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCollectTask/InnerPage.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/task/components/CompanyInfo.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Avatar/Avatar.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Calendar/Calendar.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/FlexJobCard.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Image/PreviewImage.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/enterprise.ts 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/task.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/logRecords.ts 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/resource.ts 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/task.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/user.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/components/Avatar/UserAvatar.vue
@@ -1,5 +1,5 @@
<template>
  <Avatar :src="userDetail?.avatarUrl"></Avatar>
  <Avatar :src="userDetail?.avatar"></Avatar>
</template>
<script setup lang="ts">
apps/bMiniApp/src/components/JobDetailContent/components/curriculumView.vue
@@ -23,15 +23,8 @@
          </CurriculumViewItem>
        </div>
      </CellChunk>
      <CellChunk title="资格证书">
        <nut-grid
          square
          :column-num="3"
          :border="false"
          :gutter="20"
          v-if="_userCredentials.length > 0"
          class="pro-img-grid"
        >
      <CellChunk title="资格证书" v-if="_userCredentials.length > 0">
        <nut-grid square :column-num="3" :border="false" :gutter="20" class="pro-img-grid">
          <nut-grid-item
            v-for="(item, index) in _userCredentials"
            :key="item"
@@ -44,8 +37,7 @@
        </nut-grid>
      </CellChunk>
      <CellChunk title="工作经验">
        <CurriculumViewItem label="工作年限:" :text="workSeniority ? `${workSeniority}年` : ''">
        </CurriculumViewItem>
        <CurriculumViewItem label="工作年限:" :text="workSeniority"> </CurriculumViewItem>
        <CurriculumViewItem label="工作经验:" :text="workExperience"> </CurriculumViewItem>
      </CellChunk>
      <CellChunk title="详细信息">
apps/bMiniApp/src/pages/mine/index.vue
@@ -82,11 +82,11 @@
              text="财务管理"
              @click="goFinance"
            ></TaskDetailWelfareItem>
            <TaskDetailWelfareItem
            <!-- <TaskDetailWelfareItem
              :icon="IconRealName"
              text="企业实名"
              @click.stop="goAuthentication"
            ></TaskDetailWelfareItem>
            ></TaskDetailWelfareItem> -->
            <TaskDetailWelfareItem
              :icon="IconSetting"
              text="设置"
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue
@@ -74,6 +74,10 @@
    if (!isCollapse.value) {
      await userResumeServices.contactUserResume({ id: userId });
      toggle();
    } else {
      Taro.makePhoneCall({
        phoneNumber: userResumeInfo.value.contactPhoneNumber,
      });
    }
  } catch (error) {}
});
apps/cMiniApp/src/app.config.ts
@@ -64,6 +64,8 @@
        'authenticationFaRen/authenticationFaRen',
        'authenticationJBR/authenticationJBR',
        'authenticationResult/authenticationResult',
        'authenticationRealName/authenticationRealName',
        'authenticationFace/authenticationFace',
      ],
    },
    {
apps/cMiniApp/src/components/Avatar/UserAvatar.vue
@@ -1,5 +1,5 @@
<template>
  <Avatar :src="userDetail?.avatarUrl"></Avatar>
  <Avatar :src="userDetail?.avatar"></Avatar>
</template>
<script setup lang="ts">
apps/cMiniApp/src/constants/router.ts
@@ -27,6 +27,8 @@
  authenticationResult = '/subpackages/authentication/authenticationResult/authenticationResult',
  authenticationFaRen = '/subpackages/authentication/authenticationFaRen/authenticationFaRen',
  authenticationJBR = '/subpackages/authentication/authenticationJBR/authenticationJBR',
  authenticationRealName = '/subpackages/authentication/authenticationRealName/authenticationRealName',
  authenticationFace = '/subpackages/authentication/authenticationFace/authenticationFace',
  citySelect = '/subpackages/city/citySelect/citySelect',
  mineSign = '/subpackages/mine/mineSign/mineSign',
apps/cMiniApp/src/pages/task/InnerPage.vue
@@ -46,6 +46,7 @@
const { queryState, infiniteLoadingProps } = useCheckReceiveTasks();
function goSubmitTaskDetail(item: API.GetCheckReceiveTasksQueryResultItem) {
  console.log('queryState.date: ', queryState.date);
  if (Number(queryState.checkReceiveStatus) === EnumTaskCheckReceiveStatus.WaitSubmit) {
    Taro.navigateTo({
      url: `${RouterPath.taskSubmitCheck}?id=${item.id}&date=${queryState.date}`,
apps/cMiniApp/src/subpackages/authentication/authenticationFace/InnerPage.vue
New file
@@ -0,0 +1,41 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef">
      <nut-form-item label="刷脸:" class="bole-form-item alignTop" prop="licenseUrl" required>
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
  <PageFooter :isOnlyAction="false">
    <PageFooterBtn type="primary" @click="handleSubmit()" :loading="loading"
      >刷脸认证</PageFooterBtn
    >
  </PageFooter>
</template>
<script setup lang="ts">
import Taro from '@tarojs/taro';
defineOptions({
  name: 'InnerPage',
});
const form = reactive({
  licenseUrl: [],
});
const formRef = ref<any>(null);
const loading = ref(false);
function handleSubmit() {
  if (!formRef.value) return;
  formRef.value.validate().then(({ valid, errors }: any) => {
    if (valid) {
      // submit();
    }
  });
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/cMiniApp/src/subpackages/authentication/authenticationFace/authenticationFace.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/cMiniApp/src/subpackages/authentication/authenticationFace/authenticationFace.vue
New file
@@ -0,0 +1,14 @@
<template>
  <PageLayout title="实人认证" class="authenticationFace-page-wrapper" hasBorder developing>
    <InnerPage />
  </PageLayout>
</template>
<script setup lang="ts">
import { PageLayout } from '@/components';
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'authenticationFace',
});
</script>
apps/cMiniApp/src/subpackages/authentication/authenticationHome/InnerPage.vue
@@ -2,26 +2,18 @@
  <ContentScrollView class="authenticationHome-page-view">
    <div class="authenticationHome-page-title">实名认证</div>
    <authenticationHomeItem
      title="企业法人认证"
      title="个人实名认证"
      :icon="IconFaren"
      :info="[['企业营业执照照片', '法人身份证照片'], ['法人手机号码(接收短信验证码进行短信核验)']]"
      @click="goFaRen"
      :info="[['身份证照片'], ['手机号码(接收短信验证码进行短信核验)']]"
      @click="goRealName"
    ></authenticationHomeItem>
    <authenticationHomeItem
      title="企业经办人认证"
      title="实人认证"
      isJBR
      :icon="IconJBR"
      :info="[
        ['企业授权书', '企业营业执照照片', '经办人身份证照片'],
        ['经办人手机号码(接收短信验证码进行短信核验)'],
      ]"
      @click="goJBR"
      :info="[['实人扫脸认证']]"
      @click="goFace"
    >
      <template #title-extra>
        <div class="authenticationHome-page-title-btn" @click.stop="downloadPowerAttorneyTemplate">
          下载授权书模版
        </div>
      </template>
    </authenticationHomeItem>
  </ContentScrollView>
</template>
@@ -31,21 +23,18 @@
import IconFaren from '@/assets/authentication/icon-faren.png';
import IconJBR from '@/assets/authentication/icon-jbr.png';
import Taro from '@tarojs/taro';
import { useDownloadPowerAttorneyTemplate } from '../hooks';
defineOptions({
  name: 'InnerPage',
});
function goFaRen() {
  Taro.navigateTo({ url: RouterPath.authenticationFaRen });
function goRealName() {
  Taro.navigateTo({ url: RouterPath.authenticationRealName });
}
function goJBR() {
  Taro.navigateTo({ url: RouterPath.authenticationJBR });
function goFace() {
  Taro.navigateTo({ url: RouterPath.authenticationFace });
}
const { downloadPowerAttorneyTemplate } = useDownloadPowerAttorneyTemplate();
</script>
<style lang="scss">
@@ -55,6 +44,10 @@
  .authenticationHome-page-view {
    padding-top: 48px;
    background-color: transparent;
    .authentication-home-item-info {
      flex-direction: column;
    }
  }
  .authenticationHome-page-title {
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/InnerPage.vue
New file
@@ -0,0 +1,188 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <ProFormItemCell label="身份证照片:" required>
        <div class="id-imgUrl-wrapper">
          <nut-form-item
            label=" "
            class="bole-form-item"
            prop="legalPersonIdFrontImgUrl"
            label-width="0px"
          >
            <Uploader
              v-model:file-list="form.legalPersonIdFrontImgUrl"
              :maximum="1"
              :limitFileSize="10"
              class="bole-uploader nopaddingtop"
              @my-success="handleFrontImgUrlChange"
            >
              <template #upload-icon>
                <div class="photograph-wrapper">
                  <Photograph color="#808080" />
                  <div>身份证人像面</div>
                </div>
              </template>
            </Uploader>
          </nut-form-item>
          <nut-form-item
            label=" "
            class="bole-form-item"
            prop="legalPersonIdBackImgUrl"
            label-width="0px"
          >
            <Uploader
              v-model:file-list="form.legalPersonIdBackImgUrl"
              :maximum="1"
              :limitFileSize="10"
              class="bole-uploader nopaddingtop"
            >
              <template #upload-icon>
                <div class="photograph-wrapper">
                  <Photograph color="#808080" />
                  <div>身份证国徽面</div>
                </div>
              </template>
            </Uploader>
          </nut-form-item>
        </div>
        <div class="pro-form-item-tips">
          请上传身份证的正反面照片,确保身份证清晰可见,支持png/jpg/jpeg格式,文件大小不超过10MB
        </div>
      </ProFormItemCell>
      <nut-form-item label="姓名:" class="bole-form-item" prop="name" required>
        <nut-input
          v-model.trim="form.name"
          class="nut-input-text bole-input-text"
          placeholder="请填写姓名"
          type="text"
        />
      </nut-form-item>
      <nut-form-item label="身份证号:" class="bole-form-item" prop="idNumber" required>
        <nut-input
          v-model.trim="form.idNumber"
          class="nut-input-text bole-input-text"
          placeholder="请填写身份证号码"
          type="text"
        />
      </nut-form-item>
      <nut-form-item label="手机号:" class="bole-form-item" prop="contactPhone" required>
        <nut-input
          v-model.trim="form.contactPhone"
          class="nut-input-text bole-input-text"
          placeholder="请填写手机号码"
          type="text"
        >
          <template #right>
            <ProFormCaptcha
              :onGetCaptcha="() => onGetCaptcha(form.contactPhone)"
              :phonePropName="['contactPhone', 'name', 'idNumber']"
              :validateField="formRef?.validate"
            ></ProFormCaptcha>
          </template>
        </nut-input>
      </nut-form-item>
      <nut-form-item label="短信验证码:" class="bole-form-item" prop="verificationCode" required>
        <nut-input
          v-model.trim="form.verificationCode"
          class="nut-input-text bole-input-text"
          placeholder="请输入验证码"
          type="number"
        />
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
  <PageFooter :isOnlyAction="false">
    <PageFooterBtn type="primary" @click="handleSubmit()" :loading="loading"
      >提交认证</PageFooterBtn
    >
  </PageFooter>
</template>
<script setup lang="ts">
import { VerificationCodeBusinessType } from '@12333/constants';
import { ProFormCaptcha, ProFormItemCell } from 'senin-mini/components';
import * as commonServices from '@12333/services/api/Common';
import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type';
import { Photograph } from '@nutui/icons-vue-taro';
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { FormValidator } from '@12333/utils';
defineOptions({
  name: 'InnerPage',
});
const form = reactive({
  legalPersonIdFrontImgUrl: [] as FileItem[],
  legalPersonIdBackImgUrl: [] as FileItem[],
  name: '',
  idNumber: '',
  contactPhone: '',
  verificationCode: '',
});
const formRef = ref<any>(null);
const loading = ref(false);
const rules: FormRules = {
  name: [{ required: true, message: '请填写姓名' }],
  legalPersonIdFrontImgUrl: [
    { required: true, message: '请上传身份证人像面', validator: FormValidator.validatorArray },
  ],
  legalPersonIdBackImgUrl: [
    { required: true, message: '请上传身份证国徽面', validator: FormValidator.validatorArray },
  ],
  idNumber: [
    { required: true, message: '请填写身份证号码' },
    { message: '请输入正确的身份证号码', validator: FormValidator.validatorIDCard },
  ],
  legalPersonContactPhone: [
    { required: true, message: '请填写手机号码' },
    { message: '请输入正确的手机号码', validator: FormValidator.validatorPhoneNumber },
  ],
  verificationCode: [{ required: true, message: '请输入验证码' }],
};
async function onGetCaptcha(phoneNumber: string) {
  await commonServices.sendPhoneCertificationVerificationCode(
    {
      name: form.name,
      identity: form.idNumber,
      mobile: form.contactPhone,
      businessType: VerificationCodeBusinessType.UserCertificationPhoneCertification,
    },
    { showLoading: false }
  );
}
function handleFrontImgUrlChange(response: FileItem) {
  // userCredentialVerifyOcrIDCard(response, {
  //   onSuccess(res) {
  //     if (res.realName) form.legalPersonName = res.realName;
  //     if (res.idcardNum) form.legalPersonIdNumber = res.idcardNum;
  //   },
  // });
}
function handleSubmit() {
  if (!formRef.value) return;
  formRef.value.validate().then(({ valid, errors }: any) => {
    if (valid) {
      // submit();
    }
  });
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
.authenticationRealName-page-wrapper {
  .photograph-wrapper {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
  }
}
</style>
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/authenticationRealName.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/cMiniApp/src/subpackages/authentication/authenticationRealName/authenticationRealName.vue
New file
@@ -0,0 +1,14 @@
<template>
  <PageLayout title="实名认证" class="authenticationRealName-page-wrapper" hasBorder>
    <InnerPage />
  </PageLayout>
</template>
<script setup lang="ts">
import { PageLayout } from '@/components';
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'authenticationRealName',
});
</script>
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -5,7 +5,7 @@
        <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="请输入姓名" disabled />
        <nut-input v-model.trim="form.name" placeholder="请输入姓名" />
      </nut-form-item>
      <nut-form-item label="手机号:" class="bole-form-item" prop="contactPhoneNumber" required>
        <nut-input v-model.trim="form.contactPhoneNumber" placeholder="请输入手机号" type="text" />
apps/cMiniApp/src/subpackages/mine/mineCollectTask/InnerPage.vue
@@ -21,6 +21,7 @@
        :benefits="item.benefits"
        :show-actions="true"
        :release-status="item.releaseStatus"
        :hireStatus="item.hireStatus"
        @apply="goTaskDetail"
      >
      </TaskCard>
apps/cMiniApp/src/subpackages/task/components/CompanyInfo.vue
@@ -3,33 +3,32 @@
    <div v-if="isCertified" class="companyInfo-info-wrapper">
      <div class="companyInfo-info-item">
        <div class="companyInfo-info-item-label">企业名称</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail.enterpriseName }}</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail?.enterpriseName }}</div>
      </div>
      <div class="companyInfo-info-item">
        <div class="companyInfo-info-item-label">统一社会信用代码</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail.societyCreditCode }}</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail?.societyCreditCode }}</div>
      </div>
      <div class="companyInfo-info-item">
        <div class="companyInfo-info-item-label">注册资本</div>
        <div class="companyInfo-info-item-content">捌佰万元整</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail?.registeredCapital }}</div>
      </div>
      <div class="companyInfo-info-item">
        <div class="companyInfo-info-item-label">企业类型</div>
        <div class="companyInfo-info-item-content">有限责任公司(自然人投资或控股 的法人独资)</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail?.enterpriseType }}</div>
      </div>
      <div class="companyInfo-info-item">
        <div class="companyInfo-info-item-label">成立日期</div>
        <div class="companyInfo-info-item-content">2024年11月11日</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail?.establishmentDate }}</div>
      </div>
      <div class="companyInfo-info-item">
        <div class="companyInfo-info-item-label">企业地址</div>
        <div class="companyInfo-info-item-content">江西省九江市共青城市xx路xx号xx xxxx</div>
        <div class="companyInfo-info-item-content">{{ enterpriseDetail?.address }}</div>
      </div>
      <div class="companyInfo-info-item">
        <div class="companyInfo-info-item-label">经营范围</div>
        <div class="companyInfo-info-item-content">
          我是营业执照上的经营范围信息我 是营业执照上的经营范围信息我是
          营业执照上的经营范围信息我是营 业执照上的经营范围信息我是营业 执照上的经营范围信息
          {{ enterpriseDetail?.mainBusiness }}
        </div>
      </div>
    </div>
apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
@@ -41,7 +41,7 @@
            :unit="BillingMethodEnumUnit[detail.billingMethod]"
          />
        </div>
        <div class="taskDetail-address-wrapper">
        <div class="taskDetail-address-wrapper" @click="goMap">
          <div class="taskDetail-address-title-wrapper">
            <img :src="IconLocaltion" class="taskDetail-address-title-icon" />
            <div class="taskDetail-address-title">{{ detail?.addressName ?? '' }}</div>
@@ -275,4 +275,12 @@
    url: `${RouterPath.taskSubmitCheck}?id=${id}`,
  });
}
function goMap() {
  Taro.openLocation({
    latitude: detail.value?.latitude,
    longitude: detail.value?.longitude,
    scale: 18,
  });
}
</script>
packages/components/src/Avatar/Avatar.vue
@@ -1,6 +1,7 @@
<template>
  <nut-avatar class="pro-avatar">
    <img :class="['avatar-img', imgClass]" :src="_src" />
    <!-- <img :class="['avatar-img', imgClass]" :src="_src" /> -->
    <div class="avatar-img-div" :style="{ backgroundImage: `url(${_src})` }"></div>
  </nut-avatar>
</template>
@@ -32,4 +33,11 @@
.pro-avatar {
  overflow: hidden;
}
.avatar-img-div {
  width: 100%;
  height: 100%;
  background-size: cover;
  background-position: center;
}
</style>
packages/components/src/Calendar/Calendar.vue
@@ -1,13 +1,8 @@
<template>
  <div class="bole-calendar-wrapper">
    <div :class="['bole-calendar-inner', { isCollapse }]">
      <nut-calendar-card
        v-model="model"
        class="bole-calendar"
        ref="calendar"
        @change="handleChange"
      ></nut-calendar-card>
    </div>
    <scroll-view :enhanced="true" :scroll-y="true" :class="['bole-calendar-inner', { isCollapse }]">
      <nut-calendar-card v-model="model" class="bole-calendar"></nut-calendar-card>
    </scroll-view>
    <div :class="['bole-calendar-arrow', { active: !isCollapse }]" @click="toggle">
      <DownArrow :size="12" :class="['bole-calendar-arrow-icon']" />
    </div>
@@ -16,8 +11,9 @@
<script setup lang="ts">
import { DownArrow } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro';
import { useToggle } from 'senin-mini/hooks';
import { ref, watch } from 'vue';
import { onMounted, ref, watch } from 'vue';
defineOptions({
  name: 'Calendar',
@@ -30,11 +26,20 @@
const { isCollapse, toggle } = useToggle(true);
const calendar = ref();
function handleChange(value) {
  console.log('value: ', value);
  console.log('calendar: ', calendar.value);
}
onMounted(() => {
  const query = Taro.createSelectorQuery();
  query.select('.nut-calendarcard-day.current.active').boundingClientRect();
  query.select('.bole-calendar-inner').boundingClientRect();
  query.select('.bole-calendar-inner').node();
  query.exec(function (res) {
    const calendarWindowHeight = res[1].height + res[1].top;
    const currentDayWindowHeight = res[0].height + res[0].top;
    if (currentDayWindowHeight > calendarWindowHeight) {
      const scrollView = res[2].node;
      scrollView?.scrollIntoView?.('.nut-calendarcard-day.current.active');
    }
  });
});
</script>
<style lang="scss">
packages/components/src/Card/FlexJobCard.vue
@@ -14,7 +14,7 @@
      {{ workExperience }}
    </div>
    <div class="flexJob-card-done-detail" v-if="showDoneDetail">
      <div class="flexJob-card-done-detail-item">{{ workSeniority && `${workSeniority}年` }}</div>
      <div class="flexJob-card-done-detail-item">{{ workSeniority }}</div>
      <!-- <div class="flexJob-card-done-detail-item">{{ '在「宁波雷迪森酒店」,做过客房服务员' }}</div> -->
    </div>
    <div class="flexJob-card-footer">
packages/components/src/Image/PreviewImage.vue
@@ -1,6 +1,12 @@
<template>
  <div :class="['preview-image-wrapper', wrapperClassName]">
    <Image @tap="handeClick" :mode="mode" :src="src" v-bind="$attrs" />
    <!-- <Image @tap="handeClick" :mode="mode" :src="src" v-bind="$attrs" /> -->
    <div
      class="preview-image-div"
      :style="{ backgroundImage: `url(${src})` }"
      v-bind="$attrs"
      @tap="handeClick"
    ></div>
  </div>
</template>
@@ -29,7 +35,6 @@
  () => props.src,
  () => {
    if (props.src) {
      console.log('props.src: ', props.src);
      Taro.getImageInfo({
        src: props.src,
        success(result) {
@@ -64,5 +69,12 @@
  width: 100%;
  height: 100%;
  overflow: hidden;
  .preview-image-div {
    width: 100%;
    height: 100%;
    background-size: cover;
    background-position: center;
  }
}
</style>
packages/constants/apiEnum.ts
@@ -27,6 +27,16 @@
  HumanResources = 10,
}
/** 数据库审计日志操作 */
export enum EnumDbAuditOperate {
  /**添加 */
  Added = 10,
  /**修改 */
  Modified = 20,
  /**删除 */
  Deleted = 30,
}
/** 企业实名方式 */
export enum EnumEnterpriseRealMethod {
  /**企业三要素 */
@@ -137,26 +147,30 @@
  FileUtils = 4,
  /**文字识别 */
  OcrUtils = 5,
  /**日志记录 */
  LogRecords = 6,
  /**用户认证 */
  Auth = 6,
  Auth = 7,
  /**用户菜单 */
  Menu = 7,
  Menu = 8,
  /**用户资源 */
  Resource = 8,
  Resource = 9,
  /**用户角色 */
  Role = 9,
  Role = 10,
  /**用户信息 */
  User = 10,
  User = 11,
  /**用户简历 */
  UserResume = 11,
  UserResume = 12,
  /**企业信息 */
  Enterprise = 12,
  Enterprise = 13,
  /**灵工信息 */
  EnterpriseEmployee = 13,
  EnterpriseEmployee = 14,
}
/** 资源请求方式 */
export enum EnumResourceMethod {
  /**无 */
  None = 0,
  /**查询 */
  Get = 10,
  /**提交 */
packages/hooks/enterprise.ts
@@ -1,5 +1,5 @@
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import * as enterpriseServices from '@12333/services/apiV2/enterprise';
import * as taskServices from '@12333/services/apiV2/task';
import { MaybeRef, unref } from 'vue';
type UseEnterpriseDetailOptions = {
@@ -8,16 +8,16 @@
export function useEnterpriseDetail({ id }: UseEnterpriseDetailOptions) {
  const { data, refetch, isLoading, isError } = useQuery({
    queryKey: ['enterpriseServices/getEnterprise', id],
    queryKey: ['taskServices/getTaskEnterprise', id],
    queryFn: async () => {
      return await enterpriseServices.getEnterprise(
      return await taskServices.getTaskEnterprise(
        { id: unref(id) },
        {
          showLoading: false,
        }
      );
    },
    placeholderData: () => ({} as API.GetEnterpriseQueryResult),
    placeholderData: () => ({} as API.GetTaskEnterpriseQueryResult),
  });
  return {
packages/hooks/task.ts
@@ -72,10 +72,13 @@
          rows: 20,
          page: pageParam,
          orderInput: [
            queryState.orderType === HomeOrderType.Recommend
              ? { property: 'recommendStatus', order: EnumPagedListOrder.Desc }
              : { property: 'createdTime', order: EnumPagedListOrder.Desc },
          ],
            queryState.orderType === HomeOrderType.Recommend && {
              property: 'recommendTime',
              order: EnumPagedListOrder.Desc,
            },
            { property: 'createdTime', order: EnumPagedListOrder.Desc },
            { property: 'releaseStatus', order: EnumPagedListOrder.Asc },
          ].filter(Boolean),
        },
        keywords: queryState.searchValueTrim,
        cityCode: unref(cityCode),
packages/services/apiV2/index.ts
@@ -6,29 +6,31 @@
import * as user from './user';
import * as role from './role';
import * as enterprise from './enterprise';
import * as resource from './resource';
import * as task from './task';
import * as ocrUtils from './ocrUtils';
import * as dictionary from './dictionary';
import * as userResume from './userResume';
import * as auth from './auth';
import * as taskCheckReceive from './taskCheckReceive';
import * as resource from './resource';
import * as taskUser from './taskUser';
import * as menu from './menu';
import * as logRecords from './logRecords';
import * as fileUtils from './fileUtils';
export default {
  enterpriseEmployee,
  user,
  role,
  enterprise,
  resource,
  task,
  ocrUtils,
  dictionary,
  userResume,
  auth,
  taskCheckReceive,
  resource,
  taskUser,
  menu,
  logRecords,
  fileUtils,
};
packages/services/apiV2/logRecords.ts
New file
@@ -0,0 +1,69 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 查询数据库审计日志分页列表 POST /api/common/logRecords/getDbAuditLogs */
export async function getDbAuditLogs(body: API.GetDbAuditLogsQuery, options?: API.RequestConfig) {
  return request<API.GetDbAuditLogsQueryResult>('/api/common/logRecords/getDbAuditLogs', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 异常日志分页列表查询 POST /api/common/logRecords/getExceptionLogs */
export async function getExceptionLogs(
  body: API.GetExceptionLogsQuery,
  options?: API.RequestConfig
) {
  return request<API.GetExceptionLogsQueryResult>('/api/common/logRecords/getExceptionLogs', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 资源日志分页列表查询 POST /api/common/logRecords/getResourceLogs */
export async function getResourceLogs(body: API.GetResourceLogsQuery, options?: API.RequestConfig) {
  return request<API.GetResourceLogsQueryResult>('/api/common/logRecords/getResourceLogs', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 跟踪Id日志查询 GET /api/common/logRecords/getTraceIdLog */
export async function getTraceIdLog(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetTraceIdLogParams,
  options?: API.RequestConfig
) {
  return request<API.GetTraceIdLogQueryResult>('/api/common/logRecords/getTraceIdLog', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
/** 重新发送资源 POST /api/common/logRecords/resendResource */
export async function resendResource(body: API.ResendResourceCommand, options?: API.RequestConfig) {
  return request<string>('/api/common/logRecords/resendResource', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
packages/services/apiV2/resource.ts
@@ -2,6 +2,23 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 健康校验 GET /api/user/resource/checkHealth */
export async function checkHealth(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIcheckHealthParams,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/user/resource/checkHealth', {
    method: 'GET',
    params: {
      ...params,
      request: undefined,
      ...params['request'],
    },
    ...(options || {}),
  });
}
/** 获取资源字段 GET /api/user/resource/getResourceFields */
export async function getResourceFields(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
packages/services/apiV2/task.ts
@@ -83,6 +83,21 @@
  );
}
/** 查询任务企业信息 GET /api/flexjob/task/getTaskEnterprise */
export async function getTaskEnterprise(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetTaskEnterpriseParams,
  options?: API.RequestConfig
) {
  return request<API.GetTaskEnterpriseQueryResult>('/api/flexjob/task/getTaskEnterprise', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
/** 查询任务详情 GET /api/flexjob/task/getTaskInfo */
export async function getTaskInfo(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
packages/services/apiV2/typings.d.ts
@@ -3,6 +3,11 @@
    [key: string]: any;
  }
  interface APIcheckHealthParams {
    /** 健康校验 */
    request?: CheckHealthQuery;
  }
  interface APIgetAliyunOSSAcsParams {
    /** 获取阿里云OSS授权信息 */
    request?: GetAliyunOSSAcsQuery;
@@ -144,6 +149,11 @@
    roleId?: string;
  }
  interface APIgetTaskEnterpriseParams {
    /** 企业Id */
    id?: string;
  }
  interface APIgetTaskInfoParams {
    /** Id */
    id?: string;
@@ -154,6 +164,11 @@
    taskInfoId?: string;
    /** 用户Id(C端用户可不填) */
    userId?: string;
  }
  interface APIgetTraceIdLogParams {
    /** 跟踪Id */
    traceId?: string;
  }
  interface APIgetUserInfoRolesParams {
@@ -242,6 +257,8 @@
    verifyCode: string;
  }
  type CheckHealthQuery = Record<string, any>;
  interface CheckReceiveTaskCommand {
    /** 提交Id */
    id?: string;
@@ -328,6 +345,15 @@
  enum EnumDataSource {
    /**818 */
    HumanResources = 10,
  }
  enum EnumDbAuditOperate {
    /**添加 */
    Added = 10,
    /**修改 */
    Modified = 20,
    /**删除 */
    Deleted = 30,
  }
  enum EnumEnterpriseRealMethod {
@@ -429,25 +455,29 @@
    FileUtils = 4,
    /**文字识别 */
    OcrUtils = 5,
    /**日志记录 */
    LogRecords = 6,
    /**用户认证 */
    Auth = 6,
    Auth = 7,
    /**用户菜单 */
    Menu = 7,
    Menu = 8,
    /**用户资源 */
    Resource = 8,
    Resource = 9,
    /**用户角色 */
    Role = 9,
    Role = 10,
    /**用户信息 */
    User = 10,
    User = 11,
    /**用户简历 */
    UserResume = 11,
    UserResume = 12,
    /**企业信息 */
    Enterprise = 12,
    Enterprise = 13,
    /**灵工信息 */
    EnterpriseEmployee = 13,
    EnterpriseEmployee = 14,
  }
  enum EnumResourceMethod {
    /**无 */
    None = 0,
    /**查询 */
    Get = 10,
    /**提交 */
@@ -724,6 +754,24 @@
    timestamp?: number;
  }
  interface FriendlyResultGetDbAuditLogsQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetDbAuditLogsQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetEnterpriseElectronSignSettingQueryResult {
    /** 跟踪Id */
    traceId?: string;
@@ -822,6 +870,24 @@
    /** 错误码 */
    errorCode?: string;
    data?: GetEnterpriseSmsSettingQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetExceptionLogsQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetExceptionLogsQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
@@ -976,6 +1042,24 @@
    timestamp?: number;
  }
  interface FriendlyResultGetResourceLogsQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetResourceLogsQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetRoleQueryResult {
    /** 跟踪Id */
    traceId?: string;
@@ -984,6 +1068,24 @@
    /** 错误码 */
    errorCode?: string;
    data?: GetRoleQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetTaskEnterpriseQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetTaskEnterpriseQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
@@ -1056,6 +1158,24 @@
    /** 错误码 */
    errorCode?: string;
    data?: GetTaskUsersQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetTraceIdLogQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetTraceIdLogQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
@@ -1820,6 +1940,41 @@
  type GetCurrentLogierMenusQuery = Record<string, any>;
  interface GetDbAuditLogsQuery {
    /** 跟踪Id */
    traceId?: string;
    /** 关键字 */
    keywords?: string;
    /** 创建时间-起始 */
    createdTimeBegin?: string;
    /** 创建时间-截止 */
    createdTimeEnd?: string;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetDbAuditLogsQueryResult {
    pageModel?: PagedListQueryResultPageModel;
    /** 数据 */
    data?: GetDbAuditLogsQueryResultItem[];
  }
  interface GetDbAuditLogsQueryResultItem {
    /** 表名 */
    tableName?: string;
    /** 主键 */
    primaryKey?: string;
    operate?: EnumDbAuditOperate;
    /** 旧值 */
    oldValues?: string;
    /** 新值 */
    newValues?: string;
    /** 操作人Id */
    createdUserId?: string;
    createdUser?: GetResourceLogsQueryResultItemCreatedUser;
    /** 创建时间 */
    createdTime?: string;
  }
  interface GetDictionaryCategoriesQuery {
    /** 关键字 */
    keywords?: string;
@@ -2135,6 +2290,40 @@
    industryTypeContent?: string;
    /** 是否已配置 */
    isConfigured?: boolean;
  }
  interface GetExceptionLogsQuery {
    /** 跟踪Id */
    traceId?: string;
    /** 关键字 */
    keywords?: string;
    /** 创建时间-起始 */
    createdTimeBegin?: string;
    /** 创建时间-截止 */
    createdTimeEnd?: string;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetExceptionLogsQueryResult {
    pageModel?: PagedListQueryResultPageModel;
    /** 数据 */
    data?: GetExceptionLogsQueryResultItem[];
  }
  interface GetExceptionLogsQueryResultItem {
    /** 类型 */
    type?: string;
    /** 代码 */
    code?: string;
    /** 消息 */
    message?: string;
    /** 堆栈跟踪 */
    stackTrace?: string;
    /** 操作人Id */
    createdUserId?: string;
    createdUser?: GetResourceLogsQueryResultItemCreatedUser;
    /** 创建时间 */
    createdTime?: string;
  }
  interface GetLicenseOcrCommandResult {
@@ -2553,6 +2742,71 @@
    name?: string;
  }
  interface GetResourceLogsQuery {
    /** 跟踪Id */
    traceId?: string;
    /** 关键字 */
    keywords?: string;
    /** 创建时间-起始 */
    createdTimeBegin?: string;
    /** 创建时间-截止 */
    createdTimeEnd?: string;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetResourceLogsQueryResult {
    pageModel?: PagedListQueryResultPageModel;
    /** 数据 */
    data?: GetResourceLogsQueryResultItem[];
  }
  interface GetResourceLogsQueryResultItem {
    /** Id */
    id?: string;
    method?: EnumResourceMethod;
    /** 域名 */
    domain?: string;
    /** 地址 */
    path?: string;
    /** 请求头 */
    requestHeaders?: string;
    /** 请求参数 */
    request?: string;
    /** 请求头 */
    responseHeaders?: string;
    /** 响应结果 */
    response?: string;
    /** 是否成功 */
    isSuccess?: boolean;
    /** 客户端IP地址 */
    clientIpAddress?: string;
    /** 来源地址 */
    refererUrl?: string;
    /** 控制台日志 */
    consoleLogs?: string;
    /** 耗时毫秒数 */
    elapsedMilliseconds?: number;
    /** 操作人Id */
    createdUserId?: string;
    createdUser?: GetResourceLogsQueryResultItemCreatedUser;
    /** 创建时间 */
    createdTime?: string;
  }
  interface GetResourceLogsQueryResultItemCreatedUser {
    /** Id */
    id?: string;
    type?: EnumUserType;
    /** 姓名 */
    name?: string;
    /** 用户名 */
    userName?: string;
    /** 企业Id */
    enterpriseId?: string;
    /** 企业全称 */
    enterpriseName?: string;
  }
  interface GetResourcesQueryResultItem {
    /** Id */
    id?: string;
@@ -2639,6 +2893,27 @@
    isChecked?: boolean;
  }
  interface GetTaskEnterpriseQueryResult {
    /** 企业全称 */
    enterpriseName?: string;
    /** 统一社会信用代码 */
    societyCreditCode?: string;
    /** 是否实名 */
    isReal?: boolean;
    /** 企业类型 */
    enterpriseType?: string;
    /** 注册资本 */
    registeredCapital?: string;
    /** 成立日期 */
    establishmentDate?: string;
    /** 企业地址 */
    address?: string;
    /** 经营范围 */
    mainBusiness?: string;
    /** 在招岗位数量 */
    taskCount?: number;
  }
  interface GetTaskInfoQueryResult {
    /** Id */
    id?: string;
@@ -2648,6 +2923,8 @@
    enterpriseName?: string;
    /** 联系电话 */
    contactPhoneNumber?: string;
    /** 是否认证 */
    isReal?: boolean;
    /** 在招岗位数量 */
    taskCount?: number;
    /** 报名人数 */
@@ -2808,6 +3085,8 @@
    checkReceiveStatus?: EnumTaskCheckReceiveStatus;
    settlementStatus?: EnumTaskSettlementStatus;
    recommendStatus?: EnumTaskRecommendStatus;
    /** 推荐时间 */
    recommendTime?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 发布时间 */
    createdTime?: string;
@@ -2877,6 +3156,15 @@
    /** 工作经验 */
    workExperience?: string;
    hireStatus?: EnumTaskUserHireStatus;
  }
  interface GetTraceIdLogQueryResult {
    /** 资源日志 */
    resourceLogs?: GetResourceLogsQueryResultItem[];
    /** 异常日志 */
    exceptionLogs?: GetExceptionLogsQueryResultItem[];
    /** 数据库审计日志 */
    dbAuditLogs?: GetDbAuditLogsQueryResultItem[];
  }
  interface GetUserInfoRolesQueryResultItem {
@@ -3262,6 +3550,11 @@
    phoneNumber: string;
    /** 验证码 */
    verifyCode: string;
  }
  interface ResendResourceCommand {
    /** 资源日志Id */
    id?: string;
  }
  interface SaveDictionaryCategoryCommand {
@@ -3785,6 +4078,25 @@
  type SyncHumanResourcesAreaDictionaryDataCommand = Record<string, any>;
  interface SyncOperationUserCommand {
    dataSource?: EnumDataSource;
    /** 数据来源Id */
    dataSourceId?: string;
    /** 姓名 */
    name?: string;
    /** 用户名 */
    userName: string;
    /** 手机号 */
    phoneNumber?: string;
    /** 密码 */
    password?: string;
    /** 园区Id */
    industrialParkIds?: string[];
    status?: EnumUserStatus;
    /** 备注 */
    remark?: string;
  }
  interface UpdatePhoneNumberVerifyCodeCommand {
    /** 手机号码 */
    phoneNumber: string;
packages/services/apiV2/user.ts
@@ -112,3 +112,18 @@
    ...(options || {}),
  });
}
/** 同步运营用户 POST /api/user/user/syncOperationUser */
export async function syncOperationUser(
  body: API.SyncOperationUserCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/user/syncOperationUser', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}