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 17230ed9e5a36083e7b291067850d41f47435185..c517bc7690e279218d350c8da79c080419066335 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 93ea46e7f4048c7cc1a1806186b185882eda1b7e..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..1db0398b6829ecaee595ffcd56be0c1637a8b3dc --- /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 4183df066513951f13c30f086ba0227686fcf2be..35b7e8bf1f1a3854652a1556feeaa084dc821136 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 a34464a30e67cadd6f48203403c79c3b34cc9c1b..e507e124ba6b6143238785ef1f3162481ba7cf51 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 0000000000000000000000000000000000000000..f29fbab05d707d9949a86c3c0729741e2d94a55a --- /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 e906681a94dadb8d2eb3dcaa401e6f30cb8be473..ffda2814089af546e4a417873e595a5aefbc0432 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 b87589bdac3f50a1fb0e7b5228913a3a78db7704..0f1d05374b16eb3ba26359c2fa3e9c2204c9b375 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 5066688b4fbc3e33c2c77c36db7c9f2b28a56992..0000000000000000000000000000000000000000 --- 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 a1a0de104db130f519e5bc5914ca138907d53638..0000000000000000000000000000000000000000 --- 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 9b2358ea6c430e7443f4ecac95adcd1435e5f52f..6874041ae690692f40ff876574c0e9d2da3831de 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 cb2edc06f8dd8f2a59428686f19596dace59ae57..e43f83026641e9e90360ffdf4311473887711527 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 cf2edb6fc8eb8bcee88f0e5d9c82cb77d0c93626..ae098826818c6c72596e96d8a1b92423f84606fd 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 133dddfc78419c6511451bdebafbdadd2fe672c9..e7d0c911f378c672640896bcb90413e8b6fab811 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 0000000000000000000000000000000000000000..2d84e89d91192d36868922180683b3c4e36bf753 --- /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 0000000000000000000000000000000000000000..f447ba8c98839cd3f907e30a8e7e05409a1c93ad --- /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 a553072db107585a7dfc40f18dd5cf23b78781c7..2c53e5ae8aed3a101d2110f5657f8b11d6dfa36a 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 a56627b62c8d60bc6fabed4ea62319ce05466e24..ec357055ed054c3648981b33dbd6d49c23613aee 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 a4ae4b489a42e14b234f747ffa511ebeb8ba2694..4e733b4ec1f88bab824684d069334645dad2fb9c 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 bd13371a86be09a65f15d2754971f4c0de78396d..f16922f1fed333f0d926d1f41a9f2b9cefbcc95e 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 f6e9b42b8a650b358a1bfaa4a0268db7e6f6a816..9e1950aadab55c4a1d867c816c5f2bf29dca3cac 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 7f0101eca58586a69497f254b9d31d57c2af78eb..01b3d73075afcfaaa240fefcc7eb4bd2dfd9ab48 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 0000000000000000000000000000000000000000..20cc8a301ab320ba648fcf21d9be7dd3fd51900a --- /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 0000000000000000000000000000000000000000..52eccb380ada242cf24510b2f0176391f9c1af57 --- /dev/null +++ b/ruoyi-ui/src/views/log/applog/index.vue @@ -0,0 +1,364 @@ + + +