/** * 静态化路由参数处理 * @author: yyq<yanqing.yang@yoho.cn> * @date: 2017/11/24 */ 'use strict'; const _ = require('lodash'); // const logger = global.yoho.logger; const minToFullMap = { ag: 'age_level', bd: 'brand', cc: 'coupon_code', cd: 'coupon_id', ci: 'category_id', cl: 'color', cn: 'channel', fp: 'filter_poolId', gd: 'gender', id: 'id', ld: 'limited', lt: 'limit', mi: 'misort', ms: 'msort', nb: 'navBar', nw: 'new', od: 'order', ol: 'outlets', pc: 'price', pd: 'p_d', pg: 'page', pm: 'promotion', pp: 'productPool', sd: 'standard', se: 'shelveTime', sf: 'specialoffer', sh: 'shop_id', si: 'specialsale_id', so: 'sort', sp: 'saleType', st: 'style', sz: 'size', tp: 'type' }; const fullToMinMap = _.transform(minToFullMap, (result, value, key) => { if (_.indexOf(['gender', 'brand', 'category_id', 'color', 'style'], value) > -1) { result[value] = key; } }, {}); const genderMap = { minToFull: { 1: '1,3', 2: '2,3' }, fullToMin: { '1,3': 1, '2,3': 2, '1,2,3': '' } }; const sringifyParam = (param) => { let arr = []; _.forEach(param, (value, key) => { if (value) { arr.push(`${key}=${value}`); } }); return arr.join('&'); }; const transformKey = (params, isFull) => { if (_.isEmpty(params)) { return params; } let matchParams = {}, extraParams = {}; let map = isFull ? fullToMinMap : minToFullMap; _.forEach(params, (value, key) => { let name = map[key]; // 包含',' & 等于{seat} 表示为多选,不需要伪静态 if (name && _.indexOf(value, ',') === -1 && value !== '{seat}') { matchParams[name] = value; } else { extraParams[key] = value; // logger.info(`list parameter [${key}] map value not found`); } }); return { matchParams, extraParams }; }; /** * 筛选参数转化 min->full * @param path 伪静态path * @returns {Object} */ const minPathToFullParam = (path) => { let obj = {}; _.forEach(_.split(path, '-'), splitValue => { if (!splitValue) { return; } let minKey = splitValue.substr(0, 2); let fullKey = minToFullMap[minKey]; if (fullKey) { obj[fullKey] = _.replace(_.replace(splitValue, minKey, ''), '__', '-'); // 替换value中__ } }); obj.gender = genderMap.minToFull[obj.gender] || obj.gender || '1,2,3'; return obj; }; /** * 筛选参数转化 full->min * @param uri 基础uri * @param params 当前 URL 中的参数 * @param newObj 新增的参数 * @param delObj 删除的参数 * @returns {string} */ const fullParamToMinPath = (uri, params, newObj, delObj = {}) => { let obj = _.assign({}, params, newObj); let pathArr = []; let extraQs = ''; Object.assign(delObj, {uid: true}); _.forEach(delObj, (value, key) => { _.has(obj, key) && _.unset(obj, key); }); if (obj.gender) { obj.gender = _.has(genderMap.fullToMin, obj.gender) ? genderMap.fullToMin[obj.gender] : obj.gender; } let transParams = transformKey(obj, true); _.forEach(transParams.matchParams, (value, key) => { if (value) { pathArr.push(`${key}${_.replace(value, '-', '__')}`); // 替换value中- } }); if (!_.isEmpty(transParams.extraParams)) { extraQs = '?' + sringifyParam(transParams.extraParams); } let minPath = _.sortBy(pathArr).join('-') + (pathArr.length ? '.html' : ''); return `${_.trimEnd(uri, '/')}/${minPath}${extraQs}`; }; module.exports = { transformKey, fullParamToMinPath, minPathToFullParam };