package cn.cetc54.platform.base.controller.manage; import cn.cetc54.platform.core.common.exception.PlatformException; import cn.cetc54.platform.core.common.redis.RedisTemplateHelper; import cn.cetc54.platform.core.common.utils.CommonUtil; import cn.cetc54.platform.core.common.utils.PageUtil; import cn.cetc54.platform.core.common.utils.ResultUtil; import cn.cetc54.platform.core.common.utils.SecurityUtil; import cn.cetc54.platform.core.common.vo.PageVo; import cn.cetc54.platform.core.common.vo.Result; import cn.cetc54.platform.core.entity.Role; import cn.cetc54.platform.core.entity.User; import cn.cetc54.platform.core.entity.UserRole; import cn.cetc54.platform.core.service.*; import cn.cetc54.platform.core.service.mybatis.IUserRoleService; import cn.cetc54.platform.core.common.constant.CommonConstant; import cn.cetc54.platform.core.common.vo.RoleDTO; import cn.cetc54.platform.core.common.vo.SearchVo; import cn.cetc54.platform.core.entity.Department; import cn.hutool.core.util.StrUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.data.domain.Page; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.validation.Valid; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * @author */ @Slf4j @RestController @Api(description = "用户接口") @RequestMapping("/platform/user") @CacheConfig(cacheNames = "user") @Transactional public class UserController { @Autowired private UserService userService; @Autowired private RoleService roleService; @Autowired private DepartmentService departmentService; @Autowired private IUserRoleService iUserRoleService; @Autowired private UserRoleService userRoleService; @Autowired private DepartmentHeaderService departmentHeaderService; @Autowired private StringRedisTemplate redisTemplate; @Autowired private RedisTemplateHelper redisTemplateHelper; @Autowired private SecurityUtil securityUtil; @PersistenceContext private EntityManager entityManager; @RequestMapping(value = "/regist",method = RequestMethod.POST) @ApiOperation(value = "注册用户") public Result regist(@Valid User u){ // 校验是否已存在 checkUserInfo(u.getUsername(), u.getMobile(), u.getEmail()); String encryptPass = new BCryptPasswordEncoder().encode(u.getPassword()); u.setPassword(encryptPass).setType(CommonConstant.USER_TYPE_NORMAL); User user = userService.save(u); // 默认角色 List roleList = roleService.findByDefaultRole(true); if(roleList!=null&&roleList.size()>0){ for(Role role : roleList){ UserRole ur = new UserRole().setUserId(user.getId()).setRoleId(role.getId()); userRoleService.save(ur); } } return ResultUtil.data(user); } @RequestMapping(value = "/info",method = RequestMethod.GET) @ApiOperation(value = "获取当前登录用户接口") public Result getUserInfo(){ User u = securityUtil.getCurrUser(); // 清除持久上下文环境 避免后面语句导致持久化 entityManager.clear(); u.setPassword(null); return new ResultUtil().setData(u); } @RequestMapping(value = "/unlock",method = RequestMethod.POST) @ApiOperation(value = "解锁验证密码") public Result unLock(@RequestParam String password){ User u = securityUtil.getCurrUser(); if(!new BCryptPasswordEncoder().matches(password, u.getPassword())){ return ResultUtil.error("密码不正确"); } return ResultUtil.data(null); } @RequestMapping(value = "/resetPass", method = RequestMethod.POST) @ApiOperation(value = "重置密码") public Result resetPass(@RequestParam String[] ids){ for(String id:ids){ User u = userService.get(id); u.setPassword(new BCryptPasswordEncoder().encode("123456")); userService.update(u); redisTemplate.delete("user::"+u.getUsername()); } return ResultUtil.success("操作成功"); } @RequestMapping(value = "/edit",method = RequestMethod.POST) @ApiOperation(value = "修改用户自己资料",notes = "用户名密码不会修改 需要username更新缓存") @CacheEvict(key = "#u.username") public Result editOwn(User u){ User old = securityUtil.getCurrUser(); u.setUsername(old.getUsername()); u.setPassword(old.getPassword()); User user = userService.update(u); if(user==null){ return ResultUtil.error("修改失败"); } return ResultUtil.success("修改成功"); } /** * 线上demo不允许测试账号改密码 * @param password * @param newPass * @return */ @RequestMapping(value = "/modifyPass",method = RequestMethod.POST) @ApiOperation(value = "修改密码") public Result modifyPass(@ApiParam("旧密码") @RequestParam String password, @ApiParam("新密码") @RequestParam String newPass){ User user = securityUtil.getCurrUser(); if(!new BCryptPasswordEncoder().matches(password, user.getPassword())){ return ResultUtil.error("旧密码不正确"); } String newEncryptPass= new BCryptPasswordEncoder().encode(newPass); user.setPassword(newEncryptPass); userService.update(user); // 手动更新缓存 redisTemplate.delete("user::"+user.getUsername()); return ResultUtil.success("修改密码成功"); } @RequestMapping(value = "/getByCondition",method = RequestMethod.GET) @ApiOperation(value = "多条件分页获取用户列表") public Result> getByCondition(User user, SearchVo searchVo, PageVo pageVo){ Page page = userService.findByCondition(user, searchVo, PageUtil.initPage(pageVo)); for(User u: page.getContent()){ List list = iUserRoleService.findByUserId(u.getId()); List roleDTOList = list.stream().map(e->{ return new RoleDTO().setId(e.getId()).setName(e.getName()).setDescription(e.getDescription()); }).collect(Collectors.toList()); u.setRoles(roleDTOList); // 游离态 避免后面语句导致持久化 entityManager.detach(u); u.setPassword(null); } return new ResultUtil>().setData(page); } @RequestMapping(value = "/getByDepartmentId/{departmentId}",method = RequestMethod.GET) @ApiOperation(value = "多条件分页获取用户列表") public Result> getByCondition(@PathVariable String departmentId){ List list = userService.findByDepartmentId(departmentId); entityManager.clear(); list.forEach(u -> { u.setPassword(null); }); return new ResultUtil>().setData(list); } @RequestMapping(value = "/getAll",method = RequestMethod.GET) @ApiOperation(value = "获取全部用户数据") public Result> getByCondition(){ List list = userService.getAll(); for(User u: list){ // 清除持久上下文环境 避免后面语句导致持久化 entityManager.clear(); u.setPassword(null); } return new ResultUtil>().setData(list); } @RequestMapping(value = "/admin/add", method = RequestMethod.POST) @ApiOperation(value = "添加用户") public Result add(@Valid User u, @RequestParam(required = false) String[] roleIds){ // 校验是否已存在 checkUserInfo(u.getUsername(), u.getMobile(), u.getEmail()); String encryptPass = new BCryptPasswordEncoder().encode(u.getPassword()); u.setPassword(encryptPass); if(StrUtil.isNotBlank(u.getDepartmentId())){ Department d = departmentService.get(u.getDepartmentId()); if(d!=null){ u.setDepartmentTitle(d.getTitle()); } }else{ u.setDepartmentId(null); u.setDepartmentTitle(""); } User user = userService.save(u); if(roleIds!=null){ // 添加角色 List userRoles = Arrays.asList(roleIds).stream().map(e -> { return new UserRole().setUserId(u.getId()).setRoleId(e); }).collect(Collectors.toList()); userRoleService.saveOrUpdateAll(userRoles); } return ResultUtil.success("添加成功"); } @RequestMapping(value = "/admin/edit", method = RequestMethod.POST) @ApiOperation(value = "管理员修改资料",notes = "需要通过id获取原用户信息 需要username更新缓存") @CacheEvict(key = "#u.username") public Result edit(User u, @RequestParam(required = false) String[] roleIds){ User old = userService.get(u.getId()); u.setUsername(old.getUsername()); // 若修改了手机和邮箱判断是否唯一 if(!old.getMobile().equals(u.getMobile())&&userService.findByMobile(u.getMobile())!=null){ return ResultUtil.error("该手机号已绑定其他账户"); } if(!old.getEmail().equals(u.getEmail())&&userService.findByEmail(u.getEmail())!=null){ return ResultUtil.error("该邮箱已绑定其他账户"); } if(StrUtil.isNotBlank(u.getDepartmentId())){ Department d = departmentService.get(u.getDepartmentId()); if(d!=null){ u.setDepartmentTitle(d.getTitle()); } }else{ u.setDepartmentId(null); u.setDepartmentTitle(""); } u.setPassword(old.getPassword()); userService.update(u); // 删除该用户角色 userRoleService.deleteByUserId(u.getId()); if(roleIds!=null){ // 新角色 List userRoles = Arrays.asList(roleIds).stream().map(e -> { return new UserRole().setRoleId(e).setUserId(u.getId()); }).collect(Collectors.toList()); userRoleService.saveOrUpdateAll(userRoles); } // 手动删除缓存 redisTemplate.delete("userRole::"+u.getId()); redisTemplate.delete("userRole::depIds:"+u.getId()); redisTemplate.delete("permission::userMenuList:"+u.getId()); return ResultUtil.success("修改成功"); } @RequestMapping(value = "/admin/disable/{userId}",method = RequestMethod.POST) @ApiOperation(value = "后台禁用用户") public Result disable(@ApiParam("用户唯一id标识") @PathVariable String userId){ User user = userService.get(userId); if(user==null){ return ResultUtil.error("通过userId获取用户失败"); } user.setStatus(CommonConstant.USER_STATUS_LOCK); userService.update(user); // 手动更新缓存 redisTemplate.delete("user::"+user.getUsername()); return ResultUtil.data(null); } @RequestMapping(value = "/admin/enable/{userId}",method = RequestMethod.POST) @ApiOperation(value = "后台启用用户") public Result enable(@ApiParam("用户唯一id标识") @PathVariable String userId){ User user = userService.get(userId); if(user==null){ return ResultUtil.error("通过userId获取用户失败"); } user.setStatus(CommonConstant.USER_STATUS_NORMAL); userService.update(user); // 手动更新缓存 redisTemplate.delete("user::"+user.getUsername()); return ResultUtil.data(null); } @RequestMapping(value = "/delByIds",method = RequestMethod.POST) @ApiOperation(value = "批量通过ids删除") public Result delAllByIds(String[] ids){ for(String id:ids){ User u = userService.get(id); // 删除缓存 redisTemplate.delete("user::" + u.getUsername()); redisTemplate.delete("userRole::" + u.getId()); redisTemplate.delete("userRole::depIds:" + u.getId()); redisTemplate.delete("permission::userMenuList:" + u.getId()); Set keys = redisTemplateHelper.keys("department::*"); redisTemplate.delete(keys); userService.delete(id); // 删除关联角色 userRoleService.deleteByUserId(id); // 删除关联部门负责人 departmentHeaderService.deleteByUserId(id); } return ResultUtil.success("批量通过id删除数据成功"); } /** * 校验 * @param username 用户名 不校验传空字符或null 下同 * @param mobile 手机号 * @param email 邮箱 */ public void checkUserInfo(String username, String mobile, String email){ // 禁用词 CommonUtil.stopwords(username); if(StrUtil.isNotBlank(username)&&userService.findByUsername(username)!=null){ throw new PlatformException("该登录账号已被注册"); } if(StrUtil.isNotBlank(email)&&userService.findByEmail(email)!=null){ throw new PlatformException("该邮箱已被注册"); } if(StrUtil.isNotBlank(mobile)&&userService.findByMobile(mobile)!=null){ throw new PlatformException("该手机号已被注册"); } } }