登录:
1.前端表单验证-减轻服务器的负载-DOM操作写特效
- 1.账号验证:绑定change事件,判断value是否符合账号正则
- 2.密码验证:密码要符合格式(自己定制的:比如大小写、特殊符号)
2.post暗文把密码发送给后端--(还有一种技术JWT)
3.等待后端返回数据
如果返回的数据包的业务码是xxx,就操作页面xx
如果返回的数据包的业务时正确的,就跳转到首页或其它页面
4.验证码:
1.前端页面渲染就请求验证码=>后端生成验证码然后设置到缓存,再把验证码发送给前端
2.前端获取用户输入的验证码发送给后端=>取出缓存和接收到的做对比
代码实例:
前端:
html:
<!-- 引入axios -->
<script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/axios/0.26.0/axios.js"
type="application/javascript"></script>
<!-- 登录页面 -->
<!-- 账号、密码、验证码 -->
账号:<input type="text" id="account">
<div class="accountgs">4到16位(字母,数字,下划线,减号)</div>
<br><br>
密码:<input type="text" id="pwd">
<div class="pwdgs">至少4-10个字符,至少1个大写字母,1个小写字母和1个数字</div>
<br><br>
验证码:<input type="text" id="auth">
<br><br>
<div class="verif"></div>
<br><br>
<button onclick="fn()">登录</button>
<button onclick="fm()">注册</button>
css样式:
<style>
.accountgs{
font-size: 1px;
}
.pwdgs{
font-size: 1px;
}
</style>
js文件:
<script>
//利用Dom操作获取元素
var account=document.querySelector("#account")
var accountgs=document.querySelector(".accountgs")
var pwd=document.querySelector("#pwd")
var pwdgs=document.querySelector(".pwdgs")
var verif=document.querySelector(".verif")
var auth=document.querySelector("#auth")
var arr=[true,true]
// 用正则表达式设置用户名的格式:4到16位(字母,数字,下划线,减号)
account.addEventListener("change",function(){
let reg=/^[a-zA-Z0-9_-]{4,16}$/
if(reg.test(account.value)){
accountgs.style.color=""
account.style.border="2px green solid"
}else{
accountgs.style.color="red"
account.style.border="red 2px solid"
arr[0]=false
}
})
// 用正则表达式设置密码的格式: 至少4-10个字符,至少1个大写字母,1个小写字母和1个数字,其他可以是任意字符
pwd.addEventListener("change",function(){
let reg=/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{4,10}$/
if(reg.test(pwd.value)){
pwdgs.style.color=""
pwd.style.border="2px green solid"
}else{
pwdgs.style.color="red"
pwd.style.border="red 2px solid"
arr[1]=false
}
})
// 验证码
// 需使用svg-captcha第三方模块
// 绑定一个点击事件,如果用户看不懂,点击可以帮它重新请求一个新的验证码
verif.onclick=getverif
function getverif(){
// 点击验证码盒子,就重新请求后端发送一个新的验证码
// 做网络请求,后端返回一个数据包
// 返回值是一个字符串,字符串,浏览器是可以识别的
axios.get("/verif").then(res=>{
console.log(res)
verif.innerHTML=res.data
})
}
getverif()
// 点击登录按钮,去首页
async function fn(){
if(arr.includes(false)){
alert("请按照格式要求填写信息")
}else{
var re1=account.value
var re2=pwd.value
var re3=auth.value
var data=new FormData()
data.append("account",`${re1}`)
data.append("pwd",`${re2}`)
data.append("auth",`${re3}`)
var data2=await axios.post("/login",data)
if(data2.data.code==4004){
alert("验证码输入错误")
}else{
if(data2.data.code==4001){
window.open("/../public/Homepage/Homepage.html")
}else if(data2.data.code==4002){
alert("该账号未注册")
re1=""
re2=""
}else if(data2.data.code==4003){
alert("密码错误")
re1=""
re2=""
}
}
}
}
// 点击注册按钮,直接跳转到注册页面
var fm=function(){
window.open("/../public/registered/registered.html")
}
</script>
后端:
home.js文件:
1.登录
// 登录页面的后端
async login(){
// 接收前端发送的数据包
console.log(2222222222)
var filed=this.ctx.request.body
// 先验证验证码是否正确
// 防止脚本一直登录
// 取出缓存中加密的验证码
// console.log(111111111)
let verif=this.ctx.session.verif
if(filed.auth==verif){
// this.ctx.body={info:"验证码正确",code:4005}
// 在mysql数据库中查询账号是否存在
var sql1=`SELECT account FROM user WHERE account="${filed.account}"`
var data1=await this.app.mysql.query(sql1)
if(data1[0]){
// 如果账号存在
// 我们就查询前端发送的密码是否该账号在数据库中的密码一致
// 如果一致,就返回4001
// 如果不一致,就返回4003
// 1.查询该账号的密码
var sql2=`SELECT pwd FROM user WHERE account="${filed.account}"`
var data2=await this.app.mysql.query(sql2)
// 由于账号名不是唯一的,一个账号名可以有多个用户,不同的密码
// 所以我们创建一个空数组,有一个密码相同,就在数组中添加一个true
// 只要数据库中账号名对应的密码有一个和前端发送过来的密码一致
// 也就是只要数组中存在true,后端就向前端返回一个4001
// 就可以登录成功
// 如果数组中全是false,后端就向前端返回一个4003
// console.log(data2[i].pwd,111111111111111111111111111)
// console.log(filed.pwd,2222222222)
if(data2[0].pwd==filed.pwd){
// 如果密码正确,用户就会登录成功
// 但是每次用户进入网页后,一直登录,就会很麻烦
// 于是,当用户登录成功后
// 我们给用户信息的设置缓存,在一定的时间范围内,将用户的一些非隐私信息缓存在浏览器中
// 只要用户进入这个网页
// 我们就会为这个用户自动登录
this.ctx.body={info:"密码正确",code:4001}
// 给用户的账号,设置缓存
// this.ctx.cookies.set("account",`${filed.account}`)
// 取出缓存(在进入首页时,就获取缓存的信息,渲染到页面)
// this.ctx.cookies.get("account")
this.ctx.cookies.set("account",`${filed.account}`)
}else{
this.ctx.body={info:"密码错误",code:4003}
}
}
else{
// 如果账号不存在,就返回4002
this.ctx.body={info:"账号不存在",code:4002}
}
}else{
this.ctx.body={info:"验证码错误",code:4004}
}
}
2.验证码:
// 验证码
async verif(){
// 1.生成验证码
var captcha=svgcaptcha.create({
size:4,
color:true,
background:"gray"
});
// console.log(captcha.data,11111111)
// 2.设置缓存
// 将验证码的信息加密缓存到浏览器中
// 验证码里面的字母、数字:captcha.text
// console.log(captcha.text,222222222222)
this.ctx.session.verif=captcha.text
// 3.发送给前端
this.ctx.body=captcha.data
}
router.js文件:
// 注册登录页面的路由
router.post("/login",controller.user.login)
// 注册验证码的路由
router.get("/verif",controller.user.verif)