本文共 6480 字,大约阅读时间需要 21 分钟。
本篇隶属于《SSM 实战项目①丨图书管理系统 》
详情请见:
我这里已经有小伙伴帮我做好登录界面了,如果需要的话,可以在项目源码中获取,也可以在 Bootstrap 的样例界面中拿到,下面附上链接:
本篇主要讲解登录的后端实现逻辑,对于前端的各种界面样式就不过多赘述了。
下面直接进入正题。
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; }}
/** * 检查用户名是否存在 * @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 Mapextend = 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 getExtend() { return extend; } public void setExtend(Map extend) { this.extend = extend; }}
我们在控制层中调用了服务层的方法 managerService.checkManagerNameExists(managerName),这个时候这个方法我们还没实现,需要来实现它(笔者这里编写代码的逻辑是由外到内,而不是由内到外)。
/** * 检查用户名是否存在 * @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,说明还不存在(可注册不可登录)。
这样检查用户名是否存在的逻辑就写好了。
当用户名检查出来是存在的时候,就进入检查密码是否正确这个步骤。
同样是前端发送 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"); } } })}
/** * 检查密码是否错误 * @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","密码错误,请重新输入!"); }}
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;}
这样整个登录操作的实现就完成啦~
有纰漏之处,还望不吝指出~
转载地址:http://wqded.baihongyu.com/