SpringBoot+Vue在线小说系统

news2024/12/28 12:14:14

简介:本项目采用了基本的springboot+vue设计的在线小说系统。详情请看截图。经测试,本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。

特别说明:本系统设计网络爬虫,遵循爬虫规则,此项目用于学习,参考,借鉴等用途,如有侵权,请联系站长删除此部分功能。

项目描述

项目名称SpringBoot+Vue在线小说系统
源码作者LHL
项目类型Java EE项目 (前后分离)
当前版本1.0
系统角色多角色
项目架构B/S架构
主要技术Java、servlet、springboot、mysql、maven、vue+elementui
运行环境win10/win7/JDK1.8/
开发工具MyEclipse/IDEA ,默认IDEA
数据库MySQL5.5/5.7/8.0+
数据库表4+
构建工具maven
是否有注释
是否有演示视频
是否有文档论文相关

主要功能如下

  1. 管理员维护系统信息
  2. 客户端小说首页,分类,检索,章节,小说详情,上一章下一章目录等功能

博小说首页

Description

小说列表

Description

章节列表

Description

章节详情

Description

后台登录

后台主页

Description

管理小说列表

Description

小说章节列表

Description

章节编辑

Description

小说同步

Description

小说同步

     * 小说同步
     * @param obj
     * @return
     */
    @PostMapping("/sync")
    public ApiResp syncOtherBook(@RequestBody JSONObject obj){
        String seed = obj.getString("seed");
        if (!seed.startsWith("https://www.netprint101.com")){
            return ApiResp.resp(false, "请输入笔趣阁小说外链", null);
        }
        Book b=new Book();
        b.setCategoryId(9);
        bookService.save(b);

        System.out.println("================小说保存=============");
        new Thread(() -> {
            System.out.println("===============小说异步任务执行===============");
            JSONObject object = Crawler4jController.crawlerGetData(seed, b.getId(),b.getCategoryId());
            Book book = object.getObject("book", Book.class);
            List<Chapter> list = object.getObject("infos", List.class);
            bookService.updateById(book);
            chapterService.saveBatch(list);
            System.out.println(book);
            System.out.println("===============小说同步完成==============");
            System.out.println("\n\n\n\n");
        }).start();
        return ApiResp.resp(true, "同步任务异步执行中,稍后列表查看", null);
    }

爬取解析

    /**
     * 当一个页面被提取并准备好被你的程序处理时,这个函数被调用。
     */
    @Override
    public void visit(Page page) {
        String url = page.getWebURL().getURL();// 获取url
        System.out.println("URL: " + url);

        if (page.getParseData() instanceof HtmlParseData) {// 判断是否是html数据
            HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); 强制类型转换,获取html数据对象
            String text = htmlParseData.getText();//获取页面纯文本(无html标签)
            String html = htmlParseData.getHtml();//获取页面Html
            Set<WebURL> links = htmlParseData.getOutgoingUrls();// 获取页面输出链接


            System.out.println("纯文本长度: " + text.length());
            System.out.println("html长度: " + html.length());
            System.out.println("链接个数 " + links.size());
            String title = htmlParseData.getTitle();
            System.out.println(title);

            WebURL webURL = page.getWebURL();

            Document document = Jsoup.parse(html, String.valueOf(Parser.xmlParser()));
            Elements read_txt = document.getElementsByClass("read_txt");


            //进入详情页面进行处理
           if (read_txt.size()>0){
               String anchor=webURL.getAnchor();
               String content=read_txt.get(0).html();//文章内容

               int i = url.lastIndexOf('/');
               int i1 = url.lastIndexOf(".");
               String s = url.substring(i+1, i1);
               Chapter info=new Chapter();
               info.setContent(content);
               info.setTitle(anchor);
               info.setSort(Integer.valueOf(s));


               cmp.put(webURL.getURL(),info);




           }else {
               //书籍本身获取

               Elements elementsByTag = document.getElementsByTag("meta");
               for (Element e:elementsByTag){
                   if (e.attr("name").equals("description")){
                       String description = e.attr("content");
                     book.setDescription(description);
                   }
//                   <meta property="og:image" content="https://www.netprint101.com/image/newbq_11940.jpg"/>
                if (e.attr("property").equals("og:image")){
                    String img = e.attr("content");
                    book.setIcon(img);
                }
               }
 
               Elements select = document.select(".intro.img img");
               Elements select2 = document.select(".intro img");
               if (select2.size()>0){
                   Element element = select2.get(0);
                   String onerror = element.attr("onerror");
                   if (StringUtil.isNotEmpty(onerror)){
                       book.setIcon("https://www.netprint101.com/image/newbq_219352.jpg");
                   }else {
                       String src = element.attr("src");
                       book.setIcon("https://www.netprint101.com"+src);
                   }
               }
               Elements elements = document.select(".details.z h2");
               Elements elements2 = document.select(".details.z .p");

               String bookName = elements.get(0).text();
               Elements byTag = elements2.get(0).getElementsByTag("i");
               String author = byTag.get(0).text();
               String updateTime = byTag.get(1).text();

               author=author.substring(author.lastIndexOf(":")+1);
               updateTime=updateTime.substring(updateTime.lastIndexOf(":")+1);


               book.setBookName(bookName);
               book.setAuthor(author);
//               book.setIcon("https://www.netprint101.com/image/newbq_219352.jpg");
               book.setOriginHref(url);
               book.setUpdateTime(updateTime);

           }


        }


    }

更多博客和源码请到微信公众号:源码plus

结尾

与其担心未来,不如现在好好努力。这条路上,只由奋斗才能给你安全感。不要轻易把梦想寄托在某个人身上,也不要太在乎身旁的耳语,因为未来是你自己的,只有你自己才能给你自己最大的安全感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023关键词:挑战

未失踪人口回归… 好久不见&#xff0c;不经意间拖更2个多月。今天周末&#xff0c;外面淅淅沥沥下着小雨&#xff0c;这种窝在床上的时刻最适合写点东西了。 但是建议大家在办公或者写博客的时候尽量还是端正坐姿&#xff0c;我就是因为喜欢这样靠在床背上&#xff0c;长时间…

Spring Security 从入门到精通

前言 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与Spr…

Vue3+ElementPlus+koa2实现本地图片的上传

一、示例图二、实现过程利用Koa2书写提交图片的后台接口这个模块是我写的项目中的其中一个板块——上传图片&#xff0c;这个项目的后台接口主要是是使用了后端的Koa2框架&#xff0c;前端小伙伴想要试着自己书写一些增删改查的接口可以从这个入手&#xff0c;Koa2用来了解后端…

力扣HOT100 11-15

11.盛水最多的容器 思路&#xff1a;最大水量 底边 * 高度。较短的一边控制最大水量&#xff0c;因此&#xff0c;采用双指针的方式&#xff0c;左、右指针指向开始和末尾&#xff0c;逐个向中间移动&#xff0c;判断左右指针所指向的高度哪个更低&#xff0c;它就向中间移动一…

ubuntu中解决Failed to connect to 127.0.0.1 port xxxxx: Connection refused

ubuntu中解决Failed to connect to 127.0.0.1 port xxxxx: Connection refused 方法一 查看一下代理 git config --global http.proxy git config --global https.proxy 有就取消,没有就换一种方法 git config --global --unset http.proxy git config --global --unse…

计算机网络之http03:HTTPS RSA握手解析

不同的秘钥交换算法,握手过程可能略有差别 上文对HTTPS四次握手的学习 SSL/TLS Secure Sockets Layer/Transport Layer Security 协议握手过程 四次通信&#xff1a;请求服务端公钥 2次 秘钥协商 2次 &#xff08;1&#xff09;ClientHello请求 客户端向服务端发送client…

状态机设计举例

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;文章和代码已归档至【Github仓库&#xf…

JavaScript内置支持类Array

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>内置支持类Array</title> </head> <body bgcolor"antiquewhite"> <script type"text/javasc…

【Spark分布式内存计算框架——Spark Core】8. 共享变量

第七章 共享变量 在默认情况下&#xff0c;当Spark在集群的多个不同节点的多个任务上并行运行一个函数时&#xff0c;它会把函数中涉及到的每个变量&#xff0c;在每个任务上都生成一个副本。但是&#xff0c;有时候需要在多个任务之间共享变量&#xff0c;或者在任务(Task)和…

T35,没有token是什么意思?

描述 输入一个升序数组 array 和一个数字S&#xff0c;在数组中查找两个数&#xff0c;使得他们的和正好是S&#xff0c;如果有多对数字的和等于S&#xff0c;返回任意一组即可&#xff0c;如果无法找出这样的数字&#xff0c;返回一个空数组即可。 数据范围: 0≤len(array)≤…

常规网页布局

单列布局1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>单列布局1-头主尾等宽</title><style>.container {max-width: 960px; /*设置最大宽度为固定值*/margin: 0 auto; /*设置内部子…

Delphi 中TImageCollection和TVirtualImageList 控件实现high-DPI

一、概述RAD Studio允许你通过使用TImageCollection组件和TVirtualImageList组件&#xff0c;在你的Windows VCL应用程序中包含缩放、高DPI、多分辨率的图像。这两个组件位于Windows 10面板中&#xff1a;注意&#xff1a;如果你使用FireMonkey进行跨平台应用&#xff0c;请看T…

用VSCode在共用服务器上使用连接自己的Docker容器进行开发

问题描述 我们实验室有一台很牛的Linux服务器&#xff0c;核多卡多硬盘大&#xff0c;它是大家共用的&#xff0c;组里给我们每个人都创建了一个普通用户&#xff0c;没有sudo权限&#xff0c;所以不能用apt。 但是每个人对开发环境的需求都是不一样的&#xff0c;比如我要用…

年前无情被裁,面试大厂的这几个月…

2月份了&#xff0c;金三银四也即将来临&#xff0c;在这个招聘季&#xff0c;大厂也开始招人&#xff0c;但还是有很多人吐槽说投了很多简历&#xff0c;却迟迟没有回复… 另一面企业招人真的变得容易了吗&#xff1f;有企业HR吐槽&#xff0c;简历确实比以前多了好几倍&…

【手写 Vuex 源码】第五篇 - Vuex 中 Mutations 和 Actions 的实现

一&#xff0c;前言 上一篇&#xff0c;主要介绍了 Vuex 中 getters 的实现&#xff0c;主要涉及以下几个点&#xff1a; 将选项中的 getters 方法&#xff0c;保存到 store 实例中的 getters 对象中&#xff1b;借助 Vue 原生 computed&#xff0c;实现 Vuex 中 getters 的数…

有趣的Hack-A-Sat黑掉卫星挑战赛——跟踪卫星

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

TMC2660驱动及调试记录

TMC2660 一款优秀的电机驱动芯片&#xff0c;驱动简单。 理论就看这篇&#xff1a;TMC260/TMC2660/TMC262步进电机驱动 或者直接看手册&#xff0c;手册也不复杂。 使用SPI通信&#xff0c;通过SPI配置参数。支持直接使用SPI和Step/Dir方式控制两种控制步进电机的方式。 TMC…

【C语言】数据结构-二叉树

主页&#xff1a;114514的代码大冒险 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 引入 我们之前已经学过线性数据结构&#xff0c;今天我们将介绍非线性数据结构----树 树是一种非线性的…

面试官问我:说说你对Spring MVC的理解

文章目录什么是MVC模式MVC的原理图2.1 分析工作原理3.1 组件说明&#xff1a;3.1.1 组件&#xff1a;核心架构的具体流程步骤什么是MVC模式 MVC&#xff1a;MVC是一种设计模式 MVC的原理图 2.1 分析 M-Model 模型&#xff08;完成业务逻辑&#xff1a;有javaBean构成&#x…

C++11的异步操作让多线程开发变得简单

C11的异步操作简介一、std::future1.1、future的类型1.2、future的使用1.3、使用示例二、std::packaged_task三、std::promise总结简介 C提供如下的异步操作接口&#xff1a; std::future &#xff1a;异步指向某个任务&#xff0c;然后通过future特性去获取任务函数的返回结…