一,前台显示 /views/admin/category.html
{% extends 'layout.html' %}
{% block main %}
<ol class="breadcrumb">
<li><a href="/admin/category">分类首页</a></li>
<li><span>分类列表</span></li>
</ol>
<h3>分类列表</h3>
<table class="table table-bordered">
<tr>
<th>ID</th>
<th>分类名称</th>
<th>操作</th>
</tr>
<!-- 循环输出数组 . id是对象,需要转换成字符串 -->
{% for category in categories %}
<tr>
<td> {{category._id.toString()}}</td>
<td> {{category.category_name}}</td>
<td>
<!-- 【 错误的案例 : 忘记加路由 】 <a href="/category/edit?id={{category._id.toString()}}">修改</a> | -->
<a href="/admin/category/edit?id={{category._id.toString()}}">修改</a> |
<a href="/admin/category/delete?id={{category._id.toString()}}">删除</a>
</td>
{% endfor %}
</tr>
</table>
<div class="btn-group" role="group" aria-label="...">
<a href="/admin/category?page={{page-1}}" class="btn btn-default">上一页</a>
<a href="/admin/category?page={{page+1}}" class="btn btn-default">下一页</a>
<li>一共有 {{count}} 条数据</li>
<li>每页显示 {{limit}} 条数据</li>
<li>一共有 {{pages}} 页</li>
<li>当前是在 {{page}} 页</li>
</div>
{% endblock %}
二,后台 /router/admin.js
/**
* 分类管理,显示所有分类的信息
*/
router.get('/category',(req,res)=>{
var page = Number(req.query.page || 1) // 如果没有传值,默认为1
var limit = 10
var pages = 1
Category.count().then((count)=>{
// 计算总页数,向上取整数,去最大值
pages = Math.ceil(count / limit)
// 页数取值不能超过总页数的值
page = Math.min(page,pages)
// 取值不能小于1
page = Math.max(page,1)
var skip = (page-1)*limit
Category.find().limit(limit).skip(skip).then((categories) => {
res.render('admin/category',{
userInfo: req.userInfo,
categories:categories,
page:page,
pages:pages,
count:count,
limit:limit
})
})
})
})
/**
* 分类修改 ,先显示,再修改
*
* 1,获取 [显示] (get)
*/
router.get('/category/edit',(req,res)=>{
// 获取要修改的分类的信息,以表单的形式展示
//获取 id
var id = req.query.id || ''
//根据 id 查找
Category.findOne({
_id:id // 【 以 MongoDB 数据库字段 _id 为标准 ,不是 id ,视频中的bug 】
}).then((category)=>{
if(!category){
res.render('admin/error',{
user:req.userInfo,
message:'要修改的分类信息不存在'
})
return Promise.reject()
}else{
res.render('admin/category_edit',{
user:req.userInfo,
category:category
})
}
})
})
/**
* 分类修改
*
* 2, [保存]修改的数据(post)
*/
router.post('/category/edit',(req,res)=>{
//获取 id
var id = req.query.id || ''
//获取提交要修改的名称
var category_name = req.body.category_name || ''
console.log('category_name :'+category_name)
//数据库查询要修改的这条数据是否存在
Category.findOne({
_id:id,
}).then((rs)=>{
if(!rs){
res.render('admin/error',{
user:req.userInfo,
message:'要修改的分类信息不存在'
})
return Promise.reject()
}else{
//当用户没有做任何修改时
if(rs.category_name==category_name){
res.render('admin/error',{
user:req.userInfo,
message:'修改成功 --(没有做任何修改,这是条假信息)'
})
return Promise.reject()
}else{
// 判断要修改的数据在数据库中是否已存在,存在则返回错误信息,不存在则保存
/**
* return值会走到下面的then中,返回同名的分类名称
*/
return Category.findOne({
/**
* 1,{$ne:id} : 不等于当前的id . 范围更广
* 2,查询数据库中 id 不是要修改的这个id 但是 名称相同的记录
* 3,如果存在说明 : 有重复 。拒绝修改
*/
_id:{$ne:id},
category_name:category_name
})
}
}
}).then((sameCategory)=>{
if(sameCategory){
res.render('admin/error',{
user:req.userInfo,
message:'数据库中已有同名的名称存在'
})
return Promise.reject()
}else{
/**
* 更新
* 第一个参数 : 条件
* 第二个参数 : 修改的字段
* return 丢出去给then使用
*/
return Category.update({
_id:id
},{
category_name:category_name
})
}
}).then((rs)=>{
if(rs){
res.render('admin/success',{
user:req.userInfo,
message:'分类名称修改成功'
})
}
})
})
/**
* 分类删除
*/
router.get('/category/delete',(req,res)=>{
//获取要删除分类的id
var id = req.query.id || ''
//直接删除
Category.remove({
_id:id
}).then((rs)=>{
if(rs){
res.render('admin/success',{
user:req.userInfo,
message:'分类删除成功'
})
}
})
})