From 58d9f460b2f8c34430285115e2557d18333c5cab Mon Sep 17 00:00:00 2001 From: Codex Assistant <codex@example.com> Date: 星期三, 08 十月 2025 14:16:55 +0800 Subject: [PATCH] feat: 修复Player实体phone字段数据冗余问题并优化小程序报名逻辑 --- backend/src/main/java/com/rongyichuang/auth/service/AuthService.java | 142 +++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 117 insertions(+), 25 deletions(-) diff --git a/backend/src/main/java/com/rongyichuang/auth/service/AuthService.java b/backend/src/main/java/com/rongyichuang/auth/service/AuthService.java index bd2fa0f..756a3a4 100644 --- a/backend/src/main/java/com/rongyichuang/auth/service/AuthService.java +++ b/backend/src/main/java/com/rongyichuang/auth/service/AuthService.java @@ -19,13 +19,18 @@ import com.rongyichuang.player.repository.PlayerRepository; import com.rongyichuang.user.entity.User; import com.rongyichuang.user.repository.UserRepository; +import com.rongyichuang.common.entity.Media; +import com.rongyichuang.common.repository.MediaRepository; +import com.rongyichuang.common.enums.MediaTargetType; 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.security.authentication.BadCredentialsException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -64,6 +69,12 @@ @Autowired private WechatApiService wechatApiService; + + @Autowired + private MediaRepository mediaRepository; + + @Value("${app.base-url}") + private String baseUrl; /** * 鐢ㄦ埛鐧诲綍 @@ -282,35 +293,73 @@ logger.warn("鈿狅笍 unionid涓虹┖鎴栫敤鎴峰凡鎵惧埌锛岃烦杩噓nionid鏌ユ壘"); } - // 4. 濡傛灉閮芥病鎵惧埌锛屽垱寤烘柊鐢ㄦ埛 + // 4. 濡傛灉閮芥病鎵惧埌鐢ㄦ埛锛屼负灏忕▼搴忚闂垱寤哄尶鍚嶇敤鎴峰璞★紙涓嶄繚瀛樺埌鏁版嵁搴擄級 if (user == null) { - logger.info("鏈壘鍒扮幇鏈夌敤鎴凤紝寮�濮嬪垱寤烘柊鐢ㄦ埛"); - logger.info("鏂扮敤鎴蜂俊鎭�:"); + logger.info("鏈壘鍒扮幇鏈夌敤鎴凤紝涓哄皬绋嬪簭璁块棶鍒涘缓鍖垮悕鐢ㄦ埛瀵硅薄"); + logger.info("璁块棶鐢ㄦ埛淇℃伅:"); logger.info("- openid: {}", wxLoginRequest.getWxOpenid()); logger.info("- unionid: {}", wxLoginRequest.getWxUnionid()); logger.info("- phone: {}", wxLoginRequest.getPhone()); + // 璁板綍鐧诲綍淇℃伅鍒皌_login_record锛屼絾涓嶅垱寤虹敤鎴� + logger.info("姝ラ3: 璁板綍璁块棶鐢ㄦ埛鐨勭櫥褰曚俊鎭�"); + WxLoginRecord loginRecord = null; try { - user = new User(); - user.setWxOpenid(wxLoginRequest.getWxOpenid()); - user.setWxUnionid(wxLoginRequest.getWxUnionid()); - user.setName("寰俊鐢ㄦ埛"); // 榛樿鍚嶇О锛屽悗缁彲浠ユ洿鏂� - user.setPhone(wxLoginRequest.getPhone()); // 濡傛灉鏈夋巿鏉冩墜鏈哄彿 - - user = userRepository.save(user); - isNewUser = true; - - logger.info("鉁� 鎴愬姛鍒涘缓鏂扮殑寰俊鐢ㄦ埛"); - logger.info("- 鏂扮敤鎴稩D: {}", user.getId()); - logger.info("- 鏂扮敤鎴峰鍚�: {}", user.getName()); - logger.info("- 鏂扮敤鎴锋墜鏈哄彿: {}", user.getPhone()); - + loginRecord = wxLoginRecordService.createLoginRecord( + wxLoginRequest.getWxOpenid(), + wxLoginRequest.getWxUnionid(), + null, // 娌℃湁鐢ㄦ埛ID + wxLoginRequest.getLoginIp(), + wxLoginRequest.getDeviceInfo(), + wxLoginRequest.getSessionKey(), + wxLoginRequest.getPhoneAuthorized() + ); + logger.info("鉁� 鎴愬姛鍒涘缓璁块棶鐢ㄦ埛鐧诲綍璁板綍锛岃褰旾D: {}", loginRecord.getId()); } catch (Exception e) { - logger.error("鉂� 鍒涘缓鏂扮敤鎴峰け璐�"); - logger.error("寮傚父淇℃伅: {}", e.getMessage()); + logger.error("鉂� 鍒涘缓鐧诲綍璁板綍澶辫触: {}", e.getMessage()); logger.error("寮傚父鍫嗘爤:", e); - throw new RuntimeException("鍒涘缓鏂扮敤鎴峰け璐�: " + e.getMessage(), e); + throw new RuntimeException("鍒涘缓鐧诲綍璁板綍澶辫触: " + e.getMessage(), e); } + + // 6. 涓哄尶鍚嶇敤鎴风敓鎴愮壒娈婄殑JWT token锛堜娇鐢ㄤ笓闂ㄧ殑wxopenid瀛楁锛� + logger.info("姝ラ4: 涓哄尶鍚嶇敤鎴风敓鎴怞WT token"); + String token = null; + try { + // 浣跨敤鐗规畩鐨勭敤鎴稩D锛堣礋鏁帮級鏉ユ爣璇嗗尶鍚嶇敤鎴凤紝閬垮厤涓庣湡瀹炵敤鎴稩D鍐茬獊 + Long anonymousUserId = -Math.abs(wxLoginRequest.getWxOpenid().hashCode()) % 1000000L; + // 浣跨敤鏂扮殑涓夊弬鏁版柟娉曪細userId, phone(null), wxopenid + token = jwtUtil.generateToken(anonymousUserId, null, wxLoginRequest.getWxOpenid()); + logger.info("鉁� 鎴愬姛鐢熸垚鍖垮悕鐢ㄦ埛JWT token锛寃xopenid: {}", wxLoginRequest.getWxOpenid()); + } catch (Exception e) { + logger.error("鉂� 鐢熸垚鍖垮悕鐢ㄦ埛JWT token澶辫触: {}", e.getMessage()); + logger.error("寮傚父鍫嗘爤:", e); + throw new RuntimeException("鐢熸垚JWT token澶辫触: " + e.getMessage(), e); + } + + // 7. 鏋勫缓鍖垮悕鐢ㄦ埛淇℃伅 + logger.info("姝ラ5: 鏋勫缓鍖垮悕鐢ㄦ埛淇℃伅鍝嶅簲"); + LoginResponse.UserInfo userInfo = new LoginResponse.UserInfo( + null, // userId涓簄ull锛岃〃绀哄尶鍚嶇敤鎴� + "寰俊鐢ㄦ埛", // 榛樿鍚嶇О + null, // 娌℃湁鐢佃瘽鍙风爜 + "anonymous" // 鐢ㄦ埛绫诲瀷涓哄尶鍚� + ); + + // 杩斿洖鍖垮悕鐢ㄦ埛鐨勫搷搴旓紙鍖呭惈鐢ㄦ埛淇℃伅鍜宼oken锛� + WxLoginResponse response = new WxLoginResponse(); + response.setSuccess(true); + response.setMessage("鍖垮悕璁块棶鎴愬姛"); + response.setToken(token); + response.setUserInfo(userInfo); + response.setSessionKey(wxLoginRequest.getSessionKey()); + response.setIsNewUser(false); + response.setHasEmployee(false); + response.setHasJudge(false); + response.setHasPlayer(false); + response.setLoginRecordId(loginRecord.getId()); + + logger.info("=== 寰俊鍖垮悕璁块棶娴佺▼瀹屾垚 ==="); + return response; } // 5. 璁板綍鐧诲綍淇℃伅鍒版柊琛� @@ -386,12 +435,13 @@ // 6. 鐢熸垚JWT token logger.info("姝ラ5: 鐢熸垚JWT token"); - String tokenIdentifier = user.getPhone() != null ? user.getPhone() : user.getWxOpenid(); - logger.info("Token鏍囪瘑绗�: {}", tokenIdentifier); + logger.info("鐢ㄦ埛鎵嬫満鍙�: {}", user.getPhone()); + logger.info("鐢ㄦ埛wxopenid: {}", user.getWxOpenid()); String token = null; try { - token = jwtUtil.generateToken(user.getId(), tokenIdentifier); + // 浣跨敤鏂扮殑涓夊弬鏁版柟娉曪細userId, phone, wxopenid + token = jwtUtil.generateToken(user.getId(), user.getPhone(), user.getWxOpenid()); logger.info("鉁� 鎴愬姛鐢熸垚JWT token锛岄暱搴�: {}", token != null ? token.length() : 0); } catch (Exception e) { logger.error("鉂� 鐢熸垚JWT token澶辫触: {}", e.getMessage()); @@ -437,8 +487,29 @@ throw new RuntimeException("鏋勫缓鍩虹鐢ㄦ埛淇℃伅澶辫触: " + e.getMessage(), e); } - // 9. 璁剧疆鎵�鏈夊叧鑱旂殑瑙掕壊淇℃伅 - logger.info("姝ラ8: 璁剧疆瑙掕壊璇︾粏淇℃伅"); + // 9. 鑾峰彇骞惰缃敤鎴峰ご鍍� + logger.info("姝ラ8: 鑾峰彇鐢ㄦ埛澶村儚"); + try { + List<Media> avatarMediaList = mediaRepository.findByTargetTypeAndTargetIdAndState( + MediaTargetType.USER_AVATAR.getValue(), + user.getId(), + 1 + ); + if (!avatarMediaList.isEmpty()) { + Media avatarMedia = avatarMediaList.get(0); + String fullAvatarUrl = buildFullMediaUrl(avatarMedia.getPath()); + userInfo.setAvatarUrl(fullAvatarUrl); + logger.info("鉁� 鎵惧埌鐢ㄦ埛澶村儚: {} -> {}", avatarMedia.getPath(), fullAvatarUrl); + } else { + logger.info("鐢ㄦ埛{}娌℃湁鎵惧埌澶村儚", user.getId()); + } + } catch (Exception e) { + logger.error("鉂� 鑾峰彇鐢ㄦ埛澶村儚澶辫触: {}", e.getMessage()); + logger.error("寮傚父鍫嗘爤:", e); + } + + // 10. 璁剧疆鎵�鏈夊叧鑱旂殑瑙掕壊淇℃伅 + logger.info("姝ラ9: 璁剧疆瑙掕壊璇︾粏淇℃伅"); if (employeeOpt.isPresent()) { try { @@ -520,6 +591,27 @@ } /** + * 鏋勫缓瀹屾暣鐨勫獟浣揢RL + * @param path 濯掍綋璺緞 + * @return 瀹屾暣鐨刄RL + */ + private String buildFullMediaUrl(String path) { + if (path == null || path.trim().isEmpty()) { + return null; + } + + // 濡傛灉璺緞宸茬粡鏄畬鏁碪RL锛岀洿鎺ヨ繑鍥� + if (path.startsWith("http://") || path.startsWith("https://")) { + return path; + } + + // 鏋勫缓瀹屾暣URL + String cleanBaseUrl = baseUrl.endsWith("/") ? baseUrl.substring(0, baseUrl.length() - 1) : baseUrl; + String cleanPath = path.startsWith("/") ? path : "/" + path; + return cleanBaseUrl + cleanPath; + } + + /** * 瑙e瘑寰俊鎵嬫満鍙� */ public PhoneDecryptResponse decryptPhoneNumber(String encryptedData, String iv, String sessionKey) { -- Gitblit v1.8.0