package com.supervision.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.supervision.constant.UserTokenConstant; import com.supervision.exception.BusinessException; import com.supervision.model.User; import com.supervision.pojo.vo.LoginReqVO; import com.supervision.service.UserService; import com.supervision.util.TokenUtil; import com.supervision.util.UserUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import java.util.Optional; import java.util.concurrent.TimeUnit; @Api(tags = "用户管理") @RestController @RequestMapping("user") @RequiredArgsConstructor public class UserController { private final UserService userService; private final RedisTemplate redisTemplate; @ApiOperation("登录") @PostMapping("login") public String login(@RequestBody LoginReqVO reqVO) { if (!StrUtil.isAllNotBlank(reqVO.getUserAccount(), reqVO.getPassword())) { throw new BusinessException("用户名不能为空"); } Optional user = userService.lambdaQuery().eq(User::getAccount, reqVO.getUserAccount()).last("limit 1").oneOpt(); if (!user.isPresent()) { throw new BusinessException("未找到用户"); } if (!user.get().getPassword().equals(reqVO.getPassword())) { throw new BusinessException("密码错误"); } String token = TokenUtil.creatToken(JSONUtil.toJsonStr(user.get())); // 将用户的token保存起来,超时时间为5分钟 redisTemplate.opsForValue().set(UserTokenConstant.TOKEN_CACHE + user.get().getId(), String.valueOf(System.currentTimeMillis()), 1000 * 5L, TimeUnit.MILLISECONDS); return token; } @ApiOperation("token心跳") @PostMapping("keepaliveToken") public void keepaliveToken() { User user = UserUtil.getUser(); // 每次心跳都设置为5分钟之后 redisTemplate.expire(UserTokenConstant.TOKEN_CACHE + user.getId(), 1000 * 5L, TimeUnit.MILLISECONDS); } }