package com.youlai.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.system.common.constant.SecurityConstants; import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.converter.UserConverter; import com.youlai.system.util.SecurityUtils; import com.youlai.system.mapper.SysUserMapper; import com.youlai.system.model.dto.UserAuthInfo; import com.youlai.system.model.bo.UserBO; import com.youlai.system.model.bo.UserFormBO; import com.youlai.system.model.entity.SysUser; import com.youlai.system.model.form.UserForm; import com.youlai.system.model.query.UserPageQuery; import com.youlai.system.model.vo.UserExportVO; import com.youlai.system.model.vo.UserInfoVO; import com.youlai.system.model.vo.UserPageVO; import com.youlai.system.service.SysMenuService; import com.youlai.system.service.SysRoleService; import com.youlai.system.service.SysUserRoleService; import com.youlai.system.service.SysUserService; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 用户业务实现类 * * @author haoxr * @since 2022/1/14 */ @Service @RequiredArgsConstructor public class SysUserServiceImpl extends ServiceImpl implements SysUserService { private final PasswordEncoder passwordEncoder; private final SysUserRoleService userRoleService; private final UserConverter userConverter; private final SysMenuService menuService; private final SysRoleService roleService; private final RedisTemplate redisTemplate; /** * 获取用户分页列表 * * @param queryParams * @return */ @Override public IPage getUserPage(UserPageQuery queryParams) { // 参数构建 int pageNum = queryParams.getPageNum(); int pageSize = queryParams.getPageSize(); Page page = new Page<>(pageNum, pageSize); // 查询数据 Page userBoPage = this.baseMapper.getUserPage(page, queryParams); // 实体转换 Page userVoPage = userConverter.bo2Vo(userBoPage); return userVoPage; } /** * 获取用户详情 * * @param userId * @return */ @Override public UserForm getUserFormData(Long userId) { UserFormBO userFormBO = this.baseMapper.getUserDetail(userId); // 实体转换po->form UserForm userForm = userConverter.bo2Form(userFormBO); return userForm; } /** * 新增用户 * * @param userForm 用户表单对象 * @return */ @Override public boolean saveUser(UserForm userForm) { String username = userForm.getUsername(); long count = this.count(new LambdaQueryWrapper().eq(SysUser::getUsername, username)); Assert.isTrue(count == 0, "用户名已存在"); // 实体转换 form->entity SysUser entity = userConverter.form2Entity(userForm); // 设置默认加密密码 String defaultEncryptPwd = passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD); entity.setPassword(defaultEncryptPwd); // 新增用户 boolean result = this.save(entity); if (result) { // 保存用户角色 userRoleService.saveUserRoles(entity.getId(), userForm.getRoleIds()); } return result; } /** * 更新用户 * * @param userId 用户ID * @param userForm 用户表单对象 * @return */ @Override @Transactional public boolean updateUser(Long userId, UserForm userForm) { String username = userForm.getUsername(); long count = this.count(new LambdaQueryWrapper() .eq(SysUser::getUsername, username) .ne(SysUser::getId, userId) ); Assert.isTrue(count == 0, "用户名已存在"); // form -> entity SysUser entity = userConverter.form2Entity(userForm); // 修改用户 boolean result = this.updateById(entity); if (result) { // 保存用户角色 userRoleService.saveUserRoles(entity.getId(), userForm.getRoleIds()); } return result; } /** * 删除用户 * * @param idsStr 用户ID,多个以英文逗号(,)分割 * @return */ @Override public boolean deleteUsers(String idsStr) { Assert.isTrue(StrUtil.isNotBlank(idsStr), "删除的用户数据为空"); // 逻辑删除 List ids = Arrays.asList(idsStr.split(",")).stream() .map(idStr -> Long.parseLong(idStr)).collect(Collectors.toList()); boolean result = this.removeByIds(ids); return result; } /** * 修改用户密码 * * @param userId 用户ID * @param password 用户密码 * @return true|false */ @Override public boolean updatePassword(Long userId, String password) { return this.update(new LambdaUpdateWrapper() .eq(SysUser::getId, userId) .set(SysUser::getPassword, passwordEncoder.encode(password)) ); } /** * 根据用户名获取认证信息 * * @param username 用户名 * @return 用户认证信息 {@link UserAuthInfo} */ @Override public UserAuthInfo getUserAuthInfo(String username) { UserAuthInfo userAuthInfo = this.baseMapper.getUserAuthInfo(username); if (userAuthInfo != null) { Set roles = userAuthInfo.getRoles(); if (CollectionUtil.isNotEmpty(roles)) { Set perms = menuService.listRolePerms(roles); userAuthInfo.setPerms(perms); } // 获取最大范围的数据权限 Integer dataScope = roleService.getMaximumDataScope(roles); userAuthInfo.setDataScope(dataScope); } return userAuthInfo; } /** * 获取导出用户列表 * * @param queryParams * @return */ @Override public List listExportUsers(UserPageQuery queryParams) { List list = this.baseMapper.listExportUsers(queryParams); return list; } /** * 获取登录用户信息 * * @return */ @Override public UserInfoVO getCurrentUserInfo() { String username = SecurityUtils.getUser().getUsername(); // 登录用户名 // 获取登录用户基础信息 SysUser user = this.getOne(new LambdaQueryWrapper() .eq(SysUser::getUsername, username) .select( SysUser::getId, SysUser::getUsername, SysUser::getNickname, SysUser::getAvatar ) ); // entity->VO UserInfoVO userInfoVO = userConverter.toUserInfoVo(user); // 用户角色集合 Set roles = SecurityUtils.getRoles(); userInfoVO.setRoles(roles); // 用户权限集合 Set perms = (Set) redisTemplate.opsForValue().get(SecurityConstants.USER_PERMS_CACHE_PREFIX + user.getId()); userInfoVO.setPerms(perms); return userInfoVO; } }