Authored by 王水玲

Merge branch 'release/4.6' of git.yoho.cn:fe/yohobuywap-node into release/4.6

@@ -83,10 +83,13 @@ try { @@ -83,10 +83,13 @@ try {
83 const user = require('./doraemon/middleware/user'); 83 const user = require('./doraemon/middleware/user');
84 const setChannel = require('./doraemon/middleware/set-channel'); 84 const setChannel = require('./doraemon/middleware/set-channel');
85 const errorHanlder = require('./doraemon/middleware/error-handler'); 85 const errorHanlder = require('./doraemon/middleware/error-handler');
  86 + const setPageInfo = require('./doraemon/middleware/set-pageinfo');
  87 +
86 88
87 // YOHO 前置中间件 89 // YOHO 前置中间件
88 app.use(user()); 90 app.use(user());
89 app.use(setChannel()); 91 app.use(setChannel());
  92 + app.use(setPageInfo());
90 93
91 require('./dispatch')(app); 94 require('./dispatch')(app);
92 95
@@ -8,32 +8,40 @@ @@ -8,32 +8,40 @@
8 const outletModel = require('../models/outlet'); 8 const outletModel = require('../models/outlet');
9 const headerModel = require('../../../doraemon/models/header'); 9 const headerModel = require('../../../doraemon/models/header');
10 10
11 -const renderData = {  
12 - module: 'product'  
13 -}; 11 +const yhChannelEmpty = 0;
  12 +
  13 +const willEndActivity = {
  14 + type: 2,
  15 + template: 'outlet/will-end',
  16 + page: 'outlet-will-end'
  17 +}
14 18
  19 +const willStartActivity = {
  20 + type: 3,
  21 + template: 'outlet/will-start',
  22 + page: 'outlet-will-start'
  23 +}
15 24
16 // 奥莱首页控制器 25 // 奥莱首页控制器
17 -exports.index = (req, res) => { 26 +exports.index = (req, res, next) => {
18 let headerData = headerModel.setNav({ 27 let headerData = headerModel.setNav({
19 navTitle: 'OUTLET', 28 navTitle: 'OUTLET',
20 navBtn: false 29 navBtn: false
21 }); 30 });
22 31
23 let categoryId = req.query.category_id; 32 let categoryId = req.query.category_id;
24 - let yhChannel = req.query.yh_channel || 0; 33 + let yhChannel = req.query.yh_channel || yhChannelEmpty;
25 let contentcode = req.query.content_code; 34 let contentcode = req.query.content_code;
26 35
27 outletModel.getContent(categoryId, yhChannel, contentcode).then(result => { 36 outletModel.getContent(categoryId, yhChannel, contentcode).then(result => {
28 res.render('outlet', Object.assign({ 37 res.render('outlet', Object.assign({
29 - page: 'outlet',  
30 pageHeader: headerData 38 pageHeader: headerData
31 - }, renderData, result));  
32 - }); 39 + }, result));
  40 + }).catch(next);
33 }; 41 };
34 42
35 // 奥莱活动详情页 43 // 奥莱活动详情页
36 -exports.activityDetail = (req, res) => { 44 +exports.activityDetail = (req, res, next) => {
37 outletModel.getActivity(req.query.id).then(result => { 45 outletModel.getActivity(req.query.id).then(result => {
38 let headerData = headerModel.setNav({ 46 let headerData = headerModel.setNav({
39 navTitle: result.activityTitle, 47 navTitle: result.activityTitle,
@@ -44,30 +52,42 @@ exports.activityDetail = (req, res) => { @@ -44,30 +52,42 @@ exports.activityDetail = (req, res) => {
44 page: 'outlet-detail', 52 page: 'outlet-detail',
45 pageHeader: headerData, 53 pageHeader: headerData,
46 pageFooter: true 54 pageFooter: true
47 - }, renderData, result));  
48 - }); 55 + }, result));
  56 + }).catch(next);
49 }; 57 };
50 58
51 // 奥莱活动频道列表页 59 // 奥莱活动频道列表页
52 -exports.activityList = (req, res) => { 60 +exports.activityList = (req, res, next) => {
53 let headerData = headerModel.setNav({ 61 let headerData = headerModel.setNav({
54 navTitle: 'OUTLET', 62 navTitle: 'OUTLET',
55 navBtn: false 63 navBtn: false
56 }); 64 });
  65 +
57 let categoryId = req.query.category_id; 66 let categoryId = req.query.category_id;
58 - let type = req.query.type || 2;  
59 - let template = parseInt(type, 10) === 2 ? 'outlet/will-end' : 'outlet/will-start';  
60 - let page = parseInt(type, 10) === 2 ? 'outlet-will-end' : 'outlet-will-start'; 67 + let type = req.query.type || willEndActivity.type;
  68 +
  69 + let template;
  70 + let page;
61 71
62 if (!categoryId) { 72 if (!categoryId) {
63 throw new Error('No parent_id for OUTLET channel page!'); 73 throw new Error('No parent_id for OUTLET channel page!');
64 } 74 }
65 75
  76 + // 根据请求的类型确定要渲染的是即将结束页面还是上线预告页面
  77 + if (parseInt(type, 10) === willEndActivity.type) {
  78 + template = willEndActivity.template;
  79 + page = willEndActivity.page;
  80 + } else {
  81 + template = willStartActivity.template;
  82 + page = willStartActivity.page;
  83 + }
  84 +
  85 +
66 outletModel.getRecentActivity(type, categoryId).then(result => { 86 outletModel.getRecentActivity(type, categoryId).then(result => {
67 res.render(template, Object.assign({ 87 res.render(template, Object.assign({
68 page: page, 88 page: page,
69 pageHeader: headerData, 89 pageHeader: headerData,
70 pageFooter: true 90 pageFooter: true
71 - }, renderData, result));  
72 - }); 91 + }, result));
  92 + }).catch(next);
73 }; 93 };
@@ -31,7 +31,7 @@ const dateFormate = (str) =>{ @@ -31,7 +31,7 @@ const dateFormate = (str) =>{
31 }; 31 };
32 32
33 // 为了活动卡片特殊样式,将折扣信息拆分开来 33 // 为了活动卡片特殊样式,将折扣信息拆分开来
34 -const transDiscountToArr = (discount) => { 34 +const _transDiscountToArr = (discount) => {
35 return discount.replace(/(?:\d+[.\d]?)([\u4e00-\u9fa5]{1})/g, function(fullMatch, capture) { 35 return discount.replace(/(?:\d+[.\d]?)([\u4e00-\u9fa5]{1})/g, function(fullMatch, capture) {
36 if (capture) { 36 if (capture) {
37 const arr = []; 37 const arr = [];
@@ -52,7 +52,7 @@ const transDiscountToArr = (discount) => { @@ -52,7 +52,7 @@ const transDiscountToArr = (discount) => {
52 * @param {String} contentcode 内容码 52 * @param {String} contentcode 内容码
53 * @return {Promise} 53 * @return {Promise}
54 */ 54 */
55 -const getOutletResource = (channel, contentcode) => { 55 +const _getOutletResource = (channel, contentcode) => {
56 const params = { 56 const params = {
57 content_code: contentcode || 'c19ffa03f053f4cac3690b22c8da26b7', 57 content_code: contentcode || 'c19ffa03f053f4cac3690b22c8da26b7',
58 limit: 25, 58 limit: 25,
@@ -63,7 +63,7 @@ const getOutletResource = (channel, contentcode) => { @@ -63,7 +63,7 @@ const getOutletResource = (channel, contentcode) => {
63 if (result && result.code === 200) { 63 if (result && result.code === 200) {
64 return resourcesProcess(result.data.list); 64 return resourcesProcess(result.data.list);
65 } else { 65 } else {
66 - log.error('奥莱资源位接口返回状态码 不是 200'); 66 + log.error('the response code of outlet "operations/api/v5/resource/home" is NOT 200', result);
67 return []; 67 return [];
68 } 68 }
69 }); 69 });
@@ -74,7 +74,7 @@ const getOutletResource = (channel, contentcode) => { @@ -74,7 +74,7 @@ const getOutletResource = (channel, contentcode) => {
74 * @param {[Object]} 原始导航数据 74 * @param {[Object]} 原始导航数据
75 * @return {Object} 转换后的数据 75 * @return {Object} 转换后的数据
76 */ 76 */
77 -const convertNavData = (list) => { 77 +const _convertNavData = (list) => {
78 const formatData = []; 78 const formatData = [];
79 79
80 list = list || []; 80 list = list || [];
@@ -95,20 +95,19 @@ const convertNavData = (list) => { @@ -95,20 +95,19 @@ const convertNavData = (list) => {
95 * @param {String} 导航类型id 95 * @param {String} 导航类型id
96 * @return {Promise} 96 * @return {Promise}
97 */ 97 */
98 -const getNavData = (categoryId) => { 98 +const _getNavData = (categoryId) => {
99 const params = { 99 const params = {
100 - v: 7,  
101 parent_id: categoryId 100 parent_id: categoryId
102 }; 101 };
103 102
104 return serviceApi.get('operations/api/v6/category/getCategory', sign.apiSign(params)).then(result => { 103 return serviceApi.get('operations/api/v6/category/getCategory', sign.apiSign(params)).then(result => {
105 if (result && result.code === 200) { 104 if (result && result.code === 200) {
106 - let data = convertNavData(result.data); 105 + let data = _convertNavData(result.data);
107 106
108 data.category = categoryId; 107 data.category = categoryId;
109 return data; 108 return data;
110 } else { 109 } else {
111 - log.error('奥莱导航接口返回状态码 不是 200', result); 110 + log.error('the response code of "operations/api/v6/category/getCategory" is NOT 200', result);
112 return []; 111 return [];
113 } 112 }
114 }); 113 });
@@ -119,7 +118,7 @@ const getNavData = (categoryId) => { @@ -119,7 +118,7 @@ const getNavData = (categoryId) => {
119 * @param {Object} data 原始数据 118 * @param {Object} data 原始数据
120 * @return {Object} 转换后的数据 119 * @return {Object} 转换后的数据
121 */ 120 */
122 -const convertActicityData = (data) => { 121 +const _convertActicityData = (data) => {
123 const formatData = []; 122 const formatData = [];
124 123
125 let discountArr = [], 124 let discountArr = [],
@@ -130,11 +129,11 @@ const convertActicityData = (data) => { @@ -130,11 +129,11 @@ const convertActicityData = (data) => {
130 _.forEach(data, (item) => { 129 _.forEach(data, (item) => {
131 discountArr = item.promotionName.split('~'); 130 discountArr = item.promotionName.split('~');
132 if (discountArr.length === 1) { 131 if (discountArr.length === 1) {
133 - discountNum = transDiscountToArr(discountArr[0])[0];  
134 - discountText = transDiscountToArr(discountArr[0])[1]; 132 + discountNum = _transDiscountToArr(discountArr[0])[0];
  133 + discountText = _transDiscountToArr(discountArr[0])[1];
135 } else { 134 } else {
136 - discountNum = discountArr[0] + '~' + transDiscountToArr(discountArr[1])[0];  
137 - discountText = transDiscountToArr(discountArr[1])[1]; 135 + discountNum = discountArr[0] + '~' + _transDiscountToArr(discountArr[1])[0];
  136 + discountText = _transDiscountToArr(discountArr[1])[1];
138 } 137 }
139 138
140 139
@@ -159,21 +158,21 @@ const convertActicityData = (data) => { @@ -159,21 +158,21 @@ const convertActicityData = (data) => {
159 * @param {String} id 活动id 158 * @param {String} id 活动id
160 * @return {Promise} 调用接口的Promise 159 * @return {Promise} 调用接口的Promise
161 */ 160 */
162 -const getActivityDetail = (id) => { 161 +const _getActivityDetail = (id) => {
163 var params = { 162 var params = {
164 method: 'app.outlets.activityGet', 163 method: 'app.outlets.activityGet',
165 - sort: 1,  
166 - platform: 3, 164 + sort: 1, // 接口规定传1
  165 + platform: 3, // h5平台代号
167 id: id, 166 id: id,
168 - type: 0 167 + type: 0 // 接口规定传0
169 }; 168 };
170 169
171 170
172 return api.get('', sign.apiSign(params)).then(res => { 171 return api.get('', sign.apiSign(params)).then(res => {
173 if (res.code === 200) { 172 if (res.code === 200) {
174 - return convertActicityData(res.data); 173 + return _convertActicityData(res.data);
175 } else { 174 } else {
176 - log.error('获取奥莱活动详情页接口返回状态码 不是 200', res); 175 + log.error('the response code of "app.outlets.activityGet" is NOT 200', res);
177 return {}; 176 return {};
178 } 177 }
179 }); 178 });
@@ -184,14 +183,14 @@ const getActivityDetail = (id) => { @@ -184,14 +183,14 @@ const getActivityDetail = (id) => {
184 * @param {Object} data 请求接口所需的参数 183 * @param {Object} data 请求接口所需的参数
185 * @return {Promise} 调用接口的Promise 184 * @return {Promise} 调用接口的Promise
186 */ 185 */
187 -const getHomeActivity = (data) => { 186 +const _getHomeActivity = (data) => {
188 var params = { 187 var params = {
189 method: 'app.outlets.activityGet', 188 method: 'app.outlets.activityGet',
190 - platform: 3 189 + platform: 3 // h5平台代号
191 }; 190 };
192 191
193 return api.get('', sign.apiSign(_.assign(params, data))).then(res => { 192 return api.get('', sign.apiSign(_.assign(params, data))).then(res => {
194 - return convertActicityData(res.data); 193 + return _convertActicityData(res.data);
195 }); 194 });
196 }; 195 };
197 196
@@ -202,13 +201,13 @@ const getHomeActivity = (data) => { @@ -202,13 +201,13 @@ const getHomeActivity = (data) => {
202 * @param {Strting} code 内容码 201 * @param {Strting} code 内容码
203 * @return {Promise} 调用接口的Promise 202 * @return {Promise} 调用接口的Promise
204 */ 203 */
205 -exports.getContent = (categoryId, channel, code) => { 204 +const getContent = (categoryId, channel, code) => {
206 let params = { 205 let params = {
207 - type: 0, 206 + type: 0, // 获取全部奥莱活动列表, 不区分是否将开始或结束
208 yh_channel: channel 207 yh_channel: channel
209 }; 208 };
210 209
211 - const p = [getNavData(categoryId), getOutletResource(channel, code), getHomeActivity(params)]; 210 + const p = [_getNavData(categoryId), _getOutletResource(channel, code), _getHomeActivity(params)];
212 211
213 return Promise.all(p).then(data => { 212 return Promise.all(p).then(data => {
214 213
@@ -225,13 +224,13 @@ exports.getContent = (categoryId, channel, code) => { @@ -225,13 +224,13 @@ exports.getContent = (categoryId, channel, code) => {
225 * @param {String} id 活动id 224 * @param {String} id 活动id
226 * @return {Promise} 调用接口的Promise 225 * @return {Promise} 调用接口的Promise
227 */ 226 */
228 -exports.getActivity = (id) => {  
229 - return getActivityDetail(id).then(res => { 227 +const getActivity = (id) => {
  228 + return _getActivityDetail(id).then(res => {
230 return { 229 return {
231 activity: res, 230 activity: res,
232 productPool: res[0] && res[0].productPoolId || '', 231 productPool: res[0] && res[0].productPoolId || '',
233 activityTitle: res[0] && res[0].title || 'OUTLET', 232 activityTitle: res[0] && res[0].title || 'OUTLET',
234 - saleType: 4 233 + saleType: 4 // 促销类型, 奥莱为4
235 }; 234 };
236 }); 235 });
237 }; 236 };
@@ -242,12 +241,12 @@ exports.getActivity = (id) => { @@ -242,12 +241,12 @@ exports.getActivity = (id) => {
242 * @param {String} categoryId 父级菜单id,用于标明当前页面是奥莱页面 241 * @param {String} categoryId 父级菜单id,用于标明当前页面是奥莱页面
243 * @return {Object} 活动列表数据 242 * @return {Object} 活动列表数据
244 */ 243 */
245 -exports.getRecentActivity = (type, categoryId) => { 244 +const getRecentActivity = (type, categoryId) => {
246 var params = { 245 var params = {
247 type: type 246 type: type
248 }; 247 };
249 248
250 - return Promise.all([getNavData(categoryId), getHomeActivity(params)]).then(res => { 249 + return Promise.all([_getNavData(categoryId), _getHomeActivity(params)]).then(res => {
251 250
252 return { 251 return {
253 nav: res[0] || [], 252 nav: res[0] || [],
@@ -255,3 +254,9 @@ exports.getRecentActivity = (type, categoryId) => { @@ -255,3 +254,9 @@ exports.getRecentActivity = (type, categoryId) => {
255 }; 254 };
256 }); 255 });
257 }; 256 };
  257 +
  258 +module.exports = {
  259 + getContent: getContent,
  260 + getActivity: getActivity,
  261 + getRecentActivity: getRecentActivity
  262 +};
  1 +/**
  2 + * 设置页面的module,page默认值
  3 + * @author: 赵彪<bill.zhao@yoho.cn>
  4 + * @date: 2016/6/22
  5 + */
  6 +
  7 +'use strict';
  8 +
  9 +module.exports = () => {
  10 + return (req, res, next) => {
  11 + if (!req.xhr) {
  12 + const arr = req.path.substring(1).split('/');
  13 +
  14 + Object.assign(res.locals, {
  15 + module: arr[0],
  16 + page: arr[1]
  17 + });
  18 + }
  19 +
  20 + next();
  21 + };
  22 +};