<template> <BasicModal @register="registerModal" width="450px" :minHeight="100" :title="title" @ok="handleSubmit" destroyOnClose :canFullscreen="false"> <BasicForm @register="registerForm"> <template #captchaSlot="{ model, field }"> <div style="width: 100%; display: flex"> <a-input style="width: 200px" v-model:value="model[field]" placeholder="请输入图片验证码" /> <div class="margin-left10"> <img class="pointer" v-if="randCodeData.requestCodeSuccess" style="margin-top: 2px; max-width: initial; height: 30px" :src="randCodeData.randCodeImage" @click="getCaptchaCode" /> <img v-else class="pointer" style="margin-top: 2px; max-width: initial; height: 30px" :src="codeImage" @click="getCaptchaCode" /> </div> </div> </template> </BasicForm> </BasicModal> </template> <script lang="ts" name="CaptchaModal"> import { defineComponent, reactive, ref } from 'vue'; import { BasicModal, useModalInner } from '@/components/Modal'; import { BasicForm, FormSchema, useForm } from '@/components/Form'; import codeImage from '@/assets/images/checkcode.png'; import { getCodeInfo } from '@/api/sys/user'; import { defHttp } from '@/utils/http/axios'; import {useMessage} from "@/hooks/web/useMessage"; export default defineComponent({ name: 'CaptchaModal', components: { BasicModal, BasicForm }, emits: ['ok','register'], setup(props, { emit }) { const title = ref<string>('验证码'); const schemas: FormSchema[] = [ { field: 'captcha', component: 'Input', label: '图片验证码', rules: [{ required: true }], slot: 'captchaSlot', }, ]; //表单配置 const [registerForm, { resetFields, validate }] = useForm({ schemas: schemas, showActionButtonGroup: false, baseRowStyle: { "justify-content": 'center', "display": "grid", "margin-top": "10px" }, rowProps: { "justify": "center" }, labelCol: { span: 24 }, wrapperCol: { span: 24 }, }); //表单赋值 const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { setModalProps({ confirmLoading: true }); //重置表单 await resetFields(); await getCaptchaCode(); setModalProps({ confirmLoading: false }); }); //存放二维码的数据 const randCodeData = reactive({ randCodeImage: '', requestCodeSuccess: false, checkKey: -1, }); const { createMessage } = useMessage(); /** * 获取验证码 */ async function getCaptchaCode() { await resetFields(); randCodeData.checkKey = new Date().getTime(); getCodeInfo(randCodeData.checkKey).then((res) => { randCodeData.randCodeImage = res; randCodeData.requestCodeSuccess = true; }); } /** * 第三方配置点击事件 */ async function handleSubmit() { let values = await validate(); defHttp.post({ url: '/sys/smsCheckCaptcha', params: { captcha: values.captcha, checkKey: randCodeData.checkKey } }, { isTransformResponse: false }).then((res)=>{ if(res.success){ emit('ok'); closeModal(); }else{ createMessage.warning(res.message); getCaptchaCode(); } }).catch((res) =>{ createMessage.warning(res.message); getCaptchaCode(); }); } /** * 关闭弹窗 */ function handleCancel() { closeModal(); } return { title, registerForm, registerModal, handleSubmit, handleCancel, randCodeData, codeImage, getCaptchaCode, }; }, }); </script> <style scoped> .margin-left10 { margin-left: 10px; } :deep(.ant-row){ display: block; } </style>