package com.ruoyi.system.service.impl; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.dto.EquipmentLogDTO; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.EquipmentService; import com.ruoyi.common.core.service.LogininforService; import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.enums.EquipmentLog; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.system.mapper.SysLogininforMapper; import com.ruoyi.system.service.ISysLogininforService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; /** * 系统访问日志情况信息 服务层处理 * * @author Lion Li */ @Slf4j @Service public class SysLogininforServiceImpl extends ServicePlusImpl implements ISysLogininforService, LogininforService { /** * 记录登录信息 * * @param username 用户名 * @param status 状态 * @param message 消息 * @param args 列表 */ @Async @Override public void recordLogininfor(final String username, final String status, final String message, HttpServletRequest request, final Object... args) { final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); final String ip = ServletUtils.getClientIP(request); String address = AddressUtils.getRealAddressByIP(ip); StringBuilder s = new StringBuilder(); s.append(getBlock(ip)); s.append(address); s.append(getBlock(username)); s.append(getBlock(status)); s.append(getBlock(message)); // 打印信息到日志 log.info(s.toString(), args); // 用户类型(DEVICE:设备端,空:pc系统) String userType = request.getHeader("User-Type"); // pc系统 if (StringUtils.isEmpty(userType)) { // 获取客户端操作系统 String os = userAgent.getOs().getName(); // 获取客户端浏览器 String browser = userAgent.getBrowser().getName(); // 封装对象 SysLogininfor logininfor = new SysLogininfor(); logininfor.setUserName(username); logininfor.setIpaddr(ip); logininfor.setLoginLocation(address); logininfor.setBrowser(browser); logininfor.setOs(os); logininfor.setMsg(message); // 日志状态 if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { logininfor.setStatus(Constants.SUCCESS); } else if (Constants.LOGIN_FAIL.equals(status)) { logininfor.setStatus(Constants.FAIL); } // 插入数据 insertLogininfor(logininfor); } // 设备端 if ("DEVICE".equals(userType)) { EquipmentLogDTO dto = new EquipmentLogDTO(); dto.setLoginLocation(address); dto.setUserName(username); dto.setIp(ip); dto.setLoginTime(DateUtils.getNowDate()); dto.setOperation(EquipmentLog.LOGIN.ordinal()); // 日志状态 if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { dto.setStatus(BusinessStatus.SUCCESS.ordinal()); } else if (Constants.LOGIN_FAIL.equals(status)) { dto.setStatus(BusinessStatus.FAIL.ordinal()); } SpringUtils.getBean(EquipmentService.class).recordOper(dto); } } private String getBlock(Object msg) { if (msg == null) { msg = ""; } return "[" + msg.toString() + "]"; } @Override public TableDataInfo selectPageLogininforList(SysLogininfor logininfor) { Map params = logininfor.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); return PageUtils.buildDataInfo(page(PageUtils.buildPage("info_id", "desc"), lqw)); } /** * 新增系统登录日志 * * @param logininfor 访问日志对象 */ @Override public void insertLogininfor(SysLogininfor logininfor) { logininfor.setLoginTime(new Date()); save(logininfor); } /** * 查询系统登录日志集合 * * @param logininfor 访问日志对象 * @return 登录记录集合 */ @Override public List selectLogininforList(SysLogininfor logininfor) { Map params = logininfor.getParams(); return list(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")) .orderByDesc(SysLogininfor::getInfoId)); } /** * 批量删除系统登录日志 * * @param infoIds 需要删除的登录日志ID * @return */ @Override public int deleteLogininforByIds(Long[] infoIds) { return baseMapper.deleteBatchIds(Arrays.asList(infoIds)); } /** * 清空系统登录日志 */ @Override public void cleanLogininfor() { remove(new LambdaQueryWrapper<>()); } }