最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Ant Design Pro登錄功能中集成圖形驗(yàn)證碼組件的方法步驟

 更新時(shí)間:2021年05月24日 14:26:32   作者:hanxiaozhang2018  
這篇文章主要介紹了在Ant Design Pro登錄功能中集成圖形驗(yàn)證碼組件的方法步驟,這里的登錄功能其實(shí)就是一個(gè)表單提交,實(shí)現(xiàn)起來也很簡(jiǎn)單,具體實(shí)例代碼跟隨小編一起看看吧

前言:

本篇文章只介紹在Ant Design Pro登錄功能中集成圖形驗(yàn)證碼組件的方法步驟,服務(wù)端方法請(qǐng)參考《基于OAuth2.0授權(quán)系統(tǒng)的驗(yàn)證碼功能》

正文:

在Ant Design Pro模板中,使用賬號(hào)密碼登錄功能部分(如下圖),并沒有做圖形驗(yàn)證碼的開發(fā),所以這部分功能就需要我們自己去實(shí)現(xiàn)。這里登錄功能其實(shí)本質(zhì)是一個(gè)表單提交,所以我們只需自己開發(fā)一個(gè)圖形驗(yàn)證碼表單控件就可以,具體實(shí)現(xiàn)如下。

1. 圖形驗(yàn)證碼表單控件代碼CaptchaInput.tsx:

import React, {useState, useEffect} from 'react';
import {Input, message} from 'antd';
import {SafetyCertificateOutlined} from '@ant-design/icons';
import api from '@/utils/api';
import stringUtil from "@/utils/stringUtil";
import request from "@/utils/request";
import {useIntl} from "umi";
 
 
interface CaptchaInputValue {
  captchaCode?: string;
  captchaKey?: string;
}
 
interface CaptchaInputProps {
  value?: CaptchaInputValue;
  onChange?: (value: CaptchaInputValue) => void;
}
 
/**
 * 獲取驗(yàn)證碼
 */
const getCaptcha = async () => {
  try {
    const data = await request(api.captcha);
    if (data.code === 1) {
      return data.data;
    }
  } catch (error) {
    message.error('獲取部門樹失敗,請(qǐng)重試');
    return [];
  }
  message.error('獲取部門樹失敗,請(qǐng)重試');
  return [];
}
 
const CaptchaInput: React.FC<CaptchaInputProps> = ({value = {}, onChange}) => {
 
  const intl = useIntl();
  const [captchaCode, setCaptchaCode] = useState<string>('');
  const [captchaKey, setCaptchaKey] = useState<string>('');
  const [imageData, setImageData] = useState<string>('');
 
  // 觸發(fā)改變
  const triggerChange = (changedValue: { captchaCode?: string; captchaKey?: string }) => {
    if (onChange) {
      onChange({captchaCode, captchaKey, ...value, ...changedValue});
    }
  };
 
  useEffect(() => {
    getCaptcha().then((data: any) => {
      setCaptchaKey(data.captchaKey);
      setImageData(data.image);
      triggerChange({captchaKey: data.captchaKey});
    })
  }, []);
 
 
  // 輸入框變化
  const onChangeInput = (e: React.ChangeEvent<HTMLInputElement>) => {
    const code = e.target.value || '';
    if (stringUtil.isNotEmpty(code)) {
      setCaptchaCode(code);
    }
    triggerChange({captchaCode: code});
  }
 
  // 時(shí)間類型變化
  const onClickImage = () => {
    getCaptcha().then((data: any) => {
      setCaptchaKey(data.captchaKey);
      setImageData(data.image);
      triggerChange({captchaKey: data.captchaKey});
    })
  };
 
  return (
    <span>
       <Input.Group compact>
          <Input prefix={<SafetyCertificateOutlined style={{color: "#319cff"}}/>} placeholder={intl.formatMessage({
            id: 'pages.login.captcha.placeholder',
            defaultMessage: '請(qǐng)輸入驗(yàn)證碼',
          })}
                 onChange={onChangeInput}
                 style={{width: '75%', marginRight: 5, padding: '6.5px 11px 6.5px 11px', verticalAlign: 'middle'}}/>
                   <img style={{width: '23%', height: '35px', verticalAlign: 'middle', padding: '0px 0px 0px 0px'}}
                        src={imageData} onClick={onClickImage}/>
       </Input.Group>
    </span>
  );
};
export default CaptchaInput;

2.登錄頁面集成組件:

import CaptchaInput from './components/CaptchaInput';
 
...   ... 
 
  const handleSubmit = (values: LoginParamsType) => {
    const {dispatch} = props;
    values.client_id = "hanxiaozhang";
    values.client_secret = "hanxiaozhang";
    values.scope = "hanxiaozhang";
    values.grant_type = "password";
    values.captcha_key = values.captchaComp.captchaKey;
    values.captcha_code = values.captchaComp.captchaCode;
    delete values.captchaComp;
    dispatch({
      type: 'login/login',
      payload: {...values, type},
    });
  };
 
...   ... 
 
            <Form.Item name="captchaComp" rules={[{
              validateTrigger: 'onBlur',
              validator: async (rule, value) => {
                // console.log(rule)
                if (stringUtil.isEmpty(value.captchaCode)) {
                  throw new Error('請(qǐng)輸入驗(yàn)證碼!');
                }
              }
            },]}>
              <CaptchaInput/>
            </Form.Item>
 
...   ...

 3.使用:

集成之后的效果如下:

以上就是在Ant Design Pro登錄功能中集成圖形驗(yàn)證碼組件的詳細(xì)內(nèi)容,更多關(guān)于Ant Design Pro登錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React Native AsyncStorage本地存儲(chǔ)工具類

    React Native AsyncStorage本地存儲(chǔ)工具類

    這篇文章主要為大家分享了React Native AsyncStorage本地存儲(chǔ)工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 詳解React??App.js?文件的結(jié)構(gòu)和作用

    詳解React??App.js?文件的結(jié)構(gòu)和作用

    在React應(yīng)用中,App.js文件通常是項(xiàng)目的根組件文件,它負(fù)責(zé)組織和渲染其他組件,是應(yīng)用的核心部分,本文將詳細(xì)介紹App.js文件的結(jié)構(gòu)、作用和最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • react+antd4實(shí)現(xiàn)優(yōu)化大批量接口請(qǐng)求

    react+antd4實(shí)現(xiàn)優(yōu)化大批量接口請(qǐng)求

    這篇文章主要為大家詳細(xì)介紹了如何使用react hooks + antd4實(shí)現(xiàn)大批量接口請(qǐng)求的前端優(yōu)化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-02-02
  • react生命周期(類組件/函數(shù)組件)操作代碼

    react生命周期(類組件/函數(shù)組件)操作代碼

    react代碼模式分為兩種類組件和函數(shù)組件(生命周期也有所不同),這篇文章主要介紹了react生命周期(類組件/函數(shù)組件),需要的朋友可以參考下
    2023-01-01
  • react中Hooks的理解和用法小結(jié)

    react中Hooks的理解和用法小結(jié)

    Hook是 React 16.8 的新增特性,它可以讓你在不編寫class的情況下使用state以及其他的React特性,這篇文章主要介紹了react中Hooks的理解和用法,需要的朋友可以參考下
    2023-05-05
  • 30行代碼實(shí)現(xiàn)React雙向綁定hook的示例代碼

    30行代碼實(shí)現(xiàn)React雙向綁定hook的示例代碼

    本文主要介紹了30行代碼實(shí)現(xiàn)React雙向綁定hook的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • react實(shí)現(xiàn)無限循環(huán)滾動(dòng)信息

    react實(shí)現(xiàn)無限循環(huán)滾動(dòng)信息

    這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)無限循環(huán)滾動(dòng)信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 使用React+ts實(shí)現(xiàn)無縫滾動(dòng)的走馬燈詳細(xì)過程

    使用React+ts實(shí)現(xiàn)無縫滾動(dòng)的走馬燈詳細(xì)過程

    這篇文章主要給大家介紹了關(guān)于使用React+ts實(shí)現(xiàn)無縫滾動(dòng)的走馬燈詳細(xì)過程,文中給出了詳細(xì)的代碼示例以及圖文教程,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-08-08
  • React實(shí)現(xiàn)動(dòng)態(tài)輪播圖的使用示例

    React實(shí)現(xiàn)動(dòng)態(tài)輪播圖的使用示例

    輪播組件是常見的一種方式,用來展示圖像、信息或者是廣告,本文就來介紹一下React實(shí)現(xiàn)動(dòng)態(tài)輪播圖的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • React類組件和函數(shù)組件對(duì)比-Hooks的簡(jiǎn)介

    React類組件和函數(shù)組件對(duì)比-Hooks的簡(jiǎn)介

    Hook?是?React?16.8?的新增特性,它可以讓我們?cè)诓痪帉慶lass的情況下,?使用state以及其他的React特性(比如生命周期,這篇文章主要介紹了React類組件和函數(shù)組件對(duì)比-Hooks的介紹及初體驗(yàn),需要的朋友可以參考下
    2022-11-11

最新評(píng)論

石嘴山市| 荣昌县| 九龙县| 苍南县| 天台县| 锡林郭勒盟| 涞源县| 高雄市| 米脂县| 溧水县| 敦化市| 镇宁| 九龙县| 兴山县| 盱眙县| 合作市| 宁乡县| 襄汾县| 汉阴县| 汉川市| 时尚| 广元市| 尚义县| 宜宾市| 右玉县| 舒城县| 广东省| 马关县| 陇西县| 泰州市| 南通市| 洞头县| 长乐市| 新昌县| 繁昌县| 光泽县| 青冈县| 南城县| 宿州市| 南靖县| 五莲县|