手撕商城项目-登录

用户登录

当用户输入用户名和密码将数据提交到后台数据库进行查询,如果存在对应的用户名和密码则登录成功,登录成功后跳转到系统的主页就是index.html页面,跳转在前端使用jquery来完成

持久层

1、规划需要执行的sql语句

依据用户提交的用户名和密码做select查询,密码的比较在业务层执行

select *from t_user where username=?

说明:如果在分析过程中发现某个功能模块已经开发完成,所以就可以省略当前的开发步骤,这个分析过程不能省略

2、接口设计和抽象方法

不用单独开发

业务层

1、规划异常

1.1 用户名对应的密码错误,密码匹配失败的异常:PasswordNotMatchException异常,运行时异常,业务异常
1.2 用户名没有找到,抛出异常:UsernameNotFoundException
1.3 异常编写:
  • 业务层异常需要继承ServiceException异常类
  • 在具体的异常类中定义构造方法(可以使用快捷键生成,有五个构造方法)
    在这里插入图片描述

2、设计业务层的接口和抽象方法

2.1 直接在IUserService接口中编写抽象方法

login(String username,String password)将当前登录成功的用户数据以当前用户对象的形式进行返回。状态管理:将数据保存在cookie或者session中,可以避免重复度很高的数据多次频繁操作数据进行获取(用户名、用户id-存放在session中、用户头像-cookie中)

 /**
     * 用户登录功能
     * @param username 用户名
     * @param password 密码
     * @return  当前匹配的用户数据,如果没有返回null
     */
    User login (String username,String password);
    

3、抽象方法的实现

3.1 需要在实现类中实现抽象方法
  @Override
    public User login(String username, String password) {
        //根据用户名称来查询用户数据是否存在,不存在则抛出异常
        User result = usermapper.findUsername(username);
        if (result == null){
            throw new UserNotFoundException("用户数据不存在");
        }
      /*检测用户密码是否匹配
        1、先获取数据库中的加密之后的密码
        2、和用户传递过来的密码进行比较
          2.1  先获取盐值:上一次注册时自动生成的盐值
          2.2 将用户的密码按照相同的MD5算法进行加密     */
      String oldPassword = result.getPassword();
        String salt = result.getSalt();
        String newMd5Password = getMD5Password(password, salt);
           if (!oldPassword.equals(newMd5Password)){
               throw  new PasswordNotMatchException("用户密码错误");
           }


        //判断is_delete字段的值是否为1表示被标记为删除
       if(result.getIsDelete() == 1) {
        throw new UserNotFoundException("用户数据不存在");
       }

       //调用mapper层的findByUsername来查询用户的数据
        User user = new User();
       user.setUid(result.getUid());
       user.setUsername(result.getUsername());
       user.setAvatar(result.getAvatar());

       //返回的数据是为了辅助其他页面做数据展示使用
        return user;
    }

3.2 单元测试
   @Test
    public void login(){
        User user =userService.login("杨波", "123");
        System.out.println(user);
    }

如果一个类没有手动创建直接将这个类复制到项目,idea找不到这个类。之前缓存导致不能够正常找到这类的符号。解决办法:重新构建项目

在这里插入图片描述
在这里插入图片描述

控制层

1、处理异常

业务层抛出的异常是什么,需要在统一异常处理类中进行统一捕获和处理,如果业务层抛出的异常已经在统一异常处理类中曾经处理过,则不需要重新添加。

else if(e instanceof UserNotFoundException){
            result.setState(5001);
            result.setMessage("用户数据不存在的异常");
        }else if(e instanceof PasswordNotMatchException){
            result.setState(5002);
            result.setMessage("用户名的密码错误的异常");
        }

在这里插入图片描述

2、设计请求

请求路径:/users/login
请求方式:POST
请求数据:String username,String password
响应结果:JsonResult < User>

3、处理请求

在UserController中来编写处理请求的方法

@RequestMapping("login")
    public JsonResult<User> login(String username,String password){
        User data = userService.login(username, password);
        return new JsonResult<>(ok,data);
    }

在这里插入图片描述

登录-前端页面

1、在login.html页面中依据前面所设置的请求来发送ajax请求

<script type="text/javascript">
		$("#btn-login").click(function () {
              $.ajax({
				  url:"/users/login",
				  type:"POST",
				  data:$("#form-login").serialize(),
				  dataType:"json",
				  success:function (json) {
                     if (json.state == 200){
                     	alert("登录成功")
						 //跳转到系统主页index.html
						 //相对路径来确定跳转的页面
						 location.href="index.html";
					 }else alert("登陆失败");
				  },
				  error:function (xhr) {
                 alert("登陆时产生未知的异常"+xhr.message);
				  }
			  });
		});
	</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值