本篇隶属于《SSM 实战项目①丨图书管理系统 》
详情请见:SSM 实战项目①丨图书管理系统 丨(0) 项目概要及本系列介绍
我这里已经有小伙伴帮我做好登录界面了,如果需要的话,可以在项目源码中获取,也可以在 Bootstrap 的样例界面中拿到,下面附上链接:Bootstrap-Examples
本篇主要讲解登录的后端实现逻辑,对于前端的各种界面样式就不过多赘述了。
下面直接进入正题。
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 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),这个时候这个方法我们还没实现,需要来实现它(笔者这里编写代码的逻辑是由外到内,而不是由内到外)。
/**
* 检查用户名是否存在
* @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;
}
这样整个登录操作的实现就完成啦~
有纰漏之处,还望不吝指出~