diff --git a/pom.xml b/pom.xml index 189577b76..a6878fb26 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,7 @@ true 3.03 + 4.12.0 @@ -422,7 +423,11 @@ ruoyi-auth ${revision} - + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + org.dromara ruoyi-common-mongo diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java index 964f2bb76..282423985 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -67,11 +67,11 @@ public class CaptchaController { LinkedHashMap map = new LinkedHashMap<>(1); map.put("code", code); SmsBlend smsBlend = SmsFactory.getSmsBlend("config2"); -// SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); -// if (!smsResponse.isSuccess()) { -// log.error("验证码短信发送异常 => {}", smsResponse); -// return R.fail(smsResponse.getData().toString()); -// } + SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); + if (!smsResponse.isSuccess()) { + log.error("验证码短信发送异常 => {}", smsResponse); + return R.fail(smsResponse.getData().toString()); + } return R.ok(code); } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java index 1966ab911..fd5c02ea2 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java @@ -56,4 +56,6 @@ public class LoginVo { */ private String userSig; + private Long userId; + } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index a230665d4..3df40a9d1 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -100,6 +100,7 @@ public class SmsAuthStrategy implements IAuthStrategy { LoginHelper.login(loginUser, model); LoginVo loginVo = new LoginVo(); + loginVo.setUserId(loginUser.getUserId()); loginVo.setAccessToken(StpUtil.getTokenValue()); loginVo.setExpireIn(StpUtil.getTokenTimeout()); loginVo.setClientId(client.getClientId()); diff --git a/ruoyi-modules/ruoyi-im/pom.xml b/ruoyi-modules/ruoyi-im/pom.xml index ecd6dec8c..83297edf7 100644 --- a/ruoyi-modules/ruoyi-im/pom.xml +++ b/ruoyi-modules/ruoyi-im/pom.xml @@ -72,14 +72,6 @@ org.dromara ruoyi-common-web - - - - - - org.dromara - ruoyi-system - org.dromara @@ -105,7 +97,14 @@ org.dromara ruoyi-common-sse - + + org.dromara + ruoyi-common-json + + + org.dromara + ruoyi-system + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ITencentIMService.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ITencentIMService.java similarity index 92% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ITencentIMService.java rename to ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ITencentIMService.java index bfb647b34..b102aec66 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ITencentIMService.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ITencentIMService.java @@ -20,14 +20,7 @@ public interface ITencentIMService { */ boolean sendMessageToTencentIM(String fromUserId, String toUserId, String content); - /** - * 创建腾讯IM账号 - * - * @param userId 用户ID - * @return 用户签名 - */ - String createTencentIMAccount(String userId); - + /** * 推送消息给全体用户 * @@ -38,7 +31,7 @@ public interface ITencentIMService { * @return 是否发送成功 */ boolean pushToAll(String title, String desc, boolean offlinePush, String ext); - + /** * 根据用户属性推送消息 * @@ -50,7 +43,7 @@ public interface ITencentIMService { * @return 是否发送成功 */ boolean pushByAttributes(String title, String desc, Map attributes, boolean offlinePush, String ext); - + /** * 根据标签推送消息 * @@ -62,7 +55,7 @@ public interface ITencentIMService { * @return 是否发送成功 */ boolean pushByTags(String title, String desc, List tags, boolean offlinePush, String ext); - + /** * 推送消息给指定用户 * @@ -74,13 +67,13 @@ public interface ITencentIMService { * @return 是否发送成功 */ boolean pushToUsers(String title, String desc, List userIds, boolean offlinePush, String ext); - + /** * 处理消息变量替换 - * + * * @param content 原始内容 * @param variables 变量映射 * @return 替换后的内容 */ String processMessageVariables(String content, Map variables); -} \ No newline at end of file +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java index 87555e6fe..deb5ad18e 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java @@ -1,6 +1,6 @@ package org.dromara.system.service.impl; -import com.alibaba.fastjson.JSONObject; +import cn.hutool.json.JSONObject; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.dromara.system.service.ITencentIMService; @@ -29,7 +29,7 @@ import java.util.Base64; */ @Slf4j @Service("systemTencentIMService") -public class TencentIMServiceImpl implements ITencentIMService { +public class TencentIMServiceImpl implements ITencentIMService { @Value("${tencent.im.sdk-app-id}") private long sdkAppId; @@ -149,43 +149,6 @@ public class TencentIMServiceImpl implements ITencentIMService { return generateUserSig(adminAccount); } - @Override - public String createTencentIMAccount(String userId) { - try { - String userSig = generateAdminUserSig(); - String random = String.valueOf(System.currentTimeMillis()); - - // 构建API请求URL - String url = String.format( - "https://console.tim.qq.com/v4/im_open_login_svc/account_import" + - "?sdkappid=%s&identifier=%s&usersig=%s&random=%s&contenttype=json", - sdkAppId, - adminAccount, - userSig, - random); - - // 构建请求体 - Map requestBody = new HashMap<>(); - requestBody.put("UserID", userId); - requestBody.put("Nick", userId); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - // 发送请求 - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); - - log.info("创建腾讯IM账号结果: {}", response.getBody()); - - // 生成并返回用户签名 - return generateUserSig(userId); - } catch (Exception e) { - log.error("创建腾讯IM账号异常: {}", userId, e); - return null; - } - } @Override public boolean sendMessageToTencentIM(String fromUserId, String toUserId, String content) { @@ -230,8 +193,8 @@ public class TencentIMServiceImpl implements ITencentIMService { log.info("发送消息到腾讯IM结果: {}", response.getBody()); // 解析响应判断是否成功 - JSONObject responseJson = JSONObject.parseObject(response.getBody()); - return "OK".equals(responseJson.getString("ActionStatus")); + JSONObject responseJson = new JSONObject(response); + return "OK".equals(responseJson.getStr("ActionStatus")); } catch (Exception e) { log.error("发送消息到腾讯IM异常", e); return false; @@ -295,8 +258,8 @@ public class TencentIMServiceImpl implements ITencentIMService { log.info("全员推送消息结果: {}", response.getBody()); // 解析响应判断是否成功 - JSONObject responseJson = JSONObject.parseObject(response.getBody()); - return "OK".equals(responseJson.getString("ActionStatus")); + JSONObject responseJson = new JSONObject(response); + return "OK".equals(responseJson.getStr("ActionStatus")); } catch (Exception e) { log.error("全员推送消息异常", e); return false; @@ -362,8 +325,8 @@ public class TencentIMServiceImpl implements ITencentIMService { log.info("属性推送消息结果: {}", response.getBody()); // 解析响应判断是否成功 - JSONObject responseJson = JSONObject.parseObject(response.getBody()); - return "OK".equals(responseJson.getString("ActionStatus")); + JSONObject responseJson = new JSONObject(response.getBody()); + return "OK".equals(responseJson.getStr("ActionStatus")); } catch (Exception e) { log.error("属性推送消息异常", e); return false; @@ -428,8 +391,8 @@ public class TencentIMServiceImpl implements ITencentIMService { log.info("标签推送消息结果: {}", response.getBody()); // 解析响应判断是否成功 - JSONObject responseJson = JSONObject.parseObject(response.getBody()); - return "OK".equals(responseJson.getString("ActionStatus")); + JSONObject responseJson = new JSONObject(response.getBody()); + return "OK".equals(responseJson.getStr("ActionStatus")); } catch (Exception e) { log.error("标签推送消息异常", e); return false; @@ -494,8 +457,8 @@ public class TencentIMServiceImpl implements ITencentIMService { log.info("指定用户推送消息结果: {}", response.getBody()); // 解析响应判断是否成功 - JSONObject responseJson = JSONObject.parseObject(response.getBody()); - return "OK".equals(responseJson.getString("ActionStatus")); + JSONObject responseJson = new JSONObject(response.getBody()); + return "OK".equals(responseJson.getStr("ActionStatus")); } catch (Exception e) { log.error("指定用户推送消息异常", e); return false; diff --git a/ruoyi-modules/ruoyi-member/pom.xml b/ruoyi-modules/ruoyi-member/pom.xml index 4a388b461..2afe91c97 100644 --- a/ruoyi-modules/ruoyi-member/pom.xml +++ b/ruoyi-modules/ruoyi-member/pom.xml @@ -20,8 +20,6 @@ org.dromara ruoyi-common-core - - org.dromara ruoyi-common-doc @@ -102,24 +100,16 @@ org.dromara ruoyi-common-sse - - - - - - - - - - - - - - - - - - + + cn.hutool + hutool-all + 5.8.22 + compile + + + com.squareup.okhttp3 + okhttp + diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java index 58eaeed40..8544931f3 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java @@ -23,12 +23,14 @@ public class MemberAccount extends BaseAudit { @Excel(name = "ID") - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id") private Long id; @Schema(description ="MEMBER_ID") private Long memberId; + + private String name; /** diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java index 8c0e09724..aa596e136 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java @@ -1,10 +1,12 @@ package com.wzj.soopin.member.service; +import com.wzj.soopin.member.domain.po.Member; + /**km//, * 腾讯IM服务 * @author wqx */ public interface ITencentIMServicce { - String createTencentIMAccount(String userId); + String createTencentIMAccount(Member member); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java index 0ddba7225..8920a501f 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java @@ -19,6 +19,7 @@ import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.web.config.properties.CaptchaProperties; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 注册校验方法 @@ -33,9 +34,11 @@ public class MemberRegisterService { private final CaptchaProperties captchaProperties; private final ITencentIMServicce tencentIMServicce; + private final String avatarUrl="http://122.152.205.72:88/group1/M00/00/05/CpoxxF6ZUySASMbOAABBAXhjY0Y649.png"; /** * 注册 */ + @Transactional(rollbackFor = Exception.class) public Member register(RegisterBody registerBody) { String tenantId = registerBody.getTenantId(); String username = registerBody.getUsername(); @@ -51,26 +54,26 @@ public class MemberRegisterService { } Member member = Member.builder().phoneEncrypted(phoneNumber) .userName(username==null?phoneNumber:username) - .nickname(username) + .avatar(avatarUrl) + .nickname("新用户"+phoneNumber.substring(phoneNumber.length()-4,phoneNumber.length())) .password(BCrypt.hashpw(password==null?"123456":password)).build(); boolean exist = memberService.exists(new LambdaQueryWrapper() .eq(Member::getPhoneEncrypted, phoneNumber)); if (exist) { - - - throw new UserException("user.register.save.error", username); } - // 生成 UserSig - String userSig = tencentIMServicce.createTencentIMAccount(phoneNumber); - member.setUserSig(userSig); - + //先保存用户,然后用户ID生成IM账号 boolean regFlag = memberService.save(member); if (!regFlag) { throw new UserException("user.register.error"); } + // 生成 UserSig + String userSig = tencentIMServicce.createTencentIMAccount(member); + member.setUserSig(userSig); + + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); return member; diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java index 5aebaad54..91626518d 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java @@ -67,7 +67,6 @@ public class MemberServiceImpl extends ServiceImpl implemen @Override - @CacheEvict(value = CacheConstants.MEMBER, key = "#id") public boolean save(Member entity) { super.save(entity); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java index ccfd201ee..df8b56413 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java @@ -1,10 +1,18 @@ package com.wzj.soopin.member.service.impl; import cn.hutool.json.JSONObject; +import com.wzj.soopin.member.domain.po.Member; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; import com.wzj.soopin.member.service.ITencentIMServicce; import com.wzj.soopin.member.util.GenerateTestUserSig; import com.wzj.soopin.member.util.TLSSigAPIv2; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @@ -20,17 +28,20 @@ public class TencentIMServiceImpl implements ITencentIMServicce { * 创建腾讯云IM账号 */ @Override - public String createTencentIMAccount(String userId) { + public String createTencentIMAccount(Member member) { + + String phone=member.getPhoneHidden(); try { - String userSig=generateUserSig(userId); + String userSig=generateUserSig("administrator"); String random = String.valueOf(System.currentTimeMillis()); + // 构建请求体 JSONObject requestBody = new JSONObject(); - requestBody.put("UserID", userId); - requestBody.put("Nick", userId); - requestBody.put("FaceUrl", "http://www.qq.com"); + requestBody.put("UserID", member.getId()+""); + requestBody.put("Nick", member.getNickname()); + requestBody.put("FaceUrl", member.getAvatar()); // 构建URL - 使用管理员账号(administrator)而不是用户ID来生成签名 String urlString = String.format( @@ -40,44 +51,43 @@ public class TencentIMServiceImpl implements ITencentIMServicce { "administrator", // 使用管理员账号 userSig, // 使用管理员的UserSig random); - return userSig; +// return userSig; -// // 创建HTTP客户端 -// OkHttpClient client = new OkHttpClient.Builder() -// .connectTimeout(10, TimeUnit.SECONDS) -// .writeTimeout(10, TimeUnit.SECONDS) -// .readTimeout(10, TimeUnit.SECONDS) -// .build(); -// -// // 发送请求 -// Request request = new Request.Builder() -// .url(urlString) -// .post(RequestBody.create(MediaType.get("application/json; charset=utf-8"), -// requestBody.toString())) -// .build(); -// -// try (Response response = client.newCall(request).execute()) { -// if (!response.isSuccessful()) { -// log.error("创建IM账号失败: {}, 状态码: {}", userId, response.code()); -// return null; -// } -// -// String responseBody = response.body().string(); -// JSONObject jsonResponse = new JSONObject(responseBody); -// int errorCode = jsonResponse.getInt("ErrorCode"); -// -// if (errorCode == 0) { -// log.info("创建IM账号成功: {}", userId); -// return userSig; -// } else { -// log.error("创建IM账号失败: {}, 错误码: {}, 错误信息: {}", -// userId, errorCode, jsonResponse.optString("ErrorInfo")); -// return null; -// } -// } + // 创建HTTP客户端 + OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS) + .readTimeout(15, TimeUnit.SECONDS) + .writeTimeout(15, TimeUnit.SECONDS) + .build(); + + // 发送请求 + Request request = new Request.Builder() + .url(urlString) + .post(RequestBody.create(MediaType.get("application/json; charset=utf-8"), + requestBody.toString())) + .build(); + + try (Response response = client.newCall(request).execute()) { + if (!response.isSuccessful()) { + log.error("创建IM账号失败: {}, 状态码: {}",phone , response.code()); + throw new ServiceException(String.format("创建IM账号异常: %s", phone)); + } + + String responseBody = response.body().string(); + JSONObject jsonResponse = new JSONObject(responseBody); + int errorCode = jsonResponse.getInt("ErrorCode"); + + if (errorCode == 0) { + log.info("创建IM账号成功: {}", phone); + return userSig; + } else { + log.error("创建IM账号失败: {}, 错误码: {}, 错误信息: {}", + phone, errorCode, jsonResponse.get("ErrorInfo")); + throw new ServiceException(String.format("创建IM账号异常: %s", phone)); + + } + } } catch (Exception e) { - log.error("创建IM账号异常: {}", userId, e); - return null; + throw new ServiceException(String.format("创建IM账号异常: %s", phone)); } }