WechatCallbackLogin.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <script setup lang="ts">
  2. import {reactive, ref} from 'vue'
  3. import {debounce} from "@/utils/common.ts";
  4. import {bindPhone, sendCode} from "@/api/user.ts";
  5. import {AuthCodeType} from "@/enums/verification.ts";
  6. import {ElMessage, type FormInstance} from "element-plus";
  7. import {LoginType, userStore} from "@/stores/user.ts";
  8. import AccountFormItem from "@/components/common/login/component/AccountFormItem.vue";
  9. import CodeFormItem from "@/components/common/login/component/CodeFormItem.vue";
  10. import SubmitFormBtn from "@/components/common/login/component/SubmitFormBtn.vue";
  11. import {useRoute} from "vue-router";
  12. const route = useRoute();
  13. const props = defineProps(['openId'])
  14. const form = reactive({
  15. phone: '',
  16. code: '',
  17. openId: props.openId
  18. });
  19. console.log(form);
  20. const user = userStore();
  21. const ruleFormRef = ref<FormInstance>();
  22. const debouncedSendAuthCode = debounce(sendAuthCode, 500);
  23. async function sendAuthCode(sendAuthCodeCallBack: () => void) {
  24. if (!ruleFormRef.value?.validateField) return;
  25. await ruleFormRef.value.validateField('phone', async (valid) => {
  26. if (valid) {
  27. const {phone} = form;
  28. await sendCode({phone, type: AuthCodeType.WECHAT_LAUNCH});
  29. if (sendAuthCodeCallBack) {
  30. sendAuthCodeCallBack()
  31. }
  32. } else {
  33. ElMessage.error('请输入正确的手机号码');
  34. }
  35. });
  36. }
  37. const debouncedSubmitForm = debounce(submitForm, 500);
  38. function submitForm(formEl: FormInstance | undefined, callBack: () => void) {
  39. if (!formEl) return;
  40. formEl.validate(async (valid, fields) => {
  41. if (valid) {
  42. try {
  43. const {phone, openId, code} = form;
  44. const res = await bindPhone({phone, openId: props.openId, code})
  45. console.log('res=', res.token);
  46. ElMessage.success('绑定成功');
  47. localStorage.setItem('TOKEN', `${res.token}`);
  48. location.href = '/'
  49. } catch (e) {
  50. console.log(e);
  51. }
  52. callBack && callBack()
  53. } else {
  54. callBack && callBack()
  55. // ElMessage.error('注册失败,请稍后重试')
  56. console.log('error submit!', fields);
  57. }
  58. });
  59. }
  60. </script>
  61. <template>
  62. <div class="bf-login-dialog-box">
  63. <h1 class="title">绑定手机</h1>
  64. <div class="bf-login-form">
  65. <el-form :model="form" ref="ruleFormRef">
  66. <AccountFormItem prop-name="phone" v-model:phone="form.phone" placeholder="请输入手机号码"/>
  67. <CodeFormItem v-model:code="form.code" @sendAuthCode="debouncedSendAuthCode"/>
  68. <SubmitFormBtn @submit-click="debouncedSubmitForm(ruleFormRef, $event)">确认</SubmitFormBtn>
  69. </el-form>
  70. <div class="bf-register-account">
  71. <span>已有账户?</span>
  72. <a @click="user.loginType = LoginType.ACCOUNT_LOGIN">立即登录</a>
  73. </div>
  74. </div>
  75. </div>
  76. </template>
  77. <style scoped lang="scss">
  78. .bf-login-dialog-box{
  79. padding: 40px;
  80. }
  81. .bf-register-account {
  82. margin-top: -30px;
  83. a {
  84. color: #409EFF;
  85. }
  86. }
  87. </style>
  88. <!-- 登陆框公共样式 -->
  89. <style src="@/assets/styles/components/common/login/GlobalLoginDialog.scss"></style>