一.管理员后台主页面
1.1 公共导航页面
公共页面framework.jsp(在后面的JSP会直接引用这个JSP,避免写更多繁琐的代码):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="rapid" uri="http://www.rapid-framework.org.cn/rapid" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<link rel="shortcut icon" href="${pageContext.request.contextPath}/img/logo.png">
<title>
${options.optionSiteTitle}后台
<rapid:block name="title"></rapid:block>
</title>
<link rel="stylesheet" href="/plugin/layui/css/layui.css">
<link rel="stylesheet" href="/css/back.css">
<link rel="stylesheet" href="/plugin/font-awesome/css/font-awesome.min.css">
<rapid:block name="header-style"></rapid:block>
<rapid:block name="header-script"></rapid:block>
</head>
<body>
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo"><a href="/admin" style="color:#009688;">
${options.optionSiteTitle}管理员后台
</a>
</div>
<!-- 头部区域(可配合layui已有的水平导航) -->
<ul class="layui-nav layui-layout-left">
<li class="layui-nav-item"><a href="/" target="_blank">前台</a></li>
<li class="layui-nav-item">
<a href="javascript:;">新建</a>
<dl class="layui-nav-child">
<dd><a href="/admin/page/insert">页面</a></dd>
<dd><a href="/admin/notice/insert">公告</a></dd>
<dd><a href="/admin/link/insert">链接</a></dd>
</dl>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:;">
<img src="${sessionScope.user.userAvatar}" class="layui-nav-img">
${sessionScope.user.userName}
</a>
<dl class="layui-nav-child">
<dd><a href="/admin/user/profile">基本资料</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="/admin/logout">退出</a>
</li>
</ul>
</div>
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
<ul class="layui-nav layui-nav-tree" lay-filter="test">
<li class="layui-nav-item layui-nav-itemed">
<a class="" href="javascript:;">文章</a>
<dl class="layui-nav-child">
<dd><a href="/admin/article">全部文章</a></dd>
<dd><a href="/admin/category">全部分类</a></dd>
<dd><a href="/admin/tag">全部标签</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">页面</a>
<dl class="layui-nav-child">
<dd><a href="/admin/page">全部页面</a></dd>
<dd><a href="/admin/page/insert">添加页面</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">
链接
</a>
<dl class="layui-nav-child">
<dd><a href="/admin/link">全部链接</a></dd>
<dd><a href="/admin/link/insert">添加链接</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">公告</a>
<dl class="layui-nav-child">
<dd><a href="/admin/notice">全部公告</a></dd>
<dd><a href="/admin/notice/insert">添加公告</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="/admin/comment">
评论
</a>
</li>
<li class="layui-nav-item">
<a class="" href="javascript:;">
用户
</a>
<dl class="layui-nav-child">
<dd><a href="/admin/user">全部用户</a></dd>
<dd><a href="/admin/user/insert">添加用户</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">设置</a>
<dl class="layui-nav-child">
<dd><a href="/admin/menu">菜单</a></dd>
<dd><a href="/admin/options">主要选项</a></dd>
</dl>
</li>
</ul>
</div>
</div>
<div class="layui-body">
<!-- 内容主体区域 -->
<div style="padding: 15px;">
<rapid:block name="content">
</rapid:block>
</div>
</div>
<div class="layui-footer">
<!-- 底部固定区域 -->
© <a href="https://blog.csdn.net/wyfvv">努力努力要努力博客</a>
</div>
</div>
<script src="/js/jquery.min.js"></script>
<script src="/plugin/layui/layui.all.js"></script>
<script src="/js/back.js"></script>
<rapid:block name="footer-script">
</rapid:block>
<script>
//给文本编辑器的iframe引入代码高亮的css
$("iframe").contents().find("head").append("<link rel=\"stylesheet\" href=\"/css/highlight.css\">\n");
</script>
</body>
</html>
1.2 分页JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<c:if test="${pageInfo.pages > 1}">
<%--分页 start--%>
<nav class="navigation pagination" role="navigation">
<div class="nav-links">
<c:choose>
<c:when test="${pageInfo.pages <= 3 }">
<c:set var="begin" value="1"/>
<c:set var="end" value="${pageInfo.pages }"/>
</c:when>
<c:otherwise>
<c:set var="begin" value="${pageInfo.pageNum-1 }"/>
<c:set var="end" value="${pageInfo.pageNum + 2}"/>
<c:if test="${begin < 2 }">
<c:set var="begin" value="1"/>
<c:set var="end" value="3"/>
</c:if>
<c:if test="${end > pageInfo.pages }">
<c:set var="begin" value="${pageInfo.pages-2 }"/>
<c:set var="end" value="${pageInfo.pages }"/>
</c:if>
</c:otherwise>
</c:choose>
<%--上一页 --%>
<c:choose>
<c:when test="${pageInfo.pageNum eq 1 }">
<%--当前页为第一页,隐藏上一页按钮--%>
</c:when>
<c:otherwise>
<a class="page-numbers"
href="${pageUrlPrefix}=${pageInfo.pageNum-1}">
<i class="layui-icon"></i>
</a>
</c:otherwise>
</c:choose>
<%--显示第一页的页码--%>
<c:if test="${begin >= 2 }">
<a class="page-numbers" href="${pageUrlPrefix}=1">1</a>
</c:if>
<%--显示点点点--%>
<c:if test="${begin > 2 }">
<span class="page-numbers dots">…</span>
</c:if>
<%--打印 页码--%>
<c:forEach begin="${begin }" end="${end }" var="i">
<c:choose>
<c:when test="${i eq pageInfo.pageNum }">
<a class="page-numbers current">${i}</a>
</c:when>
<c:otherwise>
<a class="page-numbers" href="${pageUrlPrefix}=${i}">${i}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<%-- 显示点点点 --%>
<c:if test="${end < pageInfo.pages-1 }">
<span class="page-numbers dots">…</span>
</c:if>
<%-- 显示最后一页的数字 --%>
<c:if test="${end < pageInfo.pages }">
<a href="${pageUrlPrefix}=${pageInfo.pages}">
${pageInfo.pages}
</a>
</c:if>
<%--下一页 --%>
<c:choose>
<c:when test="${pageInfo.pageNum eq pageInfo.pages }">
<%--到了尾页隐藏,下一页按钮--%>
</c:when>
<c:otherwise>
<a class="page-numbers"
href="${pageUrlPrefix}=${pageInfo.pageNum+1}">
<i class="layui-icon"></i>
</a>
</c:otherwise>
</c:choose>
</div>
</nav>
<%--分页 end--%>
</c:if>
对不同的对象进行分页查询,在不同的Controller层。后面会说明(详细的分页操作可以查看MyBatis——分页插件的使用)。
二.文章操作
2.1 JSP页面
这个页面会以表格的形式显示文章信息,然后有删除的按钮。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="rapid" uri="http://www.rapid-framework.org.cn/rapid" %>
<rapid:override name="title">
- 文章列表
</rapid:override>
<rapid:override name="header-style">
<style>
/*覆盖 layui*/
.layui-input {
display: inline-block;
width: 33.333% !important;
}
.layui-input-block {
margin: 0px 10px;
}
</style>
</rapid:override>
<rapid:override name="content">
<blockquote class="layui-elem-quote">
<span class="layui-breadcrumb" lay-separator="/">
<a href="/admin">首页</a>
<a><cite>文章列表</cite></a>
</span>
</blockquote>
<div class="layui-tab layui-tab-card">
<form id="articleForm" method="post">
<input type="hidden" name="currentUrl" id="currentUrl" value="">
<table class="layui-table">
<colgroup>
<col width="300">
<col width="150">
<col width="100">
<col width="150">
<col width="100">
<col width="50">
</colgroup>
<thead>
<tr>
<th>标题</th>
<th>所属分类</th>
<th>状态</th>
<th>发布时间</th>
<th>操作</th>
<th>id</th>
</tr>
</thead>
<tbody>
<c:forEach items="${pageInfo.list}" var="a">
<tr>
<td>
<a href="/article/${a.articleId}"
target="_blank">
${a.articleTitle}
</a></td>
<td>
<c:forEach items="${a.categoryList}" var="c">
<a href="/category/${c.categoryId}"
target="_blank">${c.categoryName}</a>
</c:forEach>
</td>
<td>
<c:choose>
<c:when test="${a.articleStatus == 1}">
<a href="/admin/article?status=1">
<span style="color:#5FB878;">已发布</span>
</a>
</c:when>
<c:otherwise>
<a href="/admin/article?status=0">
<span style="color:#FF5722;">草稿</span>
</a>
</c:otherwise>
</c:choose>
</td>
<td>
<fmt:formatDate value="${a.articleCreateTime}"
pattern="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>
<a href="javascript:void(0)"
onclick="deleteArticle(${a.articleId})"
class="layui-btn layui-btn-danger layui-btn-mini">删除</a>
</td>
<td>${a.articleId}</td>
</tr>
</c:forEach>
</tbody>
</table>
</form>
<%@ include file="../Public/paging.jsp" %>
</div>
</rapid:override>
<rapid:override name="footer-script">
<script></script>
</rapid:override>
<%@ include file="../Public/framework.jsp" %>
可以看到的是这个文章列表的分页是引入上面的分页JSP。
这个页面会显示文章分类,文章状态,这些都是链接,点击会发送请求,然后展示详细文章信息(后面讲到这些请求的处理方法)。
2.2 AdminArticleController层
2.2.1 显示文章列表,带有分页功能
在之前的功能划分中,管理员对文章只有显示所有人文章列表和删除文章两个功能。可以看到在点击全部文章链接时,会发送"/admin/article"请求。在这个请求映射的方法中,会获得文章列表(下面的方法也在这个类中)。
@Controller
@RequestMapping("/admin/article")
public class AdminArticleController {
@Autowired
private ArticleService articleService;
//后台文章列表显示(这个是管理员的页面,只是显示文章列表和进行删除)
//这个参数有分页操作必须有的PageIndex,pageSize,只有满足了这两个条件才能满足分页查询
@RequestMapping(value = "")
public String index(@RequestParam(required = false,defaultValue = "1")Integer pageIndex,
@RequestParam(required = false,defaultValue = "10")Integer pageSize,
@RequestParam(required = false)String status, Model model){
HashMap<String,Object> criteria=new HashMap<>(1);
if(status==null)
{
//会传递现在的页码(方便点击其他页码进行查询)
model.addAttribute("pageUrlPrefix","/admin/article?pageIndex");
}
else
{
criteria.put("status",status);
model.addAttribute("pageUrlPrefix", "/admin/article?status=" + status + "&pageIndex");
}
PageInfo<Article> articlePageInfo=articleService.pageArticle(pageIndex,pageSize,criteria);
model.addAttribute("pageInfo",articlePageInfo);
return "Admin/Article/index";
}
...
}
为了看到这个分页是如何进行的, 所以追踪到这个pageArticle的实现:
@Override
public PageInfo<Article> pageArticle(Integer pageIndex,
Integer pageSize,
HashMap<String, Object> criteria) {
PageHelper.startPage(pageIndex, pageSize);
List<Article> articleList = articleMapper.findAll(criteria);
for (int i = 0; i < articleList.size(); i++) {
//封装CategoryList
List<Category> categoryList = articleCategoryRefMapper.listCategoryByArticleId(articleList.get(i).getArticleId());
if (categoryList == null || categoryList.size() == 0) {
categoryList = new ArrayList<>();
categoryList.add(Category.Default());
}
articleList.get(i).setCategoryList(categoryList);
}
return new PageInfo<>(articleList);
}
可以看到这个方法(就是之前学习MyBatis分页插件的一种方法),使用参数查询,然后将获得列表放到PageInfo中,方便获得各种Page的参数(插件的使用和查询一定连接在一起)。
最后查看这个方法的SQL语句,就是将两个参数传递过来,然后使用limit语句进行查询。
<!--通过分页查询文章-->
<select id="pageArticle" resultType="com.test.ssm.blog.entity.Article">
SELECT
<include refid="Base_Column_List"/>
FROM
<include refid="tb"/>
<where>
<if test="status!=null">
article_status=#{status}
</if>
</where>
ORDER BY article_status ASC, article_order DESC, article_id DESC
limit #{pageIndex},#{pageSize}
</select>
2.2.2 删除文章
<a href="javascript:void(0)"
onclick="deleteArticle(${a.articleId})"
class="layui-btn layui-btn-danger layui-btn-mini">删除</a>
我们可以看到这个点击删除按钮后,会以Ajax的形式传递文章ID,然后在这个ajax中发送删除请求。
//删除文章
function deleteArticle(id) {
if(confirmDelete()==true){
$.ajax({
async: false,
type: "POST",
url:'/admin/article/delete/'+id,
contentType : "application/x-www-form-urlencoded; charset=utf-8",
dataType: "text",
complete:function () {
window.location.reload();
}
})
}
}
可以看到这个传递的时候会带有文章ID,Controller层的删除方法:
//删除文章
@RequestMapping(value = "/delete/{id}")
public void deleteArticle(@PathVariable("id")Integer id){
articleService.deleteArticle(id);
}
2.3 页面显示
文章列表显示:(第一篇文章属于另一个用户)
点击删除按钮:
三.分类管理
3.1 JSP页面
这个页面会显示所有分类的列表,然后会有删除按钮。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="rapid" uri="http://www.rapid-framework.org.cn/rapid" %>
<rapid:override name="title">
- 分类列表
</rapid:override>
<rapid:override name="header-style">
<style>
/*覆盖 layui*/
.layui-input-block {
margin:0px 10px;
}
.layui-table {
margin-top: 0;
}
.layui-col-md4 {
padding:10px;
}
.layui-col-md8 {
padding:10px;
}
.layui-btn {
margin: 2px 0!important;
}
</style>
</rapid:override>
<rapid:override name="content">
<blockquote class="layui-elem-quote">
<span class="layui-breadcrumb" lay-separator="/">
<a href="/admin">首页</a>
<a href="/admin/category">分类列表</a>
</span>
</blockquote>
<div class="layui-row">
<div class="layui-col-md12" >
<table class="layui-table" >
<colgroup>
<col width="200">
<col width="50">
<col width="100">
<col width="50">
<col width="50">
<col width="50">
</colgroup>
<thead>
<tr>
<th>名称</th>
<th>文章数</th>
<th>操作</th>
<th>ID</th>
<th>pid</th>
<th>所属作者id</th>
</tr>
</thead>
<tbody>
<c:forEach items="${categoryList}" var="c">
<c:if test="${c.categoryPid==0}">
<tr>
<td>
<a href="/category/${c.categoryId}" target="_blank">${c.categoryName}</a>
</td>
<td>
<a href="/category/${c.categoryId}" target="_blank">${c.articleCount}</a>
</td>
<td>
<c:if test="${c.articleCount==0}">
<a href="/admin/category/delete/${c.categoryId}" class="layui-btn layui-btn-danger layui-btn-mini" onclick="return confirmDelete()">删除</a>
</c:if>
</td>
<td>${c.categoryId}</td>
<td>${c.categoryPid}</td>
<td>${c.categoryUserId}</td>
</tr>
<c:forEach items="${categoryList}" var="c2">
<c:if test="${c2.categoryPid==c.categoryId}">
<tr>
<td>
<a href="/category/${c2.categoryId}" target="_blank">——${c2.categoryName}</a>
</td>
<td>
<a href="/category/${c2.categoryId}" target="_blank">${c2.articleCount}</a>
</td>
<td>
<c:if test="${c2.articleCount==0}">
<a href="/admin/category/delete/${c2.categoryId}" class="layui-btn layui-btn-danger layui-btn-mini" onclick="return confirmDelete()">删除</a>
</c:if>
</td>
<td class="cate-parent">${c2.categoryId}</td>
<td>${c2.categoryPid}</td>
<td>${c.categoryUserId}</td>
</tr>
</c:if>
</c:forEach>
</c:if>
</c:forEach>
</tbody>
</table>
</div>
</div>
</rapid:override>
<rapid:override name="footer-script">
</rapid:override>
<%@ include file="../Public/framework.jsp"%>
这个页面会显示出父分类和子分类的关系。同时这个会判断这个分类下的文章数目,如果这个分类下有文章,就没有删除按钮。
3.2 AdminCategoryController
3.2.1 显示分类列表
和文章的处理一样,都是所有分类裂变,使用分页插件进行显示。逻辑基本一样,不需要追溯到Mapper层。
@Controller
@RequestMapping("/admin/category")
public class AdminCategoryController {
@Autowired
private CategoryService categoryService;
@Autowired
private ArticleService articleService;
//分类列表显示(管理员只有列表显示和删除)
@RequestMapping(value = "")
public ModelAndView categoryList(){
ModelAndView modelAndView=new ModelAndView();
List<Category> categoryList=categoryService.listCategoryWithCount();
modelAndView.addObject("categoryList",categoryList);
modelAndView.setViewName("Admin/Category/index");
return modelAndView;
}
...
}
3.2.2 删除分类
这个删除的请求直接是链接发送请求。
//删除分类
@RequestMapping(value = "/delete/{id}")
public String deleteCategory(@PathVariable("id")Integer id)
{
//明确是不可以删除有文章的分类
int count=articleService.countArticleByCategoryId(id);
if(count==0)
{
categoryService.deleteCategory(id);
}
return "redirect:/admin/category";
}
追踪到删除的实现方法,就会发现删除这个分类的同时,会删除这个分类与文章的关联记录。
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteCategory(Integer id) {
try{
//因为文章和分类有关,所以在分类中删除,也要在文章和分类关联的表里删除
categoryMapper.deleteCategory(id);
articleCategoryRefMapper.deleteByCategoryId(id);
}catch (Exception e){
e.printStackTrace();
log.error("删除分类失败, id:{}, cause:{}", id, e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
3.3 页面显示
分类列表显示(因为这个分类下有文章,所以没有删除按钮)
四.标签管理
4.1 JSP页面
这个页面会显示所有标签列表(分页显示),并有删除按钮。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="rapid" uri="http://www.rapid-framework.org.cn/rapid" %>
<rapid:override name="title">
- 标签列表
</rapid:override>
<rapid:override name="header-style">a
<style>
/*覆盖 layui*/
.layui-input-block {
margin:0px 10px;
}
.layui-table {
margin-top: 0;
}
.layui-col-md4 {
padding:10px;
}
.layui-col-md8 {
padding:10px;
}
.layui-btn {
margin: 2px 0!important;
}
</style>
</rapid:override>
<rapid:override name="content">
<blockquote class="layui-elem-quote">
<span class="layui-breadcrumb" lay-separator="/">
<a href="/admin">首页</a>
<a><cite>标签列表</cite></a>
</span>
</blockquote>
<div class="layui-row">
<div class="layui-col-md12" >
<table class="layui-table" >
<colgroup>
<col width="200">
<col width="50">
<col width="100">
<col width="50">
<col width="50">
</colgroup>
<thead>
<tr>
<th>名称</th>
<th>文章数</th>
<th>操作</th>
<th>ID</th>
<th>所属作者ID</th>
</tr>
</thead>
<tbody>
<c:forEach items="${tagList}" var="c">
<tr>
<td>
<a href="/tag/${c.tagId}" target="_blank">${c.tagName}</a>
</td>
<td >
<a href="/tag/${c.tagId}" target="_blank" lay-data="{sort:true}">${c.articleCount}</a>
</td>
<td>
<c:if test="${c.articleCount==0}">
<a href="/admin/tag/delete/${c.tagId}" class="layui-btn layui-btn-danger layui-btn-mini" onclick="return confirmDelete()">删除</a>
</c:if>
</td>
<td >${c.tagId}</td>
<td>${c.tagUserId}</td>
</tr>
</c:forEach>
</tbody>
</table>
<blockquote class="layui-elem-quote layui-quote-nm">
温馨提示:
<ul>
<li>如果该标签包含文章,将不可删除</li>
</ul>
</blockquote>
</div>
</div>
</rapid:override>
<rapid:override name="footer-script">
<script>
</script>
</rapid:override>
<%@ include file="../Public/framework.jsp"%>
4.2 AdminTagController
4.2.1 显示标签列表
@Controller
@RequestMapping("/admin/tag")
public class AdminTagController {
@Autowired
private ArticleService articleService;
@Autowired
private TagService tagService;
//后台列表显示
@RequestMapping(value = "")
public ModelAndView index(){
ModelAndView modelAndView =new ModelAndView();
List<Tag> tagList=tagService.listTagWithCount();
modelAndView.addObject("tagList",tagList);
modelAndView.setViewName("Admin/Tag/index");
return modelAndView;
}
...
}
4.2.2 删除标签
//删除标签
@RequestMapping(value = "/delete/{id}")
public String deleteTag(@PathVariable("id")Integer id){
Integer count=articleService.countArticleByTagId(id);
if(count==0)
{
tagService.deleteTag(id);
}
return "redirect:/admin/tag";
}
追踪到删除的实现方法,可以发现在删除标签的同时会删除文章与标签的关联记录。
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteTag(Integer id) {
try {
tagMapper.deleteById(id);
articleTagRefMapper.deleteByTagId(id);
} catch (Exception e) {
e.printStackTrace();
log.error("删除标签失败, id:{}, cause:{}", id, e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
4.3 页面显示
标签列表显示:标签下有文章的不能进行删除
五. 页面操作
5.1 JSP页面
页面会有三个JSP。
显示所有页面的JSP(已知有四个页面已经提前加到了数据库,不可以对这个页面进行操作),还有自定义的页面,可以对这个页面进行操作。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="rapid" uri="http://www.rapid-framework.org.cn/rapid" %>
<rapid:override name="title">
- 页面列表
</rapid:override>
<rapid:override name="header-style">
<style>
</style>
</rapid:override>
<rapid:override name="content">
<blockquote class="layui-elem-quote">
<span class="layui-breadcrumb" lay-separator="/">
<a href="/admin">首页</a>
<a><cite>页面列表</cite></a>
</span>
</blockquote>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>页面列表</legend>
</fieldset>
<form id="pageForm" method="post">
<table class="layui-table">
<colgroup>
<col width="50">
<col width="50">
<col width="100">
<col width="200">
<col width="50">
<col width="100">
</colgroup>
<thead>
<tr>
<th>id</th>
<th>key</th>
<th>标题</th>
<th>内容</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${pageList}" var="p">
<c:if test="${p.pageStatus!=2}">
<tr>
<td>${p.pageId}</td>
<td>${p.pageKey}</td>
<td>
${p.pageTitle}
</td>
<td>
<a href="/${p.pageKey}"
target="_blank">
${fn:substring(p.pageContent, 0,20 )}
</a>
</td>
<td>
<c:choose>
<c:when test="${p.pageStatus==1}">
显示
</c:when>
<c:otherwise>
<span style="color: #FF5722;">
隐藏
</span>
</c:otherwise>
</c:choose>
</td>
<td>
<a href="/admin/page/edit/${p.pageId}"
class="layui-btn layui-btn-mini">编辑</a>
<a href="/admin/page/delete/${p.pageId}"
class="layui-btn layui-btn-danger layui-btn-mini" onclick="return confirmDelete()">删除</a>
</td>
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
</form>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>自定义页面</legend>
</fieldset>
<div class="layui-form">
<table class="layui-tabl