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.SystemConstants; import com.youlai.system.util.DateUtils; import com.youlai.system.converter.UserConverter; import com.youlai.system.security.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.entity.SysUser; import com.youlai.system.model.form.UserForm; import com.youlai.system.model.query.UserPageQuery; import com.youlai.system.model.dto.UserExportDTO; import com.youlai.system.model.vo.UserInfoVO; import com.youlai.system.model.vo.UserPageVO; import com.youlai.system.security.service.PermissionService; import com.youlai.system.service.*; import lombok.RequiredArgsConstructor; 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 SysRoleMenuService roleMenuService; private final SysRoleService roleService; private final PermissionService permissionService; /** * 获取用户分页列表 * * @param queryParams 查询参数 * @return {@link IPage} 用户分页列表 */ @Override public IPage listPagedUsers(UserPageQuery queryParams) { // 参数构建 int pageNum = queryParams.getPageNum(); int pageSize = queryParams.getPageSize(); Page page = new Page<>(pageNum, pageSize); // 格式化为数据库日期格式,避免日期比较使用格式化函数导致索引失效 DateUtils.toDatabaseFormat(queryParams, "startTime", "endTime"); // 查询数据 Page userPage = this.baseMapper.listPagedUsers(page, queryParams); // 实体转换 return userConverter.toPageVo(userPage); } /** * 获取用户表单数据 * * @param userId 用户ID * @return */ @Override public UserForm getUserFormData(Long userId) { return this.baseMapper.getUserFormData(userId); } /** * 新增用户 * * @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.toEntity(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.toEntity(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.stream(idsStr.split(",")) .map(Long::parseLong) .collect(Collectors.toList()); return this.removeByIds(ids); } /** * 修改用户密码 * * @param userId 用户ID * @param password 用户密码 * @return */ @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 = roleMenuService.getRolePermsByRoleCodes(roles); userAuthInfo.setPerms(perms); } // 获取最大范围的数据权限 Integer dataScope = roleService.getMaximumDataScope(roles); userAuthInfo.setDataScope(dataScope); } return userAuthInfo; } /** * 获取导出用户列表 * * @param queryParams 查询参数 * @return {@link List< UserExportDTO >} 导出用户列表 */ @Override public List listExportUsers(UserPageQuery queryParams) { return this.baseMapper.listExportUsers(queryParams); } /** * 获取登录用户信息 * * @return {@link UserInfoVO} 用户信息 */ @Override public UserInfoVO getCurrentUserInfo() { String username = SecurityUtils.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); // 用户权限集合 if (CollectionUtil.isNotEmpty(roles)) { Set perms = permissionService.getRolePermsFormCache(roles); userInfoVO.setPerms(perms); } return userInfoVO; } }