import React, { useEffect, useState, useRef } from 'react'; import { Form, Button, Input, Row, Col, Modal, Spin, message } from 'antd'; import { UserOutlined, LockOutlined, SafetyCertificateOutlined, VideoCameraOutlined } from '@ant-design/icons'; import './style.less'; import { changePass, rgbToBase64 } from './service'; import logo from '@/images/login/logoPic.png'; import { refreshTokenApi, ZjfakeAccountLogin, ZjfakeFaceLogin } from '@/services/login'; import { history } from 'umi'; import cookie from 'react-cookies'; import moment from 'moment'; import FrameFaceLogin from '../faceLogin/FrameFaceLogin'; import { fromPairs } from 'lodash'; const layout = { labelCol: { span: 7 }, wrapperCol: { span: 13 }, }; export interface RgbParams { type: string; image: string; } const Index: React.FC<{}> = () => { const [form] = Form.useForm(); const [imgUrl, setImgUrl] = useState(''); const [tmpToken, setTmpToken] = useState(''); const remainingTime = 3 //刷新token的剩余时间,单位小时 const [changeForm] = Form.useForm(); const [isModalVisible, setIsModalVisible] = useState(false) const [spinning, setSping] = useState(false);//加载遮罩 const [isFaceLogin, setIsFaceLogin] = useState(false); const video = useRef(); const whetherIE = useRef(false); const genRandomString = (len: number) => { const text = 'abcdefghijklmnopqrstuvwxyz0123456789'; const rdmIndex = (text: string | any[]) => (Math.random() * text.length) | 0; let rdmString = ''; for (; rdmString.length < len; rdmString += text.charAt(rdmIndex(text))); return rdmString; }; const changeCaptcha = () => { let tmpToken = genRandomString(16); let url = '/api/auth/captcha?token=' + tmpToken; setTmpToken(tmpToken); setImgUrl(url); }; //登录刷新Token方法 const refreshToken = async (data: any) => { const params = { grant_type: "refresh_token", refresh_token: data?.refreshToken?.value, client_id: REACT_APP_CLIENT_KEY, client_secret: REACT_APP_CLIENT_SECRET, } const header = { clientId: REACT_APP_CLIENT_KEY, } await refreshTokenApi(params, header).then(res => { if (res?.success == true) { sessionStorage.setItem('Authorization', res?.data?.value); sessionStorage.setItem('refreshToken', res?.data?.refreshToken.value); sessionStorage.setItem('scope', res?.data?.scope); history.push('/redirect'); } }) } const handleSubmit = async (values: any) => { await ZjfakeAccountLogin({ ...values, tmpToken }).then((res) => { if (res?.success) { if (moment(res?.data?.expiration).diff(moment(), 'hours') < remainingTime) { refreshToken(res?.data) } else { sessionStorage.setItem('Authorization', res?.data?.value); sessionStorage.setItem('refreshToken', res?.data?.refreshToken.value); sessionStorage.setItem('scope', res?.data?.scope); history.push('/redirect'); } } changeCaptcha(); }); }; const hanleFaceSubmit = async (multipartFiles: any, values: any) => { let userName = form.getFieldValue('userName'); if(whetherIE.current){ if(!multipartFiles){ const childFrameObj = document.getElementById('faceLoginFrame'); childFrameObj.contentWindow.postMessage('capture', '*'); }else{ await ZjfakeFaceLogin({ userName, multipartFiles }).then((res) => { if (res?.success) { if (moment(res?.data?.expiration).diff(moment(), 'hours') < remainingTime) { refreshToken(res?.data) } else { sessionStorage.setItem('Authorization', res?.data?.value); sessionStorage.setItem('refreshToken', res?.data?.refreshToken.value); sessionStorage.setItem('scope', res?.data?.scope); history.push('/redirect'); } } }); } } else{ if(!multipartFiles){ const canvas = document.createElement('canvas'); canvas.setAttribute('width','300'); canvas.setAttribute('height', '200'); const context = canvas.getContext('2d'); context.drawImage(video.current, 0, 0, 300, 200); canvas.toBlob(function (result:any) { hanleFaceSubmit(result, null); }) }else{ await ZjfakeFaceLogin({ userName, multipartFiles }).then((res) => { if (res?.success) { if (moment(res?.data?.expiration).diff(moment(), 'hours') < remainingTime) { refreshToken(res?.data) } else { sessionStorage.setItem('Authorization', res?.data?.value); sessionStorage.setItem('refreshToken', res?.data?.refreshToken.value); sessionStorage.setItem('scope', res?.data?.scope); history.push('/redirect'); } } }); } } } const handleOk = () => { // 确定修改密码 if (changeForm.getFieldValue("newPassword") !== changeForm.getFieldValue("newPassword1")) { message.warn('两次密码输入不一致,请重新输入') } else { changeForm.validateFields().then(res => { setSping(true); const date = { identityCard: changeForm.getFieldValue("identityCard"), oldPassword: changeForm.getFieldValue("oldPassword"), newPassword: changeForm.getFieldValue("newPassword"), }; changePass({ ...date }).then(res => { if (res.success) { setSping(false); setIsModalVisible(false) message.success('修改密码成功'); changeForm.resetFields() } else { setSping(false); } }).finally(() => { setSping(false); });; }) } } //登录模式改变事件 const LoginModeChangeEvent = (mode: any) => { switch(mode){ case 1: setIsFaceLogin(true); InitMedia(); break; case 2: setIsFaceLogin(false); break; } } //浏览器类型 const BrowserType = () =>{ //取得浏览器的userAgent字符串 var userAgent = navigator.userAgent; //判断是否IE<11 var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE的Edge浏览器 var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE11 var isIE11 = userAgent.indexOf("Trident") > -1 && userAgent.indexOf("rv:11.0") > -1; if(isIE){ var reIE = new RegExp("MSIE(\\d+\\.\\d+);"); reIE.test(userAgent); var fIEVersion = parseFloat(RegExp["$1"]); if(fIEVersion == 7){ return 7; }else if(fIEVersion == 8){ return 8; }else if(fIEVersion == 9){ return 9; }else if(fIEVersion == 10){ return 10; }else{ //IE版本<=7 return 6; } }else if(isEdge){ return 'edge'; }else if(isIE11){ //IE11 whetherIE.current = true; return 11; }else{ //不是IE浏览器 return -1; } } //初始化video const InitMedia = () => { BrowserType(); if(!whetherIE.current){ InitUserMedia({video : {width: 480, height: 320}}, success, error); } }; //访问用户媒体设备的兼容方法 const InitUserMedia = (constraints: any, success: any, error: any) => { if (navigator.mediaDevices.getUserMedia) { //最新的标准API navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error); } else if (navigator.webkitGetUserMedia) { //webkit核心浏览器 navigator.webkitGetUserMedia(constraints,success, error); } else if (navigator.mozGetUserMedia) { //firfox浏览器 navigator.mozGetUserMedia(constraints, success, error); } else if (navigator.getUserMedia) { //旧版API navigator.getUserMedia(constraints, success, error); } } //调用媒体设备成功回调方法 const success = (stream: any) => { //兼容webkit核心浏览器 const CompatibleURL = window.URL || window.webkitURL; //将视频流设置为video元素的源 console.log(stream); //video.src = CompatibleURL.createObjectURL(stream); video.current.srcObject = stream; video.current.play(); } //调用媒体设备失败回调方法 const error = (error:any) => { message.warn('无法获取到摄像头权限,请确认是否存在摄像头及是否授权使用摄像头'); console.log(`访问用户媒体设备失败${error.name}, ${error.message}`); } //base64转blob const base64ToBlob = (base64:string) =>{ const parts = base64.split(";base64,"); const contentType = parts[0].split(":")[1]; const raw = window.atob(parts[1]); const rawLength = raw.length; const uInt8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; i += 1) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], { type: contentType }); }; //RgbToBase64 const RgbToBase64 = async (image:any) =>{ await rgbToBase64({image}).then(res => { const _blob = base64ToBlob( 'data:image/jpg;base64,' + res.data); hanleFaceSubmit(_blob, null); }); } useEffect(() => { cookie.remove('mall3_token'); sessionStorage.clear(); changeCaptcha(); }, []); return (

中国联通智慧供应链平台 | 招标采购中心

登 录

{!isFaceLogin ? (
} placeholder="请输入用户名" /> } placeholder="请输入密码" addonAfter={ LoginModeChangeEvent(1)}/>} /> } placeholder="请输入验证码" /> changeCaptcha()} src={imgUrl} /> {/* 记住密码 */}
):(
} placeholder="请输入用户名" addonAfter = { LoginModeChangeEvent(2)}/>} /> {/* 加载摄像头 */} {!whetherIE.current ? ():()} {/* onClick={() => {hanleFaceSubmit(null, null);}} */}
)}
{/*
版权所有:中国联合网络通信有限公司
*/} setIsModalVisible(false)} footer={[ , ]} width={600} >
{ const oNumber = new RegExp(/\d/); const oLetter = new RegExp(/[a-zA-Z]/); const oSpecial = '.~!@#$%^&*()_+=-{}|:<>?,./[]-;\\"'; if (!value) { callback('请输入新密码'); return; } if (value.length < 6) { callback('密码不能小于六位,至少含字母、数字、特殊字符其中的2种!'); return; } try { [...value].forEach(val => { if ( !( oNumber.test(val) || oLetter.test(val) || oSpecial.indexOf(val) >= 0 ) ) { throw new Error(); } }); } catch (e) { callback('密码不能小于六位,至少含字母、数字、特殊字符其中的2种!'); } const contain: boolean[] = []; [...value].forEach(val => { if (oNumber.test(val)) { contain[0] = true; } if (oLetter.test(val)) { contain[1] = true; } if (oSpecial.indexOf(val) >= 0) { contain[2] = true; } }); if (contain.filter(item => item === true).length < 2) { callback('密码不能小于六位,至少含字母、数字、特殊字符其中的2种!'); return; } callback(); } } ]} // rules={[ // { // required: true, // message: '请输入新密码', // }, // ]} >
); }; export default Index;