Crunchy
2025-06-14 b2f31607cbe26d721cd7514b619162b3e355b1aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
package com.wms_admin.sys.service.impl;
 
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.wms_admin.clients.UserLoginUtils;
import com.wms_admin.shiro.realm.ShiroRealm;
import com.wms_admin.sys.entity.User;
import com.wms_admin.sys.mapper.UserMapper;
import com.wms_admin.sys.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wms_admin.utils.*;
import io.swagger.models.auth.In;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.FileSystemUtils;
import org.springframework.util.ObjectUtils;
 
import javax.annotation.Resource;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
 
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 江苏鵷雏网络科技有限公司
 * @since 2023-05-24
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
 
    @Resource
    private UserMapper mapper;
 
    @Value("${file.path}")
    private String FILE_PATH;
 
    @Value("${avatar}")
    private String avatar;
 
    @Override
    public User accordingUsernameSelectAll(String account) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getAccount,account);
        return mapper.selectOne(wrapper);
    }
 
    @Override
    public Boolean AddUser(User user) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getAccount, user.getAccount());
        User userIsNull = mapper.selectOne(wrapper);
        if (!ObjectUtils.isEmpty(userIsNull)){ // 如果查询数据返回false
            return false;
        } else { // 没有查询到则进行添加操作
            //1.获取随机盐
            String salt = MyUtils.getSalt(10);
            user.setSalt(salt);
            //3.明文密码进行md5 + salt + hash散列
            Md5Hash MD5 = new Md5Hash(user.getPassword(),salt,1024);
            user.setPassword(MD5.toString());
            user.setAvatar(avatar);
            mapper.insert(user);
            return true;
        }
    }
 
    @Override
    public Result<Map<String, Object>> login(String account, String password) {
        boolean loginSuccess = false;
        Subject subject = SecurityUtils.getSubject();
        if (!subject.isAuthenticated()) {
            UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(account, password);
//            usernamePasswordToken.setRememberMe(true);
            try {
                subject.login(usernamePasswordToken);
                loginSuccess = true;
            } catch (UnknownAccountException e) {
                return Result.fail(202, "账户不存在");
            } catch (LockedAccountException e) {
                return Result.fail(202, "账户被锁定");
            } catch (IncorrectCredentialsException e) {
                return Result.fail(202, "密码不匹配");
            }
        }
        if (loginSuccess) {
            // 获取shiroRealm中的数据
            ShiroRealm bean = SpringUtil.getBean(ShiroRealm.class);
            User user = accordingUsernameSelectAll(account);
            user.setPassword(null);
            user.setSalt(null);
            UserLoginUtils bean1 = SpringUtil.getBean(UserLoginUtils.class);
            return bean1.LoginExamine(user);
        }else {
            return Result.fail("登录失败");
        }
    }
 
    @Override
    public Map<String, Object> getUserInfo(String token) {
        //根据token获取用户信息
        Object obj = RedisUtil.get(token);
        if (obj != null){
            User loginUser = JSON.parseObject(JSON.toJSONString(obj),User.class);
//            Map<String, Object> map = loginUser.getMap();
//            Object residualTime = map.get("residualTime");
//            int i = Integer.parseInt(residualTime.toString());
//            String remind = null;
//            if (i <= 30) {
//                remind = "您所使用的系统即将过期!请联系管理员!";
//            }
            Map<String, Object> data = new HashMap<>();
            data.put("name",loginUser.getUsername());
            data.put("avatar",loginUser.getAvatar());
            data.put("authority", loginUser.getAuthority());
            data.put("account", loginUser.getAccount());
//            data.put("remind", remind);
            return data;
        }
        return null;
    }
 
    @Override
    public Result<?> storeFile(String token, byte[] bytes, String originalFilename) {
        // 根据token获取Redis数据
        User user = (User)RedisUtil.get(token);
        FileSaveUtils bean = SpringUtil.getBean(FileSaveUtils.class);
        // 保存文件并返回文件名
        String fileName = bean.StoreFile(bytes, originalFilename);
        // 更新数据库头像路径
        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(User::getAccount, user.getAccount());
        wrapper.set(User::getAvatar, "/" + fileName);
        int update = mapper.update(null, wrapper);
        if (update == 1){
            // 删除原来图片在set
            if (!user.getAvatar().equals(avatar)){
                FileSystemUtils.deleteRecursively(new File(FILE_PATH + user.getAvatar()));
            }
            user.setAvatar("/" + fileName);
            RedisUtil.set(token, user, 0);
            return Result.success("更新头像成功");
        } else {
            // 删除原来图片在set
            FileSystemUtils.deleteRecursively(new File(FILE_PATH + "/"+ fileName));
            return Result.fail("更新头像失败");
        }
    }
 
    @Override
    public void logout(String token) {
        RedisUtil.del(token);
    }
 
    @Override
    public List<User> getUserList() {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(User::getId,User::getUsername,User::getAvatar, User::getAuthority, User::getAccount);
        return mapper.selectList(wrapper);
    }
 
    @Override
    public Integer UpdatePassword(String token, String oldPassword, String newPassword) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        User redisUser = (User)RedisUtil.get(token);
        Integer id = redisUser.getId();
        wrapper.eq(User::getId, id);
        wrapper.select(User::getPassword, User::getSalt);
        User user = mapper.selectOne(wrapper);
        if (!ObjectUtils.isEmpty(user)){ // 非空
            String mysqlPassword = user.getPassword();
            String salt = user.getSalt();
            String oldMD5 = new Md5Hash(oldPassword,salt,1024).toString();
            if (Objects.equals(oldMD5, mysqlPassword)){
                String newMD5 = new Md5Hash(newPassword,salt,1024).toString();
                if (Objects.equals(mysqlPassword, newMD5)){
                    return 2;
                }
                LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.eq(User::getId, id);
                updateWrapper.set(User::getPassword, newMD5);
                mapper.update(null, updateWrapper);
                RedisUtil.del(token);
                return 1;
            }
        }
        return 0;
    }
 
    @Override
    public Integer DeleteUserId(String id) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getId, id);
        return mapper.delete(wrapper);
    }
 
    @Override
    public Integer UpdateUser(String token, String username, String account) {
        User user = (User)RedisUtil.get(token);
        Integer id = user.getId();
        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(User::getId, id);
        wrapper.set(User::getUsername, username);
        wrapper.set(User::getAccount, account);
        user.setUsername(username);
        user.setAccount(account);
        RedisUtil.set(token, user, 0);
        return mapper.update(null, wrapper);
    }
}