vue+springboot实现登录功能

1. 登录功能的实现

实现提交表单的代码如下:

async submitForm(user) {
                this.$refs[user].validate((valid) => {
                    if(valid){
                        alert("user");
                        this.$axios.post("http:localhost:8087/user/login?code="+this.code,user).then(res => {
                            alert("success")
                             if(res.data.state){
                                 alert(res.data.msg+"登录成功,即将跳转到主页......");
                             }
                             else{
                                 alert(res.data.msg);
                             }
                        });
                    }
                    else{
                        return false;
                    }
                });
            },

当头一棒,脑瓜嗡嗡的。
在这里插入图片描述
这东西嗡嗡了好几天最终被我用比较愚蠢的代码实现了,具体思路如下:
首先我现在后台获取到当前生成验证码图片的真正验证码,传递到前端:

   if (valid) {
                        console.log(this.user);
                        this.$axios.get("http://localhost:8087/user/getCode").then(res => {
                            let tcode = res.data.toLowerCase();
                            if (tcode == this.code) {
                                verify(this.user);
                            } else {
                                alert('验证码错误!');
                            }
                        });
                    }

中间的verify就是我验证用户登录的用户名和密码的地方,验证码首先生成四位验证码然后转化为base64格式的字符串,最后传递到前端,后端返回字符串的代码。

@GetMapping("/getCode")
    @ApiOperation(value="获取验证码",notes="从后端获取验证码发送到前端")
    public String getCode(HttpServletRequest request){
        String key = (String)request.getServletContext().getAttribute("code");
        log.info("key:[{}]",key);
        return key;
    }

我分析登录模块前端给后端传值不成功的原因是因为前端只有用户名和密码,然后我错认为只有用户名和密码的表单可以组成一个对象导致一直将表单强制转化为对象去传递给后端,这样就一直造成了死循环,在这个问题卡了好久好久。之前也是将用户名密码和验证码传递给后端一直卡在那里。我先从后端获取验证码在前端比较正确与否,然后将用户输入的用户名和密码传递给后端在数据库中查找对应用户名的用户,若可以查找得到则说明此用户存在,否则用户存在。接下来比较用户输入的密码是否和数据库存入的密码一致,如果一致则返回真,登录成功,其他情况都不成功。具体的实现代
码如下:

//UserController
 @PostMapping("/login")
    @ApiOperation(value = "登录系统", notes = "登录员工管理系统")
    public Map<String,Object> login(@RequestParam String Name,@RequestParam String Pwd){
        System.out.println(Name+" "+Pwd);
        Map<String,Object> map = new HashMap<>();
        try{
            User userdb = userService.login(Name,Pwd);
            map.put("state",true);
            map.put("msg","登录成功");
            map.put("user",userdb);
        }catch(Exception e){
            e.printStackTrace();
            map.put("state",false);
            map.put("msg",e.getMessage());
        }
        log.info("[{}]",map.toString());
        return map;
    }
//UserServiceImpl
 @Override
    public User login(String Name,String Pwd) {
        User userDB = userMapper.selectByName(Name);
        if(!ObjectUtils.isEmpty(userDB)){
            if(userDB.getPwd().equals(Pwd)){
                return userDB;
            }
            else{
                throw new RuntimeException("密码输入不正确");
            }
        }
        else{
            throw new RuntimeException("用户不存在");
        }
    }
//UserMapper.java
User selectByName(String name);
<!--UserMapper.xml-->
 <select id="selectByName" parameterType="String" resultType="com.sunset.system.entity.User">
        select Id,Name,Age,Sex,Pwd,Dept,Salary
        from user where Name = #{name}
    </select>

在编码过程中,还遇到一个小插曲 就是 where Name = “#{name}” 导致在数据库查找中出错,希望看此文章的人能避开这个坑。
这样后端的逻辑就实现完成,下来是前端逻辑:

async function verify(userinfo) {
                        const {data: res} = await verifyUser(userinfo);
                        console.log(res);
                        if (res.state == true) {
                            _this.$message({
                                title: "验证成功",
                                message: "欢迎进入员工管理系统",
                                type: "success"
                            });
                            window.location.href = "http://www.baidu.com";
                            //await _this.$router.push("http://www.baidu.com");
                        } else {
                            _this.$message({
                                title: "验证失败",
                                message: res.msg,
                                type: "error"
                            })
                            return false;
                        }
                    }

这里使用axios的post请求,具体的路径在projectName.src.api 新建一个user.js的文件

export  const verifyUser = (user) =>{
    return request({
        url: "/user/login",
        method: 'post',
        params: {
            Name: user.Name,
            Pwd: user.Pwd
        }
    })
}

此外还需要配置request.js,文件路径 projectName.src.utils

import axios from 'axios'

const instance = axios.create({
  baseURL: 'http://localhost:8080', //后端项目的端口
  timeout: 10000,
  headers: {'X-Custom-Header': 'foobar'}
});



export default instance;

要是有其他逻辑问题,欢迎讨论交流。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值