【Java】从0开始个人网站建立(三)博客主页文章分页查询,预览显示

news2024/11/17 1:28:58

(一)工程建立到登录与认证-Spring boot、Shiro、Mybatis-Plus、MySql
(二)博客显示与登录后按钮按照Shiro授权显示加载html
(三)博客主页文章分页查询,预览显示

五、文章分页查询、预览显示

5.1 数据库

5.1.1 数据表设计

在第一章我们已经创建了数据库,并创建了几个用户相关的表,现在我们再来创建文章相关的数据表,sql语句如下

create table `article`(
    `id` int(3) not null comment '博客id',
    `title` varchar(100) not null comment '标题',
    `text` longtext not null comment '正文',
    `tag` varchar(255) not null comment '标签 java python',
    `type` varchar(25) not null comment '文章类型 原创 转载',
    `secret` int(1) not null default '0' comment '是否私密 0公开 1私密',
    `create_time` date not null comment '创建时间',
    `edit_time` date not null comment '最后编辑时间',
    `likes` int(5) not null default '0' comment '点赞次数',
    `author` varchar(20) not null comment '作者名称',
    `digest` varchar(255) not null comment '摘要',
    `watch` int(10) not null default '0' comment '浏览次数',
    primary key (`id`)
) engine=InnoDB default charset=utf8mb4;

5.1.2 插入数据

insert into `article` values (0, '标题0', '正文0 如何使用java \n 正文', 'java', '原创', 0, '2021-01-13', '2022-01-10',0, 'liang', '摘要1...', 0);
insert into `article` values (1, '标题1', '正文1 如何使用python \n 正文', 'python', '原创', 0, '2021-02-11', '2022-02-10',0, 'liang', '摘要1...', 1);
insert into `article` values (2, '标题2', '正文2 如何使用Spring \n 正文', 'java, Spring', '原创', 0, '2022-01-10', '2022-02-10',0, 'liang', '摘要2...', 100);
insert into `article` values (3, '标题3', '正文3 如何使用linux \n 正文', 'linux', '转载', 0, '2021-10-10', '2022-01-10',0, 'liang', '摘要3...', 0);
insert into `article` values (4, '标题4', '正文4 如何使用c \n 正文', 'c', '原创', 1, '2022-10-10', '2022-01-10',0, 'liang', '摘要4...', 1);
insert into `article` values (5, '标题5', '正文5 如何使用c++ \n 正文', 'c++', '原创', 0, '2022-09-10', '2022-01-10',0, 'liang', '摘要5...', 0);
insert into `article` values (6, '标题6', '正文6 如何使用go \n 正文', 'go', '原创', 0, '2022-08-10', '2022-01-10',0, 'liang', '摘要6...', 122);

5.1.3 查询结果测试

select * from article;

5.2 实体类及Dao

5.2.1 实体类创建

  1. 创建com.liang.modules.sys.entity.ArticleEntity

    @Data
    @ToString
    @TableName("article")
    public class ArticleEntity implements Serializable {
    
        private static final long serialVersionUID = -3614720428468967910L;
        @TableId("id")
        private int id;
    
        private String title;   //标题
        private String text;    //正文
        private String tag;   //标签 java python
        private String type;    //文章类型 原创 转载
        private int secret;  // 0-公开  1-私密
        private String createTime;
        private String editTime;
        private int likes;      //赞数量
        private String author;  //作者
        private String digest;  //摘要
        private int watch;      //看过数
    }
    
  2. 创建com.liang.modules.sys.entity.VO.ArticleVOEntity

    @Data
    @ToString(callSuper = true)
    @TableName("article")
    public class ArticleVOEntity extends ArticleEntity implements Serializable {
        private static final long serialVersionUID = -4837335904568195683L;
    
        @TableField(exist = false)
        private String[] tagValues;  // 标签数组
    
        @TableField(exist = false)
        private String articleUrl;  //文章地址
    }
    

5.2.2 创建ArticleDao

  • 创建com.liang.modules.sys.dao.ArticleDao ,继承BaseMapper(MyBatis-plus中特有的)
    @Repository
    public interface ArticleDao extends BaseMapper<ArticleVOEntity> {
    }
    

5.2.3 测试dao

  1. 在测试类com.liang.TestBlog01ApplicationTests中,这个类在之前的测试中也用过
    类中创建内容如下
        @Autowired
        private ArticleDao articleDao;
        @Test
        void testArticleDao(){
            List<ArticleVOEntity> articleVOEntities = articleDao.selectList(null);
    
            System.out.println(articleVOEntities);
        }
    
  2. 测试,点击testArticleDao左侧的绿色启动键,进行测试, 结果如红框内所示即成功了(可忽略内容不一致,因为当时测试的时候表内容不一样)

5.3 Service及Controller

5.3.1 两个工具类编写

  1. 页面返回结果工具类
    创建com.liang.common.utils.PageResult,内容如下
    @Data
    @ToString
    public class PageResult {
        private int pageNumber;    //当前页数
        private int totalPage;  //总页数
        private int records;    //总记录数
        private List<?> rows;   //显示的行内容 ?是内容的类
    }
    
  2. 字符串和数组转换工具类
    创建com.liang.common.utils.StringAndArray
    public class StringAndArray {
         /**
          * @method  string转数组
          * @description 将字符串转为数组,例如字符串为 “python, java” 将得到["python","java"]
          */
        String[] stringToArray(String str){
            String[] strings = str.split(",");
            for (int i = 0; i < strings.length; i++) {
                strings[i] = strings[i].trim();
            }
            return strings;
        }
        
         /**
          * @method  数组转字符串
          * @description 例如["python","java"] 将得到“python, java” 
          */
        String arrayToString(String[] strings){
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < strings.length; i++) {
                stringBuilder.append(strings[i].trim());
                if (i!=strings.length-1)    stringBuilder.append(',');
            }
            return stringBuilder.toString();
        }
    }
    

5.3.2 Mybatis-plus配置分页插件

创建com.liang.common.config.MybatisPlusConfig

@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor(); 
    }
}

5.3.3 创建ArticleService

  1. 创建com.liang.modules.sys.service.ArticleService
    public interface ArticleService {
        PageResult findAllArticle(int pageNumber, int pageSize);
    }
    
  2. 创建com.liang.modules.sys.service.impl.ArticleServiceImpl
    @Service
    public class ArticleServiceImpl implements ArticleService {
    
        @Autowired
        private ArticleDao articleDao;
    
        @Override
        public PageResult findAllArticle(int pageNumber, int pageSize) {
            PageResult pageResult = new PageResult();
            QueryWrapper<ArticleVOEntity> wrapper = new QueryWrapper<>();
            Page<ArticleVOEntity> page = new Page<>(pageNumber, pageSize);
        	IPage<ArticleVOEntity> articles = articleDao.selectPage(page, wrapper.orderByDesc("create_time"));
            for (ArticleVOEntity article :
                    articles.getRecords()) {
                article.setTagValues(StringAndArray.stringToArray(article.getTag()));
                article.setArticleUrl("/article/"+ article.getId());
            }
            pageResult.setPageNumber(pageNumber);
            pageResult.setTotalPage((int) articles.getPages());
            pageResult.setRecords((int) articles.getTotal());
            pageResult.setRows(articles.getRecords());
            return pageResult;
        }
    }
    

5.3.4 测试Service

  1. 编写并执行如下
        @Autowired
        private ArticleService articleService;
        @Test
        void testArticleService(){
            PageResult allArticle = articleService.findAllArticle(1, 5);
            System.out.println(allArticle);
        }
    
  2. 结果
    在这里插入图片描述

5.3.5 创建ArticleController

  • @RestController
    public class ArticleController {
    
        @Autowired
        private ArticleService articleService;
    
        @GetMapping("/myArticles")
        public JsonResult myArticles(int pageSize, int pageNumber){
            PageResult allArticle = articleService.findAllArticle(pageNumber, pageSize);
            return new JsonResult(200, "ok", allArticle);
        }
    }
    

5.3.6 测试Controller

  1. 运行整个Spring boot项目,地址栏输入http://localhost:8080/myArticles?pageSize=5&pageNumber=1
  2. 结果
    在这里插入图片描述

5.4 页面显示和加载

5.4.1 引入layui

原layui官网不知为何关闭了,可从layzui镜像网站下载,下载后将里面的layui文件夹放置在src/main/resources/static

5.4.2 编写index.js

  1. 创建static/style/js/index.js文件,编写内容如下,实现首次页面加载时博客的显示,即显示第一页内容,并且每页显示数量为5
    /**
     * 本页博文显示
     */
    function putInArticle(data) {
        $(".qz-session-center").empty();
        var articles = $(".qz-session-center");
        $.each(data, function (index, article) {
            var center = $(
                '<div class="qz-center">' +
                '<header class="qz-article">' +
                '<h1 itemprop="name">' +
                '<a class="qz-article-title" href="' + article['articleUrl'] + '">' + article['title'] + '</a>' +
                '</h1>' +
                '<div class="qz-tt">' +
                '<span class="am-badge am-badge-success qz-mark">' + article['type'] + '</span>&nbsp;&nbsp;' +
                '<span class=""><span class="am-icon-calendar"></span>&nbsp;&nbsp;' + article['createTime'] + '</span>&nbsp;&nbsp;' +
                '<span style="font-size: 14px;"><i class="am-icon-user">&nbsp;' + article['author'] + '</i></span>&nbsp;&nbsp;' +
                '</div>' +
                '</header>' +
                '<div class="article-entry" style="height: 130px;overflow:hidden;">' +
                ' <p>' + article['digest'] + '</p>' +
                '</div>' +
                '<div class="read-all">' +
                '<a href="' + article['articleUrl'] + '">阅读全文 <i class="am-icon-angle-double-right"></i></a>' +
                '</div>' +
                '<hr>' +
                '<div class="article-tags">' +
                '</div>' +
                '</div>');
            articles.append(center);
            for (var i = 0; i < article['tagValues'].length; i++) {
                var articleTag = $('<i class="am-icon-tag"><a class="tag aa" href="/tags?tag=' + article['tagValues'][i] + '">&nbsp;' + article['tagValues'][i] + '&nbsp;</a></i>');
                $('.article-tags').eq(index).append(articleTag);
            }
        })
    }
    
    /**
     * 博客分页查询并显示
     */
    function pageRender(currentPage)  {
        var jsonStr = {pageSize: 5,pageNumber: currentPage};
        $.ajax({
            type: "GET",
            url: "/myArticles",
            dataType: "json",
            data: jsonStr,
            success: function (data) {
                //放入数据
                putInArticle(data.data.rows);
            }
        })
    }
    
    // 加载页面时运行一次
    pageRender(1);
    
  2. 编写到这里,就可以运行spring boot项目,并进入http://localhost:8080/查看页面,可以看到页面将会显示五个博客文章
    在这里插入图片描述4. 完善,编写页面选择以及翻页按钮显示
    在index.js中添加一个函数,该函数用layui渲染翻页按钮,并实现翻页调用
    /**
     * 分页按钮显示
     */
    function putPageHelper(data, curnum) {
        var count = data.data.records;
        //总页数大于页码总数
        layui.use('laypage', function () {
            var laypage = layui.laypage;
            //执行一个laypage实例
            laypage.render({
                elem: 'page-helper'
                , count:  count//数据总数
                , limit: 5
                , curr: curnum
                , jump: function (obj, first) {
                    if (!first) {
                        curnum = obj.curr;
                        pageRender(curnum);
                    }
                }
            });
        });
    }
    
  3. pageRender函数中调用,并且调用scrollTo(0,0)实现翻页后,页面转至最顶部,即将pageRender完善为
    /**
     * 博客分页查询并显示
     */
    function pageRender(currentPage)  {
        var jsonStr = {pageSize: 5,pageNumber: currentPage};
        $.ajax({
            type: "GET",
            url: "/myArticles",
            dataType: "json",
            data: jsonStr,
            success: function (data) {
                //放入数据
                putInArticle(data.data.rows);
                //显示翻页按钮和翻页调用
                putPageHelper(data, currentPage);
                scrollTo(0,0);
            }
        })
    }
    
  4. 运行并测试,往下翻将显示翻页按钮

5.4 个人信息及文章统计显示

5.4.1 引入aside.html页面

  1. 引入templates/aside.html
  2. 将index.html中的<div th:replace="aside :: aside"></div>解注释
  3. 将csdn图标、qq二维码、微信二维码保存至style/images/
    在这里插入图片描述
  4. 运行项目(报错则检查target中是否有生成aside.html,没有则删除target重新运行),可以看到项目右侧将显示一些个人信息,但qq和微信二维码默认显示的,我们要做的效果是默认不显示,当鼠标移动到qq、微信图标时再显示,接下来将编写header.js来实现

5.4.2 编写header.js

创建static/style/js/header.js文件,编写内容如下

$("#wx_picture").hide();
$("#qq_picture").hide();

$(".wxchat").mouseenter(function (){
    $("#wx_picture").show();
});
$(".wxchat").mouseleave(function (){
    $("#wx_picture").hide();
});

$(".qq").mouseenter(function (){
    $("#qq_picture").show();
});
$(".qq").mouseleave(function (){
    $("#qq_picture").hide();
});

这样就实现了鼠标移入移出qq、微信图标的二维码显示与隐藏

5.4.3 实现文章总数

未完待续

六、关于显示

6.1 页面编写

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

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

相关文章

Discrete Optimization课程笔记(3)—局部搜索

目录​​​​​​​ 1.局部搜索(Local Search) Case1: The Queens problem(Max/Min-Conflict) 2.邻域交换(swap neighborhood) Case2: Car Sequencing problem(number of violations) Case3: The Magic Square Problem(degree of violations) ​​​​​​​3.旅行商问题…

【Linux】进程的概念|查看进程的方法|子进程

文章目录基本概念“先描述”进程&#xff08;PCB&#xff09;task_ struct内容分类“再组织”进程最终结论&#xff1a;如何查看进程方法一&#xff1a;方法二&#xff1a;通过系统调用获取进程标识符通过系统调用创建进程子进程&#xff08;fork&#xff09;实验一&#xff1a…

Java基于PHP+MySQL客户信息管理系统的设计与实现

随着我国经济的发展,越来越多的企业出现,但是相对企业来说客户才是企业的根本,如何能够更好的当下的客户信息进行管理,是很多企业一直以来所关心的问题,如果对客户的信息不够重视最终将会使企业在激烈的竞争中失去活力,为此我们开发了本客户信息管理系统。 本客户信息管理系统采…

IB究竟在考什么?IB真的有传闻中的那么难吗?

提起学习“国际课程之王”IB的感受&#xff0c;学生们估计都能开一个“吐槽大会”了&#xff0c;IB很难&#xff0c;不少人学IB&#xff0c;GET到的第一个技能&#xff0c;就是“熬夜”。▲IB学生做的搞笑图&#xff1a;凌晨三点&#xff0c;唯一一扇亮着灯的窗户一定是属于IB学…

安装与调试Dragonfly实现自动化测试项目

通过ASP.NET Core Selenium 实现 Web 自动化平台 1、获取项目 从Gitee上拉取代码到本地。地址: 点击这里 有多种方式拉取&#xff0c;我使用的zip下载方式。 2、解压运行 这里我是在F盘新建了一个文件夹&#xff0c;只放这一个项目。 点击解压文件&#xff0c;找到“.sln”…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生社团管理系统9p5w4

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了&#xff0c;确实&#xff0c;从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做&#xff0c;创…

逻辑回归-为什么模型会更加侧重于学习那些数值比较大的列

np.random.seed(24)features,labels arrayGenReg(w[1,-1,1])将第一个特征取值调大100倍 features[:,:1] features[:,:1] * 100 features --- array([[ 132.92121726, -0.77003345, 1. ],[ -31.62803596, -0.99081039, 1. ],[-107.08162556, -1.43…

python爬取网页内的指定内容-不需要技术一样爬取网页详细教程

爬虫文章采集&#xff0c;我们怎么利用爬虫采集自己想要的文章内容&#xff0c;我们需要学习python爬虫吗&#xff1f;如果完全靠自己自学&#xff0c;又是从零基础开始学习Python的情况下&#xff0c;按照每个人的学习和理解能力的不同&#xff0c;我认为大致上需要半年到一年…

【网络杂烩 ---> 网络安全】DLL 注入 --- c/c++ 代码实现(超 · 详细)

麻了&#xff0c;之前写的博客全是收藏&#xff0c;没人点赞&#xff0c;来点赞行不行&#xff01; GitHub同步更新&#xff08;已分类&#xff09;&#xff1a;Data_Structure_And_Algorithm-Review 公众号&#xff1a;URLeisure 的复习仓库 公众号二维码见文末 以下是本篇…

我国火箭回收历程介绍

引言 火箭回收技术对于节约火箭发射成本具有重要意义&#xff0c;中国的火箭回收技术研发步履不停&#xff0c;本文将总结中国的可重复使用发动机和垂直回收火箭发展现状&#xff0c;数据更新时间为2022年11月11日。如需了解火箭回收相关概念. 提示&#xff1a;本文图片和表格…

Loss模块

导入包 from utils import cos_sim, euclidean_dist 方法 EucSoftmax 变量 “”"Calculate cos distance loss. Args:protos: protos vector in now episode (**class_size, hidden_size**)querys: queres vector to classify **(querys_len, hidden_size)**querys_y…

深浅拷贝的区别?如何实现一个深拷贝?

一.数据类型存储 js中存在两大数据类型&#xff1a; 基本数据类型&#xff1a;保存在栈内存中&#xff1b; 引用数据类型&#xff1a;保存在堆内存中&#xff0c;引用数据类型的变量是一个指向堆内存中实际对象的引用&#xff0c;存在栈中。 二.浅拷贝 浅拷贝&#xff1a;…

CRM系统的功能有哪些?

**CRM系统**的功能有&#xff1a;1、联系人管理&#xff1b;2、沟通跟踪&#xff1b;3、潜客管理&#xff1b;4、电子邮件集成&#xff1b;5、文档管理&#xff1b;6、报价/提案管理&#xff1b;7、商机管理&#xff1b;8、工作流自动化&#xff1b;9、报表/分析&#xff1b;10…

利用Seagate service获得system shell

这是挖掘 CVE-2022-40286 漏洞的记录。 闲来无事&#xff0c;我上网随便找了一个驱动来进行测试。我想找一个知名公司的产品&#xff0c;但是又不能是太偏太难懂的东西。 我最先发现了一个叫"Seagate Media Sync"的软件&#xff0c;这是一个将文件复制到希捷无线硬…

SR-MPLS技术基础讲解

目录 SR-MPLS基础概念 使用Segment Routeing MPLS技术的优点 Segment Routeing MPLS的基本原理 SRGB Segment ID Bind SID 粘连标签 OSPF对于SR-MPLS的扩展 OSPF对邻接SID做了细分 10类LSA定义的TLV类型 10类LSA定义的TLV的报文格式 ISIS对SR-MPLS的扩展…

pyinstaller瘦身指南

目录说明无优化直接打包优化&#xff1a;创建专用虚拟环境原因分析和总结说明 之前写了一个自动化办公的python脚本&#xff0c;按需求打包exe。经过不断优化打包过程&#xff0c;把26.1MB的文件变成了9.5MB的文件。 打包工具pyinstaller。 安装&#xff1a; pip install pyi…

Ubuntu1804里进行KITTI数据集可视化操作

需要做的准备工作 1、需要提前安装kitti2bag(终端输入即可安装) pip install kitti2bag 如果没有pip,按照Ubuntu给的提示先安装pip 2、下载kitti数据集(下载圈出的两部分) kitti数据集的百度网盘链接 kitti数据集链接_FYY2LHH的博客-CSDN博客 文件存放位置如图 上图…

Android Material Design之Chip, ChipGroup(十二)

效果图 资源引入 implementation com.google.android.material:material:1.4.0属性 Chip 属性描述android:id控件idstyle样式属性系统默认4种 1.style/Widget.MaterialComponents.Chip.Entry 2.style/Widget.MaterialComponents.Chip.Choice3.style/Widget.MaterialCompon…

集团资金管理BI分析的三个关键节点

集团资金管理方面的商业智能BI分析怎么做&#xff1f;从财务角度来说&#xff0c;企业的管理是以财务管理为中心&#xff0c;财务管理以资金管理为中心&#xff0c;资金管理以现金流量为中心。围绕资金管理至少需要考虑三个方面的内容&#xff1a;安全、收益和效率。 在商业智…

【JavaEE】JavaScript(WebAPI)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、前置知识二、【DOM】【获取元素】【事件】【操作元素】1.【获取/修改元素的内容】2.【获取/修改元素属性】3.【获取/修改 表单元素属性】4.【获取/修改样式属性】【操作节点】1.【新增节点】2.【删除节点】&…