NodeJS实战 利用Express&MongoDB搭建博客(9)内容信息扩展及首页显示
修改文章数据结构
/schemas/contens.js
var mongoose = require('mongoose');
//内容数据结构
module.exports = new mongoose.Schema({
//关联字段-分类的id
category:{
type:mongoose.Schema.Types.ObjectId,
//引用
ref:'Category'
},
//内容标题
title:String,
//关联字段-用户id
user:{
type:mongoose.Schema.Types.ObjectId,
//引用
ref:'User'
},
//添加时间
addTime:{
type:Date,
default:new Date()
},
//阅读量
views:{
type:Number,
default:0
},
//内容简介
description:{
type: String,
default:''
},
//内容
content:{
type:String,
default: ''
}
});
文章保存时保存作者
/routers/admin.js
/**
* 内容保存
*/
router.post('/content/add',function (req,res) {
if(req.body.category==''){
res.render('admin/error',{
userInfo:req.userInfo,
message:'分类不能为空'
});
return;
}
if(req.body.title==''){
res.render('admin/error',{
userInfo:req.userInfo,
message:'标题不能为空'
});
return;
}
new Content({
category: req.body.category,
title:req.body.title,
user: req.userInfo._id.toString(),
description:req.body.description,
content:req.body.content
}).save().then(function (rs) {
res.render('admin/success',{
userInfo:req.userInfo,
message:'内容保存成功',
url:'/admin/content'
});
});
});
/views/admin/content_index.html
{% extends 'layout.html' %}
{% block main %}
<ol class="breadcrumb">
<li><a href="/">管理首页</a></li>
<li><span>内容列表</span></li>
</ol>
<h3>内容列表</h3>
<table class="table table-hover table-striped">
<tr>
<th>ID</th>
<th>分类名称</th>
<th>标题</th>
<th>作者</th>
<th>添加时间</th>
<th>阅读量</th>
<th>操作</th>
</tr>
{% for content in contents %}
<tr>
<td>{{content._id.toString()}}</td>
<td>{{content.category.name}}</td>
<td>{{content.title}}</td>
<td>{{content.user.username}}</td>
<!--使用过滤器-->
<td>{{content.addTime|date('Y-m-d H:i:s',-8*60)}}</td>
<td>{{content.views}}</td>
<td>
<a href="/admin/content/edit?id={{content._id.toString()}}">修改</a>
<a href="/admin/content/delete?id={{content._id.toString()}}">删除</a>
</td>
</tr>
{% endfor %}
</table>
{%include 'page.html'%}
{% endblock %}
内容分页展示
/routers/main.js
var express = require('express');
var router = express.Router();
var Category = require('../models/Category');
var Content = require('../models/Content');
/**
* 首页
*/
router.get('/',function (req,res,next) {
var data = {
userInfo:req.userInfo,
categories:[],
count:0,
page : Number(req.query.page || 1),
limit : 10,
pages : 0
}
//读取所有分类
Category.find().then(function (categories) {
data.categories = categories;
return Content.count();
}).then(function (count) {
data.count = count;
//计算总页数
data.pages = Math.ceil(data.count / data.limit);
//取值不能超过pages
data.page = Math.min( data.page, data.pages );
//取值不能小于1
data.page = Math.max( data.page, 1 );
var skip = (data.page - 1) * data.limit;
return Content.find().limit(data.limit).skip(skip).populate(['category','user']).sort({
addTime:-1
});
}).then(function (contents) {
data.contents = contents;
res.render('main/index',data);
});
});
module.exports = router;
/views/main/index.html
{%extends 'layout.html'%}
{%block content%}
{%for content in contents%}
<div class="listBox">
<h1>{{content.title}}</h1>
<p class="colDefault">
作者:<span class="colInfo">{{content.user.username}}</span> -
时间:<span class="colInfo">{{content.addTime|date('Y年m月d日 H:i:s', -8*60)}}</span> -
阅读:<span class="colInfo">{{content.views}}</span> -
评论:<span class="colInfo">{{content.comments.length}}</span>
</p>
<dfn><p>{{content.description}}</p></dfn>
<div class="function"><a href="/view?contentid={{content.id}}">阅读全文</a></div>
</div>
{%endfor%}
<div class="pager">
<ul class="clear">
<li class="previous">
{%if page <= 1%}
<span>没有上一页了</span>
{%else%}
<a href="/?category={{category}}&page={{page-1}}">上一页</a>
{%endif%}
</li>
{%if pages > 0%}
<li>
<strong>{{page}} / {{pages}}</strong>
</li>
{%endif%}
<li class="next">
{%if page >= pages%}
<span>没有下一页了</span>
{%else%}
<a href="/?category={{category}}&page={{page+1}}">下一页</a>
{%endif%}
</li>
</ul>
</div>
{%endblock%}