今天介绍下博客随机访问一篇文章实现,因为文章全部缓存在本地没有使用数据库所以需要有个文件来记录所有的文章url。正好之前博客打开过sitemap,所以这次的整体思路就是读取sitemap.txt文件内容,找到所有的文章url后再随机返回给前端一个url。
实现
后端接口实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public String getRandomArticle(){ List<String> articleUrl; if (redisUtil.exist("randomUrl")){ articleUrl = JSON.parseObject(redisUtil.get("randomUrl"),new TypeReference<List<String>>(){}); }else{ String data = restTemplate.getForObject("https://xiaoliu.life/sitemap.txt",String.class); String[] strings = data.split("\n"); articleUrl = new ArrayList<>(); Arrays.stream(strings).forEach(url->{ if (url.matches(".*/p/.*")){ articleUrl.add(url); } }); redisUtil.set("randomUrl",JSON.toJSONString(articleUrl),3600); } Random random = new Random(); Integer index = random.nextInt(articleUrl.size()); String url = articleUrl.get(index); return url; }
|
主要思路还是通过\n把所有url分隔开然后正则匹配到文章详情页面,最后随机取一条。
由于我经常三天打鱼两天筛网,不一定每天都写新文章,所以加了redis缓存减少访问sitemap.txt文件的次数。
前台接口实现
1 2 3 4
|
randomArticle: () =>{ fetch("https://www.xiaoliu.life/api/article/getRandomArticle").then(data=>data.json()).then(data=>{ window.location.href = data.data; }) }
|
调用后端接口取到文章url后页面跳转到那里。