Browse Source

快速填写简易人才信息-弹窗

lifanagju_citu 6 tháng trước cách đây
mục cha
commit
ae60cf0312

+ 89 - 0
src/views/recruit/personal/home/components/simple.vue

@@ -0,0 +1,89 @@
+<!-- 快速填写-简易人才信息 -->
+<template>
+  <CtDialog
+    :visible="openDialog"
+    :widthType="2"
+    :closeText="closeText"
+    titleClass="text-h6"
+    title="补充基本信息"
+    :closeable="props.closeable"
+    @close="handleClose"
+    @submit="simpleInfoSubmit"
+  >
+    <simpleInfoForm ref="formRef"></simpleInfoForm>
+  </CtDialog>
+</template>
+
+<script setup>
+import { getToken } from '@/utils/auth'
+import simpleInfoForm from './simpleInfo.vue'
+import { savePersonSimpleInfo } from '@/api/recruit/personal/shareJob'
+import { useI18n } from '@/hooks/web/useI18n'; const { t } = useI18n()
+import Snackbar from '@/plugins/snackbar'
+import { ref } from 'vue'
+defineOptions({name: 'shareJob-sendResume-simple'})
+
+const emit = defineEmits(['simpleInfoReady', 'close'])
+const props = defineProps({
+  closeable: {
+    type: Boolean,
+    default: true
+  },
+  closeText: {
+    type: String,
+    default: '取消'
+  }
+})
+
+const openDialog = ref(false) // 默认不打开弹窗,先检验simpleInfoReady
+
+const handleClose = () => {
+  emit('close')
+  openDialog.value = props.closeable ? false : true
+}
+const showSimpleFun = () => {
+  if (!getToken()) return
+  openDialog.value = true // 不存在
+  Snackbar.warning('请先完善个人基本信息')
+}
+
+let verifyCount = 0
+const getUserInfoVerify = () => {
+  // console.log('获取人才信息->')
+  const bInfo = JSON.parse(localStorage.getItem('baseInfo'))
+  let simpleInfoReady = bInfo && Object.keys(bInfo).length
+  if (simpleInfoReady) { // 校验必填人才信息
+    // console.log('获取人才信息成功->')
+    const keyArr = ['name', 'phone', 'jobStatus', 'expType', 'eduType'] // 必填人才信息
+    simpleInfoReady = keyArr.every(e => bInfo[e] && bInfo[e] !== 0) // 校验必填人才信息
+    if (simpleInfoReady) {
+      emit('simpleInfoReady') // 存在
+    } else {
+      showSimpleFun()
+    }
+  } else {
+    if (verifyCount > 4) showSimpleFun() 
+    else {
+      verifyCount++
+      setTimeout(() => { getUserInfoVerify() }, 2000) // 获取人才信息
+    }
+  }
+}
+if (getToken()) setTimeout(() => { getUserInfoVerify() }, 2000) // 获取人才信息
+
+const formRef = ref()
+const simpleInfoSubmit = async () => {
+  try {
+    const obj = await formRef.value.getQuery()
+    if (!obj) return
+    await savePersonSimpleInfo(obj)
+    localStorage.setItem('baseInfo', JSON.stringify(obj))
+    openDialog.value = false
+    emit('simpleInfoReady')
+  } catch (error) {
+    console.error('error', error)
+  }
+}
+</script>
+<style lang="scss" scoped>
+</style>

+ 113 - 0
src/views/recruit/personal/home/components/simpleInfo.vue

@@ -0,0 +1,113 @@
+<template>
+  <div style="width: 100%;">
+    <CtForm ref="formPageRef" :items="items"></CtForm>
+  </div>
+</template>
+
+<script setup>
+import { getDict } from '@/hooks/web/useDictionaries'
+defineOptions({name: 'shareJob-form-baseInfo'})
+import { reactive, ref } from 'vue'
+
+const formPageRef = ref()
+let query = reactive({})
+
+const items = ref({
+  options: [
+    {
+      type: 'text',
+      key: 'name',
+      value: '',
+      default: null,
+      label: '姓名 *',
+      outlined: true,
+      rules: [v => !!v || '请输入姓名']
+    },
+    {
+      type: 'phoneNumber',
+      key: 'phone',
+      value: '',
+      clearable: true,
+      label: '联系手机号 *',
+      rules: [v => !!v || '请填写联系手机号']
+    },
+    {
+      type: 'autocomplete',
+      key: 'jobStatus',
+      value: '',
+      default: null,
+      label: '求职状态 *',
+      outlined: true,
+      itemText: 'label',
+      itemValue: 'value',
+      dictTypeName: 'menduner_job_seek_status',
+      rules: [v => !!v || '请选择求职状态'],
+      items: []
+    },
+    {
+      type: 'autocomplete',
+      key: 'expType',
+      value: '',
+      default: null,
+      label: '工作经验 *',
+      outlined: true,
+      itemText: 'label',
+      itemValue: 'value',
+      dictTypeName: 'menduner_exp_type',
+      rules: [v => !!v || '请选择工作经验'],
+      items: []
+    },
+    {
+      type: 'autocomplete',
+      key: 'eduType',
+      value: '',
+      default: null,
+      label: '最高学历 *',
+      outlined: true,
+      itemText: 'label',
+      itemValue: 'value',
+      dictTypeName: 'menduner_education_type',
+      rules: [v => !!v || '请选择最高学历'],
+      items: []
+    },
+  ]
+})
+
+// 获取字典内容
+const getDictData = async (dictTypeName) => {
+  const item = items.value.options.find(e => e.dictTypeName === dictTypeName)
+  if (item) {
+    const { data } = await getDict(dictTypeName)
+    item.items = data
+  }
+}
+
+const userInfo = ref(localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : {})
+items.value.options.forEach((e) => {
+  if (e.dictTypeName) getDictData(e.dictTypeName) // 查字典set options
+  e.value = userInfo.value[e.key] // 回显
+  // formItems回显
+  // const infoExist = baseInfo.value && Object.keys(baseInfo.value).length
+  // if (infoExist && baseInfo.value[e.key]) e.value = baseInfo.value[e.key]
+  // // 日期相关
+  // if (e.type === 'datepicker') e.value = timesTampChange(e.value).slice(0, 10)
+  // // 所在城市回显
+  // if (infoExist && e.nameKey) e[e.nameKey] = baseInfo.value[e.nameKey]
+})
+
+const getQuery = async () => {
+  const { valid } = await formPageRef.value.formRef.validate()
+  if (!valid) return false
+  const obj = {}
+  items.value.options.forEach(e => {
+    if (Object.prototype.hasOwnProperty.call(e, 'data')) return obj[e.key] = e.data
+    obj[e.key] = e.value
+  })
+  query = Object.assign(query, obj)
+  return query
+}
+
+defineExpose({
+  getQuery
+})
+</script>

+ 7 - 9
src/views/recruit/personal/home/index.vue

@@ -24,7 +24,7 @@
     </div>
   </div>
   <!-- 快速填写简易人才信息-弹窗 -->
-  <simplePage v-if="showSimplePage" :closeable="true" closeText="暂时跳过" @close="handleInfoClose" @simpleInfoReady="handleUpdateInfo"></simplePage>
+  <simplePage v-if="showSimplePage" :closeable="false" closeText="暂时跳过" @close="handleInfoClose" @simpleInfoReady="handleUpdateInfo"></simplePage>
   <!-- 广告弹窗 -->
   <v-dialog
     v-model="adDialog"
@@ -40,7 +40,7 @@
 
 <script setup>
 defineOptions({ name:'personal-index'})
-import simplePage from '@/views/recruit/personal/shareJob/sendResume/simple.vue'
+import simplePage from './components/simple.vue'
 import headSearch from '@/components/headSearch'
 import hotJobs from './components/hotJobs.vue'
 import homeJobTypeCard from './components/homeJobTypeCard'
@@ -56,9 +56,13 @@ import { getRewardEventList } from '@/utils/eventList'
 const showFullAdvertise = ref(true)
 if (!getToken()) getRewardEventList()
 
-const store = useUserStore()
 
 const router = useRouter()
+const handleSearch = (val) => {
+  if (val) router.push(`/recruit/personal/position?content=${val}`)
+}
+
+const store = useUserStore()
 const simple = ref(localStorage.getItem('simpleCompleteDialogHaveBeenShow'))
 const showSimplePage = ref(false) // 只提示一次
 if (!getToken()) showSimplePage.value = false
@@ -67,15 +71,9 @@ nextTick(() => {
     showSimplePage.value = simple.value && JSON.parse(simple.value) ? true : false
   }
 })
-
-const handleSearch = (val) => {
-  if (val) router.push(`/recruit/personal/position?content=${val}`)
-}
-
 const handleInfoClose = () => {
   localStorage.setItem('simpleCompleteDialogHaveBeenShow', false)
 }
-
 // 更新用户基本信息
 const handleUpdateInfo = async () => {
   handleInfoClose()