AuthController.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. package com.qxgmat.controller.api;
  2. import com.github.pagehelper.Page;
  3. import com.nuliji.tools.Response;
  4. import com.nuliji.tools.ResponseHelp;
  5. import com.nuliji.tools.Tools;
  6. import com.nuliji.tools.Transform;
  7. import com.nuliji.tools.exception.AuthException;
  8. import com.nuliji.tools.exception.ParameterException;
  9. import com.nuliji.tools.exception.SystemException;
  10. import com.qxgmat.data.constants.enums.ServiceKey;
  11. import com.qxgmat.data.dao.entity.TextbookLibrary;
  12. import com.qxgmat.data.dao.entity.User;
  13. import com.qxgmat.data.dao.entity.UserMessage;
  14. import com.qxgmat.data.dao.entity.UserOrderRecord;
  15. import com.qxgmat.data.relation.entity.UserPreviewPaperRelation;
  16. import com.qxgmat.dto.request.*;
  17. import com.qxgmat.dto.response.MyDto;
  18. import com.qxgmat.help.AiHelp;
  19. import com.qxgmat.help.CaptchaHelp;
  20. import com.qxgmat.help.ShiroHelp;
  21. import com.qxgmat.help.SmsHelp;
  22. import com.qxgmat.service.UsersService;
  23. import com.qxgmat.service.UserServiceService;
  24. import com.qxgmat.service.extend.MessageExtendService;
  25. import com.qxgmat.service.extend.PreviewService;
  26. import com.qxgmat.service.inline.TextbookLibraryService;
  27. import com.qxgmat.service.inline.UserAbnormalService;
  28. import com.qxgmat.service.inline.UserMessageService;
  29. import com.qxgmat.service.inline.UserOrderRecordService;
  30. import io.swagger.annotations.Api;
  31. import io.swagger.annotations.ApiOperation;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.http.MediaType;
  34. import org.springframework.validation.annotation.Validated;
  35. import org.springframework.web.bind.annotation.*;
  36. import javax.servlet.http.HttpServletRequest;
  37. import javax.servlet.http.HttpServletResponse;
  38. import javax.servlet.http.HttpSession;
  39. import javax.validation.Validator;
  40. import java.util.Collection;
  41. import java.util.Date;
  42. import java.util.List;
  43. /**
  44. * Created by GaoJie on 2017/10/31.
  45. */
  46. @RestController
  47. @RequestMapping("/api/auth")
  48. @Api(tags = "用户验证", description = "登录注册找回密码", produces = MediaType.APPLICATION_JSON_VALUE)
  49. public class AuthController {
  50. @Autowired
  51. private CaptchaHelp captchaHelp;
  52. @Autowired
  53. private SmsHelp smsHelp;
  54. @Autowired
  55. private AiHelp aiHelp;
  56. @Autowired
  57. private ShiroHelp shiroHelp;
  58. @Autowired
  59. private UsersService usersService;
  60. @Autowired
  61. private UserServiceService userServiceService;
  62. @Autowired
  63. private UserAbnormalService userAbnormalService;
  64. // 初始化用户信息
  65. @Autowired
  66. private TextbookLibraryService textbookLibraryService;
  67. @Autowired
  68. private UserMessageService userMessageService;
  69. @Autowired
  70. private UserOrderRecordService userOrderRecordService;
  71. @Autowired
  72. private PreviewService previewService;
  73. @Autowired
  74. private MessageExtendService messageExtendService;
  75. @RequestMapping(value = "/token", method = RequestMethod.POST)
  76. @ApiOperation(value = "验证token", httpMethod = "POST")
  77. public Response<MyDto> token(@RequestHeader(value = "token", required = false) String token, HttpSession session, HttpServletRequest request) {
  78. User user;
  79. if (token == null || token.isEmpty()){
  80. user = shiroHelp.getLoginUser();
  81. if (user == null) {
  82. throw new AuthException("未登录");
  83. }
  84. }else{
  85. user = usersService.getUserByToken(token);
  86. // 用该token登录
  87. shiroHelp.getSession().login(shiroHelp.user(user.getArea()+":"+user.getMobile(), ""));
  88. }
  89. User entity = usersService.get(user.getId());
  90. MyDto dto = processUser(entity, request);
  91. return ResponseHelp.success(dto);
  92. }
  93. @RequestMapping(value = "/login", method = RequestMethod.POST)
  94. @ApiOperation(value = "登录/注册", httpMethod = "POST")
  95. public Response<MyDto> login(@RequestBody @Validated UserLoginDto userLoginDto, HttpSession session, HttpServletRequest request) {
  96. if (!smsHelp.verifyCode(userLoginDto.getArea(), userLoginDto.getMobile(), userLoginDto.getMobileVerifyCode(), session)) {
  97. throw new ParameterException("手机验证码错误!");
  98. }
  99. try {
  100. String ip = Tools.getClientIp(request);
  101. usersService.register(userLoginDto.getArea(), userLoginDto.getMobile(), userLoginDto.getInviteCode(), userLoginDto.getEmail(), null, ip, aiHelp.parseIp(ip));
  102. }catch (ParameterException e){
  103. // 忽略已注册信息
  104. }
  105. shiroHelp.getSession().login(shiroHelp.user(userLoginDto.getArea()+":"+userLoginDto.getMobile(), ""));
  106. User user = shiroHelp.getLoginUser();
  107. User entity = usersService.get(user.getId());
  108. MyDto dto = processUser(entity, request);
  109. return ResponseHelp.success(dto);
  110. }
  111. @RequestMapping(value = "/wechat_pc", method = RequestMethod.GET)
  112. @ApiOperation(value = "直接微信二维码登录", httpMethod = "GET")
  113. public Response<MyDto> directWechatPc(
  114. @RequestParam(required = false, defaultValue = "") String code,
  115. HttpSession session, HttpServletRequest request) {
  116. User user = (User) shiroHelp.getLoginUser();
  117. user = usersService.Oauth(user, code, "wechat_pc", true);
  118. if (user.getId() != null && user.getId() > 0){
  119. user = usersService.get(user.getId());
  120. shiroHelp.getSession().login(shiroHelp.user(user.getArea()+":"+user.getMobile(), ""));
  121. }
  122. user = shiroHelp.getLoginUser();
  123. MyDto dto = processUser(user, request);
  124. return ResponseHelp.success(dto);
  125. }
  126. // 公众号登录注册:wechat(false) -> wechat(true) -> bind
  127. // pc登录注册:wechat_pc(true) -> bind
  128. // login -> wechat_pc(true)
  129. @RequestMapping(value = "/wechat", method = RequestMethod.GET)
  130. @ApiOperation(value = "直接微信公众号登录", httpMethod = "GET")
  131. public Response<MyDto> directWechat(
  132. @RequestParam(required = false, defaultValue = "") String code,
  133. @RequestParam(required = false, defaultValue = "") boolean userInfo,
  134. HttpSession session, HttpServletRequest request) {
  135. User user = (User) shiroHelp.getLoginUser();
  136. user = usersService.Oauth(user, code, "wechat_native", userInfo);
  137. if (user.getId() != null && user.getId() > 0){
  138. user = usersService.get(user.getId());
  139. shiroHelp.getSession().login(shiroHelp.user(user.getArea()+":"+user.getMobile(), ""));
  140. }
  141. MyDto dto = processUser(user, request);
  142. return ResponseHelp.success(dto);
  143. }
  144. @RequestMapping(value = "/logout", method = RequestMethod.POST)
  145. @ApiOperation(value = "登出", httpMethod = "POST")
  146. public Response<Boolean> logout(HttpSession session, HttpServletRequest request) {
  147. shiroHelp.logout();
  148. return ResponseHelp.success(true);
  149. }
  150. @RequestMapping(value = "/bind", method = RequestMethod.POST)
  151. @ApiOperation(value = "绑定手机号", notes="第三方登录后可执行", httpMethod = "POST")
  152. public Response<MyDto> bind(@RequestBody @Validated UserValidMobileDto userValidMobileDto, HttpSession session, HttpServletRequest request) {
  153. if (!smsHelp.verifyCode(userValidMobileDto.getArea(), userValidMobileDto.getMobile(), userValidMobileDto.getMobileVerifyCode(), session)) {
  154. throw new ParameterException("验证码有误,请重新获取!");
  155. }
  156. User openUser = (User) shiroHelp.getLoginUser();
  157. if(openUser == null)
  158. throw new SystemException("第三方登录错误");
  159. if(openUser.getMobile() != null && openUser.getMobile().length() > 0)
  160. throw new SystemException("手机号已绑定");
  161. try{
  162. // 创建新的账号,设定手机号,绑定第三方登录
  163. String ip = Tools.getClientIp(request);
  164. User user = usersService.register(userValidMobileDto.getArea(), userValidMobileDto.getMobile(), userValidMobileDto.getInviteCode(), userValidMobileDto.getEmail(), openUser, ip, aiHelp.parseIp(ip));
  165. }catch (ParameterException e){
  166. throw new ParameterException("该手机号绑定其他账号,请更换手机号码!");
  167. }
  168. shiroHelp.getSession().login(shiroHelp.user(userValidMobileDto.getArea()+":"+userValidMobileDto.getMobile(), ""));
  169. User user = shiroHelp.getLoginUser();
  170. User entity = usersService.get(user.getId());
  171. MyDto dto = processUser(entity, request);
  172. return ResponseHelp.success(dto);
  173. }
  174. @RequestMapping(value = "/valid/invite_code", method = RequestMethod.GET)
  175. @ApiOperation(value = "验证邀请码", notes="查询邀请码对应账号", httpMethod = "GET")
  176. public Response<String> validInviteCode(
  177. @RequestParam(required = true) String inviteCode
  178. ){
  179. User user = usersService.getByInviteCode(inviteCode);
  180. if(user == null){
  181. return ResponseHelp.success(null);
  182. }else{
  183. return ResponseHelp.success(user.getNickname());
  184. }
  185. }
  186. @RequestMapping(value = "/valid/mobile", method = RequestMethod.GET)
  187. @ApiOperation(value = "验证手机号", notes="查询手机对应账号", httpMethod = "GET")
  188. public Response<Boolean> validMobile(
  189. @RequestParam(required = true) String area,
  190. @RequestParam(required = true) String mobile
  191. ){
  192. User user = usersService.getByMobile(area, mobile);
  193. if(user != null){
  194. return ResponseHelp.success(false);
  195. }
  196. return ResponseHelp.success(true);
  197. }
  198. @RequestMapping(value = "/valid/wechat", method = RequestMethod.GET)
  199. @ApiOperation(value = "验证手机号是否绑定微信", notes="查询手机对应账号", httpMethod = "GET")
  200. public Response<Boolean> validWechat(
  201. @RequestParam(required = true) String area,
  202. @RequestParam(required = true) String mobile
  203. ){
  204. User user = usersService.getByMobile(area, mobile);
  205. if (user != null && user.getWechatUnionid() != null && !user.getWechatUnionid().equals("")){
  206. return ResponseHelp.success(false);
  207. }
  208. return ResponseHelp.success(true);
  209. }
  210. private MyDto processUser(User user, HttpServletRequest request){
  211. MyDto dto = Transform.convert(user, MyDto.class);
  212. if (user.getId() == null || user.getId() == 0) return dto;
  213. String ip = Tools.getClientIp(request);
  214. User entity = User.builder().id(user.getId()).build();
  215. entity.setLatestLoginTime(new Date());
  216. if (!user.getRegisterIp().equals(ip) && !user.getLatestLoginIp().equals(ip)){
  217. entity.setLatestLoginIp(ip);
  218. // 登录异常处理
  219. if(!aiHelp.compareIp(user.getRegisterIp(), ip)){
  220. String[] info = aiHelp.parseIp(ip);
  221. userAbnormalService.push(user.getId(), ip, info);
  222. }
  223. }
  224. // 更新登录信息
  225. usersService.edit(entity);
  226. if (!user.getMobile().isEmpty()){
  227. dto.setBindMobile(true);
  228. }
  229. if (!user.getWechatUnionid().isEmpty()){
  230. dto.setBindWechat(true);
  231. }
  232. if (user.getRealStatus() > 0){
  233. dto.setBindReal(true);
  234. }
  235. if(!user.getPrepareStatus().isEmpty()){
  236. dto.setBindPrepare(true);
  237. }
  238. // vip
  239. dto.setVip(userServiceService.timeService(user.getId(), ServiceKey.VIP));
  240. // 最新机经
  241. if (userServiceService.hasService(user.getId(), ServiceKey.TEXTBOOK)){
  242. TextbookLibrary latest = textbookLibraryService.getLatest();
  243. dto.setTextbook(latest.getUpdateTime());
  244. }
  245. // 未读消息
  246. Page<UserMessage> messageList = userMessageService.list(1, 4, user.getId(), null, 0);
  247. dto.setMessageNumber((int)messageList.getTotal());
  248. messageExtendService.refreshMessage(messageList);
  249. dto.setMessages(messageList);
  250. // 未完成作业
  251. List<UserOrderRecord> recordList = userOrderRecordService.listWithCourse(1, 1000, null, null, true, false, null, null);
  252. Collection recordIds = Transform.getIds(recordList, UserOrderRecord.class, "id");
  253. List<UserPreviewPaperRelation> relationList = previewService.listByRecordId(user.getId(), recordIds, 2);
  254. dto.setPreviewNumber(relationList.size());
  255. return dto;
  256. }
  257. }