package cc.mrbird.febs.system.service.impl; import cc.mrbird.febs.common.authentication.ShiroRealm; import cc.mrbird.febs.common.entity.FebsConstant; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.FebsUtil; import cc.mrbird.febs.common.utils.Md5Util; import cc.mrbird.febs.common.utils.SortUtil; import cc.mrbird.febs.system.entity.User; import cc.mrbird.febs.system.entity.UserDataPermission; import cc.mrbird.febs.system.entity.UserRole; import cc.mrbird.febs.system.mapper.UserMapper; import cc.mrbird.febs.system.service.IUserDataPermissionService; import cc.mrbird.febs.system.service.IUserRoleService; import cc.mrbird.febs.system.service.IUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; /** * @author MrBird */ @Service @RequiredArgsConstructor @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class UserServiceImpl extends ServiceImpl implements IUserService { private final IUserRoleService userRoleService; private final IUserDataPermissionService userDataPermissionService; private final ShiroRealm shiroRealm; @Override public User findByName(String username) { return this.baseMapper.findByName(username); } @Override public IPage findUserDetailList(User user, QueryRequest request) { if (StringUtils.isNotBlank(user.getCreateTimeFrom()) && StringUtils.equals(user.getCreateTimeFrom(), user.getCreateTimeTo())) { user.setCreateTimeFrom(user.getCreateTimeFrom() + " 00:00:00"); user.setCreateTimeTo(user.getCreateTimeTo() + " 23:59:59"); } Page page = new Page<>(request.getPageNum(), request.getPageSize()); page.setSearchCount(false); page.setTotal(baseMapper.countUserDetail(user)); SortUtil.handlePageSort(request, page, "userId", FebsConstant.ORDER_ASC, false); return this.baseMapper.findUserDetailPage(page, user); } @Override public User findUserDetailList(String username) { User param = new User(); param.setUsername(username); List users = this.baseMapper.findUserDetail(param); return CollectionUtils.isNotEmpty(users) ? users.get(0) : null; } @Override @Transactional(rollbackFor = Exception.class) public void updateLoginTime(String username) { User user = new User(); user.setLastLoginTime(new Date()); this.baseMapper.update(user, new LambdaQueryWrapper().eq(User::getUsername, username)); } @Override @Transactional(rollbackFor = Exception.class) public void createUser(User user) { user.setCreateTime(new Date()); user.setStatus(User.STATUS_VALID); user.setAvatar(User.DEFAULT_AVATAR); user.setTheme(User.THEME_BLACK); user.setIsTab(User.TAB_OPEN); user.setPassword(Md5Util.encrypt(user.getUsername(), User.DEFAULT_PASSWORD)); save(user); // 保存用户角色 String[] roles = user.getRoleId().split(StringPool.COMMA); setUserRoles(user, roles); // 保存用户数据权限关联关系 String[] deptIds = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getDeptIds(), StringPool.COMMA); if (ArrayUtils.isNotEmpty(deptIds)) { setUserDataPermissions(user, deptIds); } } @Override @Transactional(rollbackFor = Exception.class) public void deleteUsers(String[] userIds) { List list = Arrays.asList(userIds); // 删除用户 this.removeByIds(list); // 删除关联角色 this.userRoleService.deleteUserRolesByUserId(list); // 删除关联数据权限 this.userDataPermissionService.deleteByUserIds(userIds); } @Override @Transactional(rollbackFor = Exception.class) public void updateUser(User user) { String username = user.getUsername(); // 更新用户 user.setPassword(null); user.setUsername(null); user.setModifyTime(new Date()); updateById(user); String[] userId = {String.valueOf(user.getUserId())}; this.userRoleService.deleteUserRolesByUserId(Arrays.asList(userId)); String[] roles = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getRoleId(), StringPool.COMMA); setUserRoles(user, roles); userDataPermissionService.deleteByUserIds(userId); String[] deptIds = StringUtils.splitByWholeSeparatorPreserveAllTokens(user.getDeptIds(), StringPool.COMMA); if (ArrayUtils.isNotEmpty(deptIds)) { setUserDataPermissions(user, deptIds); } User currentUser = FebsUtil.getCurrentUser(); if (StringUtils.equalsIgnoreCase(currentUser.getUsername(), username)) { shiroRealm.clearCache(); } } @Override @Transactional(rollbackFor = Exception.class) public void resetPassword(String[] usernames) { Arrays.stream(usernames).forEach(username -> { User user = new User(); user.setPassword(Md5Util.encrypt(username, User.DEFAULT_PASSWORD)); this.baseMapper.update(user, new LambdaQueryWrapper().eq(User::getUsername, username)); }); } @Override @Transactional(rollbackFor = Exception.class) public void regist(String username, String password) { User user = new User(); user.setPassword(Md5Util.encrypt(username, password)); user.setUsername(username); user.setCreateTime(new Date()); user.setStatus(User.STATUS_VALID); user.setSex(User.SEX_UNKNOW); user.setAvatar(User.DEFAULT_AVATAR); user.setTheme(User.THEME_BLACK); user.setIsTab(User.TAB_OPEN); user.setDescription("注册用户"); this.save(user); UserRole ur = new UserRole(); ur.setUserId(user.getUserId()); ur.setRoleId(FebsConstant.REGISTER_ROLE_ID); this.userRoleService.save(ur); } @Override @Transactional(rollbackFor = Exception.class) public void updatePassword(String username, String password) { User user = new User(); user.setPassword(Md5Util.encrypt(username, password)); user.setModifyTime(new Date()); this.baseMapper.update(user, new LambdaQueryWrapper().eq(User::getUsername, username)); } @Override @Transactional(rollbackFor = Exception.class) public void updateAvatar(String username, String avatar) { User user = new User(); user.setAvatar(avatar); user.setModifyTime(new Date()); this.baseMapper.update(user, new LambdaQueryWrapper().eq(User::getUsername, username)); } @Override @Transactional(rollbackFor = Exception.class) public void updateTheme(String username, String theme, String isTab) { User user = new User(); user.setTheme(theme); user.setIsTab(isTab); user.setModifyTime(new Date()); this.baseMapper.update(user, new LambdaQueryWrapper().eq(User::getUsername, username)); } @Override @Transactional(rollbackFor = Exception.class) public void updateProfile(User user) { user.setUsername(null); user.setRoleId(null); user.setPassword(null); if (isCurrentUser(user.getId())) { updateById(user); } else { throw new FebsException("您无权修改别人的账号信息!"); } } private void setUserRoles(User user, String[] roles) { List userRoles = new ArrayList<>(); Arrays.stream(roles).forEach(roleId -> { UserRole userRole = new UserRole(); userRole.setUserId(user.getUserId()); userRole.setRoleId(Long.valueOf(roleId)); userRoles.add(userRole); }); userRoleService.saveBatch(userRoles); } private void setUserDataPermissions(User user, String[] deptIds) { List userDataPermissions = new ArrayList<>(); Arrays.stream(deptIds).forEach(deptId -> { UserDataPermission permission = new UserDataPermission(); permission.setDeptId(Long.valueOf(deptId)); permission.setUserId(user.getUserId()); userDataPermissions.add(permission); }); userDataPermissionService.saveBatch(userDataPermissions); } private boolean isCurrentUser(Long id) { User currentUser = FebsUtil.getCurrentUser(); return currentUser.getUserId().equals(id); } }