Authored by htoooth

add assets.

Showing 59 changed files with 763 additions and 188 deletions
... ... @@ -12,7 +12,9 @@ const helpers = require(`${library}/helpers`);
const service = require('../models/back-service');
const SIGN_IN_URL = helpers.urlFormat('signin.html');
// helpers.urlFormat = helpers.fakeUrlFormat;
const SIGN_IN_URL = helpers.urlFormat('/signin.html');
/**
* 通过邮箱找回密码页面
... ... @@ -28,47 +30,48 @@ module.exports.indexPageByEmail = (req, res) => {
res.render('back/email', Object.assign({
module: 'passport',
page: 'back',
page: 'back-email',
title: '找回密码-通过邮箱'
}, data)
);
}, data));
};
/**
* 发送验证码到邮箱
*/
module.exports.sendCodeToEmailAPI = (req, res, next) => {
module.exports.sendCodeToEmailAPI = (req, res) => {
let email = req.body.email || '';
if (!helpers.verifyEmail(email)) {
res.json({
code: 400,
message: '邮箱格式不正确,请重新输入',
data: ''
});
let error = {
code: 400,
message: '邮箱格式不正确,请重新输入',
data: ''
};
if (!helpers.verifyEmail(email)) {
res.json(error);
return;
}
service.sendCodeToEmailAsync(email).then(result => {
if (result.code === 200) {
result.data = helpers.urlFormat('passport/back/success', {email: email});
result.data = helpers.urlFormat('/passport/back/success.html', {email: email});
}
res.json(result);
}).catch(next);
}).catch(() => {
res.json(error);
});
};
/**
* 重新发送验证码到邮箱
*/
module.exports.resendCodeToEmailAPI = (req, res) => {
let email = req.params.email || '';
let email = req.query.email || '';
service.sendCodeToEmailAsync(email).then(result => {
if (_.isEmpty(result)) {
return Promise.rejected('重发邮件失败');
return Promise.rejected('重发邮件失败');
}
res.json(result);
... ... @@ -84,7 +87,7 @@ module.exports.resendCodeToEmailAPI = (req, res) => {
* 邮箱找回密码-返回成功页面
*/
module.exports.backSuccessPageByEmail = (req, res) => {
let email = req.params.email || '';
let email = req.query.email || '';
if (!helpers.verifyEmail(email)) {
res.redirect(400);
... ... @@ -95,23 +98,25 @@ module.exports.backSuccessPageByEmail = (req, res) => {
let emailUrl = `http://${domain === 'gmail.com' ? 'mail.google.com' : 'mail.'}${domain}`;
res.render('back/email-success', {
backUrl: helpers.urlFormat('emailback.html'),
res.render('back/email-success', Object.assign({
module: 'passport',
page: 'back-email-success',
title: '找回密码-通过邮箱'
}, {
backUrl: helpers.urlFormat('/passport/back/email.html'),
headerText: '找回密码',
isPassportPage: true,
backEmailSuccess: true,
goEmail: emailUrl,
resendUrl: helpers.urlFormat('passport/back/resendemail', {email: email}),
title: '找回密码-通过邮箱'
});
resendUrl: helpers.urlFormat('/passport/back/resendemail', {email: email})
}));
};
/**
* 根据邮箱修改密码
*/
module.exports.changePasswordByEmailAPI = (req, res) => {
module.exports.setNewPasswordByEmailAPI = (req, res) => {
let pwd = req.body.password || '';
let code = req.body.code || '';
... ... @@ -134,20 +139,25 @@ module.exports.changePasswordByEmailAPI = (req, res) => {
};
/**
* 找回密码-通过手机号
* 找回密码页面-通过手机号
*/
module.exports.indexPageByMobile = (req, res) => {
service.getAreaDataAsync().then(result => {
res.render('mobile', {
backUrl: SIGN_IN_URL,
headerText: '找回密码',
isPassportPage: true,
backMobile: true,
countrys: result,
areaCode: '+86',
title: '找回密码-通过手机号'
});
});
module.exports.indexPageByMobile = (req, res, next) => {
service.getAreaDataAsync()
.then(result => {
res.render('back/mobile', Object.assign({
module: 'passport',
page: 'back-mobile',
title: '找回密码-通过手机号'
}, {
backUrl: SIGN_IN_URL,
headerText: '找回密码',
isPassportPage: true,
backMobile: true,
countrys: result.data,
areaCode: '+86'
}));
}).catch(next);
};
/**
... ... @@ -175,7 +185,7 @@ module.exports.sendCodeToMobileAPI = (req, res) => {
}
if (data.code === 200) {
result.data = helpers.urlFormat('passport/back/mobilecode', {
result.data = helpers.urlFormat('/passport/back/verifycode', {
phoneNum: phoneNum,
areaCode: areaCode
});
... ... @@ -194,19 +204,24 @@ module.exports.sendCodeToMobileAPI = (req, res) => {
/**
* 校验验证码页面
*/
module.exports.VerifyCodePageByMobile = (req, res) => {
let phoneNum = req.params.phoneNum || '';
module.exports.verifyCodePageByMobile = (req, res) => {
let phoneNum = req.query.phoneNum || '';
let areaCode = `+${(req.params.areaCode || '86')}`;
let areaCode = `+${(req.query.areaCode || '86')}`;
res.render('mobile-code', {
backUrl: helpers.urlFormat('phoneback.html'),
res.render('back/mobile-code', Object.assign({
module: 'passport',
page: 'mobile-code',
title: '找回密码-通过手机号'
}, {
backUrl: helpers.urlFormat('/passport/back/mobile.html'),
headerText: '找回密码',
isPassportPage: true,
backCode: true,
areaCode: areaCode,
phoneNum: phoneNum
});
}));
};
/**
... ... @@ -222,7 +237,7 @@ module.exports.verifyCodeByMobileAPI = (req, res) => {
service.validateMobileCodeAsync(phoneNum, code, areaCode)
.then(result => {
if (result.code === 200) {
result.data = helpers.urlFormat('passport/back/backcode', {
result.data = helpers.urlFormat('/passport/back/backcode.html', {
phoneNum: phoneNum,
token: result.data.token,
areaCode: areaCode
... ... @@ -230,27 +245,31 @@ module.exports.verifyCodeByMobileAPI = (req, res) => {
}
res.json(result);
}).catch(() => res.json({code: 400, message: '验证码失'}));
}).catch(() => res.json({code: 400, message: '验证码失'}));
};
/**
* 找回密码页面,设置新密码页面-手机
*/
module.exports.forgotPasswordPageByMobile = (req, res) => {
let phoneNum = req.params.phoneNum || '';
module.exports.setNewPasswordPageByMobile = (req, res) => {
let phoneNum = req.query.phoneNum || '';
let token = req.params.token || '';
let token = req.query.token || '';
let areaCode = req.params.areaCode || '86';
let areaCode = req.query.areaCode || '86';
let code = req.params.code || '';
let code = req.query.code || '';
if (!token || (!helpers.verifyMobile(phoneNum) && !code)) {
res.redirect(400);
return;
}
res.render('new-password', {
res.render('back/new-password', Object.assign({
module: 'passport',
page: 'back-new-password',
title: '找回密码-输入新密码'
}, {
backUrl: SIGN_IN_URL,
headerText: '找回密码',
isPassportPage: true,
... ... @@ -258,15 +277,14 @@ module.exports.forgotPasswordPageByMobile = (req, res) => {
phoneNum: phoneNum,
token: token,
areaCode: areaCode,
code: code,
title: '找回密码-输入新密码'
});
code: code
}));
};
/**
* 根据手机验证码修改密码
*/
module.exports.changePasswordByMobileAPI = (req, res) => {
module.exports.setNewPasswordByMobileAPI = (req, res) => {
let phoneNum = req.body.phoneNum || '';
let token = req.body.token || '';
... ...
... ... @@ -9,12 +9,53 @@
const express = require('express');
const cRoot = './controllers';
const login = require(cRoot + '/login');
const back = require(cRoot + '/back');
const router = express.Router(); // eslint-disable-line
router.get('/login', login.local.loginPage);
router.get('/login/wechat', login.wechat.beforeLogin, login.wechat.login); // 登录
router.get('/login/wechat/callback', login.wechat.callback);
router.get('/ ');
/**
* 邮箱
*/
// 通过邮箱找回密码
router.get('/back/email.html', back.indexPageByEmail);
// 发送邮箱验证码
router.post('/back/sendemail', back.sendCodeToEmailAPI);
// 重新发送邮箱验证码
router.get('/back/resendemail', back.resendCodeToEmailAPI);
// 邮箱找回密码-成功
router.get('/back/success.html', back.backSuccessPageByEmail);
// 据邮箱修改密码
router.post('/back/passwordbyemail', back.setNewPasswordByEmailAPI);
/**
* 手机
*/
// 通过手机找回密码
router.get('/back/mobile.html', back.indexPageByMobile);
// 发送手机验证码
router.get('/back/mobilecode.html', back.verifyCodePageByMobile);
// 发送手机验证码
router.post('/back/sendcode', back.sendCodeToMobileAPI);
// 校验手机验证码
router.post('/back/verifycode', back.verifyCodeByMobileAPI);
// 找回密码
router.get('/back/backcode.html', back.setNewPasswordPageByMobile);
// 根据手机验证码修改密码
router.post('/back/passwordbymobile', back.setNewPasswordByMobileAPI);
module.exports = router;
... ...
<div class="back-email-success-page passport-page yoho-page">
{{> passport/header}}
<div class="content">
<p class="tip">验证邮件已发送至你的邮箱</p>
<p class="sub-tip">请在24小时内通过邮件内的链接设置新密码</p>
<a class="go-email btn" href={{goEmail}}>去邮箱看看</a>
<a id="resend" class="resend" data-url={{resendUrl}}>重新发送邮件</a>
</div>
</div>
... ...
<div class="back-email-page passport-page yoho-page">
{{> passport/header}}
<div class="content">
<div class="input-container row has-clear">
<input id="email" class="input email" type="text" placeholder="请输入邮箱" autocomplete="off">
</div>
<span id="btn-sure" class="btn btn-sure disable row">确定</span>
</div>
</div>
... ...
<div class="back-code-page passport-page yoho-page">
{{> passport/code}}
</div>
... ...
<div class="back-mobile-page passport-page yoho-page">
{{> passport/header}}
<div class="content">
{{> passport/country_list}}
<div class="input-container phone-container row has-clear">
<span id="area-code" class="area-code">{{areaCode}}</span>
<input id="phone-num" class="input phone-num" type="text" placeholder="手机号">
</div>
<span id="btn-next" class="btn btn-next disable row">下一步</span>
</div>
</div>
... ...
<div class="back-new-password-page passport-page yoho-page">
{{> passport/header}}
<div class="content">
<div class="input-container row has-eye">
<input id="pwd" class="input pwd" type="text" placeholder="请输入新密码" autocomplete="off" maxlength="20">
</div>
<span id="btn-ok" class="btn btn-ok disable">完成</span>
</div>
{{#if phoneNum}}
<input id="phone-num" type="hidden" value={{phoneNum}}>
<input id="area-code" type="hidden" value={{areaCode}}>
<input id="token" type="hidden" value={{token}}>
{{/if}}
{{# code}}
<input id="email-code" type="hidden" value={{.}}>
{{/ code}}
</div>
... ...
{{> passport/header}}
<div class="content">
<div class="text-container">
验证码已发送至
<span class="phone">
+{{areaCode}} {{phoneNum}}
</span>
</div>
<div class="input-container row has-clear">
<input id="captcha" class="input captcha" type="text" placeholder="验证码" maxlength="6" autocomplete="off">
<div id="captcha-tip" class="captcha-tip disable">重新发送 (60秒)</div>
</div>
<span id="btn-next" class="btn btn-next disable row">确定</span>
<div class="tip">
{{#if relateCode}}
注:关联的手机号不能用来登录此帐号
{{/if}}
</div>
<input id="phone-num" type="hidden" value={{phoneNum}}>
<input id="area-code" type="hidden" value={{areaCode}}>
<input id="token" type="hidden" value={{token}}>
</div>
... ...
<div class="select-container row">
<span class="select-title">国家和地区</span>
<select id="country-select" class="country-select select in-android-uc">
{{# countrys}}
<option value={{areaCode}} {{#if selected}}selected{{/if}}>{{name}}</option>
{{/ countrys}}
</select>
<div class="arrow-right"></div>
</div>
... ...
... ... @@ -73,6 +73,40 @@ exports.urlFormat = (uri, qs, module) => {
return url;
};
/**
* 站内地址格式化
* @param {[string]} uri 路径
* @param {[object]} qs 查询字符串
* @param {[string]} module 模块
* @return {[string]}
*/
exports.fakeUrlFormat = (uri, qs, module) => {
const subDomain = 'http://localhost:6001';
const subName = {
default: subDomain,
guang: `${subDomain}`,
list: `${subDomain}`,
search: `${subDomain}`,
huodong: `${subDomain}`,
index: subDomain
};
let url;
module = module || 'default';
if (subName[module]) {
url = subName[module];
} else {
url = `//${module}${subDomain}`; // 规则没匹配到就把模块当作子域名
}
url += uri;
if (qs) {
url += `?${querystring.stringify(qs)}`;
}
return url;
};
/**
* 大写转小写处理
... ...
... ... @@ -94,6 +94,7 @@
"yoho-handlebars": "^4.0.5",
"yoho-jquery": "^2.2.4",
"yoho-jquery-lazyload": "^1.9.7",
"yoho-jquery-placeholder": "^0.0.3",
"yoho-mlellipsis": "^0.0.3",
"yoho-swiper": "^3.3.1"
}
... ...
/**
* 登录注册公用API
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/8
*/
var $ = require('yoho-jquery');
var trim = $.trim;
// 邮箱验证规则
var emailRegx = /^([a-zA-Z0-9]+[_|\_|\.|-]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.|-]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
// 手机号码验证规则
var phoneRegx = {
'+86': /^1[35847]{1}[0-9]{9}$/,
'+852': /^[965]{1}[0-9]{7}$/,
'+853': /^[0-9]{8}$/,
'+886': /^[0-9]{10}$/,
'+65': /^[98]{1}[0-9]{7}$/,
'+60': /^1[1234679]{1}[0-9]{8}$/,
'+1': /^[0-9]{10}$/,
'+82': /^01[0-9]{9}$/,
'+44': /^7[789][0-9]{8}$/,
'+81': /^0[9|8|7][0-9]{9}$/,
'+61': /^[0-9]{11}$/
};
/**
* 密码显示隐藏
* @params opt 初始化参数
*/
function bindEyesEvt(opt) {
var $hasEye = $('.has-eye'),
$eye;
if (opt && opt.status === 'open') {
$hasEye.append('<div class="eye"></div>');
} else {
$hasEye.append('<div class="eye close"></div>');
}
$eye = $hasEye.children('.eye');
$eye.on('touchstart', function(e) {
var $this = $(this),
$pwd = $this.siblings('.pwd');
e.preventDefault();
$this.toggleClass('close');
// 切换密码显示和文本显示
if ($this.hasClass('close')) {
$pwd.attr('type', 'password');
} else {
$pwd.attr('type', 'text');
}
$pwd.focus();
});
}
// 清空账号显示
function bindClearEvt() {
var $hasClear = $('.has-clear'),
$clear;
$hasClear.append('<div class="clear-input"></div>');
$clear = $hasClear.children('.clear-input');
$clear.on('touchstart', function(e) {
var $input = $clear.siblings('.input');
$input.val('').trigger('input').focus();
e.preventDefault();
});
// 反向逻辑
$hasClear.children('.input').bind('input', function() {
var $this = $(this),
$thisClear = $this.siblings('.clear-input'),
val = trim($this.val());
if (val === '') {
$thisClear.hide();
} else {
$thisClear.show();
}
});
}
// 密码长度验证
function pwdValidate(pwd) {
if (pwd.length >= 6 && pwd.length <= 20) {
return true;
}
return false;
}
// hack for resolving direction:rtl didn't work in android uc
function selectCssHack($countrySelect) {
var u = navigator.userAgent;
function autoSelectWidth() {
var wordCount = $countrySelect.find('option:selected').text().length;
switch (wordCount) {
// 分别有2,3,4个汉字的情况
case 2:
$countrySelect.outerWidth(90);
break;
case 3:
$countrySelect.outerWidth(110);
break;
default:
$countrySelect.outerWidth(130);
}
}
if (u.match(/uc/i) && u.match(/android/i)) {
$countrySelect.change(function() {
autoSelectWidth();
});
} else {
$countrySelect.removeClass('in-android-uc');
}
}
// Exports APIs
module.exports = {
emailRegx: emailRegx,
phoneRegx: phoneRegx,
bindEyesEvt: bindEyesEvt,
bindClearEvt: bindClearEvt,
pwdValidate: pwdValidate,
selectCssHack: selectCssHack
};
... ...
/**
* Created by TaoHuang on 2016/6/15.
*/
require('./back/code');
... ...
require('./back/email-success');
... ...
require('./back/email');
... ...
/**
* Created by TaoHuang on 2016/6/15.
*/
require('./back/mobile');
... ...
require('./back/new-password');
... ...
/**
* Created by TaoHuang on 2016/6/15.
*/
require('../code')(false);
... ...
/**
* 找回密码-邮箱找回成功
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/8
*/
var $ = require('yoho-jquery');
var $resend = $('#resend');
var tip = require('../../plugin/tip'),
showTip = tip.show;
$resend.on('touchstart', function(e) {
e.preventDefault();
$.ajax({
url: $resend.data('url'),
type: 'GET',
success: function(data) {
showTip(data.message);
}
});
});
... ...
/**
* 找回密码-邮箱找回
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/8
*/
var $ = require('yoho-jquery');
var $email = $('#email'),
$btnSure = $('#btn-sure');
var api = require('./../api');
var tip = require('../../plugin/tip');
var trim = $.trim;
var showErrTip = tip.show;
api.bindClearEvt();
$email.bind('input', function() {
if (trim($email.val()) === '') {
$btnSure.addClass('disable');
} else {
$btnSure.removeClass('disable');
}
});
$btnSure.on('touchstart', function() {
var email = trim($email.val());
if ($btnSure.hasClass('disable')) {
return;
}
if (api.emailRegx.test(email)) {
$.ajax({
url: '/passport/back/sendemail',
type: 'POST',
data: {
email: email
},
success: function(data) {
console.log(data);
if (data.code === 200) {
location.href = data.data;
} else {
showErrTip(data.message);
}
}
});
} else {
showErrTip('邮箱格式不正确,请重新输入');
}
});
... ...
/**
* 找回密码-手机
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/8
*/
var $ = require('yoho-jquery');
var $phoneNum = $('#phone-num'),
$countrySelect = $('#country-select'),
$areaCode = $('#area-code'),
$btnNext = $('#btn-next');
var api = require('../api');
var tip = require('../../plugin/tip');
var trim = $.trim;
var showErrTip = tip.show;
api.selectCssHack($('#country-select'));
api.bindClearEvt();
$phoneNum.bind('input', function() {
if (trim($phoneNum.val()) === '') {
$btnNext.addClass('disable');
} else {
$btnNext.removeClass('disable');
}
});
$countrySelect.change(function() {
$areaCode.text($countrySelect.val());
});
$btnNext.on('touchstart', function() {
var pn = trim($phoneNum.val()),
area = $countrySelect.val();
if ($btnNext.hasClass('disable')) {
return;
}
if (api.phoneRegx[area].test(pn)) {
$.ajax({
url: '/passport/back/sendcode',
type: 'POST',
data: {
areaCode: area.replace('+', ''),
phoneNum: pn
},
success: function(data) {
if (data.code === 200) {
location.href = data.data;
} else {
showErrTip(data.message);
}
}
});
} else {
showErrTip('手机号格式不正确,请重新输入');
}
});
... ...
/**
* 密码找回-新密码
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/8
*/
var $ = require('yoho-jquery');
var $pwd = $('#pwd'),
$btnOk = $('#btn-ok');
var api = require('../api');
var tip = require('../../plugin/tip');
var trim = $.trim;
var showErrTip = tip.show;
var $phoneNum = $('#phone-num');
api.bindEyesEvt({
status: 'open'
});
$pwd.bind('input', function() {
if (trim($pwd.val()) === '') {
$btnOk.addClass('disable');
} else {
$btnOk.removeClass('disable');
}
});
$btnOk.on('touchstart', function() {
var pwd = trim($pwd.val()),
mobileBack = true,
setting,
url;
if ($btnOk.hasClass('disable')) {
return;
}
setting = {
password: pwd
};
if ($phoneNum.length === 0) {
mobileBack = false;
}
if (mobileBack) {
$.extend(setting, {
phoneNum: $phoneNum.val(),
areaCode: $('#areaCode').val(),
token: $('#token').val()
});
url = '/passport/back/passwordByMobile';
} else {
$.extend(setting, {
code: $('#email-code').val()
});
url = '/passport/back/passwordByEmail';
}
if (api.pwdValidate(pwd)) {
$.ajax({
type: 'POST',
url: url,
data: setting,
success: function(data) {
if (data.code === 200) {
showErrTip('密码修改成功');
// 1000ms后跳转页面
setTimeout(function() {
location.href = data.data;
}, 1000);
} else {
showErrTip(data.message);
}
}
});
} else {
showErrTip('密码6-20位,请重新输入');
}
});
... ...
/**
* 注册/找回密码-验证码
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/10/8
*/
var $ = require('yoho-jquery');
module.exports = function(useInRegister, useForBind, useForRelate) {
var $captcha = $('#captcha'),
$btnNext = $('#btn-next'),
$captchaTip = $('#captcha-tip'),
nickname = $('#nickname').val(),
sourceType = $('#sourceType').val(),
openId = $('#openId').val(),
phoneNum = $('#phone-num').val(),
areaCode = $('#area-code').val().replace('+', '');
var api = require('./api');
var tip = require('../plugin/tip');
var trim = $.trim;
var showErrTip = tip.show;
var urlMid = useInRegister ? 'reg' : 'back';
var isReg = parseInt($('#isReg').val());
function startBind() {
$.ajax({
url: useForBind ? '/passport/bind/bindMobile' : '/passport/bind/relateMobile',
type: 'post',
data: {
areaCode: areaCode.replace('+', ''),
phoneNum: phoneNum,
openId: openId,
sourceType: sourceType,
nickname: nickname,
password: '',
code: trim($captcha.val())
},
success: function(res) {
if (res.code === 200) {
tip.show('登录成功');
setTimeout(function() {
location.href = res.data.refer;
}, 2000);
} else {
tip.show(res.message);
}
},
error: function() {
tip.show('登录失败,请重试!');
}
});
}
function startReg() {
$.ajax({
type: 'POST',
url: '/passport/' + urlMid + '/verifycode',
data: {
phoneNum: phoneNum,
areaCode: areaCode,
code: trim($captcha.val()),
token: $('#token').val()
},
success: function(data) {
if (data.code === 200) {
location.href = data.data;
} else {
// 验证码不正确,显示提示
showErrTip(data.message);
}
}
});
}
function countDown() {
var count = 59,
itime;
itime = setInterval(function() {
if (count === 0) {
$captchaTip.text('重新发送').removeClass('disable');
clearInterval(itime);
} else {
$captchaTip.text('重新发送 (' + count-- + '秒)');
}
}, 1000);
}
api.bindClearEvt();
$captcha.bind('input', function() {
if (trim($captcha.val()) !== '') {
$btnNext.removeClass('disable');
} else {
$btnNext.addClass('disable');
}
});
// 重新发送验证码
$captchaTip.on('touchstart', function() {
if ($captchaTip.hasClass('disable')) {
return;
}
$.ajax({
type: 'POST',
url: (useForBind || useForRelate) ? '/passport/bind/sendBindMsg' : '/passport/' + urlMid + '/sendcode',
data: {
phoneNum: phoneNum,
areaCode: areaCode
},
success: function(data) {
if (data.code === 200) {
$captchaTip.text('重发验证码 (60秒)').addClass('disable');
countDown();
} else {
// 验证码不正确,显示提示
showErrTip(data.message);
}
}
});
});
$btnNext.on('touchstart', function() {
if ($btnNext.hasClass('disable')) {
return;
}
if (useForBind || useForRelate) {
if (isReg) {
startBind();
} else {
location.href = '/passport/bind/password?phoneNum=' +
phoneNum + '&areaCode=' + areaCode + '&openId=' +
openId + '&sourceType=' + sourceType + '&nickname=' + nickname + '&code=' + trim($captcha.val());
}
} else {
startReg();
}
});
countDown();
};
... ...
/**
* 登录
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2015/9/30
*/
var $ = require('jquery');
var $account = $('#account'),
$pwd = $('#pwd'),
$loginBtn = $('#btn-login'),
$mask = $('#retrive-pwd-mask'),
$ways = $('#retrive-pwd-ways'),
accPass = false,
pwdPass = false;
var api = require('../api');
var tip = require('../../plugin/tip');
var trim = $.trim;
var showErrTip = tip.show;
// 登录按钮状态切换
function switchLoginBtnStatus() {
if (accPass && pwdPass) {
$loginBtn.removeClass('disable');
} else {
$loginBtn.addClass('disable');
}
}
// 显示找回密码面板
function showRetrivePanel() {
$mask.show();
$ways.show();
}
// 隐藏找回密码面板
function hideRetrivePanel() {
$mask.hide();
$ways.hide();
}
// 密码显示与隐藏
api.bindEyesEvt();
// 清空账号输入框
api.bindClearEvt();
$account.bind('input', function() {
if (trim($account.val()) !== '') {
accPass = true;
} else {
accPass = false;
}
switchLoginBtnStatus();
});
$pwd.bind('input', function() {
if (trim($pwd.val()) === '') {
pwdPass = false;
} else {
pwdPass = true;
}
switchLoginBtnStatus();
});
// Login
$loginBtn.on('touchstart', function() {
var acc = trim($account.val()),
pwd = trim($pwd.val());
if ($loginBtn.hasClass('disable')) {
return;
}
$loginBtn.text('正在登录...').addClass('disable');
// 验证账号(数字或者邮箱)和密码合理性
if ((/^[0-9]+$/.test(acc) || api.emailRegx.test(acc)) && api.pwdValidate(pwd)) {
$.ajax({
type: 'POST',
url: '/passport/login/auth',
data: {
account: acc,
password: pwd
},
success: function(data) {
var res;
if (data.code === 200) {
res = data.data;
showErrTip('登录成功');
location.href = res.href;
} else {
showErrTip(data.message);
}
},
error: function() {
showErrTip('网络断开连接啦~');
},
complete: function() {
$loginBtn.text('登录').removeClass('disable');
}
});
} else {
showErrTip('账号或密码有错误,请重新输入');
$loginBtn.text('登录').removeClass('disable');
}
});
$('#forget-pwd').on('touchstart', function() {
showRetrivePanel();
});
$mask.on('touchstart', function() {
hideRetrivePanel();
});
$('#cancel-retrive').on('touchstart', function(e) {
e.preventDefault();
hideRetrivePanel();
});
// 对初始有默认值的情况去初始化登录按钮状态
$account.trigger('input');
$pwd.trigger('input');
... ... @@ -10,3 +10,4 @@
@import "common/index";
@import "cart/chose-panel";
@import "coupon/index";
@import "passport/index"
... ...