package com.moral.api.service.impl; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.moral.api.entity.Group; import com.moral.api.entity.Menu; import com.moral.api.entity.Organization; import com.moral.api.entity.User; import com.moral.api.entity.UserGroup; import com.moral.api.mapper.MenuMapper; import com.moral.api.mapper.UserGroupMapper; import com.moral.api.mapper.UserMapper; import com.moral.api.pojo.UserBo; import com.moral.api.service.UserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.constant.ResponseCodeEnum; import com.moral.util.AESUtils; import com.moral.util.MD5Utils; import com.moral.util.RegexUtils; import com.moral.util.TokenUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** *

* 用户表 服务实现类 *

* * @author moral * @since 2021-03-09 */ @Service public class UserServiceImpl extends ServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private MenuMapper menuMapper; @Autowired private UserGroupMapper userGroupMapper; @Value("${AES.KEY}") private String AESKey; @Override public UserBo selectUserInfo(Map parameters) { return userMapper.selectUserInfo(parameters); } @Override public Map login(Map parameters) { UserBo userBo = selectUserInfo(parameters); Map result = new HashMap<>(); //校验账户 if (userBo == null) { result.put("code", ResponseCodeEnum.ACCOUNT_NOT_EXIST.getCode()); result.put("msg", ResponseCodeEnum.ACCOUNT_NOT_EXIST.getMsg()); return result; } //校验密码 String password = parameters.get("password").toString(); //密码解密 password = AESUtils.decrypt(password, AESKey); if (!MD5Utils.saltMD5Verify(password, userBo.getPassword())) { result.put("code", ResponseCodeEnum.PASSWORD_INVALID.getCode()); result.put("msg", ResponseCodeEnum.PASSWORD_INVALID.getMsg()); return result; } //校验是否删除 if (Constants.DELETE.equals(userBo.getIsDelete())) { result.put("code", ResponseCodeEnum.ACCOUNT_IS_DELETE.getCode()); result.put("msg", ResponseCodeEnum.ACCOUNT_IS_DELETE.getMsg()); return result; } //校验是否过期 if (userBo.getExpireTime() != null && userBo.getExpireTime().getTime() < System.currentTimeMillis()) { result.put("code", ResponseCodeEnum.ACCOUNT_IS_EXPIRE.getCode()); result.put("msg", ResponseCodeEnum.ACCOUNT_IS_EXPIRE.getMsg()); return result; } //封装用户信息 Map userInfo = new LinkedHashMap<>(); List> groups = new ArrayList<>(); for (Group group : userBo.getGroups()) { HashMap groupMap = new HashMap<>(); groupMap.put("groupId", group.getId()); groupMap.put("groupName", group.getGroupName()); groups.add(groupMap); } Organization organization = userBo.getOrganization(); userInfo.put("userId", userBo.getId()); userInfo.put("account", userBo.getAccount()); userInfo.put("userName", userBo.getUserName()); userInfo.put("expireTime", userBo.getExpireTime()); userInfo.put("isAdmin", userBo.getIsAdmin()); userInfo.put("organizationId", userBo.getOrganizationId()); userInfo.put("organizationName", organization.getName()); userInfo.put("locationLevel", organization.getLocationLevel()); userInfo.put("groups", groups); Map map = new HashMap<>(); map.put("userId",userBo.getId()); userInfo.putAll(getMenus(map)); try { //生成token,并存入redis String token = TokenUtils.getToken(userBo.getId().toString(), userInfo); Map data = new HashMap<>(); data.put("token", token); data.put("user", userInfo); result.put("data", data); } catch (Exception e) { log.error("token生成异常:" + e.getMessage()); result.put("code", ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode()); result.put("msg", ResponseCodeEnum.TOKEN_CREATE_ERROR.getMsg()); } return result; } @Override public Map getMenus(Map parameters) { List allMenus; if (parameters.containsKey("userId")) { allMenus = menuMapper.selectUserMenu(Integer.parseInt(parameters.get("userId").toString())); } else { allMenus = menuMapper.selectOrganizationMenu(Integer.parseInt(parameters.get("orgId").toString())); } Map resultMap = new LinkedHashMap<>(); //第一级菜单 List oneMenu = allMenus.stream() .filter(o -> o.getParentId().equals(0)) .sorted(Comparator.comparing(Menu::getOrder)) .collect(Collectors.toList()); List> newList = new ArrayList<>(); //遍历一级菜单 oneMenu.forEach(o -> { Map menuMap = new LinkedHashMap<>(); menuMap.put("id", o.getId()); menuMap.put("name", o.getName()); menuMap.put("url", o.getUrl()); menuMap.put("icon", o.getIcon()); menuMap.put("menus", getMenusByRecursion(o, allMenus)); newList.add(menuMap); }); resultMap.put("menus", newList); return resultMap; } //获取用户层级菜单递归方法 private List> getMenusByRecursion(Menu menu, List menus) { Menu newMenu = new Menu(); newMenu.setParentId(menu.getId()); //筛选出下一级菜单信息 List nextLevelMenus = menus.stream() .filter(o -> o.getParentId().equals(menu.getId())) .collect(Collectors.toList()); List> list = new ArrayList<>(); if (nextLevelMenus.size() > 0) { //遍历下一级菜单信息,并封装返回参数 nextLevelMenus.forEach(o -> { Map menuMap = new LinkedHashMap<>(); menuMap.put("id", o.getId()); menuMap.put("name", o.getName()); menuMap.put("url", o.getUrl()); menuMap.put("icon", o.getIcon()); //调用递归体 menuMap.put("menus", getMenusByRecursion(o, menus)); list.add(menuMap); }); } return list; } @Override @Transactional public Map addUser(User user, String token) { Map result = new HashMap<>(); Map currentUserInfo = (Map) TokenUtils.getUserInfoByToken(token); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("account", user.getAccount()).eq("is_delete", Constants.NOT_DELETE); //校验账户是否存在 if (user.selectOne(queryWrapper) != null) { result.put("code", ResponseCodeEnum.ACCOUNT_EXIST.getCode()); result.put("msg", ResponseCodeEnum.ACCOUNT_EXIST.getMsg()); return result; } //正则校验账户 if (!RegexUtils.checkAccount(user.getAccount())) { result.put("code", ResponseCodeEnum.ACCOUNT_INVALID.getCode()); result.put("msg", ResponseCodeEnum.ACCOUNT_INVALID.getMsg()); return result; } //正则校验账户 if (user.getEmail() != null && !RegexUtils.checkEmail(user.getEmail())) { result.put("code", ResponseCodeEnum.EMAIL_INVALID.getCode()); result.put("msg", ResponseCodeEnum.EMAIL_INVALID.getMsg()); return result; } //正则校验密码 String password = user.getPassword(); //密码解密 //password = AESUtils.decrypt(password, AESKey); if (!RegexUtils.checkPassword(password)) { result.put("code", ResponseCodeEnum.PASSWORD_INVALID.getCode()); result.put("msg", ResponseCodeEnum.PASSWORD_INVALID.getMsg()); return result; } //正则校验手机号 if (user.getMobile() != null && !RegexUtils.checkMobile(user.getMobile())) { result.put("code", ResponseCodeEnum.MOBILE_INVALID.getCode()); result.put("msg", ResponseCodeEnum.MOBILE_INVALID.getMsg()); return result; } //密码加密 user.setPassword(MD5Utils.saltMD5(password)); user.setOrganizationId((int) currentUserInfo.get("organizationId")); user.setIsAdmin(false); //新增账户的过期时间 Date userExpireTime = user.getExpireTime(); //当前账户的过期时间 Date currentUserExpireTime = (Date) currentUserInfo.get("expireTime"); if (userExpireTime == null || userExpireTime.getTime() > currentUserExpireTime.getTime()) { user.setExpireTime(currentUserExpireTime); } userMapper.insert(user); return result; } @Override @Transactional public void deleteUser(User user) { //逻辑删除user user.setIsDelete(Constants.DELETE); userMapper.updateById(user); //逻辑删除user_group UpdateWrapper deleteWrapper = new UpdateWrapper<>(); deleteWrapper.set("is_delete", Constants.DELETE).eq("user_id", user.getId()); userGroupMapper.update(null, deleteWrapper); } @Override @Transactional public Map updateUser(User user, String token) { Map result = new HashMap<>(); Map currentUserInfo = (Map) TokenUtils.getUserInfoByToken(token); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.ne("id", user.getId()) .eq("account", user.getAccount()) .eq("is_delete", Constants.NOT_DELETE); //校验账户是否存在 if (userMapper.selectOne(queryWrapper) != null) { result.put("code", ResponseCodeEnum.ACCOUNT_EXIST.getCode()); result.put("msg", ResponseCodeEnum.ACCOUNT_EXIST.getMsg()); return result; } //正则校验账户 if (!RegexUtils.checkAccount(user.getAccount())) { result.put("code", ResponseCodeEnum.ACCOUNT_INVALID.getCode()); result.put("msg", ResponseCodeEnum.ACCOUNT_INVALID.getMsg()); return result; } //正则校验账户 if (user.getEmail() != null && !RegexUtils.checkEmail(user.getEmail())) { result.put("code", ResponseCodeEnum.EMAIL_INVALID.getCode()); result.put("msg", ResponseCodeEnum.EMAIL_INVALID.getMsg()); return result; } //正则校验密码 String password = user.getPassword(); //密码解密 //password = AESUtils.decrypt(password, AESKey); if (!RegexUtils.checkPassword(password)) { result.put("code", ResponseCodeEnum.PASSWORD_INVALID.getCode()); result.put("msg", ResponseCodeEnum.PASSWORD_INVALID.getMsg()); return result; } //正则校验手机号 if (user.getMobile() != null && !RegexUtils.checkMobile(user.getMobile())) { result.put("code", ResponseCodeEnum.MOBILE_INVALID.getCode()); result.put("msg", ResponseCodeEnum.MOBILE_INVALID.getMsg()); return result; } //密码加密 user.setPassword(MD5Utils.saltMD5(password)); user.setOrganizationId((int) currentUserInfo.get("organizationId")); user.setIsAdmin(false); //新增账户的过期时间 Date userExpireTime = user.getExpireTime(); //当前账户的过期时间 Date currentUserExpireTime = (Date) currentUserInfo.get("expireTime"); if (userExpireTime == null || userExpireTime.getTime() > currentUserExpireTime.getTime()) { user.setExpireTime(currentUserExpireTime); } userMapper.updateById(user); return result; } @Override public Page selectUsers(Map parameters) { Map currentUserInfo = (Map) TokenUtils.getUserInfoByToken(parameters.get("token").toString()); Object organizationId = currentUserInfo.get("organizationId"); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("organization_id", organizationId) .eq("is_delete", Constants.NOT_DELETE); Object order = parameters.get("order"); Object account = parameters.get("account"); Object userName = parameters.get("userName"); Object mobile = parameters.get("mobile"); Object email = parameters.get("mobile"); Object wechat = parameters.get("wechat"); //模糊查询参数 if (account != null) { queryWrapper.like("account", account); } if (userName != null) { queryWrapper.like("user_name", userName); } if (mobile != null) { queryWrapper.like("mobile", mobile); } if (email != null) { queryWrapper.like("email", email); } if (wechat != null) { queryWrapper.like("wechat", wechat); } //分页参数 if (!parameters.containsKey("page")) { parameters.put("page", 0); } if (!parameters.containsKey("size")) { parameters.put("size", 10); } int page = Integer.parseInt(parameters.get("page").toString()); int size = Integer.parseInt(parameters.get("size").toString()); Page pageData = new Page<>(page, size); //排序参数,默认id升序 if (order == null) { queryWrapper.orderByAsc("id"); } else { queryWrapper.orderByAsc(order.toString(), "id"); } Page userPage = userMapper.selectPage(pageData, queryWrapper); pageData.setRecords(userPage.getRecords()); return userPage; } }