up:: SpringBoot电商项目用户模块普通用户登录接口开发

说明:

(1) 本篇博客的点:

● if的一种快速的方法:

● 凡是需要【登录状态】下才能进行的操作,我们需要先去session中,尝试获取用户信息,如果获取到了,才能进行后续的操作;

● 本篇博客在注销的时候,采用的是【使用removeAttribute(),移除属性】的方式;而没有采用【调用invalidate()方法,直接废掉这个session】的方式;


一:更新个性签名接口;

1.UserController中,创建更新签名的方法:updateUser()方法;

 
         /**
          * 更新个性签名
          * @param session
          * @param signature
          * @return
          * @throws ImoocMallException
          */
         @PostMapping("/user/update")
         @ResponseBody
         public ApiRestResponse updateUser(HttpSession session,@RequestParam("signature") String signature) throws ImoocMallException {
             //尝试,从Session中,获取User;
             User currentUser = (User)  session.getAttribute(Constant.IMOOC_MALL_USER);
             if (currentUser == null)  {//如果Session中获取不到User,表示用户还没有登录,那么我们需要返回【需要登录】的错误提示信息;
                 return  ApiRestResponse.error(ImoocMallExceptionEnum.NEED_LOGIN);
             }
 
 
             User user = new User();
             user.setId(currentUser.getId());
             user.setPersonalizedSignature(signature);
             userService.updateInformation(user);
             return ApiRestResponse.success();
         }

说明:

(1) 方法的url,请求方式,参数,返回值类型,需要符合接口的要求;

(2) 方法说明:因为【更新签名】需要是登录的状态,所以这儿我们注入session对象,先获取当前登录用户的user信息;

(3) 方法说明:

(4) Service层的更新个性签名的方法:updataInformation()方法,在下面介绍;

2.在UserServiceImpl类中,编写更新个性签名的方法:updataInformation()方法;并在UserService接口中,反向生成该方法的定义;

(1)在UserServiceImpl类中,编写更新个性签名的方法:updataInformation()方法;

 
         /**
          * 更新个性签名
          * @param user
          */
         @Override
         public void updateInformation(User user) throws ImoocMallException {
             int updateCount = userMapper.updateByPrimaryKeySelective(user);//更新操作,影响的记录数;正常情况下应该是1
             //如果更新的返回结果 1;那么表示,更新操作是不正确的。即更新操作是失败了的;
             if (updateCount > 1) {
                 throw new  ImoocMallException(ImoocMallExceptionEnum.UPDATE_FAILED);
             }
         }

(2)在UserService接口中,反向生成该方法的定义;

 
         /**
          * 更新个性签名
          * @param user
          */
         void updateInformation(User user) throws ImoocMallException;

说明:

(1) 方法说明;

(2) 至于,Mapper中的updateByPrimaryKeySelective()方法,我们在下面介绍;

3.Mapper中updateByPrimaryKeySelective()方法说明;

为什么这儿我们要使用updateByPrimaryKeySelective()方法,是因为:

很容易发现,这和【SpringBoot电商项目用户模块注册接口开发】中用到的insertSelective(),套路是一样的;


插:测试【普通用户登录接口】和【更新个性签名接口】;

启动项目;

(1)测试【普通用户登录接口】;

(2)测试【更新个性签名接口】;

那么如果没有登录的时候,去尝试【更新个性签名接口】;


二:退出登录接口;

退出登录:就是把Session中的用户信息给清除掉;

1.在UserController中,创建退出登录的方法:logout()方法:

 
         /**
          *退出登录
          * @param session
          * @return
          */
         @PostMapping("/user/logout")
         @ResponseBody
         public ApiRestResponse logout(HttpSession session) {
             session.removeAttribute(Constant.IMOOC_MALL_USER);
             return ApiRestResponse.success();
         }

说明:

(1) 自然,方法的url、请求范式、参数、返回值要符合接口的要求;

(2) 方法说明;

(3)对session的一点说明:

● 对于session的有关内容,如有需要可以参考下以前的博客;尤其是【用户会话Session对象】;

● 但是,在【OA系统实现Header显示和注销功能】中,我们注销时,采用的是【调用invalidate()方法,直接废掉这个session 】 ,而不是本篇博客使用的【使用removeAttribute(),移除属性】的方式; 关于这二者的区别,可以参考下【附加:关于Session对象的几点说明: invalidate() 方法;request.getSession(true/false/null)的区别;】;

● 目前暂时以为:在注销的时候,采用本篇博客中用到的【使用removeAttribute(),移除属性】地方方式吧;(似乎,这种方式的成本更低?)


三:管理员登录接口;

1.在UserController中,创建管理员登录方法:adminLogin()方法;

 
         /**
          * 管理员登录方法
          * @param userName
          * @param password
          * @param session
          * @return
          */
         @PostMapping("/adminLogin")
         @ResponseBody
         public ApiRestResponse adminLogin(@RequestParam("userName") String userName,
                                      @RequestParam("password") String  password,
                                      HttpSession session) throws  ImoocMallException {
             if (StringUtils.isEmpty(userName)) {//如果用户名为空,直接返回用户名不能为空的信息;
                 return  ApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);
             }
             if (StringUtils.isEmpty(password)) {//如果密码为空,直接返回密码不能为空的信息;
                 return  ApiRestResponse.error(ImoocMallExceptionEnum.NEED_PASSWORD);
             }
             User user = userService.login(userName, password);
             if (userService.checkAdminRole(user)) {//校验,用户是否是管理员;
                 //如果是管理员,就执行后续操作
                 user.setPassword(null);//返回用户信息时候,去掉密码
                 session.setAttribute(Constant.IMOOC_MALL_USER, user);
                 return ApiRestResponse.success(user);
             } else {//如果不是管理员,就执行这种操作
                 return  ApiRestResponse.error(ImoocMallExceptionEnum.NEED_ADMIN);
             }
         }

说明:

(1)方法的url,请求方式,参数,返回值类型,需要符合接口的要求;

(2) 【管理员的登录】的方法和【普通用户登录】的方法,很类似;只是,【管理员登录】多了一步校验是否是管理员的操作;

(3) 声明:普通用户和管理员用户情况说明:

● 我们在注册用户的时候,该用户默认是普通用户;

● 只有数据库管理员,才有权限修改用户的角色;

(4) 为了校验用户是否是管理员,我们在Service中创建了一个校验方法:checkAdminRole()方法;

(5) 判断,如果是管理员用户,就正常进行登录操作;;;否则,就返回错误提示;


插:全部用户模块的五个接口:【注册接口】、【普通用户登录接口】、【更新个性签名接口】【退出登录接口】和【管理员用户登录接口】;

启动项目;下面的演示,顺着看下来就行;

然后,去注册用户;

然后,我们登陆【test1】这个用户;

然后,再尝试更新用户个性签名,发现是OK的;

然后,测试下退出登录接口;

那么,此时再尝试更新个性签名,发现不OK了,因为刚才退出了嘛;

然后,再去测试,管理员登录接口;

然后,我们在数据库中,将test1的role改为2:

此时,再再去测试,管理员登录接口;