package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.whyc.constant.UserConstant; import com.whyc.dto.Response; import com.whyc.dto.UserClient; import com.whyc.mapper.BaojigroupUsrMapper; import com.whyc.mapper.PageParamMapper; import com.whyc.mapper.PermitGroupUserMapper; import com.whyc.mapper.UserMapper; import com.whyc.pojo.db_app_sys.PageParam; import com.whyc.pojo.db_user.User; import com.whyc.util.ActionUtil; import com.whyc.util.MD5Util; import com.whyc.util.RSAUtil; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.*; import java.util.stream.Collectors; @Service @Slf4j public class UserService { @Resource private UserMapper mapper; @Autowired(required = false) private BaojigroupUsrMapper bjgroupUsrMapper; @Autowired(required = false) private PermitGroupUserMapper pergroupUserMapper; @Resource private PageParamMapper pageParamMapper; //查询所有用户信息 public Response getAllUser(String uname, int pageCurr, int pageSize) { PageHelper.startPage(pageCurr,pageSize); List list=mapper.getAllUser(uname); PageInfo pageInfo=new PageInfo(list); return new Response().setII(1,list!=null,pageInfo,"查询所有用户信息"); } //新添加用户信息 @Transactional public Response addUser(User uinf) { QueryWrapper wrapper=new QueryWrapper(); //判断是否存在普通用户(uid>100),若无,初始为10001 int judgecount=mapper.judgeUname(); if(judgecount==0){ uinf.setId(10001); } String pwd= RSAUtil.encrypt("123456", RSAUtil.getPublicKey()); uinf.setPwd(pwd); wrapper.select("id","name"); wrapper.eq("name",uinf.getName()); User user=mapper.selectOne(wrapper); if(user!=null){ return new Response().setII(1,false,user,"用户名已存在"); } uinf.setCreateTime(new Date()); int bl=mapper.insert(uinf); return new Response().set(1,bl>0,bl>0?"用户添加成功":"用户添加失败"); } //修改密码 public Response changeSnId(String uname,String oldSnId, String newSnId) { if(uname==null||uname.equals("")){ return new Response().set(1,false,"找不到用户"); } //验证老密码是否正确 String snIdRsa=mapper.selectSnId(uname); //解密 String snId=RSAUtil.decrypt(snIdRsa,RSAUtil.getPrivateKey()); String[] decOld=RSAUtil.decryptFrontP(oldSnId,RSAUtil.fontSeparator); String oldId=decOld[0]; String[] newOld=RSAUtil.decryptFrontP(newSnId,RSAUtil.fontSeparator); String newId=newOld[0]; if(oldId.equals(snId)){ UpdateWrapper wrapper=new UpdateWrapper(); wrapper.set("pwd",RSAUtil.encrypt(newId,RSAUtil.getPublicKey())); wrapper.eq("name",uname); int flag=mapper.update(null,wrapper); return new Response().set(1,flag>0,flag>0?"修改成功":"修改失败"); }else { return new Response().set(1,false,"原密码不正确"); } } //校验密码 public Response checkSnId(String uname, String checksnId) { //查询当前用户的密码 String snIdRsa = mapper.selectSnId(uname); String snId = RSAUtil.decrypt(snIdRsa, RSAUtil.getPrivateKey()); String[] oldchecksnId = RSAUtil.decryptFrontP(checksnId, RSAUtil.fontSeparator); String oldId = oldchecksnId[0]; if (oldId.equals(snId)) { return new Response().set(1, true, "密码正确"); } else { return new Response().set(1, false, "密码不正确"); } } //重置密码 public Response resetSnId(int uid ) { UpdateWrapper wrapper=new UpdateWrapper(); wrapper.set("pwd",RSAUtil.encrypt("123456",RSAUtil.getPublicKey())); wrapper.eq("id",uid); int flag=mapper.update(null,wrapper); return new Response().set(1,flag>0,flag>0?"修改成功":"修改失败"); } //删除用户信息 @Transactional public Response delUser(String uname) { //获取用户的uid User User=mapper.getUinfByUname(uname); if(User==null){ return new Response().set(1,false,"用户不存在"); }else { int uid=User.getId(); UpdateWrapper wrapper=new UpdateWrapper(); wrapper.eq("name",uname); int bl=mapper.delete(wrapper); if(bl>0){ //删除权限组下的用户 UpdateWrapper wrapper1=new UpdateWrapper(); wrapper1.eq("uid",uid); pergroupUserMapper.delete(wrapper1); //删除包机组下的用户 UpdateWrapper wrapper2=new UpdateWrapper(); wrapper2.eq("uid",uid); bjgroupUsrMapper.delete(wrapper2); } return new Response().setII(1,bl>0,bl,"删除成功"); } } /* public Response login(String uname, String usnId, Integer platFrom, HttpServletRequest request) { Response response = new Response(); String[] dataArr = RSAUtil.decryptFrontP(usnId, RSAUtil.fontSeparator); //验签md5 if(dataArr[0]==null||dataArr[1]==null){ return response.set(1, false, "密码验签失败"); } if (!dataArr[1].equals(MD5Util.encryptMD5(org.apache.commons.lang3.StringUtils.trim(dataArr[0])))) { return response.set(1, false, "密码验签失败"); } UsernamePasswordToken userToken = new UsernamePasswordToken(uname, dataArr[0]); Subject subject = SecurityUtils.getSubject(); try { subject.login(userToken); } catch (Exception e) { if(e instanceof UnknownAccountException){ return response.set(1,false,"账号不存在"); } return response.set(1,false,"密码错误"); } //Session存储当前用户及权限组列表 User userDB = (User) subject.getPrincipal(); userDB.setPwd(null); //登录成功 ServletContext servletContext = request.getServletContext(); servletContext.setAttribute(uname, request.getSession().getId()); request.getSession().setMaxInactiveInterval(60*30); request.getSession().setAttribute("user", userDB); return response.setII(1,true, userDB,"登录成功"); }*/ public void logout() { Subject subject = SecurityUtils.getSubject(); subject.logout(); } //将用户添加至100~10000管理员 public Response improveRole(int uid) { //判断表是否存在 String tableName = mapper.existTable(); if(tableName==null){ ///创建100~1000的id表,不存在则创建 mapper.createNumber(); //插入默认数据 String sql=" INSERT INTO temp_numbers(unumber) " + " VALUES "; for(int i=101;i<=10000;i++){ sql+="("+i+")"; if(i!=10000){ sql+=","; } } mapper.setUnumber(sql); } String minUid=mapper.getIn10000(); if(minUid==null){ return new Response().set(1,false,"管理员个数超过上限"); } UpdateWrapper wrapper =new UpdateWrapper(); wrapper.set("id",minUid); wrapper.eq("id",uid); int flag= mapper.update(null,wrapper); return new Response().set(1,flag>0,flag>0?"身份变更成功":"身份变更失败"); } //将管理员变成普通用户 public Response dropRole(int uid, HttpServletRequest request) { //查询最大的uid String maxUid=mapper.getMaxUid(); if(maxUid==null){ maxUid="10001"; } //根据用户id查询用户信息 QueryWrapper qWrapper=new QueryWrapper(); qWrapper.eq("id",uid); qWrapper.last("limit 1"); User uinf=mapper.selectOne(qWrapper); //编辑 UpdateWrapper wrapper =new UpdateWrapper(); wrapper.set("id",Integer.valueOf(maxUid)+1); wrapper.eq("id",uid); int flag= mapper.update(null,wrapper); //如果是普通用户自己强退,将用户名对应的sessionId变更 ServletContext servletContext = request.getServletContext(); servletContext.setAttribute(uinf.getName(),"123456"); return new Response().set(1,flag>0,flag>0?"身份变更成功":"身份变更失败"); } public Response getUserNameList() { QueryWrapper query = Wrappers.query(); query.select("name"); List userNameList = mapper.selectList(query).stream().map(User::getName).collect(Collectors.toList()); return new Response().set(1,userNameList); } //登录检测 public Response checkUserWebSocket(HttpSession httpSession){ Response model = new Response(); try { User user = (User) httpSession.getAttribute("user"); if(user!=null){ String sessionId = (String) httpSession.getServletContext().getAttribute(user.getName()); if(httpSession.getId().equals(sessionId)){ model.set(1,user,null); }else{ if(sessionId.equals("123456")){ model.set(1,false,"身份权限变更,请重新登录"); }else{ model.set(1,false,"不同主机登录"); } //用户在其他主机登录,强迫用户在本机的session失效 httpSession.invalidate(); } } else { model.set(1,false,"用户信息失效,请重新登录"); } }catch (Exception e){ model.set(1,false,"登录信息失效,重新登录"); } return model; } //查询所有用户信息(不分页用于下拉) public Response getUinf() { QueryWrapper wrapper=new QueryWrapper(); wrapper.select("id","name"); wrapper.gt("id",100); wrapper.orderByAsc("id"); List list=mapper.selectList(wrapper); return new Response().setII(1,list!=null,list,"查询所有用户信息(不分页用于下拉)"); } //根据uId获取设备信息 public User getUinfByUId(int uId){ QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("id",uId); wrapper.last("limit 1"); User uinf=mapper.selectOne(wrapper); return uinf; } //编辑用户信息 @Transactional public Response updateUinf(User uinf) { UpdateWrapper wrapper=new UpdateWrapper(); if(uinf.getPhoneNumber()!=null){ wrapper.set("phone_number",uinf.getPhoneNumber()); } if(uinf.getSex()!=null){ wrapper.set("sex",uinf.getSex()); } if(uinf.getEmail()!=null){ wrapper.set("email",uinf.getEmail()); } if(uinf.getRole()!=null){ wrapper.set("role",uinf.getRole()); } wrapper.eq("id",uinf.getId()); mapper.update((User) ActionUtil.objeNull,wrapper); return new Response().set(1,true,"编辑用户信息成功"); } //根据uname查询用户 public User getUserByUserName(String uname){ QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.select("id","name","create_time","phone_number"); queryWrapper.eq("name",uname); queryWrapper.last("limit 1"); User User = mapper.selectOne(queryWrapper); return User; } /**锁定账号*/ public void lock(Integer uId) { UpdateWrapper wrapper = Wrappers.update(); wrapper.set("status", UserConstant.ACCOUNT_STATUS_LOCK_FAIL.getValue()).set("lock_time",new Date()).eq("uId",uId); mapper.update((User) ActionUtil.objeNull,wrapper); } /**更新登录时间*/ public void updateLoginTime(Integer uId) { UpdateWrapper wrapper = Wrappers.update(); wrapper.set("last_login_time", new Date()).eq("id",uId); mapper.update((User) ActionUtil.objeNull,wrapper); } // 将所有登陆的用户的信息存到application中 public void setApplication(User user) { ServletContext application = ActionUtil.getApplication(); //查看全局中存储的users的Map的key-value集合 Map map = (Map) application.getAttribute("users"); if (map == ActionUtil.objeNull) { map = new HashMap(); } else { //如果集合中有值,则获取当前用户对应的用户信息,key为用户名username,Value为用户名,存储的时间 UserClient client = map.get(user.getName()); if (client != ActionUtil.objeNull) { //已存在 map.remove(user.getName()); } } Long login_time = new Date().getTime(); ActionUtil.getSession().setAttribute("login_time", login_time); map.put(user.getName(), new UserClient(ActionUtil.getRequest().getRemoteAddr(),user,login_time)); application.setAttribute("users", map); } //验证密码的时效性 public int checkPasswordValidity(User uinf) { int flag=1; //获取系统设置的密码时效(57,15) QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("categoryId",15); wrapper.eq("id",57); wrapper.last("limit 1"); PageParam pageParam=pageParamMapper.selectOne(wrapper); if(pageParam!=null){ int dayDifference=ActionUtil.daysBetween(uinf.getPasswordUpdateTime(),new Date()); if((pageParam.getStatus()>0)&&(dayDifference>pageParam.getStatus())){ flag= -1; } } return flag; } public List searchCS_All2() { return mapper.searchCS_All2(); } }