inviteConfirm.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <div style="background-color: #f0f0f0;">
  3. <div class="inviteView text-center" :style="{'width': isMobile ? '100%' : '750px'}">
  4. <div class="invite-title">
  5. <div style="color: var(--v-primary-base);" class="mb-3">【门墩儿招聘企业邀请】</div>
  6. <div style="font-size: 24px">
  7. <div>
  8. <span class="color-333">{{ enterpriseInfo.name }}</span>
  9. <span class="color-333"> 邀请您加入 </span>
  10. </div>
  11. <div class="color-333">{{ enterpriseInfo.enterpriseName }}</div>
  12. <div>招聘团队</div>
  13. </div>
  14. </div>
  15. <div class="mt-10 d-flex flex-column align-center">
  16. <div v-if="joinSuccess">
  17. <div style="color: var(--v-primary-base); font-size: 18px; font-weight: bold;">加入成功!</div>
  18. <!-- <div class="mt-3">您使用企业邮箱登录招聘端的初始密码为"邮箱账号",请尽快登录招聘端修改密码!</div> -->
  19. <div class="mt-3">您使用企业邮箱登录招聘端的初始密码</div>
  20. <div class="mt-2">为 <span style="color: var(--v-error-base);">"{{ joinPersonEmail }}"</span></div>
  21. <div class="mt-2" style="color: var(--v-error-base);">请尽快登录招聘企业修改密码!</div>
  22. <!-- <div class="mt-3">您使用企业邮箱登录招聘端的初始密码为"邮箱账号",请尽快登录招聘端修改密码!</div> -->
  23. <v-btn v-if="!isMobile" class="mt-10" color="warning" to="/recruitHome">{{ $t('common.toHome') }}</v-btn>
  24. </div>
  25. <div v-else>
  26. <phoneFrom ref="phoneRef" openVerify showEmailInput @handleEnter="handleLogin" class="text-left" :style="{'width': isMobile ? '100%' : '350px' }"></phoneFrom>
  27. <v-btn :loading="loginLoading" color="warning" class="white--text mt-5" min-width="350" @click="handleLogin" :style="{'width': isMobile ? '100%' : '350px' }">
  28. {{ $t('common.confirmJoin') }}
  29. </v-btn>
  30. <div class="font-size-15 text-end color-666 mt-2">提示:未注册的手机号,加入自动注册账号</div>
  31. <!-- <div class="color-999 mt-2" style="font-size: 13px;">注:确认即代表加入该企业</div> -->
  32. </div>
  33. </div>
  34. </div>
  35. </div>
  36. <!-- 快速填写简易人才信息 -->
  37. <CtDialog
  38. :visible="showSimpleInput"
  39. :widthType="2"
  40. titleClass="text-h6"
  41. title="补充基本信息"
  42. @close="showSimpleInput = false"
  43. @submit="simpleInfoSubmit"
  44. >
  45. <simplePageForm ref="formRef"></simplePageForm>
  46. </CtDialog>
  47. </template>
  48. <script setup>
  49. defineOptions({ name: 'inviteConfirm'})
  50. import { ref, onMounted } from 'vue'
  51. import phoneFrom from '@/components/VerificationCode'
  52. import simplePageForm from './components/simplePageForm.vue'
  53. import { useRoute } from 'vue-router'; const route = useRoute()
  54. import { enterpriseInviteRecordConsent, getEnterpriseInfoByCode } from '@/api/recruit/enterprise/enterpriseInvite.js'
  55. import Snackbar from '@/plugins/snackbar'
  56. import { getToken } from '@/utils/auth'
  57. import { getBaseInfo, logout } from '@/api/common'
  58. import { useUserStore } from '@/store/user'
  59. import { savePersonSimpleInfo } from '@/api/recruit/personal/shareJob'
  60. const joinSuccess = ref(false)
  61. const code = route.query?.code || ''
  62. // 组件挂载后添加事件监听器
  63. const isMobile = ref(false)
  64. onMounted(() => {
  65. const userAgent = navigator.userAgent
  66. isMobile.value = /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(userAgent)
  67. })
  68. const phoneRef = ref()
  69. const loginLoading = ref(false)
  70. let joinPersonEmail = ''
  71. let copyLoginData = ''
  72. let userId = ''
  73. // 登录
  74. const handleLogin = async () => {
  75. const { valid } = await phoneRef.value.phoneForm.validate()
  76. if (!valid) return
  77. loginLoading.value = true
  78. try {
  79. const params = { ...phoneRef.value.loginData, autoRegister: true } // 只能验证码登录
  80. joinPersonEmail = params.email || ''
  81. // 如果用户登录后点击关闭填写简易人才信息,再次点击登录仅弹出填写,不再调用登录
  82. if (copyLoginData === (params.phone + params.code.toString()) && userId) {
  83. getUserBaseInfos(userId)
  84. return
  85. }
  86. const data = await useUserStore().handleSmsLogin(params)
  87. copyLoginData = params.phone + params.code.toString()
  88. userId = data.userId
  89. getUserBaseInfos(data.userId)
  90. } catch (error) {
  91. const msg = error?.msg || error
  92. Snackbar.error(msg)
  93. logoutFun()
  94. } finally {
  95. loginLoading.value = false
  96. }
  97. }
  98. // 查询人才信息
  99. const showSimpleInput = ref(false)
  100. const getUserBaseInfos = async (userId) => {
  101. loginLoading.value = true
  102. try {
  103. const data = await getBaseInfo({ userId })
  104. if (!data) {
  105. showSimpleInput.value = true; Snackbar.warning('请先完善个人基本信息')
  106. return
  107. }
  108. const keyArr = ['name', 'phone', 'jobStatus', 'expType', 'eduType'] // 必填人才信息
  109. const simpleInfoReady = Object.keys(data).length && keyArr.every(e => data[e] && data[e] !== 0) // 校验必填人才信息
  110. if (!simpleInfoReady) {
  111. showSimpleInput.value = true; Snackbar.warning('请先完善个人基本信息')
  112. return
  113. }
  114. join()
  115. } catch (error) {
  116. logoutFun()
  117. Snackbar.error('获取用户信息失败! ' + error)
  118. } finally {
  119. loginLoading.value = false
  120. }
  121. }
  122. // 调用加入接口
  123. const join = async () => {
  124. loginLoading.value = true
  125. try {
  126. const params = { code, email: joinPersonEmail }
  127. await enterpriseInviteRecordConsent(params)
  128. joinSuccess.value = true
  129. Snackbar.success('加入成功')
  130. } catch (error) {
  131. // 手机号或者邮箱已加入不能再加入
  132. Snackbar.error(error)
  133. // if (phoneRef.value?.resetPhone) phoneRef.value.resetForm()
  134. } finally {
  135. if (isMobile.value) logoutFun() // 网页打开保留登录状态
  136. loginLoading.value = false
  137. }
  138. }
  139. const logoutFun = async () => {
  140. if (!getToken(1)) {
  141. localStorage.clear()
  142. return
  143. }
  144. try {
  145. await logout()
  146. localStorage.clear()
  147. } catch (error) {
  148. console.log('登出失败!', error)
  149. }
  150. }
  151. logoutFun() // 清除之前的token
  152. // 提交简易人才信息
  153. const formRef = ref()
  154. const simpleInfoSubmit = async () => {
  155. try {
  156. const obj = await formRef.value.getQuery()
  157. if (!obj) return
  158. await savePersonSimpleInfo(obj)
  159. join()
  160. if (!isMobile.value) await useUserStore().getUserBaseInfos() // 网页打开需更新用户信息
  161. showSimpleInput.value = false
  162. } catch (error) {
  163. console.error('error', error)
  164. }
  165. }
  166. const enterpriseInfo = ref({})
  167. // 根据邀请码获取企业信息
  168. const getEnterpriseInfo = async () => {
  169. try {
  170. const data = await getEnterpriseInfoByCode({ code })
  171. enterpriseInfo.value = data
  172. } catch (error) {
  173. Snackbar.error('链接失效')
  174. }
  175. }
  176. getEnterpriseInfo()
  177. </script>
  178. <style scoped lang="scss">
  179. .inviteView {
  180. min-height: 100vh;
  181. display: block;
  182. overflow: hidden;
  183. margin: 0 auto;
  184. padding: 45px;
  185. background-color: #fff;
  186. }
  187. .invite-title {
  188. font-size: 20px;
  189. font-weight: 700;
  190. color: var(--color-333);
  191. }
  192. </style>