package com.gkhy.exam.system.service.impl;
|
|
import cn.hutool.core.codec.Base64;
|
import cn.hutool.core.util.ObjectUtil;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.gkhy.exam.common.annotation.DataScope;
|
import com.gkhy.exam.common.api.CommonPage;
|
import com.gkhy.exam.common.constant.CacheConstant;
|
import com.gkhy.exam.common.constant.UserConstant;
|
import com.gkhy.exam.common.domain.entity.SysUser;
|
import com.gkhy.exam.common.enums.UserTypeEnum;
|
import com.gkhy.exam.common.exception.ApiException;
|
import com.gkhy.exam.common.utils.PageUtils;
|
import com.gkhy.exam.common.utils.RedisUtils;
|
import com.gkhy.exam.common.utils.SecurityUtils;
|
import com.gkhy.exam.common.utils.StringUtils;
|
import com.gkhy.exam.system.domain.SysUserRole;
|
import com.gkhy.exam.system.mapper.SysUserMapper;
|
import com.gkhy.exam.system.mapper.SysUserRoleMapper;
|
import com.gkhy.exam.system.service.SysConfigService;
|
import com.gkhy.exam.system.service.SysUserService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.validation.Validator;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.TimeUnit;
|
|
|
/**
|
* <p>
|
* 用户表 服务实现类
|
* </p>
|
*
|
* @author kzy
|
* @since 2023-10-17 14:26:29
|
*/
|
@Service
|
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
|
@Autowired
|
private RedisUtils redisUtils;
|
|
@Autowired
|
private SysConfigService configService;
|
@Autowired
|
private Validator validator;
|
@Autowired
|
private SysUserRoleMapper userRoleMapper;
|
|
@Override
|
public CommonPage<SysUser> selectUserList(SysUser user) {
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
List<SysUser> users=new ArrayList<>();
|
if(!currentUser.getUserType().equals(UserTypeEnum.WORKSHOP_USER.getCode())){
|
if(!currentUser.getUserType().equals(UserTypeEnum.SYSTEM_USER.getCode())){
|
user.setCompanyId(currentUser.getCompanyId());
|
Map<String,Object> paramsMap=new HashMap<>();
|
paramsMap.put("userType",currentUser.getUserType());
|
user.setParams(paramsMap);
|
}
|
PageUtils.startPage();
|
users=baseMapper.userList(user);
|
}
|
return CommonPage.restPage(users);
|
}
|
/**
|
* 根据条件分页查询已分配用户角色列表
|
*
|
* @param user 用户信息
|
* @return 用户信息集合信息
|
*/
|
@Override
|
@DataScope( userAlias = "u")
|
public List<SysUser> selectAllocatedList(SysUser user)
|
{
|
return baseMapper.selectAllocatedList(user);
|
}
|
|
/**
|
* 根据条件分页查询未分配用户角色列表
|
*
|
* @param user 用户信息
|
* @return 用户信息集合信息
|
*/
|
@Override
|
@DataScope( userAlias = "u")
|
public List<SysUser> selectUnallocatedList(SysUser user)
|
{
|
return baseMapper.selectUnallocatedList(user);
|
}
|
|
|
@Override
|
public SysUser selectUserByUsername(String username) {
|
String key=redisUtils.generateKey(CacheConstant.SYS_ADMIN_USER_NAME+username);
|
SysUser sysUser =null;
|
if(redisUtils.hasKey(key)){
|
sysUser= (SysUser) redisUtils.get(key);
|
}else {
|
sysUser = baseMapper.getUserByUsername(username);
|
redisUtils.set(key,sysUser,10, TimeUnit.MINUTES);
|
}
|
return sysUser;
|
}
|
|
public void delCacheByUsername(String username){
|
String key=redisUtils.generateKey(CacheConstant.SYS_ADMIN_USER_NAME+username);
|
redisUtils.del(key);
|
}
|
|
@Override
|
public SysUser selectUserByPhone(String phone) {
|
return baseMapper.getUserByPhone(phone);
|
}
|
|
@Override
|
public SysUser selectUserById(Long userId) {
|
return baseMapper.getUserById(userId);
|
}
|
|
@Override
|
public int deleteUserById(Long userId) {
|
SysUser user=checkUserDataScope(userId);
|
delCacheByUsername(user.getUsername());
|
return baseMapper.deleteUserById(userId);
|
}
|
|
@Override
|
public int addUser(SysUser user) {
|
checkRequestData(user);
|
checkUserAllowed(user);
|
user.setCreateBy(SecurityUtils.getUsername());
|
user.setPassword(SecurityUtils.encryptPassword(Base64.decodeStr(user.getPassword())));
|
int row=baseMapper.insert(user);
|
List<SysUserRole> userRoleList = new ArrayList<>();
|
SysUserRole sysUserRole = new SysUserRole();
|
sysUserRole.setUserId(user.getId());
|
sysUserRole.setRoleId(2L);
|
userRoleList.add(sysUserRole);
|
userRoleMapper.batchUserRole(userRoleList);
|
|
if(row<1){
|
throw new ApiException("新增用户失败");
|
}
|
return row;
|
}
|
|
@Override
|
public int updateUser(SysUser user) {
|
checkRequestData(user);
|
checkUserAllowed(user);
|
user.setUpdateBy(SecurityUtils.getUsername());
|
user.setPassword(null);
|
int row=baseMapper.updateById(user);
|
if(row<1){
|
throw new ApiException("更新用户信息失败");
|
}
|
delCacheByUsername(user.getUsername());
|
return row;
|
}
|
|
public void checkRequestData(SysUser user){
|
if(!user.getUserType().equals(UserTypeEnum.SYSTEM_USER.getCode())&&user.getCompanyId()==null){
|
throw new ApiException("所属公司不能为空");
|
}
|
if(!checkUsernameUnique(user)){
|
throw new ApiException("登录账号已存在");
|
}
|
if(StringUtils.isNotBlank(user.getPhone())&&!checkPhoneUnique(user)){
|
throw new ApiException("手机号已存在");
|
}
|
}
|
|
@Override
|
public int updateUserStatus(SysUser user) {
|
SysUser existUser=checkUserDataScope(user.getId());
|
SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
|
su.setUpdateBy(SecurityUtils.getUsername());
|
|
int row= baseMapper.updateById(su);
|
if(row<1){
|
throw new ApiException("更新用户状态失败");
|
}
|
delCacheByUsername(existUser.getUsername());
|
return row;
|
}
|
|
|
@Override
|
public boolean resetUserPwd(SysUser user) {
|
SysUser existUser=checkUserDataScope(user.getId());
|
SysUser su=new SysUser().setId(user.getId()).setPassword(SecurityUtils.encryptPassword(Base64.decodeStr(user.getPassword())));
|
su.setUpdateBy(SecurityUtils.getUsername());
|
delCacheByUsername(existUser.getUsername());
|
return updateById(su);
|
}
|
|
@Override
|
public boolean checkUsernameUnique(SysUser user) {
|
Long userId = user.getId()==null? -1L : user.getId();
|
SysUser info = baseMapper.checkLoginNameUnique(user.getUsername());
|
if (info!=null && info.getId().longValue() != userId.longValue())
|
{
|
return UserConstant.NOT_UNIQUE;
|
}
|
return UserConstant.UNIQUE;
|
}
|
|
@Override
|
public boolean checkPhoneUnique(SysUser user) {
|
Long userId = user.getId()==null ? -1L : user.getId();
|
SysUser info = baseMapper.checkPhoneUnique(user.getPhone());
|
if (info!=null && info.getId().longValue() != userId.longValue())
|
{
|
return UserConstant.NOT_UNIQUE;
|
}
|
return UserConstant.UNIQUE;
|
}
|
|
|
@Override
|
public void checkUserAllowed(SysUser user) {
|
SysUser currentUser=SecurityUtils.getLoginUser().getUser();
|
Integer currentUserType=currentUser.getUserType();
|
Integer userType=user.getUserType();
|
//校验权限,规则:上一级用户可以增加下一级用户类型的用户
|
if(currentUserType.equals(UserTypeEnum.SYSTEM_USER.getCode())){
|
if( !userType.equals(UserTypeEnum.SYSTEM_USER.getCode())&&!userType.equals(UserTypeEnum.OTHER_USER.getCode()) &&!userType.equals(UserTypeEnum.COMPANY_USER.getCode())){
|
throw new ApiException("管理员只能操作管理员、企业级和其他类型的用户");
|
}
|
}else{
|
if(userType.equals(UserTypeEnum.OTHER_USER.getCode())){
|
throw new ApiException("没有权限操作或者更新上级用户类型的用户");
|
}
|
if(currentUserType.equals(UserTypeEnum.OTHER_USER.getCode())){
|
if(userType<=UserTypeEnum.COMPANY_USER.getCode()){
|
throw new ApiException("没有权限操作或者更新上级用户类型的用户");
|
}
|
}else{
|
if(userType<=currentUserType){
|
throw new ApiException("没有权限操作或者更新上级用户类型的用户");
|
}
|
}
|
}
|
}
|
|
@Override
|
public SysUser checkUserDataScope(Long userId) {
|
if(userId==null){
|
throw new ApiException("用户id为空!");
|
}
|
SysUser user = getById(userId);
|
if (ObjectUtil.isNull(user))
|
{
|
throw new ApiException("用户数据不存在!");
|
}
|
checkUserAllowed(user);
|
return user;
|
}
|
|
}
|