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);
|
}
|
}
|