UserServiceImpl.java 8.2 KB
Newer Older
1 2
package me.zhengjie.modules.system.service.impl;

3
import me.zhengjie.modules.monitor.service.RedisService;
4 5 6
import me.zhengjie.modules.system.domain.User;
import me.zhengjie.exception.EntityExistException;
import me.zhengjie.exception.EntityNotFoundException;
7 8
import me.zhengjie.modules.system.domain.UserAvatar;
import me.zhengjie.modules.system.repository.UserAvatarRepository;
9 10
import me.zhengjie.modules.system.repository.UserRepository;
import me.zhengjie.modules.system.service.UserService;
11
import me.zhengjie.modules.system.service.dto.RoleSmallDTO;
12
import me.zhengjie.modules.system.service.dto.UserDTO;
13
import me.zhengjie.modules.system.service.dto.UserQueryCriteria;
14
import me.zhengjie.modules.system.service.mapper.UserMapper;
15 16
import me.zhengjie.utils.*;
import org.springframework.beans.factory.annotation.Value;
17 18 19
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
20 21
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
郑杰 已提交
22 23 24
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
25
import org.springframework.web.multipart.MultipartFile;
26
import javax.servlet.http.HttpServletResponse;
27
import java.io.File;
28 29 30
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
郑杰 已提交
31 32

/**
33
 * @author Zheng Jie
郑杰 已提交
34 35 36
 * @date 2018-11-23
 */
@Service
37
@CacheConfig(cacheNames = "user")
郑杰 已提交
38 39 40
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {

41
    private final UserRepository userRepository;
郑杰 已提交
42

43
    private final UserMapper userMapper;
郑杰 已提交
44

45
    private final RedisService redisService;
46

47
    private final UserAvatarRepository userAvatarRepository;
48 49 50 51

    @Value("${file.avatar}")
    private String avatar;

52 53 54 55 56 57 58
    public UserServiceImpl(UserRepository userRepository, UserMapper userMapper, RedisService redisService, UserAvatarRepository userAvatarRepository) {
        this.userRepository = userRepository;
        this.userMapper = userMapper;
        this.redisService = redisService;
        this.userAvatarRepository = userAvatarRepository;
    }

59
    @Override
60
    @Cacheable
61 62 63 64 65
    public Object queryAll(UserQueryCriteria criteria, Pageable pageable) {
        Page<User> page = userRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
        return PageUtil.toPage(page.map(userMapper::toDto));
    }

66
    @Override
67
    @Cacheable
68 69 70 71 72
    public List<UserDTO> queryAll(UserQueryCriteria criteria) {
        List<User> users = userRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder));
        return userMapper.toDto(users);
    }

郑杰 已提交
73
    @Override
74
    @Cacheable(key = "#p0")
郑杰 已提交
75
    public UserDTO findById(long id) {
76 77 78
        User user = userRepository.findById(id).orElseGet(User::new);
        ValidationUtil.isNull(user.getId(),"User","id",id);
        return userMapper.toDto(user);
郑杰 已提交
79 80 81
    }

    @Override
82
    @CacheEvict(allEntries = true)
郑杰 已提交
83 84 85 86 87 88 89 90 91 92 93
    @Transactional(rollbackFor = Exception.class)
    public UserDTO create(User resources) {

        if(userRepository.findByUsername(resources.getUsername())!=null){
            throw new EntityExistException(User.class,"username",resources.getUsername());
        }

        if(userRepository.findByEmail(resources.getEmail())!=null){
            throw new EntityExistException(User.class,"email",resources.getEmail());
        }

94 95
        // 默认密码 123456,此密码是加密后的字符
        resources.setPassword("e10adc3949ba59abbe56e057f20f883e");
郑杰 已提交
96 97 98 99
        return userMapper.toDto(userRepository.save(resources));
    }

    @Override
100
    @CacheEvict(allEntries = true)
郑杰 已提交
101 102
    @Transactional(rollbackFor = Exception.class)
    public void update(User resources) {
103 104
        User user = userRepository.findById(resources.getId()).orElseGet(User::new);
        ValidationUtil.isNull(user.getId(),"User","id",resources.getId());
郑杰 已提交
105 106 107 108 109 110 111 112 113 114 115
        User user1 = userRepository.findByUsername(user.getUsername());
        User user2 = userRepository.findByEmail(user.getEmail());

        if(user1 !=null&&!user.getId().equals(user1.getId())){
            throw new EntityExistException(User.class,"username",resources.getUsername());
        }

        if(user2!=null&&!user.getId().equals(user2.getId())){
            throw new EntityExistException(User.class,"email",resources.getEmail());
        }

116 117 118 119 120 121 122 123
        // 如果用户的角色改变了,需要手动清理下缓存
        if (!resources.getRoles().equals(user.getRoles())) {
            String key = "role::loadPermissionByUser:" + user.getUsername();
            redisService.delete(key);
            key = "role::findByUsers_Id:" + user.getId();
            redisService.delete(key);
        }

郑杰 已提交
124 125 126 127
        user.setUsername(resources.getUsername());
        user.setEmail(resources.getEmail());
        user.setEnabled(resources.getEnabled());
        user.setRoles(resources.getRoles());
128 129 130
        user.setDept(resources.getDept());
        user.setJob(resources.getJob());
        user.setPhone(resources.getPhone());
郑杰 已提交
131 132 133 134
        userRepository.save(user);
    }

    @Override
135
    @CacheEvict(allEntries = true)
郑杰 已提交
136 137 138 139 140 141
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        userRepository.deleteById(id);
    }

    @Override
142
    @Cacheable(key = "'loadUserByUsername:'+#p0")
143
    public UserDTO findByName(String userName) {
144
        User user;
郑杰 已提交
145 146 147 148 149 150 151 152
        if(ValidationUtil.isEmail(userName)){
            user = userRepository.findByEmail(userName);
        } else {
            user = userRepository.findByUsername(userName);
        }
        if (user == null) {
            throw new EntityNotFoundException(User.class, "name", userName);
        } else {
153
            return userMapper.toDto(user);
郑杰 已提交
154 155
        }
    }
156 157

    @Override
158
    @CacheEvict(allEntries = true)
159
    @Transactional(rollbackFor = Exception.class)
160 161
    public void updatePass(String username, String pass) {
        userRepository.updatePass(username,pass,new Date());
162 163 164
    }

    @Override
165
    @CacheEvict(allEntries = true)
166
    @Transactional(rollbackFor = Exception.class)
167 168 169 170 171 172 173 174
    public void updateAvatar(MultipartFile multipartFile) {
        User user = userRepository.findByUsername(SecurityUtils.getUsername());
        UserAvatar userAvatar = user.getUserAvatar();
        String oldPath = "";
        if(userAvatar != null){
           oldPath = userAvatar.getPath();
        }
        File file = FileUtil.upload(multipartFile, avatar);
175
        assert file != null;
176 177 178 179 180 181
        userAvatar = userAvatarRepository.save(new UserAvatar(userAvatar,file.getName(), file.getPath(), FileUtil.getSize(multipartFile.getSize())));
        user.setUserAvatar(userAvatar);
        userRepository.save(user);
        if(StringUtils.isNotBlank(oldPath)){
            FileUtil.del(oldPath);
        }
182 183 184
    }

    @Override
185
    @CacheEvict(allEntries = true)
186
    @Transactional(rollbackFor = Exception.class)
187 188
    public void updateEmail(String username, String email) {
        userRepository.updateEmail(username,email);
189
    }
190 191

    @Override
192
    public void download(List<UserDTO> queryAll, HttpServletResponse response) throws IOException {
193 194 195
        List<Map<String, Object>> list = new ArrayList<>();
        for (UserDTO userDTO : queryAll) {
            List roles = userDTO.getRoles().stream().map(RoleSmallDTO::getName).collect(Collectors.toList());
196
            Map<String,Object> map = new LinkedHashMap<>();
197 198 199 200 201 202 203 204 205 206 207 208 209 210
            map.put("用户名", userDTO.getUsername());
            map.put("头像", userDTO.getAvatar());
            map.put("邮箱", userDTO.getEmail());
            map.put("状态", userDTO.getEnabled() ? "启用" : "禁用");
            map.put("手机号码", userDTO.getPhone());
            map.put("角色", roles);
            map.put("部门", userDTO.getDept().getName());
            map.put("岗位", userDTO.getJob().getName());
            map.put("最后修改密码的时间", userDTO.getLastPasswordResetTime());
            map.put("创建日期", userDTO.getCreateTime());
            list.add(map);
        }
        FileUtil.downloadExcel(list, response);
    }
郑杰 已提交
211
}