diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java index e7885f5a4..14ab3c53d 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java @@ -52,4 +52,10 @@ public interface RemoteUserService extends InnerRemoteUserService */ @PutMapping("/user/recordlogin") public R recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 同步至go框架 + */ + @PostMapping("/user/syncGO") + public R syncGO(@RequestBody SysUser sysUser); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java index 88b20845a..8b92b528a 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java @@ -68,6 +68,11 @@ public class RemoteUserFallbackFactory implements FallbackFactory syncGO(SysUser sysUser) { + return R.fail("同步用户信息至GO失败:" + throwable.getMessage()); + } + @NotNull @Override public R edit_Inner(@NotNull LoginUser user, @NotNull String source) { diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java index 73cae223a..0d69def5c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java @@ -12,6 +12,20 @@ public class SecurityConstants */ public static final String DETAILS_USER_ID = "user_id"; + /** + * 用户ID字段 + */ + public static final String DETAILS_SUB = "sub"; + + /** + * 用户ID字段 + */ + public static final String DETAILS_IAT= "iat"; + /** + * 用户ID字段 + */ + public static final String DETAILS_EXP= "exp"; + /** * 用户名字段 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java index abe93c0c0..14ea876c8 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java @@ -1,13 +1,18 @@ package com.ruoyi.common.core.utils; +import java.util.Base64; import java.util.Map; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.TokenConstants; +import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.text.Convert; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import javax.naming.AuthenticationException; +import javax.servlet.http.HttpServletResponse; + /** * Jwt工具类 * @@ -15,7 +20,7 @@ import io.jsonwebtoken.SignatureAlgorithm; */ public class JwtUtils { - public static String secret = TokenConstants.SECRET; + public static String secret = Base64.getEncoder().encodeToString(TokenConstants.SECRET.getBytes()) ; /** * 从数据声明生成令牌 diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java index 0a63b851e..784e63e99 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java @@ -1,9 +1,14 @@ package com.ruoyi.common.security.service; +import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.impl.DefaultClaims; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -61,6 +66,10 @@ public class TokenService claimsMap.put(SecurityConstants.USER_KEY, token); claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); + claimsMap.put(SecurityConstants.DETAILS_SUB,userId); + int now = Math.toIntExact(System.currentTimeMillis() / 1000); + claimsMap.put(SecurityConstants.DETAILS_IAT,now); + claimsMap.put(SecurityConstants.DETAILS_EXP,now+TOKEN_EXPIRE_TIME*60); // 接口返回信息 Map rspMap = new HashMap(); diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java index 51d39ef9f..e4d791851 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java @@ -44,7 +44,6 @@ public class AuthFilter implements GlobalFilter, Ordered { ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest.Builder mutate = request.mutate(); - String url = request.getURI().getPath(); // 跳过不需要验证的路径 if (StringUtils.matches(url, ignoreWhite.getWhites())) @@ -56,11 +55,19 @@ public class AuthFilter implements GlobalFilter, Ordered { return unauthorizedResponse(exchange, "令牌不能为空"); } - Claims claims = JwtUtils.parseToken(token); + /*Claims claims = JwtUtils.parseToken(token); if (claims == null) { return unauthorizedResponse(exchange, "令牌已过期或验证不正确!"); - } + }*/ + Claims claims; + try{ + claims = JwtUtils.parseToken(token); + if (claims == null) + return unauthorizedResponse(exchange, "令牌已过期或验证不正确!"); + }catch (Exception e){ + return unauthorizedResponse(exchange, "令牌已过期或验证不正确!"); + } String userkey = JwtUtils.getUserKey(claims); boolean islogin = redisService.hasKey(getTokenKey(userkey)); if (!islogin) diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java index 593e7e62a..2f017bddd 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java @@ -34,7 +34,6 @@ public class GatewayExceptionHandler implements ErrorWebExceptionHandler } String msg; - if (ex instanceof NotFoundException) { msg = "服务未找到"; diff --git a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/LiveTask.java b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/LiveTask.java index b9ffdfcf7..25f2aa07d 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/LiveTask.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/LiveTask.java @@ -27,8 +27,10 @@ public class LiveTask { public void CourseSmsNotice(){ List list = scClassUserInfoMapper.waitNoticeCourseUser(); list.forEach(item->{ - log.info("发送打卡提醒",item.getUserId(),item.getNickName(),item.getPhonenumber()); - smsAliyuncs.sendStudyNoticeSms(item.getPhonenumber()); + if (item.getPhonenumber() != null && !item.getPhonenumber().trim().isEmpty()){ + log.info("发送打卡提醒 {} {} {}",item.getUserId(),item.getNickName(),item.getPhonenumber()); + smsAliyuncs.sendStudyNoticeSms(item.getPhonenumber()); + } }); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java index b26e5169e..74052636f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java @@ -166,6 +166,16 @@ public class SysUserController extends BaseController return R.ok(userService.updateUserProfile(sysUser)); } + /** + *记录用户登录IP地址和登录时间 + */ + @InnerAuth + @PutMapping("/syncGO") + public R syncGO(@RequestBody SysUser sysUser) + { + return R.ok(userService.syncGO(sysUser)); + } + /** * 获取用户信息 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SyncGoUser.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SyncGoUser.java new file mode 100644 index 000000000..d7c406e17 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SyncGoUser.java @@ -0,0 +1,15 @@ +package com.ruoyi.system.domain; + +import lombok.Data; + +@Data +public class SyncGoUser { + private Integer userId; + private String nickname; + private String username; + private String mobile; + private String lastIp; + private String remark; + private String avatar; + private Integer status; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 8d6e2b2b4..b7190830f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -170,6 +170,14 @@ public interface ISysUserService */ public boolean updateUserProfile(SysUser user); + /** + * 同步用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean syncGO(SysUser user); + /** * 修改用户头像 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index fa5d7c0b7..673a056ae 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -6,12 +6,17 @@ import java.util.Objects; import java.util.stream.Collectors; import javax.validation.Validator; +import cn.hutool.system.UserInfo; import com.github.pagehelper.Page; import com.ruoyi.system.api.domain.KSysUserAccount; +import com.ruoyi.system.domain.SyncGoUser; import com.ruoyi.system.service.IKSysUserService; +import org.apache.http.client.methods.HttpPost; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -35,6 +40,7 @@ import com.ruoyi.system.mapper.SysUserRoleMapper; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysUserService; +import org.springframework.web.client.RestTemplate; /** * 用户 业务层处理 @@ -44,6 +50,11 @@ import com.ruoyi.system.service.ISysUserService; @Service public class SysUserServiceImpl implements ISysUserService { + @Value("${go.host}") + private String goHost; + @Value("${go.accessKey}") + private String accessKey; + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @Autowired @@ -73,6 +84,7 @@ public class SysUserServiceImpl implements ISysUserService @Autowired protected Validator validator; + /** * 根据条件分页查询用户列表 * @@ -308,7 +320,9 @@ public class SysUserServiceImpl implements ISysUserService @Override public boolean registerUser(SysUser user) { - return userMapper.insertUser(user) > 0; + boolean res = userMapper.insertUser(user) > 0; + this.syncGO(user); + return res; } /** @@ -335,6 +349,7 @@ public class SysUserServiceImpl implements ISysUserService kSysUserService.updateSysUserAccount(user.getSysUserAccount()); } } + this.syncGO(user); return userMapper.updateUser(user); } @@ -361,6 +376,7 @@ public class SysUserServiceImpl implements ISysUserService @Override public int updateUserStatus(SysUser user) { + this.syncGO(user); return userMapper.updateUser(user); } @@ -373,9 +389,39 @@ public class SysUserServiceImpl implements ISysUserService @Override public boolean updateUserProfile(SysUser user) { + this.syncGO(user); return userMapper.updateUser(user) > 0; } + /** + * 同步用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean syncGO(SysUser user){ + RestTemplate restTemplate = new RestTemplate(); + String url = goHost + "/api/v2/mini/user/zkSyncUser/"+accessKey; + SyncGoUser syncGoUser = new SyncGoUser(); + syncGoUser.setUserId(Math.toIntExact(user.getUserId())); + syncGoUser.setNickname(user.getNickName()); + syncGoUser.setUsername(user.getUserName()); + syncGoUser.setMobile(user.getPhonenumber()); + syncGoUser.setLastIp(user.getLoginIp()); + syncGoUser.setRemark(user.getRemark()); + syncGoUser.setAvatar(user.getAvatar()); + syncGoUser.setStatus(Objects.equals(user.getStatus(), "正常") ?0:1); + ResponseEntity response = restTemplate.postForEntity(url, syncGoUser, String.class); + // 检查响应状态码 + if (response.getStatusCode().is2xxSuccessful()) { + System.out.println("响应内容:" + response.getBody()); + } else { + System.out.println("请求失败,状态码:" + response.getStatusCode()); + } + return true; + } + /** * 修改用户头像 * diff --git a/ruoyi-modules/ruoyi-system/src/main/kotlin/com/ruoyi/system/controller/inner/InnerSysUserController.kt b/ruoyi-modules/ruoyi-system/src/main/kotlin/com/ruoyi/system/controller/inner/InnerSysUserController.kt index 18d47c165..e125fa8a7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/kotlin/com/ruoyi/system/controller/inner/InnerSysUserController.kt +++ b/ruoyi-modules/ruoyi-system/src/main/kotlin/com/ruoyi/system/controller/inner/InnerSysUserController.kt @@ -141,7 +141,9 @@ open class InnerSysUserController : BaseController() { originUser.avatar = targetUser.avatar ?: originUser.avatar originUser.sex = targetUser.sex ?: originUser.sex originUser.updateBy = originUser.userName - originUser.sysUserAccount = loginUser.sysUser.sysUserAccount.apply { this.userId = originUser.userId } + if (loginUser.sysUser.sysUserAccount != null){ + originUser.sysUserAccount = loginUser.sysUser.sysUserAccount.apply { this.userId = originUser.userId } + } userService.updateUser(originUser) // 更新缓存用户信息 tokenService.setLoginUser(loginUser)