package me.zhengjie.service.impl; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import me.zhengjie.domain.Log; import me.zhengjie.repository.LogRepository; import me.zhengjie.service.LogService; import me.zhengjie.service.dto.LogQueryCriteria; import me.zhengjie.service.mapper.LogErrorMapper; import me.zhengjie.service.mapper.LogSmallMapper; import me.zhengjie.utils.FileUtil; import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.QueryHelp; import me.zhengjie.utils.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * @author Zheng Jie * @date 2018-11-24 */ @Service @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) public class LogServiceImpl implements LogService { private final LogRepository logRepository; private final LogErrorMapper logErrorMapper; private final LogSmallMapper logSmallMapper; public LogServiceImpl(LogRepository logRepository, LogErrorMapper logErrorMapper, LogSmallMapper logSmallMapper) { this.logRepository = logRepository; this.logErrorMapper = logErrorMapper; this.logSmallMapper = logSmallMapper; } @Override public Object queryAll(LogQueryCriteria criteria, Pageable pageable){ Page page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)),pageable); if ("ERROR".equals(criteria.getLogType())) { return PageUtil.toPage(page.map(logErrorMapper::toDto)); } return page; } @Override public List queryAll(LogQueryCriteria criteria) { return logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb))); } @Override public Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable) { Page page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)),pageable); return PageUtil.toPage(page.map(logSmallMapper::toDto)); } @Override @Transactional(rollbackFor = Exception.class) public void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log){ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); me.zhengjie.aop.log.Log aopLog = method.getAnnotation(me.zhengjie.aop.log.Log.class); // 方法路径 String methodName = joinPoint.getTarget().getClass().getName()+"."+signature.getName()+"()"; StringBuilder params = new StringBuilder("{"); //参数值 Object[] argValues = joinPoint.getArgs(); //参数名称 String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames(); if(argValues != null){ for (int i = 0; i < argValues.length; i++) { params.append(" ").append(argNames[i]).append(": ").append(argValues[i]); } } // 描述 if (log != null) { log.setDescription(aopLog.value()); } assert log != null; log.setRequestIp(ip); String LOGINPATH = "login"; if(LOGINPATH.equals(signature.getName())){ try { assert argValues != null; username = new JSONObject(argValues[0]).get("username").toString(); }catch (Exception e){ e.printStackTrace(); } } log.setAddress(StringUtils.getCityInfo(log.getRequestIp())); log.setMethod(methodName); log.setUsername(username); log.setParams(params.toString() + " }"); log.setBrowser(browser); logRepository.save(log); } @Override public Object findByErrDetail(Long id) { byte[] details = logRepository.findExceptionById(id).getExceptionDetail(); return Dict.create().set("exception",new String(ObjectUtil.isNotNull(details) ? details : "".getBytes())); } @Override public void download(List logs, HttpServletResponse response) throws IOException { List> list = new ArrayList<>(); for (Log log : logs) { Map map = new LinkedHashMap<>(); map.put("用户名", log.getUsername()); map.put("IP", log.getRequestIp()); map.put("IP来源", log.getAddress()); map.put("描述", log.getDescription()); map.put("浏览器", log.getBrowser()); map.put("请求耗时/毫秒", log.getTime()); map.put("异常详情", new String(ObjectUtil.isNotNull(log.getExceptionDetail()) ? log.getExceptionDetail() : "".getBytes())); map.put("创建日期", log.getCreateTime()); list.add(map); } FileUtil.downloadExcel(list, response); } }