Spring Boot - 个人博客 - 分类/标签首页

9 篇文章 0 订阅
订阅专栏


分类首页

博客分类首页

标签首页

博客标签首页

博客分类首页和标签首页是几乎相同的,因此,前后端的逻辑基本上没啥差别,这里只以博客分类首页为例说明,标签首页可自行查看源码。

源码获取: Spting Boot Blog


1. 需求分析

博客分类首页包含两个部分:

  • 分类栏:显示分类的个数,以及具体每个分类的名称和对应的博客的数量
  • 博客列表:根据点击选择的不同分类,子列表部分显示当前类别下所有的博客

因此,我们需要查询数据库获取分类的总个数,对于每个分类来说,还要获取它拥有的博客总数,以及所有博客组成的列表,列表的查询要实现分页查询。


2. 前端处理

博客分类首页对应的前端涉及如下:

<div  class="m-container-small m-padded-tb-big animated fadeIn">
    <div class="ui container">
        <div class="ui top attached segment">
            <div class="ui middle aligned two column grid">
                <div class="column">
                    <h3 class="ui teal header">分类</h3>
                </div>
                <div class="right aligned column"><h2 class="ui orange header m-inline-block m-text-thin" th:text="${#arrays.length(types)}"> 1 </h2></div>
            </div>
        </div>

        <div class="ui attached segment m-padded-tb-large">
            <div class="ui labeled button m-margin-tb-tiny" th:each="type : ${types}">
                <a href="#" th:href="@{/types/{id}(id=${type.id})}" class="ui basic  button" th:classappend="${type.id==activeTypeId} ? 'teal'" th:text="${type.name}">思考与感悟</a>
                <div class="ui basic  left pointing label" th:classappend="${type.id==activeTypeId} ? 'teal'" th:text="${#arrays.length(type.blogs)}">24</div>
            </div>
        </div>

        <div class="ui top attached teal segment">
            <div class="ui padded vertical segment m-padded-tb-large" th:each="blog : ${page.content}">
                <div class="ui middle aligned mobile reversed stackable grid" >
                    <div class="eleven wide column">
                        <h3 class="ui header" ><a href="#" th:href="@{/blog/{id}(id=${blog.id})}" target="_blank" class="m-black" th:text="${blog.title}">标题</a></h3>
                        <p class="m-text" th:text="|${blog.description}......|">内容</p>
                        <div class="ui grid">
                            <div class="eleven wide column">
                                <div class="ui mini horizontal link list">
                                    <div class="item">
                                        <img src="https://unsplash.it/100/100?image=1005" th:src="@{${blog.user.avatar}}"  alt="" class="ui avatar image">
                                        <div class="content"><a href="#" class="header" th:text="${blog.user.nickname}" >Forlogen</a></div>
                                    </div>
                                    <div class="item">
                                        <i class="calendar icon"></i><span th:text="${#dates.format(blog.updateTime,'yyyy-MM-dd')}">2020-06-26</span>
                                    </div>
                                    <div class="item">
                                        <i class="eye icon"></i> <span th:text="${blog.views}">2</span>
                                    </div>
                                </div>
                            </div>
                            <div class="right aligned five wide column">
                                <a href="#" target="_blank" class="ui teal basic label m-padded-tiny m-text-thin" th:text="${blog.type.name}">认知升级</a>
                            </div>
                        </div>
                    </div>

                    <div class="five wide column">
                        <a href="#" th:href="@{/blog/{id}(id=${blog.id})}" target="_blank">
                            <img src="https://unsplash.it/800/450?image=1005" th:src="@{${blog.firstPicture}}"  alt="" class="ui rounded image">
                        </a>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>

前端首先获取后端传来的types列表,并使用模板引擎内置的array.length()获取列表的长度,即类别的总个数。对于每一个类别来说,使用th:each遍历获取具体的类别,然后获取type的id、name和blogs,同样使用array.length()获取每个类别所拥有的博客总数。博客列表详情部分和首页的是相同的,这里不再赘述。


3. 后端处理

表现层的处理逻辑如下所示,整个部分只使用一个方法即可:

@Controller
public class TypeShowController {

    @Autowired
    private TypeService typeService;

    @Autowired
    private BlogService blogService;

    @GetMapping("/types/{id}")
    public String types(@PageableDefault(size = 8, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable, @PathVariable Long id, Model model) {
        List<Type> types = typeService.listTypeTop(10000);
        if (id == -1) {
            id = types.get(0).getId();
        }
        BlogQuery blogQuery = new BlogQuery();
        blogQuery.setTypeId(id);
        model.addAttribute("types", types);
        model.addAttribute("page", blogService.listBlog(pageable, blogQuery));
        model.addAttribute("activeTypeId", id);
        return "types";
    }
}

通过调用业务层的listTypeTop来获取类别列表,方法的定义如下:

public interface TypeService { 
	List<Type> listTypeTop(Integer size);
}
@Service
public class TypeServiceImpl implements TypeService {

    @Autowired
    TypeRepository typeRepository;

    @Override
    public List<Type> listTypeTop(Integer size) {
        // 根据博客的size属性降序排列
        Sort sort = Sort.by(Sort.Direction.DESC,"blogs.size");
        Pageable pageable = PageRequest.of(0,size,sort);
        // 分页查询
        return typeRepository.findTop(pageable);
    }
}

对应的持久层实现为:

public interface TypeRepository extends JpaRepository<Type, Long> {

    @Query("select t from Type t")
    List<Type> findTop(Pageable pageable);
}

然后需要根据选择的列表查询出对应的博客列表,使用的是listBlog(),它接收的参数是查询条件,这里只使用type的id字段值,还有就是分页查询的Pageable对象。方法的实现如下:

public interface BlogService {

    // 根据复合查询条件获取博客列表,实现分页查询
    Page<Blog> listBlog(Pageable pageable, BlogQuery blog);
}
@Service
public class BlogServiceImpl implements BlogService {

    @Autowired
    private BlogRepository blogRepository;
@Override
public Page<Blog> listBlog(Pageable pageable, BlogQuery blog) {
    // 这里调用了JpaSpecificationExecutor中的findAll方法,方法的参数为Specification对象
    return blogRepository.findAll(new Specification<Blog>() {
        // 重写toPredicate方法,添加查询条件
        @Override
        public Predicate toPredicate(Root<Blog> root,
                                     CriteriaQuery<?> cq,
                                     CriteriaBuilder cb) {
            List<Predicate> predicates  = new ArrayList<>();
            // 如果输入了标题信息,则根据标题构建查询语句
            // 这里使用模糊查询
            if (!"".equals(blog.getTitle()) && blog.getTitle() != null){
                predicates.add(cb.like(root.<String>get("title"), "%" + blog.getTitle() + "%"));
            }
            // 如果输入了类型,则获取输入类型对应的类型id,将其作为查询条件
            if (blog.getTypeId() != null) {
                predicates.add(cb.equal(root.<Type>get("type").get("id"), blog.getTypeId()));
            }
            // 如果点了推荐,则同样将其作为查询条件
            if (blog.isRecommend()) {
                predicates.add(cb.equal(root.<Boolean>get("recommend"), blog.isRecommend()));
            }
            // 构建复合查询条件
            cq.where(predicates.toArray(new Predicate[predicates.size()]));
            return null;
        }
    }, pageable);
}

由于这里使用到了id,因此实际的查询条件只有id。

SpringBoot个人博客开发(三)分类标签页面
ce121的博客
06-01 374
----分类页面开始----- 是同样步骤,先把首页代码除开主体部分复制下来。 创建type.html 首页代码复制进去 修改此处 分类页面中间内容分为三部分:分类数量统计、分类图标及数量、分类所对应博客列表、翻页按钮 <!--页面主体--> <div class="m-padded-tb-large m-container-small"> <div class="ui container"> <!--header-->
springboot实现博客标签分类标签的功能
weixin_44965041的博客
07-13 700
这是一个合集!(7.10-7.13) 啊 还是使用上个项目进行完善 然后就上代码 先写博客标签的功能 delete 在BlogController里面先写方法 @GetMapping("{id}/delete") public String delete(@PathVariable Long id){ blogService.deleteById(id); return "redirect:/admin/blogs"; } 然后在IBlogService上写出这个方法,并在BlogSer
个人博客-3(分类功能实现)
qq_42265394的博客
03-08 1874
分类功能 使用技术 jqgrid bootstrap ajax 分类介绍 在博客系统中,分类模块的设计是不可缺少的,我们在各大博客网站中都能够看到这个模块设计,在浏览文章的过程中,我们也会挑选出我们感兴趣类别中的文章进行阅读,比如你偏爱前端类别下的内容,那就可以针对性的浏览所有前端类别下的文章,因此对博文进行归类是十分必要的。 表结构设计 首先将表结构确定下来,每篇文章都会被归类到一个类别下,一个类别下会有多篇文章,分类实体与文章实体的关系是一对多的关系,因此在表结构设计时,在文章表中设置一个分类
Spring Boot - 个人博客 - 分类/标签管理
Forlogenの解忧杂货铺
07-08 1221
文章目录1. 需求分析2. 前端处理3. 后端处理3.1 分类管理3.2 标签管理 分类管理 标签管理 前面已经讲述了关于博客系统后台管理中的登录验证和博客管理,下面继续介绍分类管理和标签管理。由于分类管理和标签管理几乎是一样的流程,代码也基本相似,所以这里将它们放到一起来说,不再占用其他的篇幅。 1. 需求分析 从上面的分类管理和标签管理图中可以看出,这两部分内容相当于博客管理部分的一个简化版本。对于分类标签来说,相应的操作仍然是编辑、删除和新增,但是对应的状态栏只有名称这一项,这样管理的信
基于 Spring boot个人博客系统设计与实现(源码+数据库).zip
06-22
基于 Spring boot个人博客系统设计与实现(源码+数据库)。介绍 基于SpringBoot个人博客系统 ; 包含用户端-管理端 实现 博客展示、 归档、友链、关于等用户端功能; 实现登录、仪表盘、发布文章、文章管理...
基于SpringBoot个人博客系统设计与实现-论文.pdf
06-09
基于SpringBoot个人博客系统设计与实现-论文.pdf基于SpringBoot个人博客系统设计与实现-论文.pdf基于SpringBoot个人博客系统设计与实现-论文.pdf基于SpringBoot个人博客系统设计与实现-论文.pdf基于...
基于SpringBoot个人博客系统-有文档
最新发布
07-27
所用的技术:SpringBoot+SpringSecurity+Mybatis+Mysql+Redis+Thymeleaf+JQuery 系统介绍:本系统是一个个人博客的管理系统,用户可以注册账号并登陆系统查看发布的文章并进行阅读评论等 本系统主要有三种用户: 1、...
基于Spring Boot + Vue 的前后端分离博客系统,本科毕业设计,个人开发学习,web全栈
06-20
一个简单的博客后台,采用了Spring Boot + Vue 的前后端分离系统。其中blog-admin是一个基于security后台权限管理系统(随便写着玩的),blog-api是博客后台,blog-app是前端Vue项目。 后端技术使用 核心框架:...
xsxgit-slf4j-spring-boot-starter-master_java_
10-02
个人博客Spring Boot 开山之作,采用 Spring Boot + MyBatis,前端 Bootstrap + LayUI,支持程序员非常青睐的轻量化的 Markdown 编辑器 Editor.md,支持标签分类
SpringBoot开发小而美的个人博客
01-01
SpringBoot开发小而美的个人博客
Spring boot个人博客管理系统
07-20
前端使用sementi ui组件,后端使用Spring boot,数据库为mysql,实现功能有博客的发布,修改,删除,采用的是Markdown的开源组件;归档,标签管理,评论管理等,具体的技术有,拦截器,jpa,MD5加密摘要,界面优美,值得学习。
Spring Boot开发一个小而美的个人博客
11-22
该套课程为精心打造的Spring Boot项目实战视频课程,我会带你从零开始,一步一步的完成一个小而美的个人博客产品,通过学习能让你掌握完整的全栈开发套路,开发前端UI的小套路,还会get到很多小技能哦....... 本课程使用的数据库是 spring boot + jpa,开发工具 idea
springboot个人博客的构建(6) 分类管理(标签管理)
qq_40979622的博客
11-02 2602
标签管理和分类管理一样。 分类管理页面: 首先:建立HTML文件types.html 这个是分类列表的页面。  这个页面是由blog.html页面由来的,进行修改得到。 看源代码:这里用的模板引用,在admin/下面建立新的模板引擎。 先看模板引擎: &lt;!DOCTYPE html&gt; &lt;html lang="en" xmlns:th="http://www...
Spring boot开源项目之个人博客(12)—分类标签)管理
qq369392973的博客
08-28 512
Spring boot开源项目之个人博客(12)—分类标签)管理 分类标签管理功能高度重合,就只记录分类管理。分类管理主要涉及到了增删查改和前端分页展示的功能,还有一些零碎的非空验证、重复验证等。 1. 分页展示 前端是有两个页面,一个用来分页展示,并提供新增、编辑、删除等功能,分类标签的管理不做条件查询,条件查询会在博客管理做;另一个是新增、编辑共用的表单提交页。 分页展示页面套用了之前做好的博客管理的分页展示页模板,这里主要记录如何用theamleaf和springboot的Pageable实现前
基于SpringBoot + Vue的个人博客系统10——标签分类页面
芊雨的博客
08-30 1386
简介 其实在主界面写好之后,分类标签页面其实就很简单了,下面主要来介绍一下我踩过的坑。 实现 标签页面 1、因为主界面中的文章卡片可以复用,所以我们单独抽取成组件 2、新建 @/components/ArticleItem.vue 组件 <template> <el-card> <div slot="header"> <router-link class="main-text" :to="'/post/' + article.id" v-
SpringBoot实战——个人博客项目
夏壹分享
07-17 1593
项目名称:个人博客系统主要操作的对象是:文章和用户,用户可在该系统上发表自己的博客,查看自己或别人已经发表的文章需要用到两张表:userinfo(用户表)、articleinfo(文章表)登录+注册博客的分页列表功能新增发表博客修改、删除自己的博客项目技术栈MySQLjQuery项目亮点手动对用户密码实现随机加盐统一异常处理、拦截器用户登录持久化(session内存)分页功能。
如何用SpringBoot搭建一个好看的个人博客
ShockChen7的博客
12-06 1882
如何用SpringBoot+Thymeleaf搭建一个好看的个人博客 作者:ChenZhen博客地址:版权:本文为博主 ChenZhen 的原创文章,本文版权归作者所有,转载请附上原文出处链接及本声明。源码地址:如果对你有帮助,请给一个小小的star⭐本节将讲述博客系统的技术栈需求、数据库表设计、功能模块等方面。
Springboot搭建个人博客系列
sanmi8276的博客
11-11 4289
要搭建博客系统,首先要做的就是搭建一个数据库。 我们选择的数据库是MySQL5.7,安装教程请自行百度。 数据库建模工具是PowerDesigner16.6,下载及安装教程也请自行百度。 既然是简单的博客系统,我只简单的建立了几张必要的表(为了保持系统简洁,og表什么暂时不添加了,后期需要再添加),分别为: sys_user:系统用户表 t_article:文章表 t_content:文章内容表 t_comment:文章评论表 t_category:文章分类表 数据库结构见下图 SQ
spring boot编写一个个人博客系统中的标签/分类管理功能
05-13
好的,下面是用 Spring Boot 编写个人博客系统中的标签/分类管理功能的步骤: 1. 首先,需要创建一个 Tag(标签)类和一个 Category(分类)类。它们可以包含以下字段: ``` public class Tag { private Long id; private String name; // getter and setter methods } public class Category { private Long id; private String name; // getter and setter methods } ``` 2. 接下来,创建一个 TagService 和一个 CategoryService 类来处理标签分类的业务逻辑。它们可以包含以下方法: ``` public interface TagService { List<Tag> findAllTags(); Tag findTagById(Long id); void saveTag(Tag tag); void deleteTag(Long id); } public interface CategoryService { List<Category> findAllCategories(); Category findCategoryById(Long id); void saveCategory(Category category); void deleteCategory(Long id); } ``` 3. 然后,创建一个 TagController 和一个 CategoryController 类来处理与标签分类相关的 HTTP 请求。它们可以包含以下方法: ``` @RestController @RequestMapping("/api/tags") public class TagController { @Autowired private TagService tagService; @GetMapping("/") public List<Tag> getAllTags() { return tagService.findAllTags(); } @GetMapping("/{id}") public Tag getTagById(@PathVariable Long id) { return tagService.findTagById(id); } @PostMapping("/") public void addTag(@RequestBody Tag tag) { tagService.saveTag(tag); } @DeleteMapping("/{id}") public void deleteTag(@PathVariable Long id) { tagService.deleteTag(id); } } @RestController @RequestMapping("/api/categories") public class CategoryController { @Autowired private CategoryService categoryService; @GetMapping("/") public List<Category> getAllCategories() { return categoryService.findAllCategories(); } @GetMapping("/{id}") public Category getCategoryById(@PathVariable Long id) { return categoryService.findCategoryById(id); } @PostMapping("/") public void addCategory(@RequestBody Category category) { categoryService.saveCategory(category); } @DeleteMapping("/{id}") public void deleteCategory(@PathVariable Long id) { categoryService.deleteCategory(id); } } ``` 4. 最后,在应用程序的启动类中,添加注解 @EnableWebMvc 和 @ComponentScan,并配置视图解析器和静态资源路径: ``` @SpringBootApplication @EnableWebMvc @ComponentScan(basePackages = {"com.example.blog"}) public class BlogApplication implements WebMvcConfigurer { // configure view resolver @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".html"); return resolver; } // configure static resources @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } public static void main(String[] args) { SpringApplication.run(BlogApplication.class, args); } } ``` 这样就完成了个人博客系统中的标签/分类管理功能的编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 小波变换(Wavelet Transform) 35300
  • 使用Navicat for MySQL创建存储过程 27597
  • Machine Learning-Octave的下载与安装 25955
  • GaussDB(DWS)介绍 24895
  • 数据立方体(Data Cube) 24770

分类专栏

  • GaussDB 5篇
  • 项目实战 9篇
  • Mybatis探秘 5篇
  • Spring Boot 探秘 13篇
  • 设计模式 8篇
  • Spring 探秘 9篇
  • Java 68篇
  • Java虚拟机探秘 15篇
  • Message Queue 探秘 1篇
  • NIO and Netty 3篇
  • 多线程与并发 16篇
  • Linux 1篇
  • Redis 8篇
  • Leetcode 117篇
  • 剑指offer 69篇
  • Data structure 14篇
  • DB 21篇
  • NLP 64篇
  • GAN 46篇
  • 林轩田机器学习基石课程 17篇
  • 林轩田机器学习技法课程 11篇
  • Stanford Machine Learning 21篇
  • 李宏毅系列课程 10篇
  • CS224n 9篇
  • openstack 14篇
  • Deep Learning 50篇
  • Machine Learning 38篇
  • IR 5篇
  • Python 9篇
  • C++ 7篇
  • Nothing~ 8篇

最新评论

  • 小波变换(Wavelet Transform)

    聪聪0620: 不肽明白的是dwt得到的不应该是频谱吗和时间相关的频谱,为什么得到的是空域的信号

  • 小波变换(Wavelet Transform)

    weixin_46097026: 感谢,豁然开朗

  • 浅理解Java中的匿名对象

    overmind_y: 匿名对象作为参数是不是该这么写: getScanner(new Scanner(System.in)); 原文的例子怎么赋值了

  • 流形学习(Mainfold Learning)

    小熊早睡觉: 谢谢博主表情包

  • SalGAN

    w331023917: 你好,请问你成功复现了这个代码吗,我也是最近准备复现,但是很多地方都不太明白

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • GaussDB数据库管理
  • 什么是分布式数据库?
  • GaussDB中analyze关键字
2022年7篇
2021年1篇
2020年371篇
2019年168篇
2018年88篇
2017年9篇
2016年25篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源ps制作贺卡小型餐馆起个什么名字白砂糖的作用公司起名 典故代购系统水龙敬55you郑氏起名子2020女宝贝起名板材起名大全驻马店起名风水师武汉交通图四象星座东方神起成员关系农商银行电话带状疱疹的症状表现及治疗方法睿字起名字好不好卫辉市属于哪个市上帝之城迅雷下载宁字女孩起名办公司起名字打分QQ等级最高俊猴王的张姓起名大全适合男孩起名的古诗词名句宝宝起名大全证件集团视频交友金正昆讲礼仪直径符号怎么打淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化