UsersService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package com.qxgmat.service;
  2. import com.github.pagehelper.Page;
  3. import com.nuliji.tools.AbstractService;
  4. import com.nuliji.tools.CipherHelp;
  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.nuliji.tools.mybatis.Example;
  11. import com.nuliji.tools.mybatis.handler.NativeJsonHandler;
  12. import com.nuliji.tools.third.OauthData;
  13. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  14. import com.qxgmat.data.dao.UserMapper;
  15. import com.qxgmat.data.dao.entity.User;
  16. import com.qxgmat.data.dao.entity.UserMessage;
  17. import com.qxgmat.data.inline.UserToken;
  18. import com.qxgmat.help.WechatHelp;
  19. import com.qxgmat.service.inline.UserClassService;
  20. import com.qxgmat.service.inline.UserMessageService;
  21. import com.qxgmat.service.inline.UserPayService;
  22. import com.qxgmat.service.inline.UserServiceService;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import javax.annotation.Resource;
  27. import java.beans.Transient;
  28. import java.util.Collection;
  29. import java.util.Date;
  30. import java.util.List;
  31. import java.util.Objects;
  32. /**
  33. * Created by GaoJie on 2017/11/1.
  34. */
  35. @Service
  36. public class UsersService extends AbstractService {
  37. final public String PLATORM_WECHAT_NATIVE = "wechat_openid_wechat";
  38. final public String PLATORM_WECHAT_PC = "wechat_openid_pc";
  39. final public String PLATORM_WECHAT = "wechat_unionid";
  40. @Value("${self.secret}")
  41. private String secret;
  42. private NativeJsonHandler<UserToken> tokenHandler = new NativeJsonHandler<UserToken>(UserToken.class);
  43. @Resource
  44. private UserMapper userMapper;
  45. @Resource
  46. private WechatHelp wechatHelp;
  47. @Resource
  48. private UserMessageService userMessageService;
  49. @Resource
  50. private UserPayService userPayService;
  51. @Resource
  52. private UserClassService userClassService;
  53. @Resource
  54. private UserServiceService userServiceService;
  55. /**
  56. * 生成有效期token
  57. * @param user
  58. * @return
  59. */
  60. public String getTokenByUser(User user){
  61. UserToken ut = new UserToken();
  62. ut.setId(user.getId());
  63. Date expire = new Date(new Date().getTime() + 86400);
  64. ut.setExpire(expire);
  65. String info = tokenHandler.toJson(ut);
  66. return CipherHelp.encrypt(info, CipherHelp.DES, secret);
  67. }
  68. /**
  69. * 解析有效期token
  70. * @param token
  71. * @return
  72. */
  73. public User getUserByToken(String token){
  74. // 默认测试token
  75. if (token.equals("1234567890")){
  76. return get(1);
  77. }else{
  78. String info = CipherHelp.decrypt(token, CipherHelp.DES, secret);
  79. UserToken ut = tokenHandler.toObject(info);
  80. Date expire = ut.getExpire();
  81. if (expire.before(new Date())){
  82. throw new AuthException("token错误");
  83. }
  84. return get(ut.getId());
  85. }
  86. }
  87. /**
  88. * 绑定第三方账号信息
  89. * @param user 当前登录用户
  90. * @param code
  91. * @param platform
  92. * @return
  93. */
  94. @Transactional
  95. public User Oauth(User user, String code, String platform){
  96. OauthData data;
  97. switch(platform){
  98. case "wechat_pc":
  99. data = wechatHelp.oauthPc(code);
  100. break;
  101. case "wechat_native":
  102. data = wechatHelp.oauthNative(code);
  103. break;
  104. default:
  105. throw new ParameterException("第三方平台"+platform+"不支持");
  106. }
  107. // 获取已关联的账号
  108. if (user == null){
  109. user = getByOpen(data.getOpenId(), data.getUnionId(), platform);
  110. } else {
  111. // 检验是否已经绑定
  112. User openUser = getByOpen(data.getOpenId(), data.getUnionId(), platform);
  113. if(openUser != null && !openUser.getId().equals(user.getId())){
  114. // 自动合并账号
  115. // 更新消息
  116. userMessageService.mergeUser(openUser.getId(), user.getId());
  117. // 更新消费记录
  118. userPayService.mergeUser(openUser.getId(), user.getId());
  119. // 更新课程信息
  120. userClassService.mergeUser(openUser.getId(), user.getId());
  121. // 更新服务信息
  122. userServiceService.mergeUser(openUser.getId(), user.getId());
  123. // 更新实名认证
  124. if (openUser.getRealStatus() > 0){
  125. user.setRealAddress(openUser.getRealAddress());
  126. user.setRealIdentity(openUser.getRealIdentity());
  127. user.setRealName(openUser.getRealName());
  128. user.setRealPhoto(openUser.getRealPhoto());
  129. user.setRealStatus(openUser.getRealStatus());
  130. }
  131. // 删除旧账号
  132. delete(openUser.getId());
  133. }
  134. }
  135. if (user == null){
  136. user = new User();
  137. user.setAvatar(data.getAvatar());
  138. user.setNickname(data.getNickName());
  139. }
  140. switch(platform){
  141. case "wechat_pc":
  142. user.setWechatOpenidPc(data.getOpenId());
  143. user.setWechatUnionid(data.getUnionId());
  144. break;
  145. case "wechat_native":
  146. user.setWechatOpenidWechat(data.getOpenId());
  147. user.setWechatUnionid(data.getUnionId());
  148. user.setWechatAccessToken(data.getAccessToken());
  149. user.setWechatRefreshToken(data.getRefreshToken());
  150. user.setWechatExpireTime(data.getExpiresTime());
  151. break;
  152. }
  153. if (!user.getMobile().isEmpty()){
  154. // 直接更新数据
  155. edit(user);
  156. }
  157. return user;
  158. }
  159. /**
  160. * 通过手机号注册
  161. * @param mobile
  162. * @param inviteCode
  163. * @param openUser
  164. * @return
  165. */
  166. @Transactional
  167. public User register(String mobile, String inviteCode, User openUser){
  168. User user = getByMobile(mobile);
  169. if (user != null){
  170. throw new ParameterException("手机号已注册");
  171. }
  172. // 注册,并且绑定邀请者
  173. user = User.builder().mobile(mobile).build();
  174. if (inviteCode != null && !inviteCode.isEmpty()){
  175. User origin = getByInviteCode(inviteCode);
  176. user.setOriginId(origin.getId());
  177. // todo 按逻辑进行奖励
  178. edit(User.builder().id(origin.getId()).inviteNumber(origin.getInviteNumber() + 1).build());
  179. }
  180. // 绑定第三方登录信息
  181. if (openUser != null){
  182. user.setWechatOpenidPc(openUser.getWechatOpenidPc());
  183. user.setWechatOpenidWechat(openUser.getWechatOpenidWechat());
  184. user.setWechatExpireTime(openUser.getWechatExpireTime());
  185. user.setWechatUnionid(openUser.getWechatUnionid());
  186. user.setWechatAccessToken(openUser.getWechatAccessToken());
  187. user.setWechatRefreshToken(openUser.getWechatRefreshToken());
  188. user.setNickname(openUser.getNickname());
  189. user.setAvatar(openUser.getAvatar());
  190. }
  191. // 生成邀请码: 10位字符串
  192. user.setInviteCode(Tools.getRandomString(10));
  193. user = add(user);
  194. if(user == null)
  195. throw new SystemException("注册失败");
  196. return user;
  197. }
  198. // 获取微信快到期账号
  199. public Page<User> listByWechatExpire(int page, int size, Date expire){
  200. Example example = new Example(User.class);
  201. example.and(
  202. example.createCriteria()
  203. .andLessThan("wechatExpireTime", expire)
  204. );
  205. return page(()->select(userMapper, example), page, size);
  206. }
  207. public User getByMobile(String mobile){
  208. User user = User.builder().mobile(mobile).build();
  209. return one(userMapper, user);
  210. }
  211. public User getByOpen(String openId, String unionId, String platform){
  212. String platformField;
  213. String unionField;
  214. switch(platform){
  215. case "wechat_pc":
  216. platformField = PLATORM_WECHAT_PC;
  217. unionField = PLATORM_WECHAT;
  218. break;
  219. case "wechat_native":
  220. platformField = PLATORM_WECHAT_NATIVE;
  221. unionField = PLATORM_WECHAT;
  222. break;
  223. default:
  224. throw new ParameterException("第三方平台"+platform+"不支持");
  225. }
  226. Example example = new Example(User.class);
  227. example.or(
  228. example.createCriteria()
  229. .andEqualTo(platformField, openId)
  230. );
  231. if (unionId != null && !unionId.isEmpty()){
  232. example.or(
  233. example.createCriteria()
  234. .andEqualTo(unionField, unionId)
  235. );
  236. }
  237. return one(userMapper, example);
  238. }
  239. public User getByInviteCode(String inviteCode){
  240. User user = new User();
  241. Example example = new Example(User.class);
  242. // 查找手机或邀请码
  243. example.and(
  244. example.createCriteria()
  245. .orEqualTo("invite_code", inviteCode)
  246. .orEqualTo("mobile", inviteCode)
  247. );
  248. return one(userMapper, example);
  249. }
  250. public boolean equalsPassword(User user, String password){
  251. return Objects.equals(user.getPassword(), Tools.stringMD5(Tools.stringMD5(password)));
  252. }
  253. public boolean changePassword(User user, String password){
  254. User updateUser = User.builder().id(user.getId()).password(Tools.stringMD5(Tools.stringMD5(password))).build();
  255. int result = update(userMapper, updateUser);
  256. return result > 0;
  257. }
  258. public User add(User user){
  259. if(user.getPassword() != null) user.setPassword(Tools.stringMD5(user.getPassword()));
  260. int result = insert(userMapper, user);
  261. user = one(userMapper, user.getId());
  262. if(user == null){
  263. throw new SystemException("用户添加失败");
  264. }
  265. return user;
  266. }
  267. public User edit(User user){
  268. User in = one(userMapper, user.getId());
  269. if(in == null){
  270. throw new ParameterException("用户不存在");
  271. }
  272. if(user.getPassword() != null) user.setPassword(Tools.stringMD5(user.getPassword()));
  273. int result = update(userMapper, user);
  274. return user;
  275. }
  276. public boolean delete(Number id){
  277. User in = one(userMapper, id);
  278. if(in == null){
  279. throw new ParameterException("用户不存在");
  280. }
  281. int result = delete(userMapper, id);
  282. return result > 0;
  283. }
  284. public User get(Number id){
  285. User in = one(userMapper, id);
  286. if(in == null){
  287. throw new ParameterException("用户不存在");
  288. }
  289. return in;
  290. }
  291. public Page<User> select(int page, int pageSize){return select(userMapper, page, pageSize);
  292. }
  293. public Page<User> select(int page, int pageSize, String keyword, Boolean real, String order, DirectionStatus direction){
  294. Example example = new Example(User.class);
  295. if(!keyword.isEmpty())
  296. example.and(
  297. example.createCriteria()
  298. .orLike("id", "%"+keyword+"%")
  299. .orLike("mobile", "%"+keyword+"%")
  300. );
  301. if (real != null)
  302. example.and(
  303. example.createCriteria().andEqualTo("realStatus", real?1:0)
  304. );
  305. if(order==null||order.isEmpty()) order = "id";
  306. if (direction != null){
  307. switch(direction){
  308. case ASC:
  309. example.orderBy(order).asc();
  310. break;
  311. case DESC:
  312. default:
  313. example.orderBy(order).desc();
  314. }
  315. } else {
  316. example.orderBy(order).desc();
  317. }
  318. return select(userMapper, example, page, pageSize);
  319. }
  320. public List<User> select(Collection ids){
  321. return select(userMapper, ids);
  322. }
  323. }