package nju.seec.helper.service.impl; import nju.seec.helper.aspect.auth.LoginUser; import nju.seec.helper.dao.AdminDAO; import nju.seec.helper.dao.UserDAO; import nju.seec.helper.entity.User; import nju.seec.helper.enums.ExceptionType; import nju.seec.helper.enums.UserState; import nju.seec.helper.enums.UserType; import nju.seec.helper.exception.HelperException; import nju.seec.helper.service.AdminService; import nju.seec.helper.util.EncryptUtils; import nju.seec.helper.util.StringUtils; import nju.seec.helper.vo.AdminVO; import nju.seec.helper.vo.UserVO; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * @author cst */ @Service public class AdminServiceImpl implements AdminService { private final AdminDAO adminDAO; private final UserDAO userDAO; public AdminServiceImpl(AdminDAO adminDAO, UserDAO userDAO) { this.adminDAO = adminDAO; this.userDAO = userDAO; } @Transactional(readOnly = true) @Override public AdminVO getAdminByUsernameAndPassword(String username, String password) { return adminDAO.findByUsernameAndPassword(username, EncryptUtils.encode(password)) .map(AdminVO::new) .orElseThrow(() -> HelperException.of(ExceptionType.NOT_FOUND, "用户名密码错误")); } @Transactional(readOnly = true) @Override public Page getUsers(UserType type, UserState state, String key, Pageable pageable) { return findUsersByTypeAndStateAndKey(type, state, key, pageable).map(UserVO::new); } @Transactional(rollbackFor = Exception.class) @Override public void passUser(LoginUser admin, Long userId) { User user = userDAO.findUserById(userId); if (user.getState() != UserState.CHECKING) { throw HelperException.of(ExceptionType.FORBIDDEN, "该帐号暂时无法审核通过"); } userDAO.save(user.setState(UserState.NORMAL)); } @Transactional(rollbackFor = Exception.class) @Override public void lockUser(LoginUser admin, Long userId) { userDAO.save(userDAO.findUserById(userId).setState(UserState.LOCKED)); } @Transactional(rollbackFor = Exception.class) @Override public void unlockUser(LoginUser admin, Long userId) { User user = userDAO.findUserById(userId); if (user.getState() != UserState.LOCKED) { throw HelperException.of(ExceptionType.FORBIDDEN, "该帐号暂时无法解封"); } userDAO.save(user.setState(UserState.NORMAL)); } private Page findUsersByTypeAndStateAndKey(UserType userType, UserState userState, String key, Pageable pageable) { final String keyPattern = StringUtils.keyPattern(key); return userDAO.findAll( (Specification) (root, query, cb) -> cb.and( cb.equal(root.get("type").as(UserType.class), userType) , cb.equal(root.get("state").as(UserState.class), userState) , cb.or(cb.like(root.get("email"), keyPattern), cb.like(root.get("phone"), keyPattern), cb.like(root.get("name"), keyPattern)) ) , pageable); } }