基于express+mongodb+pug的博客系统——后台篇

上一篇介绍了模板引擎pug.js的用法,这一篇就主要写后台逻辑了。

后台的大部分的功能都有了,只是在已经登录的状态下,前台和后台的逻辑处理还不是很完善。

先上几张图吧,仿旧版的简书,改了下UI,因为没有简书那么多内容,所以没必要完全做成一样的。

1.项目结构

app.js 是整个工程的入口

model 文件夹放连接数据库的逻辑

public 文件夹里全是静态资源

router 文件夹是各个模块的路由文件,route.js是总入口

upload 里是上传的图像文件

views 里全是模板,layout.pug是最外层的框架模板,componentspages里则分别是公共组件和各个页面的模板。

2.app.js

app.js代码:

app.js是整个工程的入口,这里没什么问题,里面的模板引擎配置和静态文件项配置在文档里都有说明。需要注意的是静态文件设置这里,最好使用path.join,因为我按照上面设置模板引擎的写法去写,始终会报错,找不到对应的文件。

3.router

在这个文件夹里全是路由的相关配置

route.js

articleList.js

router部分被我根据业务相关,划分成了登录、文章、管理三个部分。每个部分都会把他们相关的请求逻辑写在一个js文件里,然后在最下面暴露出router接口,最后在route.js中统一分发处理。

在router.js里,会把所有的路由都挂在app这个对象上,然后暴露app,以便在入口文件app.js中使用。

另外在这里还用到了session来进行登录状态的保存处理,可以使用req.session.xxx来获取或者新建并保存一个属性。

这里唯一存在的问题就是在设置了maxAge之后,不管中途有没有操作页面,只要时间到了,都会清除掉cookie,不能做到只要页面活跃时,cookie就不会过期。不知道是不是我哪设置的有问题。

login.js

登录逻辑做的比较简单,仅仅是获取前台传过来的值,然后与数据库里的值做对比,并没有做有效性校验和加密处理等,在实际的项目中都应该加上的。

这里还用到了POST请求,对于POST请求,还需要单独引入body-parser这个中间件,才能对POST传入的值进行获取处理。

4.model

model部分主要是负责连接数据库,获取并返回值。

connect.js

connect.js文件主要负责连接数据库,并且将db对象暴露出去,这样在其他需要的地方可以直接引用,而不用再次进行连接操作。

article_list.js文件代码比较多,直接复制过来。

var mongoose = require(‘mongoose‘);

// 定义Schema
var articleSchema = new mongoose.Schema({
  author: String,
  createtime: String,
  updatetime: String,
  type: String,
  label: String,
  title: String,
  description: String,
  content: String,
  text: String,
  delta: Object,
  pv: Number,
  likes: Number,
  image: String
})
// 存入数据库之前的操作
articleSchema.pre(‘save‘, function (next) {
  var date = new Date();
  if (this.isNew) {
    this.updatetime = this.createtime = date.getFullYear() + ‘-‘ + (date.getMonth() + 1) + ‘-‘ + date.getDate();
  } else {
    this.updatetime = date.getFullYear() + ‘-‘ + (date.getMonth() + 1) + ‘-‘ + date.getDate();
  }
  next()
});
// 定义model,关联相关的表
var articleModel = mongoose.model(‘article_list‘, articleSchema);

function findArticle(option, callback) {
  articleModel.find(option, function (err, result) {
    if (err) console.log(err);
    // 渲染模板
    var data = {
      articleLists: result
    };

    callback(data)
  })
}

// 渲染文章列表
var renderArticleList = function (articleType, callback) {
  switch (articleType) {
    case ‘all‘: findArticle({}, callback)
      break;
    case ‘novel‘: findArticle({ type: ‘小说‘ }, callback)
      break;
    case ‘it‘: findArticle({ type: ‘编程‘ }, callback)
      break;
    default: res.send(‘暂时没有!‘)
  }
};

// 渲染文章详情
var renderArticle = function (articleId, callback) {
  var articleId = mongoose.mongo.ObjectId(articleId)
  articleModel.find({ _id: articleId }, function (err, result) {
    if (err) console.log(err);

    callback(result[0])
  })
}

// 喜欢数增加
var addLike = function (req, res) {

}

// 文章管理列表分页获取数据
var renderManage = function (opt, callback) {
  var currentSize = (opt.currentPage - 1) * opt.pageSize;
  articleModel.find({}, function (err, result) {
    var data = {
      articleLists: result
    };
    callback(result)
  }).skip(currentSize).limit(opt.pageSize)
}
// 文章管理列表获取总数
var getLength = function (callback) {
  articleModel.find({}, function (err, result) {
    callback(result.length)
  })
}

// 文章编辑保存
var saveArticle = function (article_opt, callback) {
  var newArticle = new articleModel(article_opt);
  if (article_opt.params_id) {
    var _id = article_opt.params_id
    articleModel.findOneAndUpdate({ _id: _id }, article_opt, function (err, result) {
      callback(result._id)
    })
  } else {
    newArticle.save(function (err, result) {
      callback(result._id)
    })
  }
}

// 文章删除
var deleteArticle = function (articleId, callback) {
  articleModel.remove({_id: articleId}, function (err, result) {
    console.log(result)
    callback()
  })
}

var modelHome = {
  renderArticleList: renderArticleList,
  renderArticle: renderArticle,
  renderManage: renderManage,
  getLength: getLength,
  saveArticle: saveArticle,
  deleteArticle: deleteArticle
};

module.exports = modelHome;

凡是涉及到article_lists这个表的逻辑,都会写在article_list.js里,不过这里应该是可以优化的,因为这里应该只处理model部分,而不应该有逻辑操作部分。

在使用mongoose这个库连接mongoDB的时候需要注意,在定义model,关联相关的表的时候, var articleModel = mongoose.model(‘article_list‘, articleSchema); 这里的article_list对应的是你数据库里的表article_lists,数据库里的表要多一个s。

在编辑文章的时候,除了新建文章之外,还可以直接修改已有的文章,所以这就涉及到数据的插值和更新,如果使用原生的mongoDB方法,可以很简单的通过save()方法来实现,但是在mongoose中却不行,mongoose中的save()方法和原生的insert()基本相同。

所以使用mongoose的时候需要分两步,更新值使用findOneAndUpdate(),新建使用save()方法。

结语:

在这个版本里,还有一些功能没有做,比如点赞之类,但大的功能都有了,不过剩下的我并不打算再写了,再写的时候肯定是重构了。

原因是写到这里,自己能发现很多地方可以优化,还有最重要的一点是,express是一个轻量级的框架,他很灵活,但是很多东西需要借助第三方插件或者库,这就给人带来了很多麻烦。

第三方库良莠不齐,在最初的选择上面,你需要花很多功夫,选好了之后,你还得挨个去了解学习,挨个去踩坑,这都是很麻烦的事,所以并不建议大家直接在公司的重要项目里直接使用express这个框架。

当然如果只是一些比较简单的页面,比如活动页或者一些不设计太多前后台逻辑交互的页面,还是可以使用express的,因为它真的很简单,你不需要会先去把es6搞明白,也不需要把node完全弄清楚。

只需要简单的看看express官网吗,就能很快上手做出一个具有前后台交互的东西出来。

时间: 2024-11-03 03:25:07

基于express+mongodb+pug的博客系统——后台篇的相关文章

NodeJS+Express+MongoDB 简单个人博客系统【Study笔记】

Blog 个人博客系统 iBlog是在学习NodeJs时候一个练手项目Demo 系统支持用户注册/登录,内容文章查看,评论,后台管理(定制显示的分类版块,进行文章内容添加)超级管理员还可进行用户管理等 目前只是做了一个比较粗糙的版本,跑通主线模块及部分功能 //通过这个个人练手项目的完成,算是对NodeJs 结合Express 进行Web开发有了一定的认识和理解,路漫漫...还有很多需要去Do 系统还存在很多不稳定及大刀修改的地方[大虾勿喷勿笑] 比较适合刚接触NodeJs 这块的同学,可以当做

基于Spring Boot技术栈 博客系统企业级前后端实战 渐进式讲解+Thymeleaf+Elasticsearch+多种数据库

第1章 Spring Boot 简介讲解Spring Boot的项目背景,已经与其他技术框架(比如,Spring.SpringMVC.SpringCloud等)的关系.简单介绍下Spring Boot 整个生态系统1-1 _Spring Boot博客_课程导学1-2 -Spring Boot 是什么 第2章 开启 Spring Boot 的第一个 Web 项目通过 Spring Initializr 来快速初始化一个 Spring Boot 原型,方便学员来极速体验Spring Boot.本课程

基于React服务器端渲染的博客系统

系统目录及源码由此进入 目录 1. 开发前准备 1.1 技术选型1.2 整体设计1.3 构建开发 2. 技术点 2.1 react2.2 redux, react-router2.3 server-render 3. 总结 正文 1. 开发前准备 1. 1 技术选型 对于个人的博客系统而言,服务器计算能力往往不是需要考虑,而其中的 I/O 操作是比较复杂的,同理对前端的交互要求也是较高的,所以这次主要还是围绕 Node系 ,React系 框架进行开发.对于 2016 年后的互联网产品, Reac

基于CrossApp引擎和ghost博客系统的APP

技多不压身,即使没有用,也能装个逼. 开发这款APP,其实并不是给别人用的,更多的是给自己用.一直以来都是为APP开发数据接口,对APP开发并不了解,只知道业务需求需要什么数据,我提供什么接口来调取数据.如果止步如此,对技术的提升是没有帮助的. APP并不难,但也不简单,这款APP从学习CrossApp引擎到APP完成,总花掉了12天时间.并且还未对android适配调整,不过我也不打算适配了.android虚拟机实在太卡,还时不时的不响应(人生哲学:自身的发展,受限于当时环境影响). Cros

搭建Ghost 基于Node.js的开源博客系统

 安装MySQL # 安装MySql $ apt-get update # 更新组件 $ apt-get install mysql-server mysql-client -y # 快速安装-y代表默认选择y省去了回车,这时只需要设置mysql的root密码 # 设置mysql的编码 $ sudo vi /etc/mysql/mysql.cnf # 搜索到[mysqld] 插入collation-server = utf8_unicode_ci init-connect = 'SET NA

一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统

原文地址: http://www.cnblogs.com/daxnet/p/6139317.html 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为“希赛网”)个人空间发布过一些与编程和开发相关的文章.从入行到现在,我至始至终乐于与网友分享自己的所学所得,希望会有更多的同我一样的业内朋友能够在事业上取得成功,也算是为我们的软件事业贡献自己的一份力量吧,这也是我在博客园建博客

基于Microsoft Azure、ASP.NET Core和Docker的博客系统

欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网")个人空间发布过一些与编程和开发相关的文章.从入行到现在,我至始至终乐于与网友分享自己的所学所得,希望会有更多的同我一样的业内朋友能够在事业上取得成功,也算是为我们的软件事业贡献自己的一份力

Asp.net博客系统收集和简单介绍

国内Asp.net博客系统收集和简单介绍 [转载文章,仅供个人参考,引自http://www.soyaoo.com/Blog/post/92.html] 1.ZJ-Blog程序简介:基于ASP.net 1.1环境开发的单用户博客程序,支持Access和MySQL两种数据库,其最大的特点是采用.net开发并大量的使用了Ajax技术,本人还没用使用过此程序但是直觉上觉得大量应用Ajax也未必是一件好事,个人觉得给用户适当的体验或许更能引起用户的兴趣.当然用户其实最关心的并非是这些技术问题,而是程序的

基于NodeJS+Express+mongoDB+Bootstrap的全栈式工程化开发前后端分离博客系统实战

课程目标本课程通过一个完整的项目,让学员了解如何使用Jade+Node.js+Express+mongoDB+Bower+Gulp+Yeoman的组合开发Web应用.可以让学员更深入地掌握Node.js和Express技术. 适用人群node.js程序员,express程序员,JAVAscript程序员 课程简介本系统是一款博客系统,拥有博客必要的功能,如用户注册.用户登录.用户退出.文章列表,文章查看.添加文章,删除文章,修改文章.文章搜索.后台权限控制等. -----------------