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; /** *

* 用户表 服务实现类 *

* * @author kzy * @since 2023-10-17 14:26:29 */ @Service public class SysUserServiceImpl extends ServiceImpl implements SysUserService { @Autowired private RedisUtils redisUtils; @Autowired private SysConfigService configService; @Autowired private Validator validator; @Autowired private SysUserRoleMapper userRoleMapper; @Override public CommonPage selectUserList(SysUser user) { SysUser currentUser=SecurityUtils.getLoginUser().getUser(); List users=new ArrayList<>(); if(!currentUser.getUserType().equals(UserTypeEnum.WORKSHOP_USER.getCode())){ if(!currentUser.getUserType().equals(UserTypeEnum.SYSTEM_USER.getCode())){ user.setCompanyId(currentUser.getCompanyId()); Map 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 selectAllocatedList(SysUser user) { return baseMapper.selectAllocatedList(user); } /** * 根据条件分页查询未分配用户角色列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope( userAlias = "u") public List 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 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; } }