From 09a14b76b0bb5252e003fba218be0c02fbccc412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=9B=E5=AE=9A=E8=B0=94=E7=9A=84=E4=BD=99=E9=A1=B9?= Date: Thu, 9 Dec 2021 18:06:31 +0800 Subject: [PATCH] =?UTF-8?q?APP=E6=97=A5=E5=BF=97=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/log/aspectj/VisitLogAspect.java | 56 +-- .../controller/VisitHistoryController.java | 47 --- .../controller/VisitTimeInfoController.java | 91 +++++ .../com/ruoyi/log/domain/SysVisitLog.java | 12 +- .../com/ruoyi/log/domain/SysVisitTimeLog.java | 10 +- .../com/ruoyi/log/domain/VisitTimeInfo.java | 97 +++++ .../log/manager/factory/AsyncLogFactory.java | 36 +- .../ruoyi/log/mapper/SysVisitLogMapper.java | 4 + .../redis/KeyDeleteEventMessageListener.java | 59 --- .../log/redis/RedisKeyDeleteListener.java | 28 -- .../log/redis/RedisKeyExpirationListener.java | 7 +- .../com/ruoyi/log/redis/RedisToMySQL.java | 18 +- .../log/service/ISysVisitLogService.java | 5 + .../service/impl/SysVisitLogServiceImpl.java | 25 +- .../com/ruoyi/log/utils/KeysCollector.java | 31 ++ .../java/com/ruoyi/log/utils/TimeUtils.java | 44 +++ .../mapper/log/SysVisitLogMapper.xml | 16 +- .../mapper/log/SysVisitTimeMapper.xml | 10 +- .../mapper/log/VisitHistoryMapper.xml | 8 +- .../main/java/com/ruoyi/RuoYiApplication.java | 1 - .../controller/system/SysLoginController.java | 18 - .../framework/config/SecurityConfig.java | 1 + ruoyi-ui/src/api/log/applog.js | 53 +++ ruoyi-ui/src/views/log/applog/index.vue | 364 ++++++++++++++++++ 24 files changed, 821 insertions(+), 220 deletions(-) delete mode 100644 mobile-app/src/main/java/com/ruoyi/log/controller/VisitHistoryController.java create mode 100644 mobile-app/src/main/java/com/ruoyi/log/controller/VisitTimeInfoController.java create mode 100644 mobile-app/src/main/java/com/ruoyi/log/domain/VisitTimeInfo.java delete mode 100644 mobile-app/src/main/java/com/ruoyi/log/redis/KeyDeleteEventMessageListener.java delete mode 100644 mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyDeleteListener.java create mode 100644 mobile-app/src/main/java/com/ruoyi/log/utils/KeysCollector.java create mode 100644 mobile-app/src/main/java/com/ruoyi/log/utils/TimeUtils.java create mode 100644 ruoyi-ui/src/api/log/applog.js create mode 100644 ruoyi-ui/src/views/log/applog/index.vue diff --git a/mobile-app/src/main/java/com/ruoyi/log/aspectj/VisitLogAspect.java b/mobile-app/src/main/java/com/ruoyi/log/aspectj/VisitLogAspect.java index 17230ed..c517bc7 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/aspectj/VisitLogAspect.java +++ b/mobile-app/src/main/java/com/ruoyi/log/aspectj/VisitLogAspect.java @@ -1,12 +1,13 @@ package com.ruoyi.log.aspectj; -import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.log.domain.SysVisitLog; +import com.ruoyi.log.domain.SysVisitTimeLog; import com.ruoyi.log.manager.factory.AsyncLogFactory; + +import com.ruoyi.log.utils.KeysCollector; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; @@ -16,6 +17,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Map; + /** * @program: ruoyi * @description: 登录日志切面 @@ -56,36 +59,41 @@ public class VisitLogAspect { protected void handleProfilerLog(final JoinPoint joinPoint, final Exception e, Object o) { try { - // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); - SysVisitLog sysVisitLog = new SysVisitLog(); - //获取URL + //获取请求信息 + String appId = ServletUtils.getRequest().getParameter("appId"); + String token =ServletUtils.getRequest().getParameter("token"); String uri = ServletUtils.getRequest().getRequestURI(); + //封装数据 + SysVisitLog sysVisitLog = new SysVisitLog(); + sysVisitLog.setAppId(Long.valueOf(appId)); sysVisitLog.setVisitUrl(uri); - //判断当前用户是否为空 - if (loginUser != null) { - Long userId = loginUser.getUserId(); - sysVisitLog.setUserId(userId); - sysVisitLog.setTokenKey(loginUser.getToken()); - String key = userId + ":" + uri + ":" + loginUser.getToken(); - //将访问数据缓存到redis中 - Object mapValue = redisService.getCacheMapValue("invokecount", key); - //是否访问过 - if (mapValue != null) { - Long count = Long.valueOf(mapValue.toString()); + sysVisitLog.setTokenKey(token); + //获取当前缓存中对象 + String appRedisKey = "app:" + appId+":"+token; + String visitKey = appId + ":" + uri+":"+token; + Map appMap = redisService.getCacheMap(appRedisKey); + //app用户在缓存中存在,不是第一次访问 + if (appMap.size()>0) { + Object visitValue = appMap.get(visitKey); + //是否访问过,更新缓存 + if (visitValue != null) { + Long count = Long.valueOf(visitValue.toString()); count++; - redisService.setCacheMapValue("invokecount", key, count); - } else { - //第一次访问 - redisService.setCacheMapValue("invokecount", key, 1L); + KeysCollector.addKey(appRedisKey, visitKey, 4, count); } - sysVisitLog.setVisitName(loginUser.getUsername()); + }else { + //url是当前app用户第一次访问 + KeysCollector.addKey(appRedisKey, visitKey, 4, 1L); + + SysVisitTimeLog sysVisitTimeLog = new SysVisitTimeLog(); + sysVisitTimeLog.setAppId(Long.valueOf(appId)); + sysVisitTimeLog.setTokenKey(token); + AsyncManager.me().execute(AsyncLogFactory.recordVisitTime(sysVisitTimeLog)); } - // 设置方法名称 + //设置redis的过期时间 String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); sysVisitLog.setMethod(className + "." + methodName + "()"); - // 保存数据库 AsyncManager.me().execute(AsyncLogFactory.recordOper(sysVisitLog)); } catch (Exception exp) { log.error("异常信息:{}", exp.getMessage()); diff --git a/mobile-app/src/main/java/com/ruoyi/log/controller/VisitHistoryController.java b/mobile-app/src/main/java/com/ruoyi/log/controller/VisitHistoryController.java deleted file mode 100644 index 93ea46e..0000000 --- a/mobile-app/src/main/java/com/ruoyi/log/controller/VisitHistoryController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ruoyi.log.controller; - - -import com.ruoyi.log.domain.SysUserVisitHistory; -import com.ruoyi.log.domain.SysVisitLog; -import com.ruoyi.log.domain.SysVisitTimeLog; -import com.ruoyi.log.service.IVisitHistoryService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.List; - -/** - * @program: ruoyi - * @description: 用户访问历史信息 - * @author: Abner - * @create: 2021-10-19 16:21 - */ -@RestController -@RequestMapping("/log/history") -public class VisitHistoryController { - @Autowired - IVisitHistoryService visitHistoryService; - - @GetMapping("/getvisithistory") - public List getVisitHistory() { - List userVisitHistories = new ArrayList<>(); - //获取访问系统的用户 - List visitTimeLogs = visitHistoryService.selectVisitTimeLog(); - for (SysVisitTimeLog visitTimeLog : visitTimeLogs) { - if (visitTimeLog != null) { - String tokenkey = visitTimeLog.getTokenKey(); - List visitLogs = visitHistoryService.selectVisitLogByTokenkey(tokenkey); - SysUserVisitHistory sysUserVisitHistory = new SysUserVisitHistory(); - sysUserVisitHistory.setSysVisitTimeLog(visitTimeLog); - sysUserVisitHistory.setSysVisitLog(visitLogs); - userVisitHistories.add(sysUserVisitHistory); - } - } - return userVisitHistories; - } - - -} diff --git a/mobile-app/src/main/java/com/ruoyi/log/controller/VisitTimeInfoController.java b/mobile-app/src/main/java/com/ruoyi/log/controller/VisitTimeInfoController.java new file mode 100644 index 0000000..1db0398 --- /dev/null +++ b/mobile-app/src/main/java/com/ruoyi/log/controller/VisitTimeInfoController.java @@ -0,0 +1,91 @@ +package com.ruoyi.log.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.ruoyi.log.domain.SysVisitLog; +import com.ruoyi.log.domain.SysVisitTimeLog; +import com.ruoyi.log.service.ISysVisitLogService; +import com.ruoyi.log.service.IVisitHistoryService; +import com.ruoyi.log.utils.TimeUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.log.domain.VisitTimeInfo; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 日志Controller + * + * @author ruoyi + * @date 2021-12-09 + */ +@RestController +@RequestMapping("/log/applog") +public class VisitTimeInfoController extends BaseController +{ + + + @Autowired + IVisitHistoryService visitHistoryService; + @Autowired + ISysVisitLogService visitLogService; + + /** + * 查询 日志列表 + */ + @PreAuthorize("@ss.hasPermi('log:applog:list')") + @GetMapping("/list") + public TableDataInfo list(VisitTimeInfo visitTimeInfo) + { + List visitTimeLogs = visitHistoryService.selectVisitTimeLog(); + Map temp = new HashMap<>(); + //统计访问时间 + for (SysVisitTimeLog visitTimeLog : visitTimeLogs) { + if (visitTimeLog != null) { + Long appId = visitTimeLog.getAppId(); + Long ltimelong = temp.get(appId); + Long ntimeLong = visitTimeLog.getTimeLong(); + if (ntimeLong != null) { + if (ltimelong == null) { + temp.put(appId, ntimeLong); + } else { + temp.put(appId, ntimeLong + ltimelong); + } + } + } + } + //最后结果 + List visitTimeInfos = new ArrayList<>(); + for (Long id : temp.keySet()) { + VisitTimeInfo timeInfo = new VisitTimeInfo(); + timeInfo.setAppId(id); + timeInfo.setTimeLong(TimeUtils.convertTime(temp.get(id))); + visitTimeInfos.add(timeInfo); + } + + for (VisitTimeInfo timeInfo : visitTimeInfos) { + List sysVisitLogs = visitLogService.selectVisitLogInfoByAppId(timeInfo.getAppId()); + if (sysVisitLogs.size()>0) { + Long sum = 0l; + for (SysVisitLog sysVisitLog : sysVisitLogs) { + Long invokeCount = sysVisitLog.getInvokeCount(); + if (invokeCount != null) { + sum += invokeCount; + } + } + timeInfo.setCount(sum); + timeInfo.setVisitName(sysVisitLogs.get(sysVisitLogs.size()-1).getVisitName()); + } + } + startPage(); + return getDataTable(visitTimeInfos); + } + + +} diff --git a/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitLog.java b/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitLog.java index 4183df0..35b7e8b 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitLog.java +++ b/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitLog.java @@ -15,8 +15,8 @@ public class SysVisitLog { /*日志主键*/ private Long operId; - /*用户ID*/ - private Long userId; + /*appID*/ + private Long appId; /*操作人员*/ private String visitName; /*请求方法*/ @@ -40,12 +40,12 @@ public class SysVisitLog { this.operId = operId; } - public Long getUserId() { - return userId; + public Long getAppId() { + return appId; } - public void setUserId(Long userId) { - this.userId = userId; + public void setAppId(Long appId) { + this.appId = appId; } public String getMethod() { diff --git a/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitTimeLog.java b/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitTimeLog.java index a34464a..e507e12 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitTimeLog.java +++ b/mobile-app/src/main/java/com/ruoyi/log/domain/SysVisitTimeLog.java @@ -16,7 +16,7 @@ public class SysVisitTimeLog { /*日志主键*/ private Long timeId; /*用户ID*/ - private Long userId; + private Long appId; /*操作时间*/ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date startTime; @@ -36,12 +36,12 @@ public class SysVisitTimeLog { this.timeId = timeId; } - public Long getUserId() { - return userId; + public Long getAppId() { + return appId; } - public void setUserId(Long userId) { - this.userId = userId; + public void setAppId(Long appId) { + this.appId = appId; } public Date getStartTime() { diff --git a/mobile-app/src/main/java/com/ruoyi/log/domain/VisitTimeInfo.java b/mobile-app/src/main/java/com/ruoyi/log/domain/VisitTimeInfo.java new file mode 100644 index 0000000..f29fbab --- /dev/null +++ b/mobile-app/src/main/java/com/ruoyi/log/domain/VisitTimeInfo.java @@ -0,0 +1,97 @@ +package com.ruoyi.log.domain; + +import java.util.List; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 日志对象 visit_time_info + * + * @author ruoyi + * @date 2021-12-09 + */ +public class VisitTimeInfo extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long appId; + + /** 学号*/ + @Excel(name = "学号") + private String visitName; + + /** 访问时长 */ + @Excel(name = "访问时长") + private String timeLong; + + /** 调用次数 */ + @Excel(name = "调用次数") + private Long count; + + /** 信息 */ + private List visitLogInfoList; + + + public void setAppId(Long appId) + { + this.appId = appId; + } + + public Long getAppId() + { + return appId; + } + + public String getVisitName() { + return visitName; + } + + public void setVisitName(String visitName) { + this.visitName = visitName; + } + + public String getTimeLong() { + return timeLong; + } + + public void setTimeLong(String timeLong) { + this.timeLong = timeLong; + } + + public Long getCount() { + return count; + } + + public void setCount(Long count) { + this.count = count; + } + + public List getVisitLogInfoList() + { + return visitLogInfoList; + } + + public void setVisitLogInfoList(List visitLogInfoList) + { + this.visitLogInfoList = visitLogInfoList; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("appId", getAppId()) + .append("visitName", getVisitName()) + .append("timeLong", getTimeLong()) + .append("count", getCount()) + .append("visitLogInfoList", getVisitLogInfoList()) + .toString(); + } +} diff --git a/mobile-app/src/main/java/com/ruoyi/log/manager/factory/AsyncLogFactory.java b/mobile-app/src/main/java/com/ruoyi/log/manager/factory/AsyncLogFactory.java index e906681..ffda281 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/manager/factory/AsyncLogFactory.java +++ b/mobile-app/src/main/java/com/ruoyi/log/manager/factory/AsyncLogFactory.java @@ -7,15 +7,20 @@ package com.ruoyi.log.manager.factory; * @create: 2021-10-19 14:17 */ +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.log.domain.SysVisitLog; import com.ruoyi.log.domain.SysVisitTimeLog; +import com.ruoyi.log.redis.RedisToMySQL; import com.ruoyi.log.service.ISysVisitLogService; import com.ruoyi.log.service.ISysVisitTimeService; +import com.ruoyi.log.utils.KeysCollector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import java.util.Date; +import java.util.Map; import java.util.TimerTask; /** @@ -25,7 +30,7 @@ import java.util.TimerTask; */ public class AsyncLogFactory { - private static final Logger log = LoggerFactory.getLogger("sys-user"); + private static final Logger log = LoggerFactory.getLogger("visit_log"); /** * 记录访问api信息 @@ -69,9 +74,17 @@ public class AsyncLogFactory { @Override public void run() { - if (expiredKey.startsWith("login_tokens:")) { + if (expiredKey.startsWith("app:")) { + Map appMap = KeysCollector.getKeysMap().get(expiredKey); + //用户访问数据写入数据库 + redisToMySQL(appMap); + //删除 + if (appMap != null) { + KeysCollector.removeKey(expiredKey); + } + //更新访问时间 String[] keys = expiredKey.split(":"); - SysVisitTimeLog sysVisitTimeLog = SpringUtils.getBean(ISysVisitTimeService.class).getVisitTimeLogbyToken(keys[1]); + SysVisitTimeLog sysVisitTimeLog = SpringUtils.getBean(ISysVisitTimeService.class).getVisitTimeLogbyToken(keys[2]); Date startDate = sysVisitTimeLog.getStartTime(); long starttime = startDate.getTime(); Date date = new Date(); @@ -81,10 +94,25 @@ public class AsyncLogFactory { sysVisitTimeLog.setTimeLong(timelong); SpringUtils.getBean(ISysVisitTimeService.class).updateVisitTimeLog(sysVisitTimeLog); } else { - log.info(System.currentTimeMillis() + "------------" + expiredKey); + log.info("redis过期key值:" + expiredKey); } } }; } + + public static void redisToMySQL( Map keys){ + if (!keys.isEmpty()){ + // 读取key + for (String key : keys.keySet()) { + String[] redisKeys = key.split(":"); + String id = redisKeys[0]; + Long appId= Long.valueOf(id); + String url = redisKeys[1]; + String token_key = redisKeys[2]; + Long invokecount = Long.valueOf(String.valueOf(keys.get(key))); + SpringUtils.getBean(ISysVisitLogService.class).updateInvokeCount(appId, url, token_key, invokecount); + } + } + } } diff --git a/mobile-app/src/main/java/com/ruoyi/log/mapper/SysVisitLogMapper.java b/mobile-app/src/main/java/com/ruoyi/log/mapper/SysVisitLogMapper.java index b87589b..0f1d053 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/mapper/SysVisitLogMapper.java +++ b/mobile-app/src/main/java/com/ruoyi/log/mapper/SysVisitLogMapper.java @@ -3,6 +3,8 @@ package com.ruoyi.log.mapper; import com.ruoyi.log.domain.SysVisitLog; import org.springframework.stereotype.Repository; +import java.util.List; + /** * @program: ruoyi * @description: @@ -23,4 +25,6 @@ public interface SysVisitLogMapper { public void updateInvokeCount(Long userid, String url, String tokenKey, Long invokeCount); public int selectVisitlog(SysVisitLog sysVisitLog); + + List selectVisitLogInfoByAppId(Long appId); } diff --git a/mobile-app/src/main/java/com/ruoyi/log/redis/KeyDeleteEventMessageListener.java b/mobile-app/src/main/java/com/ruoyi/log/redis/KeyDeleteEventMessageListener.java deleted file mode 100644 index 5066688..0000000 --- a/mobile-app/src/main/java/com/ruoyi/log/redis/KeyDeleteEventMessageListener.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ruoyi.log.redis; - -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.ApplicationEventPublisherAware; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.core.RedisKeyExpiredEvent; -import org.springframework.data.redis.listener.KeyspaceEventMessageListener; -import org.springframework.data.redis.listener.PatternTopic; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; - -import org.springframework.data.redis.listener.Topic; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Component; - - -/** - * @program: ruoyi - * @description: - * @author: Abner - * @create: 2021-10-23 23:39 - */ - -public class KeyDeleteEventMessageListener extends KeyspaceEventMessageListener implements ApplicationEventPublisherAware { - private static final Topic KEYEVENT_DELETE_TOPIC = new PatternTopic("__keyevent@*__:del"); - - public KeyDeleteEventMessageListener(RedisMessageListenerContainer listenerContainer) { - super(listenerContainer); - } - @Nullable - private ApplicationEventPublisher publisher; - - - protected void doRegister(RedisMessageListenerContainer listenerContainer) { - listenerContainer.addMessageListener(this, KEYEVENT_DELETE_TOPIC); - } - - - - protected void publishEvent(RedisKeyExpiredEvent event) { - if (this.publisher != null) { - this.publisher.publishEvent(event); - } - - } - - - - @Override - public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { - this.publisher = applicationEventPublisher; - - } - - @Override - protected void doHandleMessage(Message message) { - this.publishEvent(new RedisKeyExpiredEvent(message.getBody())); - - } -} diff --git a/mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyDeleteListener.java b/mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyDeleteListener.java deleted file mode 100644 index a1a0de1..0000000 --- a/mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyDeleteListener.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.ruoyi.log.redis; - -import com.ruoyi.framework.manager.AsyncManager; -import com.ruoyi.log.manager.factory.AsyncLogFactory; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.stereotype.Component; - -/** - * @program: ruoyi - * @description:监听删除的redis key - * @author: Abner - * @create: 2021-10-23 23:44 - */ -@Component -public class RedisKeyDeleteListener extends KeyDeleteEventMessageListener { - - public RedisKeyDeleteListener(RedisMessageListenerContainer listenerContainer) { - super(listenerContainer); - } - - @Override - public void onMessage(Message message, byte[] pattern) { - - String deleteKey = message.toString(); - AsyncManager.me().execute(AsyncLogFactory.recordUserLogout(deleteKey)); - } -} diff --git a/mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyExpirationListener.java b/mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyExpirationListener.java index 9b2358e..6874041 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyExpirationListener.java +++ b/mobile-app/src/main/java/com/ruoyi/log/redis/RedisKeyExpirationListener.java @@ -21,16 +21,19 @@ import org.springframework.stereotype.Component; */ @Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { - private static final Logger log = LoggerFactory.getLogger(RedisKeyExpirationListener.class); @Autowired ISysVisitTimeService sysVisitTimeService; + private static final Logger log = LoggerFactory.getLogger(RedisKeyExpirationListener.class); public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } + + + /** - * 针对redis数据失效事件,进行数据处理 + * redis过期 key回调 * * @param message * @param pattern diff --git a/mobile-app/src/main/java/com/ruoyi/log/redis/RedisToMySQL.java b/mobile-app/src/main/java/com/ruoyi/log/redis/RedisToMySQL.java index cb2edc0..e43f830 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/redis/RedisToMySQL.java +++ b/mobile-app/src/main/java/com/ruoyi/log/redis/RedisToMySQL.java @@ -2,6 +2,7 @@ package com.ruoyi.log.redis; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.log.service.ISysVisitLogService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,25 +33,24 @@ public class RedisToMySQL { * 先读取,将数量统计并落盘 * 后删除键,等待下一个调用 */ - @Scheduled(initialDelay = 5000,fixedDelay = 12*DateUtils.MILLIS_PER_HOUR) - public void redisToMySQL(){ - Map keys = redisService.getCacheMap("invokecount"); +// @Scheduled(initialDelay = 5000,fixedDelay = 4*DateUtils.MILLIS_PER_MINUTE) + public static void redisToMySQL( Map keys){ if (!keys.isEmpty()){ // 读取key for (String key : keys.keySet()) { String[] redisKeys = key.split(":"); String id = redisKeys[0]; - Long userid= Long.valueOf(id); + System.out.println("id:"+id); + Long appId= Long.valueOf(id); String url = redisKeys[1]; + System.out.println("id:"+url); String token_key = redisKeys[2]; Long invokecount = Long.valueOf(String.valueOf(keys.get(key))); - sysVisitLogService.updateInvokeCount(userid, url, token_key, invokecount); + System.out.println(invokecount); + SpringUtils.getBean(ISysVisitLogService.class).updateInvokeCount(appId, url, token_key, invokecount); } - redisService.deleteObject("invokecount"); - } else { - log.info("无人访问系统"); +// redisService.deleteObject("invokecount"); } } - } diff --git a/mobile-app/src/main/java/com/ruoyi/log/service/ISysVisitLogService.java b/mobile-app/src/main/java/com/ruoyi/log/service/ISysVisitLogService.java index cf2edb6..ae09882 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/service/ISysVisitLogService.java +++ b/mobile-app/src/main/java/com/ruoyi/log/service/ISysVisitLogService.java @@ -2,6 +2,8 @@ package com.ruoyi.log.service; import com.ruoyi.log.domain.SysVisitLog; +import java.util.List; + public interface ISysVisitLogService { /** * 新增操作日志 @@ -12,4 +14,7 @@ public interface ISysVisitLogService { public void updateInvokeCount(Long userid, String url, String tokenKey, Long invokeCount); + + List selectVisitLogInfoByAppId(Long appId); + } diff --git a/mobile-app/src/main/java/com/ruoyi/log/service/impl/SysVisitLogServiceImpl.java b/mobile-app/src/main/java/com/ruoyi/log/service/impl/SysVisitLogServiceImpl.java index 133dddf..e7d0c91 100644 --- a/mobile-app/src/main/java/com/ruoyi/log/service/impl/SysVisitLogServiceImpl.java +++ b/mobile-app/src/main/java/com/ruoyi/log/service/impl/SysVisitLogServiceImpl.java @@ -1,11 +1,17 @@ package com.ruoyi.log.service.impl; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.data.entity.DataApp; +import com.ruoyi.data.service.IDataAppService; +import com.ruoyi.eduinfo.service.IAppUserService; import com.ruoyi.log.domain.SysVisitLog; import com.ruoyi.log.mapper.SysVisitLogMapper; import com.ruoyi.log.service.ISysVisitLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** * @program: ruoyi * @description:访问日志 服务层处理 @@ -16,12 +22,22 @@ import org.springframework.stereotype.Service; public class SysVisitLogServiceImpl implements ISysVisitLogService { @Autowired private SysVisitLogMapper visitLogMapper; + @Autowired + private IDataAppService dataAppService; + @Autowired + private IAppUserService userService; @Override public void insertVisitlog(SysVisitLog sysVisitLog) { - if (visitLogMapper.selectVisitlog(sysVisitLog)==0) { - visitLogMapper.insertVisitlog(sysVisitLog); + DataApp dataApp = dataAppService.selectById(sysVisitLog.getAppId()); + if (dataApp != null) { + sysVisitLog.setVisitName(dataApp.getAppName()); + if (visitLogMapper.selectVisitlog(sysVisitLog)==0) { + visitLogMapper.insertVisitlog(sysVisitLog); + } + } + } @Override @@ -30,7 +46,10 @@ public class SysVisitLogServiceImpl implements ISysVisitLogService { } - + @Override + public List selectVisitLogInfoByAppId(Long appId) { + return visitLogMapper.selectVisitLogInfoByAppId(appId); + } } diff --git a/mobile-app/src/main/java/com/ruoyi/log/utils/KeysCollector.java b/mobile-app/src/main/java/com/ruoyi/log/utils/KeysCollector.java new file mode 100644 index 0000000..2d84e89 --- /dev/null +++ b/mobile-app/src/main/java/com/ruoyi/log/utils/KeysCollector.java @@ -0,0 +1,31 @@ +package com.ruoyi.log.utils; + +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.spring.SpringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class KeysCollector { + + private static Map> keysMap = new HashMap<>(); + + public static void addKey(String appRedisKey, String visitKey, final long millisecond, Long count) { + RedisCache redisService = SpringUtils.getBean(RedisCache.class); + redisService.setCacheMapValue(appRedisKey, visitKey, count); + //设置redis的过期时间 + redisService.expire(appRedisKey, 4, TimeUnit.MINUTES); + Map appMap = redisService.getCacheMap(appRedisKey); + keysMap.put(appRedisKey, appMap); + } + + public static void removeKey(String appRedisKey) { + keysMap.remove(appRedisKey); + } + + public static Map> getKeysMap() { + return keysMap; + } + +} diff --git a/mobile-app/src/main/java/com/ruoyi/log/utils/TimeUtils.java b/mobile-app/src/main/java/com/ruoyi/log/utils/TimeUtils.java new file mode 100644 index 0000000..f447ba8 --- /dev/null +++ b/mobile-app/src/main/java/com/ruoyi/log/utils/TimeUtils.java @@ -0,0 +1,44 @@ +package com.ruoyi.log.utils; + +public class TimeUtils { + public static String convertTime(Long time) { + long hour = time/(60*60*1000); + long minute = (time-hour*60*60*1000)/(60*1000); + long second = (time-hour*60*60*1000-minute*60*1000)/1000; + if(second >= 60 ) + { + second = second % 60; + minute+=second/60; + } + if(minute >= 60) + { + minute = minute %60; + hour += minute/60; + } + String sh =""; + String sm =""; + String ss =""; + if(hour <10) + { + sh ="" + String.valueOf(hour); + }else + { + sh = String.valueOf(hour); + } + if(minute <10) + { + sm = "" + String.valueOf(minute); + }else + { + sm = String.valueOf(minute); + } + if(second <10) + { + ss =""+ String.valueOf(second); + }else + { + ss = String.valueOf(second); + } + return hour + "h" + minute + "m" + second + "s"; + } +} diff --git a/mobile-app/src/main/resources/mapper/log/SysVisitLogMapper.xml b/mobile-app/src/main/resources/mapper/log/SysVisitLogMapper.xml index a553072..2c53e5a 100644 --- a/mobile-app/src/main/resources/mapper/log/SysVisitLogMapper.xml +++ b/mobile-app/src/main/resources/mapper/log/SysVisitLogMapper.xml @@ -4,7 +4,7 @@ - + @@ -14,21 +14,27 @@ - insert into visit_log_info(user_id, visit_name, method, visit_url, update_time,token_key) - values (#{userId},#{visitName},#{method},#{visitUrl},sysdate(),#{tokenKey}) + insert into visit_log_info(app_id, visit_name, method, visit_url, update_time,token_key) + values (#{appId},#{visitName},#{method},#{visitUrl},sysdate(),#{tokenKey}) update visit_log_info set invoke_count=#{param4} - where user_id=#{param1} + where app_id=#{param1} and visit_url=#{param2} and token_key=#{param3} + + diff --git a/mobile-app/src/main/resources/mapper/log/SysVisitTimeMapper.xml b/mobile-app/src/main/resources/mapper/log/SysVisitTimeMapper.xml index a56627b..ec35705 100644 --- a/mobile-app/src/main/resources/mapper/log/SysVisitTimeMapper.xml +++ b/mobile-app/src/main/resources/mapper/log/SysVisitTimeMapper.xml @@ -3,15 +3,15 @@ - + - insert into visit_time_info(user_id,start_time,token_key) - values (#{userId},sysdate(),#{tokenKey}) + insert into visit_time_info(app_id,start_time,token_key) + values (#{appId},sysdate(),#{tokenKey}) update visit_time_info @@ -21,10 +21,10 @@ diff --git a/mobile-app/src/main/resources/mapper/log/VisitHistoryMapper.xml b/mobile-app/src/main/resources/mapper/log/VisitHistoryMapper.xml index a4ae4b4..4e733b4 100644 --- a/mobile-app/src/main/resources/mapper/log/VisitHistoryMapper.xml +++ b/mobile-app/src/main/resources/mapper/log/VisitHistoryMapper.xml @@ -3,7 +3,7 @@ - + @@ -11,7 +11,7 @@ - + @@ -20,7 +20,7 @@ @@ -29,7 +29,7 @@ select * from visit_time_info diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java index bd13371..f16922f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -14,7 +14,6 @@ import javax.annotation.Resource; * * @author ruoyi */ -@EnableScheduling @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class RuoYiApplication implements CommandLineRunner { @Resource diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index f6e9b42..9e1950a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -48,7 +48,6 @@ public class SysLoginController // 生成令牌 Map map = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid()); String token = map.get("token"); - recordTimeInfo(map.get("userToken"), map.get("userId")); ajax.put(Constants.TOKEN, token); return ajax; } @@ -85,21 +84,4 @@ public class SysLoginController List menus = menuService.selectMenuTreeByUserId(userId); return AjaxResult.success(menuService.buildMenus(menus)); } - - - /* - * 记录登录信息 - * @param userId - * @param token - */ - public void recordTimeInfo(String token,String id) - { - - //封装对象 - Long userId = Long.valueOf(id); - SysVisitTimeLog sysVisitTimeLog = new SysVisitTimeLog(); - sysVisitTimeLog.setUserId(userId); - sysVisitTimeLog.setTokenKey(token); - AsyncManager.me().execute(AsyncLogFactory.recordVisitTime(sysVisitTimeLog)); - } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 7f0101e..01b3d73 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -124,6 +124,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/classes/api/**").anonymous() .antMatchers("/app/user/api/**").anonymous() .antMatchers("/file/api/**").anonymous() + .antMatchers("/log/history/**").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() diff --git a/ruoyi-ui/src/api/log/applog.js b/ruoyi-ui/src/api/log/applog.js new file mode 100644 index 0000000..20cc8a3 --- /dev/null +++ b/ruoyi-ui/src/api/log/applog.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询 日志列表 +export function listApplog(query) { + return request({ + url: '/log/applog/list', + method: 'get', + params: query + }) +} + +// 查询 日志详细 +export function getApplog(timeId) { + return request({ + url: '/log/applog/' + timeId, + method: 'get' + }) +} + +// 新增 日志 +export function addApplog(data) { + return request({ + url: '/log/applog', + method: 'post', + data: data + }) +} + +// 修改 日志 +export function updateApplog(data) { + return request({ + url: '/log/applog', + method: 'put', + data: data + }) +} + +// 删除 日志 +export function delApplog(timeId) { + return request({ + url: '/log/applog/' + timeId, + method: 'delete' + }) +} + +// 导出 日志 +export function exportApplog(query) { + return request({ + url: '/log/applog/export', + method: 'get', + params: query + }) +} diff --git a/ruoyi-ui/src/views/log/applog/index.vue b/ruoyi-ui/src/views/log/applog/index.vue new file mode 100644 index 0000000..52eccb3 --- /dev/null +++ b/ruoyi-ui/src/views/log/applog/index.vue @@ -0,0 +1,364 @@ + + + -- Gitee