package cn.lili.modules.statistics.aop.aspect; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.context.ThreadContextHolder; import cn.lili.common.utils.IpUtils; import cn.lili.common.utils.SpelUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.goods.entity.vos.GoodsSkuVO; import cn.lili.modules.statistics.aop.PageViewPoint; import cn.lili.modules.statistics.aop.enums.PageViewEnum; import cn.lili.modules.statistics.util.StatisticsSuffix; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; /** * 页面浏览统计拦截 * * @author Chopper * @since 2021-01-14 18:01 */ @Aspect @Configuration @Slf4j public class PageViewInterceptor { @Autowired private Cache cache; @AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.statistics.aop.PageViewPoint)") public void interceptor(JoinPoint point, Object rvt) { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); PageViewPoint pageViewPoint = method.getAnnotation(PageViewPoint.class); PageViewEnum pageViewEnum = pageViewPoint.type(); //store id 为-1 代表平台访问 String storeId; //商品访问 String goodsId = null; switch (pageViewEnum) { case SKU: ResultMessage> skuRvt = (ResultMessage>) rvt; if (skuRvt != null && skuRvt.getResult() != null && skuRvt.getResult().containsKey("data")) { GoodsSkuVO goodsSkuDetail = (GoodsSkuVO) skuRvt.getResult().get("data"); storeId = goodsSkuDetail.getStoreId(); goodsId = goodsSkuDetail.getGoodsId(); break; } case STORE: Map map = null; try { map = spelFormat(point); } catch (Exception e) { return; } storeId = map.get("id"); break; default: storeId = "-1"; } String ip = IpUtils.getIpAddress(ThreadContextHolder.getHttpRequest()); try { //PV 统计48小时过期 留下一定时间予以统计累计数据库 cache.incr(CachePrefix.PV.getPrefix() + StatisticsSuffix.suffix(), 60 * 60 * 48); //平台UV统计 cache.cumulative(CachePrefix.UV.getPrefix() + StatisticsSuffix.suffix(), ip); //PV 统计48小时过期 留下一定时间予以统计累计数据库 cache.incr(CachePrefix.STORE_PV.getPrefix() + StatisticsSuffix.suffix(storeId), 60 * 60 * 48); //店铺UV 统计,则需要对id去重复,所以如下处理 cache.cumulative(CachePrefix.STORE_UV.getPrefix() + StatisticsSuffix.suffix(storeId), ip); } catch (Exception e) { log.error("页面出错", e); } } /** * 获取注解中对方法的描述信息 用于Controller层注解 * * @param joinPoint 切点 * @return 方法描述 * @throws Exception */ private static Map spelFormat(JoinPoint joinPoint) { Map result = new HashMap<>(2); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); PageViewPoint pageViewPoint = signature.getMethod().getAnnotation(PageViewPoint.class); String id = SpelUtil.compileParams(joinPoint, pageViewPoint.id()); result.put("id", id); return result; } }