UserServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. package com.ruoyi.user.service.impl;
  2. import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
  3. import cn.dev33.satoken.secure.BCrypt;
  4. import cn.hutool.core.bean.BeanUtil;
  5. import cn.hutool.core.util.ObjectUtil;
  6. import com.ruoyi.clock.domain.vo.EmployeeVo;
  7. import com.ruoyi.clock.service.IEmployeeService;
  8. import com.ruoyi.common.constant.Constants;
  9. import com.ruoyi.common.core.domain.entity.SysUser;
  10. import com.ruoyi.common.enums.ExceptionEnum;
  11. import com.ruoyi.common.enums.UserStatus;
  12. import com.ruoyi.common.exception.ServiceException;
  13. import com.ruoyi.common.exception.user.UserException;
  14. import com.ruoyi.common.utils.MessageUtils;
  15. import com.ruoyi.common.utils.StringUtils;
  16. import com.ruoyi.common.core.page.TableDataInfo;
  17. import com.ruoyi.common.core.domain.PageQuery;
  18. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  19. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  20. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  21. import com.ruoyi.common.utils.redis.RedisUtils;
  22. import com.ruoyi.user.domain.UserThirdIdentity;
  23. import com.ruoyi.user.domain.bo.UserThirdIdentityBo;
  24. import com.ruoyi.user.mapper.UserThirdIdentityMapper;
  25. import com.ruoyi.user.service.IUserThirdIdentityService;
  26. import com.ruoyi.weixin.domain.WxEmployeeDto;
  27. import com.ruoyi.weixin.domain.WxUserDto;
  28. import com.ruoyi.weixin.service.WxMsgService;
  29. import com.ruoyi.weixin.service.WxUserService;
  30. import lombok.RequiredArgsConstructor;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.stereotype.Service;
  34. import com.ruoyi.user.domain.bo.UserBo;
  35. import com.ruoyi.user.domain.vo.UserVo;
  36. import com.ruoyi.user.domain.User;
  37. import com.ruoyi.user.mapper.UserMapper;
  38. import com.ruoyi.user.service.IUserService;
  39. import org.springframework.transaction.annotation.Transactional;
  40. import java.util.Date;
  41. import java.util.List;
  42. import java.util.Map;
  43. import java.util.Collection;
  44. import java.util.concurrent.TimeUnit;
  45. /**
  46. * 小程序用户管理Service业务层处理
  47. *
  48. * @author wuchao
  49. * @date 2022-03-03
  50. */
  51. @RequiredArgsConstructor
  52. @Service
  53. @Slf4j
  54. public class UserServiceImpl implements IUserService {
  55. private final UserMapper baseMapper;
  56. private final WxUserService wxUserService;
  57. private final IEmployeeService employeeService;
  58. private final UserThirdIdentityMapper userThirdIdentityMapper;
  59. /**
  60. * 查询小程序用户管理
  61. *
  62. * @param id 小程序用户管理主键
  63. * @return 小程序用户管理
  64. */
  65. @Override
  66. public UserVo queryById(Long id) {
  67. return baseMapper.selectVoById(id);
  68. }
  69. /**
  70. * 查询小程序用户管理列表
  71. *
  72. * @param bo 小程序用户管理
  73. * @return 小程序用户管理
  74. */
  75. @Override
  76. public TableDataInfo<UserVo> queryPageList(UserBo bo, PageQuery pageQuery) {
  77. LambdaQueryWrapper<User> lqw = buildQueryWrapper(bo);
  78. Page<UserVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
  79. return TableDataInfo.build(result);
  80. }
  81. /**
  82. * 查询小程序用户管理列表
  83. *
  84. * @param bo 小程序用户管理
  85. * @return 小程序用户管理
  86. */
  87. @Override
  88. public List<UserVo> queryList(UserBo bo) {
  89. LambdaQueryWrapper<User> lqw = buildQueryWrapper(bo);
  90. return baseMapper.selectVoList(lqw);
  91. }
  92. private LambdaQueryWrapper<User> buildQueryWrapper(UserBo bo) {
  93. Map<String, Object> params = bo.getParams();
  94. LambdaQueryWrapper<User> lqw = Wrappers.lambdaQuery();
  95. lqw.eq(StringUtils.isNotBlank(bo.getMobile()), User::getMobile, bo.getMobile());
  96. lqw.like(StringUtils.isNotBlank(bo.getNickname()), User::getNickname, bo.getNickname());
  97. lqw.eq(StringUtils.isNotBlank(bo.getHeadPhoto()), User::getHeadPhoto, bo.getHeadPhoto());
  98. lqw.eq(bo.getAge() != null, User::getAge, bo.getAge());
  99. lqw.eq(bo.getGender() != null, User::getGender, bo.getGender());
  100. lqw.like(StringUtils.isNotBlank(bo.getRealName()), User::getRealName, bo.getRealName());
  101. lqw.eq(StringUtils.isNotBlank(bo.getBirthday()), User::getBirthday, bo.getBirthday());
  102. lqw.eq(bo.getStatus() != null, User::getStatus, bo.getStatus());
  103. lqw.eq(bo.getLastLoginTime() != null, User::getLastLoginTime, bo.getLastLoginTime());
  104. return lqw;
  105. }
  106. /**
  107. * 新增小程序用户管理
  108. *
  109. * @param bo 小程序用户管理
  110. * @return 结果
  111. */
  112. @Override
  113. public Boolean insertByBo(UserBo bo) {
  114. User add = BeanUtil.toBean(bo, User.class);
  115. validEntityBeforeSave(add);
  116. boolean flag = baseMapper.insert(add) > 0;
  117. if (flag) {
  118. bo.setId(add.getId());
  119. }
  120. return flag;
  121. }
  122. /**
  123. * 修改小程序用户管理
  124. *
  125. * @param bo 小程序用户管理
  126. * @return 结果
  127. */
  128. @Override
  129. public Boolean updateByBo(UserBo bo) {
  130. User update = BeanUtil.toBean(bo, User.class);
  131. validEntityBeforeSave(update);
  132. return baseMapper.updateById(update) > 0;
  133. }
  134. /**
  135. * 保存前的数据校验
  136. *
  137. * @param entity 实体类数据
  138. */
  139. private void validEntityBeforeSave(User entity) {
  140. //TODO 做一些数据校验,如唯一约束
  141. }
  142. /**
  143. * 批量删除小程序用户管理
  144. *
  145. * @param ids 需要删除的小程序用户管理主键
  146. * @return 结果
  147. */
  148. @Override
  149. public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
  150. if (isValid) {
  151. //TODO 做一些业务上的校验,判断是否需要校验
  152. }
  153. return baseMapper.deleteBatchIds(ids) > 0;
  154. }
  155. @Override
  156. @Transactional(rollbackFor = Exception.class)
  157. public User authorization(WxUserDto wxUserDto) {
  158. //获取openId
  159. String openId = wxUserService.getOpenIdByCode(wxUserDto.getCode());
  160. //查询此openid是否绑定过用户
  161. UserThirdIdentity userThirdIdentity = userThirdIdentityMapper.selectOne(
  162. new LambdaQueryWrapper<UserThirdIdentity>()
  163. .eq(UserThirdIdentity::getThirdType, 0)
  164. .eq(UserThirdIdentity::getIdentityCode, openId)
  165. .last("limit 1")
  166. );
  167. User user;
  168. //该用户未绑定过,则创建
  169. if (ObjectUtil.isNull(userThirdIdentity)) {
  170. //创建用户
  171. user = new User();
  172. user.setNickname(wxUserDto.getNickname());
  173. user.setHeadPhoto(wxUserDto.getHeadPhoto());
  174. user.setAge(wxUserDto.getAge());
  175. user.setGender(wxUserDto.getGender());//info.getGender()
  176. user.setRealName(wxUserDto.getRealName());
  177. user.setBirthday(wxUserDto.getBirthday());
  178. user.setStatus(true);
  179. //保存用户信息
  180. this.baseMapper.insert(user);
  181. //保存第三方关系
  182. userThirdIdentity = new UserThirdIdentity();
  183. userThirdIdentity.setUserId(user.getId());
  184. userThirdIdentity.setThirdType(0);
  185. userThirdIdentity.setIdentityCode(openId);
  186. userThirdIdentityMapper.insert(userThirdIdentity);
  187. } else {
  188. user = this.getById(userThirdIdentity.getUserId(), true);
  189. }
  190. // //TODO 自定义用户
  191. // User user = this.baseMapper.selectById(1L);
  192. // if (ObjectUtil.isNull(user)) {
  193. // user = new User();
  194. // user.setMobile("10086");
  195. // user.setNickname("老师");
  196. // user.setHeadPhoto("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fup.enterdesk.com%2Fedpic%2Fe8%2F34%2F02%2Fe834028fa4b313a1607872736437ef2d.jpg&refer=http%3A%2F%2Fup.enterdesk.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1648636830&t=5c4d53742351fbed90487a5b34e60058");
  197. // user.setAge(18);
  198. // user.setGender(0);//info.getGender()
  199. // user.setRealName("");
  200. // user.setBirthday("");
  201. // user.setStatus(true);
  202. // //保存用户信息
  203. // this.baseMapper.insert(user);
  204. //
  205. // //保存用户的第三方身份
  206. // UserThirdIdentityBo userThirdIdentity = new UserThirdIdentityBo();
  207. // userThirdIdentity.setUserId(user.getId());
  208. // userThirdIdentity.setThirdType(0);
  209. // userThirdIdentity.setIdentityCode("openId");
  210. // userThirdIdentityService.insertByBo(userThirdIdentity);
  211. // }else {
  212. // //更新用户信息
  213. // this.baseMapper.updateById(user);
  214. // }
  215. return user;
  216. }
  217. @Override
  218. public User getById(Long userId, boolean isThrow) {
  219. User obj = this.baseMapper.selectById(userId);
  220. if (ObjectUtil.isNull(obj)) {
  221. if (isThrow) {
  222. throw new ServiceException("用户不存在");
  223. }
  224. }
  225. return obj;
  226. }
  227. @Override
  228. public EmployeeVo login(WxEmployeeDto wxEmployeeDto) {
  229. String username = wxEmployeeDto.getUsername();
  230. String password = wxEmployeeDto.getPassword();
  231. EmployeeVo user = loadUserByUsername(username);
  232. Integer errorNumber = RedisUtils.getCacheObject(Constants.LOGIN_ERROR + username);
  233. if (!BCrypt.checkpw(password, user.getPassword())) {
  234. // 是否第一次
  235. errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
  236. // 达到规定错误次数 则锁定登录
  237. if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) {
  238. RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES);
  239. throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME);
  240. } else {
  241. // 未达到规定错误次数 则递增
  242. RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber);
  243. throw new UserException("user.password.retry.limit.count", errorNumber);
  244. }
  245. }
  246. return user;
  247. }
  248. private EmployeeVo loadUserByUsername(String username) {
  249. EmployeeVo user = employeeService.selectUserByUserName(username);
  250. if (ObjectUtil.isNull(user)) {
  251. log.info("登录用户:{} 不存在.", username);
  252. throw new UserException("user.not.exists", username);
  253. } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
  254. log.info("登录用户:{} 已被删除.", username);
  255. throw new UserException("user.password.delete", username);
  256. } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
  257. log.info("登录用户:{} 已被停用.", username);
  258. throw new UserException("user.blocked", username);
  259. }
  260. return user;
  261. }
  262. }