Authored by biao

Merge branch 'develop' into feature/index-girls

  1 +/**
  2 + * 对象键名驼峰化
  3 + * @author: Bi Kai<kai.bi@yoho.cn>
  4 + * @date: 2016/05/09
  5 + */
  6 +'use strict';
  7 +const _ = require('lodash');
  8 +
  9 +let camelCase,
  10 + camelCaseObject,
  11 + camelCaseArray;
  12 +
  13 +camelCaseObject = (obj) => {
  14 + _.forEach(Object.keys(obj), (k) => {
  15 + obj[k] = camelCase(obj[k]);
  16 + obj[_.camelCase(k)] = obj[k];
  17 + });
  18 + return obj;
  19 +};
  20 +
  21 +camelCaseArray = (list) => {
  22 + _.forEach(list, (k) => {
  23 + k = camelCase(k);
  24 + });
  25 + return list;
  26 +};
  27 +
  28 +camelCase = (data) => {
  29 + if (_.isObject(data)) {
  30 + data = camelCaseObject(data);
  31 + }
  32 +
  33 + if (_.isArray(data)) {
  34 + data = camelCaseArray(data);
  35 + }
  36 +
  37 + return data;
  38 +};
  39 +
  40 +module.exports = camelCase;
1 -/*  
2 - * @Author: Targaryen  
3 - * @Date: 2016-05-10 10:11:34  
4 - * @Last Modified by: Targaryen  
5 - * @Last Modified time: 2016-05-12 11:25:53 1 +/**
  2 + * Handlebars helpers
  3 + * bikai kai.bi@yoho.cn
  4 + * 2016-05-10
6 */ 5 */
7 -/* -----------------------------------------  
8 - * 实现 PHP 的 Helpers 函数  
9 - * -----------------------------------------  
10 - */  
11 -  
12 'use strict'; 6 'use strict';
13 -  
14 -const SUB_DOMAIN = '.yohobuy.com';  
15 -const SITE_MAIN = 'http://www.yohobuy.com'; 7 +const querystring = require('querystring');
16 const _ = require('lodash'); 8 const _ = require('lodash');
  9 +const config = require('../config/common');
17 10
18 -class HELPERS { 11 +/**
  12 + * 七牛图片路径处理
  13 + * @param {[tring]} url
  14 + * @param {[tring]} width
  15 + * @param {[tring]} height
  16 + * @param {[tring]} mode
  17 + * @return {[tring]}
  18 + */
  19 +exports.image = (url, width, height, mode) => {
  20 + mode = _.isNumber(mode) ? mode : 2;
  21 + url = url || '';
  22 + return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
  23 +};
19 24
20 - /**  
21 - * 构建网站的URL  
22 - * @param uri String  
23 - * @param param Array  
24 - * @param module String 25 +/**
  26 + * 站内地址格式化
  27 + * @param {[string]} uri 路径
  28 + * @param {[object]} qs 查询字符串
  29 + * @param {[string]} module 模块
  30 + * @return {[string]}
25 */ 31 */
26 - url(uri, param, module) {  
27 - let url = ''; 32 +exports.url = (uri, qs, module) => {
  33 + const subDomain = '.m.yohobuy.com';
  34 + const subName = {
  35 + default: config.siteUrl,
  36 + guang: '//guang' + subDomain,
  37 + list: '//list' + subDomain,
  38 + search: '//search' + subDomain,
  39 + huodong: '//huodong' + subDomain,
  40 + activity: '//activity.yohobuy.com',
  41 + index: config.siteUrl
  42 + };
  43 + let url;
28 44
29 - if (module === null) {  
30 - module = 'index';  
31 - }  
32 - switch (module) {  
33 - case 'default':  
34 - url = 'http://m.yohobuy.com';  
35 - break;  
36 - case 'guang':  
37 - url = 'http://guang' + SUB_DOMAIN;  
38 - break;  
39 - case 'list':  
40 - url = 'http://list' + SUB_DOMAIN;  
41 - break;  
42 - case 'search':  
43 - url = 'http://search' + SUB_DOMAIN;  
44 - break;  
45 - case 'index':  
46 - url = SITE_MAIN;  
47 - break;  
48 - case '':  
49 - break;  
50 - case undefined:  
51 - break;  
52 - default:  
53 - url = 'http://' + module + SUB_DOMAIN;  
54 - break; 45 + module = module || 'default';
  46 + if (subName[module]) {
  47 + url = subName[module];
  48 + } else {
  49 + url = '//' + module + subDomain; // 规则没匹配到就把模块当作子域名
55 } 50 }
56 51
57 url += uri; 52 url += uri;
58 - if (param !== null && param !== undefined) {  
59 - url += '?';  
60 - _.forEach(param, function(value, key) {  
61 - url += (key + '=' + value + '&');  
62 - }); 53 + if (qs) {
  54 + url += '?' + querystring.stringify(qs);
63 } 55 }
64 - if (url.substr(-1, 1) === '&') {  
65 - return url.substr(0, url.length - 1);  
66 - } else { 56 +
67 return url; 57 return url;
68 - } 58 +};
69 59
70 - }  
71 60
72 - /**  
73 - * 根据尺寸获得图片url  
74 - * @param uri String  
75 - * @param param Array  
76 - * @param module String 61 +/**
  62 + * 大写转小写处理
  63 + * @param {[string]} str 转换字符
77 */ 64 */
78 - getImageUrl(url, width, height, mode) {  
79 - if (mode === null) {  
80 - mode = 2;  
81 - }  
82 - return url.replace(/{width}/g, width)  
83 - .replace(/{height}/g, height)  
84 - .replace(/{mode}/g, mode);  
85 - }  
86 -} 65 +exports.lowerCase = (str) => {
  66 + str = str || '';
  67 + return str.toLowerCase();
  68 +};
87 69
88 -module.exports = HELPERS; 70 +/**
  71 + * 小写转大写处理
  72 + * @param {[string]} str 转换字符
  73 + */
  74 +exports.upperCase = (str) => {
  75 + str = str || '';
  76 + return str.toUpperCase();
  77 +};
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 6
7 'use strict'; 7 'use strict';
8 8
9 -const _ = require('lodash'); 9 +const qs = require('querystring');
10 const md5 = require('md5'); 10 const md5 = require('md5');
11 11
12 const privateKey = { 12 const privateKey = {
@@ -24,7 +24,7 @@ const privateKey = { @@ -24,7 +24,7 @@ const privateKey = {
24 * @return {Object} 排序之后的参数对象 24 * @return {Object} 排序之后的参数对象
25 */ 25 */
26 const packageSort = argument => { 26 const packageSort = argument => {
27 - var newObj = {}; 27 + let newObj = {};
28 28
29 for (let k of Object.keys(argument).sort()) { 29 for (let k of Object.keys(argument).sort()) {
30 newObj[k] = argument[k]; 30 newObj[k] = argument[k];
@@ -39,41 +39,32 @@ const packageSort = argument => { @@ -39,41 +39,32 @@ const packageSort = argument => {
39 * @return {string} 生成的签名字符串 39 * @return {string} 生成的签名字符串
40 */ 40 */
41 const makeSign = argument => { 41 const makeSign = argument => {
42 - var qs = [];  
43 -  
44 - _.forEach(argument, function(value, key) {  
45 - qs.push(key + '=' + _.trim(value));  
46 - });  
47 -  
48 - return md5(qs.join('&')).toLowerCase(); 42 + return md5(qs.stringify(argument)).toLowerCase();
49 }; 43 };
50 44
51 // 生成API签名,调用后端接口的时候有私钥校验 45 // 生成API签名,调用后端接口的时候有私钥校验
52 exports.apiSign = (params) => { 46 exports.apiSign = (params) => {
53 -  
54 - var clientType = params.client_type || 'h5';  
55 -  
56 /* eslint-disable */ 47 /* eslint-disable */
57 var sign = packageSort(Object.assign({ 48 var sign = packageSort(Object.assign({
58 - client_type: clientType,  
59 - private_key: privateKey[clientType], 49 + client_type: 'h5',
  50 + private_key: privateKey.h5,
60 app_version: '3.8.2', 51 app_version: '3.8.2',
61 os_version: 'yohobuy:h5', 52 os_version: 'yohobuy:h5',
62 screen_size: '720x1280', 53 screen_size: '720x1280',
63 v: '7' 54 v: '7'
64 }, params)); 55 }, params));
65 -  
66 /* eslint-enable */ 56 /* eslint-enable */
67 57
68 - return Object.assign(sign, {  
69 - 58 + sign = Object.assign(sign, {
70 client_secret: makeSign(sign) // eslint-disable-line camelcase 59 client_secret: makeSign(sign) // eslint-disable-line camelcase
71 }); 60 });
  61 + delete sign.private_key;
  62 + return sign;
72 }; 63 };
73 64
74 // 检查签名,APP 访问 H5 页面的时候需要检查 65 // 检查签名,APP 访问 H5 页面的时候需要检查
75 exports.checkSign = (params) => { 66 exports.checkSign = (params) => {
76 - var clientSecret = params.client_secret, // eslint-disable-line camelcase 67 + let clientSecret = params.client_secret, // eslint-disable-line camelcase
77 sortedParams; 68 sortedParams;
78 69
79 // 忽略部分参数 70 // 忽略部分参数
@@ -90,7 +81,7 @@ exports.checkSign = (params) => { @@ -90,7 +81,7 @@ exports.checkSign = (params) => {
90 81
91 // 检查签名,APP 访问 H5 页面的时候需要检查, 有可能不同于上边的签名方式 82 // 检查签名,APP 访问 H5 页面的时候需要检查, 有可能不同于上边的签名方式
92 exports.webSign = (params) => { 83 exports.webSign = (params) => {
93 - var webPrivateKey = 'yohobuyapp'; 84 + const webPrivateKey = 'yohobuyapp';
94 85
95 return params.key === md5(md5(webPrivateKey) + params.uid); 86 return params.key === md5(md5(webPrivateKey) + params.uid);
96 }; 87 };
@@ -34,12 +34,11 @@ @@ -34,12 +34,11 @@
34 "request-promise": "^3.0.0", 34 "request-promise": "^3.0.0",
35 "serve-favicon": "^2.3.0", 35 "serve-favicon": "^2.3.0",
36 "winston": "^2.2.0", 36 "winston": "^2.2.0",
37 - "winston-daily-rotate-file": "^1.0.1",  
38 - "yoho-handlebars": "0.0.1" 37 + "winston-daily-rotate-file": "^1.0.1"
39 }, 38 },
40 "devDependencies": { 39 "devDependencies": {
41 "autoprefixer": "^6.3.6", 40 "autoprefixer": "^6.3.6",
42 - "eslint": "^2.9.0", 41 + "eslint": "^2.10.2",
43 "eslint-config-yoho": "^1.0.1", 42 "eslint-config-yoho": "^1.0.1",
44 "gulp": "^3.9.1", 43 "gulp": "^3.9.1",
45 "gulp-cssnano": "^2.1.2", 44 "gulp-cssnano": "^2.1.2",
@@ -60,14 +59,17 @@ @@ -60,14 +59,17 @@
60 "postcss-position": "^0.4.0", 59 "postcss-position": "^0.4.0",
61 "postcss-short": "^1.4.0", 60 "postcss-short": "^1.4.0",
62 "postcss-sprites": "^3.1.2", 61 "postcss-sprites": "^3.1.2",
63 - "postcss-use": "^2.0.2", 62 + "postcss-use": "^2.1.0",
64 "precss": "^1.4.0", 63 "precss": "^1.4.0",
65 "rewire": "^2.5.1", 64 "rewire": "^2.5.1",
66 "shelljs": "^0.7.0", 65 "shelljs": "^0.7.0",
67 "stylelint": "^6.3.3", 66 "stylelint": "^6.3.3",
68 - "stylelint-config-yoho": "^1.2.2", 67 + "stylelint-config-yoho": "^1.2.3",
69 "webpack": "^1.13.0", 68 "webpack": "^1.13.0",
70 "webpack-dev-server": "^1.14.1", 69 "webpack-dev-server": "^1.14.1",
71 - "webpack-stream": "^3.1.0" 70 + "webpack-stream": "^3.1.0",
  71 + "yoho-handlebars": "^4.0.5",
  72 + "yoho-jquery": "^1.9.1",
  73 + "yoho-jquery-lazyload": "^1.9.7"
72 } 74 }
73 } 75 }