一、请求处理层实现

在web包下创建admin包,再创建用于后台管理控制的控制类AdminController

/**

* @Classname AdminController

* @Description 后台管理模块

* @Date 2019-3-14 10:39

* @Created by CrazyStone

*/

@Controller

@RequestMapping("/admin")

public class AdminController {

private static final Logger logger = LoggerFactory.getLogger(AdminController.class);

@Autowired

private ISiteService siteServiceImpl;

@Autowired

private IArticleService articleServiceImpl;

// 管理中心起始页

@GetMapping(value = {"", "/index"})

public String index(HttpServletRequest request) {

// 获取最新的5篇博客、评论以及统计数据

List<Article> articles = siteServiceImpl.recentArticles(5);

List<Comment> comments = siteServiceImpl.recentComments(5);

StaticticsBo staticticsBo = siteServiceImpl.getStatistics();

// 向Request域中存储数据

request.setAttribute("comments", comments);

request.setAttribute("articles", articles);

request.setAttribute("statistics", staticticsBo);

return "back/index";

}

// 向文章发表页面跳转

@GetMapping(value = "/article/toEditPage")

public String newArticle( ) {

return "back/article_edit";

}

// 发表文章

@PostMapping(value = "/article/publish")

@ResponseBody

public ArticleResponseData publishArticle(Article article) {

if (StringUtils.isBlank(article.getCategories())) {

article.setCategories("默认分类");

}

try {

articleServiceImpl.publish(article);

logger.info("文章发布成功");

return ArticleResponseData.ok();

} catch (Exception e) {

logger.error("文章发布失败,错误信息: "+e.getMessage());

return ArticleResponseData.fail();

}

}

// 跳转到后台文章列表页面

@GetMapping(value = "/article")

public String index(@RequestParam(value = "page", defaultValue = "1") int page,

@RequestParam(value = "count", defaultValue = "10") int count,

HttpServletRequest request) {

PageInfo<Article> pageInfo = articleServiceImpl.selectArticleWithPage(page, count);

request.setAttribute("articles", pageInfo);

return "back/article_list";

}

// 向文章修改页面跳转

@GetMapping(value = "/article/{id}")

public String editArticle(@PathVariable("id") String id, HttpServletRequest request) {

Article article = articleServiceImpl.selectArticleWithId(Integer.parseInt(id));

request.setAttribute("contents", article);

request.setAttribute("categories", article.getCategories());

return "back/article_edit";

}

// 文章修改处理

@PostMapping(value = "/article/modify")

@ResponseBody

public ArticleResponseData modifyArticle(Article article) {

try {

articleServiceImpl.updateArticleWithId(article);

logger.info("文章更新成功");

return ArticleResponseData.ok();

} catch (Exception e) {

logger.error("文章更新失败,错误信息: "+e.getMessage());

return ArticleResponseData.fail();

}

}

// 文章删除

@PostMapping(value = "/article/delete")

@ResponseBody

public ArticleResponseData delete(@RequestParam int id) {

try {

articleServiceImpl.deleteArticleWithId(id);

logger.info("文章删除成功");

return ArticleResponseData.ok();

} catch (Exception e) {

logger.error("文章删除失败,错误信息: "+e.getMessage());

return ArticleResponseData.fail();

}

}

}

二、实现后台前端页面功能

back文件夹下的博客后台首页index.html文件进行后台数据展示,并创建页头和页脚

Index.html

<!DOCTYPE html>

<html lang="en" xmlns:th="http://www.thymeleaf.org" th:with="title='管理中心',active='home'">

<header th:replace="back/header::headerFragment(${title},${active})"></header>

<body class="fixed-left">

<div id="wrapper">

<div th:replace="back/header::header-body"></div>

<div class="content-page">

<div class="content">

<div class="container">

<div class="row">

<div class="col-sm-12">

<h4 class="page-title">仪表盘</h4>

</div>

<div class="row">

<div class="col-sm-6 col-lg-3">

<div class="mini-stat clearfix bx-shadow bg-info">

<span class="mini-stat-icon"><i class="fa fa-quote-right" aria-hidden="true"></i></span>

<div class="mini-stat-info text-right">

发表了<span class="counter" th:text="${statistics.articles}"></span>篇文章

</div>

</div>

</div>

<div class="col-sm-6 col-lg-3">

<div class="mini-stat clearfix bg-purple bx-shadow">

<span class="mini-stat-icon"><i class="fa fa-comments-o" aria-hidden="true"></i></span>

<div class="mini-stat-info text-right">

收到了<span class="counter" th:text="${statistics.comments}"></span>条留言

</div>

</div>

</div>

</div>

<div class="row">

<div class="col-md-4">

<div class="panel panel-default">

<div class="panel-heading">

<h4 class="panel-title">最新文章</h4>

</div>

<div class="panel-body">

<ul class="list-group">

<li class="list-group-item" th:each="article : ${articles}">

<span class="badge badge-primary" th:text="${article.commentsNum}">

</span>

<a target="_blank" th:href="${commons.site_url('/article/')}+${article.id}"

th:text="${article.title}"></a>

</li>

</ul>

</div>

</div>

</div>

<div class="col-md-4">

<div class="panel panel-default">

<div class="panel-heading">

<h4 class="panel-title">最新留言</h4>

</div>

<div class="panel-body">

<div th:if="${comments.size()}==0">

<div class="alert alert-warning">

还没有收到留言.

</div>

</div>

<ul class="list-group" th:unless="${comments}==null and ${comments.size()}==0">

<li class="list-group-item" th:each="comment : ${comments}">

<th:block th:text="${comment.author}"/>于 <th:block th:text="${commons.dateFormat(comment.created)}"/>:

<a th:href="${commons.site_url('/article/')}+${comment.articleId}+'#comments'"

target="_blank" th:utext="${commons.article(comment.content)}"></a>

</li>

</ul>

</div>

</div>

</div>

</div>

</div>

<div th:replace="back/footer :: footer-content"></div>

</div>

</div>

</div>

</div>

<div th:replace="back/footer :: footer"></div>

</body>

</html>

header.html

<!DOCTYPE html>

<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head th:fragment="headerFragment(title,active)">

<meta charset="utf-8"/>

<title><th:block th:text="${title!=null?title:'博客后台'}"></th:block></title>

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>

<meta content="Coderthemes" name="author"/>

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

<link rel="shortcut icon" th:href="@{/user/img/bloglogo.jpg}"/>

<link th:href="@{/back/css/bootstrap.min.css}" rel="stylesheet" type="text/css"/>

<link th:href="@{/back/css/font-awesome.min.css}" rel="stylesheet"/>

<link th:href="@{/back/css/style.min.css}" rel="stylesheet" type="text/css"/>

<link th:href="@{/back/css/sweetalert2.min.css}" rel="stylesheet"/>

<script th:src="@{/back/js/html5shiv.js}"></script>

<script th:src="@{/back/js/respond.min.js}"></script>

</head>

<div th:fragment="header-body">

<div class="topbar">

<div class="topbar-left">

<div class="text-center p-t-10" style="margin: 0 auto;">

<div class="pull-left" style="padding-left: 10px;">

<a th:href="@{/admin/index}">

<img th:src="@{/user/img/bloglogo.jpg}" width="50" height="50"/>

</a>

</div>

<div class="pull-left" style="padding-left: 10px;">

<span style="font-size: 28px; color: #2f353f; line-height: 50px;">MyBlog</span>

</div>

</div>

</div>

<div class="navbar navbar-default" role="navigation">

<div class="container">

<div class="">

<div class="pull-left">

<button type="button" class="button-menu-mobile open-left">

<i class="fa fa-bars"></i>

</button>

<span class="clearfix"></span>

</div>

<ul class="nav navbar-nav navbar-right pull-right">

<li class="dropdown">

<a th:href="@{index.html}" class="dropdown-toggle profile" data-toggle="dropdown"

aria-expanded="true"><img th:src="@{/assets/img/me.jpg}" alt="user-img"

class="img-circle"/> </a>

<ul class="dropdown-menu">

<form name="logoutform" th:action="@{/logout}" method="post"></form>

<li><a th:href="@{${commons.site_url()}}" target="_blank">

<i class="fa fa-eye" aria-hidden="true"></i>查看网站</a></li>

<li><a href="javascript:document.logoutform.submit();">

<i class="fa fa-sign-out"></i> 用户注销</a></li>

</ul>

</li>

</ul>

</div>

</div>

</div>

</div>

<div class="left side-menu">

<div class="sidebar-inner slimscrollleft">

<div id="sidebar-menu">

<ul>

<li th:class="${active}=='home'?'active':''">

<a th:href="@{/admin/index}"

th:class="${active}=='home'?'waves-effect active':'waves-effect'"><i

class="fa fa-dashboard" aria-hidden="true"></i><span> 仪表盘 </span></a>

</li>

<li th:class="${active}=='publish'?'active':''">

<a th:href="@{/admin/article/toEditPage}"

th:class="${active}=='publish'?'waves-effect active':'waves-effect'"><i

class="fa fa-pencil-square-o" aria-hidden="true"></i><span> 发布文章 </span></a>

</li>

<li th:class="${active}=='article'?'active':''">

<a th:href="@{/admin/article}"

th:class="${active}=='article'?'waves-effect active':'waves-effect'"><i

class="fa fa-list" aria-hidden="true"></i><span> 文章管理 </span></a>

</li>

<!-- 以下功能尚未实现 -->

<li th:class="${active}=='comments'?'active':''">

<a th:class="${active}=='comments'?'waves-effect active':'waves-effect'">

<i class="fa fa-comments" aria-hidden="true"></i><span> 评论管理 </span></a>

</li>

<li th:class="${active}=='category'?'active':''">

<a th:class="${active}=='category'?'waves-effect active':'waves-effect'">

<i class="fa fa-tags" aria-hidden="true"></i><span> 分类/标签 </span></a>

</li>

<li th:class="${active}=='setting'?'active':''">

<a th:class="${active}=='setting'?'waves-effect active':'waves-effect'">

<i class="fa fa-gear" aria-hidden="true"></i><span> 系统设置 </span></a>

</li>

</ul>

<div class="clearfix"></div>

</div>

<div class="clearfix"></div>

</div>

</div>

</div>

</html>

foot.html

<!DOCTYPE html>

<html lang="en" xmlns:th="http://www.thymeleaf.org">

<div th:fragment="footer-content">

<footer class="footer text-right">

<time class="comment-time" th:text="${#dates.format(new java.util.Date().getTime(), 'yyyy')}"></time> © <a target="_blank">CrazyStone</a><div class=""></div>

</footer>

</div>

<body th:fragment="footer">

<script th:src="@{/assets/js/jquery.min.js}"></script>

<script th:src="@{/back/js/bootstrap.js}"></script>

<script th:src="@{/back/js/sweetalert2.min.js}"></script>

<script th:src="@{/back/js/jquery.app.js}"></script>

<script th:src="@{/back/js/base.js}"></script>

</body>

</html>

注:

核心内容是使用th:*相关属性获取后台封装在Request域中的最新文章信息、最新评论信息和相关统计数据,并展示。

三、效果展示

启动项目后登录,在项目前端首页单击左上角的“后台管理”链接进入博客系统后台首页

10-5-展示后台数据相关推荐

  1. c 后台输出easyui html,EasyUI——实现展示后台数据代码

    下面是View显示代码: @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml" ...

  2. EasyUI——实现展示后台数据代码

    下面是View显示代码: @{ViewBag.Title = "Index";Layout = "~/Views/Shared/_Layout.cshtml"; ...

  3. 盟友说 | 在微信中最爆火的应用 后台数据究竟什么样?

    人们常用"一夜爆红"形容明星出名, 而在社交网络中却常常出现这样的明星产品.2015 上半年,刚进入社交网络的"足记"就引爆了微信朋友圈的分享狂潮,成为了一项爆 ...

  4. 使用ajax获取后台数据怎么打印,我用ajax获取后台数据并展示在前端页面的方法【源码】...

    <我用ajax获取后台数据并展示在前端页面的方法[源码]>由会员分享,可在线阅读,更多相关<我用ajax获取后台数据并展示在前端页面的方法[源码](2页珍藏版)>请在人人文库网 ...

  5. bootstrap table通过ajax获取后台数据展示在table

    1. 背景 bootstrap table 默认向后台发送语法的dataType为 json,但是为了解决跨域问题我们需要将dataType改为jsonp,这时就需要修改bootstrap table ...

  6. 设计灵感|如何做好网页后台数据展示的设计?

    一个完整的后台界面通常由导航.数据展示.表格.组件以及弹窗等部分组成,在视觉上确定了整体布局以后,还要考虑好各个部分的交互逻辑,才能获得更好的易用性. 由集设网 www.ijishe.com 设计师交 ...

  7. vue之前台请求特定商品数据展示+后台PHP处理后台数据(实战)

    这个页面是租车网站的展示页面(可拓展到网上商城产品展示) 最终结果 : 数据流向解析 引用element的现成时间输入组件,输入时间地点数据,确认按钮触发请求事件:①前台检查输入数据是否合法②将原来的 ...

  8. echarts如何获取后端的值_Echarts 获取后台数据 使用后台数据展示 柱形图

    后台数据要以json格式返回 页面:引用echarts.js , 然后data以ajax的数据请求并返回 String path = request.getContextPath(); String ...

  9. easyui select ajax,easyui的combobox根据后台数据实现自动输入提示功能

    easyui的combobox根据后台数据实现自动输入提示功能 发布时间:2020-06-11 10:09:41 来源:51CTO 阅读:1981 作者:crackernet adauhuehkek最 ...

  10. 人群频率 | gnomAD数据库 (二) 后台数据的获取及质量评估

    在gnomAD数据库简介(一)中,我们简单介绍了基因组学遗传分析中人群变异频率的重要性,以及gnomAD数据库的一些背景. 本篇主要侧重gnomAD的后台数据下载和简单评估. gnomAD后台数据下载 ...

最新文章

  1. Flutter事件与手势识别
  2. i18n java_Java国际化(i18n) Locale类详细示例
  3. Spark _02SparkCore_RDD
  4. Logback 专题
  5. centos7 配置虚拟交换机(物理交换机truck端口设置)(使用brctl)
  6. Git log diff config高级进阶
  7. 测试员如何进腾讯?了解了这些以后,你会发现其实也没那么难
  8. POSIX 线程详解
  9. 20h2是04服务器操作系统吗,爆料:微软 Win10 20H2 将是小更新
  10. JS 获取上传文件的内容
  11. 设计模式GOF23大纲
  12. 计算机组成原理(唐朔飞)--第一篇 概论
  13. Javashop 支持全业务模式电商系统
  14. 撬动世界的支点——《引爆点》读书笔记2900字优秀范文
  15. Max Script|控制摄像机
  16. Update Statistics用法
  17. oracle11g shrink,shrink lob
  18. c语言身份证号码验证
  19. 大话——从细分市场观商业模式
  20. python 创业_如何在下午使用python和破折号创业

热门文章

  1. python列索引行的数据公式_用列和行索引函数填充dataframe缺失元素的最有效方法...
  2. 【Clickhouse】Too many partitions for single INSERT block (more than 100)
  3. 【Elasticsearch】es shard split 使用分析
  4. 【clickhouse】flink clickhouse sink Class.forName 卡死
  5. 【高并发】JUC中的循环栅栏CyclicBarrier的6种使用场景
  6. Docker : Docker创建自定义网桥
  7. 【集合】Java 集合的ConcurrentModificationException
  8. 03-windows下Oracle的下载与安装
  9. 大数据面试-05-大数据工程师面试题
  10. git相关常用基本用法命令及分支操作指南命令