CpsBackLoginController.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package com.cyksj.web.controller.cps;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.json.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.toolkit.Assert;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.cyksj.common.annotation.NoSubmit;
  8. import com.cyksj.common.constant.Constant;
  9. import com.cyksj.common.exception.BusinessRuntimeException;
  10. import com.cyksj.common.snowflake.Sequence;
  11. import com.cyksj.common.util.Codec;
  12. import com.cyksj.common.util.Jsons;
  13. import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
  14. import com.cyksj.dto.Result;
  15. import com.cyksj.enums.GatewayResponse;
  16. import com.cyksj.mapper.UserMapper;
  17. import com.cyksj.mapper.manage.cps.CpsUserAdRecordMapper;
  18. import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
  19. import com.cyksj.mapper.sys.SysConfigMapper;
  20. import com.cyksj.model.dto.AuthRedirect;
  21. import com.cyksj.model.dto.AuthToken;
  22. import com.cyksj.model.dto.CpsAuthDto;
  23. import com.cyksj.model.dto.GzhOAuth2UserInfo;
  24. import com.cyksj.model.entity.CpsUserAdRecord;
  25. import com.cyksj.model.entity.SysConfig;
  26. import com.cyksj.model.entity.User;
  27. import com.cyksj.model.entity.UserDistribute;
  28. import com.cyksj.model.request.LoginReq;
  29. import com.cyksj.model.views.UserInfoView;
  30. import com.cyksj.redis.RedisService;
  31. import com.cyksj.service.authorization.AuthorizationService;
  32. import com.cyksj.service.cps.CpsManageService;
  33. import com.cyksj.service.wechat.WeChatService;
  34. import com.cyksj.web.util.StpCpsManageUser;
  35. import lombok.RequiredArgsConstructor;
  36. import org.springframework.web.bind.annotation.*;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.util.Optional;
  39. /*
  40. *项目名: netflix
  41. *文件名: CpsBackLoginController
  42. *创建者: JavaZou
  43. *创建时间:2023/5/12 11:00
  44. */
  45. @RestController
  46. @RequestMapping("/cps/manage")
  47. @RequiredArgsConstructor
  48. public class CpsBackLoginController {
  49. private final CpsManageService cpsManageService;
  50. private final RedisService redisService;
  51. private final static Sequence SEQUENCE = new Sequence(0);
  52. private final WxOpenPlatYHLXLoginConfig wxOpenPlatYHLXLoginConfig;
  53. private final AuthorizationService authorizationService;
  54. private final WeChatService weChatService;
  55. private final UserMapper userMapper;
  56. private final UserDistributeMapper userDistributeMapper;
  57. private final CpsUserAdRecordMapper cpsUserAdRecordMapper;
  58. private final SysConfigMapper sysConfigMapper;
  59. /**
  60. * 获取登录验证码
  61. */
  62. @GetMapping("/get/LoginCode")
  63. @NoSubmit
  64. public Result getLoginCode(@RequestParam(defaultValue = "1") Integer type, String login, Integer cid) {
  65. cpsManageService.getLoginCode(type, login, cid);
  66. return GatewayResponse.SUCCESS.newBuilder().toResult();
  67. }
  68. /**
  69. * 手机号、邮箱登录
  70. */
  71. @PostMapping("/login")
  72. public Result login(@RequestBody LoginReq loginReq) {
  73. User user = cpsManageService.login(loginReq.getType(), loginReq.getLogin(), loginReq.getCode());
  74. StpCpsManageUser.login(user.getId());
  75. String cpsToken = StpCpsManageUser.getTokenValue();
  76. JSONObject re = new JSONObject();
  77. re.putOpt("satoken-cpsUser", cpsToken);
  78. re.putOpt("img", user.getHeadimgurl());
  79. re.putOpt("nickname", user.getNickname());
  80. return GatewayResponse.SUCCESS.newBuilder().toResult(re.toString());
  81. }
  82. /**
  83. * cps后台微信授权登录
  84. */
  85. @GetMapping("/wx/authLogin")
  86. public Result<CpsAuthDto> wxAuthorize() throws Exception {
  87. Object authUrlObj = redisService.get(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("cps", wxOpenPlatYHLXLoginConfig.getAppId()));
  88. if (authUrlObj != null) {
  89. CpsAuthDto cpsAuthDto = Jsons.parseObject(authUrlObj.toString(), CpsAuthDto.class);
  90. return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
  91. }
  92. CpsAuthDto cpsAuthDto = new CpsAuthDto();
  93. Long mappingId = SEQUENCE.nextId();
  94. String authState = mappingId.toString();
  95. redisService.set(authState, authState, 60 * 60 * 24L);
  96. AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
  97. String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
  98. String wxAuthUrl = authorizationService.createWxAuthLoginUrl(state, wxOpenPlatYHLXLoginConfig.getAppId(), wxOpenPlatYHLXLoginConfig.getCpsRedirectUri());
  99. cpsAuthDto.setAuthUrl(wxAuthUrl);
  100. cpsAuthDto.setAuthState(authState);
  101. redisService.set(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("cps", wxOpenPlatYHLXLoginConfig.getAppId()), Jsons.toJson(cpsAuthDto), RedisService.key.WX_LOGIN_AUTH_URI.getTimeout());
  102. return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
  103. }
  104. /**
  105. * 网页微信授权后跳转
  106. */
  107. @GetMapping("/wx/authLogin/baseRedirect")
  108. public void wxAuthLoginRedirect(String code, String state, HttpServletResponse response) throws Exception {
  109. if (StrUtil.isEmpty(state)) throw BusinessRuntimeException.getInstance("授权错误,请重新授权");
  110. String json = Codec.DoBase64.custom().setData(state).decodeAsText();
  111. AuthRedirect re = Jsons.parseObject(json, AuthRedirect.class);
  112. AuthToken token = weChatService.getAuthToken(code, wxOpenPlatYHLXLoginConfig.getAppId());
  113. GzhOAuth2UserInfo userinfo = weChatService.getUserInfo(token.getAccessToken(), token.getOpenid());
  114. String unionId = userinfo.getUnionid();
  115. String openId = userinfo.getOpenid();
  116. User user = Optional.ofNullable(
  117. userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUnionid, unionId)
  118. .orderByAsc(User::getId)
  119. .last("limit 1")))
  120. .orElseGet(() -> userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId)
  121. .orderByAsc(User::getId)
  122. .last("limit 1")));
  123. if (user == null) throw BusinessRuntimeException.getInstance("用户信息不存在");
  124. UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()).eq(UserDistribute::getDeleted, 1).select(UserDistribute::getId).last("limit 1"));
  125. if (userDistribute == null) throw BusinessRuntimeException.getInstance("只支持渠道分销用户登录");
  126. JSONObject res = new JSONObject();
  127. StpCpsManageUser.login(user.getId());
  128. String cpsToken = StpCpsManageUser.getTokenValue();
  129. res.putOpt("satoken-cpsUser", cpsToken);
  130. res.putOpt("img", user.getHeadimgurl());
  131. res.putOpt("nickname", user.getNickname());
  132. redisService.set(RedisService.key.CPS_AUTH_SUCCESS_KEY.getNameFormat(re.getMappingId()), res.toString(), RedisService.key.CPS_BACK_LOGIN_KEY.getTimeout());
  133. response.sendRedirect(wxOpenPlatYHLXLoginConfig.getCpsLoginUrl());
  134. }
  135. /**
  136. * 用户是否已授权
  137. */
  138. @GetMapping("/get/userInfo")
  139. public Result<String> getCpsUserInfo(String authState) {
  140. String key = RedisService.key.CPS_AUTH_SUCCESS_KEY.getNameFormat(authState);
  141. Object o = redisService.get(key);
  142. if (o == null) return GatewayResponse.SUCCESS.newBuilder().toResult();
  143. redisService.del(key);
  144. return GatewayResponse.SUCCESS.newBuilder().toResult(o.toString());
  145. }
  146. /**
  147. * 广告弹窗是否展示
  148. */
  149. @GetMapping("/get/ad")
  150. public Result<String> getAd() {
  151. String key = Constant.CPS_AD_KEY;
  152. long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
  153. CpsUserAdRecord cpsUserAdRecord = cpsUserAdRecordMapper.selectOne(Wrappers.lambdaQuery(CpsUserAdRecord.class)
  154. .eq(CpsUserAdRecord::getUserId, cpsUserId)
  155. .eq(CpsUserAdRecord::getSysKey, key)
  156. .last("limit 1"));
  157. if (cpsUserAdRecord == null) {
  158. SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
  159. .eq(SysConfig::getSysKey, key).last("limit 1"));
  160. if (sysConfig != null){
  161. cpsUserAdRecord = new CpsUserAdRecord();
  162. cpsUserAdRecord.setUserId(cpsUserId);
  163. cpsUserAdRecord.setSysKey(key);
  164. cpsUserAdRecordMapper.insert(cpsUserAdRecord);
  165. return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig.getSysValue());
  166. }
  167. }
  168. return GatewayResponse.SUCCESS.newBuilder().toResult();
  169. }
  170. /**
  171. * 获取cps用户基本信息
  172. */
  173. @GetMapping("/get/userInfo")
  174. public Result<UserInfoView> getUserInfoView() {
  175. long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
  176. User user = userMapper.selectById(cpsUserId);
  177. Assert.notNull(user, "用户不存在");
  178. UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()).eq(UserDistribute::getDeleted, 1).select(UserDistribute::getId).last("limit 1"));
  179. Assert.notNull(userDistribute, "只支持渠道分销用户登录");
  180. UserInfoView userInfoView = new UserInfoView();
  181. userInfoView.setImg(user.getHeadimgurl());
  182. userInfoView.setNickname(user.getNickname());
  183. return GatewayResponse.SUCCESS.newBuilder().toResult(userInfoView);
  184. }
  185. }