forgeplus-react/src/modules/loginRegister/Register.jsx

366 lines
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useEffect, useRef, useState } from "react";
import { Form, Input, Button, Checkbox, message } from "antd";
import { Link } from "react-router-dom";
import axios from 'axios';
import { setmiyah } from 'educoder';
import './LoginRegisterPage.scss';
import OtherLogin from "./component/otherLogin";
import { Encrypt } from "../../common/Env";
import { getCurrentRole } from "../../forge/Information/api";
function Register(props){
const {form, mygetHelmetapi,location} = props;
const {search} = location;
const {getFieldDecorator, setFieldsValue } = form;
//用户输入的符合规则的邮箱(用于获取验证码)
const [emailStr, setEmailStr] = useState(undefined);
//用户输入的符合规则的用户名用于当用户输入符合规则的用户名之后再更改又去触发check.json接口
const [loginStr, setLoginStr] = useState(undefined);
const [secondsStr, setSecondsStr] = useState(60);
const [countDown, setCountDown] = useState(false);
const [getCaptchaBut, setGetCaptchaBut] = useState(false);
const [mess, setMess] = useState(undefined);
const [tipVisable, setTipVisable] = useState(false);
//用于表单提交时会再次校验数据
const [userNameGo, setUserNameGo] = useState(true);
const [emailGo, setEmailGo] = useState(true);
// 注册类型(手机号/邮箱)
const [registerType, setRegisterType] = useState(0);
const [setting, setSetting] = useState(undefined);
const seconds = useRef();
let interval = undefined;
useEffect(()=>{
//获取第三方登录平台信息
setSetting(JSON.parse(localStorage.getItem("chromesetting")));
},[])
// 配置网页标题
useEffect(()=>{
if(mygetHelmetapi){
const {name} = mygetHelmetapi;
document.title = name;
}
}, [mygetHelmetapi])
//注册表单提交
function handleSubmit(){
form.validateFields((err, values) => {
if (!err) {
const user_login = values.register_username.trim()
values.agreement && axios.post(`/accounts/register.json`, {
login: values.email,
namespace: user_login,
password: Encrypt(values.register_psd),
password_confirmation: Encrypt(values.psdComfirm),
code: values.captcha
}).then((response)=>{
if(response.data && response.data.status === -6){
//验证码不正确
form.setFields({captcha: {value:values.captcha,errors:[new Error('验证码错误,请重新输入')]}});
//设置邮箱内容-》不设置会被恢复成undefined,从而点击验证码失败
setEmailStr(values.email);
}else if(response.data && response.data.status === 0){
//注册成功页面跳转即可注册后登录流程forge处理了
const searchParams = new URLSearchParams(search.substring(1));
const goPage = searchParams.get("go_page");
if(goPage && goPage.includes("gitlink.educoder.net")){
const params = `websiteName=gitlink&openkey=${Base64.encode("05e9081ede2e7425db064df44b5fb1897234f44f922443b89597d17b60dc8f3e")}&sign=cdf0f69b4d5b4293f7914cc1f1f31742&login=${user_login}${values.email.includes("@") ? `&mail=${values.email}` : `&phone=${values.email}&mail=${user_login}@example.org`}`
getCurrentRole(34, 375).finally(()=>{
const decodedGoPage = decodeURIComponent(goPage);
const separator = decodedGoPage.includes('?') ? '&' : '?';
window.location.href = decodedGoPage + separator + params;
})
}else{
window.location.href = goPage ? decodeURIComponent(goPage) : `/${user_login}`
}
} else {
setEmailStr(values.email);
setMess(response.data.message);
}
})
}
});
}
//判断用户名username是否注册
function usernameConfirm(rule, value, callback){
setUserNameGo(true);
value && (userNameGo || value !== loginStr) ? axios.post(`/accounts/check.json`, {
value: value.trim(),
type: 1
}).then(response => {
if (response.data.status === -1) {
callback(response.data.message);
} else {
setLoginStr(value);
setUserNameGo(false);
callback();
}
}):callback();setLoginStr(undefined);
}
//判断邮箱/手机号是否符合规范、是否注册
function emailConfirm(rule, value, callback) {
if(value){
if((/^([1][3456789])\d{9}$/.test(value) && !registerType) || (/^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(value) && registerType)){
setEmailGo(true);
(emailGo || value !== emailStr) ? axios.get(`/accounts/valid_email_and_phone.json`, {
params: {
login: value,
type: 1
}
}).then(response => {
if(!response.data.status){
setEmailStr(value);
setGetCaptchaBut(true);
setEmailGo(false);
callback();
}else{
setGetCaptchaBut(false);
// callback(response.data.status === -2 ? `该${registerType ? '邮箱' : '手机号'}已被注册` : response.data.message);
callback(response.data.message);
}
}):callback();// setEmailStr(undefined);
}else{
callback(`请输入正确的${registerType ? '邮箱地址' : '手机号'}`);
}
}else{
callback(`请输入${registerType ? '邮箱地址' : '手机号'}`);
}
}
//确认密码
function comfirmPassWord(rule, value, callback, index) {
if ((index === 2 && value && form.getFieldValue('register_psd') && value !== form.getFieldValue('register_psd')) || (index === 1 && value && form.getFieldValue('psdComfirm') && value !== form.getFieldValue('psdComfirm'))) {
if(index===1){
form.setFields({psdComfirm: {value:form.getFieldValue('psdComfirm'),errors:[new Error('密码不一致,请重新输入')]}});
callback();
}else{
callback('密码不一致,请重新输入');
}
} else {
callback();
}
}
//检查密码是否符合格式
function checkPassWord(rule, value, callback){
if(!value){
setTipVisable(true);
callback('请输入登录密码');
}else if(/(?!.*\s)(?!^[\u4e00-\u9fa5]+$)^.{8,16}$/.test(value)){
callback()
}else{
setTipVisable(true);
if(value.length<8 || value.length>16){
callback('密码长度为8-16个字符');
}else{
callback('密码不能使用空格');
}
}
}
//确认勾选服务
function comfirmRead(rule, value, callback){
if(value){
callback();
}else{
callback("请阅读并接受我们的服务条款");
}
}
//获取验证码
function getCaptcha() {
setMess(undefined);
if (emailStr) {
// 倒计时开始
setCountDown(true);
setGetCaptchaBut(false);
seconds.current = 60;
setSecondsStr(60);
!interval && clearInterval(interval);
interval = setInterval(() => {
if (seconds.current > 1) {
let oldSeconds = seconds.current;
seconds.current = oldSeconds - 1;
setSecondsStr(oldSeconds - 1);
} else {
clearInterval(interval);
//倒计时结束->可以获取验证码
setGetCaptchaBut(true);
setCountDown(false);
}
}, 1000)
//请求获取验证码接口
axios.get(`/accounts/get_verification_code.json`, {
params: {
login: emailStr,
type: 1,
smscode: setmiyah(emailStr),
}
}).then(response => {
if (response.data && response.data.status === 0) {
//验证码发送成功
let email = emailStr.substring(emailStr.indexOf("@")+1);
message.success({content:<span>验证码已发送请注意查收{registerType ? <a href={`https://mail.${email}`} target="_blank">前往邮箱</a> : ''}</span>});
} else {
//验证码发送失败,获取验证码按钮变灰并且文案变回【获取验证码】
setGetCaptchaBut(false);
setCountDown(false);
clearInterval(interval);
setMess(response.data.message);
}
})
}
}
//清除密码框的value属性->DOM看不见密码值
function clear(){
const password = document.getElementById("register_register_psd");
const passwordComfirm = document.getElementById("register_psdComfirm");
if(password && password.type==="password"){
setTimeout(()=>{
password.removeAttribute('value');
},0)
}
if(passwordComfirm && passwordComfirm.type==="password"){
setTimeout(()=>{
passwordComfirm.removeAttribute('value');
},0)
}
}
function changeRegisterType(type){
setGetCaptchaBut(false);
setRegisterType(type);
setFieldsValue({'email': undefined})
}
return(
<div>
<div className="right_cont Register_content">
<div className="login_register_head mb30">
<span>欢迎注册 GitLink</span>
<span className="link_span">已有账号<Link to={`/login${search}`}>立即登录</Link></span>
</div>
<div className="registerNav mb20 font-18">
<a className={`type ${registerType ? '' : 'activeRegisterNav'}`} onClick={()=>{changeRegisterType(0)}}>手机号注册</a>
<a className={`type ${registerType ? 'activeRegisterNav' : ''} ml50`} onClick={()=>{changeRegisterType(1)}}>邮箱注册</a>
</div>
<p className={mess ? "message active" : "message"}>{mess}</p>
<Form className="login-form">
<Form.Item>
{getFieldDecorator('register_username',{
rules:[
{
transform: (value)=>{return value.trim()}
},
{
required:true,
message:"请输入用户名"
},
{
pattern: /^[a-zA-Z]/,
message: "用户名必须以字母开头"
},
{
pattern: /[a-zA-Z0-9]$/,
message: "用户名只能使用英文字母和数字"
},
{
pattern: /^[^\s]*$/,
message: "用户名不能包含空格"
},
{
min: 4,
max: 15,
message: "用户名长度为4到15个字符"
},
{
validator: (rule, value, callback) => { usernameConfirm(rule, value, callback) }
}
],
validateTrigger:"onBlur",
validateFirst: true,
})(<Input placeholder="请输入4-15位用户名以字母开头只能使用字母和数字" autoComplete="off"/>)}
</Form.Item>
<Form.Item>
{getFieldDecorator('email',{
rules:[
{
validator: (rule, value, callback) => { emailConfirm(rule, value, callback) }
}
],
validateTrigger:"onBlur",
validateFirst: true,
})(<Input className="email" placeholder={`请输入${registerType ? '邮箱地址' : '手机号'}`} autoComplete="off"/>)}
</Form.Item>
<Form.Item>
<div className="login_register_head">
{getFieldDecorator('captcha', {
rules: [{
required: true,
message: "请输入验证码"
}],
validateTrigger: "onBlur",
})(
<Input className="captcha" placeholder="请输入验证码" autoComplete="off"/>
)}
<Button className={getCaptchaBut ? 'codeBut':'codeBut disable'} disabled={!getCaptchaBut} onClick={getCaptcha}>{getCaptchaBut || (!getCaptchaBut && !countDown)?"获取验证码":`重发(${secondsStr}s)`}</Button>
</div>
</Form.Item>
<Form.Item>
{getFieldDecorator('register_psd',{
rules:[
{
validator: (rule, value, callback) => { comfirmPassWord(rule, value, callback, 1) }
},
{
validator: (rule, value, callback) => { checkPassWord(rule, value, callback) }
}
],
validateTrigger:"onBlur",
validateFirst: true,
})(<Input.Password className="register_psd" placeholder="请输入登录密码" onBlur={clear} onChange={clear} autoComplete="new-password"/>)}
</Form.Item>
<span className="password_tips" style={{display:tipVisable?"none":"block"}}>请输入8-16位密码区分大小写不能使用空格</span>
<Form.Item>
{getFieldDecorator('psdComfirm', {
rules: [
{
required: true,
message: "请确认登录密码"
},
{
validator: (rule, value, callback) => { comfirmPassWord(rule, value, callback, 2) }
}
],
validateTrigger: "onBlur",
validateFirst: true,
})(<Input.Password className="psdComfirm" placeholder="请确认登录密码" onBlur={clear} onChange={clear} autoComplete="new-password"/>)}
</Form.Item>
<Form.Item className="register_last_form">
{getFieldDecorator('agreement', {
valuePropName: 'checked',
initialValue: false,
rules: [
{
validator: (rule, value, callback) => { comfirmRead(rule, value, callback) }
}
],
})(<Checkbox className="link_span">我已阅读并接受<a className="login-form-forgot" href="https://forum.trustie.net/forums/5029/detail" target="_blank">GitLink服务协议条款</a></Checkbox>)}
</Form.Item>
<Button type="primary" htmlType="submit" className="login_register_cofBut" onClick={handleSubmit}>注册</Button>
</Form>
<OtherLogin location={location} main_site_url={mygetHelmetapi && mygetHelmetapi.common && mygetHelmetapi.common.main_site_url}/>
</div>
</div>
)
}
export default Form.create({ name: 'register' })(Register);