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

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


http://www.kler.cn/news/288700.html

相关文章:

  • 【管理型文档】软件需求管理过程(原件)
  • 使用 ip route 命令配置 Linux 路由表的详细指南
  • AI BT人工智能交互平台应用程序重磅上线,开启全球数字革命
  • 探索 HarmonyOS NEXT Developer Beta6,开启创新应用
  • 钢铁百科:NM360钢板材质、NM360机械性能、NM360韧性焊接性能
  • 多场景建模: STAR(Star Topology Adaptive Recommender)
  • 鸢尾花书实践和知识记录[数学要素3-1万物皆数]
  • python-pdf文件加密和解密
  • 评价决策类——层次分析法+数学建模+实战分析
  • spring -- AOP详解
  • QT教程-十六,QT中如何解析JSON
  • Java注解基础入门
  • LiveQing视频点播流媒体RTMP推流服务功能-支持OBS推流摄像机RTMP推流支持无人机RTMP推流解决大疆无人机推流花屏问题完美解决大疆无人机花屏
  • Postgresql表和索引占用空间回收释放(表空间膨胀)
  • NTFS安全权限和文件共享
  • Ajax的$.post(),$.get(),$.ajax 方法请求都是默认异步请求
  • Python | Leetcode Python题解之第390题消除游戏
  • 3D Tiles的4x4的仿射变换矩阵
  • 计算机网络——ARP篇
  • 向沐神学习笔记:GPT,GPT-2,GPT-3 论文精读【论文精读】GPT部分
  • 4G手机智能遥控开关
  • Oracle查询预防解决分母为0的方法
  • 防御网站数据爬取:策略与实践
  • 基于FPGA实现SD NAND FLASH的SPI协议读写
  • 棋类游戏定制开发:步骤详解
  • ET6框架(七)Excel配置工具
  • 【数论 状态机dp】2572. 无平方子集计数
  • c++懒汉式单例模式(Singleton)多种实现方式及最优比较
  • laravel8快速开发简单博客系统(二)
  • HarmonyOS NEXT实战:“相机分段式拍照”性能提升实践