person.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <div class="box" :style="{'background-image': 'url(' + webContent.loginBgUrl + ')'}">
  3. <navBar v-if="!isMobile" :showLoginBtn="false" class="navBar"></navBar>
  4. <div class="content pa-10">
  5. <div class="content-title text-center mt-4">{{ isLogin ? '请输入您申请企业账号时填入的手机号进行效验' : '请输入手机号码进行注册认证'}}</div>
  6. <div class="mt-10">
  7. <phoneFrom ref="phoneRef" openVerify @handleEnter="handleRegister" :phone="phone"></phoneFrom>
  8. </div>
  9. <div v-if="!isMobile" class="font-size-14 text-end">
  10. <span class="tips color-primary cursor-pointer" @click="router.push(isSchool ? '/flameLogin' : '/login')">已有账号?去登录</span>
  11. </div>
  12. <v-btn :loading="loading" color="primary" class="white--text mt-5" min-width="370" @click="handleRegister">{{ isCompany ? '下一步' : '注册' }}</v-btn>
  13. <div class="login-tips mt-3" v-if="!isCompany">
  14. <v-icon v-if="isAgree" size="25" color="primary" class="mr-1" @click="isAgree = !isAgree">mdi-check-circle</v-icon>
  15. <v-icon v-else size="25" color="grey" class="mr-1" @click="isAgree = !isAgree">mdi-circle-outline</v-icon>
  16. 点击注册即代表您同意
  17. <span class="color" style="cursor: pointer;" @click="windowOpen('/userAgreement')"> [{{ $t('login.userAgreement') }}] </span>和
  18. <span class="color" style="cursor: pointer;" @click="windowOpen('/privacyPolicy')">[{{ $t('login.privacyPolicy') }}]</span>
  19. </div>
  20. </div>
  21. </div>
  22. </template>
  23. <script setup>
  24. defineOptions({ name: 'registerPerson'})
  25. import { ref, onMounted } from 'vue'
  26. import { useRouter } from 'vue-router'
  27. import phoneFrom from '@/components/VerificationCode'
  28. import { useUserStore } from '@/store/user'
  29. import Snackbar from '@/plugins/snackbar'
  30. import { checkCompanyEmail } from '@/utils/validate'
  31. import navBar from '@/layout/personal/navBar.vue'
  32. import { webContentStore } from '@/store/webContent'
  33. const webContent = webContentStore()
  34. const isMobile = ref(false)
  35. onMounted(async () => {
  36. await webContent.getSystemWebContent()
  37. const userAgent = navigator.userAgent
  38. 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)
  39. })
  40. const emit = defineEmits(['success'])
  41. const props = defineProps({
  42. isCompany: {
  43. type: Boolean,
  44. default: false
  45. },
  46. isLogin: {
  47. type: Boolean,
  48. default: false
  49. },
  50. isSchool: {
  51. type: Boolean,
  52. default: false
  53. }
  54. })
  55. const router = useRouter()
  56. const phoneRef = ref()
  57. const loading = ref(false)
  58. const isAgree = ref(false)
  59. const userStore = useUserStore()
  60. const phone = localStorage.getItem('loginAccount') && !checkCompanyEmail(localStorage.getItem('loginAccount')) ? localStorage.getItem('loginAccount') : ''
  61. // 注册
  62. const handleRegister = async () => {
  63. const { valid } = await phoneRef.value.phoneForm.validate()
  64. if (!valid) return
  65. if (!props.isCompany && !isAgree.value) return Snackbar.warning('请阅读并勾选底部协议')
  66. loading.value = true
  67. try {
  68. await userStore.handleSmsLogin({
  69. ...phoneRef.value.loginData,
  70. autoRegister: true,
  71. chooseRole: props.isCompany || props.isSchool ? false : true,
  72. schoolRegister: props.isSchool
  73. })
  74. // autoRegister 自动注册登录
  75. if (props.isSchool) localStorage.setItem('schoolLoginAccount', JSON.stringify({ phone: phoneRef.value.loginData.phone }))
  76. Snackbar.success(props.isCompany ? '手机号验证成功' : '注册成功')
  77. if (!props.isCompany) {
  78. localStorage.setItem('simpleCompleteDialogHaveBeenShow', true) // 个人登录简易基本信息填写弹窗open-status
  79. router.push({ path: '/recruitHome' })
  80. localStorage.removeItem('loginAccount')
  81. } else emit('success')
  82. } catch (err) {
  83. phoneRef.value && phoneRef.value.clearCaptcha()
  84. loading.value = false
  85. } finally {
  86. loading.value = false
  87. }
  88. }
  89. const windowOpen = (url) => {
  90. // router.push(url)
  91. if (url) window.open(url)
  92. }
  93. </script>
  94. <style scoped lang="scss">
  95. .color {
  96. color: var(--v-primary-base);
  97. }
  98. .navBar {
  99. position: absolute;
  100. top: 0;
  101. }
  102. .box {
  103. position: relative;
  104. width: 100%;
  105. height: 100%;
  106. background-size: cover;
  107. display: flex;
  108. justify-content: center;
  109. align-items: center;
  110. }
  111. .content {
  112. width: 450px;
  113. height: 450px;
  114. background-color: #fff;
  115. border-radius: 10px;
  116. display: flex;
  117. flex-direction: column;
  118. justify-content: center;
  119. &-title {
  120. color: #4c4c4c;
  121. font-size: 24px;
  122. }
  123. }
  124. .login-tips {
  125. width: 100%;
  126. font-size: 14px;
  127. display: flex;
  128. justify-content: center;
  129. align-items: center;
  130. }
  131. .tips:hover {
  132. border-bottom: 1px solid var(--v-primary-base);
  133. }
  134. </style>