/** * header model * @author: 赵彪<bill.zhao@yoho.cn> * @date: 2016/05/03 */ 'use strict'; const _ = require('lodash'); const api = global.yoho.API; const serviceApi = global.yoho.ServiceAPI; const helpers = global.yoho.helpers; /** * 获取菜单 * @param undefined * @return {array} 菜单数组 */ const getMenuData = () => ( [{ link: 'http://www.yoho.cn', cn: '集团官网', en: 'YOHO!' }, { link: 'http://www.yohoboys.com', cn: '男生潮流', en: 'YOHO!BOYS' }, { link: 'http://www.yohogirls.com', cn: '女生潮流', en: 'YOHO!GIRLS' }, { link: 'http://www.yohoshow.com', cn: '物趣分享', en: 'YOHO!SHOW' }, { link: 'http://www.yohood.cn', cn: '潮流嘉年华', en: 'YO\'HOOD' }] ); /** * 获取导航 * @param {Object} data 要处理的数据 * @param {String} type 频道类型 * @return {array} 导航数组 */ const getNavBar = (data, type) => { let navBars = []; _.forEach(data, item => { let obj = {}; let lowEn = _.camelCase(item.sort_name_en).toLowerCase(); Object.assign(obj, { type: lowEn, link: item.sort_url, cn: item.sort_name, en: item.sort_name_en, isNewPage: item.is_new_page === 'Y' }); if (type === lowEn) { obj.active = true; } // 奥莱频道显示图片,特殊处理 if (lowEn === 'outlets') { obj.ico = item.sort_ico; } navBars.push(obj); }); return navBars; }; /** * 获取品牌名字 * @param {Object} data 要处理数据 * @return {array} 品牌数组 */ const getBrandItems = (data) => { let brandItems = []; _.forEach(data, item => { let obj = { link: '', hot: false, brandName: '' }; obj.link = item.sort_url; obj.hot = item.is_hot === 'Y' ? true : false; obj.brandName = item.sort_name; brandItems.push(obj); }); return brandItems; }; /** * 获取三级菜单 * @param {Object} data 要处理数据 * @return {array} 三级菜单数组 */ const getThirdNav = (data) => { let thirdNav = []; _.forEach(data, item => { let obj = { link: '', title: '', brandItems: false }; obj.link = item.sort_url; obj.title = item.sort_name; if (item.sub) { obj.brandItems = getBrandItems(item.sub); } thirdNav.push(obj); }); return thirdNav; }; /** * 获取子菜单 * @param {Object} data 要处理数据 * @param {String} type 频道类型 * @return {array} 子菜单数组 */ const getSubNavGroup = (data, type) => { let subNavGroup = []; _.forEach(data, it => { let subNav = []; _.forEach(it.sub, item => { let obj = {}; obj.link = item.sort_url; obj.name = item.sort_name; obj.isHot = item.is_hot === 'Y' ? true : false; obj.isNew = item.is_new === 'Y' ? true : false; if (item.sub) { obj.thirdNav = getThirdNav(item.sub); obj.imgCode = item.content_code; } subNav.push(obj); }); let lowEn = _.camelCase(it.sort_name_en).toLowerCase(); subNavGroup.push({ subType: lowEn, subNav: subNav, active: lowEn === type }); }); return subNavGroup; }; /** * 处理接口返回的数据 * @param {object} 接口返回的对象 * @param {String} 指定页面类型为boys,girls,kids,lifestyle * @return {object} 头部数据 */ const setHeaderData = (resData, type) => ( { header: true, headType: type, yohoGroup: getMenuData(), navbars: resData ? getNavBar(resData, type) : [], subNavGroup: resData ? getSubNavGroup(resData, type) : [] } ); const getHotSearchAsync = (channel) => { return api.get('', {method: 'app.search.getTerms', yh_channel: channel}, { cache: 600, code: 200 }); }; const getHeaderNavAsync = () => { return serviceApi.get('operations/api/v6/category/getCategory', {}, { cache: true, code: 200 }); }; /** * 请求头部数据 * @param {String} 频道类型 * @return {promise} */ exports.requestHeaderData = (type) => { let resData = {}; type = type || 'boys'; let channelNum = (function() { switch (type) { case 'boys': return 1; case 'girls': return 2; case 'kids': return 3; case 'lifestyle': return 4; default: return 1; } }()); return Promise.all([ getHeaderNavAsync(), getHotSearchAsync(channelNum) ]).then(res => { resData.headerData = {}; if (res[0] && res[0].data) { Object.assign(resData.headerData, setHeaderData(res[0].data, type)); } if (res[1] && res[1].data) { resData.headerData.defaultSearch = _.get(res[1], 'data.defaultTerms[0].content', ''); resData.headerData.hotTerms = _.map(_.get(res[1], 'data.hotTerms', []), (value) => { return { href: helpers.urlFormat('', {query: value.content}, 'search'), content: value.content, sort: value.sort, status: value.status, type: value.type }; }); } return resData; }); };