package com.ruoyi.auth.controller; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.auth.form.LoginBody; import com.ruoyi.auth.form.RegisterBody; import com.ruoyi.auth.form.UnLockBody; import com.ruoyi.auth.service.SysLoginService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.auth.AuthUtil; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.model.LoginUser; /** * token 控制 * * @author ruoyi */ @RestController public class TokenController { @Autowired private TokenService tokenService; @Autowired private SysLoginService sysLoginService; @PostMapping("login") public R login(@RequestBody LoginBody form) { // 用户登录 LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); // 获取登录token return R.ok(tokenService.createToken(userInfo)); } /** * 登出(后台管理端使用 DELETE) */ @DeleteMapping("logout") public R logout(HttpServletRequest request) { return doLogout(request); } /** * 登出(小程序端使用 POST,网关 /miniapp/auth/logout 剥前缀后落到本路径) * 与 DELETE 版本共用同一套登出逻辑,仅方法不同 */ @PostMapping("logout") public R miniappLogout(HttpServletRequest request) { return doLogout(request); } /** * 登出公共逻辑:删除 Redis 登录态缓存并记录退出日志 * @param request 当前请求(用于从请求头提取 token) */ private R doLogout(HttpServletRequest request) { String token = SecurityUtils.getToken(request); if (StringUtils.isNotEmpty(token)) { String username = JwtUtils.getUserName(token); // 删除用户缓存记录 AuthUtil.logoutByToken(token); // 记录用户退出日志 sysLoginService.logout(username); } return R.ok(); } @PostMapping("refresh") public R refresh(HttpServletRequest request) { LoginUser loginUser = tokenService.getLoginUser(request); if (StringUtils.isNotNull(loginUser)) { // 刷新令牌有效期 tokenService.refreshToken(loginUser); return R.ok(); } return R.ok(); } @PostMapping("register") public R register(@RequestBody RegisterBody registerBody) { // 用户注册 sysLoginService.register(registerBody.getUsername(), registerBody.getPassword()); return R.ok(); } /** * 解锁屏幕 */ @PostMapping("/unlockscreen") public R unlockScreen(@RequestBody UnLockBody unLockBody) { sysLoginService.unlock(unLockBody.getPassword()); return R.ok(); } }