keystonejs试手

简介


  • keystonejs是一款数据库驱动的基于Express和MongoDB开发的node框架。keystonejs可以被理解成是一款cms。keystonejs之于nodejs,等同于wordpress之于php。
  • MyKeystonejs是本人为了学习nodejs而搭建的基于keystonejs的站点,该网站主要展示的自己爬取的电影评分及片源,前端展示用keystone默认jade模板,后端数据库对接MongoDB。站点链接
相关站点
keystone管理端
keystone管理端
  • 鉴于keystonejs API文档尚不完善,一些功能的实现需要参考官方代码进行学习。本代码里包含了分页,分类,简单搜索等基本功能,供大家参考,以下是关键几个文件。点击github链接

movie.js(路由文件)

var keystone = require('keystone');
exports = module.exports = function(req, res) {
    var view = new keystone.View(req, res);
    var locals = res.locals;
    
    locals.section = 'movie';
    var theUrl=req.url.split("?")[0];
    
    locals.filters = {
        cate: req.params.cate,
        path: theUrl,
        search_word: req.query.search_word,
    };

    locals.data = {
        movies: [],
    };


     
    view.on('init', function(next) {
 
        if (req.method == 'POST'&&req.body.search_word) {
            return res.redirect(theUrl+"?search_word="+req.body.search_word);
        }


        var q = keystone.list('Movie').paginate({
            page: req.query.page || 1,
            perPage: 10,
            maxPages: 10,
        })
        if (req.params.cate) {
            switch(req.params.cate)
            {
                case "1":
                    q.where('is_hd',1).where('is_good',1)
                    break;
                case "2":
                    q.where("is_hd",0).where('is_good',1)
                    break;
                case "3":
                    q.where('is_good',0)
                    break;
                default:
                    q.where('is_good').in([0,1])
                    break;
            }
        }else{
            q.where('is_good').in([0,1])
        }
        if(req.query.search_word) {
            var regex = new RegExp(req.query.search_word,'i');
            q.where('name',regex);
        }

        q.sort('-update_time')


        q.exec(function (err, results) {
            // console.log(results);
            locals.data.movies = results;
            next(err);
        });
    }); 
    // Render the view
    view.render('movie');
    
};

Movie.js(model文件)

var keystone = require('keystone');
var Types = keystone.Field.Types;;
  
var Movie = new keystone.List('Movie',{
    nocreate: true,
    track:{
        updatedAt:"update_time",
    }
});

Movie.set('perPage', 10);

Movie.add({
    name: { type: String, required: true ,label:"名称"},
    other_name:{type: String,label:"别称"},
    audience_num: { type: Number ,label:"评分人数"},
    grade: { type: Number ,label:"评分"},
    download_page_url:{ type: Types.Url ,label:"下载地址"},
    show_year: { type: Number ,label:"上映年份"},
    publish_date:{ type: Date ,label:"资源发布日期",format:'YYYY-MM-DD'},
    desc:{ type: Types.Html ,label:"描述"},
    douban_url:{ type: Types.Url ,label:"豆瓣地址"},
    pic_url:{
        type: Types.Url,label:"配图",
    },
    create_time:{ type: Types.Datetime,noedit:true,label:"创建时间",format:'YYYY-MM-DD HH:mm:ss' },
    update_time:{ type: Types.Datetime,noedit:true,label:"更新时间",format:'YYYY-MM-DD HH:mm:ss' },
    is_hd:{
        label:"清晰程度",
        type: Types.Select, numeric: true, options: [{ value: 1, label: '清晰' }, { value: 0, label: '非清晰' }]
    },
    is_seen:{
        label:"看过没",
        type: Types.Select, numeric: true, options: [{ value: 1, label: '看过' }, { value: 0, label: '没看过' }]
    },
    is_good:{
        label:"推荐程度",
        type: Types.Select, numeric: true, options: [{ value: 0, label: '有待考证' }, { value: 1, label: '值得观看' }, { value: 2, label: '不推荐观看' }]
    },

    staff:{type:String,label:"参演阵容"},
});

Movie.defaultColumns = 'name,grade, audience_num,is_good,is_hd,is_seen,douban_url,download_page_url, show_year,publish_date,create_time,update_time';
Movie.defaultSort = '-update_time';
Movie.register();

movie.jade(jade前端模板文件)

extends ../layouts/default

block intro
    .container
        .col-sm-12
            h1 电影
            h4 2016-10-01以后发布的片源
    
block content
    .container
        // cate
        //h1=filters.path
        //h2=filters.url
        .col-sm-2
            .list-group(style='')
                a(href='/movie', class=!filters.cate ? 'active' : false).list-group-item 全部
                a(href='/movie/1', class=filters.cate==1 ? 'active' : false).list-group-item 评分好+片源清晰
                a(href='/movie/2', class=filters.cate==2 ? 'active' : false).list-group-item 评分好+片源暂不清晰(不断更新)
                a(href='/movie/3', class=filters.cate==3 ? 'active' : false).list-group-item 评分有待考证
        .col-sm-offset-2.col-sm-6
            form(action='/movie',method='post')
                .input-group
                    input(type="text",class="form-control",name="search_word", value="")
                    span.input-group-btn.actions
                        button(class="btn btn-default", type="submit") 搜索
        if data.movies.results.length
            // movie list
            .container.col-sm-10
                // page head
                .col-sm-12
                    if data.movies.totalPages > 1
                        h4.text-weight-normal
                            |  搜到  
                            strong #{data.movies.total}
                            |  部电影,当前页为第 
                            strong #{data.movies.first}
                            |  部到第 
                            strong #{data.movies.last}
                            |  部
                            
                    else
                        h4.text-weight-normal 
                            | 搜到 
                            strong #{data.movies.results.length} 
                            | 部电影
                // movie part
                .movie-list.col-sm-12
                    each movie in data.movies.results
                        .row.movie-info
                            .col-sm-2.col-sm-offset-0.col-xs-6.col-xs-offset-3
                                img(src=movie.pic_url).img-rounded
                            .col-sm-10.col-xs-12
                                h4= movie.name+'——'+movie.show_year
                                .pull-left
                                    b='豆瓣评分:'+movie.grade
                                    span     
                                    b="评分人数:"+movie.audience_num
                                .pull-right
                                    case movie.is_hd
                                        when 0
                                            b.red 暂无清晰片源
                                        when 1
                                            b.red 清晰片源
                                p.clear
                                    //html
                                    !="<b>剧情简介</b><br>"+movie.desc+"<br><b>演员阵容</b><br>"+movie.staff
                                p
                                    if movie.is_good==0
                                        b.red 建议:电影评分有待考证,暂不推荐。
                                    else if movie.is_good==1
                                        if movie.is_hd==1
                                            b.red 建议:该电影评分较好,且有清晰片源,推荐下载观看。
                                        else
                                            b.red 建议:该电影评分较好,但尚无清晰片源,可根据自身需求下载观看。
                                    else
                                        b.red 建议:评分较低,可根据自身需求下载观看。
                                .pull-left
                                    a(href=movie.douban_url,target="_blank") 豆瓣地址
                                    span     
                                    a(href=movie.download_page_url,target="_blank") 下载地址(请确保本机有迅雷下载工具)
                                .pull-right.text-muted= "资源发布日期:"+movie._.publish_date.format('YYYY-MM-DD')

            
            // page tail
            if data.movies.totalPages > 1
                .col-sm-8.col-sm-offset-4
                    ul.pagination(style="")

                        - var theUrl=filters.path+"?";
                        - if(filters.search_word) {
                        -   theUrl=filters.path+"?search_word="+filters.search_word+"&"
                        - }
                        
                        if data.movies.previous
                            li: a(href=theUrl+'page=' + data.movies.previous ): span.glyphicon.glyphicon-chevron-left
                        else
                            li.disabled: a(href=theUrl+'page=' + 1): span.glyphicon.glyphicon-chevron-left
                        each p, i in data.movies.pages
                            li(class=data.movies.currentPage == p ? 'active' : null)
                                a(href=theUrl+'page=' + (p == '...' ? (i ? data.movies.totalPages : 1) : p ) )= p
                        if data.movies.next
                            li: a(href=theUrl+'page=' + data.movies.next): span.glyphicon.glyphicon-chevron-right
                        else
                            li.disabled: a(href=theUrl+'page=' + data.movies.totalPages): span.entypo.glyphicon.glyphicon-chevron-right
        else
            h3.col-sm-6.col-sm-offset-3.text-muted 未搜到相关电影。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现...
    茶艺瑶阅读 3,603评论 1 7
  • 可能是有感而发吧,亦或者是从众心理。 不知道怎么了,就突然想起来要记录自己的日常了。我不清楚自己能不能坚持的下去,...
    流量小哥阅读 161评论 0 0