Merge branch 'develop' into feature/index-girls
Showing
4 changed files
with
119 additions
and
97 deletions
library/camel-case.js
0 → 100644
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 | } |
-
Please register or login to post a comment