【Springboot服务实现类】用户登录逻辑梳理(未完待续)

一、初级理解版本

在UserController类中代码是这样的:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userService;

    @GetMapping("/all")
    public Result<List<User>> getAllUser(){
        List<User> list=userService.list();
        return Result.success(list,"查询成功");
    }

    @PostMapping("/login")
    public Result<Map<String,Object>> login(@RequestBody User user){
        Map<String,Object> data=userService.login(user);
        if(data!=null){
            return Result.success(data);
        }
        return Result.fail(20002,"用户名或密码错误");
    }
}

        前端把用户名和密码POST过来之后,在login参数前面加一个@RequestBody,用于将 HTTP 请求体中的 JSON 数据直接绑定到方法参数上。它的作用是在控制器的方法中自动解析请求体中的数据,并将其转换为指定的 Java 对象。 所以就是将JSON中的数据自动转化为一个java实体类对象。

IUserService是一个接口类,里面直写接口,接口的实现在UserServicelmpl中,UserServicelmpl代码如下:

    @Override
    public Map<String, Object> login(User user) {

        //根据用户名和密码进行查询
        LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(User::getUsername,user.getUsername());
        wrapper.eq(User::getPassword,user.getPassword());
        User loginUser=this.baseMapper.selectOne(wrapper);

        //结果不为空,则生成token给前端,并且把用户信息存入redis
        if(loginUser!=null){
            //暂时用UUID,终极方案用jwt
            String key="user:"+UUID.randomUUID();

            //存入redis

            //返回数据
            Map<String,Object> data=new HashMap<>();
            data.put("token",key);
            return data;

        }

        return null;
    }

其中:

LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername,user.getUsername());
wrapper.eq(User::getPassword,user.getPassword());
User loginUser=this.baseMapper.selectOne(wrapper);
  • LambdaQueryWrapper<User>:这是MyBatis-Plus提供的一个查询包装器,用于构建条件查询。这里使用LambdaQueryWrapper来生成查询条件。
  • wrapper.eq(User::getUsername,user.getUsername()):构建查询条件,查询数据库中username字段等于传入user对象的用户名。
  • wrapper.eq(User::getPassword,user.getPassword()):继续构建查询条件,查询password字段等于传入user对象的密码。
  • this.baseMapper.selectOne(wrapper):使用生成的条件查询用户信息。如果数据库中存在匹配的用户,则返回该用户对象;否则返回null

那么扩展一下这个查询包装器,如果是针对其他的查询条件,一些例子如下:

wrapper.eq(User::getStatus, 1);
// 查询 status 字段等于 1 的记录,类似SQL中的=

wrapper.ne(User::getStatus, 0);
// 查询 status 字段不等于 0 的记录,类似SQL中的<>

wrapper.gt(User::getAge, 18);
// 查询 age 字段大于 18 的记录,类似SQL中的>

wrapper.lt(User::getAge, 60);
// 查询 age 字段小于 60 的记录,类似SQL中的<

wrapper.ge(User::getAge, 18);
// 查询 age 字段大于或等于 18 的记录,类似SQL中的>=

wrapper.le(User::getAge, 60);
// 查询 age 字段小于或等于 60 的记录,类似SQL中的<=

wrapper.like(User::getUsername, "admin");
// 查询 username 字段包含 "admin" 的记录,模糊查询,类似SQL中的LIKE

wrapper.between(User::getAge, 18, 30);
// 查询 age 字段在 18 到 30 之间的记录,类似 SQL 中的 BETWEEN ... AND ...

wrapper.orderByAsc(User::getAge);
// 按照 age 字段升序排列,类似 SQL 中的 ORDER BY

wrapper.isNotNull(User::getEmail);
// 查询 email 字段不为空的记录,类似 SQL 中的 IS NULL 和 IS NOT NULL

举一些具体的例子:

(1)查询年龄在18到25岁之间,并且用户名包含 "test" 的用户,按年龄升序排列

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.between(User::getAge, 18, 25)
       .like(User::getUsername, "test")
       .orderByAsc(User::getAge);
List<User> users = userMapper.selectList(wrapper);

(2)查询所有 status 字段为 1 并且 email 不为空的用户

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 1)
       .isNotNull(User::getEmail);
List<User> users = userMapper.selectList(wrapper);

(3)查询用户名等于 "admin" 或者年龄大于30岁的用户

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername, "admin")
       .or()
       .gt(User::getAge, 30);
List<User> users = userMapper.selectList(wrapper);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值