index.js 10.5 KB
/**
 * guang controller
 * @author: lcy<chuanyang.liu@yoho.cn>
 * @date: 2016/08/31
 */

'use strict';

const _ = require('lodash');

const guangModel = require('../models/index');
const headerModel = require('../../../doraemon/models/header');
const cookie = global.yoho.cookie;
const ghelper = require('../models/guang-helper');

/**
 * 首页文章列表 类型列表
 */
exports.index = (req, res, next) => {

    let channel = req.yoho.channel;
    let page = req.query.page || 1;
    let pageSize = req.query.pageSize || 20;
    let type = req.query.type || 0;

    let pathNav = guangModel.getPathNav(channel);
    let uid = cookie.getUid(req);
    let udid = ghelper.getUdid(req);
    let gender = ghelper.getGenderByCookie(req);

    Object.assign(res.locals, {
        page: 'guang'
    });

    Promise.all([
        guangModel.getBanner(channel),
        guangModel.getCategory(type),
        guangModel.getArticleList(gender, type, uid, udid, page, '', '', pageSize),
        guangModel.getHotTags(page, pageSize),
        guangModel.getAds(channel),
        guangModel.getTjArticles(gender, 1, 10),
        headerModel.requestHeaderData(channel)
    ]).then(ret => {
        res.render('index', {
            guang: {
                slider: ret[0],
                msgTypes: ret[1],
                msgs: (ret[2] && ret[2].msgs) || ret[2],
                hotTags: ret[3],
                ads: ret[4],
                exRecos: ret[5],

                guangIndexPage: true,
                pageSize: pageSize,
                type: type,
                pathNav: pathNav,
                page: page,
                total: (ret[2] && ret[2].total) || 0
            },
            headerData: ret[6]['headerData'] || ret[6]
        });
    }).catch(next);

};

/**
 * 制定 tag 的文章列表
 */
exports.tags = (req, res, next) => {

    let query = req.query.query;
    let page = req.query.page || 1;
    let pageSize = req.query.pageSize || 20;
    let type = req.query.type || 0;

    let uid = cookie.getUid(req);
    let udid = ghelper.getUdid(req);
    let gender = ghelper.getGenderByCookie(req);
    let channel = req.yoho.channel;
    let pathNav = guangModel.getPathNav(channel, query);

    // $this->setWebNavHeader();
    // $this->setTitle($query, true);

    Promise.all([
        guangModel.getBanner(channel),

        // guangModel.getCategory(type),
        guangModel.getArticleList(gender, 0, uid, udid, page, query, '', pageSize),
        guangModel.getHotTags(1, 20),
        guangModel.getAds(channel),
        guangModel.getTjArticles(gender, 1, 10),
        headerModel.requestHeaderData(channel)
    ]).then(ret => {
        res.render('tag', {
            guang: {
                slider: ret[0],

                // msgTypes: ret[1],
                msgs: (ret[1] && ret[1].msgs) || ret[1],
                hotTags: ret[2],
                ads: ret[3],
                exRecos: ret[4],

                tag: query,
                guangIndexPage: true,
                pageSize: pageSize,
                type: type,
                pathNav: pathNav,
                page: page,
                total: (ret[1] && ret[1].total) || 0
            },
            headerData: ret[5]['headerData'] || ret[5]
        });
    }).catch(next);
};

/**
 * 作者文章列表
 */
exports.editor = (req, res, next) => {

    let authorId = req.query.author_id;
    let channel = req.yoho.channel;
    let gender = ghelper.getGenderByCookie(req);

    let uid = cookie.getUid(req);
    let udid = ghelper.getUdid(req);

    let pathNav = guangModel.getPathNav(channel);

    Object.assign(res.locals, {
        page: 'editor'
    });

    // $this->setWebNavHeader();
    // 设置标签页标题
    // $authorName = $author['data']['name'];
    // $this->setTitle($authorName, true, '');

    let page = req.query.page || 1;
    let pageSize = req.query.pageSize || 20;

    Promise.all([
        guangModel.getAuthor(authorId),
        guangModel.getArticleList(gender, null, uid, udid, page, '', authorId, pageSize),
        guangModel.getHotTags(1, 20),
        guangModel.getAds(channel),
        guangModel.getTjArticles(gender, 1, 10),
        headerModel.requestHeaderData(channel)
    ]).then(ret => {
        res.render('editor', {
            guang: {
                editor: {
                    avatar: ret[0] && ret[0]['avatar'],
                    name: ret[0] && ret[0]['name'],
                    intro: ret[0] && ret[0]['author_desc'],
                    info: '设计理念:时尚,线条流畅'
                },
                msgs: (ret[1] && ret[1].msgs) || ret[1],
                hotTags: ret[2],
                ads: ret[3],
                exRecos: ret[4],

                gender: gender,
                pageSize: pageSize,
                pathNav: pathNav,
                page: page,
                total: (ret[1] && ret[1].total) || 0
            },
            guangList: true,
            guangListPage: true,
            headerData: ret[5]['headerData'] || ret[5]
        });
    }).catch(next);
};

/**
 * 文章详情
 */
exports.detail = (req, res, next) => {

    let id = req.params.id || req.query.id;
    let page = req.query.page || 1;
    let pageSize = req.query.pageSize || 20;
    let col = req.query.col || 0;
    let pjax = req.query._pjax;
    let uid = cookie.getUid(req);
    let udid = ghelper.getUdid(req);
    let gender = ghelper.getGenderByCookie(req);
    let channel = req.yoho.channel;

    if (!_.isNumber(id)) {
        //return next(new Error('文章不存在!'));
        //return next();
        id = parseInt(id);
    }

    // $id = $this->param('id','');
    // $id = 34374;
    // if(empty($id)) {
    //     $id = $this->get('id');
    // }
    // $page = $this->get('page', 1);//评论分页
    // $col = $this->get('col', 0);//收藏
    // $pjax = $this->get("_pjax");
    // $limit = 20; //评论每页显示条数

    if(pjax) {
        return guangModel.getArticleComments(id, page, pageSize).then(res => {
            return res.render('comment', res);
        });
    }

    // if ($pjax) {
    //     $this->_view->display('comment', InfoModel::commentList($id, $page, $limit));
    //     exit;
    // }
    // $uid = $this->getUid();
    // $udid = $this->getUdid();
    //登陆后自动收藏
    if (col == 1 && uid > 0) {
        guangModel.collectArticle(id, uid);
    }
    // $gender = Helpers::getGenderByCookie();
    // $channel = Helpers::getChannelNameByCookie();

    guangModel.getArticleInfo(id).then(info => {

        // 判断参数是否有效, 无效会跳转到错误页面
        if (!info || !info.title) {
            return new Error('文章不存在');
        }

        console.log(info);

        let promises = [
            headerModel.requestHeaderData(channel),
            guangModel.getArticleContent(id),
            guangModel.getHotTags(1, 20),
            guangModel.getArticleComments(id, page, pageSize),
            guangModel.getArticleBaseInfo(id, uid, udid),
            guangModel.getArticleRelateBrand(id),
            guangModel.getTjArticles(gender, 1, 10),
            guangModel.getAds(channel)
        ];

        if (info.author_id) {
            promises.push(guangModel.getAuthor(info.author_id));
        } else {
            promises.push({});
        }

        if (info.tag) {
            promises.push(guangModel.getRelateArticleList(id, info.tag, 2));
        } else {
            promises.push({});
        }

        let pathNav = guangModel.getPathNav(channel, info.article_title);

        Promise.all(promises).then(ret => {

            res.render('detail', {
                guangDetailPage : true,
                pathNav : pathNav,
                headerData: ret[1]['headerData'] || ret[1],
                guang : {
                    id : id,
                    header : Object.assign({}, info, info.authorId && ret[8] || {}, { commentNum : ret[3].commentNum }),
                    content : ret[1],
                    hotTags : ret[2],
                    comment : ret[3],
                    commentInfo : req.session['comment_' + udid],   //$this->getSession('comment_'.$udid)
                    userInfo : ret[4],
                    brands : ret[5],
                    
                    tag : info.tags,
                    relatedPost : ret[9],
                    exRecos : ret[6],
                    ads : ret[7],
                    //分享
                    shareImg : info.shareImg,
                    sharedTitle : info.title,
                    shareDesc : info.desc,
                    weixinUrl : info.weixinUrl
                }
            });
        }).catch(next);
    });

    // $data = array(
    //     'guangDetailPage' => true,
    //     'pathNav' => $info['pathNav'],
    //     'guang' => array(
    //         'id' => $id,
    //         'header' => isset($info['header']) ? $info['header']: array(),
    //         'content' => isset($info['content']) ? $info['content'] : array(),
    //         'brands' => isset($info['brands']) ? $info['brands'] : array(),
    //         'userInfo' => isset($info['userInfo']) ? $info['userInfo'] : array(),
    //         'tag' => isset($info['tag']) ? $info['tag'] : array(),
    //         //分享
    //         'shareImg' => $info['header']['shareImg'],
    //         'sharedTitle' => $info['header']['title'],
    //         'shareDesc' => $info['header']['desc'],
    //         'weixinUrl' => $info['header']['weixinUrl'],
    //         'relatedPost' => isset($info['relatedPost']) ? $info['relatedPost'] : array(),
    //         'commentInfo' => $this->getSession('comment_'.$udid),
    //         'comment' => isset($info['comment']) ? $info['comment'] : array(),
    //         'exRecos' => isset($info['exRecos']) ? $info['exRecos'] : array(),
    //         'hotTags' => isset($info['hotTags']) ? $info['hotTags'] : array(),
    //         'ads' => IndexModel::getAds($channel),
    //     )
    // );
    // $this->setTitle($info['header']['title'].' | YOHO!BUY有货 | 年轻人潮流购物中心,中国潮流购物风向标,官方授权正品保证');
    // $this->setKeywords('Yoho! 有货,潮流,时尚,流行,购物,B2C,正品,购物网站,网上购物,货到付款,品牌服饰,男士护肤,黑框眼镜,匡威,板鞋,i.t,izzue,5cm,eastpak,vans,lylescott,g-shock,new balance,lacoste,melissa,casio,卡西欧手表,舒雅,jasonwood,odm,AAAA,香港购物,日本潮流');
    // $this->setDescription('潮流商品搜索,上衣,衬衫,TEE,卫衣,冲锋衣,风衣,羽绒服,裤子,休闲鞋,板鞋,配饰,复古眼镜');
    // $this->setWebNavHeader($channel);
    // $this->_view->display('info', $data);
};