第五章:实现后台登录,完成前后验证登录,并深入讲解captcha.js的使用方法和入‘坑‘指南

在本章中将讲解如何构建登录页面及验证码相关问题

登录页面实现代码:

<form class="layui-form">
                <div class="layui-form-item logo-title">
                    <h1>未来商城系统</h1><h1>后台登录</h1>
                </div>
                <div class="layui-form-item">
                    <label class="layui-icon layui-icon-username"></label>
                    <input type="text" name="username" v-model="username" lay-verify="required" placeholder="工号" autocomplete="off" class="layui-input" value="">
                </div>
                <div class="layui-form-item">
                    <label class="layui-icon layui-icon-password"></label>
                    <input type="password" name="password" v-model="password" lay-verify="required" placeholder="密码" autocomplete="off" class="layui-input" value="">
                </div>
                <div class="layui-form-item">
                    <label class="layui-icon layui-icon-vercode"></label>
                    <input type="text" name="captcha" v-model="captcha" lay-verify="required" placeholder="图形验证码" autocomplete="off" class="layui-input captcha" value="">
                    <div class="captcha-img" @click="createCaptcha()">
                        <canvas id="captcha1" style="width: 100%;height: 36px;"></canvas>
                    </div>
                </div>
                <div class="layui-form-item">
                    <input type="checkbox" name="rememberMe" value="true" lay-skin="primary" title="记住密码">
                </div>
                <div class="layui-form-item">
                    <input class="layui-btn layui-btn-normal layui-btn-fluid" @click="login()" type="button" value="登录" />
                </div>  
                </form> 	
        需要用到下面的资源:
        <script src="/future/util/layui/layui.js" charset="utf-8"></script>
		<script src="/future/vue/vue.min.js"></script>
		<script src="/future/vue/vue.resource.js"></script>
		<script src="/future/captcha/captcha.min.js"></script>
		<script src="/future/js/manager/login.js"></script>

captcha.js是一个生成验证码的工具
在html中想要生成验证码的位置:
<div class=“captcha-img” @click=“createCaptcha()”>

当第一次加载或点击验证码时会自动生成随机的验证码:

let vm = new Vue({
        el: "#page",
        data: {
            yzm: '',//验证码:js生成
            username:'',//用户名
            password:'',//密码
            captcha:'',//验证码:用户输入
            NewPwd:'',
            ConfirmPwd:'',
        },
        created(){
        },
        mounted() {
            this.createCaptcha();
        },
        methods: {
  //生成验证码
 createCaptcha() {
                let that = this;
                let captcha = new Captcha({
                    lineWidth: 1,   //线条宽度
                    lineNum: 3,       //线条数量
                    dotR: 1,          //点的半径
                    dotNum: 10,       //点的数量
                    preGroundColor: [0,1],    //前景色区间
                    backGroundColor: [200,255], //背景色区间
                    fontSize: 60,           //字体大小
                    fontFamily: ['微软雅黑'],  //字体类型
                    fontStyle: 'fill',      //字体绘制方法,有fill和stroke
                    content: 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',  //验证码内容
                    length: 5    //验证码长度
                });
                captcha.draw(document.querySelector("#captcha1"), code => {
                    console.log(code, "验证码输出");
                    that.yzm = code;
                })
  }
  });

上面这段代码可以写在new Vue({}) 的methods中供调用
需要注意的是:captcha.draw(这里面最好使用document.querySelector("#"),因为使用document.getElementById("#*")会出现问题)

在这里插入图片描述

通过打印输出获取到的验证码节点对象的值可以知道在mounted这个周期中下使用document.getElementById()无法获取到有效的值

需要注意的是:要确保dom加载完毕之后,再去调用captcha的draw方法(手动加载)

登录方法:采用正则验证,初次登陆需要修改密码(这是之前写的,以后可能要改动)

 login(){
                let that = this;
                let pwdReg = new RegExp("^(?![a-zA-z]+$)(?!\\d+$)(?![!@#$%^&*]+$)[a-zA-Z\\d!@#$%^&*]+$");
                let reg = /[\`~!@#$%^&*()_+-=<>?:"{},.\\\\/;'[\\]]/im;
                if (this.username == '') {
                    layer.msg('用户名不能为空');
                    return false;
                }else if(reg.test(this.username)){
                    layer.msg('不能包含非法字符');
                    return false;
                }
                if (this.password == '') {
                    layer.msg('密码不能为空');
                    return false;
                }else if(reg.test(this.password)){
                    layer.msg('不能包含非法字符');
                    return false;
                }
                if (this.captcha == '') {
                    layer.msg('验证码不能为空');
                    return false;
                } else if (this.captcha.toLowerCase() != this.yzm.toLowerCase()) {
                    layer.msg('验证码不正确');
                    return false;
                }
                let data = new FormData();
                data.append("mno",that.username);
                data.append("mpwd",that.password);
                data.append("loginip",returnCitySN['cip']);
                data.append("loginarea",returnCitySN['cname']);
                this.$http.post('/future/manager/login',data).then(res=>{
                    let data = res.data.pojo;
                    if("000000"==res.data.code){
                        layer.msg("用户名或密码错误",{icon:2,time:3000});
                    }else if("000001"==res.data.code){
                        layer.alert(res.data.message);
                    }else if("111110"==res.data.code){
                    //初次登录
                        layer.open({
                             type: 1
                            ,title: "修改密码" //不显示标题栏
                            ,closeBtn: false
                            ,area: ['40%','40%']
                            ,shade: 0.8
                            ,btn: ['确认','取消']
                            ,moveType: 1 //拖拽模式,0或者1
                            ,content: $('#openPage')
                            ,success: function(layero){
                                 $("#openPage").removeClass("layui-hide");
                            },
                            yes: function(index, layero){
                                console.log(vm.$data.NewPwd);
                                if(!pwdReg.test(vm.NewPwd)){
                                    layer.alert("密码须为 字母+数字 / 字母+特殊字符 / 数字+特殊字符 组合");
                                    return false;
                                }
                                if(that.ConfirmPwd!==that.NewPwd){
                                    layer.alert("两次密码输入不一致");
                                    return false;
                                }
                                $.ajax({
                                    url: "/future/manager/setPwd",
                                    type: "POST",
                                    data:JSON.stringify({mid:res.data.pojo.mid,mpwd:that.NewPwd}),
                                    contentType:"application/json;charset=utf-8",
                                    dataType:"json",
                                    async:false,
                                    success(res){
                                        console.log("返回码---",res.code);
                                        if("200"!=res.code){
                                            layer.alert(res.message);
                                            return false;
                                        }else{
                                            layer.msg("登录成功",{icon:1,time:3000},()=>{
                                                sessionStorage.setItem("manageInfo",JSON.stringify(data));
                                                window.location.href="index.html";
                                            });
                                        }
                                    },error(err){
                                        layer.alert(err);
                                    }
                                })
                            },
                            cancel: function(index) {
                                return true;
                            }
                        });
                    }else{
                    //登陆成功会将用户数据进行缓存
                        layer.msg("登录成功",{icon:1,time:3000},()=>{
                            sessionStorage.setItem("manageInfo",JSON.stringify(res.data.pojo));
                            window.location.href="index.html";
                        });
                    }
                }).catch(e=>{
                    console.log(e);
                })
            }

后端代码很少:
登录之后对登陆状态进行修改: Integer row = managerService.saveLoginStatus(manager1);

@PostMapping("/login")
    @ResponseBody
    public Result login(@Validated Manager manager, HttpServletRequest request) throws Exception {
        try {
            Manager manager1 = managerService.login(manager);
            if (null != manager1) {
                manager1.setLogin_success(1);
                Timestamp createTime = new Timestamp(new Date().getTime());
                manager1.setLastlogintime(createTime);
                manager1.setLoginarea(manager.getLoginarea());
                manager1.setLoginip(manager.getLoginip());
                Integer row = managerService.saveLoginStatus(manager1);
                if (row > 0) {
                    if ("000000".equals(manager1.getMpwd())) {
                        manager1.setMpwd("");
                        return new RespUtil().JOK("111110", "管理员您好,您的密码仍为初始密码,请立即修改密码!", true, manager1);
                    } else {
                        manager1.setMpwd("");
                        return new RespUtil().JOK("111111", "查询成功,系统中存在该用户", true, manager1);
                    }
                } else {
                    return new RespUtil().MOK("000000", "更新登陆状态失败", false);
                }
            } else {
                return new RespUtil().JOK("000000", "查询成功,系统中不存在该用户", true, new Manager());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new RespUtil().MOK("000001", e.getStackTrace().toString(), false);
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前后端杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值