【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);