|
|
@@ -1,60 +1,135 @@
|
|
|
<script lang="ts" setup>
|
|
|
-import type { SliderCaptcha, VbenFormSchema } from '@vben/common-ui';
|
|
|
+import type { VbenFormSchema } from '@vben/common-ui';
|
|
|
import type { Recordable } from '@vben/types';
|
|
|
|
|
|
-import { computed, useTemplateRef } from 'vue';
|
|
|
+import { computed, markRaw, ref, useTemplateRef } from 'vue';
|
|
|
|
|
|
import { AuthenticationLogin, z } from '@vben/common-ui';
|
|
|
import { $t } from '@vben/locales';
|
|
|
|
|
|
+import { createCaptcha, getCaptchaFlag } from '#/api';
|
|
|
+import ImageCaptcha from '#/components/image-captcha/index.vue';
|
|
|
import { useAuthStore } from '#/store';
|
|
|
|
|
|
defineOptions({ name: 'Login' });
|
|
|
|
|
|
const authStore = useAuthStore();
|
|
|
+const captchaFlag = ref(true);
|
|
|
+
|
|
|
+getCaptchaFlag().then((res: any) => {
|
|
|
+ captchaFlag.value = res;
|
|
|
+});
|
|
|
+
|
|
|
+const defaultUserName = ['development', 'mock'].includes(import.meta.env.MODE)
|
|
|
+ ? 'baicai'
|
|
|
+ : '';
|
|
|
+const defaultPassword = ['development', 'mock'].includes(import.meta.env.MODE)
|
|
|
+ ? '123456'
|
|
|
+ : '';
|
|
|
|
|
|
const formSchema = computed((): VbenFormSchema[] => {
|
|
|
- return [
|
|
|
- {
|
|
|
- component: 'VbenInput',
|
|
|
- componentProps: {
|
|
|
- placeholder: $t('authentication.usernameTip'),
|
|
|
- },
|
|
|
- fieldName: 'username',
|
|
|
- label: $t('authentication.username'),
|
|
|
- rules: z.string().min(1, { message: $t('authentication.usernameTip') }),
|
|
|
- },
|
|
|
- {
|
|
|
- component: 'VbenInputPassword',
|
|
|
- componentProps: {
|
|
|
- placeholder: $t('authentication.password'),
|
|
|
- },
|
|
|
- fieldName: 'password',
|
|
|
- label: $t('authentication.password'),
|
|
|
- rules: z.string().min(1, { message: $t('authentication.passwordTip') }),
|
|
|
- },
|
|
|
- // {
|
|
|
- // component: markRaw(SliderCaptcha),
|
|
|
- // fieldName: 'captcha',
|
|
|
- // rules: z.boolean().refine((value) => value, {
|
|
|
- // message: $t('authentication.verifyRequiredTip'),
|
|
|
- // }),
|
|
|
- // },
|
|
|
- ];
|
|
|
+ return captchaFlag.value
|
|
|
+ ? [
|
|
|
+ {
|
|
|
+ component: 'VbenInput',
|
|
|
+ defaultValue: defaultUserName,
|
|
|
+ componentProps: {
|
|
|
+ placeholder: $t('authentication.usernameTip'),
|
|
|
+ },
|
|
|
+ fieldName: 'username',
|
|
|
+ label: $t('authentication.username'),
|
|
|
+ rules: z
|
|
|
+ .string()
|
|
|
+ .min(1, { message: $t('authentication.usernameTip') }),
|
|
|
+ formItemClass: 'col-span-12',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'VbenInputPassword',
|
|
|
+ defaultValue: defaultPassword,
|
|
|
+ componentProps: {
|
|
|
+ placeholder: $t('authentication.password'),
|
|
|
+ },
|
|
|
+ fieldName: 'password',
|
|
|
+ label: $t('authentication.password'),
|
|
|
+ rules: z
|
|
|
+ .string()
|
|
|
+ .min(1, { message: $t('authentication.passwordTip') }),
|
|
|
+ formItemClass: 'col-span-12',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'VbenInput',
|
|
|
+ // defaultValue: defaultCode,
|
|
|
+ componentProps: {
|
|
|
+ placeholder: '请输入图片验证码',
|
|
|
+ },
|
|
|
+ formItemClass: 'col-span-8',
|
|
|
+ fieldName: 'code',
|
|
|
+ label: '验证码',
|
|
|
+ rules: z.string().min(1, { message: '请输入图片验证码' }),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: markRaw(ImageCaptcha),
|
|
|
+ fieldName: 'token',
|
|
|
+ componentProps: {
|
|
|
+ api: createCaptcha,
|
|
|
+ uuidField: 'token',
|
|
|
+ base64Field: 'imageBase64',
|
|
|
+ immediate: true,
|
|
|
+ },
|
|
|
+ formItemClass: 'col-span-4',
|
|
|
+ },
|
|
|
+ // {
|
|
|
+ // component: markRaw(SliderCaptcha),
|
|
|
+ // fieldName: 'captcha',
|
|
|
+ // rules: z.boolean().refine((value) => value, {
|
|
|
+ // message: $t('authentication.verifyRequiredTip'),
|
|
|
+ // }),
|
|
|
+ // },
|
|
|
+ ]
|
|
|
+ : [
|
|
|
+ {
|
|
|
+ component: 'VbenInput',
|
|
|
+ defaultValue: defaultUserName,
|
|
|
+ componentProps: {
|
|
|
+ placeholder: $t('authentication.usernameTip'),
|
|
|
+ },
|
|
|
+ fieldName: 'username',
|
|
|
+ label: $t('authentication.username'),
|
|
|
+ rules: z
|
|
|
+ .string()
|
|
|
+ .min(1, { message: $t('authentication.usernameTip') }),
|
|
|
+ formItemClass: 'col-span-12',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'VbenInputPassword',
|
|
|
+ defaultValue: defaultPassword,
|
|
|
+ componentProps: {
|
|
|
+ placeholder: $t('authentication.password'),
|
|
|
+ },
|
|
|
+ fieldName: 'password',
|
|
|
+ label: $t('authentication.password'),
|
|
|
+ rules: z
|
|
|
+ .string()
|
|
|
+ .min(1, { message: $t('authentication.passwordTip') }),
|
|
|
+ formItemClass: 'col-span-12',
|
|
|
+ },
|
|
|
+ ];
|
|
|
});
|
|
|
const loginRef =
|
|
|
useTemplateRef<InstanceType<typeof AuthenticationLogin>>('loginRef');
|
|
|
|
|
|
async function onSubmit(params: Recordable<any>) {
|
|
|
authStore.authLogin(params).catch(() => {
|
|
|
- // 登陆失败,刷新验证码的演示
|
|
|
- const formApi = loginRef.value?.getFormApi();
|
|
|
- // 重置验证码组件的值
|
|
|
- formApi?.setFieldValue('captcha', false, false);
|
|
|
- // 使用表单API获取验证码组件实例,并调用其resume方法来重置验证码
|
|
|
- formApi
|
|
|
- ?.getFieldComponentRef<InstanceType<typeof SliderCaptcha>>('captcha')
|
|
|
- ?.resume();
|
|
|
+ if (captchaFlag.value) {
|
|
|
+ // 登陆失败,刷新验证码的演示
|
|
|
+ const formApi = loginRef.value?.getFormApi();
|
|
|
+ // 重置验证码组件的值
|
|
|
+ // formApi?.setFieldValue('captcha', false, false);
|
|
|
+ // 使用表单API获取验证码组件实例,并调用其resume方法来重置验证码
|
|
|
+ formApi
|
|
|
+ ?.getFieldComponentRef<InstanceType<typeof ImageCaptcha>>('token')
|
|
|
+ ?.resume();
|
|
|
+ }
|
|
|
});
|
|
|
}
|
|
|
</script>
|