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