Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 如何设计一个短链系统
  • 新Get的开发技巧
  • 项目通用工具

  • 用户模块

    • 持久层
    • 实体类
    • 用户查询
    • 用户注册
    • 用户登录
      • 用户登录
      • 检查用户是否登录
      • 退出登录
    • 用户分库分表
    • 用户上下文
  • 短链模块

  • 流量风控
  • 如何获取用户IP?
  • SaaS短链接系统
  • 用户模块
Nreal
2024-01-03
目录

用户登录

# 用户登录

接口:

@PostMapping("/api/short-link/admin/v1/user/login")
public Result<UserLoginRespDTO> login(@RequestBody UserLoginReqDTO requestParam) {
    return Results.success(userService.login(requestParam));
}
1
2
3
4
@Override
public UserLoginRespDTO login(UserLoginReqDTO requestParam) {
    LambdaQueryWrapper<UserDO> queryWrapper = Wrappers.lambdaQuery(UserDO.class)
            .eq(UserDO::getUsername, requestParam.getUsername())
            .eq(UserDO::getPassword, requestParam.getPassword())
            .eq(UserDO::getDelFlag, 0);
    UserDO userDO = baseMapper.selectOne(queryWrapper);
    if(userDO==null){
        throw new ClientException("用户不存在");
    }
    // 防止重复登录
    Map<Object ,Object> hasLoginMap = stringRedisTemplate.opsForHash().entries("login_" + requestParam.getUsername());
    if(CollUtil.isNotEmpty(hasLoginMap)){
        String token = hasLoginMap.keySet().stream()
                .findFirst()
                .map(Object::toString)
                .orElseThrow(()->new ClientException("用户登录错误"));
        return new UserLoginRespDTO(token);
    }
    /**
     * Hash
     * Key:login_用户名
     * Value:
     *  Key:token标识
     *  Val:JSON 字符串(用户信息)
     */
    String uuid = UUID.randomUUID().toString();
    stringRedisTemplate.opsForHash().put("login_" + requestParam.getUsername(), uuid, JSON.toJSONString(userDO));
    stringRedisTemplate.expire("login_" + requestParam.getUsername(), 30L, TimeUnit.MINUTES);
    return new UserLoginRespDTO(uuid);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 检查用户是否登录

接口:

@GetMapping("/api/short-link/admin/v1/user/check-login")
public Result<Boolean> checkLogin(@RequestParam("username") String username, @RequestParam("token") String token) {
    return Results.success(userService.checkLogin(username, token));
}
1
2
3
4
@Override
public Boolean checkLogin(String username, String token) {
    return stringRedisTemplate.opsForHash().get("login_" + username, token) != null;
}
1
2
3
4

# 退出登录

接口:

@DeleteMapping("/api/short-link/admin/v1/user/logout")
public Result<Void> logout(@RequestParam("username") String username, @RequestParam("token") String token) {
    userService.logout(username, token);
    return Results.success();
}
1
2
3
4
5
@Override
public void logout(String username, String token) {
    if (checkLogin(username, token)) {
        stringRedisTemplate.delete("login_" + username);
        return;
    }
    throw new ClientException("用户Token不存在或用户未登录");
}
1
2
3
4
5
6
7
8
用户注册
用户分库分表

← 用户注册 用户分库分表→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式