bind-mobile.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <mx-submit-layout :bar-options="barOptions" :loading="loading" @submit="handleSubmit">
  3. <uv-form ref="form" :model="model" :rules="rules">
  4. <mobile-code-fields/>
  5. <name-gender-fields/>
  6. <province-field/>
  7. <gaokao-year-field/>
  8. <type-major-fields/>
  9. <school-info-fields/>
  10. </uv-form>
  11. <template #suffix>
  12. <text class="text-primary underline" @click="handleLogout">退出登陆</text>
  13. </template>
  14. </mx-submit-layout>
  15. </template>
  16. <script setup>
  17. import {onMounted, ref} from 'vue'
  18. import {bindPhone, sendSms} from "@/api/login";
  19. import {getFrontLocationsList} from "@/api/webApi/resources";
  20. import {useUserStore} from "@/hooks/useUserStore";
  21. import {useTransfer} from "@/hooks/useTransfer";
  22. import {createBindPhoneModelRules} from "@/pages/login/components/hooks/defineFormModels";
  23. import {useProvideFormData} from "@/pages/login/components/hooks/useFormDataInjection";
  24. import MobileCodeFields from "@/pages/login/components/register-fields/mobile-code-fields.vue";
  25. import NameGenderFields from "@/pages/login/components/register-fields/name-gender-fields.vue";
  26. import ProvinceField from "@/pages/login/components/register-fields/province-field.vue";
  27. import GaokaoYearField from "@/pages/login/components/register-fields/gaokao-year-field.vue";
  28. import TypeMajorFields from "@/pages/login/components/register-fields/type-major-fields.vue";
  29. import {useProvideFormRef} from "@/pages/login/components/hooks/useFormRefInjection";
  30. import {useProvideProvince} from "@/pages/login/components/hooks/useProvinceInjection";
  31. import {useProvideSendSmsFn} from "@/pages/login/components/hooks/useSmsInjection";
  32. import SchoolInfoFields from "@/pages/login/components/register-fields/school-info-fields.vue";
  33. import {toast} from "@/uni_modules/uv-ui-tools/libs/function";
  34. import mxConst from "@/common/mxConst";
  35. const loading = ref(false)
  36. const form = ref(null)
  37. const provinceOptions = ref([])
  38. const {GetInfo, Logout} = useUserStore()
  39. const {relaunch, transferTo} = useTransfer()
  40. const [m, r, modelToCommit] = createBindPhoneModelRules()
  41. const [model, rules] = useProvideFormData(m, r)
  42. useProvideSendSmsFn(() => handleSendSms())
  43. useProvideProvince(provinceOptions)
  44. useProvideFormRef(form)
  45. const barOptions = ref({
  46. title: '注册账号',
  47. leftDisabled: true
  48. })
  49. // hooks
  50. onMounted(async () => {
  51. const resLoc = await getFrontLocationsList({level: 1})
  52. provinceOptions.value = resLoc.data.map(p => p.sname)
  53. })
  54. // methods
  55. const handleSendSms = () => {
  56. return sendSms({mobile: model.value.mobile, smsType: 1})
  57. }
  58. const handleSubmit = async () => {
  59. await form.value.validate()
  60. if (loading.value) return
  61. loading.value = true
  62. try {
  63. const commit = modelToCommit()
  64. await bindPhone(commit)
  65. toast('绑定成功,即将返回首页')
  66. await GetInfo()
  67. relaunch()
  68. } finally {
  69. loading.value = false
  70. }
  71. }
  72. const handleLogout = async function () {
  73. if (loading.value) return
  74. uni.showLoading()
  75. try {
  76. await Logout()
  77. transferTo(mxConst.routes.login)
  78. } finally {
  79. uni.hideLoading()
  80. }
  81. }
  82. </script>
  83. <style scoped>
  84. </style>