phone.uvue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <view class="flex flex-col w-[40vw]">
  3. <view class="mb-3 flex flex-row ">
  4. <cl-input class="" :pt="{ className: '!h-[40px] !rounded-xxl !px-4 !w-[40vw]' }" v-model="form.username"
  5. placeholder="请输入手机号"></cl-input>
  6. </view>
  7. <view class="relative flex flex-row items-center mb-5">
  8. <cl-input :pt="{ className: '!h-[40px] !rounded-xxl !px-4 !w-[40vw]' }" v-model="form.code" :clearable="false"
  9. type="number">
  10. </cl-input>
  11. <view class="absolute right-0">
  12. <sms-btn :ref="refs.set('smsBtn')" :phone="form.username" @success="showCode = true"></sms-btn>
  13. </view>
  14. </view>
  15. </view>
  16. </template>
  17. <script setup lang="ts">
  18. import { computed, inject, ref, type PropType } from "vue";
  19. import type { LoginForm } from "./types";
  20. import SmsBtn from "./sms-btn.uvue";
  21. import { isDark, parseClass, request, useRefs, type Response, t } from "@/.cool";
  22. import { useUi } from "@/uni_modules/cool-ui";
  23. const props = defineProps({
  24. form: {
  25. type: Object as PropType<LoginForm>,
  26. default: () => ({})
  27. }
  28. });
  29. const emit = defineEmits(["success"]);
  30. const ui = useUi();
  31. const refs = useRefs();
  32. // 是否同意
  33. const isAgree = inject("isAgree") as () => boolean;
  34. // 是否显示验证码
  35. const showCode = ref(false);
  36. // 是否加载中
  37. const loading = ref(false);
  38. // 是否禁用
  39. const disabled = computed(() => {
  40. return props.form.phone == "" || props.form.smsCode == "";
  41. });
  42. // 登录
  43. async function toLogin() {
  44. if (!isAgree()) {
  45. return;
  46. }
  47. const { phone, smsCode } = props.form;
  48. loading.value = true;
  49. await request({
  50. url: "/app/user/login/phone",
  51. method: "POST",
  52. data: {
  53. phone,
  54. smsCode
  55. }
  56. })
  57. .then((res) => {
  58. emit("success", res);
  59. })
  60. .catch((err) => {
  61. ui.showToast({
  62. message: (err as Response).message!
  63. });
  64. });
  65. loading.value = false;
  66. }
  67. </script>