UsersService.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package com.qxgmat.service;
  2. import com.github.pagehelper.Page;
  3. import com.nuliji.tools.AbstractService;
  4. import com.nuliji.tools.Tools;
  5. import com.nuliji.tools.Transform;
  6. import com.nuliji.tools.exception.ParameterException;
  7. import com.nuliji.tools.exception.SystemException;
  8. import com.nuliji.tools.mybatis.Example;
  9. import com.nuliji.tools.third.OauthData;
  10. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  11. import com.qxgmat.data.dao.UserMapper;
  12. import com.qxgmat.data.dao.entity.User;
  13. import com.qxgmat.help.WechatHelp;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import javax.annotation.Resource;
  17. import java.beans.Transient;
  18. import java.util.Collection;
  19. import java.util.List;
  20. import java.util.Objects;
  21. /**
  22. * Created by GaoJie on 2017/11/1.
  23. */
  24. @Service
  25. public class UsersService extends AbstractService {
  26. final public String PLATORM_WECHAT_NATIVE = "wechat_openid_wechat";
  27. final public String PLATORM_WECHAT_PC = "wechat_openid_pc";
  28. final public String PLATORM_WECHAT = "wechat_unionid";
  29. @Resource
  30. private UserMapper userMapper;
  31. @Resource
  32. private WechatHelp wechatHelp;
  33. @Transactional
  34. public User Oauth(User user, String code, String platform){
  35. OauthData data;
  36. switch(platform){
  37. case "wechat_pc":
  38. data = wechatHelp.oauthPc(code);
  39. break;
  40. case "wechat_native":
  41. data = wechatHelp.oauthNative(code);
  42. break;
  43. default:
  44. throw new ParameterException("第三方平台"+platform+"不支持");
  45. }
  46. // 获取已关联的账号
  47. if (user == null){
  48. user = getByOpen(data.getOpenId(), data.getUnionId(), platform);
  49. } else {
  50. // 不需要校验是否已绑定,注册账号必定需要手机号
  51. // User openUser = getByOpen(data.getOpenId(), data.getUnionId(), platform);
  52. // if(openUser != null && openUser.getMobile().equals(user.getMobile())){
  53. // throw new ParameterException("第三方平台"+platform+"不支持");
  54. // }
  55. }
  56. if (user == null){
  57. user = new User();
  58. user.setAvatar(data.getAvatar());
  59. user.setNickname(data.getNickName());
  60. }
  61. switch(platform){
  62. case "wechat_pc":
  63. user.setWechatOpenidPc(data.getOpenId());
  64. user.setWechatUnionid(data.getUnionId());
  65. break;
  66. case "wechat_native":
  67. user.setWechatOpenidWechat(data.getOpenId());
  68. user.setWechatUnionid(data.getUnionId());
  69. user.setWechatAccessToken(data.getAccessToken());
  70. user.setWechatRefreshToken(data.getRefreshToken());
  71. user.setWechatExpireTime(data.getExpiresTime());
  72. break;
  73. }
  74. if (!user.getMobile().isEmpty()){
  75. // 直接更新数据
  76. edit(user);
  77. }
  78. return user;
  79. }
  80. @Transactional
  81. public User register(String mobile, String inviteCode, User openUser){
  82. User user = getByMobile(mobile);
  83. if (user != null){
  84. throw new ParameterException("手机号已注册");
  85. }
  86. // 注册,并且绑定邀请者
  87. user = User.builder().mobile(mobile).build();
  88. if (inviteCode != null && !inviteCode.isEmpty()){
  89. User origin = getByInviteCode(inviteCode);
  90. user.setOriginId(origin.getId());
  91. // todo 按逻辑进行奖励
  92. }
  93. // 绑定第三方登录信息
  94. if (openUser != null){
  95. user.setWechatOpenidPc(openUser.getWechatOpenidPc());
  96. user.setWechatOpenidWechat(openUser.getWechatOpenidWechat());
  97. user.setWechatExpireTime(openUser.getWechatExpireTime());
  98. user.setWechatUnionid(openUser.getWechatUnionid());
  99. user.setWechatAccessToken(openUser.getWechatAccessToken());
  100. user.setWechatRefreshToken(openUser.getWechatRefreshToken());
  101. user.setNickname(openUser.getNickname());
  102. user.setAvatar(openUser.getAvatar());
  103. }
  104. // 生成邀请码: 10位字符串
  105. user.setInviteCode(Tools.getRandomString(10));
  106. user = add(user);
  107. if(user == null)
  108. throw new SystemException("注册失败");
  109. return user;
  110. }
  111. public User getByMobile(String mobile){
  112. User user = User.builder().mobile(mobile).build();
  113. return one(userMapper, user);
  114. }
  115. public User getByOpen(String openId, String unionId, String platform){
  116. String platformField;
  117. String unionField;
  118. switch(platform){
  119. case "wechat_pc":
  120. platformField = PLATORM_WECHAT_PC;
  121. unionField = PLATORM_WECHAT;
  122. break;
  123. case "wechat_native":
  124. platformField = PLATORM_WECHAT_NATIVE;
  125. unionField = PLATORM_WECHAT;
  126. break;
  127. default:
  128. throw new ParameterException("第三方平台"+platform+"不支持");
  129. }
  130. Example example = new Example(User.class);
  131. example.or(
  132. example.createCriteria()
  133. .andEqualTo(platformField, openId)
  134. );
  135. if (unionId != null && !unionId.isEmpty()){
  136. example.or(
  137. example.createCriteria()
  138. .andEqualTo(unionField, unionId)
  139. );
  140. }
  141. return one(userMapper, example);
  142. }
  143. public boolean equalsPassword(User user, String password){
  144. return Objects.equals(user.getPassword(), Tools.stringMD5(Tools.stringMD5(password)));
  145. }
  146. public boolean changePassword(User user, String password){
  147. User updateUser = User.builder().id(user.getId()).password(Tools.stringMD5(Tools.stringMD5(password))).build();
  148. int result = update(userMapper, updateUser);
  149. return result > 0;
  150. }
  151. public User getByInviteCode(String inviteCode){
  152. User user = new User();
  153. Example example = new Example(User.class);
  154. // 查找手机或邀请码
  155. example.and(
  156. example.createCriteria()
  157. .orEqualTo("invite_code", inviteCode)
  158. .orEqualTo("mobile", inviteCode)
  159. );
  160. return one(userMapper, example);
  161. }
  162. public User add(User user){
  163. if(user.getPassword() != null) user.setPassword(Tools.stringMD5(user.getPassword()));
  164. int result = insert(userMapper, user);
  165. user = one(userMapper, user.getId());
  166. if(user == null){
  167. throw new SystemException("用户添加失败");
  168. }
  169. return user;
  170. }
  171. public User edit(User user){
  172. User in = one(userMapper, user.getId());
  173. if(in == null){
  174. throw new ParameterException("用户不存在");
  175. }
  176. if(user.getPassword() != null) user.setPassword(Tools.stringMD5(user.getPassword()));
  177. int result = update(userMapper, user);
  178. return user;
  179. }
  180. public boolean delete(Number id){
  181. User in = one(userMapper, id);
  182. if(in == null){
  183. throw new ParameterException("用户不存在");
  184. }
  185. int result = delete(userMapper, id);
  186. return result > 0;
  187. }
  188. public User selectOne(Number id){
  189. User in = one(userMapper, id);
  190. if(in == null){
  191. throw new ParameterException("用户不存在");
  192. }
  193. return in;
  194. }
  195. public Page<User> select(int page, int pageSize){return select(userMapper, page, pageSize);
  196. }
  197. public Page<User> select(int page, int pageSize, String keyword, Boolean real, String order, DirectionStatus direction){
  198. Example example = new Example(User.class);
  199. if(!keyword.isEmpty())
  200. example.and(
  201. example.createCriteria()
  202. .orLike("id", "%"+keyword+"%")
  203. .orLike("mobile", "%"+keyword+"%")
  204. );
  205. if (real != null)
  206. example.and(
  207. example.createCriteria().andEqualTo("realStatus", real?1:0)
  208. );
  209. if(order.isEmpty()) order = "id";
  210. if (direction != null){
  211. switch(direction){
  212. case ASC:
  213. example.orderBy(order).asc();
  214. break;
  215. case DESC:
  216. default:
  217. example.orderBy(order).desc();
  218. }
  219. } else {
  220. example.orderBy(order).desc();
  221. }
  222. return select(userMapper, example, page, pageSize);
  223. }
  224. public List<User> select(Collection ids){
  225. return select(userMapper, ids);
  226. }
  227. }