页面使用elementUi实现,使用axios发送请求,所以先在项目里安装
npm install element-ui -S
npm install axios
邮箱发送验证码的实现可以去 完整实现项目在文末
https://blog.csdn.net/qq_64751323/article/details/139938646?spm=1001.2014.3001.5502
密码登陆页面
<template>
<div class="home">
<br>
<div class="login">
<br>
<div class="content">
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" class="demo-ruleForm">
<el-form-item label="" prop="username" style="font-size: 30px">
<el-input class="logins" type="text" v-model="ruleForm.username" autocomplete="off"
placeholder="请输入用户名"></el-input>
</el-form-item>
<el-form-item label="" prop="pass">
<el-input class="logins" type="password" v-model="ruleForm.pass" autocomplete="on"
placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" :plain="true" @click="userlogin('ruleForm')">登陆</el-button>
<router-link :to="{path: '/enrollLogin'}">
<el-button @click="refromnull">注册</el-button>
</router-link>
<router-link :to="{path: '/codeLogin'}">
<el-button type="danger" @click="refromnull">邮箱登陆</el-button>
</router-link>
</el-form-item>
<router-link :to="{path: '/resetLogin'}">
<span style="margin-left: 250px">忘记密码?</span>
</router-link>
</el-form>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import router from "@/router";
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
if (this.ruleForm.checkPass !== '') {
this.$refs.ruleForm.validateField('checkPass');
}
callback();
}
};
return {
ruleForm: {
pass: '',
username: '',
},
rules: {
username: [
{required: true, message: '请输入用户名', trigger: 'blur'},
],
pass: [
{validator: validatePass, trigger: 'blur'}
]
}
};
},
methods: {
userlogin() {
if (this.ruleForm.username === "") {
this.$message('请输入用户名');
} else if (this.ruleForm.pass === "") {
this.$message('请输入密码');
} else {
axios.post("/api/user/login", {
username: this.ruleForm.username,
password: this.ruleForm.pass
}).then(res => {
if (res.data.code === 0) {
this.$message("登陆成功")
router.push('/p1')
} else {
this.ruleForm.pass = ''
this.$message(res.data.message)
}
console.log("登陆成功" + res.data)
}).catch(roror => {
console.log("登陆失败" + roror.error)
})
}
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
refromnull() {
this.ruleForm.pass = null
this.ruleForm.username = null
}
}
}
</script>
<style scoped>
.home {
background: url("https://guanhuaer.oss-cn-chengdu.aliyuncs.com/login.jpg");
//背景可以是网址和本地文件,这里是我的oss仓库图片地址
background-size: cover;
height: 100vh;
}
.el-input {
font-size: 20px;
}
.el-form-item__error {
font-size: 16px;
}
.login {
display: flex;
width: 400px;
height: 400px;
background-color: white;
opacity: 0.7;
justify-content: center;
margin: auto;
margin-top: 20%;
text-align: center;
.logins {
width: 300px;
justify-content: center;
}
}
.content {
margin-top: 100px;
.el-button {
margin-left: 10px;
}
}
</style>
验证码登陆
<template>
<div class="home">
<br>
<div class="login">
<br>
<div class="content">
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" class="demo-ruleForm">
<el-form-item label="" prop="email">
<el-input type="email" v-model="ruleForm.email" placeholder="请输入邮箱"></el-input>
</el-form-item>
<el-form-item label="" prop="code">
<div class="verify-wrapper">
<el-input style="width: 200px;" type="text" maxlength="6" suffix-icon="el-icon-lock"
placeholder="请输入验证码" v-model="ruleForm.code"/>
<el-button class="btn-orange" style="margin-left: 5px" :plain="true" :disabled="disabled" @click="tackBtn">{{ valiBtn }}
</el-button>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="codelogin">登陆</el-button>
<router-link :to="{path: '/enrollLogin'}">
<el-button @click="refromnull" :plain="true">注册</el-button>
</router-link>
<router-link :to="{path: '/userLogin'}">
<el-button type="danger" @click="refromnull">密码登陆</el-button>
</router-link>
</el-form-item>
</el-form>
<router-link :to="{path: '/resetLogin'}">
<span style="margin-left: 250px">忘记密码?</span>
</router-link>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import router from "@/router";
export default {
data() {
return {
disabled: false,
valiBtn: '获取验证码',
ruleForm: {
email: '',
code: ''
},
rules: {
code: [
{required: true, message: '请输入验证码', trigger: 'blur'},
],
email: [
{required: true, message: '请输入邮箱地址', trigger: 'blur'},
{type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']}
]
}
};
},
methods: {
codelogin() {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (emailRegex.test(this.ruleForm.email) == true && this.ruleForm.code != "") {
axios({
url: '/api/user/codelogin',
method: "post",
data: {
email: this.ruleForm.email,
code: this.ruleForm.code
}
}).then(res => {
this.$message(res.data.message)
router.push("/p1")
}).catch(error => {
console.log("登陆失败" + error.error)
})
} else {
this.$message("请输入信息")
}
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
tackBtn() { //验证码倒数60秒
// 验证电子邮件地址的正则表达式函数
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(emailRegex.test(this.ruleForm.email))
if (this.ruleForm.email == "" || emailRegex.test(this.ruleForm.email) == false) {
this.$message('请输入正确的邮箱');
} else {
let time = 60;
axios({
url: '/api/user/code',
method: 'post',
data: {
email: this.ruleForm.email
}
}).then(res => {
if (res.data.data.code == 0) {
console.log("发送成功" + res.data.data)
} else {
console.log("发送失败" + res.data.data)
}
}).catch(error => {
console.log("发送失败" + error.error)
})
let timer = setInterval(() => {
if (time == 0) {
clearInterval(timer);
this.valiBtn = '获取验证码';
this.disabled = false;
} else {
this.disabled = true;
this.valiBtn = time + '秒后重试';
time--;
}
}, 1000);
}
},
refromnull() {
this.ruleForm.code = null
this.ruleForm.email = null
}
}
}
</script>
<style scoped>
.home {
background: url("@/assets/login.jpg");
background-size: cover;
height: 100vh;
}
.el-input {
font-size: 20px;
}
.el-form-item__error {
font-size: 16px;
}
.login {
display: flex;
width: 400px;
height: 400px;
background-color: white;
opacity: 0.7;
justify-content: center;
margin: auto;
margin-top: 20%;
text-align: center;
.logins {
width: 300px;
justify-content: center;
}
}
.content {
margin-top: 100px;
.el-button {
margin-left: 10px;
}
}
</style>
注册
<template>
<div class="home">
<br>
<div class="login">
<br>
<div class="zhuce">
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" class="demo-ruleForm">
<el-form-item label="" prop="username" style="font-size: 30px">
<el-input type="text" v-model="ruleForm.username" autocomplete="off"
placeholder="请输入用户名"></el-input>
</el-form-item>
<el-form-item label="" prop="email">
<el-input type="email" v-model="ruleForm.email" placeholder="请输入邮箱"></el-input>
</el-form-item>
<el-form-item label="" prop="pass">
<el-input type="password" v-model="ruleForm.pass" autocomplete="on"
placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item label="" prop="checkPass">
<el-input type="password" v-model="ruleForm.checkPass" autocomplete="on"
placeholder="请确认密码"></el-input>
</el-form-item>
<el-form-item label="" prop="code">
<div class="verify-wrapper">
<el-input style="width: 220px" type="text" maxlength="6" suffix-icon="el-icon-lock"
placeholder="请输入验证码" v-model="ruleForm.code"/>
<el-button class="btn-orange" style="margin-left: 10px" :plain="true" :disabled="disabled"
@click="tackBtn">{{ valiBtn }}
</el-button>
</div>
</el-form-item>
<el-form-item>
<el-button @click="enroll">注册</el-button>
<router-link :to="{path: '/userLogin'}">
<el-button type="primary" style="margin-left: 15px" @click="refromnull">登陆</el-button>
</router-link>
</el-form-item>
</el-form>
<router-link :to="{path: '/resetLogin'}">
<span @click="refromnull" style="margin-left: 270px">忘记密码?</span>
</router-link>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import router from "@/router";
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
if (this.ruleForm.checkPass !== '') {
this.$refs.ruleForm.validateField('checkPass');
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('请再次输入密码'));
} else if (value !== this.ruleForm.pass) {
callback(new Error('两次输入密码不一致!'));
} else {
callback();
}
};
return {
disabled: false,
valiBtn: '获取验证码',
ruleForm: {
pass: '',
checkPass: '',
email: '',
username: '',
code: ''
},
rules: {
username: [
{required: true, message: '请输入用户名', trigger: 'blur'},
],
code: [
{required: true, message: '请输入验证码', trigger: 'blur'},
],
pass: [
{validator: validatePass, trigger: 'blur'}
],
checkPass: [
{validator: validatePass2, trigger: 'blur'}
],
email: [
{required: true, message: '请输入邮箱地址', trigger: 'blur'},
{type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']}
]
}
};
},
methods: {
enroll() {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (this.ruleForm.username !== "" && this.ruleForm.email !== "" && emailRegex.test(this.ruleForm.email) === true &&
this.ruleForm.pass !== "" && this.ruleForm.checkPass !== "" && this.ruleForm.pass === this.ruleForm.checkPass
) {
axios.post("/api/user/register", {
username: this.ruleForm.username,
password: this.ruleForm.pass,
email: this.ruleForm.email,
code: this.ruleForm.code
}).then(res => {
if (res.data.code === 0) {
this.$message('注册成功');
router.push("/userLogin")
console.log("注册成功" + res.data.code)
} else {
this.$message(res.data.message)
}
}).catch(roror => {
console.log("注册失败" + roror.error)
})
} else {
this.$message('请输入信息');
}
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
tackBtn() { //验证码倒数60秒
// 验证电子邮件地址的正则表达式函数
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(emailRegex.test(this.ruleForm.email))
if (this.ruleForm.email === "" || emailRegex.test(this.ruleForm.email) === false) {
this.$message('请输入正确的邮箱');
} else {
let time = 60;
axios({
url: '/api/user/code',
method: 'post',
data: {
email: this.ruleForm.email
}
}).then(res => {
if (res.data.data.code === 0) {
console.log("发送成功" + res.data.data)
} else {
console.log("发送失败" + res.data.data)
}
}).catch(error => {
console.log("发送失败" + error.error)
})
let timer = setInterval(() => {
if (time == 0) {
clearInterval(timer);
this.valiBtn = '获取验证码';
this.disabled = false;
} else {
this.disabled = true;
this.valiBtn = time + '秒后重试';
time--;
}
}, 1000);
}
},
refromnull() {
this.ruleForm.code = null
this.ruleForm.pass = null
this.ruleForm.checkPass = null
this.ruleForm.email = null
this.ruleForm.username = null
}
}
}
</script>
<style scoped>
.home {
background: url("@/assets/login.jpg");
background-size: cover;
height: 100vh;
}
.el-input {
font-size: 20px;
}
.el-form-item__error {
font-size: 16px;
}
.login {
display: flex;
width: 400px;
height: 440px;
background-color: white;
opacity: 0.7;
justify-content: center;
margin: auto;
margin-top: 20%;
text-align: center;
.logins {
width: 300px;
justify-content: center;
}
}
.zhuce {
margin-top: 20px;
}
</style>
重置
<template>
<div class="home">
<br>
<div class="login">
<div class="zhuce">
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" class="demo-ruleForm">
<el-form-item label="" prop="email">
<el-input type="email" v-model="ruleForm.email" placeholder="请输入邮箱"></el-input>
</el-form-item>
<el-form-item label="" prop="pass">
<el-input type="password" v-model="ruleForm.pass" autocomplete="on"
placeholder="请输入密码" show-password ></el-input>
</el-form-item>
<el-form-item label="" prop="checkPass">
<el-input type="password" v-model="ruleForm.checkPass" autocomplete="on"
placeholder="请确认密码" show-password ></el-input>
</el-form-item>
<el-form-item label="" prop="code">
<div class="verify-wrapper">
<el-input style="width: 200px" type="text" maxlength="6" suffix-icon="el-icon-lock"
placeholder="请输入验证码" v-model="ruleForm.code"/>
<el-button class="btn-orange" style="margin-right: -2px" :plain="true" :disabled="disabled"
@click="tackBtn">{{ valiBtn }}
</el-button>
</div>
</el-form-item>
<el-form-item>
<router-link :to="{path: '/userLogin'}">
<el-button type="primary" @click="refromnull">登陆</el-button>
</router-link>
<el-button @click="reset" :plain="true">重置</el-button>
</el-form-item>
</el-form>
<router-link :to="{path: '/enrollLogin'}">
<span @click="refromnull" style="margin-left: 270px">没有账号?</span>
</router-link>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import router from "@/router";
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
if (this.ruleForm.checkPass !== '') {
this.$refs.ruleForm.validateField('checkPass');
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('请再次输入密码'));
} else if (value !== this.ruleForm.pass) {
callback(new Error('两次输入密码不一致!'));
} else {
callback();
}
};
return {
disabled: false,
valiBtn: '获取验证码',
ruleForm: {
pass: '',
checkPass: '',
email: '',
code: ''
},
rules: {
code: [
{required: true, message: '请输入验证码', trigger: 'blur'},
],
pass: [
{validator: validatePass, trigger: 'blur'}
],
checkPass: [
{validator: validatePass2, trigger: 'blur'}
],
email: [
{required: true, message: '请输入邮箱地址', trigger: 'blur'},
{type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']}
]
}
};
},
methods: {
reset() {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (emailRegex.test(this.ruleForm.email) === true && this.ruleForm.code !== "") {
axios({
url: '/api/user/reset',
method: "post",
data: {
email: this.ruleForm.email,
password: this.ruleForm.pass,
code: this.ruleForm.code
}
}).then(res => {
if (res.data.code === 0) {
this.$message("重置成功")
router.push("/userLogin")
} else {
this.$message(res.data.message)
}
}).catch(error => {
console.log("重置失败" + error.error)
})
} else {
this.$message("请输入信息")
}
},
tackBtn() { //验证码倒数60秒
// 验证电子邮件地址的正则表达式函数
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(emailRegex.test(this.ruleForm.email))
if (this.ruleForm.email === "" || emailRegex.test(this.ruleForm.email) === false) {
this.$message('请输入正确的邮箱');
} else {
let time = 60;
axios({
url: '/api/user/code',
method: 'post',
data: {
email: this.ruleForm.email
}
}).then(res => {
if (res.data.data.code == 0) {
console.log("发送成功" + res.data.data)
} else {
console.log("发送失败" + res.data.data)
}
}).catch(error => {
console.log("发送失败" + error.error)
})
let timer = setInterval(() => {
if (time == 0) {
clearInterval(timer);
this.valiBtn = '获取验证码';
this.disabled = false;
} else {
this.disabled = true;
this.valiBtn = time + '秒后重试';
time--;
}
}, 1000);
}
},
refromnull() {
this.ruleForm.code = null
this.ruleForm.pass = null
this.ruleForm.checkPass = null
this.ruleForm.email = null
}
}
}
</script>
<style scoped>
.home {
background: url("@/assets/login.jpg");
background-size: cover;
height: 100vh;
}
.el-input {
font-size: 20px;
}
.el-form-item__error {
font-size: 16px;
}
.login {
display: flex;
width: 400px;
height: 400px;
background-color: white;
opacity: 0.7;
justify-content: center;
margin: auto;
margin-top: 20%;
text-align: center;
.logins {
width: 300px;
justify-content: center;
}
}
.zhuce {
margin-top: 30px;
z-index: 999;
.el-button {
margin-left: 15px;
}
}
</style>
前后端登陆实现