大家好,我是孙嵓,大家经常翻看公众号文章左下角是不是有个显示了多少人阅读,那这个是怎么实现的呢,本文带你进行揭秘,当然微信研发可能用的不是我这种方式但是大同小异吗,我也是最近把这个功能放到了自己的线上项目,最近在单位太闲了自己给自己找点事干,总不能一直刷知乎吧,卷起来!!!
实现例如微信公众号左下角阅读多少次类似功能。
结合aop,实现after方法,采用redis存储网页浏览次数,每调用一次接对redis值进行+1操作(注意这个接口只有在浏览此网页的时候有调用才行)。
其实还有另一种思路那就是通过拦截器去实现HandlerInterceptor也可以实现浏览次数,拦截一次就加1,大同小异,后续会出一个详细教程,废话少说看代码!!!
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BrowseTimes {
/**
* 浏览类型(这里用的是个枚举)
*/
String type() default BrowseTimesType.COMMON;
}
@Aspect
@Component
@Order(2)
public class BrowseTimeAspect {
@Autowired
RedisService redisService;
@Autowired
TokenService tokenService;
@Autowired
IPositionService positionService;
private static Logger logger = LoggerFactory.getLogger(BrowseTimeAspect.class);
/**
* 切入点
*/
@Pointcut("@annotation(com.fuwai.hr.common.annotation.BrowseTimes)")
public void checkPoint() {
}
/**
* 环绕获取请求参数
*
* @param joinPoint
* @return
*/
@After("checkPoint()")
public void afterMethod(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取被代理的方法
Method method = signature.getMethod();
//获取方法上的注解
BrowseTimes browseTimes = method.getAnnotation(BrowseTimes.class);
//获取方法的参数
Object[] args = joinPoint.getArgs()
//获取注解类型;业务上目前就这一种类型所以就没有分情况讨论
StringBuilder type = new StringBuilder(browseTimes.type());
//拼装redis的key,由于方法参数就这一个我就直接这么写了,这个参数是个id后边代码会写到
type.append(args[0]);
redisService.judgeBrowseTimes(type.toString());
}
}
public synchronized void judgeBrowseTimes(String key) {
//获取key值,值为null插入值
String value = redisCache.getCacheObject(key);
if (StringUtils.isEmpty(value)) {
//不存在更新,存在不进行操作
redisCache.setIfAbsent(key, "1");
return;
}
Integer intValue = Integer.parseInt(value) + 1;
//存在即更新,不存在不进行操作;
redisCache.setIfPresent(key, String.valueOf(intValue));
}
@GetMapping(value = "/test")
@BrowseTimes(type = BrowseTimesType.TEST)
public AjaxResult test(@RequestParam("testId") String testId)
{
return testService.test(testId);
}
if(ObjectUtil.isEmpty(redisCache.getKey(key))){
//查库
String num = sqlService.selectBrowseTime(key);
//设置了七天
redisCache.setIfAbsent(key, num , 7, TimeUnit.DAYS);
}
以上就是本文的全部内容了,能力有限,理性对待
如果感觉还不错的话,欢迎点赞和关注
分享经验,贴近项目,crud永不为奴!!!
欢迎大家关注我的公众号,公众号也会实时发布Java项目相关的文章!!!
2.Java实现短信验证码