基于nodeJS的CMS内容管理系统keystone

现在前端搭建一个CMS有很多选择,可以用php,不过听说php马上也考虑使用vue了。基于php的有wordpress,typora等,都是很成熟的cms。
其它的还有静态博客,如hexo,jekyll,敲一敲命令,就可以部署到github或者阿里云上面。

当然我们可以选择node来作为我们开发的动力,这里又有很多开源的基于node的CMS可以选择了

1 node的框架

express
koa
thinkjs 360开发的node框架,有点类似thinkphp 可以直接写async和awaite 支持ts
sails.js
阿里的egg
hapi

今天我们要讲的是keystone,仓库在这里 https://github.com/keystonejs/keystone

官网在这里 http://keystonejs.com/

2 好看的demo

http://www.sydjs.com/http://makeandbuild.com/

3 安装

  1. 首先安装node和mongodb
  2. 安装keystone-generaotr
    npm install -g generator-keystone
  3. 安装yeoman
    npm install -g yeoman
  4. 创建新目录
    mkdir test
    cd test
  5. 生成
    yo keystone
  6. 启动
    node keystone
    打开浏览器的3000端口你就可以看到你的项目了

4 目录结构

|--lib
|  定制的库和代码
|--models
|  程序的数据库模型
|--public
|  公开的静态文件 (css、js、images等)
|--routes
|  |--api
|  |  程序的api控制器
|  |--views
|  |  程序的视图控制器
|  |--index.js
|  |  初始化程序的路由和视图
|  |--middleware.js
|  |  为路由定制的中间件
|--templates
|  |--includes
|  |  通用的 .jade 组件放这里
|  |--layouts
|  |  基础 .jade 布局放这里
|  |--mixins
|  |  通用的 .jade mixins放这里
|  |--views
|  |  程序的视图模板
|--updates
|  数据组装和迁移脚本
|--package.json
|  给npm的项目配置
|--web.js
|  启动程序的主脚本

5 设置参数

如果你学过express 那么这些参数都很简单

有3种方式配置keystone的参数

  1. keystone.init( object )
  2. keystone.set(key, object)
  3. 在.env环境中配置 仅有部分配置项支持

env参数 影响缓存已编译模板
views 放程序视图模板的路径

5.1 设置模板引擎

'views': 'templates/views',
	'view engine': '.hbs',
	'custom engine': handlebars.create({
		layoutsDir: 'templates/views/layouts',
		partialsDir: 'templates/views/partials',
		defaultLayout: 'default',
		helpers: new require('./templates/views/helpers')(),
		extname: '.hbs',
	}).engine,

5.2 mongodb的设置

如果你的Mongodb在阿里云上或者在其他主机上,需要自定义,因为默认是localhost
MONGO_URI=mongodb://your-server/database-name

5.3 https服务器参数

可以选用nginx或者node提供的https服务器
如果选择keystone提供额,需要设置下面的参数
ssl
ssl key 指向SSL秘钥的路径
ssl cert 指向ssl证书的路径
ssl port 启动ssl服务器的端口,默认为3001

5.4 配置文件.env不要上传到你的代码仓库

mongo process.env.MONGO_URI || "mongodb://localhost/your-db"

5.5 配置管理界面参数 - 富文本编辑器

wysiwyg 所见即所得

keystone.set('wysiwyg additional options', {
    external_plugins: {
        'image':'http://bhaltair.oss-cn-shanghai.aliyuncs.com/tinyMCE/plugins/image/plugin.min.js'
    },
	selector: "textarea",  // change this value according to your HTML
	plugin: 'textpattern',
	textpattern_patterns: [
		{start: '*', end: '*', format: 'italic'},
		{start: '**', end: '**', format: 'bold'},
		{start: '#', format: 'h1'},
		{start: '##', format: 'h2'},
		{start: '###', format: 'h3'},
		{start: '####', format: 'h4'},
		{start: '#####', format: 'h5'},
		{start: '######', format: 'h6'},
		{start: '1. ', cmd: 'InsertOrderedList'},
		{start: '* ', cmd: 'InsertUnorderedList'},
		{start: '- ', cmd: 'InsertUnorderedList'}
	]	
	
})

5.6 用户认证参数

cookie secret 浏览器cookies的加密秘钥,最好设为一个长长的随机字符串
session store 默认存在内存中,你可以设置为mongo 或者conncet-redis

6 使用pm2部署你的本地应用的远程服务器

设置你的云服务器和github的ssl登录
设置你本地主机到你的云服务器的ssl登录
配置pm2的.echosystem.config.js
pm2 deploy