SSM项目store_SSM_v1 03登录功能

SSM项目store_SSM_v1 03登录功能



1 登录

1.1 新建JsonResult类来封装返回客户端的JSON 数据格式

util包里新建JsonResult类,这个类,用来封装返回客户端的JSON 数据格式

package com.qst.util;
/*
这个类,用来封装返回客户端的JSON 数据格式
 */
public class JsonResult {
    private  int state;//表示状态   0 表示失败  1  表示成功
    private  String message;//表示返回客户端的消息
    private Object data;//表示封装具体的数据返回给客户端

    public JsonResult() {
    }

    public JsonResult(int state, String message, Object data) {
        this.state = state;
        this.message = message;
        this.data = data;
    }

    public JsonResult(int state, String message) {
        this.state = state;
        this.message = message;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public String getMessage() {
        return message;
    }
    //将类业务层的异常信息  可以通过e.getMessage(); 给 message属性赋值
    public void setMessage(Throwable e) {
        this.message = e.getMessage();
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

1.2 异常处理

1.2.1 业务层异常处理类ServiceException

exception包里新建类

package com.qst.exception;
//ServiceException 业务层异常
public class ServiceException extends RuntimeException{


    public ServiceException() {
        super();
    }

    public ServiceException(String message) {
        super(message);
    }

    public ServiceException(String message, Throwable cause) {
        super(message, cause);
    }

    public ServiceException(Throwable cause) {
        super(cause);
    }

    protected ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

1.2.2 全局异常处理类DoControllerExceptionHandler

exception包里新建类

package com.qst.exception;

import com.qst.util.JsonResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

//全局异常处理类
@ControllerAdvice  //用这个注解修饰的类就是异常处理类
public class DoControllerExceptionHandler {

    @ExceptionHandler(Exception.class)//指定能处理的异常类型
    @ResponseBody
    public JsonResult controllerExceptionHandler(Exception e){

        return  new JsonResult(0,e.getMessage());

    }
}

1.3 检查登录用户名

1.3.1 前端

给表单内username加上 id = “username”
username下加上span标签 id="sp1"显示用户名是否被占用
在这里插入图片描述

JS语句:

<script>

		//当页面加载完成后
		$(function () {
			//检查登录用户名
			checkLoginUserName();//有括号页面加载完成后立马执行
		
		});

		//实现登录用户名检查
		function checkLoginUserName() {
			//给用户名输入框添加失去焦点事件
			$("#username").blur(function () {
				//获取用户输入的值    <span>江苏</span>
				var username=$("#username").val();
				if(username==null||username===''){
					alert("请输登录用户名");
					return;
				}
				//发起送ajax的请求 $.post();
				$.post("/user/checkLoginUserName",{"username":username},function(data){
					if (data.state==1){
						$("#sp1").html(data.message);
						$("#sp1").css("color","green");
					}else {
						$("#sp1").html(data.message);
					}
				},"json");




			});
		}
	</script>

1.3.2 后端实现

发起送ajax的请求 $.post(),通过注解跳转到后台 “/user/checkLoginUserName”
在UserController类里:

//检查login的用户名
    @PostMapping("/checkLoginUserName")
    @ResponseBody//{"state":1,"message":"用户名验证通过","data":{"uid":1,"username":""}}
    public JsonResult checkLoginUserName(String username){
        System.out.println(username);
        User user = userService.checkLoginUserName(username);

        return  new JsonResult(1,"用户名验证通过",user);
    }

具体在业务层接口userService类的checkLoginUserName方法里实现

//检查login的用户名
    User checkLoginUserName(String username);

在继承了业务层接口UserService的业务层UserServiceImpl类里实现

@Override
    public User checkLoginUserName(String username) {
        if(username==null ||StringUtils.isEmpty(username)){
            throw new ServiceException("登录名不能为空");
        }
        //根据用户名查询当前用户是否存在
        User user = userMapper.checkName(username);
        if(user==null){
            throw new ServiceException("当前用户没有注册");
        }

        return user;
    }

用户模块持久层接口userMapper类里的checkName(username)方法,与mappers里的UserMapper.xml里的数据库语句通过 id=“checkName” 映射,之后返回user。JsonResult类返回客户端的JSON数据里,状态 state =1表示成功,通过判断,前端span 标签显示用户名是否被占用。

1.4 执行登录

1.4.1 前端

$(function ()里添加doLogin()函数,没有括号页面加载完成后触发事件执行

JS语句:

//登录
		function doLogin() {

			//点击事件
			$("#loginBtn").click(function(){
				//获取表单数据
				var username=$("#username").val();
				var password=$("#password").val();
				var param={"username":username,"password":password};

				//发送ajax请求
				$.post("/user/doLogin",param,function(data){
					if(data.state==1){
						alert(data.message);
						//跳到首页
						location.href="/user/index";

					}else{
						alert(data.message);
					}
				},"json");
			});

		}

1.4.2 后端实现

发起送ajax的请求 $.post(),通过注解跳转到后台 “/user/doLogin”
在UserController类里:

//处理登录
    @PostMapping("/doLogin")
    @ResponseBody
    public JsonResult doLogin(String username, String password, HttpServletRequest request){
        User user = userService.login(username, password);
        System.out.println(user);
        //将user 对象 的 uid 保存session 中
        HttpSession session = request.getSession();
        session.setAttribute("uid",user.getUid());
        return  new JsonResult(1,"登录成功",user);
    }

具体在业务层接口userService类的login方法里实现

//用户登录
    User login(String username,String pwd);

在继承了业务层接口UserService的业务层UserServiceImpl类里实现 login 方法

@Override
    public User login(String username, String pwd) {
        //参数判断
        if(username==null||"".equals(username)){
            throw new ServiceException("登录名不能为空");
        }
        if(pwd==null||"".equals(pwd)){
            throw new ServiceException("登录密码不能为空");
        }
        //根据用户名找当前用户
        User user1 = userMapper.checkName(username);
        //获取注册时的密码和盐值
        String salt=user1.getSalt();
        //String password=user1.getPassword();
        //将登录的密码和盐值进行加密  再与password 比对
        String md5PWD = getMd5PWD(pwd, salt);//加密后的密码
        //根据用户名和密码查询当前用是否存在
        User user = userMapper.findUserByUserNameAndPassword(username, md5PWD);
        System.out.println("user:"+user);
        if(user==null){
            throw new ServiceException("当前用户数据不存在");
        }else{
            if(user.getIsDelete()==1){//说明
                throw  new ServiceException("数据可能被删除");
            }
            if(!user.getPassword().equals(md5PWD)||!username.equals(user.getUsername())){
                throw new ServiceException("用户名或者密码错误!");
            }
            return user;


        }

    }

根据用户名和密码查询当前用户功能里,用户模块持久层接口userMapper类里的findUserByUserNameAndPassword方法,与mappers里的UserMapper.xml里的数据库语句通过 id=“findUserByUserNameAndPassword” 映射

//根据用户名和密码查询当前用户
    /*
    在mybatis如果持久层的接口传的是两个以上的参数,建议使用@Param("参数名") 将这个参数名
    对应的参数值获取到赋值给对应的字段
     */
    User findUserByUserNameAndPassword(@Param("username") String username,
                                       @Param("password") String password);
<!--根据用户名和密码查询当前用户-->
	<select id="findUserByUserNameAndPassword" resultType="User">

		select  uid,username,password,salt,is_delete  isDelete  from tb_user
		where username=#{username} and password=#{password}

	</select>

最后返回user,JsonResult类返回客户端的JSON数据里,状态 state =1表示成功,跳到首页 location.href="/user/index"

到后端在UserController类里:

//跳转到首页
    @GetMapping("/index")
    public String toIndex(){
        return  "web/index";
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值