Java实现友链管理的思路及demo

前言:

之前一直在寻找一款可以自动管理友链的工具,奈何没找到适合halo博客的,于是乎用自己菜鸡的java写了一个管理友链的demo,都有啥功能咧?

以下皆是针对halo博客的,其他的思路类似

  • 自动访问博客中的所有友情链接,查看友链是否可以正常访问。
  • 删除超过n次访问不通的友情链接。
  • 姑且算全自动,同步友链-检测友链-删除友链全自动化,不再是单发的m416了。

环境

  • mysqlhalo博客我是用mysql做数据库的,不是默认的sqlite,最主要是不会用~~。
  • jdk8
  • xxl-job:需要借助大佬的开源定时任务框架(quartz类似)。
  • springboot:凑数的,不说也知道肯定要用~~

代码部分

  • 直接上代码了,其他代码见尾部代码仓库

    /**
     * @author 晓果冻
     * @version 1.0
     * @date 2021/10/24 13:38
     */
    @RefreshScope
    @Component
    @Slf4j
    public class Links {
    
        @Autowired
        private LinksDao linksDao;
    
        @Autowired
        private LinkRecordDao linkRecordDao;
    
        @XxlJob("CheckLinksHandler")
        public ReturnT<String> checkLinks(String param) {
            List<LinksModel> list = linkRecordDao.getAllLinks();
            StringBuilder sb = new StringBuilder();
            list.stream().forEach(e -> {
                try {
                    //检查链接是否正确,暂时不需要验证,因为都是从halo数据库导入的正确数据
                    //CheckLinks.isValidUrl(e.getUrl());
                    CheckLinks.UrlWithTime(e.getUrl(), 1000);
                    e.setIsNormal(1);
                } catch (Exception e1) {
                    e.setIsNormal(0);
                    e.setTotal(e.getTotal() + 1);
                    sb.append("<p style=\"color:red\">网站:" + e.getUrl() + "访问异常</p>\n");
                }
                linkRecordDao.update(e);
            });
            return new ReturnT<String>(ReturnT.SUCCESS_CODE, sb.toString());
        }
    
        /**
         * 每月15号检测累计超过30次未能成功访问的友链并删除
         *
         * @param param
         * @return
         */
        @XxlJob("DelLinksHandler")
        public ReturnT<String> delLinks(String param) {
            List<LinksModel> list = linkRecordDao.getAllLinks();
            StringBuilder sb = new StringBuilder();
            list.stream().forEach(e -> {
                //累计超过30次访问不通,则删除友链
                if (e.getTotal() > 30) {
                    linksDao.delLinksById(e.getId());
                    linkRecordDao.deleteLinkById(e.getId());
                    sb.append("<p style=\"color:red\">友链:" + e.getUrl() + "已被删除</p>\n");
                }
            });
            return new ReturnT<String>(ReturnT.SUCCESS_CODE, sb.toString());
        }
    
        /**
         * 每日同步halo友链信息到link_record表
         *
         * @param param
         * @return
         */
        @XxlJob("InsertLinksHandler")
        public ReturnT<String> insertLinks(String param) {
            List<LinksModel> list = linksDao.getAllLinks();
            Integer[] total = {0};
            list.stream().forEach(e -> {
                try {
                    linkRecordDao.insert(e);
                } catch (Exception ee) {
                    log.error("插入失败");
                    total[0] = total[0] + 1;
                }
            });
            return new ReturnT<String>(ReturnT.SUCCESS_CODE, "<p style=\"color:green\">同步:" + total[0] + "条友链</p>\n");
        }
    }
    
  • xxl-job截图

    image-20211024221153232

  • 简单思路

    1. 得到网站的所有友情链接,halo是存储在links表中。
    2. 利用java提供的方法访问上文得到的友情链接链接。
    3. 是否访问通网站都做一些标记,在规定的时间内统计无法访问的次数,超过给定数目删除该链接。
    4. 程序直接删除links表中对应的记录,但在记录友链的另一张表(代码中的link_record)中做逻辑删除。
    5. 为什么不直接在links表上新增字段?怕破坏halo本身,so--

后续

就是简单的方法调用,感觉没啥可解释的,思路在代码里摸一摸应该是能get了。之后就考虑如何检验对方网站中是否有自己链接的功能

代码仓库地址https://gitee.com/cgd0526/xxl-job-executor

Q.E.D.


一个热爱生活的95后精神小伙