package com.ruoyi.auth.controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import com.ruoyi.chargingPile.api.feignClient.PartnerClient; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import com.ruoyi.auth.form.LoginBody; import com.ruoyi.auth.form.RegisterBody; 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; import java.util.*; /** * token 控制 * * @author ruoyi */ @Slf4j @RestController public class TokenController { @Autowired private TokenService tokenService; @Autowired private SysLoginService sysLoginService; @Resource private SysUserClient userClient; @Resource private PartnerClient partnerClient; @PostMapping("login") @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public R login(@RequestBody LoginBody form, HttpServletRequest request) { // 用户登录 LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request); HashMap map = new HashMap<>(); map.put("token", tokenService.createToken(userInfo)); List roles = userInfo.getSysUser().getRoles(); if(CollectionUtils.isEmpty(roles)){ return R.fail("请关联角色!"); } map.put("roleName",roles.get(0).getRoleName()); map.put("info", userInfo); if(userInfo.getSysUser().getRoleType() == 2){ Partner partner = partnerClient.getPartnerById(userInfo.getSysUser().getObjectId()).getData(); map.put("partnerName", partner.getName()); } long time = userInfo.getSysUser().getPassWordUpdate().getTime(); map.put("password", false); //30天提示修改密码 if(System.currentTimeMillis() >= (time + 2592000000L)){ map.put("password", true); } // 修改用户最后登录时间 SysUser sysUser = new SysUser(); sysUser.setUserId(userInfo.getSysUser().getUserId()); sysUser.setLoginDate(new Date()); System.out.println("修改用户登录时间" + sysUser); userClient.updateSysUser(sysUser); return R.ok(map); } @DeleteMapping("logout") public R logout(HttpServletRequest request) { String token = SecurityUtils.getToken(request); if (StringUtils.isNotEmpty(token)) { String username = JwtUtils.getUserName(token); // 删除用户缓存记录 AuthUtil.logoutByToken(token); // 记录用户退出日志 sysLoginService.logout(username, request); } 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, HttpServletRequest request) { // 用户注册 sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request); return R.ok(); } }