01 SB实战 -微头条之用户模块功能(第一次登录根据账号密码生成token+后续登录根据token获取用户信息+注册时判断用户名是否已被占用+用户注册功能)

1 用户模块

1.2 登录

  1. 需求描述

    用户在客户端输入用户名密码并向后端提交,后端根据用户名和密码判断登录是否成功,用户有误或者密码有误响应不同的提示信息!

  2. 接口描述

    url地址: user/login

    请求方式:POST

    请求参数:

{
    "username":"zhangsan", //用户名
    "userPwd":"123456"     //明文密码
}

响应数据:

成功

{
   "code":"200",         // 成功状态码 
   "message":"success"   // 成功状态描述
   "data":{
    "token":"... ..." // 根据用户id的token
  }
}

失败

{
   "code":"501",
   "message":"用户名有误"
   "data":{}
}
{
   "code":"503",
   "message":"密码有误"
   "data":{}
}
  1. 实现代码
    1. controller
@RestController
@RequestMapping("user")
//解决跨域访问问题
@CrossOrigin
public class UserController {


    @Autowired
    private UserService userService;

    @PostMapping("login")
    public Result login(@RequestBody User user){
        Result result = userService.login(user);
        System.out.println("result = " + result);
        return result;
    }

}
  1. service
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
    implements UserService{
    @Autowired
    private JwtHelper jwtHelper;
    @Autowired
    private  UserMapper userMapper;

    /**
     * 登录业务实现
     * @param user
     * @return result封装'
     * 
     * 大概流程:
     *    1. 账号进行数据库查询 返回用户对象
     *    2. 对比用户密码(md5加密)
     *    3. 成功,根据userId生成token -> map key=token value=token值 - result封装
     *    4. 失败,判断账号还是密码错误,封装对应的枚举错误即可
     * 
     * 登录需求
     * 地址: /user/login
     * 方式: post
     * 参数:
     *    {
     *     "username":"zhangsan", //用户名
     *     "userPwd":"123456"     //明文密码
     *    }
     * 返回:
     *   {
     *    "code":"200",         // 成功状态码
     *    "message":"success"   // 成功状态描述
     *    "data":{
     *         "token":"... ..." // 用户id的token
     *     }
     *  }
     */
    @Override
    public Result login(User user) {

        //根据账号查询
        //创建一个条件构造器对象,并将等于条件封装入内(数据库中查找username值与传入user.username值一样的记录)
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername,user.getUsername());
        User loginUser = userMapper.selectOne(queryWrapper);

        //账号判断
        if (loginUser == null) {
            //账号错误
            return Result.build(null, ResultCodeEnum.USERNAME_ERROR);
        }

        //判断密码
        if (!StringUtils.isEmpty(user.getUserPwd())
                && loginUser.getUserPwd().equals(MD5Util.encrypt(user.getUserPwd())))
        {
            //账号密码正确
            //根据用户唯一标识生成token
            String token = jwtHelper.createToken(Long.valueOf(loginUser.getUid()));

            Map data = new HashMap();
            data.put("token",token);

            return Result.ok(data);
        }

        //密码错误
        return Result.build(null,ResultCodeEnum.PASSWORD_ERROR);
    }
}

在idea中模拟发送Json数据,可以得到响应 , 返回一个token.
在这里插入图片描述
在这里插入图片描述

1.3 根据token获取用户信息

  1. 需求 : 第一次登录以后 , 客户一段时间内都不用再输入账号密码就能登录了 . 实现的原理就是 , 客户端发送请求头中包含token , 后端可以根据token获取登录用户的详细信息. 本次要求后端获取用户信息(密码除外)后返回给前端展示.

  2. 接口描述

    url地址:user/getUserInfo

    请求方式:GET

    请求头:token: token内容

    响应数据:

    成功

{
    "code": 200,
    "message": "success",
    "data": {
        "loginUser": {
            "uid": 1,
            "username": "zhangsan",
            "userPwd": "",
            "nickName": "张三"
        }
    }
}
失败
{
    "code": 504,
    "message": "notLogin",
    "data": null
}
  1. 代码编写
    userController 新增:
    @GetMapping("getUserInfo")
    //RequstHeader注解提取请求头
    public Result userInfo(@RequestHeader String token){
        Result result = userService.getUserInfo(token);
        return result;
    }

userService新增:

	    Result getUserInfo(String token);

userServiceImpl新增:

    /**
     * 大概流程:
     *    1.获取token,解析token对应的userId
     *    2.根据userId,查询用户数据
     *    3.将用户数据的密码置空,并且把用户数据封装到结果中key = loginUser
     *    4.失败返回504 (本次先写到当前业务,后期提取到拦截器和全局异常处理器)
     */
    @Override
    public Result getUserInfo(String token) {
        //判断是否过期,
        boolean expiration = jwtHelper.isExpiration(token);

        //若失效,返回响应码
        if (expiration) {
            return Result.build(null,ResultCodeEnum.NOTLOGIN);
        } else {
            int userId = jwtHelper.getUserId(token).intValue();
            User user = userMapper.selectById(userId);
            user.setUserPwd("");

            Map data = new HashMap();
            data.put("loginUser",user);
            return Result.ok(data);
        }
    }

在这里插入图片描述

1.4 用户注册时检查用户名是否已被占用

  1. 需求描述 : 用户在注册时输入用户名时,立刻将用户名发送给后端,后端根据用户名查询用户名是否可用(是否被占用)并做出响应

  2. 接口描述

    url地址:user/checkUserName

    请求方式:POST

    请求参数:param形式
    username=zhangsan

响应数据:

成功

{
   "code":"200",
   "message":"success"
   "data":{}
}
失败
{
    "code":"505",
   "message":"用户名占用"
   "data":{}
}
  1. 代码编写
    userController 新增:
    /**
     *    url地址:user/checkUserName
     *     请求方式:POST
     *     请求参数:param形式
     * username=zhangsan
     */

    @PostMapping("checkUserName")
    public Result checkUserName(@RequestParam(value = "username") String username){
        Result result = userService.checkUsername(username);
        return result;
    }

userService新增:

	      Result checkUsername(String username);

userServiceImpl新增:

    /**
     * 实现步骤:
     *   1. 根据传入的用户名去数据库中查询是否已有记录
     *   2. 只要存在一条就被占用了
     *   3. 结果封装
     */
    @Override
    public Result checkUsername(String username) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername , username);
        Long count = userMapper.selectCount(queryWrapper);

        if (count == 0){
            return Result.ok(null);
        } else {
            return Result.build(null,ResultCodeEnum.USERNAME_USED);
        }

    }

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

1.4 用户注册

  1. 需求描述
    客户端将新欲注册的用户名和密码发送给服务端, 存入之前校验用户名是否被占用, 校验通过响应成功提示并存入数据库, 否则响应失败提示

  2. 接口描述

    url地址:user/regist

    请求方式:POST

    请求参数:

{
    "username":"zhangsan",
    "userPwd":"123456", 
    "nickName":"张三"
}

响应数据:
成功

{
   "code":"200",
   "message":"success"
   "data":{}
}

失败

{
   "code":"505",
   "message":"用户名占用"
   "data":{}
}
  1. 代码编写
    userController 新增:
    /**
     *    url地址:user/regist
     *    请求方式:POST
     *    请求参数: Json
     */
    @PostMapping("regist")
    public Result regist(@RequestBody User user){
        Result result = userService.regist(user);
        return result;
    }

userService新增:

    Result regist(User user);

userServiceImpl新增:


    @Override
    public Result regist(User user) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername , user.getUsername());
        Long count = userMapper.selectCount(queryWrapper);

        if (count == 0) {
            //获取传入的密码,MD5加密后再存储进数据库
            user.setUserPwd(MD5Util.encrypt(user.getUserPwd()));
            int rows = userMapper.insert(user);
            System.out.println("rows = " + rows);
            return Result.ok(null);
        } else {
            return Result.build(null,ResultCodeEnum.USERNAME_USED);
        }

    }

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

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值