Ver Fonte

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner into dev

zhengnaiwen_citu há 6 meses atrás
pai
commit
7ed455d3c7
31 ficheiros alterados com 222 adições e 76 exclusões
  1. 2 0
      .env.localDev
  2. 2 2
      src/api/enterprise.js
  3. 3 2
      src/api/recruit/enterprise/enterpriseInvite.js
  4. 1 1
      src/components/Enterprise/components/positions.vue
  5. 37 0
      src/components/VerificationCode/index.vue
  6. 1 1
      src/components/personalRecharge/initPay.vue
  7. 1 4
      src/layout/personal/navBar.vue
  8. 23 1
      src/router/modules/components/recruit/enterprise.js
  9. 1 2
      src/store/user.js
  10. 6 2
      src/views/login/components/editPassword.vue
  11. 3 2
      src/views/login/components/editPasswordEnt.vue
  12. 42 13
      src/views/login/components/passwordPage.vue
  13. 7 2
      src/views/login/forgotPassword.vue
  14. 7 1
      src/views/login/forgotPasswordEnt.vue
  15. 4 3
      src/views/login/index.vue
  16. 3 3
      src/views/recruit/entRegister/register.vue
  17. 4 4
      src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/basicInfo.vue
  18. 6 7
      src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/businessInformation.vue
  19. 6 1
      src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/enterpriseAlbum.vue
  20. 13 0
      src/views/recruit/enterprise/jobFair/index.vue
  21. 1 1
      src/views/recruit/enterprise/positionManagement/index.vue
  22. 6 2
      src/views/recruit/enterprise/search/recommend/index.vue
  23. 3 0
      src/views/recruit/enterprise/search/retrieval/index.vue
  24. 11 1
      src/views/recruit/enterprise/staffChangePassword/index.vue
  25. 13 4
      src/views/recruit/enterprise/systemManagement/groupAccount/inviteConfirm.vue
  26. 10 9
      src/views/recruit/personal/home/components/advertisement/dynamic/intercontinental.vue
  27. 2 2
      src/views/recruit/personal/home/components/homeJobTypeCard/index.vue
  28. 1 1
      src/views/recruit/personal/home/index.vue
  29. 0 1
      src/views/recruit/personal/position/components/conditionFilter.vue
  30. 2 3
      src/views/recruit/personal/position/components/conditionFilter/commonPath.vue
  31. 1 1
      src/views/recruit/personal/position/components/details.vue

+ 2 - 0
.env.localDev

@@ -4,9 +4,11 @@ VITE_APP_TITLE = 门墩儿
 
 # 访问路径
 VITE_ACCESS_BASE_URL = 'http://localhost:3000'
+#VITE_ACCESS_BASE_URL = 'https://www.menduner.com'
 
 # 请求路径
 VITE_BASE_URL = 'http://192.168.3.80'
+#VITE_BASE_URL = 'https://www.menduner.com'
 
 # 预览路径
 VITE_PREVIEW_URL = 'http://192.168.3.91:8012'

+ 2 - 2
src/api/enterprise.js

@@ -126,9 +126,9 @@ export const updateEnterpriseAlbum = async (data) => {
 }
 
 // 招聘端-企业信息-修改营业执照信息
-export const updateEnterpriseBusiness = async (data) => {
+export const saveEnterpriseBusiness = async (data) => {
   return await request.post({
-    url: '/app-api/menduner/system/recruit/enterprise/business/update',
+    url: '/app-api/menduner/system/recruit/enterprise/business/save',
     data
   })
 }

+ 3 - 2
src/api/recruit/enterprise/enterpriseInvite.js

@@ -24,9 +24,10 @@ export const enterpriseInviteRefresh = async (code) => {
 }
 
 // 同意加入
-export const enterpriseInviteRecordConsent = async (code) => {
+export const enterpriseInviteRecordConsent = async (params) => {
   return await request.post({
-    url: `/app-api/menduner/system/recruit/enterprise-invite-record/consent?code=${code}`
+    url: '/app-api/menduner/system/recruit/enterprise-invite-record/consent',
+    params
   })
 }
 

+ 1 - 1
src/components/Enterprise/components/positions.vue

@@ -298,7 +298,7 @@ const loginClose = () => {
 }
 .name {
   position: relative;
-  max-width: 200px;
+  max-width: 30vw;
   margin-right: 8px;
   overflow: hidden;
   text-overflow: ellipsis;

+ 37 - 0
src/components/VerificationCode/index.vue

@@ -1,6 +1,17 @@
 <template>
   <div>
     <v-form @submit.prevent ref="phoneForm">
+      <v-text-field
+        v-if="props.showEmailInput"
+        v-model="loginData.email"
+        placeholder="请输入企业邮箱"
+        color="primary"
+        variant="outlined"
+        density="compact"
+        validate-on="input"
+        prepend-inner-icon="mdi-email"
+        :rules="emailRules"
+      ></v-text-field>
       <v-text-field v-model="loginData.phone" counter="11" :disabled="props.phoneDisabled" :placeholder="$t('login.mobileNumberPlaceholder')" color="primary" variant="outlined" density="compact" :rules="phoneRules" validate-on="input">
         <template v-slot:prepend-inner>
           <span class="d-flex">
@@ -42,6 +53,7 @@
 defineOptions({ name: 'verification-code' })
 import { ref, reactive } from 'vue'
 import { setCodeTime } from '@/utils/code'
+import { checkEmail } from '@/utils/validate'
 import { sendSmsCode } from '@/api/common/index'
 import { useI18n } from '@/hooks/web/useI18n'
 import Snackbar from '@/plugins/snackbar'
@@ -51,6 +63,10 @@ const { t } = useI18n()
 const props = defineProps({
   phoneDisabled: Boolean,
   phone: String,
+  showEmailInput: { // 需要输入邮箱
+    type: Boolean,
+    default: false
+  },
   scene: { // 短信验证码scene参数: 30-手机号登陆  31-修改手机  32-修改密码  33-忘记密码
     type: [Number, String],
     default: 30
@@ -78,6 +94,17 @@ const codeValid = ref([
   }
 ])
 
+const emailRules = ref([
+  value => {
+    if (value) return true
+    return props.placeholder ? props.placeholder : '请输入企业邮箱'
+  },
+  value => {
+    if (checkEmail(value)) return true
+    return '请输入正确的企业邮箱'
+  }
+])
+
 // 手机号区域
 // const currentArea = ref('0086')
 // const items = [
@@ -135,6 +162,7 @@ const autoTimer = () => {
 autoTimer()
 const loginUserPhone = localStorage.getItem('loginUserPhone') || ''
 const loginData = reactive({
+  email: '',
   phone: loginUserPhone,
   code: ''
 })
@@ -144,7 +172,16 @@ const phoneForm = ref()
 const handleEnter = () => {
   emits('handleEnter')
 }
+
+const resetForm = () => {
+  loginData.email = ''
+  loginData.phone = ''
+  loginData.code = ''
+  count.value = 0
+}
+
 defineExpose({
+  resetForm, 
   loginData, 
   phoneForm
 })

+ 1 - 1
src/components/personalRecharge/initPay.vue

@@ -146,7 +146,7 @@ const getUnpaidOrderList = async () => {
     const params = {
       payPrice: (props.info.payPrice-0),
     }
-    if (!props.info.id?.includes('custom')) params.packageId = props.info.id
+    if (typeof props.info.id === 'string' && !props.info.id?.includes('custom')) params.packageId = props.info.id
     const data = await setWalletRecharge(params)
     payOrder.value = data || {}
     if (isQrCodePay.value) paySubmit()

+ 1 - 4
src/layout/personal/navBar.vue

@@ -223,14 +223,11 @@ const handleSwitch = async () => {
 
 // 切换提交
 const switchSubmit = async () => {
-  // await logout() // 先退出个人登录
   localStorage.setItem('enterpriseId', radios.value)
+  localStorage.setItem('emailLoginInfo', "false") // 先清空企业邮箱信息,避免求职切换招聘有邮箱登录信息遗留导致使用邮箱信息
 
   // 跳转企业路由 且验证是否已完善必填基本信息
   window.location.href = '/enterpriseVerification'
-
-  // 获取企业账号令牌以及企业用户个人信息
-  // await userStore.changeRole(radios.value)
 }
 
 const btnType = ref(0)

+ 23 - 1
src/router/modules/components/recruit/enterprise.js

@@ -303,7 +303,7 @@ const enterprise = [
     meta: {
       title: '财务中心',
       enName: 'system Management',
-      icon: 'mdi-account',
+      icon: 'mdi-finance',
       // isAdmin: true // 企业管理员菜单
     },
     children: [
@@ -332,6 +332,28 @@ const enterprise = [
         component: () => import('@/views/recruit/enterprise/invoiceManagement/index.vue')
       }
     ]
+  },
+  {
+    path: '/recruit/enterprise/jobFair',
+    component: Layout,
+    name: 'jobFair',
+    show: true, // 暂时隐藏
+    meta: {
+      title: '招聘会',
+      enName: 'Job Management',
+      icon: 'mdi-account-filter-outline'
+    },
+    children: [
+      {
+        path: '/recruit/enterprise/jobFair',
+        show: true,
+        meta: {
+          title: '招聘会',
+          enName: 'Job Fair'
+        },
+        component: () => import('@/views/recruit/enterprise/jobFair/index.vue')
+      }
+    ]
   }
 ]
 export default enterprise

+ 1 - 2
src/store/user.js

@@ -155,8 +155,6 @@ export const useUserStore = defineStore('user',
         if (res?.type === 'emailLogin') {
           data = res
         } else {
-          // 先退出个人登录
-          // await logout()
           const enterpriseId = localStorage.getItem('enterpriseId') || ''
           if (!enterpriseId) return Snackbar.error('切换失败,请重新登录!')
           data = await switchLoginOfEnterprise({ enterpriseId })
@@ -236,6 +234,7 @@ export const useUserStore = defineStore('user',
       async updatePasswordCheck () {
         const bool = await getEntUpdatePasswordCheck()
         if (bool) {
+          // 强制修改密码
           localStorage.setItem('entUpdatePassword', bool ? 'needChange' : 'doNotNeedChange')
         }
       }

+ 6 - 2
src/views/login/components/editPassword.vue

@@ -27,6 +27,7 @@
         @click:append-inner="show = !show"
       ></v-text-field>
     </v-form>
+    <slot name="custom"></slot>
     <div class="text-center mt-5">
       <v-btn v-if="showCancelBtn" class="mr-5" color="primary" variant="outlined" @click="handleClose">取 消</v-btn>
       <v-btn color="primary" :max-width="showCancelBtn ? 370 : 95" :min-width="showCancelBtn ? 95 : 370" @click="handleSubmit" :loading="loading">确认修改</v-btn>
@@ -72,9 +73,12 @@ const passwordType = ref(false)
 const phoneRef = ref()
 
 // 密码效验
-const regex = /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}$/
+// const regex = /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}$/
+// 请输入8-16位数由数字、大小写字母组成的密码
+
+const regex = /^[A-Za-z0-9]{8,}$/
 const validPassword = computed(() => {
-  return regex.test(query.password) || '请输入8-16位数由数字、大小写字母组成的密码'
+  return regex.test(query.password) || '请输入至少8位数的密码'
 })
 
 const confirmPassword = computed(() => {

+ 3 - 2
src/views/login/components/editPasswordEnt.vue

@@ -51,6 +51,7 @@
         @click:append-inner="show = !show"
       ></v-text-field>
     </v-form>
+    <slot name="custom"></slot>
     <div class="text-center mt-5">
       <!-- <v-btn v-if="showCancelBtn" class="mr-5" color="primary" variant="outlined" @click="handleClose">取 消</v-btn> -->
       <v-btn color="primary" style="width: 100%;" @click="handleSubmit" :loading="loading">确认修改</v-btn>
@@ -99,9 +100,9 @@ const loading = ref(false)
 const passwordType = ref(false)
 
 // 密码效验
-const regex = /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}$/
+const regex = /^[A-Za-z0-9]{8,}$/
 const validPassword = computed(() => {
-  return regex.test(query.password) || '请输入8-16位数由数字、大小写字母组成的密码'
+  return regex.test(query.password) || '请输入至少8位数的密码'
 })
 
 const confirmPassword = computed(() => {

+ 42 - 13
src/views/login/components/passwordPage.vue

@@ -1,7 +1,17 @@
 <template>
   <v-form ref="passwordForm" @submit.prevent>
-    <v-text-field v-model="loginData.phone" :disabled="props.phoneDisabled" :placeholder="placeholder ? placeholder : '请输入手机号码'" color="primary" 
-    variant="outlined" density="compact" :rules="phoneRules" validate-on="input" prepend-inner-icon="mdi-cellphone" >
+    <v-text-field
+      v-model="loginData.phone"
+      counter="11"
+      :disabled="props.phoneDisabled"
+      :placeholder="placeholder ? placeholder : '请输入手机号码'"
+      color="primary" 
+      variant="outlined"
+      density="compact"
+      :rules="phoneRules"
+      validate-on="input"
+      :prepend-inner-icon="props.validEmail ? 'mdi-email' : 'mdi-cellphone'"
+    >
       <!-- <template v-slot:prepend-inner>
         <span class="d-flex">
           <v-icon icon="mdi-cellphone" size="20"></v-icon>
@@ -28,37 +38,50 @@
       prepend-inner-icon="mdi-lock-outline" 
       :append-inner-icon="passwordType ? 'mdi-eye-outline' : 'mdi-eye-off-outline'"
       :type="passwordType ? 'text' : 'password'"
-      :rules="[v=> !!v || $t('login.enterPassword')]"
       @click:append-inner="passwordType = !passwordType"
+      :rules="[v=> !!v || $t('login.enterPassword'), validPassword]"
       @keyup.enter="handleEnter"
     ></v-text-field>
   </v-form>
 </template>
 
 <script setup name="passwordPage">
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed } from 'vue'
 defineOptions({ name: 'password-form' })
 import { checkEmail } from '@/utils/validate'
+import { useI18n } from '@/hooks/web/useI18n'
+const { t } = useI18n()
 
 const props = defineProps({ phoneDisabled: Boolean, placeholder: String, validEmail: Boolean })
 const passwordType = ref(false)
 const emits = defineEmits(['handleEnter'])
 
-const phoneRules = ref([
-  value => {
-    if (value) return true
-    return props.placeholder ? props.placeholder : '请输入手机号码'
-  }
-])
+const phoneRules = ref([]) // 区分企业邮箱和手机号2种方式登录校验
 
-// 邮箱效验
 if (props.validEmail) {
-  phoneRules.value.push(
+  // 邮箱效验
+  phoneRules.value = [
+    value => {
+      if (value) return true
+      return props.placeholder ? props.placeholder : '请输入企业邮箱'
+    },
     value => {
       if (checkEmail(value)) return true
       return '请输入正确的企业邮箱'
     }
-  )
+  ]
+} else {
+  // 手机号码效验
+  phoneRules.value = [
+    value => {
+      if (value) return true
+      return props.placeholder ? props.placeholder : '请输入手机号码'
+    },
+    value => {
+      if (value?.length <= 11 && /^1[3456789]\d{9}$/.test(value)) return true
+      return t('login.correctPhoneNumber')
+    }
+  ]
 }
 
 // 手机号区域
@@ -70,6 +93,12 @@ if (props.validEmail) {
 //   currentArea.value = e.value
 // }
 
+// 密码效验
+const regex = /^[A-Za-z0-9]{8,}$/
+const validPassword = computed(() => {
+  return regex.test(loginData.password) || '请输入至少8位数的密码'
+})
+
 const loginUserPhone = localStorage.getItem('loginUserPhone') || ''
 const loginData = reactive({
   phone: loginUserPhone, // 13229740092

+ 7 - 2
src/views/login/forgotPassword.vue

@@ -7,7 +7,13 @@
           {{ route.query.forgot ? '密码不安全,请重置密码' : '修改密码' }}
         </div>
       </div>
-      <editPasswordPage class="mt-5" :showCancelBtn="false" :isReset="true" @cancel="router.push('/login')"></editPasswordPage>
+      <editPasswordPage class="mt-5" :showCancelBtn="false" :isReset="true" @cancel="router.push('/login')">
+        <template #custom>
+          <div class="font-size-14 text-end">
+            <span class="color-primary cursor-pointer" @click="router.push('/login')">回到登录页</span>
+          </div>
+        </template>
+      </editPasswordPage>
     </div>
   </div>
 </template>
@@ -22,7 +28,6 @@ import { ref, onMounted } from 'vue'
 const router = useRouter()
 const route = useRoute()
 
-
 const isMobile = ref(false)
 onMounted(() => {
   const userAgent = navigator.userAgent

+ 7 - 1
src/views/login/forgotPasswordEnt.vue

@@ -5,7 +5,13 @@
       <div class="resume-header">
         <div class="resume-title">企业修改密码</div>
       </div>
-      <editPasswordPage class="mt-5" :showCancelBtn="false" :captchaVerification="captchaVerification" @getCode="getCode"  @cancel="router.push('/login')"></editPasswordPage>
+      <editPasswordPage class="mt-5" :showCancelBtn="false" :captchaVerification="captchaVerification" @getCode="getCode"  @cancel="router.push('/login')">
+        <template #custom>
+          <div class="font-size-14 text-end">
+            <span class="color-primary cursor-pointer" @click="router.push('/login')">回到登录页</span>
+          </div>
+        </template>
+      </editPasswordPage>
     </div>
   </div>
   <Verify

+ 4 - 3
src/views/login/index.vue

@@ -208,9 +208,9 @@ const tabChange = (val) => {
 // 轮播广告 // 轮播图片
 const carouselList = ref([
   { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/IHG-banner-new.gif' },
-  { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/Hilton.jpg'},
   { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/SWISS-HOTEL-MANAGEMENT-SCHOOL-MBA.jpg'},
-  { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/Hong-Kong-Polytechnic-University-banner.jpg' }
+  { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/Hong-Kong-Polytechnic-University-banner.jpg' },
+  { src: 'https://minio.menduner.com/dev/menduner/Grand-Mercure.jpg' }
 ])
 
 // 验证码
@@ -252,7 +252,8 @@ const verifySuccess = (params) => {
   align-items: center;
   justify-content: center;
   width: 100%;
-  height: 84vh;
+  // height: 84vh;
+  height: calc(100vh - 50px);
   margin-top: 50px;
 }
 .login-change {

+ 3 - 3
src/views/recruit/entRegister/register.vue

@@ -201,7 +201,7 @@ const formItems = ref({
       type: 'text',
       key: 'anotherName',
       value: '',
-      label: '企业称',
+      label: '企业展示名称',
       counter: 50,
       blur: saveRegisterInfo
     },
@@ -440,8 +440,8 @@ const passwordObj = {
       return '请输入账户登录密码'
     },
     value => {
-      if (/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}$/.test(value)) return true
-      return '请输入8-16位数由数字、大小写字母组成的密码'
+      if (/^[A-Za-z0-9]{8,}$/.test(value)) return true
+      return '请输入至少8位数的密码'
     }
   ],
 }

+ 4 - 4
src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/basicInfo.vue

@@ -64,8 +64,8 @@ const formItems = ref({
       key: 'anotherName',
       value: '',
       col: 6,
-      label: '企业别名 *',
-      rules: [v => !!v || '请输入企业别名']
+      label: '企业展示名称 *',
+      rules: [v => !!v || '请输入企业展示名称']
     },
     {
       type: 'text',
@@ -199,8 +199,9 @@ getDict('menduner_industry_type', {}, 'industryList').then(({ data }) => {
 // 获取基本信息
 const getBaseInfo = async () => {
   let completeCount = 0
+  const totalCount = formItems.value.options?.length || 0
   const data = await getEnterpriseBaseInfo()
-  if (!data) return
+  if (!data || !Object.keys(data).length) return emit('complete', { totalCount, completeCount, id: 'basicInfo' }) // 完成度展示
   query.id = data.id
   formItems.value.options.forEach(item => {
     if (item.dictTypeName) {
@@ -219,7 +220,6 @@ const getBaseInfo = async () => {
     if (!item.rules || (item.value !== undefined && item.value !== null && item.value !== '')) completeCount++
   })
   // 完成度展示
-  const totalCount = formItems.value.options?.length || 0
   emit('complete', { totalCount, completeCount, id: 'basicInfo' })
 }
 getBaseInfo()

+ 6 - 7
src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/businessInformation.vue

@@ -35,7 +35,7 @@
 
 <script setup>
 import CtForm from '@/components/CtForm'
-import { getEnterpriseBusiness, updateEnterpriseBusiness } from '@/api/enterprise'
+import { getEnterpriseBusiness, saveEnterpriseBusiness } from '@/api/enterprise'
 import Snackbar from '@/plugins/snackbar'
 import { reactive, ref } from 'vue'
 import { useI18n } from '@/hooks/web/useI18n'
@@ -201,7 +201,7 @@ const handleSave = async () => {
   })
   query.businessUrl = licenseUrl.value
   if (!query.establishmentTime) return Snackbar.warning('请选择成立时间')
-  await updateEnterpriseBusiness(query)
+  await saveEnterpriseBusiness(query)
   Snackbar.success('编辑成功')
   isUpdate = true
   getBaseInfo()
@@ -264,17 +264,16 @@ const handleDeleteImg = () => {
 
 // 获取基本信息
 const getBaseInfo = async () => {
-  let completeCount = 0
+  let completeCount = 0 // 非必填的需要completeCount++
   try {
     const data = await getEnterpriseBusiness()
-    if (data && Object.keys(data).length) completeFun(completeCount)
-    if (!data) return
+    if (!data || !Object.keys(data).length) return completeFun(completeCount)
     query.id = data.id
     formItems.value.options.forEach(item => {
-      if (item.noParam) return
+      if (item.noParam) return completeCount++
       item.value = data[item.key]
       // 完成度展示
-      if (!item.rules || (item.value !== undefined && item.value !== null && item.value !== '')) completeCount++
+      if (!item.rules?.length || (item.value !== undefined && item.value !== null && item.value !== '')) completeCount++
     })
     licenseUrl.value = data.businessUrl
     // 完成度展示

+ 6 - 1
src/views/recruit/enterprise/entInfoSetting/informationSettingsComponents/enterpriseAlbum.vue

@@ -47,6 +47,8 @@ import { useI18n } from '@/hooks/web/useI18n'
 import { getEnterpriseBaseInfo, updateEnterpriseAlbum } from '@/api/enterprise'
 import Snackbar from '@/plugins/snackbar'
 import Confirm from '@/plugins/confirm'
+import cloneDeep from 'lodash/cloneDeep'
+
 const emit = defineEmits(['complete'])
 
 const { t } = useI18n()
@@ -78,10 +80,13 @@ const handleClick = (index) => {
 const handleDelete = async (url) => {
   const index = imgList.value.indexOf(url)
   if (index === -1) return
+  const albumList = cloneDeep(imgList.value)
+  albumList.splice(index, 1)
   Confirm('系统提示', '是否确认删除?').then(async () => {
-    await updateEnterpriseAlbum({ albumList: imgList.value })
+    await updateEnterpriseAlbum({ albumList })
     Snackbar.success('删除成功')
     imgList.value.splice(index, 1)
+    getInfo()
   })
 }
 

+ 13 - 0
src/views/recruit/enterprise/jobFair/index.vue

@@ -0,0 +1,13 @@
+<template>
+  <v-card class="card-box pa-5">
+    111
+  </v-card>
+</template>
+
+<script setup>
+defineOptions({ name: 'jobFair'})
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 1 - 1
src/views/recruit/enterprise/positionManagement/index.vue

@@ -6,7 +6,7 @@
       </div>
       <div style="height: 40px">
         <div class="float-left color-666 font-size-14" style="line-height: 52px;">
-          <span>可发布职位数 <strong class="color-primary">{{ baseInfo?.entitlement?.publishJobCount || 0 }}</strong> 个 </span>|
+          <span>可发布职位数 <strong class="color-primary">{{ baseInfo?.entitlement?.publishJobCount || 0 }}</strong> 个 </span>
           <!-- <span> 已发布 <strong class="color-primary">{{ baseInfo?.entitlement?.publishJobCount ? (50 - baseInfo?.entitlement?.publishJobCount) : 0 }}</strong> 个 </span>|
           <span> 剩余 <strong class="color-primary">{{ baseInfo?.entitlement?.publishJobCount || 0 }}</strong> 个</span> -->
         </div>

+ 6 - 2
src/views/recruit/enterprise/search/recommend/index.vue

@@ -67,7 +67,7 @@ const query = ref({
 const selectItems = ref({
   label: '已发布职位',
   placeholder: '请选择已发布职位',
-  clearable: false,
+  clearable: true,
   width: 600,
   items: []
 })
@@ -120,8 +120,12 @@ const getData = async () => {
 
 // 推荐
 const handleChange = () => {
-  if (!query.value.jobId) return
   query.value.pageNo = 1
+  if (!query.value.jobId) {
+    items.value = []
+    total.value = 0
+    return
+  }
   getData()
 }
 

+ 3 - 0
src/views/recruit/enterprise/search/retrieval/index.vue

@@ -174,6 +174,9 @@ const handleClear = () => {
     expType: '',
     eduType: ''
   }
+  query.value.pageNo = 1
+  items.value = []
+  total.value = 0
   clear.value = true
 }
 

+ 11 - 1
src/views/recruit/enterprise/staffChangePassword/index.vue

@@ -7,7 +7,9 @@
     <CtForm ref="CtFormRef" :items="formItems" style="width: 700px;"></CtForm>
     <div class="mb-15">
       <v-btn class="buttons mt-5" color="primary" :loading="loading" @click.stop="handleCommit">保存</v-btn>
-      <v-btn v-if="!props.hideGoBack" class="mt-3" color="primary" variant="text" @click="router.go(-1)">返回</v-btn>
+      <div v-if="!props.hideGoBack" style="text-align: center;">
+        <v-btn class="mt-3" color="primary" variant="text" @click="router.go(-1)">返回</v-btn>
+      </div>
     </div>
   </v-card>
 
@@ -59,6 +61,10 @@ const formItems = ref({
         value => {
           if (!(/^[\s]+$/.test(value))) return true
           return '请输入新密码'
+        },
+        value => {
+          if (/^[A-Za-z0-9]{8,}$/.test(value)) return true
+          return '请输入至少8位数的密码'
         }
       ]
     },
@@ -75,6 +81,10 @@ const formItems = ref({
         value => {
           if (!(/^[\s]+$/.test(value))) return true
           return '请再次输入新密码'
+        },
+        value => {
+          if (/^[A-Za-z0-9]{8,}$/.test(value)) return true
+          return '请输入至少8位数的密码'
         }
       ]
     },

+ 13 - 4
src/views/recruit/enterprise/systemManagement/groupAccount/inviteConfirm.vue

@@ -14,11 +14,16 @@
       </div>
       <div class="mt-10 d-flex flex-column align-center">
         <template v-if="joinSuccess">
-          <div>加入成功!</div>
+          <div style="color: var(--v-primary-base); font-size: 18px; font-weight: bold;">加入成功!</div>
+          <!-- <div class="mt-3">您使用企业邮箱登录招聘端的初始密码为"邮箱账号",请尽快登录招聘端修改密码!</div> -->
+          <div class="mt-3">您使用企业邮箱登录招聘端的初始密码</div>
+          <div class="mt-2">为 <span style="color: var(--v-error-base);">"{{ joinPersonEmail }}"</span></div>
+          <div class="mt-2" style="color: var(--v-error-base);">请尽快登录招聘企业修改密码!</div>
+          <!-- <div class="mt-3">您使用企业邮箱登录招聘端的初始密码为"邮箱账号",请尽快登录招聘端修改密码!</div> -->
           <v-btn v-if="!isMobile" class="mt-10" color="warning" to="/recruitHome">{{ $t('common.toHome') }}</v-btn>
         </template>
         <template v-else>
-          <phoneFrom ref="phoneRef" @handleEnter="handleLogin" class="text-left" :style="{'width': isMobile ? '100%' : '350px' }"></phoneFrom>
+          <phoneFrom ref="phoneRef" showEmailInput @handleEnter="handleLogin" class="text-left" :style="{'width': isMobile ? '100%' : '350px' }"></phoneFrom>
           <v-btn :loading="loginLoading" color="warning" class="white--text mt-5" min-width="350" @click="handleLogin" :style="{'width': isMobile ? '100%' : '350px' }">
             {{ $t('common.confirmJoin') }}
           </v-btn>
@@ -67,6 +72,7 @@ onMounted(() => {
 const phoneRef = ref()
 const loginLoading = ref(false)
 
+let joinPersonEmail = ''
 let copyLoginData = ''
 let userId = ''
 // 登录
@@ -76,6 +82,7 @@ const handleLogin = async () => {
   loginLoading.value = true
   try {
     const params = { ...phoneRef.value.loginData, autoRegister: true } // 只能验证码登录
+    joinPersonEmail = params.email || ''
     // 如果用户登录后点击关闭填写简易人才信息,再次点击登录仅弹出填写,不再调用登录
     if (copyLoginData === (params.phone + params.code.toString()) && userId) {
       getUserBaseInfos(userId)
@@ -123,11 +130,13 @@ const getUserBaseInfos = async (userId) => {
 const join = async () => {
   loginLoading.value = true
   try {
-    await enterpriseInviteRecordConsent(code)
+    const params = { code, email: joinPersonEmail }
+    await enterpriseInviteRecordConsent(params)
     joinSuccess.value = true
     Snackbar.success('加入成功')
   } catch (error) {
-    Snackbar.error('加入失败! ' + error)
+    Snackbar.error('加入失败! ' + error + '请更换手机号')
+    if (phoneRef.value?.resetPhone) phoneRef.value.resetForm()
   } finally {
     if (isMobile.value) logoutFun() // 网页打开保留登录状态
     loginLoading.value = false

+ 10 - 9
src/views/recruit/personal/home/components/advertisement/dynamic/intercontinental.vue

@@ -1,12 +1,13 @@
 <template>
   <div class="default-width" style="position: relative;">
     <!-- 轮播图、logo -->
-    <div style="position: relative;">
+    <!-- <div style="position: relative;">
       <v-carousel show-arrows="hover" cycle>
         <v-carousel-item v-for="(k, i) in carouselList" :key="i" :lazy-src="k" :src="k" cover></v-carousel-item>
       </v-carousel>
       <v-img class="logo-png" src="https://minio.citupro.com/dev/menduner/preferredGroup/IHG-logo.png" width="152" height="72"></v-img>
-    </div>
+    </div> -->
+    <v-img src="https://minio.menduner.com/dev/menduner/IHG.gif" width="1184" height="500"></v-img>
     <!-- 集团简介 -->
     <div class="brief-introduction">
       <h2>集团简介</h2>
@@ -84,13 +85,13 @@ const queryParams = ref({
   enterpriseId: id
 })
 // 轮播图
-const carouselList = ref([
-  'https://minio.citupro.com/dev/menduner/carousel/8.jpg',
-  'https://minio.citupro.com/dev/menduner/carousel/3.jpg',
-  'https://minio.citupro.com/dev/menduner/carousel/9.jpg',
-  'https://minio.citupro.com/dev/menduner/carousel/2.jpg',
-  'https://minio.citupro.com/dev/menduner/carousel/1.jpg'
-])
+// const carouselList = ref([
+//   'https://minio.citupro.com/dev/menduner/carousel/8.jpg',
+//   'https://minio.citupro.com/dev/menduner/carousel/3.jpg',
+//   'https://minio.citupro.com/dev/menduner/carousel/9.jpg',
+//   'https://minio.citupro.com/dev/menduner/carousel/2.jpg',
+//   'https://minio.citupro.com/dev/menduner/carousel/1.jpg'
+// ])
 // 集团简介
 const briefIntroduction = [
   '洲际酒店集团(InterContinental Hotels Group, 简称IHG)无疑是全球酒店业中的领军企业之一,其广泛的品牌组合、庞大的酒店网络和忠诚客户计划都彰显了其在行业内的强大实力和影响力。',

+ 2 - 2
src/views/recruit/personal/home/components/homeJobTypeCard/index.vue

@@ -127,9 +127,9 @@ const handleMouseLeave = () => { // 鼠标移出
 // 轮播图片
 const carouselList = ref([
   { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/IHG-banner-new.gif' },
-  { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/Hilton.jpg'},
   { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/SWISS-HOTEL-MANAGEMENT-SCHOOL-MBA.jpg'},
-  { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/Hong-Kong-Polytechnic-University-banner.jpg' }
+  { src: 'https://minio.citupro.com/dev/menduner/preferredGroup/Hong-Kong-Polytechnic-University-banner.jpg' },
+  { src: 'https://minio.menduner.com/dev/menduner/Grand-Mercure.jpg' }
 ])
 </script>
 

+ 1 - 1
src/views/recruit/personal/home/index.vue

@@ -12,7 +12,7 @@
           <span>广告</span>
           <v-icon class="float-right cursor-pointer pb-1" color="primary" size="28" @click="showFullAdvertise = false">mdi-close</v-icon>
         </div>
-        <img class="advertise-img cursor-pointer" src="https://minio.citupro.com/dev/menduner/advertise.png" @click="handleOpenAdvertise">
+        <img class="advertise-img cursor-pointer" src="https://minio.menduner.com/dev/menduner/advertise-website-home.png" @click="handleOpenAdvertise">
       </div>
       <div v-else class="advertise-box cursor-pointer" @mouseenter="showFullAdvertise = true"></div>
     </div>

+ 0 - 1
src/views/recruit/personal/position/components/conditionFilter.vue

@@ -70,7 +70,6 @@ const list = shallowRef(props.showFilterList === 'all' ? filterList : props.show
 const inputChange = ({ idName: key, values }) => {
   const str = values.length ? values.join('_') : ''
   if (!key) return
-  //
   emits('change', key, str)
 }
 

+ 2 - 3
src/views/recruit/personal/position/components/conditionFilter/commonPath.vue

@@ -5,7 +5,7 @@
     <!-- 行业类型 -->
     <industryTypeCard v-if="idName === 'industryIds'" :select="selectIdArr" @handleClickIndustry="(value, item) => handle(item, value)"></industryTypeCard>
     <!-- 职位类型 -->
-    <jobTypeCard v-else-if="idName === 'positionId'" :select="selectIdArr" isSingle echo clearable @handleJobClick="value => handle(null, value)"></jobTypeCard>
+    <jobTypeCard v-else-if="idName === 'positionId'" :select="selectIdArr" isSingle echo @handleJobClick="value => handle(null, value)"></jobTypeCard>
     <v-list v-else>
       <v-list-item
         v-for="item in items" :key="item.id" :value="item[itemKey]"
@@ -90,8 +90,7 @@ const handle = (item, value) => {
     if (selectIdArr.value.includes(value)) {
       selectIdArr.value = selectIdArr.value.filter(i => i !== value)
     } else {
-      //
-      if (props.idName === 'expType') selectIdArr.value = value === '2' ? [value] : (selectIdArr.value.push(value) && selectIdArr.value.filter(i => i !== '2')) // 选中经验不限时清空其它选中项,选中其他的咬去掉经验不限
+      // if (props.idName === 'expType') selectIdArr.value = value === '2' ? [value] : (selectIdArr.value.push(value) && selectIdArr.value.filter(i => i !== '2')) // 选中经验不限时清空其它选中项,选中其他的咬去掉经验不限
       //
       if (props.isSingle) selectIdArr.value = [value] // 单选
       else selectIdArr.value.push(value)

+ 1 - 1
src/views/recruit/personal/position/components/details.vue

@@ -10,7 +10,7 @@
         </div>
       </div>
       
-      <div class="refresh-time text-end">{{ timesTampChange(info.updateTime) }} {{ $t('common.refresh') }} <v-icon color="warning" size="20">mdi-alert-outline</v-icon></div>
+      <div class="refresh-time text-end">{{ timesTampChange(info.updateTime) }} {{ $t('common.refresh') }} <v-icon color="primary" size="20">mdi-circle-medium</v-icon></div>
       <div class="banner-tags mt-4">
         <span v-for="k in desc" :key="k.mdi">
           <span v-if="positionInfo[k.value]" class="mr-10">