Authored by yyq

Merge branch 'release/5.2' into feature/yohoCoinUse

/**
* 广告联盟接口
* Created by TaoHuang on 2016/11/8.
*/
'use strict';
const config = global.yoho.config;
const helpers = global.yoho.helpers;
const crypto = global.yoho.crypto;
const Fn = require('lodash/fp');
const _ = require('lodash');
const jump = (req, res) => {
let _QYH_UNION = req.query._QYH_UNION || '';
let target = req.query.target || '';
let encodeStr = Fn.pipe(decodeURIComponent, _.partial(crypto.encryption, null), encodeURIComponent);
res.cookie('_QYH_UNION', encodeStr(_QYH_UNION), {
domain: config.cookieDomain
});
res.redirect(target || helpers.urlFormat(''));
};
module.exports = {
jump
};
... ...
/**
* sub app 3party-ad
* @author: htoooth<ht.anglenx@gmail.com>
* @date: 2016/11/08
*/
var express = require('express'),
path = require('path');
var app = express();
// set view engin
var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
app.on('mount', function(parent) {
delete parent.locals.settings; // 不继承父 App 的设置
Object.assign(app.locals, parent.locals);
});
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: [path.join(__dirname, 'views/partial')],
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
}));
// router
app.use(require('./router'));
module.exports = app;
... ...
/**
* router of sub app 3party-ad
* @author: htoooth<ht.anglenx@gmail.com>
* @date: 2016/11/08
*/
'use strict';
const router = require('express').Router(); // eslint-disable-line
const cRoot = './controllers';
const ads = require(`${cRoot}/ads`); // 第三方广告平台对接
// Your controller here
router.get('/ads', ads.jump);
module.exports = router;
... ...
... ... @@ -11,6 +11,7 @@ const crypto = global.yoho.crypto;
const helpers = global.yoho.helpers;
const HeaderModel = require('../../../doraemon/models/header');
const homeService = require('../../product/models/home-service');
const config = global.yoho.config;
exports.getCouponData = (channel, params) => {
return Promise.coroutine(function*() {
... ... @@ -28,7 +29,7 @@ exports.getCouponData = (channel, params) => {
const requestData = yield Promise.all([
api.get('', Object.assign(params, {
method: 'app.promotion.queryCouponCenter'
})),
}), config.apiCache),
HeaderModel.requestHeaderData(channel)
]);
... ... @@ -85,7 +86,7 @@ exports.getCouponStatus = (params) => {
return Promise.coroutine(function*() {
const coupon = yield api.get('', Object.assign(params, {
method: 'app.promotion.queryCouponCenter'
}));
}), config.apiCache);
const result = {
code: coupon.code,
categories: []
... ...
... ... @@ -30,8 +30,8 @@ router.get('/logout.html', login.local.logout);
router.post('/passport/login/password/checkuser', back.fakeGetUserInfoAPI);// 假的,密码登录检查用户是否注册
// 二维码登录
router.post('/passport/login/qrcode/refresh', login.local.qrcode.refresh); // 刷新二维码
router.post('/passport/login/qrcode/check', login.local.qrcode.check); // 验证二维码的状态
//router.post('/passport/login/qrcode/refresh', login.local.qrcode.refresh); // 刷新二维码
//router.post('/passport/login/qrcode/check', login.local.qrcode.check); // 验证二维码的状态
router.get('/passport/login', login.common.beforeLogin, login.local.loginPage);
router.post('/passport/login/auth', login.local.login);
... ...
... ... @@ -4,35 +4,38 @@
<form method='post' onsubmit='return false;'>
<div class="content">
<ul class="login-ul">
<div class="switch-login-type" data-type="DesktopLogin">
<div id="device-bg" class="type-mobile-bg"></div>
<div class="type-tip tip-title">
<div id="device-tip" style="margin-left: 15px;margin-top: 8px">扫码登录更安全</div>
</div>
{{#if qrcodeLogin}}
<div id="device-bg" class="type-mobile-bg"></div>
<div class="type-tip tip-title">
<div id="device-tip" style="margin-left: 15px;margin-top: 8px">扫码登录更安全</div>
</div>
{{^}}
<div id="device-bg"></div>
{{/if}}
</div>
<div class="desktop-login">
<li class="relative clearfix">
<h2 class="title">会员登录</h2>
<span id="country-code" class="country-code right">
<em>{{countryName}} {{countryCode}}</em>
<i class="iconfont">&#xe60b;</i>
<ul id="country-list" class="country-list">
{{#each countryList}}
<li data-cc="{{areaCode}}"
{{# selected}}selected{{/selected}}>{{name}} {{areaCode}}</li>
{{/each}}
</ul>
</span>
<span id="country-code" class="country-code right">
<em>{{countryName}} {{countryCode}}</em>
<i class="iconfont">&#xe60b;</i>
<ul id="country-list" class="country-list">
{{#each countryList}}
<li data-cc="{{areaCode}}"
{{# selected}}selected{{/selected}}>{{name}} {{areaCode}}</li>
{{/each}}
</ul>
</span>
</li>
<li class="relative hide">
<div class="switch">
<div class="left selected" data-type="PasswordLogin">普通登录</div>
{{#if smsLogin}}
<div class="right" data-type="SMSLogin">手机验证码登录</div>
<div class="right" data-type="SMSLogin">手机验证码登录</div>
{{/if}}
</div>
</li>
... ... @@ -41,70 +44,73 @@
<input id="account1" class="account input va" name="account" value="{{bindMobile}}"
type="text"
placeholder="邮箱/手机号码" autocomplete="off">
<span class="err-tip hide">
<i></i>
<em></em>
</span>
<span class="err-tip hide">
<i></i>
<em></em>
</span>
</li>
<li class="relative password-login">
<input id="password" class="password input va" name="password" type="password"
placeholder="密码"
autocomplete="off" maxlength="20">
<span id="caps-lock" class="caps-lock hide">大写状态开启</span>
<span class="err-tip hide">
<i></i>
<em>请输入密码</em>
</span>
</li>
{{#if smsLogin}}
<li class="relative clearfix sms-login hide">
<input id="account2" class="account input va" name="account2" value="{{bindMobile}}"
type="text"
placeholder="手机号码" autocomplete="off">
<span class="err-tip hide">
<i></i>
<em></em>
</span>
<span class="err-tip hide">
<i></i>
<em>请输入密码</em>
</span>
</li>
<li class="relative clearfix sms-login hide">
<input id="captcha-sms" class="input va captcha-sms-input" type="text" name="captcha"
placeholder="短信验证码"
autocomplete="off" maxlength="4">
<div class="change-captcha-sms btn">获取短信验证码</div>
<span class="err-tip hide">
<i></i>
<em></em>
</span>
</li>
{{/if}}
{{#if smsLogin}}
<li class="relative clearfix sms-login hide">
<input id="account2" class="account input va" name="account2" value="{{bindMobile}}"
type="text"
placeholder="手机号码" autocomplete="off">
<span class="err-tip hide">
<i></i>
<em></em>
</span>
</li>
<li class="relative clearfix sms-login hide">
<input id="captcha-sms" class="input va captcha-sms-input" type="text" name="captcha"
placeholder="短信验证码"
autocomplete="off" maxlength="4">
<div class="change-captcha-sms btn">获取短信验证码</div>
<span class="err-tip hide">
<i></i>
<em></em>
</span>
</li>
{{/if}}
<li class="clearfix captcha-wrap hide">
<input id="captcha" class="input va captcha" type="text" name="captcha" placeholder="图形验证码"
autocomplete="off" maxlength="4">
<img id="captcha-img" class="captcha-img" alt="">
<a class="link change-captcha">换一张</a>
<span class="err-tip hide">
<i></i>
<em></em>
</span>
<span class="err-tip hide">
<i></i>
<em></em>
</span>
</li>
<li class="desktop-login">
<span id="login-btn" class="login-btn btn">登录</span>
</li>
<li class="other-opts">
<span class="remember-me checked">
<i class="iconfont">&#xe613;</i>
记住登录状态
</span>
<span class="right">
<a class="forget-password" href="{{forgetPwd}}">忘记密码?</a>
|
<a class="fast-reg" href="{{fastReg}}">快速注册</a>
</span>
<span class="remember-me checked">
<i class="iconfont">&#xe613;</i>
记住登录状态
</span>
<span class="right">
<a class="forget-password" href="{{forgetPwd}}">忘记密码?</a>
|
<a class="fast-reg" href="{{fastReg}}">快速注册</a>
</span>
</li>
<li class="third-party-login">
<a href="{{weixinLogin}}">
<span class="icon weixin"></span>
... ... @@ -161,10 +167,12 @@
</li>
</div>
</ul>
<input id="country-code-hide" name="countryCode" type="hidden" value="{{countryCode}}">
<input id="captcha-sms-token-hide" name="token" type="hidden">
<input id="qrcode" name="qrcode" type="hidden" value="//m.yohobuy.com/signin.html">
<input id="uid" type="hidden">
</div>
</form>
{{/ passport}}
... ...
... ... @@ -403,7 +403,6 @@ const _getFashionTopGoodsStatus = (uid, showStatus, isBeginSale) => {
result.dis = true;
} else {
result.openSoon = true;
result.hadLimitedCode = false;
}
result.getLimitedCode = true;
break;
... ... @@ -411,14 +410,12 @@ const _getFashionTopGoodsStatus = (uid, showStatus, isBeginSale) => {
result.buyNow = true;
result.dis = true;
result.limitedCodeSoldOut = true;
result.hadLimitedCode = false;
break;
case 3: // 开售后,商品已经售罄
result.soldOut = true;
break;
case 4:// 开售后,立即购买(用户已领取限购码)
result.buyNow = true;
result.dis = false;
result.hadLimitedCode = true;
if (uid) { // 限购码失效
result.getLimitedCodeDis = true;
... ... @@ -426,7 +423,6 @@ const _getFashionTopGoodsStatus = (uid, showStatus, isBeginSale) => {
break;
case 5: // 开售前,限购码已被抢光(用户未领取限购码)
result.openSoon = true;
result.hadLimitedCode = true;
result.limitedCodeSoldOut = true;
break;
case 6: // 开售前,即将开售(用户已领取限购码)
... ...
... ... @@ -67,7 +67,7 @@ module.exports = {
port: '4444' // influxdb port
},
console: {
level: 'info',
level: 'error',
colorize: 'all',
prettyPrint: true
}
... ... @@ -116,10 +116,10 @@ if (isProduction) {
master: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'],
slave: ['memcache1.yohoops.org:12112', 'memcache2.yohoops.org:12112', 'memcache3.yohoops.org:12112'],
session: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'],
poolSize: 25,
poolSize: 100,
reconnect: 5000,
timeout: 300,
retries: 1,
retries: 0,
retry: 3000
},
useOneapm: true,
... ...
... ... @@ -15,7 +15,10 @@ module.exports = app => {
app.use('/product', require('./apps/product')); // 商品相关页面
app.use(require('./apps/passport')); // 登录注册
app.use('/home', require('./apps/home')); // 会员中心
app.use('/brands', require('./apps/brands'));
app.use('/guang', require('./apps/guang'));
app.use('/brands', require('./apps/brands')); // 品牌一览
app.use('/guang', require('./apps/guang')); // 逛
app.use('/cart', require('./apps/cart'));// 购物车
// 第三方,如广告联盟
app.use('/3party', require('./apps/3party'));
};
... ...
{
"name": "yohobuy-node",
"version": "5.1.5",
"version": "5.1.6",
"private": true,
"description": "A New Yohobuy Project With Express",
"repository": {
... ...
... ... @@ -5,7 +5,10 @@
"script": "app.js",
"instances": "6",
"exec_mode": "cluster",
"merge_logs": true,
"log_date_format": "YYYY-MM-DD HH:mm Z",
"env": {
"TZ": "Asia/Shanghai",
"PORT": 6002
}
}
... ...
... ... @@ -253,30 +253,30 @@ accountChangeEvent.add(function(type) {
// 重置状态
accountChangeEvent.add(function(type) {
hideAccountTip1(); // eslint-disable-line
hideAccountTip2(); // eslint-disable-line
hideCaptchaImgTip(); // eslint-disable-line
hideCaptchaSmsTip(); // eslint-disable-line
hidePasswordTip(); // eslint-disable-line
$passwordInput.val('');
$captchaImgInput.val('');
$captchaSmsInput.val('');
$captchaSmsTokenHideInput.val('');
if (type === AccountLoginData.QRCodeLogin.name) {
$qrCodeOverLayer.empty();
initQrCode(); // eslint-disable-line
}
//hideAccountTip1(); // eslint-disable-line
//hideAccountTip2(); // eslint-disable-line
//hideCaptchaImgTip(); // eslint-disable-line
//hideCaptchaSmsTip(); // eslint-disable-line
//hidePasswordTip(); // eslint-disable-line
//
//$passwordInput.val('');
//$captchaImgInput.val('');
//$captchaSmsInput.val('');
//$captchaSmsTokenHideInput.val('');
//
//if (type === AccountLoginData.QRCodeLogin.name) {
// $qrCodeOverLayer.empty();
// initQrCode(); // eslint-disable-line
//}
});
// 保留已输入的帐号信息
accountChangeEvent.add(function(type) {
if (type === AccountLoginData.SMSLogin.name) {
$accountInput2.val($accountInput1.val());
} else {
$accountInput1.val($accountInput2.val());
}
//if (type === AccountLoginData.SMSLogin.name) {
// $accountInput2.val($accountInput1.val());
//} else {
// $accountInput1.val($accountInput2.val());
//}
});
desktopTipShowOnce.add(function() {
... ... @@ -1073,31 +1073,35 @@ $deviceSwitcher.on('click', function() {
$parent = $this.parent(),
type = $parent.data('type');
$deviceTips.addClass('hide'); // 提示一直隐藏
// 二维码登录
//$deviceTips.addClass('hide'); // 提示一直隐藏
//
//$(deviceLoginData[type].ele).removeClass('hide');
//$(deviceLoginData[type].hideEle).addClass('hide');
//
//$parent.data('type', deviceLoginData[type].dataType);
//$parent.find('#device-tip').html(deviceLoginData[type].tipText);
//
//$this.removeClass(deviceLoginData[type].removeClass)
// .addClass(deviceLoginData[type].bgClass);
// end 二维码登录结束
$(deviceLoginData[type].ele).removeClass('hide');
$(deviceLoginData[type].hideEle).addClass('hide');
$parent.data('type', deviceLoginData[type].dataType);
$parent.find('#device-tip').html(deviceLoginData[type].tipText);
$this.removeClass(deviceLoginData[type].removeClass)
.addClass(deviceLoginData[type].bgClass);
if (type === 'DesktopLogin') {
desktopTipShowOnce.fire();
//desktopTipShowOnce.fire();
// 还原桌面登录方式
accountChangeEvent.fire(getDesktopLoginType());
stopPollingQrCodeTimer();
} else {
mobileTipShowOnce.fire();
accountChangeEvent.fire('QRCodeLogin');
refreshQrCodeAsync().then(pollingThisQrCodeStatusAsync);
//stopPollingQrCodeTimer();
}
//} else {
// mobileTipShowOnce.fire();
//
// accountChangeEvent.fire('QRCodeLogin');
//
// refreshQrCodeAsync().then(pollingThisQrCodeStatusAsync);
//}
});
// 鼠标移动到上面
... ...
... ... @@ -745,7 +745,8 @@ lazyLoad($('#details-html img'));
function fetchComment() {
var commentPage = {}, // 每个类型的分页页码
currentType = '7', // 当前评论展示的类型
consultPage = 1;
consultPage = 1,
cNumReady = false; // 只第一次请求后更新数量
var commentsTpl = require('hbs/product/comment-item.hbs'),
consultsTpl = require('hbs/product/consult-item.hbs'),
... ... @@ -790,15 +791,19 @@ function fetchComment() {
// 更新总数显示
// $commentNum.text(res[0].total);
$(filter).each(function(idx, fit) {
if (fit.num) {
$('.comments [data-comment-type=' + fit.filterId + '] em').text(fit.num);
if (fit.filterId === '7') { // 全部数量
$('.consult-comment .block-title .comment-num').text(fit.num);
if (filter && filter.length && !cNumReady) {
cNumReady = true;
$(filter).each(function(idx, fit) {
if (fit.num) {
$('.comments [data-comment-type=' + fit.filterId + '] em').text(fit.num);
if (fit.filterId === '7') { // 全部数量
$('.consult-comment .block-title .comment-num').text(fit.num);
}
}
}
});
});
}
$ul.append(commentsTpl({
comments: res
... ...
... ... @@ -151,6 +151,7 @@ function syncCouponStatus() {
coup.status === 3 ? setPicked(couponObj[i]) : false;
} else {
couponObj[i].status = 2; // 券不存在设置领取状态为已领光
couponObj[i].dom.text('已领光');
}
}
}
... ...