Authored by weiqingting

Merge branch 'feature_student' into release/4.9.1.0

# Conflicts:
#	apps/product/models/detail.js
#	config/common.js
#	public/scss/common/_good.css
@@ -149,6 +149,7 @@ exports.index = (req, res, next) => { @@ -149,6 +149,7 @@ exports.index = (req, res, next) => {
149 banner, 149 banner,
150 icons, 150 icons,
151 link, 151 link,
  152 +
152 // url, 153 // url,
153 // param, 154 // param,
154 couponids = []; 155 couponids = [];
@@ -398,6 +399,7 @@ exports.detail = (req, res) => { @@ -398,6 +399,7 @@ exports.detail = (req, res) => {
398 399
399 exports.isLogin = (req, res, next) => { 400 exports.isLogin = (req, res, next) => {
400 // let refer = req.cookies.refer; 401 // let refer = req.cookies.refer;
  402 + let url = req.get('referer') || '/activity/student/register';
401 403
402 404
403 getPlatForm(req).then((yoho)=>{ 405 getPlatForm(req).then((yoho)=>{
@@ -415,8 +417,12 @@ exports.isLogin = (req, res, next) => { @@ -415,8 +417,12 @@ exports.isLogin = (req, res, next) => {
415 // refer = '/activity/student/register'; 417 // refer = '/activity/student/register';
416 // } 418 // }
417 419
  420 +
  421 + if (req.path === '/student/register' && !yoho.isStudent) {
  422 + url = '/activity/student/register';
  423 + }
418 res.redirect(helpers.urlFormat('/signin.html', { 424 res.redirect(helpers.urlFormat('/signin.html', {
419 - refer: req.get('referer') || '/activity/student/register' 425 + refer: url
420 })); 426 }));
421 }).catch(next); 427 }).catch(next);
422 428
1 -# 代码规范说明文档  
2 -  
3 -开发前请务必仔细阅读,遵守规范,保持团队代码风格统一  
4 -  
5 -## 文件命名  
6 -* 中划线分隔小写单词  
7 -* Ex: `your-file`  
8 -  
9 -## 缩进  
10 -* 统一4个Space  
11 -* 建议将编辑器Tab映射成4个Space  
12 -  
13 -## 注释  
14 -* 为每个你创建的JS文件添加注释  
15 -  
16 -```  
17 -/**  
18 - * 对文件实现功能的描述  
19 - * @date: 2016-11-11  
20 - * @author: name<emial@yoho.cn>  
21 - */  
22 -```  
23 -  
24 -* 为重要的函数添加注释  
25 -  
26 -```  
27 -/**  
28 - * 对函数功能的说明  
29 - * @params name paramType 参数描述  
30 - * @return name returnType 返回值描述  
31 - */  
32 -```  
33 -  
34 -* 为重要的代码、逻辑复杂的代码或者有特殊处理的代码添加注释  
35 -  
36 -```  
37 -// Your comments for the code  
38 -```  
39 -* 减少不必要的注释  
40 - 类似于:**进入循环****循环结束**等垃圾话的注释请谨慎添加,大家都是程序员,不用你注释也能知道的  
41 -  
42 -  
43 -## html  
44 -* 见名知意,不要有1,2,3这种名字出现  
45 -* class、id等属性命名为中划线分隔小写单词  
46 -* html中请不要出现不必要的嵌套以及不要将标签滥用,比如使用`a`标签作为不跳转的按钮的标签  
47 -* 属性按顺序出现:`id -> class -> name -> data-* -> src,for,type,href -> title,alt -> aria-*,role`  
48 -  
49 -## js  
50 -[Link](doc/code-norm/js.md)  
51 -  
52 -## css  
53 -[Link](doc/code-norm/css.md)  
1 -# css代码规范  
2 -  
3 -## 选择器  
4 -* 使用class进行样式匹配,而不是id和标签  
5 -* 尽量避免使用属性选择器  
6 -* 尽可能精确的元素定位  
7 -  
8 -## 规则细节  
9 -  
10 - .ele-header, /*规则1:每个选择器声明总是使用新的一行*/  
11 - .ele-body,  
12 - .ele-footer { /*规则2:'{' 前需要添加1个空格*/  
13 - line-height: 1.2; /*规则3:样式声明以;结束,每个样式声明独占一行*/  
14 - font-weight: normal; /*规则4:属性声明的:后添加1个空格*/  
15 - margin: 0; /*规则5:属性值为0时不添加单位*/  
16 - background-color: #f3d; /*规则6:十六进制小写和缩写*/  
17 - }  
18 - /*规则7:没组选择器声明之间适用一空行间隔*/  
19 - .ele2 {  
20 - font-family: "open sans", arial, sans-serif; /*规则8:使用" ",而不是' '*/  
21 - padding: 0 1em 2em; /*规则9:适当缩写但不滥用*/  
22 - border-top: 1px;  
23 - background-color: rgba(0,0,0,.5); /*规则10:颜色值rgba等中不需要增加空格,并且去除浮点数前面不必要的0*/  
24 - }  
25 -  
26 -## 声明顺序(不做强制要求,尽量实现)  
27 -这是一个选择器内书写CSS属性顺序的大致轮廓,作为最佳实践,我们应该遵循以下顺序:  
28 -  
29 -* Position属性 (position,top,right,z-index...)  
30 -* Box Model属性 (display,float,width...)  
31 -* Typographic属性 (font,line-height,color,text-align...)  
32 -* Visual属性 (background,border,border-radius...)  
33 -  
34 -因为Position属性可以是一个元素脱离正常的文本流并可以覆盖盒模型相关样式,所以Position排第一位。盒模型决定一个元素位置和大小紧跟其后。后面属性属于元素内部或不会对前两者产生影响的,排在后面。  
35 -  
36 -完整属性顺序参考[Recsss](http://twitter.github.com/recess)  
37 -  
38 -## Sass风格  
39 -* 控制嵌套层级,禁止超过5层,尽量控制在3层以内  
1 -# JavaScript代码规范  
2 -  
3 -## 行的长度  
4 -每行长度不应该超过**120**个字符,如果一行多余120个字符,应该在一个运算符后换行,下一行增加**2**级缩进,即8个空格)  
5 -```  
6 -doSomething(argument1, argument2, argument3, argument4,  
7 - argument5);  
8 -```  
9 -## 运算符间距  
10 -二元运算符前后必须使用一个空格保持表达式的整洁,操作符包括赋值运算符和逻辑运算符  
11 -```  
12 -var name = 'xuqi'; // GOOD  
13 -var name='xuqi'; // BAD  
14 -```  
15 -## 括号间距  
16 -当使用括号时,紧接左括号之后和紧接右括号之前不应该有空格。  
17 -```  
18 -doSomething(arg); // GODD  
19 -doSomething( arg ); // BAD  
20 -```  
21 -## 变量声明  
22 -* 所有变量在使用前应该先定义  
23 -* 变量定义应该放在函数开头  
24 -* 使用var,const,let表达式定义变量,每行定义一个  
25 -* 除了首行,所有行都应该多一层缩进使变量声明对齐  
26 -* 初始化的变量放在未初始化的变量之前  
27 -* 所有的变量命名必须使用英文单词  
28 -* 浮点变量必须指明实部(即便以0.开头)和小数点后一位  
29 -  
30 -```  
31 -var name = 'xuqi',  
32 - age,  
33 - sex,  
34 - ...;  
35 -  
36 -const $ = require('yoho.jquery');  
37 -  
38 -let i;  
39 -```  
40 -  
41 -另外,晦涩的变量名最好给出注释,否则别人很难读懂接下来代码的意思。  
42 -  
43 -## 函数声明  
44 -* 函数在使用前应该先定义  
45 -* 函数名和开始圆括号之间无空格(包括匿名函数的function关键字与圆括号之间)  
46 -* 开始圆括号和结束圆括号之间无空格  
47 -* 参数名之间应该在逗号之后保留一个空格  
48 -* 开始花括号应该同function关键字保持同一行,结束圆括号和开始花括号之间应该保留一个空格  
49 -* 函数体保持一级缩进  
50 -  
51 -```  
52 -function doSomething(arg1, arg2) {  
53 - doThing1();  
54 - doThing2();  
55 -}  
56 -  
57 -const method = function() {  
58 - doSomething();  
59 -};  
60 -```  
61 -另外,IIFE的标准格式也在这里指出:  
62 -```  
63 -(function(args) {  
64 - //  
65 -}(args)); //(args)位于外层括号内  
66 -```  
67 -  
68 -## 对象直接量  
69 -* 起始左括号应该与表达式保持一行  
70 -* 每个属性的键名前保持一个缩进,第一个属性应该在左括号后另一起行  
71 -* 每个属性的键名不包含引号,其后跟一个冒号(前无空格,后有空格),然后是值  
72 -* 如果属性值为函数,函数体应该在属性名之下另起一行,并且其前后均应保留一个空行  
73 -* 一组相关属性的前后插入空行以提高代码的可读性  
74 -* 结束的右括号独占一行  
75 -  
76 -```  
77 -var person = {  
78 - name: 'xuqi',  
79 - age: 25,  
80 -  
81 - groupAttr1: xx1,  
82 - groupAttr2: xx2,  
83 -  
84 - walk: function() {  
85 - //your walk fn  
86 - }  
87 -};  
88 -```  
89 -  
90 -* 当对象字面量作为函数参数时,起始括号应该与函数名同行  
91 -  
92 -```  
93 -doSomething({  
94 - //do something  
95 -});  
96 -```  
97 -  
98 -## 命名  
99 -### 变量:  
100 -* 采用小驼峰命名格式  
101 -* 变量命名为名词(区别函数)  
102 -* 变量中不使用_  
103 -  
104 -### 函数:  
105 -* 采用小驼峰命名格式  
106 -* 函数命名为动词(区别变量)  
107 -* 函数名中不使用_  
108 -  
109 -### 构造函数:  
110 -* 采用大驼峰命名格式  
111 -* 命名应该是名词  
112 -  
113 -### 私有成员:  
114 -* 一个对象中不希望外部访问的以下划线开头(约定)  
115 -  
116 -## 等号运算符  
117 -使用`===`和`!==`,禁止使用`==`和`!=`  
118 -  
119 -## undefined  
120 -禁止使用`name === undefined`判断一个变量是否定义。应该使用`typeof(name) === 'undefined'`;  
121 -  
122 -## 常用语句规范  
123 -### if语句  
124 -```  
125 -if (condition) {  
126 - doSomething();  
127 -} else if (condition1) {  
128 - doSomething2();  
129 -} else {  
130 - soOtherThing();  
131 -}  
132 -```  
133 -### for语句  
134 -```  
135 -// GOOD  
136 -var i;  
137 -for (i = 0; i < len; i++) {  
138 - doSomething();  
139 -}  
140 -for (i in collection) {  
141 - if (collection.hasOwnProperty(i)) {  
142 - doSomething();  
143 - }  
144 -}  
145 -  
146 -// BAD  
147 -for (var i = 0; i < len; i++) {  
148 - doSomething();  
149 -}  
150 -for (i in collection) {  
151 - doSomething();  
152 -}  
153 -```  
154 -### while,do语句  
155 -```  
156 -while (condition) {  
157 - doSomething();  
158 -}  
159 -  
160 -do {  
161 - doSomething();  
162 -} while (condition)  
163 -```  
164 -  
165 -### switch语句  
166 -* 每一个case保持一个缩进  
167 -* 每一组语句都应该以break,return等结尾,或者用一行注释表示跳过(falling through)  
168 -* 无default的情况也要注释特别说明  
169 -  
170 -```  
171 -switch (val) {  
172 - case 1:  
173 - //nothing  
174 - case 2:  
175 - doSomething();  
176 - break;  
177 - default:  
178 - doDefault();  
179 -}  
180 -```  
181 -  
182 -### try语句  
183 -```  
184 -try {  
185 - doSomething();  
186 -} catch (err) {  
187 - doSomething2();  
188 -} finally {  
189 - doSomething3();  
190 -}  
191 -```  
192 -  
193 -## 模块化规范  
194 -* 模块开头require加载所有依赖模块  
195 -  
196 -```  
197 -var $ = require('yoho.jquery'),  
198 - flip = require('../plugin/flip'); //普通文件  
199 -  
200 -require('../plguin/login');  
201 -```  
202 -  
203 -* 模块抛出接口应该给予注释说明功能和使用方法  
1 -##公共头部模拟数据  
2 -  
3 -```javascript  
4 -var pageHeader = {  
5 - navBack: true,  
6 - navTitle: '逛',  
7 - navBtn: {  
8 - indexUrl: '#',  
9 - categoryUrl: '#',  
10 - shoppingCartUrl: '#',  
11 - mineUrl: '#'  
12 - }  
13 - };  
14 -```  
15 -##公共底部模拟数据  
16 -  
17 -```javascript  
18 -var pageFooter = true;  
19 -```  
1 var $ = require('yoho-jquery'); 1 var $ = require('yoho-jquery');
2 var tip = require('../plugin/tip'); 2 var tip = require('../plugin/tip');
3 var AsideSlider = require('./aslider'); 3 var AsideSlider = require('./aslider');
4 -var yas = window._yas || {  
5 - sendCustomInfo: function() {}  
6 -}; 4 +
  5 +// var yas = window._yas || {
  6 +// sendCustomInfo: function() {}
  7 +// };
7 8
8 var STUDENTCOOKIES = 'STUDENTCOOKIES'; 9 var STUDENTCOOKIES = 'STUDENTCOOKIES';
9 10
@@ -400,12 +401,15 @@ $(document).on('click', '.s-submit', function() { @@ -400,12 +401,15 @@ $(document).on('click', '.s-submit', function() {
400 data: obj.data 401 data: obj.data
401 }).then(function(data) { 402 }).then(function(data) {
402 if (+data.code === 200) { 403 if (+data.code === 200) {
403 - yas.sendCustomInfo({  
404 - EVENT: 'YB_STUDENT_ATTCT_SUBMIT',  
405 - C_ID: C_ID,  
406 - SRC_ID: 5,  
407 - SUBMIT_RES: 1  
408 - }, false); 404 + if (window._yas && window._yas.sendCustomInfo) {
  405 + window._yas.sendCustomInfo({
  406 + EVENT: 'YB_STUDENT_ATTCT_SUBMIT',
  407 + C_ID: C_ID,
  408 + SRC_ID: 5,
  409 + SUBMIT_RES: 1
  410 + }, false);
  411 + }
  412 +
409 location.href = data.data; 413 location.href = data.data;
410 } else { 414 } else {
411 tip.show(data.message); 415 tip.show(data.message);
@@ -421,13 +425,16 @@ $(document).on('click', '.s-submit', function() { @@ -421,13 +425,16 @@ $(document).on('click', '.s-submit', function() {
421 } else { 425 } else {
422 FAILURE_CAUSE = 2; 426 FAILURE_CAUSE = 2;
423 } 427 }
424 - yas.sendCustomInfo({  
425 - EVENT: 'YB_STUDENT_ATTCT_SUBMIT',  
426 - C_ID: C_ID,  
427 - SRC_ID: 5,  
428 - SUBMIT_RES: 2,  
429 - FAILURE_CAUSE: FAILURE_CAUSE  
430 - }, true); 428 + if (window._yas && window._yas.sendCustomInfo) {
  429 + window._yas.sendCustomInfo({
  430 + EVENT: 'YB_STUDENT_ATTCT_SUBMIT',
  431 + C_ID: C_ID,
  432 + SRC_ID: 5,
  433 + SUBMIT_RES: 2,
  434 + FAILURE_CAUSE: FAILURE_CAUSE
  435 + }, true);
  436 + }
  437 +
431 } 438 }
432 }); 439 });
433 440
@@ -447,8 +454,14 @@ $('#tb-is-read').change(function() { @@ -447,8 +454,14 @@ $('#tb-is-read').change(function() {
447 454
448 455
449 // 埋点 学生认证-信息填写页面 456 // 埋点 学生认证-信息填写页面
450 -yas.sendCustomInfo({  
451 - EVENT: 'YB_STUDENT_ATTCT_INFO',  
452 - C_ID: C_ID,  
453 - SRC_ID: 5  
454 -}, true); 457 +setTimeout(function() {
  458 + if (window._yas && window._yas.sendCustomInfo) {
  459 + window._yas.sendCustomInfo({
  460 + EVENT: 'YB_STUDENT_ATTCT_INFO',
  461 + C_ID: C_ID,
  462 + SRC_ID: 5
  463 + }, true);
  464 + }
  465 +}, 2000);
  466 +
  467 +
@@ -6,9 +6,6 @@ var $ = require('yoho-jquery'), @@ -6,9 +6,6 @@ var $ = require('yoho-jquery'),
6 6
7 var _weChatInterface = '//m.yohobuy.com/life/getSignPackage', 7 var _weChatInterface = '//m.yohobuy.com/life/getSignPackage',
8 wx = window.wx, 8 wx = window.wx,
9 - yas = window.yas || {  
10 - sendCustomInfo: function() {}  
11 - },  
12 C_ID, 9 C_ID,
13 getChannel; 10 getChannel;
14 11
@@ -199,22 +196,30 @@ if (typeof wx !== 'undefined') { @@ -199,22 +196,30 @@ if (typeof wx !== 'undefined') {
199 wx.onMenuShareWeibo(shareData); 196 wx.onMenuShareWeibo(shareData);
200 }); 197 });
201 } 198 }
202 -if ($('.s-verify-fail').size()) {  
203 - yas.sendCustomInfo({  
204 - EVENT: 'YB_STUDENT_ATTCT_RESULT',  
205 - C_ID: C_ID,  
206 - SRC_ID: 5,  
207 - ATTCT_RES: 1,  
208 - FAILURE_CAUSE: ''  
209 - }, true);  
210 -} else {  
211 - // 埋点 学生营销宣传首页  
212 - yas.sendCustomInfo({  
213 - EVENT: 'YB_STUDENT_HOME',  
214 - C_ID: C_ID,  
215 - SRC_ID: 1  
216 - }, true);  
217 -} 199 +
  200 +setTimeout(function() {
  201 + if ($('.s-verify-fail').size()) {
  202 + if (window._yas && window._yas.sendCustomInfo) {
  203 + window._yas.sendCustomInfo({
  204 + EVENT: 'YB_STUDENT_ATTCT_RESULT',
  205 + C_ID: C_ID,
  206 + SRC_ID: 5,
  207 + ATTCT_RES: 1,
  208 + FAILURE_CAUSE: ''
  209 + }, true);
  210 + }
  211 + } else {
  212 + // 埋点 学生营销宣传首页
  213 + if (window._yas && window._yas.sendCustomInfo) {
  214 + window._yas.sendCustomInfo({
  215 + EVENT: 'YB_STUDENT_HOME',
  216 + C_ID: C_ID,
  217 + SRC_ID: 1
  218 + }, true);
  219 + }
  220 + }
  221 +}, 3000);
  222 +
218 223
219 224
220 225
@@ -234,9 +239,11 @@ $('.swiper-slide', '.banner-top').click(function() { @@ -234,9 +239,11 @@ $('.swiper-slide', '.banner-top').click(function() {
234 F_INDEX: 1, 239 F_INDEX: 1,
235 I_INDEX: index 240 I_INDEX: index
236 }; 241 };
237 - yas.sendCustomInfo(options, false); 242 + if (window._yas && window._yas.sendCustomInfo) {
  243 + window._yas.sendCustomInfo(options, true);
  244 + }
238 245
239 -// return false; 246 + // return false;
240 }); 247 });
241 $('.s-activity', '.s-section').click(function() { 248 $('.s-activity', '.s-section').click(function() {
242 var options; 249 var options;
@@ -253,7 +260,9 @@ $('.s-activity', '.s-section').click(function() { @@ -253,7 +260,9 @@ $('.s-activity', '.s-section').click(function() {
253 F_INDEX: 3, 260 F_INDEX: 3,
254 I_INDEX: index 261 I_INDEX: index
255 }; 262 };
256 - yas.sendCustomInfo(options, false); 263 + if (window._yas && window._yas.sendCustomInfo) {
  264 + window._yas.sendCustomInfo(options, true);
  265 + }
257 }); 266 });
258 $('.good-info', '.goods-list').click(function() { 267 $('.good-info', '.goods-list').click(function() {
259 var options; 268 var options;
@@ -270,5 +279,9 @@ $('.good-info', '.goods-list').click(function() { @@ -270,5 +279,9 @@ $('.good-info', '.goods-list').click(function() {
270 F_INDEX: 4, 279 F_INDEX: 4,
271 I_INDEX: index 280 I_INDEX: index
272 }; 281 };
273 - yas.sendCustomInfo(options, false); 282 + if (window._yas && window._yas.sendCustomInfo) {
  283 + window._yas.sendCustomInfo(options, true);
  284 + }
274 }); 285 });
  286 +
  287 +