Files
youlai-boot/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java
2024-07-28 23:33:08 +08:00

260 lines
7.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<SysUserMapper, SysUser> 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<UserPageVO>} 用户分页列表
*/
@Override
public IPage<UserPageVO> listPagedUsers(UserPageQuery queryParams) {
// 参数构建
int pageNum = queryParams.getPageNum();
int pageSize = queryParams.getPageSize();
Page<UserBO> page = new Page<>(pageNum, pageSize);
// 格式化为数据库日期格式,避免日期比较使用格式化函数导致索引失效
DateUtils.toDatabaseFormat(queryParams, "startTime", "endTime");
// 查询数据
Page<UserBO> 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<SysUser>().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<SysUser>()
.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<Long> 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<SysUser>()
.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<String> roles = userAuthInfo.getRoles();
if (CollectionUtil.isNotEmpty(roles)) {
Set<String> 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<UserExportDTO> 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<SysUser>()
.eq(SysUser::getUsername, username)
.select(
SysUser::getId,
SysUser::getUsername,
SysUser::getNickname,
SysUser::getAvatar
)
);
// entity->VO
UserInfoVO userInfoVO = userConverter.toUserInfoVo(user);
// 用户角色集合
Set<String> roles = SecurityUtils.getRoles();
userInfoVO.setRoles(roles);
// 用户权限集合
if (CollectionUtil.isNotEmpty(roles)) {
Set<String> perms = permissionService.getRolePermsFormCache(roles);
userInfoVO.setPerms(perms);
}
return userInfoVO;
}
}