1,前台 ,/views/main/index.html ,将文章 id 通过url 传送给后台

{% for content in contents %}
<div class="panel-body">
<div class="panel panel-info">
<div class="panel-body">
<h4>【 {{content.title}} 】</h4>
<p>
作者 : {{content.user.username}} &nbsp;
发布时间 : {{content.addTime|date('Y-m-d')}} &nbsp;
阅读数量 : {{content.views}} &nbsp;
评论 : {{content}} &nbsp;
</p>
<p>简介 : {{content.description}}</p>
<p>
<a class="btn btn-info" href="/views?contentid={{content.id}}" role="button">内容详情</a>
</p>
</div>
</div>
</div>
{% endfor %}
 
2,后台 , /router/main.js ,增加  view 路由 ,读取文章的内容 ,渲染文章的页面 。 读取导航栏 。增加访问量。
 
/**
* 因为导航栏是前台每个栏目显示都需要的,所以不应该写在【/】 路由中,所以使用中间件的方法处理【 通用的数据 】
*/
router.use((req,res,next)=>{
/**
* !!!【data必须是全局对象,否则中间件的下一个接收不到】
*/
data = {
 
userInfo:req.userInfo,
categories:[], //所有分类的信息
}
Category.find().then((categories)=>{
data.categories = categories
// console.log(data)
/**注意 next 的出口 */
next()
})
})
/**
* 首页
*/
router.get('/',(req,res)=>{
/**
* 从数据库中读取分类信息
* rs是一个数组类型的记录
*/
// data 不能重新等于新的对象
data.category =req.query.category || ''
data.page = Number(req.query.page || 1)
data.limit = 2
data.pages = 1
data.count= 0
 
var where = {}
if(data.category){
where.category = data.category
}
// console.log('where => '+where)
/**获取所有分类信息 */
Content.where(where).countDocuments().then((count)=>{
//为了方便,存入data
data.count = count
// 计算总页数,向上取整数,去最大值
data.pages = Math.ceil(data.count / data.limit)
 
// 页数取值不能超过总页数的值
data.page = Math.min(data.page,data.pages)
 
// 取值不能小于1
data.page = Math.max(data.page,1)
// 不需要被分配到模板 data 中 ,直接存入变量
var skip = (data.page-1)*data.limit
/**
* 读取文章并返回
*/
 
return Content.where(where).find().sort({_id:-1}).limit(data.limit).skip(skip).populate(['category','user'])
// 不 return 下面的参数将没有数据
}).then((contents)=>{
data.contents = contents
// console.log(data)
/**最后渲染 */
res.render('main/index',data)
})
 
})
router.get('/view',(req,res)=>{
contentid = req.query.contentid || ''
Content.findOne({
_id:contentid
}).then(content=>{
data.content = content
/** 增加阅读数 */
content.views++
content.save()
res.render('main/view',data)
})
})
 
3,前台展示 /views/main/view.html
 
<div class="panel-heading">文 章</div>
 
<h4>【 {{data.content.title}} 】</h4>
<p>
作者 : {{data.content.user.username}} &nbsp;
发布时间 : {{data.content.addTime|date('Y-m-d')}} &nbsp;
阅读数量 : {{data.content.views}} &nbsp;
评论 : {{data.content}} &nbsp;
</p>
<p>简介 : {{data.content.description}}</p>
<p>
内容 : {{data.content.content}}
</p>
 
 

21 ~ express ~ 内容详情展示 和 阅读数处理的更多相关文章

  1. 通过日志过滤的方法,统计每天内容详情页面的PV数

    1.目的: 每天凌晨0点1分统计用户点击进入内容详情页的次数,对内容点击量形成榜单. 2.分析: A./data/log/epg.access.log日志实时打印用户访问页面的日志,并且每天凌晨0点会 ...

  2. mxonline实战9,我要学习功能块,机构详情展示,收藏功能

    对应github地址:第9天   一. 实现我要学习功能

  3. ZT 感触的屌丝职场记 投递人 itwriter 发布于 2013-05-27 09:21 评论(18) 有3402人阅读 原文链接 [收藏] « »   作者@幻想哥呀幻想哥   有一位屌丝男,从小抱着报效祖国的理想上了大学,毕业后干了 IT 行业,高中那时候看文汇报说,搞 IT 的在上

    屌丝职场记 投递人 itwriter 发布于 2013-05-27 09:21 评论(18) 有3402人阅读  原文链接  [收藏]  « » 作者@幻想哥呀幻想哥 有一位屌丝男,从小抱着报效祖国的 ...

  4. php后台的在控制器中就可以实现阅读数增加

    $smodel=M('Sswz');$smodel->where($map)->setInc('view' ,1);php后台的在控制器中就可以实现阅读数增加前台不需要传值

  5. 使用 Redis 进行阅读数统计并定时持久化

    之前,统计每篇博文的阅读数的方式是经过筛选去重之后直接更新数据库,并发压力直接传导到数据库,假设1秒有1000个并发请求,传统方案会在1秒内并发进行1000次数据库更新操作. 为了降低数据库的并发压力 ...

  6. 21 ~ express ~ 前台内容分类展示

    一,前台 , views/main/index.html ,通过get传送给后台 思路 : 将栏目ID 传递给后台,后台根据 栏目的ID 返回相应的数据   {% if category == '' ...

  7. 20 ~ express ~ 前台内容分页展示

    一,后台路由文件 /router/main.js var express = require('express') var router = express.Router() var Category ...

  8. express-21 静态内容

    静态内容是指应用程序不会基于每个请求而去改变的资源. 多媒体: 图片.视频和音频文件 CSS: JavaScript 二进制下载文件: 这包含所有种类:PDF.压缩文件.安装文件等类似的东西. 借助一 ...

  9. express + jqPaginator 分页展示内容

    写在前面的话 分页展示内容也是我们在页面开发中经常会遇到的需求 前端页面利用jqPaginator这个jquery插件来编写 后端利用mysql存储数据 开始敲代码 回顾sql知识 首先让我们回顾一下 ...

随机推荐

  1. os期末复习

    登记之后会发生两个变化:读者数增加(v操作).座位数减少(p操作) 注销之后会发生的变化:读者数减少(p操作).座位数增加(v操作) 必须要清楚释放的是甚麽,以及申请的是甚麽资源(在具体的题目当中) ...

  2. ios 获取当前系统时间

    1. NSDate + NSDateFormatter NSDate *date = [NSDate date]; NSDateFormatter *format = [[NSDateFormatte ...

  3. Python学习笔记之基础篇(-)python介绍与安装

    Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...

  4. Ubuntu基于Apache为自己的网站开启HTTPS

    暂时放这里链接,之后整理 https://www.deanhan.cn/ubuntu-apache-https.html

  5. 今日份学习: Spring中使用AOP并实现redis缓存?

    笔记 在Spring中如何使用AOP? Spring是如何切换JDK动态代理和CGLIB的? spring.aop.proxy-target-class=true (在下方第二个链接中,原生doc中提 ...

  6. 虚拟机下安装win7

    参考博客:https://blog.csdn.net/weixin_43465312/article/details/92662519 下载地址:https://msdn.itellyou.cn/

  7. Android的事件处理机制之基于监听的事件处理

    无论是桌面应用还是手机应用程序,面对用户的使用,经常需要处理的便是用户的各种动作,也就是需要为用户动作提供响应,这种为用户动作提供响应的机制就是事件处理. 而Android为我们提供了两套强大的响应机 ...

  8. 挖洞经验 | 绕过WAF限制利用php:方法实现OOB-XXE漏洞利用

    几个星期以前,作者在某个OOB-XXE漏洞测试中遇到过这样一种场景:目标应用后端系统WAF防火墙阻挡了包含DNS解析在内的所有出站请求(Outgoing Request),但最终,通过利用php:// ...

  9. prepareBeanFactory方法源码跟踪

    看这篇文章之前可以先了解之前的跟踪流程,https://www.jianshu.com/p/4934233f0ead 代码过宽,可以shift + 鼠标滚轮 左右滑动查看 AbstractApplic ...

  10. idea2018破解到2099年

    破解的详细过程: 1.从下面地址下载一个jar包,名称是 JetbrainsCrack-3.1-release-enc.jar 下载地址链接: https://pan.baidu.com/s/1WU5 ...