10-5-展示后台数据
一、请求处理层实现
在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-展示后台数据相关推荐
- c 后台输出easyui html,EasyUI——实现展示后台数据代码
下面是View显示代码: @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml" ...
- EasyUI——实现展示后台数据代码
下面是View显示代码: @{ViewBag.Title = "Index";Layout = "~/Views/Shared/_Layout.cshtml"; ...
- 盟友说 | 在微信中最爆火的应用 后台数据究竟什么样?
人们常用"一夜爆红"形容明星出名, 而在社交网络中却常常出现这样的明星产品.2015 上半年,刚进入社交网络的"足记"就引爆了微信朋友圈的分享狂潮,成为了一项爆 ...
- 使用ajax获取后台数据怎么打印,我用ajax获取后台数据并展示在前端页面的方法【源码】...
<我用ajax获取后台数据并展示在前端页面的方法[源码]>由会员分享,可在线阅读,更多相关<我用ajax获取后台数据并展示在前端页面的方法[源码](2页珍藏版)>请在人人文库网 ...
- bootstrap table通过ajax获取后台数据展示在table
1. 背景 bootstrap table 默认向后台发送语法的dataType为 json,但是为了解决跨域问题我们需要将dataType改为jsonp,这时就需要修改bootstrap table ...
- 设计灵感|如何做好网页后台数据展示的设计?
一个完整的后台界面通常由导航.数据展示.表格.组件以及弹窗等部分组成,在视觉上确定了整体布局以后,还要考虑好各个部分的交互逻辑,才能获得更好的易用性. 由集设网 www.ijishe.com 设计师交 ...
- vue之前台请求特定商品数据展示+后台PHP处理后台数据(实战)
这个页面是租车网站的展示页面(可拓展到网上商城产品展示) 最终结果 : 数据流向解析 引用element的现成时间输入组件,输入时间地点数据,确认按钮触发请求事件:①前台检查输入数据是否合法②将原来的 ...
- echarts如何获取后端的值_Echarts 获取后台数据 使用后台数据展示 柱形图
后台数据要以json格式返回 页面:引用echarts.js , 然后data以ajax的数据请求并返回 String path = request.getContextPath(); String ...
- easyui select ajax,easyui的combobox根据后台数据实现自动输入提示功能
easyui的combobox根据后台数据实现自动输入提示功能 发布时间:2020-06-11 10:09:41 来源:51CTO 阅读:1981 作者:crackernet adauhuehkek最 ...
- 人群频率 | gnomAD数据库 (二) 后台数据的获取及质量评估
在gnomAD数据库简介(一)中,我们简单介绍了基因组学遗传分析中人群变异频率的重要性,以及gnomAD数据库的一些背景. 本篇主要侧重gnomAD的后台数据下载和简单评估. gnomAD后台数据下载 ...
最新文章
- Flutter事件与手势识别
- i18n java_Java国际化(i18n) Locale类详细示例
- Spark _02SparkCore_RDD
- Logback 专题
- centos7 配置虚拟交换机(物理交换机truck端口设置)(使用brctl)
- Git log diff config高级进阶
- 测试员如何进腾讯?了解了这些以后,你会发现其实也没那么难
- POSIX 线程详解
- 20h2是04服务器操作系统吗,爆料:微软 Win10 20H2 将是小更新
- JS 获取上传文件的内容
- 设计模式GOF23大纲
- 计算机组成原理(唐朔飞)--第一篇 概论
- Javashop 支持全业务模式电商系统
- 撬动世界的支点——《引爆点》读书笔记2900字优秀范文
- Max Script|控制摄像机
- Update Statistics用法
- oracle11g shrink,shrink lob
- c语言身份证号码验证
- 大话——从细分市场观商业模式
- python 创业_如何在下午使用python和破折号创业
热门文章
- python列索引行的数据公式_用列和行索引函数填充dataframe缺失元素的最有效方法...
- 【Clickhouse】Too many partitions for single INSERT block (more than 100)
- 【Elasticsearch】es shard split 使用分析
- 【clickhouse】flink clickhouse sink Class.forName 卡死
- 【高并发】JUC中的循环栅栏CyclicBarrier的6种使用场景
- Docker : Docker创建自定义网桥
- 【集合】Java 集合的ConcurrentModificationException
- 03-windows下Oracle的下载与安装
- 大数据面试-05-大数据工程师面试题
- git相关常用基本用法命令及分支操作指南命令