Skip to content

Commit 38805a0

Browse files
authored
feat: improve code login demo (vbenjs#5154)
* feat: add some method in formApi * fix: VbenPinInput style with small screen * chore: improve code login demo
1 parent 0f75650 commit 38805a0

File tree

7 files changed

+68
-7
lines changed

7 files changed

+68
-7
lines changed

docs/src/components/common-ui/vben-form.md

+2
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ useVbenForm 返回的第二个参数,是一个对象,包含了一些表单
287287
| setValues | 设置表单值, 默认会过滤不在schema中定义的field, 可通过filterFields形参关闭过滤 | `(fields: Record<string, any>, filterFields?: boolean, shouldValidate?: boolean) => Promise<void>` |
288288
| getValues | 获取表单值 | `(fields:Record<string, any>,shouldValidate: boolean = false)=>Promise<void>` |
289289
| validate | 表单校验 | `()=>Promise<void>` |
290+
| validateField | 校验指定字段 | `(fieldName: string)=>Promise<ValidationResult<unknown>>` |
291+
| isFieldValid | 检查某个字段是否已通过校验 | `(fieldName: string)=>Promise<boolean>` |
290292
| resetValidate | 重置表单校验 | `()=>Promise<void>` |
291293
| updateSchema | 更新formSchema | `(schema:FormSchema[])=>void` |
292294
| setFieldValue | 设置字段值 | `(field: string, value: any, shouldValidate?: boolean)=>Promise<void>` |

packages/@core/ui-kit/form-ui/src/form-api.ts

+15
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ export class FormApi {
130130
return form.values;
131131
}
132132

133+
async isFieldValid(fieldName: string) {
134+
const form = await this.getForm();
135+
return form.isFieldValid(fieldName);
136+
}
137+
133138
merge(formApi: FormApi) {
134139
const chain = [this, formApi];
135140
const proxy = new Proxy(formApi, {
@@ -348,4 +353,14 @@ export class FormApi {
348353
}
349354
return await this.submitForm();
350355
}
356+
357+
async validateField(fieldName: string, opts?: Partial<ValidationOptions>) {
358+
const form = await this.getForm();
359+
const validateResult = await form.validateField(fieldName, opts);
360+
361+
if (Object.keys(validateResult?.errors ?? {}).length > 0) {
362+
console.error('validate error', validateResult?.errors);
363+
}
364+
return validateResult;
365+
}
351366
}

packages/@core/ui-kit/shadcn-ui/src/ui/button/button.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ export const buttonVariants = cva(
1111
size: {
1212
default: 'h-9 px-4 py-2',
1313
icon: 'h-8 w-8 rounded-sm px-1 text-lg',
14-
lg: 'h-10 rounded-md px-8',
15-
sm: 'h-8 rounded-md px-3 text-xs',
14+
lg: 'h-10 rounded-md px-4',
15+
sm: 'h-8 rounded-md px-2 text-xs',
1616
xs: 'h-8 w-8 rounded-sm px-1 text-xs',
1717
},
1818
variant: {

packages/@core/ui-kit/shadcn-ui/src/ui/pin-input/PinInputInput.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const forwardedProps = useForwardProps(delegatedProps);
2424
v-bind="forwardedProps"
2525
:class="
2626
cn(
27-
'border-input bg-background relative flex h-10 w-10 items-center justify-center border-y border-r text-center text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md focus:relative focus:z-10 focus:outline-none focus:ring-2',
27+
'border-input bg-background relative flex h-10 w-8 items-center justify-center border-y border-r text-center text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md focus:relative focus:z-10 focus:outline-none focus:ring-2 md:w-10',
2828
props.class,
2929
)
3030
"

playground/src/locales/langs/en-US/page.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
"register": "Register",
55
"codeLogin": "Code Login",
66
"qrcodeLogin": "Qr Code Login",
7-
"forgetPassword": "Forget Password"
7+
"forgetPassword": "Forget Password",
8+
"sendingCode": "SMS Code is sending...",
9+
"codeSentTo": "Code has been sent to {0}"
810
},
911
"dashboard": {
1012
"title": "Dashboard",

playground/src/locales/langs/zh-CN/page.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
"register": "注册",
55
"codeLogin": "验证码登录",
66
"qrcodeLogin": "二维码登录",
7-
"forgetPassword": "忘记密码"
7+
"forgetPassword": "忘记密码",
8+
"sendingCode": "正在发送验证码",
9+
"codeSentTo": "验证码已发送至{0}"
810
},
911
"dashboard": {
1012
"title": "概览",

playground/src/views/_core/authentication/code-login.vue

+42-2
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,36 @@
22
import type { VbenFormSchema } from '@vben/common-ui';
33
import type { Recordable } from '@vben/types';
44
5-
import { computed, ref } from 'vue';
5+
import { computed, ref, useTemplateRef } from 'vue';
66
77
import { AuthenticationCodeLogin, z } from '@vben/common-ui';
88
import { $t } from '@vben/locales';
99
10+
import { message } from 'ant-design-vue';
11+
1012
defineOptions({ name: 'CodeLogin' });
1113
1214
const loading = ref(false);
1315
const CODE_LENGTH = 6;
14-
16+
const loginRef =
17+
useTemplateRef<InstanceType<typeof AuthenticationCodeLogin>>('loginRef');
18+
function sendCodeApi(phoneNumber: string) {
19+
message.loading({
20+
content: $t('page.auth.sendingCode'),
21+
duration: 0,
22+
key: 'sending-code',
23+
});
24+
return new Promise((resolve) => {
25+
setTimeout(() => {
26+
message.success({
27+
content: $t('page.auth.codeSentTo', [phoneNumber]),
28+
duration: 3,
29+
key: 'sending-code',
30+
});
31+
resolve({ code: '123456', phoneNumber });
32+
}, 3000);
33+
});
34+
}
1535
const formSchema = computed((): VbenFormSchema[] => {
1636
return [
1737
{
@@ -39,6 +59,25 @@ const formSchema = computed((): VbenFormSchema[] => {
3959
: $t('authentication.sendCode');
4060
return text;
4161
},
62+
handleSendCode: async () => {
63+
// 模拟发送验证码
64+
// Simulate sending verification code
65+
loading.value = true;
66+
const formApi = loginRef.value?.getFormApi();
67+
if (!formApi) {
68+
loading.value = false;
69+
throw new Error('formApi is not ready');
70+
}
71+
await formApi.validateField('phoneNumber');
72+
const isPhoneReady = await formApi.isFieldValid('phoneNumber');
73+
if (!isPhoneReady) {
74+
loading.value = false;
75+
throw new Error('Phone number is not Ready');
76+
}
77+
const { phoneNumber } = await formApi.getValues();
78+
await sendCodeApi(phoneNumber);
79+
loading.value = false;
80+
},
4281
placeholder: $t('authentication.code'),
4382
},
4483
fieldName: 'code',
@@ -62,6 +101,7 @@ async function handleLogin(values: Recordable<any>) {
62101

63102
<template>
64103
<AuthenticationCodeLogin
104+
ref="loginRef"
65105
:form-schema="formSchema"
66106
:loading="loading"
67107
@submit="handleLogin"

0 commit comments

Comments
 (0)