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; /** *

* 服务实现类 *

* * @author 江苏鵷雏网络科技有限公司 * @since 2023-05-24 */ @Service public class UserServiceImpl extends ServiceImpl 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 wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getAccount,account); return mapper.selectOne(wrapper); } @Override public Boolean AddUser(User user) { LambdaQueryWrapper 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> 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 getUserInfo(String token) { //根据token获取用户信息 Object obj = RedisUtil.get(token); if (obj != null){ User loginUser = JSON.parseObject(JSON.toJSONString(obj),User.class); // Map map = loginUser.getMap(); // Object residualTime = map.get("residualTime"); // int i = Integer.parseInt(residualTime.toString()); // String remind = null; // if (i <= 30) { // remind = "您所使用的系统即将过期!请联系管理员!"; // } Map 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 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 getUserList() { LambdaQueryWrapper 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 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 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 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 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); } }