当前位置: 首页 > news >正文

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

一、初级理解版本

在UserController类中代码是这样的:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate 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代码如下:

    @Overridepublic 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给前端,并且把用户信息存入redisif(loginUser!=null){//暂时用UUID,终极方案用jwtString 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中的LIKEwrapper.between(User::getAge, 18, 30);
// 查询 age 字段在 18 到 30 之间的记录,类似 SQL 中的 BETWEEN ... AND ...wrapper.orderByAsc(User::getAge);
// 按照 age 字段升序排列,类似 SQL 中的 ORDER BYwrapper.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);


http://www.mrgr.cn/news/14963.html

相关文章:

  • 使用matplotlib可视化dataframe:让你的数据更生动有趣
  • Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现根据每次触发信号移动感兴趣区域ROI(Python)
  • VMware安装Win10系统后,启动系统提示不支持的处理器,怎么解决
  • 记Spring HTTP Invoker远程调用的使用(二)基于Servlet方式,配置servlet映射url-pattern实现
  • 谷歌又出三款Gemini模型
  • NLP从零开始------文本中阶序列处理之语言模型(完整版)
  • OpenCV绘图函数(9)填充多边形函数fillPoly()的使用
  • 【软件测试】软件测试生命周期与Bug
  • Redis 数据结构与持久化机制详解及缓存异常处理策略
  • 前端开发学习Docker记录02容器操作
  • 焦虑相关症状与错误相关大脑活动的机器学习研究
  • 2024年西安交通大学软件工程专业考研915真题
  • 基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真
  • 「bug」nvitop ERROR: Failed to initialize curses
  • C语言——结构体
  • autoware整体架构的分析
  • 查看CPU占用率之Linux篇
  • 深入理解OJ编程中的输入输出:11个经典题目详解与技巧分享及stringstream,sort详解
  • 学习日志28
  • vulhub xxe靶机攻击教程