🔨 Refactor: [前台]:登录,注册,重置密码加入表单校验
This commit is contained in:
parent
934d8acfa1
commit
4c64cbe67b
@ -25,20 +25,51 @@ class Login extends Component {
|
|||||||
this.state = {
|
this.state = {
|
||||||
str: "",
|
str: "",
|
||||||
password: "",
|
password: "",
|
||||||
rememberMe: false
|
rememberMe: false,
|
||||||
|
errorText: ""
|
||||||
};
|
};
|
||||||
this.query = queryString.parse(window.location.search);
|
this.query = queryString.parse(window.location.search);
|
||||||
}
|
}
|
||||||
|
|
||||||
valueChange = e => {
|
checkStr(value) {
|
||||||
|
if (value.length === 0) {
|
||||||
|
this.setState({ errorText: "用户名或邮箱为空" });
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.setState({ errorText: "" });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkPassword(value) {
|
||||||
|
if (/^(?=.*?\d+.*?)(?=.*?[a-zA-Z]+.*?)[\da-zA-Z]{6,20}$/.test(value)) {
|
||||||
|
this.setState({ errorText: "" });
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.setState({ errorText: "密码为6-20位数字密码组合" });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setValue(e) {
|
||||||
if (e.target.name === "rememberMe") {
|
if (e.target.name === "rememberMe") {
|
||||||
this.setState({ rememberMe: e.target.checked });
|
this.setState({ rememberMe: e.target.checked });
|
||||||
} else {
|
} else {
|
||||||
this.setState({ [e.target.name]: e.target.value });
|
const value = e.target.value.trim();
|
||||||
|
if (e.target.name === "str") {
|
||||||
|
this.checkStr(value);
|
||||||
|
} else {
|
||||||
|
this.checkPassword(value);
|
||||||
|
}
|
||||||
|
this.setState({ [e.target.name]: value });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
submit = () => {
|
submit = () => {
|
||||||
|
const { str, password } = this.state;
|
||||||
|
if (!(this.checkStr(str) && this.checkPassword(password))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
axios
|
axios
|
||||||
.post("/user/login", this.state)
|
.post("/user/login", this.state)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
@ -59,30 +90,31 @@ class Login extends Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { str, password, rememberMe } = this.state;
|
const { str, password, rememberMe, errorText } = this.state;
|
||||||
return (
|
return (
|
||||||
<LoginLayout type={LOGIN_TYPE}>
|
<LoginLayout type={LOGIN_TYPE}>
|
||||||
<div className={styles.main}>
|
<div className={styles.main}>
|
||||||
|
<div className={styles.errorText}>{errorText}</div>
|
||||||
<Input
|
<Input
|
||||||
type="text"
|
type="text"
|
||||||
size="large"
|
size="large"
|
||||||
name="str"
|
name="str"
|
||||||
value={str}
|
value={str}
|
||||||
onChange={this.valueChange}
|
onChange={this.setValue.bind(this)}
|
||||||
addonBefore={<IconFont type="icon-mail" style={{ fontSize: "0.3rem" }} />}
|
addonBefore={<IconFont type="icon-mail" style={{ fontSize: "0.3rem" }} />}
|
||||||
placeholder="邮箱或者用户名"
|
placeholder="邮箱或者用户名"
|
||||||
/>
|
/>
|
||||||
<Input.Password
|
<Input.Password
|
||||||
type="password"
|
type="password"
|
||||||
size="large"
|
size="large"
|
||||||
name="password"
|
|
||||||
value={password}
|
value={password}
|
||||||
onChange={this.valueChange}
|
name="password"
|
||||||
|
onChange={this.setValue.bind(this)}
|
||||||
addonBefore={<IconFont type="icon-password" style={{ fontSize: "0.3rem" }} />}
|
addonBefore={<IconFont type="icon-password" style={{ fontSize: "0.3rem" }} />}
|
||||||
placeholder="密码"
|
placeholder="密码"
|
||||||
/>
|
/>
|
||||||
<div className={styles.action}>
|
<div className={styles.action}>
|
||||||
<Checkbox checked={rememberMe} name="rememberMe" onChange={this.valueChange}>
|
<Checkbox checked={rememberMe} name="rememberMe" onChange={this.setValue.bind(this)}>
|
||||||
记住我
|
记住我
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
<Link to="/public/resetPassword">忘记密码</Link>
|
<Link to="/public/resetPassword">忘记密码</Link>
|
||||||
|
@ -4,6 +4,12 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
|
||||||
|
.errorText {
|
||||||
|
color: red;
|
||||||
|
width: 100%;
|
||||||
|
height: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
.action {
|
.action {
|
||||||
padding: 0.1rem 0;
|
padding: 0.1rem 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -5,6 +5,25 @@ import { LoginLayout, REGISTER_TYPE, RESET_PASSWORD_TYPE } from "../../../layout
|
|||||||
import styles from "./index.module.less";
|
import styles from "./index.module.less";
|
||||||
import axios from "../../../util/httpUtil";
|
import axios from "../../../util/httpUtil";
|
||||||
|
|
||||||
|
const pattern = {
|
||||||
|
username: {
|
||||||
|
pattern: /^[\da-zA-Z]{1,10}$/,
|
||||||
|
text: "用户名为1-10位的数字或者字母的组合"
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
pattern: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
|
||||||
|
text: "请输入合法的邮箱"
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
pattern: /^(?=.*?\d+.*?)(?=.*?[a-zA-Z]+.*?)[\da-zA-Z]{6,20}$/,
|
||||||
|
text: "密码为6-20位数字字母组合"
|
||||||
|
},
|
||||||
|
authCode: {
|
||||||
|
pattern: /^[\d]{6,6}$/,
|
||||||
|
text: "验证码为6位数字"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export default class Register extends React.Component {
|
export default class Register extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
@ -18,7 +37,8 @@ export default class Register extends React.Component {
|
|||||||
repassword: "",
|
repassword: "",
|
||||||
authCode: "",
|
authCode: "",
|
||||||
authCodeText: "获取验证码",
|
authCodeText: "获取验证码",
|
||||||
isCountDown: false
|
isCountDown: false,
|
||||||
|
errorText: ""
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,8 +57,6 @@ export default class Register extends React.Component {
|
|||||||
}
|
}
|
||||||
let count = 60;
|
let count = 60;
|
||||||
this.setState({ authCodeText: `${count}s后重试`, isCountDown: true });
|
this.setState({ authCodeText: `${count}s后重试`, isCountDown: true });
|
||||||
axios.get("/user/authCode?email=" + this.state.email).then(() => {
|
|
||||||
message.success("发送成功,请注意查收(检查垃圾箱)");
|
|
||||||
this.timer = setInterval(() => {
|
this.timer = setInterval(() => {
|
||||||
count--;
|
count--;
|
||||||
if (count === 0) {
|
if (count === 0) {
|
||||||
@ -48,23 +66,61 @@ export default class Register extends React.Component {
|
|||||||
}
|
}
|
||||||
this.setState({ authCodeText: `${count}s后重试` });
|
this.setState({ authCodeText: `${count}s后重试` });
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
axios.get("/user/authCode?email=" + this.state.email).then(() => {
|
||||||
|
message.success("发送成功,请注意查收(检查垃圾箱)");
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
changeData = e => {
|
changeData = e => {
|
||||||
this.setState({ [e.target.name]: e.target.value });
|
const name = e.target.name;
|
||||||
|
const value = e.target.value.trim();
|
||||||
|
this.setState({ [name]: value });
|
||||||
|
this.checkParam(name, value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段校验
|
||||||
|
* @param {*} key key
|
||||||
|
* @param {*} value 值
|
||||||
|
*/
|
||||||
|
checkParam(key, value) {
|
||||||
|
const { password } = this.state;
|
||||||
|
if (key === "repassword") {
|
||||||
|
if (password !== value) {
|
||||||
|
this.setState({ errorText: "两次密码不一致" });
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.setState({ errorText: "" });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const rule = pattern[key];
|
||||||
|
if (rule.pattern.test(value)) {
|
||||||
|
this.setState({ errorText: "" });
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.setState({ errorText: rule.text });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提交表单
|
* 提交表单
|
||||||
*/
|
*/
|
||||||
submit = () => {
|
submit = () => {
|
||||||
const { current, username, email, password, repassword, authCode } = this.state;
|
const { current, username, email, password, repassword, authCode } = this.state;
|
||||||
if (password !== repassword) {
|
let form = { username, email, password, authCode };
|
||||||
message.error("两次密码不一致");
|
if (current === REGISTER_TYPE && !this.checkParam("username", username)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const isOk =
|
||||||
|
this.checkParam("email", email) &&
|
||||||
|
this.checkParam("password", password) &&
|
||||||
|
this.checkParam("repassword", repassword) &&
|
||||||
|
this.checkParam("authCode", authCode);
|
||||||
|
if (!isOk) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let form = { username, email, password, authCode };
|
|
||||||
if (current === REGISTER_TYPE) {
|
if (current === REGISTER_TYPE) {
|
||||||
axios
|
axios
|
||||||
.put("/user", form)
|
.put("/user", form)
|
||||||
@ -87,10 +143,11 @@ export default class Register extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { current, username, email, password, repassword, authCode, authCodeText, isCountDown } = this.state;
|
const { current, username, email, password, repassword, authCode, authCodeText, isCountDown, errorText } = this.state;
|
||||||
return (
|
return (
|
||||||
<LoginLayout type={current}>
|
<LoginLayout type={current}>
|
||||||
<div className={styles.main}>
|
<div className={styles.main}>
|
||||||
|
<div className={styles.errorText}>{errorText}</div>
|
||||||
{current === REGISTER_TYPE ? (
|
{current === REGISTER_TYPE ? (
|
||||||
<Input
|
<Input
|
||||||
type="text"
|
type="text"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
.main {
|
.main {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 0.2rem;
|
padding: 0.2rem;
|
||||||
|
padding-top: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
|
||||||
@ -10,6 +11,12 @@
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.errorText {
|
||||||
|
color: red;
|
||||||
|
width: 100%;
|
||||||
|
height: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
.submit {
|
.submit {
|
||||||
margin-top: 0.1rem;
|
margin-top: 0.1rem;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user