用户登录
# 用户登录
接口:
@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
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
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
2
3
4
@Override
public Boolean checkLogin(String username, String token) {
return stringRedisTemplate.opsForHash().get("login_" + username, token) != null;
}
1
2
3
4
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
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
2
3
4
5
6
7
8