SSM 实战项目①丨图书管理系统 丨(4) 登录操作的实现

SSM 实战项目①丨图书管理系统 丨(4) 登录操作的实现_第1张图片

本篇隶属于《SSM 实战项目①丨图书管理系统 》

详情请见:SSM 实战项目①丨图书管理系统 丨(0) 项目概要及本系列介绍


0. 准备一个登录界面和跳转的界面

SSM 实战项目①丨图书管理系统 丨(4) 登录操作的实现_第2张图片

我这里已经有小伙伴帮我做好登录界面了,如果需要的话,可以在项目源码中获取,也可以在 Bootstrap 的样例界面中拿到,下面附上链接:Bootstrap-Examples

本篇主要讲解登录的后端实现逻辑,对于前端的各种界面样式就不过多赘述了。

下面直接进入正题。


SSM 实战项目①丨图书管理系统 丨(4) 登录操作的实现_第3张图片


1. 检查用户名是否存在

[1] 前端发送 ajax 请求检验用户名是否存在
function validate_managerName_exists(managerName,loginOrRegister) {
    $.ajax({
        async: false,																		//关闭 ajax 异步请求,这样 ajax 请求后面的语句才能执行
        url:"${APP_PATH}/checkManagerNameExists",				//调用控制器暴露出来的接口
        data:"managerName="+ managerName,								//传递参数
        type:"POST",																		//使用 POST 方法
        success:function (result) {
              //我这里定义 code == 100 说明用户名存在
            if(result.code==100){
                if(loginOrRegister == "login")		//在登录的时候存在即为成功
                {
                    show_validate_msg("#login-managerName-input","success","");
                    acceptThrough = "true";
                }else{   													//在注册的时候存在即为失败
                    show_validate_msg("#manager_name_input","error",result.extend.va_register_name_msg);
                    acceptThrough = "false";
                }
              //code == 200 说明用户名不存在
            }else{
                if(loginOrRegister == "login")  //在登录的时候不存在即为失败
                {
                    show_validate_msg("#login-managerName-input","error",result.extend.va_login_name_msg);
                    acceptThrough = "false";
                }else{													//在注册的时候不存在即为成功
                    show_validate_msg("#manager_name_input","success",result.extend.va_register_name_msg);
                    acceptThrough = "true";
                }
            }
        }
    });
  	//判断是否允许跳转界面
    if(acceptThrough == "false"){
        return false;
    }else{
        return true;
    }
}
[2] 在 Controller 中提供接口 checkManagerNameExists
/**
 * 检查用户名是否存在
 * @param managerName
 * @return
 */
@ResponseBody
@RequestMapping(value = "/checkManagerNameExists",method = RequestMethod.POST)
public Msg checkManagerNameExists(@RequestParam("managerName") String managerName){
    //1. 检查用户名是否存在
    boolean b = managerService.checkManagerNameExists(managerName);
    if(b){
        return Msg.success().add("va_register_name_msg","用户名已存在!请更换用户名!");
    }else{
        return Msg.fail().add("va_login_name_msg","用户名不存在!请注册!").add("va_register_name_msg","用户名可用!");
    }
}

ps:Msg 类是笔者自行定义的统一传递给前端的类,@ResponseBody 会将这个类的信息封装成 Json 字符串传递给前端,具体定义如下:

package com.bean;

import java.util.HashMap;
import java.util.Map;

/**
 *  统一传递给前端的数据的实体类
 * @author Hedon Wang
 * @create 2020-05-26 11:59
 */
public class Msg {

    private Integer code;    //状态码  100-成功,200-失败
    private String message;  //提示信息
    private Map<String,Object> extend = new HashMap<>(); //用户要返回给浏览器的信息

  	//成功
    public static Msg success(){
        Msg result = new Msg();
        result.setCode(100);
        result.setMessage("处理成功!");
        return result;
    }

    //失败 
    public static Msg fail(){
        Msg result = new Msg();
        result.setCode(200);
        result.setMessage("处理失败!");
        return result;
    }

    public Msg add(String key,Object keyValue){
        this.getExtend().put(key,keyValue);
        return this;
    }


    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Map<String, Object> getExtend() {
        return extend;
    }

    public void setExtend(Map<String, Object> extend) {
        this.extend = extend;
    }


}

我们在控制层中调用了服务层的方法 managerService.checkManagerNameExists(managerName),这个时候这个方法我们还没实现,需要来实现它(笔者这里编写代码的逻辑是由外到内,而不是由内到外)。

[3] 在 Service 层中提供 checkManagerNameExists 服务
/**
 * 检查用户名是否存在
 * @param managerName
 * @return
 */
public boolean checkManagerNameExists(String managerName) {
    ManagerExample managerExample = new ManagerExample();
    ManagerExample.Criteria criteria = managerExample.createCriteria();
    criteria.andManagerNameEqualTo(managerName);
    long l = managerMapper.countByExample(managerExample);
    System.out.println(l);
    return l==1;
}

Service层中调用 dao 层的接口 managerMapper.countByExample(managerExample),这个接口我们在使用 MyBatis Generator 逆向工程的时候已经帮助我们自动生成了。我们通过这个接口方法可以获得数据库中有多少个 manger 的名称等于 managerName,如果结果为1(managerName是唯一的),那么就说明用户名存在(可登录不可注册),如果结果为0,说明还不存在(可注册不可登录)。

这样检查用户名是否存在的逻辑就写好了。

2. 检查密码是否正确

[1] 前端发送 ajax 请求判断密码是否正确

当用户名检查出来是存在的时候,就进入检查密码是否正确这个步骤。

同样是前端发送 ajax 请求,访问控制层暴露出来的接口 checkManagerPwd,根据后端返回过来的信息来判断密码是否正确。

function validate_managerPwd_right(managerName,managerPwd){
    $.ajax({
        url:"${APP_PATH}/checkManagerPwd",
        data:"managerName="+managerName+"&managerPwd="+managerPwd,
        type:"GET",
        success:function (result) {
          	//密码正确
            if(result.code == 100){
                show_validate_msg("#login-managerPwd-input","success","");
                $("#save").prop("ajax-va","success");
                window.location.href="${APP_PATH}/bookRank";    //跳转界面
            //密码错误
            }else{
                show_validate_msg("#login-managerPwd-input","error",result.extend.va_pwd_msg);
                $("#save").prop("ajax-va","error");
            }
        }
    })
}
[2] 在 Controller 中提供接口 checkManagerPwd
/**
 * 检查密码是否错误
 * @param managerPwd
 * @return
 */
@ResponseBody
@RequestMapping(value = "/checkManagerPwd",method = RequestMethod.GET)
public Msg checkManagerPwd(@RequestParam(value = "managerName") String managerName,
                           @RequestParam(value = "managerPwd") String managerPwd,
                           HttpSession session){
    boolean b = managerService.checkManagerPwd(managerName,managerPwd);
    if(b){  //验证通过
        //将用户信息放入session
        session.setAttribute("loginName",managerName);
        return Msg.success();
    }else{
        return Msg.fail().add("va_pwd_msg","密码错误,请重新输入!");
    }
}
[3] 在 Service 中提供 checkManagerPwd 服务

Service 层的逻辑就是检查同时满足传进来 managerName 和 managerPwd 的 manager 有几个,1个表示正确,0个表示错误。

/**
 * 检查用户密码是否正确
 * @param managerName
 * @param managerPwd
 * @return
 */
public boolean checkManagerPwd(String managerName,String managerPwd) {
    ManagerExample managerExample = new ManagerExample();
    ManagerExample.Criteria criteria = managerExample.createCriteria();
    criteria.andManagerNameEqualTo(managerName);
    criteria.andManagerPwdEqualTo(managerPwd);
    long l = managerMapper.countByExample(managerExample);
    return l==1;
}

这样整个登录操作的实现就完成啦~


有纰漏之处,还望不吝指出~


你可能感兴趣的:(Java学习,项目实战,SSM)