list.js 10.7 KB
/*
 * @Author: sefon
 * @Date:   2016-07-24 11:40:21
 */

'use strict';
const mRoot = '../models';
const list = require(`${mRoot}/list`);
const listSeoMap = require(`${global.middleware}/seo/listSeoMap`);
const helpers = global.yoho.helpers;
const _ = require('lodash');
const tdk = require('../../../utils/getTDK');

// 搜索相关接口
const searchApi = require(`${mRoot}/search-api`);

// 店铺页
const shop = (shopId, req, res, next, brandInfo) => {
    let domain = req.query.domain,
        params = req.query;

    _.unset(params, 'domain');
    shopId = parseInt(shopId, 10);
    Object.assign(params, {shopId: shopId});

    tdk('shop', shopId, req).then(TDKObj => {
        if (TDKObj[0]) {
            req.tdk = {
                title: TDKObj[1],
                keywords: TDKObj[2],
                description: TDKObj[3]
            };
        }
        return list.getShopInfo(shopId, req.user.uid).then(shopInfo => {
            let pjax = params._pjax;

            // 获取不到店铺信息跳转至首页
            if (!shopInfo || _.isEmpty(shopInfo)) {
                return res.redirect(helpers.urlFormat('', null, ''));
            }

            // 比较品牌域名与店铺域名是否一致,不一致跳转至店铺域名
            if (!pjax && shopInfo.domain && domain && domain !== _.toLower(shopInfo.domain)) {
                res.redirect(helpers.urlFormat('', params, shopInfo.domain));
                return;
            }

            if (+shopInfo.shopTemplateType === 2) { // 经典模板

                if (pjax) {
                    list.getShopGoodsData(shopId, req.yoho.channel, params, shopInfo).then(result => {
                        Object.assign(result, {
                            shopId: shopId,
                            layout: false
                        });
                        res.render('list/goods-list', result);
                    }).catch(next);
                    return;
                }

                list.getShopData(shopId, req.yoho.channel, params, shopInfo).then(result => {
                    Object.assign(result, {
                        page: 'shop',
                        shopId: shopId
                    });

                    // 店铺装修为空则不cache
                    if (!result.shopTopBanner) {
                        res.set('Cache-Control', 'no-cache');
                    }

                    res.render('list/shop-index', result);
                }).catch(next);
            } else { // 基础模板
                list.getBaseShopData(params, Object.assign({uid: req.user.uid}, brandInfo),
                    req.yoho.channel, shopId).then(result => {
                        Object.assign(result, {page: 'list'});

                        // 基础店铺装修为空则不cache
                        if (!result.brand || !result.brand.shopBanner) {
                            res.set('Cache-Control', 'no-cache');
                        }

                        res.render('list/brand', result);
                    }).catch(next);
            }
        });
    }).catch(next);


};

/**
 * 商品分类列表页
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.index = (req, res, next) => {
    let resData = {};
    let qs = decodeURIComponent(req._parsedOriginalUrl.query || '');

    list.getListData(Object.assign(req.query, {uid: req.user.uid, prid: req.user.prid}),
        req.yoho.channel).then(result => {
            Object.assign(resData, result);

            if (qs) {
                Object.assign(resData, listSeoMap[qs] || {});
            }

            // 查询结果为空则不cache
            if (_.isEmpty(_.get(resData, 'list.goods', []))) {
                res.set('Cache-Control', 'no-cache');
            }

            // 商品详情页跳转过来带参数
            if (req.query.phrase) {
                try {
                    resData.list.phrase = decodeURIComponent(req.query.phrase);
                } catch (e) {
                    resData.list.phrase = '';
                }
            }

            res.render('list/index', resData);
        }).catch(next);
};

/**
 * 新品到着
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.new = (req, res, next) => {
    let resData = {};

    list.getListNewData(Object.assign({order: 's_t_desc'}, req.query), req.yoho.channel).then(result => {
        Object.assign(resData, result, {
            hideInfo: {from: 'newProduct'}
        });

        // 查询结果为空则不cache
        if (_.isEmpty(_.get(resData, 'list.goods', []))) {
            res.set('Cache-Control', 'no-cache');
        }

        res.render('list/index', resData);
    }).catch(next);
};

/**
 * 新品到着(带频道)
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.newWithChannel = (req, res, next) => {
    let channel = req.params[0];

    req.query = req.query || {};

    // 根据 XXXX-new 中的频道处理查询参数
    switch (channel) {
        case 'boys':
            req.yoho.channel = 'boys';
            req.query = Object.assign({gender: '1,3', category_id: '1'}, req.query);
            break;
        case 'girls':
            req.yoho.channel = 'girls';
            req.query = Object.assign({gender: '2,3', category_id: '2'}, req.query);
            break;
        case 'kids':
            req.yoho.channel = 'kids';
            req.query = Object.assign({gender: '1,2,3', category_id: '3'}, req.query);
            break;
        case 'lifestyle':
            req.yoho.channel = 'lifestyle';
            req.query = Object.assign({gender: '1,2,3', category_id: '4'}, req.query);
            break;
        default:
            break;
    }

    this.new(req, res, next);
};

/**
 * 品牌页
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.brand = (req, res, next) => {
    let brandDomain = req.query.domain;
    let shopId = req.query.shopId;

    // shopId存在,直接走店铺
    if (shopId) {
        return shop(shopId, req, res, next);
    }

    if (!brandDomain) {
        return next();
    }

    // 获取品牌信息
    list.getBrandInfo({domain: brandDomain}).then(brandInfo => {
        if (!brandInfo.hasOwnProperty('type')) {
            return res.redirect(helpers.urlFormat(''));
        }

        switch (parseInt(brandInfo.type, 10)) {
            case 1: // 搜索
                res.redirect(helpers.urlFormat('', {query: brandInfo.brandDomain}, 'search'));
                break;
            case 2: // 店铺
                return shop(brandInfo.shopId, req, res, next, brandInfo);
            default: // 品牌
                res.redirect(helpers.urlFormat('', {
                    query: brandInfo.brandDomain,
                    brand: brandInfo.brandId
                }, 'search'));
                break;
        }
    }).catch(next);
};

/**
 * 品牌介绍页
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.brandAbout = (req, res, next) => {
    let brandDomain = req.query.domain;
    let shopId = req.query.shopId;

    if (!brandDomain) {
        return res.redirect(helpers.urlFormat(''));
    }

    if (shopId) {
        list.getShopAbout(shopId, req.user.uid).then(result => {
            res.render('list/brand', Object.assign(result, {page: 'list'}));
        }).catch(next);
    } else {
        list.getBrandAbout(brandDomain, req.user.uid, req.yoho.channel).then(result => {
            res.render('list/brand', Object.assign(result, {page: 'list'}));
        }).catch(next);
    }
};

/**
 * 店铺商品列表页
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.shopList = (req, res, next) => {
    let shopId = req.query.shopId;

    if (!shopId) {
        return next();
    }

    list.getShopListData(req.yoho.channel, req.query, req.user.uid).then(result => {
        Object.assign(result, {
            page: 'shop',
            shopId: shopId
        });
        if (req.query.query) {
            result.shopKey = req.query.query;
        }

        // 店铺装修为空则不cache
        if (!result.shopTopBanner) {
            res.set('Cache-Control', 'no-cache');
        }
        res.render('list/shop-list', result);
    }).catch(next);
};

/**
 * ajax调用品牌页左侧水牌
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.getNodeContent = (req, res, next) => {

    if (!req.xhr || !req.body.node) {
        return next();
    }

    list.getNodeContentData(req.body).then(result => {
        res.json(result);
    }).catch(next);
};

/**
 * ajax调用品牌页左侧series folder
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.getAdnav = (req, res, next) => {

    if (!req.xhr) {
        return next();
    }

    list.getAdnav(req.body).then(result => {
        res.json(result);
    }).catch(next);
};



/**
 * 判断用户是否收藏品牌页
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.isFavoriteBrand = (req, res, next) => {
    let uid = req.user.uid;
    let brandId = req.body.brandId;

    if (!req.xhr) {
        return next();
    }

    if (!req.body.brandId || !uid) {
        return res.json({code: 400, message: '用户未登录或缺少参数'});
    }

    searchApi.isFavoriteBrand(uid, brandId).then(result => {
        res.json(result);
    }).catch(next);
};


/**
 * 用户店铺优惠券领取状态
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.shopCouponSync = (req, res, next) => {
    let uid = req.user.uid;
    let id = req.query.id;

    if (!req.xhr) {
        return next();
    }

    if (!id || !uid) {
        return res.json({code: 400, message: '用户未登录或缺少参数'});
    }

    list.getUserCoupunStatus(id, uid, 'shop').then(result => {
        res.json(result);
    });
};

/**
 * 用户品牌优惠券领取状态
 * @param  {[type]} req [description]
 * @param  {[type]} res [description]
 * @return {[type]}     [description]
 */
exports.brandCouponSync = (req, res, next) => {
    let uid = req.user.uid;
    let id = req.query.id;

    if (!req.xhr) {
        return next();
    }

    if (!id || !uid) {
        return res.json({code: 400, message: '用户未登录或缺少参数'});
    }

    list.getUserCoupunStatus(id, uid, 'brand').then(result => {
        res.json(result);
    });

};