guang-process.js 10.9 KB
/**
 * 逛处理类
 */

'use strict';
const helpers = global.yoho.helpers;

/**
 * [将首字符为//的url转换为http://]
 * @param  {[string]} url [需要转换的url]
 * @return {[string]}     [description]
 */
const transHttpsUrl = (url) => {
    return url.replace(/^\/\//g, 'http://');
};

/**
 * [过滤app查询字符串]
 * @param  {[string]} url [url地址]
 * @return {[strng]}
 */
const getFilterUrl = (url) => {
    url = url.replace('.m.yohobuy.com', global.yoho.config.subDomains.host).replace('www.yohobuy.com', global.yoho.config.siteUrl);

    const whiteDomains = ['m.yohobuy.com', 'cdn.yoho.cn/myohobuy'];
    const blackDomains = ['sale.m.yohobuy.com', 'cuxiao.m.yohobuy.com', 'activity.m.yohobuy.com', 'huodong.m.yohobuy.com', '/home/orders/pay'];

    if (whiteDomains.every(_ => url.includes(_)) &&
        blackDomains.every(_ => !url.includes(_))) {
        url = url.replace('http://', '//');
    }

    if (url.includes('feature.yoho.cn')) {
        url = transHttpsUrl(url);
    }
    if (url.includes('openby:yohobuy=')) {
        let filters = ['openby:yohobuy=', '&', '?'];

        filters.forEach(_ => {
            url = url.subString(0, url.lastIndexOf(_));
        });
        return url.replace(/(^\s*)|(\s*$)/g, '');
    } else {
        return url;
    }
};

/**
 * [格式化资讯文章]
 * @param  {[array]}  articleData [需要格式化的资讯数据]]
 * @param  {[Boolean]}  showTag [是否显示左上角标签]]
 * @param  {Boolean} isApp [是否显示分享,在APP客户端里嵌入需要传url链接]
 * @param  {[Boolean]}  showAuthor  [控制是否显示作者信息]
 * @param  {[int]}  uid         [当前登录的用户ID]
 * @param  {[string]}  reqQueryString         [查询字符串]
 * @return {[array | false]}
 */
const formatArticle = (articleData, showTag, isApp, showAuthor, uid, reqQueryString) => {
    // 资讯ID不存在,则不显示
    if (!articleData.id) {
        return false;
    }
    let result = {
        id: articleData.id,
        showTags: showTag,
        img: articleData.src ? helpers.image(articleData.src, 640, 640) : '',
        url: isApp ? `${helpers.https(articleData.url)}&openby:yohobuy={"action":"go.h5","params":{"param":{"id":"${articleData.id}"},"shareparam":{"id":"${articleData.id}"},"share":"/guang/api/v1/share/guang","id":${articleData.id},"type":1,"url":"http:${helpers.urlFormat('/info/index', null, 'guang')}","islogin":"N"}}` : articleData.url,
        title: articleData.title,
        text: articleData.intro,
        publishTime: articleData.publish_time,
        publishTimeLong: articleData.publish_time_long,
        pageView: articleData.views_num
    };

    if (result.url.includes('feature.yoho.cn') ||
        result.url.includes('cdn.yoho.cn')) {
        result.url = transHttpsUrl(result.url);
    }

    // 收藏
    if (isApp) {
        result.collect = {};
        result.collect.isCollected = articleData.isFavor === true;
        let colparam = articleData.colparam || {
            urlpath: '',
            param: ''
        }
        let originUrl = helpers.urlFormat(colparam.urlpath || '/author/index', null, 'guang'); // 跳转回的链接
        let collectUrl = 'javascript:;'; // 根据用户是否登录做处理的链接

        if (!uid) {
            let playUrlEncode = `${originUrl}${colparam.param}`.replace(/\//g, '\\\/');

            collectUrl = `${originUrl}?openby:yohobuy={"action":"go.weblogin","params":{"jumpurl":{"url":"${playUrlEncode}","param":{"from":"app"}},"requesturl":{"url":"","param":{}},"priority":"N"}}`;
        }
        result.collect.url = collectUrl;
    } else { // 点赞
        result.like = {};
        result.like.count = articleData.praise_num;
        result.like.isLiked = articleData.isPraise === 'Y';
    }

    if (isApp && articleData.share.url) {

        // 分享链接
        result.share = `${articleData.share.url}?openby:yohobuy={"action":"go.share","params":{"title":"${articleData.title}","content":"${articleData.intro}","url":"${articleData.share.url}","pic":"https:${result.img}"}}`;
    }

    // 判断是否显示作者信息
    if (showAuthor && articleData.author) {
        if (!isApp) {
            articleData.author.url = getFilterUrl(articleData.author.url);
        }

        // 编辑人员 app跳转url处理 20160601
        let isLogin = uid ? true : false;

        articleData.author.url = `${helpers.https(articleData.author.url)}&openby:yohobuy={"action":"go.h5","params":{"param":{},"share":"","id":${articleData.author.author_id},"type":0,"islogin":"${isLogin}","url":"${articleData.author.url}"}}`;
        result.author = articleData.author;
        if (result.author.avatar) {
            result.author.avatar = result.author.avatar.replace('http://', '//');
        }
    }

    // 模板中需要的标签标识
    if (showTag && articleData.category_id) {
        switch (articleData.category_id) {
            case '1': // 话题
                result.isTopic = true;
                break;
            case '2': // 搭配
                result.isCollocation = true;
                break;
            case '3': // 潮人
                result.isFashionMan = true;
                break;
            case '4': // 潮品
                result.isFashionGood = true;
                break;
            case '5': // 小贴士
                result.isTip = true;
                break;
            case '19': // 专题
                result.isSpecialTopic = true;
                break;
        }
    }
    return result;
};

/**
 * [获取商品的ICON]
 * @param  {[int]} type [类型]
 * @return {[type]}
 */
const getProductIcon = (type) => {
    const icons = {
        1: 'cloth',
        3: 'pants',
        4: 'dress',
        6: 'shoe',
        7: 'bag',
        10: 'lamp',
        241: 'headset',
        8: 'watch',
        360: 'swim-suit',
        308: 'under'
    };

    return icons[type] || '';
};

/**
 * [根据性别获取]
 * @param  {[type]} gender [description]
 * @return {[type]}        [description]
 */
const _getGenderByCookie = (gender) => {
    switch (gender) {
        case 1: // 男
            return '1,3';
        case 2: // 女
            return '2,3';
        default: // 其它
            return '1,2,3';
    }
};

/**
 * [根据性别来决定  默认图片获取字段   如果是 2、3]
 *
 * 则优先从cover2 --》 cover1 -- 》 images_url
 * 否则优先从cover1 --》 cover2 -- 》 images_url
 *
 * @param  {[array]} images [images]
 * @param  {[Boolean]} gender [性别]
 * @return {[type]}
 */
const _procProductImg = (images, gender) => {
    let imgUrl = images.images_url || '';
    let cover1 = images.cover_1 || '';
    let cover2 = images.cover_2 || '';

    gender = _getGenderByCookie(gender);
    if (gender === '2,3') {
        return cover2 || (cover1 || imgUrl);
    } else {
        return cover1 || (cover2 || imgUrl);
    }
};

/**
 * 格式化商品信息
 *
 * @param array productData 需要格式化的商品数据
 * @param bool showTags 控制是否显示标签
 * @param bool showNew 控制是否显示NEW图标
 * @param bool showSale 控制是否显示SALE图标
 * @param int width 图片的宽度
 * @param int height 图片的高度
 * @param bool isApp 判断是不是APP访问
 * @param bool showPoint 商品价格是否显示小数位,默认显示
 * @param int gender 性别
 * @return array | false
 */
const formatProduct = (productData, showTags, showNew, showSale, width, height, isApp, showPoint, gender) => {
    // 商品信息有问题,则不显示
    if (!productData.product_skn || !productData.goods_list[0]) {
        return false;
    }
    productData.sales_price = productData.sales_price || '';
    productData.market_price = productData.market_price || '';

    // 市场价和售价一样,则不显示市场价
    if (parseInt(productData.market_price) === parseInt(productData.sales_price)) {
        productData.market_price = false;
    }

    // 判别默认的商品是否将默认的图片URL赋值到skn
    let flag = false;

    // 如果设置了默认图片,就取默认的图片
    for (let oneGoods of productData.goods_list) {
        //  此skc是默认的,则将图片赋值给skn
        if (oneGoods.is_default === 'Y') {
            productData.default_images = _procProductImg(oneGoods, gender);
            flag = true;
            break;
        }
    }

    // 如果还未赋值,则取第一个skc产品的默认图片
    if (!flag) {
        productData.default_images = _procProductImg(productData.goods_list[0], gender);
    }

    let result = {
        id: productData.product_skn,
        product_id: productData.product_id,
        thumb: helpers.image(productData.default_images, width, height),
        name: productData.product_name,
        price: productData.market_price || false,
        salePrice: productData.sales_price
    };

    if (showPoint) {
        if (result.price) {
            result.price += '.00';
        }
        if (result.salePrice) {
            result.salePrice += '.00';
        }
    }

    // TODO student price
    result.studentPrice = parseInt(productData.sales_price * 100 * 0.9) / 100;
    result.is_soon_sold_out = (productData.is_soon_sold_out === 'Y');
    let url = encodeURI(helpers.urlFormat(`/product/pro_${productData.product_id}_${productData.goods_list[0].goods_id}/${productData.cn_alphabet}.html`));

    result.url = url.replace('http://', '//');

    // APP访问需要加附加的参数
    // 备注:如果以后APP的接口太多,可以把这边参数提取出来,变成一个公共的方法来生成,便于以后管理维护
    if (isApp) {
        result.url += `?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":${productData.product_skn}}}`;
    }
    if (showTags) {
        result.tags = {
            is_new: showNew && productData.is_new === 'Y', // 新品
            is_discount: showSale && productData.is_discount === 'Y', // 在售
            is_limited: productData.is_limited && productData.is_limited === 'Y', // 限量
            is_yohood: productData.is_yohood && productData.is_yohood === 'Y', // YOHOOD
            midYear: productData.midear && productData.midear === 'Y', // 年中
            yearEnd: productData.yearnd && productData.yearnd === 'Y', // 年末
            is_advance: productData.is_advance && productData.is_advance === 'Y' // 再到着
        };

        // 打折与即将售完组合显示打折
        if (result.is_soon_sold_out && result.tags.is_discount) {
            result.tags.is_new = false;
        } else if (result.tags.is_discount &&
            (result.tags.is_new || result.tags.is_limited || result.tags.is_yohood || result.tags.is_advance) // 打折与其它组合则隐藏打折
        ) {
            result.tags.is_discount = false;
        } else if (result.tags.is_yohood && result.tags.is_new) { // YOHOOD和新品组合显示YOHOOD
            result.tags.is_new = false;
        }
    }

    return result;
};


module.exports = {
    formatArticle,
    transHttpsUrl,
    getFilterUrl,
    formatProduct,
    getProductIcon
};