node.js博客项目开发手记(2)

// 设置cookie // 只要客户端发送请求就会通过这个中间件 app.use((req, res, next) => { req.cookies = new cookies(req, res); /** * 解析用户的cookies信息 * 查询数据库判断是否为管理员 isAdmin * 注意:查询数据库是异步操作,next应该放在回调里边 */ req.userInfo = {}; if (req.cookies.get("userInfo")) { try { req.userInfo = JSON.parse(req.cookies.get("userInfo")); // 查询数据库判断是否为管理员 User.findById(req.userInfo._id).then(function (result) { req.userInfo.isAdmin = Boolean(result.isAdmin); next(); }); } catch (e) { next(); } } else { next(); } }); // 当用户登录或注册成功之后,可以为其设置cookies req.cookies.set("userInfo",JSON.stringify({ _id:result._id, username:result.username }));

swig模板引擎

1.变量

{{ name }}

2.属性

{{ student.name }}

3.if判断

{ % if name === '郭靖' % }

hello 靖哥哥

{ % endif % }

4.for循环

// arr = [1, 2, 3]

{ % for key, val in arr % }

<p>{ { key } } -- { { val } }</p>

{ % endfor % }

5.set命令

用来设置一个变量,在当前上下文中复用

{% set foo = [0, 1, 2, 3, 4, 5] %}

{% extends 'layout.html' %} // 继承某一个HTML模板
{% include 'page.html' %} // 包含一个模板到当前位置
{% block main %} xxx {% endblock %} //重写某一区块

6.autoescape 自动编码

当想在某个div中显示后端生成的HTML代码,模板渲染时会自动编码,
以字符串的形式显示。通过以下方式,可以避免这个情况:

<div> {% autoescape false %} {{ data.article_content_html }} {% endautoescape %} </div>

用户管理和分页

CRUD用户数据

const User = require('../models/user'); // 查询所有的用户数据 User.find().then(function(users){ }); // 根据某一字段查询数据 User.findOne({ username:username }).then(function(result){ }); // 根据用户ID查询数据 User.findById(id).then(function(user){ }); // 根据ID删除数据 User.remove({ _id: id }).then(function(){ }); // 修改数据 User.update({ _id: id },{ username: name }).then(function(){ });

数据分页管理

两个重要方法

limit(Number): 限制获取的数据条数

skip(Number): 忽略数据的条数 前number条

忽略条数:(当前页 - 1) * 每页显示的条数

// 接收传过来的page let query_page = Number(req.query.page) || 1; query_page = Math.max(query_page, 1); // 限制最小为1 query_page = Math.min(Math.ceil(count / limit), query_page); // 限制最大值 count/limit向上取整 var cur_page = query_page; // 当前页 var limit = 10; // 每页显示的条数 var skip = (cur_page - 1) * limit; //忽略的条数 User.find().limit(limit).skip(skip).then(function(users){ ... // 将当前页 page 传给页面 // 将最大页码 maxPage 传给页面 });

文章的表结构

// 对于content.js var mongoose = require('mongoose'); var contentSch = require('../schemas/contentSch'); module.exports = mongoose.model('Content',contentSch); // contentSch.js module.exports = new mongoose.Schema({ // 关联字段 - 分类的id category:{ // 类型 type:mongoose.Schema.Types.ObjectId, // 引用 ref:'Category' }, // 内容标题 title: String, // 简介 description:{ type: String, default: '' }, // 内容 content:{ type:String, default:'' } }); // 文章查询时关联category字段 Content.find().populate('category').then(contents => { // 那么通过这样的方式,我们就可以找到Content表中的 // 关联信息 content.category.category_name });

MarkDown语法高亮

在HTML中直接使用

<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script> <script src="https://cdn.bootcss.com/marked/0.3.17/marked.min.js"></script> // marked相关配置 marked.setOptions({ renderer: new marked.Renderer(), gfm: true, tables: true, breaks: false, pedantic: false, sanitize: true, smartLists: true, smartypants: false, highlight: function (code) { return hljs.highlightAuto(code).value; } }); // MarkDown语法解析内容预览 $('#bjw-content').on('keyup blur', function () { $('#bjw-previous').html(marked($('#bjw-content').val())); });

node环境中使用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pxxyx.html