Authored by Feng

merge handle

@@ -11,5 +11,6 @@ @@ -11,5 +11,6 @@
11 }, 11 },
12 "parserOptions": { 12 "parserOptions": {
13 "sourceType": "module" 13 "sourceType": "module"
14 - } 14 + },
  15 + "extends": "yoho"
15 } 16 }
@@ -12,22 +12,26 @@ if (config.useOneapm) { @@ -12,22 +12,26 @@ if (config.useOneapm) {
12 require('oneapm'); 12 require('oneapm');
13 } 13 }
14 14
15 -let express = require('express'),  
16 - path = require('path'),  
17 - bodyParser = require('body-parser'),  
18 - cookieParser = require('cookie-parser'),  
19 - favicon = require('serve-favicon'),  
20 - pkg = require('./package.json'); 15 +const express = require('express');
  16 +const path = require('path');
  17 +const bodyParser = require('body-parser');
  18 +const cookieParser = require('cookie-parser');
  19 +const favicon = require('serve-favicon');
  20 +const session = require('express-session');
  21 +const memcached = require('connect-memcached');
  22 +const pkg = require('./package.json');
21 23
22 -require('express-handlebars'); 24 +const app = express();
  25 +const MemcachedStore = memcached(session);
23 26
24 27
25 -let app = express();  
26 -  
27 // 向模板注入变量 28 // 向模板注入变量
28 app.locals.devEnv = app.get('env') === 'development'; 29 app.locals.devEnv = app.get('env') === 'development';
29 app.locals.version = pkg.version; 30 app.locals.version = pkg.version;
30 31
  32 +// 指定libray目录
  33 +global.library = path.resolve('./library');
  34 +
31 app.set('view engine', '.hbs'); 35 app.set('view engine', '.hbs');
32 36
33 app.use(favicon(path.join(__dirname, '/public/favicon.ico'))); 37 app.use(favicon(path.join(__dirname, '/public/favicon.ico')));
@@ -35,11 +39,22 @@ app.use(express.static(path.join(__dirname, 'public'))); @@ -35,11 +39,22 @@ app.use(express.static(path.join(__dirname, 'public')));
35 app.use(bodyParser.json()); 39 app.use(bodyParser.json());
36 app.use(bodyParser.urlencoded({extended: false})); 40 app.use(bodyParser.urlencoded({extended: false}));
37 app.use(cookieParser()); 41 app.use(cookieParser());
  42 +app.use(session({
  43 + secret: '3e5fec7deca0b8305cefe2ad9d90ff5e',
  44 + name: 'PHPSESSID',
  45 + prefix: 'yohobuy',
  46 + proxy: true,
  47 + resave: true,
  48 + saveUninitialized: true,
  49 + store: new MemcachedStore({
  50 + hosts: config.memcache.session
  51 + })
  52 +}));
38 53
39 // dispatcher 54 // dispatcher
40 require('./dispatch')(app); 55 require('./dispatch')(app);
41 56
42 // listener 57 // listener
43 -app.listen(6001, function() { 58 +app.listen(config.port, function() {
44 console.log('yohobuy start'); 59 console.log('yohobuy start');
45 }); 60 });
@@ -10,11 +10,13 @@ const isProduction = process.env.NODE_ENV === 'production'; @@ -10,11 +10,13 @@ const isProduction = process.env.NODE_ENV === 'production';
10 const isTest = process.env.NODE_ENV === 'test'; 10 const isTest = process.env.NODE_ENV === 'test';
11 11
12 module.exports = { 12 module.exports = {
  13 + port: 6001,
13 siteUrl: 'http://m.yohobuy.com', 14 siteUrl: 'http://m.yohobuy.com',
14 domains: { 15 domains: {
15 api: 'http://testapi.yoho.cn:28078/', // http://devapi.yoho.cn:58078/ http://testapi.yoho.cn:28078/ 16 api: 'http://testapi.yoho.cn:28078/', // http://devapi.yoho.cn:58078/ http://testapi.yoho.cn:28078/
16 service: 'http://devapi.yoho.cn:58078/' 17 service: 'http://devapi.yoho.cn:58078/'
17 }, 18 },
  19 + useOneapm: false,
18 useCache: true, 20 useCache: true,
19 memcache: { 21 memcache: {
20 master: ['192.168.102.168:12580'], 22 master: ['192.168.102.168:12580'],
@@ -26,12 +28,12 @@ module.exports = { @@ -26,12 +28,12 @@ module.exports = {
26 infoFile: { 28 infoFile: {
27 name: 'info', 29 name: 'info',
28 level: 'info', 30 level: 'info',
29 - filename: 'info.log' 31 + filename: 'log/info.log'
30 }, 32 },
31 errorFile: { 33 errorFile: {
32 name: 'error', 34 name: 'error',
33 level: 'error', 35 level: 'error',
34 - filename: 'error.log', 36 + filename: 'log/error.log',
35 handleExceptions: true 37 handleExceptions: true
36 }, 38 },
37 udp: { // send by udp 39 udp: { // send by udp
@@ -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,18 +39,11 @@ const packageSort = argument => { @@ -39,18 +39,11 @@ 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 /* eslint-disable */ 47 /* eslint-disable */
55 var sign = packageSort(Object.assign({ 48 var sign = packageSort(Object.assign({
56 client_type: 'h5', 49 client_type: 'h5',
@@ -60,18 +53,18 @@ exports.apiSign = (params) => { @@ -60,18 +53,18 @@ exports.apiSign = (params) => {
60 screen_size: '720x1280', 53 screen_size: '720x1280',
61 v: '7' 54 v: '7'
62 }, params)); 55 }, params));
63 -  
64 /* eslint-enable */ 56 /* eslint-enable */
65 57
66 - return Object.assign(sign, {  
67 - 58 + sign = Object.assign(sign, {
68 client_secret: makeSign(sign) // eslint-disable-line camelcase 59 client_secret: makeSign(sign) // eslint-disable-line camelcase
69 }); 60 });
  61 + delete sign.private_key;
  62 + return sign;
70 }; 63 };
71 64
72 // 检查签名,APP 访问 H5 页面的时候需要检查 65 // 检查签名,APP 访问 H5 页面的时候需要检查
73 exports.checkSign = (params) => { 66 exports.checkSign = (params) => {
74 - var clientSecret = params.client_secret, // eslint-disable-line camelcase 67 + let clientSecret = params.client_secret, // eslint-disable-line camelcase
75 sortedParams; 68 sortedParams;
76 69
77 // 忽略部分参数 70 // 忽略部分参数
@@ -88,7 +81,7 @@ exports.checkSign = (params) => { @@ -88,7 +81,7 @@ exports.checkSign = (params) => {
88 81
89 // 检查签名,APP 访问 H5 页面的时候需要检查, 有可能不同于上边的签名方式 82 // 检查签名,APP 访问 H5 页面的时候需要检查, 有可能不同于上边的签名方式
90 exports.webSign = (params) => { 83 exports.webSign = (params) => {
91 - var webPrivateKey = 'yohobuyapp'; 84 + const webPrivateKey = 'yohobuyapp';
92 85
93 return params.key === md5(md5(webPrivateKey) + params.uid); 86 return params.key === md5(md5(webPrivateKey) + params.uid);
94 }; 87 };
@@ -13,9 +13,9 @@ @@ -13,9 +13,9 @@
13 "online": "NODE_ENV=\"production\" node app.js", 13 "online": "NODE_ENV=\"production\" node app.js",
14 "debug": "DEBUG=\"express:*\" node app.js", 14 "debug": "DEBUG=\"express:*\" node app.js",
15 "lint-js": "./node_modules/.bin/eslint -c .eslintrc --cache --fix .", 15 "lint-js": "./node_modules/.bin/eslint -c .eslintrc --cache --fix .",
16 - "lint-css": "./node_modules/.bin/stylelint --config .stylelintrc public/**/*.css", 16 + "lint-css": "./node_modules/.bin/stylelint --config .stylelintrc public/scss/**/*.css",
17 "precommit": "node lint.js", 17 "precommit": "node lint.js",
18 - "test": "ava" 18 + "test": "./node_modules/.bin/nyc ./node_modules/.bin/ava"
19 }, 19 },
20 "ava": { 20 "ava": {
21 "tap": true, 21 "tap": true,
@@ -24,8 +24,7 @@ @@ -24,8 +24,7 @@
24 ], 24 ],
25 "babel": { 25 "babel": {
26 "presets": [ 26 "presets": [
27 - "es2015",  
28 - "stage-2" 27 + "es2015"
29 ] 28 ]
30 } 29 }
31 }, 30 },
@@ -33,9 +32,11 @@ @@ -33,9 +32,11 @@
33 "dependencies": { 32 "dependencies": {
34 "bluebird": "^3.3.5", 33 "bluebird": "^3.3.5",
35 "body-parser": "^1.15.0", 34 "body-parser": "^1.15.0",
  35 + "connect-memcached": "^0.2.0",
36 "cookie-parser": "^1.4.1", 36 "cookie-parser": "^1.4.1",
37 "express": "^4.13.1", 37 "express": "^4.13.1",
38 "express-handlebars": "^3.0.0", 38 "express-handlebars": "^3.0.0",
  39 + "express-session": "^1.13.0",
39 "influxdb-winston": "^1.0.1", 40 "influxdb-winston": "^1.0.1",
40 "lodash": "^4.12.0", 41 "lodash": "^4.12.0",
41 "md5": "^2.1.0", 42 "md5": "^2.1.0",
@@ -45,17 +46,15 @@ @@ -45,17 +46,15 @@
45 "request-promise": "^3.0.0", 46 "request-promise": "^3.0.0",
46 "serve-favicon": "^2.3.0", 47 "serve-favicon": "^2.3.0",
47 "winston": "^2.2.0", 48 "winston": "^2.2.0",
48 - "winston-daily-rotate-file": "^1.0.1",  
49 - "yoho-handlebars": "0.0.1" 49 + "winston-daily-rotate-file": "^1.0.1"
50 }, 50 },
51 "devDependencies": { 51 "devDependencies": {
52 "autoprefixer": "^6.3.6", 52 "autoprefixer": "^6.3.6",
53 "ava": "^0.14.0", 53 "ava": "^0.14.0",
54 "babel-cli": "^6.8.0", 54 "babel-cli": "^6.8.0",
55 "babel-preset-es2015": "^6.6.0", 55 "babel-preset-es2015": "^6.6.0",
56 - "babel-preset-stage-2": "^6.5.0",  
57 "babel-register": "^6.8.0", 56 "babel-register": "^6.8.0",
58 - "eslint": "^2.9.0", 57 + "eslint": "^2.10.2",
59 "eslint-config-yoho": "^1.0.1", 58 "eslint-config-yoho": "^1.0.1",
60 "gulp": "^3.9.1", 59 "gulp": "^3.9.1",
61 "gulp-cssnano": "^2.1.2", 60 "gulp-cssnano": "^2.1.2",
@@ -66,6 +65,7 @@ @@ -66,6 +65,7 @@
66 "husky": "^0.11.4", 65 "husky": "^0.11.4",
67 "mocha": "^2.4.5", 66 "mocha": "^2.4.5",
68 "nodemon": "1.9.2", 67 "nodemon": "1.9.2",
  68 + "nyc": "^6.4.3",
69 "postcss-assets": "^4.0.1", 69 "postcss-assets": "^4.0.1",
70 "postcss-cachebuster": "^0.1.2", 70 "postcss-cachebuster": "^0.1.2",
71 "postcss-calc": "^5.2.1", 71 "postcss-calc": "^5.2.1",
@@ -79,17 +79,17 @@ @@ -79,17 +79,17 @@
79 "postcss-sprites": "^3.1.2", 79 "postcss-sprites": "^3.1.2",
80 "postcss-use": "^2.0.2", 80 "postcss-use": "^2.0.2",
81 "precss": "^1.4.0", 81 "precss": "^1.4.0",
82 - "rewire": "^2.5.1",  
83 "shelljs": "^0.7.0", 82 "shelljs": "^0.7.0",
84 "stylelint": "^6.3.3", 83 "stylelint": "^6.3.3",
85 - "stylelint-config-yoho": "^1.2.2", 84 + "stylelint-config-yoho": "^1.2.3",
86 "webpack": "^1.13.0", 85 "webpack": "^1.13.0",
87 "webpack-dev-server": "^1.14.1", 86 "webpack-dev-server": "^1.14.1",
88 "webpack-stream": "^3.1.0", 87 "webpack-stream": "^3.1.0",
89 - "yoho-fastclick": "0.0.1",  
90 - "yoho-hammer": "0.0.1",  
91 - "yoho-jquery": "0.0.3",  
92 - "yoho-jquery-lazyload": "0.0.2",  
93 - "yoho-swiper": "0.0.1" 88 + "yoho-fastclick": "^1.0.6",
  89 + "yoho-hammer": "^2.0.7",
  90 + "yoho-handlebars": "^4.0.5",
  91 + "yoho-jquery": "^1.9.1",
  92 + "yoho-jquery-lazyload": "^1.9.7",
  93 + "yoho-swiper": "^3.3.1"
94 } 94 }
95 } 95 }
1 -// /**  
2 -// * http api 测试  
3 -// *  
4 -// * @author: jiangfeng<jeff.jiang@yoho.cn>  
5 -// * @date: 2016/05/17  
6 -// */ 1 +/**
  2 + * http api 测试
  3 + *
  4 + * @author: jiangfeng<jeff.jiang@yoho.cn>
  5 + * @date: 2016/05/17
  6 + */
7 7
8 -// import test from 'ava'; 8 +const test = require('ava');
  9 +const sign = require('../../library/sign');
  10 +const API = require('../../library/api').ServiceAPI;
9 11
10 -// import {SearchAPI} from '../../library/api'; 12 +const api = new API();
11 13
12 -// test('api get test', async (t) => {  
13 -// let api = new SearchAPI('');  
14 -// let data = await api.get();  
15 -// console.log(data);  
16 -// }); 14 +test('api get test', (t) => {
  15 + return api.get('operations/api/v6/category/getCategory', sign.apiSign({})).then(result => {
  16 + if (result && result.code === 200) {
  17 + t.pass();
  18 + } else {
  19 + t.fail();
  20 + }
  21 + });
  22 +});
1 -const headerModel = require('../../doraemon/models/header');  
2 -  
3 -const test = require('ava').test;  
4 -  
5 -test('test setNavHeader method', t => {  
6 - const headerData = headerModel.setNavHeader('逛');  
7 -  
8 - t.is(headerData.navTitle, '逛');  
9 - t.true(headerData.backUrl);  
10 - t.true(headerData.navBtn);  
11 -});  
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 6
7 'use strict'; 7 'use strict';
8 8
9 -const test = require('ava').test; 9 +const test = require('ava');
10 const helpers = require('../../library/helpers'); 10 const helpers = require('../../library/helpers');
11 11
12 test('qiniu image url handle', t => { 12 test('qiniu image url handle', t => {
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 * logger 工具类测试 2 * logger 工具类测试
3 */ 3 */
4 4
5 -const test = require('ava').test; 5 +const test = require('ava');
6 const shelljs = require('shelljs'); 6 const shelljs = require('shelljs');
7 const logger = require('../../library/logger'); 7 const logger = require('../../library/logger');
8 8
@@ -23,7 +23,7 @@ const logger = require('../../library/logger'); @@ -23,7 +23,7 @@ const logger = require('../../library/logger');
23 // }; 23 // };
24 24
25 test.cb('logger test', t => { 25 test.cb('logger test', t => {
26 - shelljs.rm('-f', '*.log.*'); 26 + shelljs.rm('-f', 'log/*.log.*');
27 logger.info('xxx', () => { 27 logger.info('xxx', () => {
28 shelljs.ls('info.log.*').forEach(s => console.log('generate log file:' + s)); 28 shelljs.ls('info.log.*').forEach(s => console.log('generate log file:' + s));
29 t.end(); 29 t.end();
@@ -31,6 +31,6 @@ test.cb('logger test', t => { @@ -31,6 +31,6 @@ test.cb('logger test', t => {
31 }); 31 });
32 32
33 test.after('clean test log file ', t => { 33 test.after('clean test log file ', t => {
34 - shelljs.rm('-f', '*.log.*'); 34 + shelljs.rm('-f', 'log/*.log.*');
35 t.pass(); 35 t.pass();
36 }); 36 });
@@ -5,12 +5,12 @@ @@ -5,12 +5,12 @@
5 * @date: 2016/05/17 5 * @date: 2016/05/17
6 */ 6 */
7 7
8 -const test = require('ava').test; 8 +const test = require('ava');
9 const sign = require('../../library/sign'); 9 const sign = require('../../library/sign');
10 10
11 test('app sign test', t => { 11 test('app sign test', t => {
12 let params = { 12 let params = {
13 - client_type: 'h5', 13 + client_type: 'h5', // eslint-disable-line
14 a: 1, 14 a: 1,
15 b: 'b' 15 b: 'b'
16 }; 16 };
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 * @date: 2016/05/17 5 * @date: 2016/05/17
6 */ 6 */
7 7
8 -const test = require('ava').test; 8 +const test = require('ava');
9 const Timer = require('../../library/timer'); 9 const Timer = require('../../library/timer');
10 10
11 const sleep = (timeout) => { 11 const sleep = (timeout) => {