UserServiceImpl.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package nju.seec.helper.service.impl;
  2. import nju.seec.helper.aspect.auth.LoginUser;
  3. import nju.seec.helper.dao.UserDAO;
  4. import nju.seec.helper.dto.user.ResetPasswordDTO;
  5. import nju.seec.helper.dto.user.UserDTO;
  6. import nju.seec.helper.entity.User;
  7. import nju.seec.helper.enums.ExceptionType;
  8. import nju.seec.helper.enums.UserState;
  9. import nju.seec.helper.enums.UserType;
  10. import nju.seec.helper.exception.HelperException;
  11. import nju.seec.helper.service.UserService;
  12. import nju.seec.helper.util.Consts;
  13. import nju.seec.helper.util.EncryptUtils;
  14. import nju.seec.helper.util.RedisCacheUtils;
  15. import nju.seec.helper.vo.UserVO;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.transaction.annotation.Transactional;
  18. /**
  19. * @author cst
  20. */
  21. @Service
  22. public class UserServiceImpl implements UserService {
  23. private final RedisCacheUtils cacheUtils;
  24. private final UserDAO userDAO;
  25. // private final static Map<String, UserType> EMAIL_SUFFIX_AND_USER_TYPE_MAP =
  26. // ImmutableMap.of(
  27. // "smail.nju.edu.cn", UserType.STUDENT,
  28. // "nju.edu.cn", UserType.TEACHER
  29. // );
  30. public UserServiceImpl(UserDAO userDAO, RedisCacheUtils cacheUtils) {
  31. this.userDAO = userDAO;
  32. this.cacheUtils = cacheUtils;
  33. }
  34. @Transactional(rollbackFor = Exception.class)
  35. @Override
  36. public UserVO createUser(UserDTO userDTO) {
  37. checkSameEmail(userDTO.getEmail());
  38. checkSamePhone(userDTO.getPhone());
  39. String email = userDTO.getEmail();
  40. if (!userDTO.getEmailCode().equals(cacheUtils.get(Consts.EMAIL_CACHE_NAME, email))) {
  41. throw HelperException.of(ExceptionType.NOT_FOUND, "邮箱或验证码错误");
  42. }
  43. String phone = userDTO.getPhone();
  44. if (!userDTO.getPhoneCode().equals(cacheUtils.get(Consts.PHONE_CACHE_NAME, phone))) {
  45. throw HelperException.of(ExceptionType.NOT_FOUND, "手机号或验证码错误");
  46. }
  47. User user = userDAO.save(new User()
  48. .setName(userDTO.getName())
  49. .setEmail(userDTO.getEmail())
  50. .setPhone(userDTO.getPhone())
  51. .setPassword(EncryptUtils.encode(userDTO.getPassword()))
  52. .setType(userDTO.getType())
  53. .setState(userDTO.getType() == UserType.TEACHER ? UserState.CHECKING : UserState.NORMAL));
  54. cacheUtils.remove(Consts.EMAIL_CACHE_NAME, email);
  55. cacheUtils.remove(Consts.PHONE_CACHE_NAME, phone);
  56. return new UserVO(user);
  57. }
  58. @Transactional(rollbackFor = Exception.class)
  59. @Override
  60. public UserVO modifyUser(LoginUser loginUser, UserDTO userDTO) {
  61. User user = userDAO.findUserById(loginUser.getId());
  62. user.setName(userDTO.getName());
  63. user = userDAO.save(user);
  64. return new UserVO(user);
  65. }
  66. @Transactional(rollbackFor = Exception.class)
  67. @Override
  68. public void resetPasswordByEmail(ResetPasswordDTO resetPasswordDTO) {
  69. User user = userDAO.findByEmail(resetPasswordDTO.getUsername())
  70. .orElseThrow(() -> HelperException.of(ExceptionType.NOT_FOUND, "该邮箱未在系统中注册"));
  71. if (!resetPasswordDTO.getCode().equals(cacheUtils.get(Consts.EMAIL_CACHE_NAME, resetPasswordDTO.getUsername()))) {
  72. throw HelperException.of(ExceptionType.NOT_FOUND, "邮箱或验证码错误");
  73. }
  74. user.setPassword(EncryptUtils.encode(resetPasswordDTO.getPassword()));
  75. userDAO.save(user);
  76. cacheUtils.remove(Consts.EMAIL_CACHE_NAME, resetPasswordDTO.getUsername());
  77. }
  78. @Transactional(readOnly = true)
  79. @Override
  80. public UserVO getUserByEmailAndPassword(String email, String password) {
  81. return userDAO
  82. .findByEmailAndPassword(email, EncryptUtils.encode(password))
  83. .map(UserVO::new)
  84. .orElseThrow(() -> HelperException.of(ExceptionType.NOT_FOUND, "邮箱或密码错误"));
  85. }
  86. @Transactional(readOnly = true)
  87. @Override
  88. public UserVO getUserById(Long userId) {
  89. return new UserVO(userDAO.findUserById(userId));
  90. }
  91. private void checkSameEmail(String email) {
  92. if (userDAO.existsByEmail(email)) {
  93. throw HelperException.of(ExceptionType.CONFLICT, "该邮箱已注册");
  94. }
  95. }
  96. private void checkSamePhone(String phone) {
  97. if (userDAO.existsByPhone(phone)) {
  98. throw HelperException.of(ExceptionType.CONFLICT, "该手机号已注册");
  99. }
  100. }
  101. }