inviteConfirmEnt.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. <template v-if="joinSuccess">
  17. <div>加入成功!</div>
  18. <v-btn class="mt-10" color="warning" to="/recruitHome">{{ $t('common.toHome') }}</v-btn>
  19. </template>
  20. <template v-else>
  21. <div>
  22. <div style="font-size: 13px;text-align: left;" class="mb-2"><span style="color: red;">*</span> 请输入要加入的企业邮箱及密码</div>
  23. <passwordFrom
  24. ref="entPassRef"
  25. placeholder="请输入企业邮箱"
  26. :isCounter="true"
  27. :validEmail="true"
  28. style="text-align: left;"
  29. @handleEnter="handleLogin"
  30. ></passwordFrom>
  31. <v-btn :loading="loginLoading" color="warning" class="white--text mt-3" min-width="350" @click="handleLogin" :style="{'width': isMobile ? '100%' : '350px' }">
  32. {{ $t('common.confirmJoin') }}
  33. </v-btn>
  34. <div class="mt-3" style="font-size: 13px;text-align: center;">
  35. <div>注:请使用已经申请好的企业账户加入集团</div>
  36. <div style="color: red; cursor: pointer;">
  37. <span
  38. v-if="quickRegister"
  39. @click="quickRegister = false"
  40. >
  41. 已有企业账号,去登录
  42. </span>
  43. <span
  44. v-else
  45. @click="handleRegister"
  46. >
  47. 没有企业账号?去注册
  48. </span>
  49. </div>
  50. </div>
  51. </div>
  52. </template>
  53. </div>
  54. </div>
  55. </div>
  56. <Verify
  57. ref="verify"
  58. captchaType="blockPuzzle"
  59. :imgSize="{ width: '400px', height: '200px' }"
  60. mode="pop"
  61. @success="verifySuccess"
  62. />
  63. </template>
  64. <script setup>
  65. defineOptions({ name: 'inviteConfirmEnt'})
  66. import { useRouter } from 'vue-router'; const router = useRouter()
  67. import { ref, onMounted } from 'vue'
  68. import { useRoute } from 'vue-router'; const route = useRoute()
  69. import { enterpriseInviteRecordConsent, getEnterpriseInfoByCode } from '@/api/recruit/enterprise/enterpriseInvite.js'
  70. import Snackbar from '@/plugins/snackbar'
  71. import passwordFrom from '@/views/login/components/passwordPage.vue'
  72. import Verify from '@/components/Verifition'
  73. import { getToken } from '@/utils/auth'
  74. import { useUserStore } from '@/store/user'
  75. import {
  76. logoutToken,
  77. passwordLogin
  78. } from '@/api/common'
  79. const joinSuccess = ref(false)
  80. const code = route.query?.code || ''
  81. // 组件挂载后添加事件监听器
  82. const isMobile = ref(false)
  83. onMounted(() => {
  84. const userAgent = navigator.userAgent
  85. 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)
  86. })
  87. const entPassRef = ref()
  88. // 获取验证码
  89. const verify = ref()
  90. const getCode = async () => {
  91. // 弹出验证码 // 已开启:则展示验证码;只有完成验证码的情况,才进行登录
  92. verify.value.show()
  93. }
  94. const captchaStr = ref('')
  95. const verifySuccess = (params) => {
  96. captchaStr.value = params.captchaVerification
  97. handleLogin()
  98. }
  99. // const entBaseInfo = ref()
  100. // // 获取当前登录的企业用户信息
  101. // const getLoginEnterpriseInfo = async () => {
  102. // try {
  103. // const result = await getEnterprisingUserInfo()
  104. // entBaseInfo.value = result
  105. // // 是否为企业账号管理员
  106. // // const isAdmin = result.userType === '1'
  107. // } catch (error) {
  108. // console.error('error', error)
  109. // }
  110. // }
  111. const loginLoading = ref(false)
  112. const handleLogin = async () => {
  113. const { valid } = await entPassRef.value.passwordForm.validate()
  114. if (!valid) return
  115. const params = {
  116. ...entPassRef.value.loginData,
  117. captchaVerification: captchaStr.value,
  118. isEnterprise: true,
  119. }
  120. params.account = params.phone
  121. if (!params.captchaVerification) {
  122. getCode() // 验证码组件
  123. return
  124. }
  125. loginLoading.value = true
  126. try {
  127. const res = await passwordLogin(params)
  128. const obj = res ? { ...res, type: 'emailLogin', onlySetToken: true } : {}
  129. await useUserStore().changeRole(obj)
  130. await join()
  131. } catch (error) {
  132. Snackbar.error(error?.msg || error)
  133. } finally {
  134. captchaStr.value = ''
  135. loginLoading.value = false
  136. }
  137. }
  138. // 执行加入操作
  139. const join = async () => {
  140. try {
  141. loginLoading.value = true
  142. await enterpriseInviteRecordConsent({ code })
  143. Snackbar.success('加入成功')
  144. joinSuccess.value = true
  145. } catch (error) {
  146. Snackbar.error(error?.msg || error)
  147. } finally {
  148. captchaStr.value = ''
  149. loginLoading.value = false
  150. logoutFun()
  151. }
  152. }
  153. const quickRegister = ref(false)
  154. const handleRegister = () => {
  155. router.push('/register/selected')
  156. }
  157. const logoutFun = async () => {
  158. if (!getToken(1)) {
  159. localStorage.clear()
  160. return
  161. }
  162. try {
  163. await await logoutToken(getToken(1))
  164. localStorage.clear()
  165. } catch (error) {
  166. console.log('登出失败!', error)
  167. }
  168. }
  169. logoutFun() // 清除之前的token
  170. const enterpriseInfo = ref({})
  171. // 根据邀请码获取企业信息
  172. const getEnterpriseInfo = async () => {
  173. try {
  174. const data = await getEnterpriseInfoByCode({ code })
  175. enterpriseInfo.value = data
  176. } catch (error) {
  177. console.error('error', error)
  178. Snackbar.error('链接失效')
  179. }
  180. }
  181. getEnterpriseInfo()
  182. </script>
  183. <style scoped lang="scss">
  184. .inviteView {
  185. min-height: 100vh;
  186. display: block;
  187. overflow: hidden;
  188. margin: 0 auto;
  189. padding: 45px;
  190. background-color: #fff;
  191. }
  192. .invite-title {
  193. font-size: 20px;
  194. font-weight: 700;
  195. color: var(--color-333);
  196. }
  197. </style>