info.js 12.2 KB
/**
 * 逛详情页
 * @author: chenfeng<feng.chen@yoho.cn>
 * @date: 2016/09/07
 */
'use strict';
const helpers = global.yoho.helpers;
const mRoot = '../models';
const infoModel = require(`${mRoot}/info`);
const stringProcess = require(`${global.utils}/string-process`);
const guangProcess = require(`${global.utils}/guang-process`);
const productDetailModel = require('../../product/models/detail');
const headerModel = require('../../../doraemon/models/header'); // 头部model
const channels = {
    boys: 1,
    girl: 2,
    kids: 3,
    lifestyle: 4
};

const _index = (req, res, next) => {
    let id = req.query.id,
        gender = req.query.gender || req.cookies._Channel && channels[req.cookies._Channel] || 1,
        isApp = req.query.app_version || req.query.appVersion || false, // 标识是不是APP访问的
        parameter = {},
        title = '逛',
        userAgent = req.get('User-Agent'),
        isWeixin = userAgent.includes('MicroMessenger'); // 标识是否是微信访问

    // 判断参数是否有效, 无效会跳转到错误页面
    if (!stringProcess.isNumeric(id)) {
        res.json({ code: 400, message: '非法请求', data: '' });
        return;
    }

    // WAP上设置头部导航
    if (!isApp && !isWeixin) {
        parameter = {
            pageHeader: headerModel.setNav({
                navTitle: title
            }),
            pageFooter: true
        };
    }

    // 获取详情内容信息, 异常则跳到错误页面
    return infoModel.package(id, isApp).then(detail => {
        let data = {
            guang: {}
        };

        if (detail.code !== 400) {
            if (!detail.getArticle) {
                // TODO 跳转到逛首页
                return;
            }

            // 作者信息数据
            if (detail.getAuthor.name) {
                data.guang.author = {
                    avatar: detail.getAuthor.avatar.replace('http://', '//'),
                    name: detail.getAuthor.name,
                    intro: detail.getAuthor.author_desc
                };

                // guang双头部的问题 20160601
                data.guang.author.url = helpers.https(`${detail.getAuthor.url}&openby:yohobuy={"action":"go.h5","params":{"param":{"id":"${detail.getAuthor.author_id}"},"share":"","id":${detail.getAuthor.author_id},"type":0,"islogin":"N","url":"${helpers.urlFormat('/author/index', {}, 'guang')}"}}`);
            }
            let guang = data.guang;

            guang.detail = {
                title: detail.getArticle.article_title,
                publishTime: detail.getArticle.publishTime,
                pageView: detail.getArticle.pageViews,
                content: []
            };
            let callArticleContent = (i, len, resolve) => {
                if (i < len) {
                    let art = detail.getArticleContent[i];
                    let build = {};

                    // 文字
                    if (art.text && art.text.data && art.text.data.text) {
                        build.text = art.text.data.text;
                        guang.detail.content.push(build);
                        callArticleContent(++i, len, resolve);

                    } else if (art.singleImage) { // 单张图
                        build.bigImage = helpers.image(art.singleImage.data[0].src, 640, 640);
                        guang.detail.content.push(build);
                        callArticleContent(++i, len, resolve);

                    } else if (art.smallPic && art.smallPic.data) {
                        let imgs = art.smallPic.data;

                        build.smallImage = [{
                            src: helpers.image(imgs[0].src, 315, 420)
                        }, {
                            src: helpers.image(imgs[1].src, 315, 420)
                        }
                        ];
                        guang.detail.content.push(build);
                        callArticleContent(++i, len, resolve);

                    } else if (art.goods && art.goods.data) { // 相关推荐
                        let reco = [],
                            skns = [],
                            arr = [];

                        // 遍历取得SKN
                        art.goods.data.forEach(goods => {
                            skns.push(goods.id);
                            arr[goods.id] = goods.src;
                        });

                        // callArticleContent(++i, len, resolve);
                        // return;
                        // 通过SKN获取商品信息
                        productDetailModel.productInfoBySkns(skns).then((product) => {
                            // console.log(product)
                            if (product.data.product_list) {
                                let d = [];

                                for (let o = 0; o < product.data.product_list.length; o++) {
                                    let goods = product.data.product_list[o];

                                     // 最多显示4个
                                    if (o > 3) {
                                        break;
                                    }
                                    d.push(guangProcess.formatProduct(goods, false, true, true, 235, 314, isApp, true, gender));
                                }
                                d.forEach(p => {
                                    if (arr[p.id]) {
                                        p.thumb = helpers.image(arr[p.id], 235, 314);
                                        reco.push(p);
                                    }
                                });
                            }

                             // 多个商品
                            if (product.data.product_list.length > 1) {
                                build.relatedReco = reco;
                            } else if (product.data.product_list.length === 1) { // 单个商品
                                build.relatedReco = reco[0];
                            }
                            guang.detail.content.push(build);
                            callArticleContent(++i, len, resolve);
                        });
                    } else if (art.goodsGroup && art.goodsGroup.data) { // 悬停浮动商品
                        let callArtGoodGroup = (ii, len2) => {
                            if (ii < len2) {
                                let goods = art.goodsGroup.data[ii];
                                let good = {
                                    thumb: helpers.image(goods.cover.cover, 235, 314),
                                    type: guangProcess.getProductIcon(goods.cover.maxSortId),
                                    goods: []
                                };
                                let skns = [];
                                let arr = [];

                                goods.list.forEach((mini) => {
                                    skns.push(mini.id);
                                    arr[mini.id] = mini.src;
                                });

                                // 通过SKN获取商品信息
                                productDetailModel.productInfoBySkns(skns).then((product) => {
                                    if (product.data.product_list) {
                                        let g = [];

                                        product.data.product_list.forEach(_ => {
                                            g.push(guangProcess.formatProduct(_, false, true, true, 235, 314, isApp, gender));
                                        });
                                        g.forEach(p => {
                                            if (arr[p.id]) {
                                                p.thumb = helpers.image(arr[p.id], 235, 314);
                                                good.goods.push(p);
                                            }
                                        });
                                        if (!build.collocation) {
                                            build.collocation = [];
                                        }
                                        build.collocation.push(good);
                                    }
                                    callArtGoodGroup(++ii, len2);
                                });
                            } else {
                                guang.detail.content.push(build);
                                callArticleContent(++i, len, resolve);
                            }
                        };

                        callArtGoodGroup(0, art.goodsGroup.data.length);
                    } else if (art.link) { // 更多商品链接
                        build.moreLink = art.link.data[0].url;
                        guang.detail.content.push(build);
                        callArticleContent(++i, len, resolve);
                    }
                } else {
                    resolve();
                }
            };

            if (detail.getArticleContent) {
                return new Promise((resolve) => {
                    callArticleContent(0, detail.getArticleContent.length, resolve);
                }).then(() => {
                    // 相关品牌
                    if (detail.getBrand) {
                        guang.relatedBrand = detail.getBrand;
                        guang.relatedBrand.forEach(brand => {
                            brand.thumb = brand.thumb.replace('http://', '//');
                        });
                    }

                    // 相关标签
                    if (detail.getArticle.tags) {
                        detail.getArticle.tags.forEach(value => {
                            if (!isApp) {
                                value.url = helpers.urlFormat('/tags/index', {
                                    query: value.name
                                }, 'guang');
                            }
                            if (!guang.relatedTag) {
                                guang.relatedTag = [];
                            }
                            guang.relatedTag.push(value);
                        });
                    }

                    // 相关文章
                    if (detail.getOtherArticle) {
                        detail.getOtherArticle.forEach(value => {
                            if (!isApp) {
                                value.url = helpers.urlFormat('/info/index', {
                                    id: value.id
                                }, 'guang');
                            }
                            value.thumb = helpers.image(value.thumb, 279, 175);
                            if (!guang.relatedInfo) {
                                guang.relatedInfo = [];
                            }
                            guang.relatedInfo.push(value);
                        });
                    }

                    // 分享参数
                    if (detail.getArticle.cover_image) {
                        guang.shareLink = helpers.urlFormat('/info/index', {
                            id: id
                        }, 'guang');
                        guang.shareTitle = detail.getArticle.article_title;
                        guang.shareDesc = detail.getArticle.article_summary;
                        if (detail.getArticle.cover_image_type === 1) {
                            guang.shareImg = helpers.image(detail.getArticle.cover_image, 640, 640);
                        } else {
                            guang.shareImg = helpers.image(detail.getArticle.cover_image, 640, 320);
                        }
                        data.title = detail.getArticle.article_title;
                        data.title_more = true;
                        data.description = detail.getArticle.article_summary;
                        data.description_more = true;
                    }

                    // 标识有微信分享
                    data.hasWxShare = true;
                    res.render('info/index', Object.assign({
                        page: 'info-index',
                        title: '逛',
                        gender: gender,
                        wechatShare: true,
                    }, data, parameter));
                });
            } else {
                next();
                return;
            }

        }
    }).catch(next);
};


module.exports = {
    index: _index
};