This commit is contained in:
dap
2024-09-21 21:23:58 +08:00
41 changed files with 1054 additions and 112 deletions

File diff suppressed because one or more lines are too long

View File

@@ -9,20 +9,24 @@ import { Card, Input, InputNumber, message, Switch } from 'ant-design-vue';
import { $t } from '#/locales';
import { captchaImage, hintImage } from './base64';
const DEFAULT_CAPTCHA_IMAGE =
'https://unpkg.com/@vbenjs/static-source@0.1.7/source/default-captcha-image.jpeg';
const DEFAULT_HINT_IMAGE =
'https://unpkg.com/@vbenjs/static-source@0.1.7/source/default-hint-image.png';
const selectedPoints = ref<CaptchaPoint[]>([]);
const params = reactive({
captchaImage,
captchaImageUrl: '',
captchaImage: '',
captchaImageUrl: DEFAULT_CAPTCHA_IMAGE,
height: undefined,
hintImage,
hintImageUrl: '',
hintImage: '',
hintImageUrl: DEFAULT_HINT_IMAGE,
hintText: '唇,燕,碴,找',
paddingX: undefined,
paddingY: undefined,
showConfirm: true,
showHintImage: true,
showHintImage: false,
title: '',
width: undefined,
});

View File

@@ -0,0 +1,116 @@
<script lang="ts" setup>
import type {
CaptchaVerifyPassingData,
SliderCaptchaActionType,
} from '@vben/common-ui';
import { ref } from 'vue';
import { Page, SliderCaptcha } from '@vben/common-ui';
import { Bell, Sun } from '@vben/icons';
import { Button, Card, message } from 'ant-design-vue';
function handleSuccess(data: CaptchaVerifyPassingData) {
const { time } = data;
message.success(`校验成功,耗时${time}`);
}
function handleBtnClick(elRef?: SliderCaptchaActionType) {
if (!elRef) {
return;
}
elRef.resume();
}
const el1 = ref<SliderCaptchaActionType>();
const el2 = ref<SliderCaptchaActionType>();
const el3 = ref<SliderCaptchaActionType>();
const el4 = ref<SliderCaptchaActionType>();
const el5 = ref<SliderCaptchaActionType>();
</script>
<template>
<Page description="用于前端简单的拖动校验场景" title="滑块校验">
<Card class="mb-5" title="基础示例">
<div class="flex items-center justify-center p-4 px-[30%]">
<SliderCaptcha ref="el1" @success="handleSuccess" />
<Button class="ml-2" type="primary" @click="handleBtnClick(el1)">
还原
</Button>
</div>
</Card>
<Card class="mb-5" title="自定义圆角">
<div class="flex items-center justify-center p-4 px-[30%]">
<SliderCaptcha
ref="el2"
class="rounded-full"
@success="handleSuccess"
/>
<Button class="ml-2" type="primary" @click="handleBtnClick(el2)">
还原
</Button>
</div>
</Card>
<Card class="mb-5" title="自定义背景色">
<div class="flex items-center justify-center p-4 px-[30%]">
<SliderCaptcha
ref="el3"
:bar-style="{
backgroundColor: '#018ffb',
}"
success-text="校验成功"
text="拖动以进行校验"
@success="handleSuccess"
/>
<Button class="ml-2" type="primary" @click="handleBtnClick(el3)">
还原
</Button>
</div>
</Card>
<Card class="mb-5" title="自定义拖拽图标">
<div class="flex items-center justify-center p-4 px-[30%]">
<SliderCaptcha ref="el4" @success="handleSuccess">
<template #actionIcon="{ isPassing }">
<Bell v-if="isPassing" />
<Sun v-else />
</template>
</SliderCaptcha>
<Button class="ml-2" type="primary" @click="handleBtnClick(el4)">
还原
</Button>
</div>
</Card>
<Card class="mb-5" title="自定义文本">
<div class="flex items-center justify-center p-4 px-[30%]">
<SliderCaptcha
ref="el5"
success-text="成功"
text="拖动"
@success="handleSuccess"
/>
<Button class="ml-2" type="primary" @click="handleBtnClick(el5)">
还原
</Button>
</div>
</Card>
<Card class="mb-5" title="自定义内容(slot)">
<div class="flex items-center justify-center p-4 px-[30%]">
<SliderCaptcha ref="el5" @success="handleSuccess">
<template #text="{ isPassing }">
<template v-if="isPassing">
<Bell class="mr-2 size-4" />
成功
</template>
<template v-else>
拖动
<Sun class="ml-2 size-4" />
</template>
</template>
</SliderCaptcha>
<Button class="ml-2" type="primary" @click="handleBtnClick(el5)">
还原
</Button>
</div>
</Card>
</Page>
</template>

View File

@@ -0,0 +1,28 @@
<script setup lang="ts">
import { computed } from 'vue';
import { Page, SliderRotateCaptcha } from '@vben/common-ui';
import { preferences } from '@vben/preferences';
import { useUserStore } from '@vben/stores';
import { Card, message } from 'ant-design-vue';
const userStore = useUserStore();
function handleSuccess() {
message.success('success!');
}
const avatar = computed(() => {
return userStore.userInfo?.avatar || preferences.app.defaultAvatar;
});
</script>
<template>
<Page description="用于前端简单的拖动校验场景" title="滑块旋转校验">
<Card class="mb-5" title="基本示例">
<div class="flex items-center justify-center p-4">
<SliderRotateCaptcha :src="avatar" @success="handleSuccess" />
</div>
</Card>
</Page>
</template>

View File

@@ -166,6 +166,15 @@ const [Form, formApi] = useVbenForm({
label: '区间选择框',
rules: 'selectRequired',
},
{
component: 'InputPassword',
componentProps: {
placeholder: '请输入',
},
fieldName: 'password',
label: '密码',
rules: 'required',
},
],
// 大屏一行显示3个中屏一行显示2个小屏一行显示1个
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',