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<Object> 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<Role> 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<User> getUserInfo(){
|
|
User u = securityUtil.getCurrUser();
|
// 清除持久上下文环境 避免后面语句导致持久化
|
entityManager.clear();
|
u.setPassword(null);
|
return new ResultUtil<User>().setData(u);
|
}
|
|
@RequestMapping(value = "/unlock",method = RequestMethod.POST)
|
@ApiOperation(value = "解锁验证密码")
|
public Result<Object> 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<Object> 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<Object> 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<Object> 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<Page<User>> getByCondition(User user,
|
SearchVo searchVo,
|
PageVo pageVo){
|
|
Page<User> page = userService.findByCondition(user, searchVo, PageUtil.initPage(pageVo));
|
for(User u: page.getContent()){
|
List<Role> list = iUserRoleService.findByUserId(u.getId());
|
List<RoleDTO> 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<Page<User>>().setData(page);
|
}
|
|
|
@RequestMapping(value = "/getByDepartmentId/{departmentId}",method = RequestMethod.GET)
|
@ApiOperation(value = "多条件分页获取用户列表")
|
public Result<List<User>> getByCondition(@PathVariable String departmentId){
|
|
List<User> list = userService.findByDepartmentId(departmentId);
|
entityManager.clear();
|
list.forEach(u -> {
|
u.setPassword(null);
|
});
|
return new ResultUtil<List<User>>().setData(list);
|
}
|
|
@RequestMapping(value = "/getAll",method = RequestMethod.GET)
|
@ApiOperation(value = "获取全部用户数据")
|
public Result<List<User>> getByCondition(){
|
|
List<User> list = userService.getAll();
|
for(User u: list){
|
// 清除持久上下文环境 避免后面语句导致持久化
|
entityManager.clear();
|
u.setPassword(null);
|
}
|
return new ResultUtil<List<User>>().setData(list);
|
}
|
|
@RequestMapping(value = "/admin/add", method = RequestMethod.POST)
|
@ApiOperation(value = "添加用户")
|
public Result<Object> 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<UserRole> 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<Object> 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<UserRole> 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<Object> 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<Object> 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<Object> 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<String> 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("该手机号已被注册");
|
}
|
}
|
}
|