package com.om.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.om.constant.RedisConstant; import com.om.entity.dto.AdminAddDTO; import com.om.entity.dto.AdminQueryPageDTO; import com.om.entity.po.Admin; import com.om.entity.po.User; import com.om.entity.vo.AdminLoginVO; import com.om.entity.vo.AdminQueryPageVO; import com.om.exception.BadReqException; import com.om.exception.BizException; import com.om.mapper.AdminMapper; import com.om.service.IAdminService; import com.om.utils.AdminContext; import com.om.utils.JwtUtils; import com.om.utils.Result; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; /** *

* 服务实现类 *

* * @author bmmx * @since 2024-01-26 */ @Service public class AdminServiceImpl extends ServiceImpl implements IAdminService { @Resource private JwtUtils jwtUtils; @Resource private RedisTemplate redisTemplate; @Override public Result login(String username, String password) { if (StringUtils.isBlank(username)){ throw new BadReqException("用户名不能为空!"); } if (StringUtils.isBlank(password)){ throw new BadReqException("密码不能为空!"); } //根据username 查询数据库 Admin admin = this.lambdaQuery() .eq(Admin::getUsername, username) .one(); //判断是否存在 if (BeanUtil.isEmpty(admin)){ throw new BadReqException("该管理员不存在!请检查用户名是否正确!"); } //密码加密 password = DigestUtils.md5DigestAsHex(password.getBytes()); //判断密码是否正确 if (!StringUtils.equals(password,admin.getPassword())){ throw new BizException("密码不正确,请检查用户名和密码是否正确!"); } //判断管理员状态 if (!admin.getEnabled()){ throw new BadReqException("该管理员已被禁用!请联系系统管理员!!!"); } //封装vo返回 AdminLoginVO adminLoginVO = BeanUtil.copyProperties(admin, AdminLoginVO.class); //生成token Map claims = new HashMap<>(); claims.put("a_id",admin.getId()); String token = jwtUtils.generateToken(claims); //把token存入到redis中 String key = RedisConstant.ADMIN_TOKEN_PREFIX + admin.getId(); redisTemplate.opsForValue().set(key,token,RedisConstant.ADMIN_TOKEN_TTL, TimeUnit.SECONDS); adminLoginVO.setLoginToken(token); return Result.ok(adminLoginVO); } @Override public Result getManagerByToken(String token) { //根据token获取管理员id Integer adminId = jwtUtils.getAdminIdFromToken(token); //根据id查询管理员信息 Admin admin = this.getById(adminId); //判断是否为空 if (BeanUtil.isEmpty(admin)){ throw new BadReqException("该管理员不存在,请重试!"); } AdminLoginVO adminLoginVO = BeanUtil.copyProperties(admin, AdminLoginVO.class); adminLoginVO.setLoginToken(token); return Result.ok(adminLoginVO); } @Override public Result add(AdminAddDTO dto) { //获取当前登录管理员id Integer adminId = AdminContext.getAdminId(); String username = dto.getUsername(); String password = dto.getPassword(); //判断dto中的数据是否为空 if(StringUtils.isEmpty(username)){ throw new BadReqException("管理员用户名为空"); } if(StringUtils.isEmpty(password)){ throw new BadReqException("管理员密码为空"); } //判断dto中的用户名是否存在 Admin one = this.lambdaQuery() .eq(Admin::getUsername, username) .one(); if (!BeanUtil.isEmpty(one)){ throw new BadReqException("该用户已经存在,请检查用户名"); } LocalDateTime now = LocalDateTime.now(); //密码加密 password = DigestUtils.md5DigestAsHex(password.getBytes()); Admin admin = BeanUtil.copyProperties(dto, Admin.class); admin.setPassword(password); admin.setOperatorId(adminId); admin.setCreateTime(now); admin.setUpdateTime(now); //保存到数据库 this.save(admin); return Result.ok(); } @Override public Result delete(Integer id) { //根据id查询管理员 Admin admin = this.getById(id); //判断该管理员是否存在 if (BeanUtil.isEmpty(admin)){ throw new BadReqException("该管理员不存在"); } //删除该管理员 this.removeById(id); return Result.ok(); } @Override public Result get(Integer id) { //根据id查询管理员 Admin admin = this.getById(id); //判断该管理员是否存在 if (BeanUtil.isEmpty(admin)){ throw new BadReqException("该管理员不存在"); } AdminLoginVO adminLoginVO = BeanUtil.copyProperties(admin, AdminLoginVO.class); //从redis中获取token String tokenKey = RedisConstant.ADMIN_TOKEN_PREFIX +id; String redisToken = (String) redisTemplate.opsForValue().get(tokenKey); adminLoginVO.setLoginToken(redisToken); return Result.ok(adminLoginVO); } @Override public Result updateAdmin(AdminAddDTO dto) { //获取当前登录管理员id Integer adminId = AdminContext.getAdminId(); String username = dto.getUsername(); String password = dto.getPassword(); //判断dto中的数据是否为空 if(StringUtils.isEmpty(username)){ throw new BadReqException("管理员用户名为空"); } //判断dto中的用户名是否存在 Admin one = this.lambdaQuery() .eq(Admin::getUsername, username) .one(); if (BeanUtil.isEmpty(one)){ throw new BadReqException("该用户不存在,请检查用户名"); } LocalDateTime now = LocalDateTime.now(); //密码加密 //如果密码密码为空则 不修改密码 使用原密码 if (StringUtils.isEmpty(password)){ password = one.getPassword(); }else { password = DigestUtils.md5DigestAsHex(password.getBytes()); } Admin admin = BeanUtil.copyProperties(dto, Admin.class); admin.setPassword(password); admin.setOperatorId(adminId); admin.setUpdateTime(now); //更新到数据库 this.updateById(admin); //封装vo AdminLoginVO adminLoginVO = BeanUtil.copyProperties(admin, AdminLoginVO.class); //从redis中获取token String tokenKey = RedisConstant.ADMIN_TOKEN_PREFIX +adminId; String redisToken = (String) redisTemplate.opsForValue().get(tokenKey); adminLoginVO.setLoginToken(redisToken); return Result.ok(adminLoginVO); } @Override public Result updateState(Integer id) { //根据id查询管理员 Admin admin = this.getById(id); //判断该管理员是否存在 if (BeanUtil.isEmpty(admin)){ throw new BadReqException("该管理员不存在"); } admin.setEnabled(!admin.getEnabled()); this.updateById(admin); return Result.ok(); } @Override public Result logout(Integer id) { //把redis中的token删除 //从redis中获取token String tokenKey = RedisConstant.ADMIN_TOKEN_PREFIX +id; if (!redisTemplate.hasKey(tokenKey)) { throw new BadReqException("该管理员的token不存在"); } redisTemplate.delete(tokenKey); return Result.ok(); } @Override public Result getPageList(AdminQueryPageDTO dto) { //获取dto中的数据 Integer pageIndex = dto.getPageIndex(); Integer pageSize = dto.getPageSize(); //分页查询 Page page = this.lambdaQuery() .like(dto.getSearch() != null, Admin::getUsername, dto.getSearch()) .orderByDesc(Admin::getCreateTime) .page(new Page<>(pageIndex, pageSize)); AdminQueryPageVO adminQueryPageVO = new AdminQueryPageVO(); adminQueryPageVO.setCurrent((int) page.getCurrent()); adminQueryPageVO.setSize(pageSize); adminQueryPageVO.setPages((int) page.getPages()); if (dto.getSearch() != null){ adminQueryPageVO.setSearchCount(true); } List records = page.getRecords(); List list = new ArrayList<>(); for (Admin record : records) { AdminLoginVO adminLoginVO = BeanUtil.copyProperties(record, AdminLoginVO.class); list.add(adminLoginVO); } adminQueryPageVO.setRecords(list); adminQueryPageVO.setTotal((int) page.getTotal()); return Result.ok(adminQueryPageVO); } }