UserInfoService.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package com.izouma.walkchina.service;
  2. import cn.binarywang.wx.miniapp.api.WxMaService;
  3. import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
  4. import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
  5. import com.izouma.walkchina.constant.AppConstants;
  6. import com.izouma.walkchina.domain.FriendInfo;
  7. import com.izouma.walkchina.domain.UserInfo;
  8. import com.izouma.walkchina.dto.RankInfo;
  9. import com.izouma.walkchina.dto.UserWalkStats;
  10. import com.izouma.walkchina.exception.ServiceException;
  11. import com.izouma.walkchina.repo.FriendInfoRepository;
  12. import com.izouma.walkchina.repo.UserInfoRepository;
  13. import com.izouma.walkchina.repo.WalkDataRepository;
  14. import com.izouma.walkchina.service.storage.StorageService;
  15. import com.izouma.walkchina.utils.ImageUtils;
  16. import lombok.extern.slf4j.Slf4j;
  17. import me.chanjar.weixin.common.error.WxErrorException;
  18. import org.apache.commons.lang3.RandomStringUtils;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.security.core.userdetails.UserDetailsService;
  21. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  22. import org.springframework.stereotype.Service;
  23. import java.text.SimpleDateFormat;
  24. import java.util.Date;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.UUID;
  28. @Service
  29. @Slf4j
  30. public class UserInfoService implements UserDetailsService {
  31. @Autowired
  32. private UserInfoRepository userInfoRepository;
  33. @Autowired
  34. private WxMaService wxMaService;
  35. @Autowired
  36. private StorageService storageService;
  37. @Autowired
  38. private FriendInfoRepository friendInfoRepository;
  39. @Autowired
  40. private WalkDataRepository walkDataRepository;
  41. @Autowired
  42. private FriendInfoService friendInfoService;
  43. @Autowired
  44. private TeamService teamService;
  45. @Override
  46. public UserInfo loadUserByUsername(String username) {
  47. log.info("loadUserByUsername {}", username);
  48. return userInfoRepository.findByUsername(username);
  49. }
  50. public UserInfo registerByUserPwd(String username, String password) {
  51. UserInfo userInfo = userInfoRepository.findByUsername(username);
  52. if (userInfo != null) {
  53. throw new ServiceException("该用户已存在");
  54. }
  55. userInfo = UserInfo.builder()
  56. .username(username)
  57. .password(new BCryptPasswordEncoder().encode(password))
  58. .nickname("用户" + RandomStringUtils.randomAlphabetic(6))
  59. .avatar(AppConstants.DEFAULT_AVATAR)
  60. .sex(0)
  61. .active(true)
  62. .build();
  63. userInfo = userInfoRepository.save(userInfo);
  64. return userInfo;
  65. }
  66. public UserInfo loginMiniApp(String code) {
  67. try {
  68. WxMaJscode2SessionResult result = wxMaService.jsCode2SessionInfo(code);
  69. String openId = result.getOpenid();
  70. String sessionKey = result.getSessionKey();
  71. UserInfo userInfo = userInfoRepository.findByOpenId(openId);
  72. if (userInfo != null) {
  73. userInfo.setSessionKey(sessionKey);
  74. return userInfoRepository.save(userInfo);
  75. }
  76. userInfo = UserInfo.builder()
  77. .username(UUID.randomUUID().toString())
  78. .nickname("用户" + RandomStringUtils.randomAlphabetic(6))
  79. .openId(openId)
  80. .avatar(AppConstants.DEFAULT_AVATAR)
  81. .sex(0)
  82. .active(true)
  83. .sessionKey(sessionKey)
  84. .build();
  85. uploadUserMarker(userInfo);
  86. return userInfoRepository.save(userInfo);
  87. } catch (WxErrorException e) {
  88. e.printStackTrace();
  89. }
  90. throw new ServiceException("登录失败");
  91. }
  92. public UserInfo getMiniAppUserInfo(String sessionKey, String rawData, String signature,
  93. String encryptedData, String iv) {
  94. // 用户信息校验
  95. if (!wxMaService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
  96. throw new ServiceException("获取用户信息失败");
  97. }
  98. // 解密用户信息
  99. WxMaUserInfo wxUserInfo = wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv);
  100. UserInfo userInfo = userInfoRepository.findByOpenId(wxUserInfo.getOpenId());
  101. String avatarUrl = AppConstants.DEFAULT_AVATAR;
  102. try {
  103. String path = "image/avatar/" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + RandomStringUtils.randomAlphabetic(8) + ".jpg";
  104. avatarUrl = storageService.uploadFromUrl(wxUserInfo.getAvatarUrl(), path);
  105. } catch (Exception e) {
  106. log.error("获取头像失败", e);
  107. }
  108. if (userInfo == null) {
  109. userInfo = UserInfo.builder()
  110. .username(UUID.randomUUID().toString())
  111. .nickname(wxUserInfo.getNickName())
  112. .openId(wxUserInfo.getOpenId())
  113. .unionId(wxUserInfo.getUnionId())
  114. .avatar(avatarUrl)
  115. .sex(Integer.valueOf(wxUserInfo.getGender()))
  116. .country(wxUserInfo.getCountry())
  117. .province(wxUserInfo.getProvince())
  118. .city(wxUserInfo.getCity())
  119. .active(true)
  120. .build();
  121. userInfo = userInfoRepository.save(userInfo);
  122. } else {
  123. userInfo.setAvatar(avatarUrl);
  124. userInfo.setNickname(wxUserInfo.getNickName());
  125. userInfo.setUnionId(wxUserInfo.getUnionId());
  126. userInfo.setSex(Integer.valueOf(wxUserInfo.getGender()));
  127. userInfo.setCountry(wxUserInfo.getCountry());
  128. userInfo.setProvince(wxUserInfo.getProvince());
  129. userInfo.setCity(wxUserInfo.getCity());
  130. userInfo = userInfoRepository.save(userInfo);
  131. }
  132. if (userInfo != null) {
  133. uploadUserMarker(userInfo);
  134. return userInfo;
  135. }
  136. throw new ServiceException("获取用户信息失败");
  137. }
  138. public void saveFriend(Long userId1, Long userId2) {
  139. try {
  140. friendInfoRepository.save(FriendInfo.builder().userId(userId1).friendId(userId2).build());
  141. } catch (Exception ignored) {
  142. }
  143. try {
  144. friendInfoRepository.save(FriendInfo.builder().userId(userId2).friendId(userId1).build());
  145. } catch (Exception ignored) {
  146. }
  147. }
  148. public void updateLocation(Long userId, Double latitude, Double longitude) {
  149. UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
  150. userInfo.setLatitude(latitude);
  151. userInfo.setLongitude(longitude);
  152. userInfoRepository.save(userInfo);
  153. }
  154. private void uploadUserMarker(UserInfo userInfo) {
  155. try {
  156. storageService.uploadFromInputStream(ImageUtils.getInputStream(ImageUtils.makeMarker("user", userInfo.getAvatar()), "png"), "marker/user/" + userInfo.getId() + ".png");
  157. storageService.uploadFromInputStream(ImageUtils.getInputStream(ImageUtils.makeMarker("location", userInfo.getAvatar()), "png"), "marker/location/" + userInfo.getId() + ".png");
  158. } catch (Exception e) {
  159. log.error("upload marker", e);
  160. }
  161. }
  162. public UserWalkStats getUserWalkStats(Long userId) {
  163. UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
  164. Date now = new Date();
  165. return UserWalkStats.builder()
  166. .nickname(userInfo.getNickname())
  167. .avatar(userInfo.getAvatar())
  168. .level(userInfo.getLevel())
  169. .totalSteps(userInfo.getTotalSteps())
  170. .walkCities(userInfo.getWalkCities())
  171. .todaySteps(walkDataRepository.sumUserWalkSteps(userId, now, now).orElse(0L))
  172. .teamSteps(walkDataRepository.sumTeamWalkSteps(userId, now, now).orElse(0L))
  173. .build();
  174. }
  175. public void acceptInvite(Long userId, Long inviter, boolean recruit) {
  176. friendInfoService.saveFriend(userId, inviter);
  177. if (recruit) {
  178. teamService.recruit(inviter, userId);
  179. }
  180. }
  181. public List<RankInfo> friendRank(Long userId) {
  182. return userInfoRepository.findFriendByRank(userId);
  183. }
  184. public void update(Long userId, Map<String, Object> map) {
  185. UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
  186. if (map.get("nickname") != null) {
  187. userInfo.setNickname(String.valueOf(map.get("nickname")));
  188. }
  189. if (map.get("avatar") != null) {
  190. userInfo.setAvatar(String.valueOf(map.get("avatar")));
  191. }
  192. if (map.get("sex") != null) {
  193. userInfo.setSex(Integer.parseInt(map.get("sex").toString()));
  194. }
  195. userInfoRepository.save(userInfo);
  196. }
  197. }