Keystone是以Express和MongoDB为基础搭建的开源的Node.js CMS和web应用程序平台。css
Keystone在官网上声称:在Node.js中,用Keystone搭建数据驱动的网站、应用程序和API是最容易的。前端
之因此出此狂言,背后仍是有料的,Keystone自带如下功能:node
内置Express.js和MongoDBgit
动态路由github
实用的数据库域类型web
自动生成管理员界面mongodb
基于数据模型的表单处理数据库
会话管理和认证功能npm
我以为keystone最牛逼的地方就是根据你定义的模型自动帮你实现后台管理界面,建立、管理、编辑和删除等,这得省掉不少功夫了。这样实现一个网站只要定义model和写前端代码就行了。json
这应该是前端猴子接外包的一个利器吧。
安装node.js 0.10+
安装mongodb v2.4+
安装yeoman npm install -g yo
安装keystone生成器 npm install -g generator-keystone
建立项目目录mkdir my-keystone
进入项目目录cd my-keystone
生成代码yo keystone
代码生成器会问你几个问题,好比项目名称,是否内置博客、相册和联系表单,是否添加User模型,添加管理员帐户密码
安装依赖npm install
运行项目node keystone
打开http://localhost:3000 在浏览器查看
经过http://localhost:3000/keystone 打开后台管理
var keystone = require('keystone'), Types = keystone.Field.Types; var Post = new keystone.List('Post', { autokey: { path: 'slug', from: 'title', unique: true }, map: { name: 'title' }, defaultSort: '-createdAt' }); Post.add({ title: { type: String, required: true }, state: { type: Types.Select, options: 'draft, published, archived', default: 'draft' }, author: { type: Types.Relationship, ref: 'User' }, createdAt: { type: Date, default: Date.now }, publishedAt: Date, image: { type: Types.CloudinaryImage }, content: { brief: { type: Types.Html, wysiwyg: true, height: 150 }, extended: { type: Types.Html, wysiwyg: true, height: 400 } } }); Post.defaultColumns = 'title, state|20%, author, publishedAt|15%' Post.register();
这是官网中给出的例子,一个文章的model,详情
不得不提一下,keystone的图片类型是Types.CloudinaryImage
,须要购买CloudinaryImage的服务,若是你不想用Cloudinary的服务的话,keystone还提供了Types.LocalFile
,这样咱们就能够把image改为:
image: { type: Types.LocalFile, dest: 'public/upload', prefix: '/upload', format: function(item, file){ return '<img src="'+file.href+'" style="max-width: 120px">'; } }
这里format
是指针对后台管理用的
若是你想使用CDN服务的话,能够对图片文件夹进行了CDN同步,而后修改prefix
为你的CDN提供商提供的前缀。
路由配置文件:routes/index.js
中间件:routes/middleware.js
var keystone = require('keystone'), middleware = require('./middleware'), importRoutes = keystone.importer(__dirname); // 经常使用中间件 keystone.pre('routes', middleware.initErrorHandlers); keystone.pre('routes', middleware.initLocals); keystone.pre('render', middleware.flashMessages); // 处理404错误 keystone.set('404', function(req, res, next) { res.notfound(); }); // 处理其它错误 keystone.set('500', function(err, req, res, next) { var title, message; if (err instanceof Error) { message = err.message; err = err.stack; } res.err(err, title, message); }); // 加载路由 var routes = { views: importRoutes('./views') }; // 绑定路由 exports = module.exports = function(app) { app.get('/', routes.views.index); // 在路由以前,经过中间件作任何事情 app.get('/protected', middleware.requireUser, middleware.other, routes.views.protected); }
keystone提供了不少可配置项,你能够为所欲为地根据本身的需求配置,要了解Keystone支持的更多选项,请参见配置指南。
配置须要修改的文件是keystone.js
|--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的项目配置 |--keystone.js | 启动程序的主脚本
keystone强大的自动生成的管理后台,也是给我使用限制的地方,支持增删改查、上传文件等基础功能,可是在一些业务定制下却有失灵活性,或许是我研究不透,目前官方也没有给出对后台管理定制的文档,后续我将研究下如何深度定制管理后台,若是可行的话再来分享。
中文文档:http://keystonejs.com/zh/docs/
项目地址:https://github.com/keystonejs/keystone