Blame view

Yi.Vben5.Vue3/packages/effects/common-ui/src/ui/authentication/code-login.vue 2.37 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  <script setup lang="ts">
  import type { VbenFormSchema } from '@vben-core/form-ui';
  
  import { computed, reactive } from 'vue';
  import { useRouter } from 'vue-router';
  
  import { $t } from '@vben/locales';
  
  import { useVbenForm } from '@vben-core/form-ui';
  import { VbenButton } from '@vben-core/shadcn-ui';
  
  import Title from './auth-title.vue';
  
  interface Props {
    formSchema: VbenFormSchema[];
    /**
     * @zh_CN 是否处于加载处理状态
     */
    loading?: boolean;
    /**
     * @zh_CN 登录路径
     */
    loginPath?: string;
    /**
     * @zh_CN 标题
     */
    title?: string;
    /**
     * @zh_CN 描述
     */
    subTitle?: string;
    /**
     * @zh_CN 按钮文本
     */
    submitButtonText?: string;
  }
  
  defineOptions({
    name: 'AuthenticationCodeLogin',
  });
  
  const props = withDefaults(defineProps<Props>(), {
    loading: false,
    loginPath: '/auth/login',
    submitButtonText: '',
    subTitle: '',
    title: '',
  });
  
  const emit = defineEmits<{
    submit: [{ code: string; phone: string; tenantId: string }];
  }>();
  
  const router = useRouter();
  
  const [Form, formApi] = useVbenForm(
    reactive({
      commonConfig: {
        hideLabel: true,
        hideRequiredMark: true,
      },
      schema: computed(() => props.formSchema),
      showDefaultActions: false,
    }),
  );
  
  async function handleSubmit() {
    const { valid } = await formApi.validate();
    const values = await formApi.getValues();
    if (valid) {
      emit('submit', {
        tenantId: values?.tenantId,
        code: values?.code,
        phone: values?.phone,
      });
    }
  }
  
  function goToLogin() {
    router.push(props.loginPath);
  }
  
  defineExpose({
    getFormApi: () => formApi,
  });
  </script>
  
  <template>
    <div>
      <Title>
        <slot name="title">
          {{ title || $t('authentication.welcomeBack') }} 📲
        </slot>
        <template #desc>
          <span class="text-muted-foreground">
            <slot name="subTitle">
              {{ subTitle || $t('authentication.codeSubtitle') }}
            </slot>
          </span>
        </template>
      </Title>
      <Form />
      <VbenButton
        :class="{
          'cursor-wait': loading,
        }"
        :loading="loading"
        class="w-full"
        @click="handleSubmit"
      >
        <slot name="submitButtonText">
          {{ submitButtonText || $t('common.login') }}
        </slot>
      </VbenButton>
      <VbenButton class="mt-4 w-full" variant="outline" @click="goToLogin()">
        {{ $t('common.back') }}
      </VbenButton>
    </div>
  </template>