/** * 处理管理员数据的业务实现类 */ @Slf4j @Service public class AdminServiceImpl implements IAdminService { @Value("${csmall.jwt.secret-key}") private String secretKey; @Value("${csmall.jwt.duration-in-minute}") private long durationInMinute; @Autowired private AdminMapper adminMapper; @Autowired private AdminRoleMapper adminRoleMapper; @Autowired private PasswordEncoder passwordEncoder; @Autowired private AuthenticationManager authenticationManager; public AdminServiceImpl() { log.info("创建业务对象:AdminServiceImpl"); } @Override public String login(AdminLoginDTO adminLoginDTO) { log.debug("开始处理【管理员登录】的业务,参数:{}", adminLoginDTO); // 执行认证 Authentication authentication = new UsernamePasswordAuthenticationToken( adminLoginDTO.getUsername(), adminLoginDTO.getPassword()); Authentication authenticateResult = authenticationManager.authenticate(authentication); log.debug("认证通过,认证管理器返回:{}", authenticateResult); // 从认证结果中获取所需的数据,将用于生成JWT Object principal = authenticateResult.getPrincipal(); log.debug("认证结果中的当事人类型:{}", principal.getClass().getName()); AdminDetails adminDetails = (AdminDetails) principal; String username = adminDetails.getUsername(); Long id = adminDetails.getId(); Collection<GrantedAuthority> authorities = adminDetails.getAuthorities(); String authoritiesJsonString = JSON.toJSONString(authorities); // 生成JWT数据时,需要填充装到JWT中的数据 Map<String, Object> claims = new HashMap<>(); claims.put("id", id); claims.put("username", username); claims.put("authoritiesJsonString", authoritiesJsonString); log.debug("向JWT中存入id:{}", id); log.debug("向JWT中存入username:{}", username); log.debug("向JWT中存入authoritiesJsonString:{}", authoritiesJsonString); // 以下是生成JWT的固定代码 Date date = new Date(System.currentTimeMillis() + durationInMinute * 60 * 1000L); String jwt = Jwts.builder() // Header .setHeaderParam("alg", "HS256") .setHeaderParam("typ", "JWT") // Payload .setClaims(claims) // Signature .setExpiration(date) .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); log.debug("生成的JWT:{}", jwt); return jwt; } @Override public void addNew(AdminAddNewDTO adminAddNewDTO) { log.debug("开始处理【添加管理员】的业务,参数:{}", adminAddNewDTO); log.debug("即将检查用户名是否被占用……"); { // 从参数对象中获取username String username = adminAddNewDTO.getUsername(); // 调用adminMapper的countByUsername()方法执行统计查询 int count = adminMapper.countByUsername(username); // 判断统计结果是否不等于0 if (count != 0) { // 是:抛出异常 String message = "添加管理员失败,用户名【" + username + "】已经被占用!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_CONFLICT, message); } } log.debug("即将检查手机号码是否被占用……"); { // 从参数对象中获取手机号码 String phone = adminAddNewDTO.getPhone(); // 调用adminMapper的countByPhone()方法执行统计查询 int count = adminMapper.countByPhone(phone); // 判断统计结果是否不等于0 if (count != 0) { // 是:抛出异常 String message = "添加管理员失败,手机号码【" + phone + "】已经被占用!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_CONFLICT, message); } } log.debug("即将检查电子邮箱是否被占用……"); { // 从参数对象中获取电子邮箱 String email = adminAddNewDTO.getEmail(); // 调用adminMapper的countByEmail()方法执行统计查询 int count = adminMapper.countByEmail(email); // 判断统计结果是否不等于0 if (count != 0) { // 是:抛出异常 String message = "添加管理员失败,电子邮箱【" + email + "】已经被占用!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_CONFLICT, message); } } // 创建Admin对象 Admin admin = new Admin(); // 通过BeanUtils.copyProperties()方法将参数对象的各属性值复制到Admin对象中 BeanUtils.copyProperties(adminAddNewDTO, admin); // 取出密码,进行加密处理,并将密文封装回Admin对象中 String rawPassword = admin.getPassword(); String encodedPassword = passwordEncoder.encode(rawPassword); admin.setPassword(encodedPassword); // 补全Admin对象中的属性值:loginCount >>> 0 admin.setLoginCount(0); // 调用adminMapper的insert()方法插入数据 log.debug("即将插入管理员数据,参数:{}", admin); int rows = adminMapper.insert(admin); // 判断插入数据的结果是否符合预期 if (rows != 1) { String message = "添加管理员失败,服务器忙,请稍后再次尝试!"; log.warn(message); throw new ServiceException(ServiceCode.ERR_INSERT, message); } // 插入管理员与角色关联的数据 Long[] roleIds = adminAddNewDTO.getRoleIds(); AdminRole[] adminRoles = new AdminRole[roleIds.length]; LocalDateTime now = LocalDateTime.now(); for (int i = 0; i < roleIds.length; i++) { AdminRole adminRole = new AdminRole(); adminRole.setAdminId(admin.getId()); adminRole.setRoleId(roleIds[i]); adminRole.setGmtCreate(now); adminRole.setGmtModified(now); adminRoles[i] = adminRole; } rows = adminRoleMapper.insertBatch(adminRoles); if (rows != roleIds.length) { String message = "添加管理员失败,服务器忙,请稍后再次尝试!"; log.warn(message); throw new ServiceException(ServiceCode.ERR_INSERT, message); } } @Override public void delete(Long id) { log.debug("开始处理【删除管理员】的业务,参数:{}", id); // id值为1的管理员不允许被删除 if (id == 1) { // 是:抛出异常(ERR_NOT_FOUND) String message = "删除管理员失败,尝试删除的管理员数据不存在!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message); } // 调用adminMapper的AdminStandardVO getStandardById(Long id)方法执行查询 AdminStandardVO queryResult = adminMapper.getStandardById(id); // 判断查询结果是否为null if (queryResult == null) { // 是:抛出异常(ERR_NOT_FOUND) String message = "删除管理员失败,尝试删除的管理员数据不存在!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message); } // 调用adminMapper的int deleteById(Long id)执行删除,并获取返回的行数 int rows = adminMapper.deleteById(id); // 判断返回的行数是否不为1 if (rows != 1) { // 是:抛出异常(ERR_DELETE:服务器忙) String message = "删除管理员失败,服务器忙,请稍后再尝试!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_DELETE, message); } // 删除管理员与角色的关联数据 rows = adminRoleMapper.deleteByAdminId(id); if (rows < 1) { // 是:抛出异常(ERR_DELETE:服务器忙) String message = "删除管理员失败,服务器忙,请稍后再尝试!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_DELETE, message); } } @Override public void setEnable(Long id) { updateEnableById(id, 1); } @Override public void setDisable(Long id) { updateEnableById(id, 0); } @Override public List<AdminListItemVO> list() { log.debug("开始处理【查询管理员列表】的业务,无参数"); List<AdminListItemVO> list = adminMapper.list(); Iterator<AdminListItemVO> iterator = list.iterator(); while (iterator.hasNext()) { AdminListItemVO item = iterator.next(); if (item.getId() == 1) { iterator.remove(); break; } } return list; } private void updateEnableById(Long id, Integer enable) { String[] tips = {"禁用", "启用"}; log.debug("开始处理【{}管理员】的业务,参数:{}", tips[enable], id); // 判断参数id是否为1 if (id == 1) { String message = tips[enable] + "管理员失败,尝试访问的数据不存在!"; log.warn(message); throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message); } // 检查尝试访问的数据是否存在 AdminStandardVO queryResult = adminMapper.getStandardById(id); if (queryResult == null) { String message = tips[enable] + "管理员失败,尝试访问的数据不存在!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message); } // 判断状态是否冲突(当前已经是目标状态) if (queryResult.getEnable().equals(enable)) { String message = tips[enable] + "管理员失败,管理员账号已经处于" + tips[enable] + "状态!"; log.debug(message); throw new ServiceException(ServiceCode.ERR_CONFLICT, message); } // 准备执行更新 Admin admin = new Admin(); admin.setId(id); admin.setEnable(enable); int rows = adminMapper.update(admin); if (rows != 1) { String message = tips[enable] + "管理员失败,服务器忙,请稍后再次尝试!"; log.warn(message); throw new ServiceException(ServiceCode.ERR_UPDATE, message); } } }
处理管理员数据的业务实现类
最新推荐文章于 2024-07-15 22:27:18 发布