SpringBoot新闻管理系统——新闻编辑、修改、发布

本文介绍了一种新闻管理系统的实现方式,该系统能够通过分类、标签和推荐状态进行高级搜索和过滤,同时支持新闻的分页显示和删除操作。系统采用Spring框架,包括DAO层、Service层和Controller层,利用JPA查询和Specification接口实现动态条件查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要达到的效果:

  • 在新闻管理界面显示所有已发布的新闻集合
  • 可以在列表中对所需要的新闻根据分类和标签进行筛选搜索
  • 可以对已有新闻删除

首先要显示所有新闻,就要从数据库中查找:

1 在dao层接口

@Query("select n from News n where n.recommend=true")
    List<News> findTop(Pageable pageable);

2 Service层条件查找

在Service层中,对新闻根据标签进行筛选:
这里从前端页面获取查询,用find方法进行条件查找,这里用了一个匿名内部类,根据查到的数据Type、Tag、title是否和页面询问的一致来构建predict参数,进行查询。

@Override
    public Page<News> listNew(Pageable pageable, NewQuery newQuery) {
        return newRepository.findAll(new Specification<News>() {
            @Override
            public Predicate toPredicate(Root<News> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                List<Predicate> predicates=new ArrayList<>();
                if(!"".equals(newQuery.getTitle()) && newQuery.getTitle()!=null){
                    predicates.add(cb.like(root.<String>get("title"),"%"+newQuery.getTitle()+"%"));
                }
                if(newQuery.getTypeId()!=null){
                    predicates.add(cb.equal(root.get("type").get("id"),newQuery.getTypeId()));
                }
                if(newQuery.isRecommend()){
                    predicates.add(cb.equal(root.get("recommand"),newQuery.isRecommend()));
                }
                cq.where(predicates.toArray(new Predicate[predicates.size()]));
                return null;
            }
        },pageable);
    }

3 Controller层调用方法,传递给前端

两个方法,news是显示当前所有类型以供用户选择、同时分页显示所有新闻。
search方法用来响应搜索请求。

 @GetMapping("/news")
    public String news(@PageableDefault(size=3,sort = {"updateTime"},direction = Sort.Direction.DESC)
                               Pageable pageable, NewQuery newQuery, Model model){
        model.addAttribute("types",typeService.listType());
        model.addAttribute("page",newService.listNew(pageable,newQuery));
        return LIST;
    }

    @PostMapping("/news/search")
    public String search(@PageableDefault(size=3,sort = {"updateTime"},direction = Sort.Direction.DESC)
                               Pageable pageable, NewQuery newQuery, Model model){
        model.addAttribute("page",newService.listNew(pageable,newQuery));
        return "admin/news :: newsList";
    }

4 前端编写

用jquery获取页面中的参数。

function loaddata() {
      $("#table-container").load(/*[[@{/admin/news/search}]]*/"/admin/news/search",{
        title : $("[name='title']").val(),
        typeId : $("[name='typeId']").val(),
        recommend : $("[name='recommend']").prop('checked'),
        page : $("[name='page']").val()
      });
    }

用th循环显示文章内容:

 <tr th:each="news,iterStat : ${page.content}">
            <td th:text="${iterStat.count}">1</td>
            <td th:text="${news.title}">刻意练习清单</td>
            <td th:text="${news.type.name}">认知升级</td>
            <td th:text="${news.recommend} ? '是':'否'"></td>
            <td th:text="${news.published} ? '发布':'草稿'">草稿</td>
            <td th:text="${news.updateTime}">2017-10-02 09:45</td>
            <td>
              <a href="#" th:href="@{/admin/news/{id}/toUpdate(id=${news.id})}" class="ui mini teal basic button">编辑</a>
              <a href="#" th:href="@{/admin/news/{id}/delete(id=${news.id})}" class="ui mini red basic button">删除</a>
            </td>
          </tr>

5 演示

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值