Authored by 石坚

edit brand style

Too many changes to show.

To preserve performance only 10 of 10+ files are displayed.

/**
* [个人中心]个人设置
* @author: jiangmin
* @date: 2016/07/13
*/
'use strict';
const mcHandler = require('../models/menu-crumb-handler');
const helpers = global.yoho.helpers;
const settingModel = require('../models/setting');
const accountModel = require('../models/account');
const passportHelper = require('../../passport/models/passport-helper');
const Promise = require('bluebird');
const co = Promise.coroutine;
var fs = require('fs');
var path = require('path');
const uuid = require('uuid');
const os = require('os');
const _ = require('lodash');
const regMobile = /(\d{3})\d{4}(\d{4})/;// 正则匹配替换手机号码中间4位
const regEmail = /(\d{3})\d{4}/;// 正则匹配替换邮箱中间4位
const captchaUrl = helpers.urlFormat('/passport/images', {t: Date.now()});
// 根据type获取标题
const _getTitle = (type)=> {
let typeName;
let proName;
let isModifyMobile = false;
let isBindMobile = false;
let isModifyEmail = false;
let isBindEmail = false;
let isShowPassword = false;
switch (type) {
case 'modifyPassword':
typeName = '修改密码';
proName = '输入新密码';
isShowPassword = true;
break;
case 'modifyMobile':
typeName = '修改手机号码';
proName = '绑定手机';
isModifyMobile = true;
break;
case 'bindMobile':
typeName = '绑定手机号码';
proName = '绑定手机';
isBindMobile = true;
break;
case 'modifyEmail':
typeName = '修改邮箱';
proName = '绑定邮箱';
isModifyEmail = true;
break;
case 'bindEmail':
typeName = '绑定邮箱';
proName = '绑定邮箱';
isBindEmail = true;
break;
default:
typeName = '';
break;
}
return {
typeName: typeName,
proName: proName,
isModifyMobile,
isBindMobile,
isModifyEmail,
isBindEmail,
isShowPassword
};
};
/**
* 个人设置页面加载
*/
const index = (req, res, next) => {
let uid = req.user.uid;
Promise.all([settingModel.getUserInfo(uid), mcHandler.getMeThumb()]).then(result => {
const thumb = result[1];
let user = result[0];
user.info.gender ? user.genders[user.info.gender - 1].checked = true :
user.genders[2].checked = true;
user.info.head_ico = user.info.head_ico ? helpers.image(user.info.head_ico, 400, 300, 2) : '';
user.info.mobile = user.info.mobile ? user.info.mobile.replace(regMobile, '$1****$2') : '';
user.stepUrl = '/me/setting/step1';
if (user.info.birthday) {
let a = user.info.birthday.split('-');
_.forEach(user.date.selectYear, function(x) {
if (x.value === a[0]) {
x.isSelected = 'selected';
}
});
_.forEach(user.date.selectMonth, function(x) {
if (parseInt(x.value, 10) === parseInt(a[1], 10)) {
x.isSelected = 'selected';
}
});
_.forEach(user.date.selectDay, function(x) {
if (parseInt(x.value, 10) === parseInt(a[2], 10)) {
x.isSelected = 'selected';
}
});
}
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
setting: true,
title: '个人设置',
userInfo: user,
_token: req.csrfToken()
}
});
}).catch(next);
};
/**
* 编辑信息
* @param req
* @param res
* @param next
*/
const editUserInfo = (req, res, next)=> {
let uid = req.user.uid;
let query = req.body;
settingModel.editUserInfo(uid, query).then(result=> {
res.send(result);
}).catch(next);
};
/*
* step1 绑定的手机号码身份验证
* */
const bindMobile = (req, res, next) => {
let uid = req.user.uid;
let type = req.params.type;
settingModel.getUserInfo(uid).then(result=> {
if (result.info.verify_mobile !== '') {
mcHandler.getMeThumb().then((thumb) => {
let info = result.info;
info.ellipsisMobile = info.verify_mobile.replace(regMobile, '$1****$2');
info.checkCode = settingModel.cipheriv(info.uid + '.completeverify');
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
region: passportHelper.getCountry(),
location: '+86',
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
validateStep: true,
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
captchaUrl: captchaUrl,
isShowMobile: true,
data: info
}
});
});
}
next();
});
};
/**
* step1 绑定的邮箱进行身份验证
*/
const bindEmail = (req, res, next) => {
let uid = req.user.uid;
let type = req.params.type;
settingModel.getUserInfo(uid).then(result=> {
if (result.info.verify_email !== '') {
let info = result.info;
info.ellipsisEmail = info.verify_email.replace(regEmail, '$1****');
info.checkCode = settingModel.cipheriv(info.uid + '.completeverify');
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
validateStep: true,
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
captchaUrl: captchaUrl,
isShowEmail: true,
data: info
}
});
});
}
next();
});
};
/**
*step1 登录密码进行身份验证
*/
const modifyPassword = (req, res) => {
let type = req.params.type;
let checkCode = settingModel.cipheriv(req.user.uid + '.completeverify');
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
validateStep: true,
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
captchaUrl: captchaUrl,
isShowPassword: true,
checkCode: checkCode
}
});
});
};
/*
* step2 操作界面-渲染页面
* */
const edit = (req, res)=> {
let type = req.params.type;
let code = settingModel.decipheriv(req.query.checkCode.split(' ').join('+'));
let codes = code.split('.');
if (parseInt(codes[0], 10) === req.user.uid && codes[1] === 'completeverify') {
let result = {
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
isShowMobile: _getTitle(type).isModifyMobile || _getTitle(type).isBindMobile,
isShowEmail: _getTitle(type).isModifyEmail || _getTitle(type).isBindEmail,
isShowPassword: _getTitle(type).isShowPassword
};
let checkCode = settingModel.cipheriv(req.user.uid + '.completeoperate');
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: Object.assign({
region: passportHelper.getCountry(),
location: '+86',
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
operateStep: true,
stepUrl: '/me/setting/step3/' + type,
captchaUrl: captchaUrl,
checkCode: checkCode
}, result)
});
});
}
};
/*
* step3 操作成功-渲染界面
* */
const success = (req, res)=> {
let type = req.params.type;
let code = settingModel.decipheriv(req.query.checkCode.split(' ').join('+'));
let codes = code.split('.');
if (parseInt(codes[0], 10) === req.user.uid && codes[1] === 'completeoperate') {
let result = {
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
isModifyMobile: _getTitle(type).isModifyMobile,
isBindMobile: _getTitle(type).isBindMobile,
isModifyEmail: _getTitle(type).isModifyEmail,
isBindEmail: _getTitle(type).isBindEmail,
isShowPassword: _getTitle(type).isShowPassword
};
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: Object.assign({
region: passportHelper.getCountry(),
location: '+86',
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
successStep: true,
captchaUrl: captchaUrl
}, result)
});
});
}
};
/*
* post1 第一步身份验证的post请求
* */
const validate1 = (req, res)=> {
co(function *() {
let type = req.params.type;
let uid = req.user.uid;
let body = req.body;
if (type === 'password') {
let a = yield accountModel.verifyPwd(uid, body.password);
res.send(a);
} else if (type === 'mobile') {
let a = yield accountModel.checkVerifyMsg(body.code, body.mobile, body.area);
res.send(a);
} else if (type === 'email') {
let a = yield accountModel.sendVerifyEmail(uid, body.email);
res.send(a);
}
})();
};
/*
* post2 第二步具体操作的post请求
* */
const validate2 = (req, res)=> {
co(function *() {
let type = req.params.type;
let uid = req.user.uid;
let body = req.body;
if (type === 'password') {
let a = yield accountModel.changePwd(uid, body.password);
res.send(a);
} else if (type === 'mobile') {
let a = yield accountModel.checkVerifyMsg(body.code, body.mobile, body.area);
let b = yield accountModel.modifyVerifyMobile(uid, body.area, body.mobile);
let msg = [];
if (a.code === 200 && b.code === 200) {
res.send({
code: 200,
data: {}
});
} else {
if (a.code !== 200) {
msg.push('<p>图片验证:' + a.message + '</p>');
}
if (b.code !== 200) {
msg.push('<p>修改号码:' + a.message + '</p>');
}
res.send({
code: 500,
message: msg.join('')
});
}
}
})();
};
/**
* 文件处理中间件
* @param req
* @param res
* @param next
*/
function getfilePath(req, res, next) {
const fid = uuid.v4();
const filePath = path.join(os.tmpdir(), fid);
const uploadStream = fs.createWriteStream(filePath);
req.filePath = filePath;
req.pipe(uploadStream);
uploadStream.on('finish', function() {
next();
});
}
/**
* 修改头像
* @param req
* @param res
*/
const modifyHead = (req, res)=> {
let uid = req.user.uid;
let bucket = 'yhb-head';
let filePath = req.filePath;
settingModel.modifyHead(uid, bucket, filePath).then(result=> {
res.send(result);
});
};
module.exports = {
index,
editUserInfo,
bindMobile,
bindEmail,
modifyPassword,
edit,
success,
validate1,
validate2,
getfilePath,
modifyHead
};
/**
* [个人中心]个人设置
* @author: jiangmin
* @date: 2016/07/13
*/
'use strict';
const mcHandler = require('../models/menu-crumb-handler');
const helpers = global.yoho.helpers;
const settingModel = require('../models/setting');
const accountModel = require('../models/account');
const passportHelper = require('../../passport/models/passport-helper');
const Promise = require('bluebird');
const co = Promise.coroutine;
var fs = require('fs');
var path = require('path');
const uuid = require('uuid');
const os = require('os');
const _ = require('lodash');
const regMobile = /(\d{3})\d{4}(\d{4})/;// 正则匹配替换手机号码中间4位
const regEmail = /(\d{3})\d{4}/;// 正则匹配替换邮箱中间4位
const captchaUrl = helpers.urlFormat('/passport/images', {t: Date.now()});
// 根据type获取标题
const _getTitle = (type)=> {
let typeName;
let proName;
let isModifyMobile = false;
let isBindMobile = false;
let isModifyEmail = false;
let isBindEmail = false;
let isShowPassword = false;
switch (type) {
case 'modifyPassword':
typeName = '修改密码';
proName = '输入新密码';
isShowPassword = true;
break;
case 'modifyMobile':
typeName = '修改手机号码';
proName = '绑定手机';
isModifyMobile = true;
break;
case 'bindMobile':
typeName = '绑定手机号码';
proName = '绑定手机';
isBindMobile = true;
break;
case 'modifyEmail':
typeName = '修改邮箱';
proName = '绑定邮箱';
isModifyEmail = true;
break;
case 'bindEmail':
typeName = '绑定邮箱';
proName = '绑定邮箱';
isBindEmail = true;
break;
default:
typeName = '';
break;
}
return {
typeName: typeName,
proName: proName,
isModifyMobile,
isBindMobile,
isModifyEmail,
isBindEmail,
isShowPassword
};
};
/**
* 个人设置页面加载
*/
const index = (req, res, next) => {
let uid = req.user.uid;
Promise.all([settingModel.getUserInfo(uid), mcHandler.getMeThumb()]).then(result => {
const thumb = result[1];
let user = result[0];
user.info.gender ? user.genders[user.info.gender - 1].checked = true :
user.genders[2].checked = true;
user.info.head_ico = user.info.head_ico ? helpers.image(user.info.head_ico, 400, 300, 2) : '';
user.info.mobile = user.info.mobile ? user.info.mobile.replace(regMobile, '$1****$2') : '';
user.stepUrl = '/me/setting/step1';
if (user.info.birthday) {
let a = user.info.birthday.split('-');
_.forEach(user.date.selectYear, function(x) {
if (x.value === a[0]) {
x.isSelected = 'selected';
}
});
_.forEach(user.date.selectMonth, function(x) {
if (parseInt(x.value, 10) === parseInt(a[1], 10)) {
x.isSelected = 'selected';
}
});
_.forEach(user.date.selectDay, function(x) {
if (parseInt(x.value, 10) === parseInt(a[2], 10)) {
x.isSelected = 'selected';
}
});
}
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
setting: true,
title: '个人设置',
userInfo: user,
_token: req.csrfToken()
}
});
}).catch(next);
};
/**
* 编辑信息
* @param req
* @param res
* @param next
*/
const editUserInfo = (req, res, next)=> {
let uid = req.user.uid;
let query = req.body;
settingModel.editUserInfo(uid, query).then(result=> {
res.send(result);
}).catch(next);
};
/*
* step1 绑定的手机号码身份验证
* */
const bindMobile = (req, res, next) => {
let uid = req.user.uid;
let type = req.params.type;
settingModel.getUserInfo(uid).then(result=> {
if (result.info.verify_mobile !== '') {
mcHandler.getMeThumb().then((thumb) => {
let info = result.info;
info.ellipsisMobile = info.verify_mobile.replace(regMobile, '$1****$2');
info.checkCode = settingModel.cipheriv(info.uid + '.completeverify');
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
region: passportHelper.getCountry(),
location: '+86',
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
validateStep: true,
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
captchaUrl: captchaUrl,
isShowMobile: true,
data: info
}
});
});
}
next();
});
};
/**
* step1 绑定的邮箱进行身份验证
*/
const bindEmail = (req, res, next) => {
let uid = req.user.uid;
let type = req.params.type;
settingModel.getUserInfo(uid).then(result=> {
if (result.info.verify_email !== '') {
let info = result.info;
info.ellipsisEmail = info.verify_email.replace(regEmail, '$1****');
info.checkCode = settingModel.cipheriv(info.uid + '.completeverify');
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
validateStep: true,
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
captchaUrl: captchaUrl,
isShowEmail: true,
data: info
}
});
});
}
next();
});
};
/**
*step1 登录密码进行身份验证
*/
const modifyPassword = (req, res) => {
let type = req.params.type;
let checkCode = settingModel.cipheriv(req.user.uid + '.completeverify');
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: {
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
validateStep: true,
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
captchaUrl: captchaUrl,
isShowPassword: true,
checkCode: checkCode
}
});
});
};
/*
* step2 操作界面-渲染页面
* */
const edit = (req, res)=> {
let type = req.params.type;
let code = settingModel.decipheriv(req.query.checkCode.split(' ').join('+'));
let codes = code.split('.');
if (parseInt(codes[0], 10) === req.user.uid && codes[1] === 'completeverify') {
let result = {
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
isShowMobile: _getTitle(type).isModifyMobile || _getTitle(type).isBindMobile,
isShowEmail: _getTitle(type).isModifyEmail || _getTitle(type).isBindEmail,
isShowPassword: _getTitle(type).isShowPassword
};
let checkCode = settingModel.cipheriv(req.user.uid + '.completeoperate');
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: Object.assign({
region: passportHelper.getCountry(),
location: '+86',
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
operateStep: true,
stepUrl: '/me/setting/step3/' + type,
captchaUrl: captchaUrl,
checkCode: checkCode
}, result)
});
});
}
};
/*
* step3 操作成功-渲染界面
* */
const success = (req, res)=> {
let type = req.params.type;
let code = settingModel.decipheriv(req.query.checkCode.split(' ').join('+'));
let codes = code.split('.');
if (parseInt(codes[0], 10) === req.user.uid && codes[1] === 'completeoperate') {
let result = {
title: _getTitle(type).typeName,
proTitle: _getTitle(type).proName,
isModifyMobile: _getTitle(type).isModifyMobile,
isBindMobile: _getTitle(type).isBindMobile,
isModifyEmail: _getTitle(type).isModifyEmail,
isBindEmail: _getTitle(type).isBindEmail,
isShowPassword: _getTitle(type).isShowPassword
};
mcHandler.getMeThumb().then((thumb) => {
res.display('index', {
module: 'me',
page: 'setting',
isMe: true,
content: Object.assign({
region: passportHelper.getCountry(),
location: '+86',
nav: mcHandler.getMeCrumb('个人设置'),
navigation: mcHandler.getSideMenu('个人设置'),
banner: thumb,
successStep: true,
captchaUrl: captchaUrl
}, result)
});
});
}
};
/*
* post1 第一步身份验证的post请求
* */
const validate1 = (req, res)=> {
co(function *() {
let type = req.params.type;
let uid = req.user.uid;
let body = req.body;
if (type === 'password') {
let a = yield accountModel.verifyPwd(uid, body.password);
res.send(a);
} else if (type === 'mobile') {
let a = yield accountModel.checkVerifyMsg(body.code, body.mobile, body.area);
res.send(a);
} else if (type === 'email') {
let a = yield accountModel.sendVerifyEmail(uid, body.email);
res.send(a);
}
})();
};
/*
* post2 第二步具体操作的post请求
* */
const validate2 = (req, res)=> {
co(function *() {
let type = req.params.type;
let uid = req.user.uid;
let body = req.body;
if (type === 'password') {
let a = yield accountModel.changePwd(uid, body.password);
res.send(a);
} else if (type === 'mobile') {
let a = yield accountModel.checkVerifyMsg(body.code, body.mobile, body.area);
let b = yield accountModel.modifyVerifyMobile(uid, body.area, body.mobile);
let msg = [];
if (a.code === 200 && b.code === 200) {
res.send({
code: 200,
data: {}
});
} else {
if (a.code !== 200) {
msg.push('<p>图片验证:' + a.message + '</p>');
}
if (b.code !== 200) {
msg.push('<p>修改号码:' + a.message + '</p>');
}
res.send({
code: 500,
message: msg.join('')
});
}
}
})();
};
/**
* 文件处理中间件
* @param req
* @param res
* @param next
*/
function getfilePath(req, res, next) {
const fid = uuid.v4();
const filePath = path.join(os.tmpdir(), fid);
const uploadStream = fs.createWriteStream(filePath);
req.filePath = filePath;
req.pipe(uploadStream);
uploadStream.on('finish', function() {
next();
});
}
/**
* 修改头像
* @param req
* @param res
*/
const modifyHead = (req, res)=> {
let uid = req.user.uid;
let bucket = 'yhb-head';
let filePath = req.filePath;
settingModel.modifyHead(uid, bucket, filePath).then(result=> {
res.send(result);
});
};
module.exports = {
index,
editUserInfo,
bindMobile,
bindEmail,
modifyPassword,
edit,
success,
validate1,
validate2,
getfilePath,
modifyHead
};
... ...
/**
* router of sub app me
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/07/04
*/
'use strict';
const router = require('express').Router(); // eslint-disable-line
const cRoot = './controllers';
const auth = require(`${global.middleware}/auth`);
const csurf = require('csurf');
const csrf = csurf();
// 订单
const order = require(`${cRoot}/order`);
const address = require(`${cRoot}/address`);
const currency = require(`${cRoot}/currency`);
const setting = require(`${cRoot}/setting`);
const account = require(`${cRoot}/account`);
const favorite = require(`${cRoot}/favorite`);
const returns = require(`${cRoot}/returns`);
// 个人中心首页/订单
router.get(['/', '/order'], auth, order.index);
router.get(['/', '/order/detail'], auth, order.detail);
router.get('/getOrderList', order.getOrderList);
router.get('/getOrderTotal', order.getOrderTotal);
router.get('/deleteOrder', order.deleteOrder);
router.get('/cancelOrder', order.cancelOrder);
router.get('/getCancelOrderReason', order.getCancelOrderReason);
router.get('/getExpressInfo', order.getExpressInfo);
router.get('/editOrder', order.editOrder);
router.get('/reAdd', order.reAdd);
router.get('/confirmReceive', order.confirmReceive);
// 退换货
router.get('/return', auth, returns.index);
router.get('/return/refund', auth, returns.refund);
router.get('/return/exchange', auth, returns.exchange);
router.get('/return/refund/detail', auth, returns.refundDetail);
router.get('/return/exchange/detail', auth, returns.exchangeDeatail);
router.post('/return/refund/apply', auth, returns.refundApply);
router.post('/return/cancel', auth, returns.cancelApply);
router.post('/return/setEepress', auth, returns.setEepress);
router.get('/return/getProductInfo', returns.getProductInfo);
router.get('/return/submitExchange', auth, returns.exchangeSubmit);
router.get('/return/unionInfo', returns.getUnion);
router.get('/return/getChangeType', returns.getChangeType);
// 个人中心首页/收货地址
router.get('/address', auth, address.index);
router.post('/address/add', auth, address.addAddressData);
router.post('/address/update', auth, address.updateAddressData);
router.post('/address/del', auth, address.delAddressData);
router.post('/address/default', auth, address.setDefaultAddress);
router.get('/address/list', address.getAddressList); // 获取地址列表
router.get('/address/areas/:areaId', address.getAddressData);
// 个人中心首页/有货币
router.get('/currency', auth, currency.index);
// 个人中心首页/个人设置
router.get('/setting', csrf, auth, setting.index);// 个人首页
router.post('/setting/editUserInfo', csrf, auth, setting.editUserInfo);// 修改接口
// 第一步
router.get('/setting/step1/:type', auth, setting.bindMobile, setting.bindEmail, setting.modifyPassword);
// 第一步post
router.post('/setting/step1/:type', auth, setting.validate1);
// 第二步
router.get('/setting/step2/:type', auth, setting.edit);
// 第二步post
router.post('/setting/step2/:type', auth, setting.validate2);
// 第三步
router.get('/setting/step3/:type', auth, setting.success);
router.post('/setting/modifyHead', auth, setting.getfilePath, setting.modifyHead);
router.post('/account/changePwd', auth, account.changePwd);
router.post('/account/sendMobileMsg', auth, account.sendMobileMsg);
router.post('/account/checkVerifyMsg', auth, account.checkVerifyMsg);
router.post('/account/sendVerifyEmail', auth, account.sendVerifyEmail);
router.post('/account/checkVerifyMobile', auth, account.checkVerifyMobile);
// 我的收藏
router.get('/collection', auth, favorite.goods);
router.get('/collection/brand', auth, favorite.brand);
router.get('/collection/editorial', auth, favorite.editorial);
router.post('/collection/cancel', auth, favorite.cancel);
router.post('/collection/cancel/multi', auth, favorite.cancelMulti);
router.post('/collection/editorial/cancel', auth, favorite.editorialCancel);
module.exports = router;
/**
* router of sub app me
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/07/04
*/
'use strict';
const router = require('express').Router(); // eslint-disable-line
const cRoot = './controllers';
const auth = require(`${global.middleware}/auth`);
const csurf = require('csurf');
const csrf = csurf();
// 订单
const order = require(`${cRoot}/order`);
const address = require(`${cRoot}/address`);
const currency = require(`${cRoot}/currency`);
const setting = require(`${cRoot}/setting`);
const account = require(`${cRoot}/account`);
const favorite = require(`${cRoot}/favorite`);
const returns = require(`${cRoot}/returns`);
// 个人中心首页/订单
router.get(['/', '/order'], auth, order.index);
router.get(['/', '/order/detail'], auth, order.detail);
router.get('/getOrderList', order.getOrderList);
router.get('/getOrderTotal', order.getOrderTotal);
router.get('/deleteOrder', order.deleteOrder);
router.get('/cancelOrder', order.cancelOrder);
router.get('/getCancelOrderReason', order.getCancelOrderReason);
router.get('/getExpressInfo', order.getExpressInfo);
router.get('/editOrder', order.editOrder);
router.get('/reAdd', order.reAdd);
router.get('/confirmReceive', order.confirmReceive);
// 退换货
router.get('/return', auth, returns.index);
router.get('/return/refund', auth, returns.refund);
router.get('/return/exchange', auth, returns.exchange);
router.get('/return/refund/detail', auth, returns.refundDetail);
router.get('/return/exchange/detail', auth, returns.exchangeDeatail);
router.post('/return/refund/apply', auth, returns.refundApply);
router.post('/return/cancel', auth, returns.cancelApply);
router.post('/return/setEepress', auth, returns.setEepress);
router.get('/return/getProductInfo', returns.getProductInfo);
router.get('/return/submitExchange', auth, returns.exchangeSubmit);
router.get('/return/unionInfo', returns.getUnion);
router.get('/return/getChangeType', returns.getChangeType);
// 个人中心首页/收货地址
router.get('/address', auth, address.index);
router.post('/address/add', auth, address.addAddressData);
router.post('/address/update', auth, address.updateAddressData);
router.post('/address/del', auth, address.delAddressData);
router.post('/address/default', auth, address.setDefaultAddress);
router.get('/address/list', address.getAddressList); // 获取地址列表
router.get('/address/areas/:areaId', address.getAddressData);
// 个人中心首页/有货币
router.get('/currency', auth, currency.index);
// 个人中心首页/个人设置
router.get('/setting', csrf, auth, setting.index);// 个人首页
router.post('/setting/editUserInfo', csrf, auth, setting.editUserInfo);// 修改接口
// 第一步
router.get('/setting/step1/:type', auth, setting.bindMobile, setting.bindEmail, setting.modifyPassword);
// 第一步post
router.post('/setting/step1/:type', auth, setting.validate1);
// 第二步
router.get('/setting/step2/:type', auth, setting.edit);
// 第二步post
router.post('/setting/step2/:type', auth, setting.validate2);
// 第三步
router.get('/setting/step3/:type', auth, setting.success);
router.post('/setting/modifyHead', auth, setting.getfilePath, setting.modifyHead);
router.post('/account/changePwd', auth, account.changePwd);
router.post('/account/sendMobileMsg', auth, account.sendMobileMsg);
router.post('/account/checkVerifyMsg', auth, account.checkVerifyMsg);
router.post('/account/sendVerifyEmail', auth, account.sendVerifyEmail);
router.post('/account/checkVerifyMobile', auth, account.checkVerifyMobile);
// 我的收藏
router.get('/collection', auth, favorite.goods);
router.get('/collection/brand', auth, favorite.brand);
router.get('/collection/editorial', auth, favorite.editorial);
router.post('/collection/cancel', auth, favorite.cancel);
router.post('/collection/cancel/multi', auth, favorite.cancelMulti);
router.post('/collection/editorial/cancel', auth, favorite.editorialCancel);
module.exports = router;
... ...
<form id="setting-form" name="setting-form">
<input id="scrfToken" name="_csrf" type="hidden" value="{{_token}}">
{{#userInfo}}
<div class="setting-page inline-block">
<input id="gender" type="hidden" value="{{info.gender}}">
<input id="area_code" type="hidden" value="{{concat.area_code}}">
<input id="zip_code" type="hidden" value="{{concat.zip_code}}">
<input id="infoMobile" type="hidden" value="{{info.mobile}}">
<div class="form-group">
<label class="label-name">真实姓名:</label>
<input id="username" class="input" type="text" placeholder="请输入2-12个汉字或英文"
value="{{info.username}}" minlength="2" maxlength="12">
<span class="blue error-tips">{{> icon/error-round}}2-12个汉字或英文</span>
</div>
<div class="form-group">
<label class="label-name">昵称:</label>
<input id="nick_name" class="input" type="text" placeholder="中文、英文、数字、-和_组合"
value="{{info.nickname}}" maxlength="10">
<span class="blue error-tips">{{> icon/error-round}}中文、英文、数字、-和_组合</span>
</div>
<div class="form-group">
<label class="label-name">性别:</label>
{{#each genders}}
<div class="input-radio inline-block operation" data-value="{{value}}">
{{> icon/radio}}
<label>{{name}}</label>
</div>
{{/each}}
</div>
<div class="form-group">
<label class="label-name">密码:</label>
<input class="input no-edit" value="********">
<a class="blue operation" href="{{stepUrl}}/modifyPassword">修改</a>
</div>
<div class="form-group">
<label class="label-name">手机:</label>
{{#if info.mobile}}
<input id="mobile" class="input no-edit" value="{{info.mobile}}">
<a class="blue operation" href="{{stepUrl}}/modifyMobile">修改</a>
{{else}}
<input class="input" type="text" placeholder="请绑定手机" disabled>
<a class="blue operation" href="{{stepUrl}}/bindMobile">绑定</a>
{{/if}}
</div>
<!--<div class="form-group">-->
<!--<label class="label-name">邮箱:</label>-->
<!--{{#if info.verify_email}}-->
<!--<input class="input no-edit" value="{{info.email}}">-->
<!--{{!-- <a class="blue operation" href="{{stepUrl}}/modifyEmail">修改</a> --}}-->
<!--{{else}}-->
<!--<input class="input" type="text" placeholder="请绑定邮箱" disabled>-->
<!--{{!-- <a class="blue operation" href="{{stepUrl}}/bindEmail">立即绑定</a> --}}-->
<!--{{/if}}-->
<!--</div>-->
<div class="form-group">
<label class="label-name">出生日期:</label>
{{#date}}
<select id="year" >
{{#each selectYear}}
{{#if isSelected}}
<option value="{{id}}" selected={{isSelected}}>{{value}}</option>
{{else}}
<option value="{{id}}" >{{value}}</option>
{{/if}}
{{/each}}
</select>
<select id="month" >
{{#each selectMonth}}
{{#if isSelected}}
<option value="{{id}}" selected={{isSelected}}>{{value}}</option>
{{else}}
<option value="{{id}}" >{{value}}</option>
{{/if}}
{{/each}}
</select>
<select id="day" >
{{#each selectDay}}
{{#if isSelected}}
<option value="{{id}}" selected={{isSelected}}>{{value}}</option>
{{else}}
<option value="{{id}}" >{{value}}</option>
{{/if}}
{{/each}}
</select>
{{/date}}
<span class="blue error-tips">{{> icon/error-round}}出生日期格式不对</span>
</div>
<div class="form-group-address">
<label class="label-name">居住地址:</label>
<div id="address"></div>
<span class="blue error-tips">{{> icon/error-round}}请选择</span>
</div>
<div class="form-group">
<label class="label-name" style="visibility: hidden">详细地址:</label>
<input id="full_address" class="input big-input" type="text" placeholder="请填写详细地址"
maxlength="20" value="{{concat.full_address}}">
</div>
<div class="form-group">
<span class="btn operation" id="save-settings">保存</span>
</div>
</div>
<div class="user-icon inline-block">
{{#if info.head_ico}}
<div class="show-ico"><img src="{{info.head_ico}}"></div>
<div class="edit-ico hide"></div>
{{else}}
<div class="show-ico"></div>
<div class="edit-ico hide"></div>
{{/if}}
</div>
{{/userInfo}}
</form>
<form id="setting-form" name="setting-form">
<input id="scrfToken" name="_csrf" type="hidden" value="{{_token}}">
{{#userInfo}}
<div class="setting-page inline-block">
<input id="gender" type="hidden" value="{{info.gender}}">
<input id="area_code" type="hidden" value="{{concat.area_code}}">
<input id="zip_code" type="hidden" value="{{concat.zip_code}}">
<input id="infoMobile" type="hidden" value="{{info.mobile}}">
<div class="form-group">
<label class="label-name">真实姓名:</label>
<input id="username" class="input" type="text" placeholder="请输入2-12个汉字或英文"
value="{{info.username}}" minlength="2" maxlength="12">
<span class="blue error-tips">{{> icon/error-round}}2-12个汉字或英文</span>
</div>
<div class="form-group">
<label class="label-name">昵称:</label>
<input id="nick_name" class="input" type="text" placeholder="中文、英文、数字、-和_组合"
value="{{info.nickname}}" maxlength="10">
<span class="blue error-tips">{{> icon/error-round}}中文、英文、数字、-和_组合</span>
</div>
<div class="form-group">
<label class="label-name">性别:</label>
{{#each genders}}
<div class="input-radio inline-block operation" data-value="{{value}}">
{{> icon/radio}}
<label>{{name}}</label>
</div>
{{/each}}
</div>
<div class="form-group">
<label class="label-name">密码:</label>
<input class="input no-edit" value="********">
<a class="blue operation" href="{{stepUrl}}/modifyPassword">修改</a>
</div>
<div class="form-group">
<label class="label-name">手机:</label>
{{#if info.mobile}}
<input id="mobile" class="input no-edit" value="{{info.mobile}}">
<a class="blue operation" href="{{stepUrl}}/modifyMobile">修改</a>
{{else}}
<input class="input" type="text" placeholder="请绑定手机" disabled>
<a class="blue operation" href="{{stepUrl}}/bindMobile">绑定</a>
{{/if}}
</div>
<!--<div class="form-group">-->
<!--<label class="label-name">邮箱:</label>-->
<!--{{#if info.verify_email}}-->
<!--<input class="input no-edit" value="{{info.email}}">-->
<!--{{!-- <a class="blue operation" href="{{stepUrl}}/modifyEmail">修改</a> --}}-->
<!--{{else}}-->
<!--<input class="input" type="text" placeholder="请绑定邮箱" disabled>-->
<!--{{!-- <a class="blue operation" href="{{stepUrl}}/bindEmail">立即绑定</a> --}}-->
<!--{{/if}}-->
<!--</div>-->
<div class="form-group">
<label class="label-name">出生日期:</label>
{{#date}}
<select id="year" >
{{#each selectYear}}
{{#if isSelected}}
<option value="{{id}}" selected={{isSelected}}>{{value}}</option>
{{else}}
<option value="{{id}}" >{{value}}</option>
{{/if}}
{{/each}}
</select>
<select id="month" >
{{#each selectMonth}}
{{#if isSelected}}
<option value="{{id}}" selected={{isSelected}}>{{value}}</option>
{{else}}
<option value="{{id}}" >{{value}}</option>
{{/if}}
{{/each}}
</select>
<select id="day" >
{{#each selectDay}}
{{#if isSelected}}
<option value="{{id}}" selected={{isSelected}}>{{value}}</option>
{{else}}
<option value="{{id}}" >{{value}}</option>
{{/if}}
{{/each}}
</select>
{{/date}}
<span class="blue error-tips">{{> icon/error-round}}出生日期格式不对</span>
</div>
<div class="form-group-address">
<label class="label-name">居住地址:</label>
<div id="address"></div>
<span class="blue error-tips">{{> icon/error-round}}请选择</span>
</div>
<div class="form-group">
<label class="label-name" style="visibility: hidden">详细地址:</label>
<input id="full_address" class="input big-input" type="text" placeholder="请填写详细地址"
maxlength="20" value="{{concat.full_address}}">
</div>
<div class="form-group">
<span class="btn operation" id="save-settings">保存</span>
</div>
</div>
<div class="user-icon inline-block">
{{#if info.head_ico}}
<div class="show-ico"><img src="{{info.head_ico}}"></div>
<div class="edit-ico hide"></div>
{{else}}
<div class="show-ico"></div>
<div class="edit-ico hide"></div>
{{/if}}
</div>
{{/userInfo}}
</form>
... ...
{{> sign-header}}
<div class="passport-page yoho-page clearfix">
{{# passport}}
<div class="success-box">
<div class="success-text">
恭喜您,账号注册成功!
</div>
<div>
尊敬的{{mobile}},恭喜您已经成为YOHO!BLK会员!即刻您可以开启时尚购物之旅!
</div>
<a class="btn btn-fixed-height success-btn" href="{{xssURI goShopping}}" data-url="{{goUrl}}">开始购物</a>
</div>
{{/ passport}}
</div>
{{> sign-header}}
<div class="passport-page yoho-page clearfix">
{{# passport}}
<div class="success-box">
<div class="success-text">
恭喜您,账号注册成功!
</div>
<div>
尊敬的{{mobile}},恭喜您已经成为YOHO!BLK会员!即刻您可以开启时尚购物之旅!
</div>
<a class="btn btn-fixed-height success-btn" href="{{xssURI goShopping}}" data-url="{{goUrl}}">开始购物</a>
</div>
{{/ passport}}
</div>
... ...
/**
* 手机访问检测
* @author:
* @date:
*/
'use strict';
module.exports = () => {
return (req, res, next) => {
let isMobile = /(nokia|iphone|android|ipad|motorola|^mot\-|softbank|foma|docomo|kddi|up\.browser|up\.link|htc|dopod|blazer|netfront|helio|hosin|huawei|novarra|CoolPad|webos|techfaith|palmsource|blackberry|alcatel|amoi|ktouch|nexian|samsung|^sam\-|s[cg]h|^lge|ericsson|philips|sagem|wellcom|bunjalloo|maui|symbian|smartphone|midp|wap|phone|windows ce|iemobile|^spice|^bird|^zte\-|longcos|pantech|gionee|^sie\-|portalmmm|jig\s browser|hiptop|^ucweb|^benq|haier|^lct|opera\s*mobi|opera\*mini|320x320|240x320|176x220)/i.test(req.get('user-agent')); // eslint-disable-line
let isWechat = /(MicroMessenger)/i.test(req.get('user-agent')); // eslint-disable-line
if (isMobile && req.url === '/') {
return res.redirect('//www.yohoshow.com/about/index/blkqr');
}
if (isMobile) {
// http://jira.yoho.cn:8888/browse/BLK-2051
return res.redirect(`//m.yohoblk.com${req.url}`);
}
next();
};
};
/**
* 手机访问检测
* @author:
* @date:
*/
'use strict';
module.exports = () => {
return (req, res, next) => {
let isMobile = /(nokia|iphone|android|ipad|motorola|^mot\-|softbank|foma|docomo|kddi|up\.browser|up\.link|htc|dopod|blazer|netfront|helio|hosin|huawei|novarra|CoolPad|webos|techfaith|palmsource|blackberry|alcatel|amoi|ktouch|nexian|samsung|^sam\-|s[cg]h|^lge|ericsson|philips|sagem|wellcom|bunjalloo|maui|symbian|smartphone|midp|wap|phone|windows ce|iemobile|^spice|^bird|^zte\-|longcos|pantech|gionee|^sie\-|portalmmm|jig\s browser|hiptop|^ucweb|^benq|haier|^lct|opera\s*mobi|opera\*mini|320x320|240x320|176x220)/i.test(req.get('user-agent')); // eslint-disable-line
let isWechat = /(MicroMessenger)/i.test(req.get('user-agent')); // eslint-disable-line
if (isMobile && req.url === '/') {
return res.redirect('//www.yohoshow.com/about/index/blkqr');
}
if (isMobile) {
// http://jira.yoho.cn:8888/browse/BLK-2051
return res.redirect(`//m.yohoblk.com${req.url}`);
}
next();
};
};
... ...
{
"name": "yoho-blk",
"version": "0.0.1",
"private": true,
"description": "A New Yohoblk Project With Express",
"repository": {
"type": "git",
"url": "http://git.yoho.cn/fe/yoho-blk.git"
},
"scripts": {
"start": "node app.js",
"dev": "nodemon -e js,hbs -i public/ app.js",
"online": "NODE_ENV=\"production\" node app.js",
"debug": "DEBUG=\"express:*\" nodemon -e js,hbs -i public/ app.js",
"lint-js": "eslint -c .eslintrc --cache --fix .",
"lint-css": "stylelint --config .stylelintrc public/scss/**/*.css",
"precommit": "node lint.js",
"test": "NODE_ENV=test nyc ./node_modules/.bin/ava",
"posttest": "nyc report --reporter=html"
},
"ava": {
"tap": true,
"require": [
"babel-register"
],
"babel": {
"presets": [
"es2015"
]
}
},
"license": "MIT",
"dependencies": {
"bluebird": "^3.4.0",
"body-parser": "^1.15.0",
"captchapng": "0.0.1",
"connect-memcached": "^0.2.0",
"connect-multiparty": "^2.0.0",
"cookie-parser": "^1.4.3",
"csurf": "^1.9.0",
"express": "^4.13.1",
"express-handlebars": "^3.0.0",
"express-session": "^1.13.0",
"influxdb-winston": "^1.0.1",
"lodash": "^4.13.1",
"md5": "^2.1.0",
"memcached": "^2.2.2",
"moment": "^2.13.0",
"morgan": "^1.7.0",
"oneapm": "^1.2.20",
"passport": "^0.3.2",
"passport-douban": "0.0.1",
"passport-local": "^1.0.0",
"passport-qq": "0.0.3",
"passport-renren": "^0.1.3",
"passport-sina": "^0.1.0",
"passport-strategy": "1.x.x",
"passport-weixin": "^0.1.0",
"request": "^2.73.0",
"request-promise": "^3.0.0",
"serve-favicon": "^2.3.0",
"uuid": "^2.0.2",
"winston": "^2.2.0",
"winston-daily-rotate-file": "^1.1.4",
"xss": "^0.2.13",
"yoho-node-lib": "0.0.45"
},
"devDependencies": {
"autoprefixer": "^6.3.6",
"ava": "^0.15.2",
"babel-preset-es2015": "^6.9.0",
"babel-register": "^6.9.0",
"eslint": "^2.12.0",
"eslint-config-yoho": "^1.0.1",
"gulp": "^3.9.1",
"gulp-cssnano": "^2.1.2",
"gulp-ftp": "^1.1.0",
"gulp-postcss": "^6.1.0",
"gulp-sourcemaps": "^2.0.0-alpha",
"gulp-util": "^3.0.7",
"handlebars-loader": "^1.3.0",
"husky": "^0.11.4",
"nodemon": "1.9.2",
"nyc": "^6.6.1",
"postcss-assets": "^4.0.1",
"postcss-cachebuster": "^0.1.3",
"postcss-calc": "^5.2.1",
"postcss-center": "^1.0.0",
"postcss-clearfix": "^1.0.0",
"postcss-crip": "^2.0.0",
"postcss-opacity": "^3.0.0",
"postcss-position": "^0.5.0",
"postcss-pxtorem": "^3.3.1",
"postcss-short": "^1.4.0",
"postcss-sprites": "^3.1.2",
"postcss-use": "^2.0.2",
"precss": "^1.4.0",
"rewire": "^2.5.1",
"shelljs": "^0.7.0",
"stylelint": "^7.1.0",
"stylelint-config-yoho": "^1.2.7",
"webpack": "^1.13.1",
"webpack-dev-server": "^1.14.1",
"webpack-stream": "^3.1.0",
"yoho-eventproxy": "^0.3.6",
"yoho-handlebars": "^4.0.5",
"yoho-jquery": "^1.12.4",
"yoho-jquery-accordion": "0.0.2",
"yoho-jquery-dotdotdot": "0.0.1",
"yoho-jquery-lazyload": "^1.9.7",
"yoho-jquery-nanoscroller": "0.0.1",
"yoho-jquery-placeholder": "^2.3.1",
"yoho-jquery-qrcode": "0.0.3",
"yoho-json2": "^1.0.0",
"yoho-slider": "0.0.2"
}
}
{
"name": "yoho-blk",
"version": "0.0.1",
"private": true,
"description": "A New Yohoblk Project With Express",
"repository": {
"type": "git",
"url": "http://git.yoho.cn/fe/yoho-blk.git"
},
"scripts": {
"start": "node app.js",
"dev": "nodemon -e js,hbs -i public/ app.js",
"online": "NODE_ENV=\"production\" node app.js",
"debug": "DEBUG=\"express:*\" nodemon -e js,hbs -i public/ app.js",
"lint-js": "eslint -c .eslintrc --cache --fix .",
"lint-css": "stylelint --config .stylelintrc public/scss/**/*.css",
"precommit": "node lint.js",
"test": "NODE_ENV=test nyc ./node_modules/.bin/ava",
"posttest": "nyc report --reporter=html"
},
"ava": {
"tap": true,
"require": [
"babel-register"
],
"babel": {
"presets": [
"es2015"
]
}
},
"license": "MIT",
"dependencies": {
"bluebird": "^3.4.0",
"body-parser": "^1.15.0",
"captchapng": "0.0.1",
"connect-memcached": "^0.2.0",
"connect-multiparty": "^2.0.0",
"cookie-parser": "^1.4.3",
"csurf": "^1.9.0",
"express": "^4.13.1",
"express-handlebars": "^3.0.0",
"express-session": "^1.13.0",
"influxdb-winston": "^1.0.1",
"lodash": "^4.13.1",
"md5": "^2.1.0",
"memcached": "^2.2.2",
"moment": "^2.13.0",
"morgan": "^1.7.0",
"oneapm": "^1.2.20",
"passport": "^0.3.2",
"passport-douban": "0.0.1",
"passport-local": "^1.0.0",
"passport-qq": "0.0.3",
"passport-renren": "^0.1.3",
"passport-sina": "^0.1.0",
"passport-strategy": "1.x.x",
"passport-weixin": "^0.1.0",
"request": "^2.73.0",
"request-promise": "^3.0.0",
"serve-favicon": "^2.3.0",
"uuid": "^2.0.2",
"winston": "^2.2.0",
"winston-daily-rotate-file": "^1.1.4",
"xss": "^0.2.13",
"yoho-node-lib": "0.0.45"
},
"devDependencies": {
"autoprefixer": "^6.3.6",
"ava": "^0.15.2",
"babel-preset-es2015": "^6.9.0",
"babel-register": "^6.9.0",
"eslint": "^2.12.0",
"eslint-config-yoho": "^1.0.1",
"gulp": "^3.9.1",
"gulp-cssnano": "^2.1.2",
"gulp-ftp": "^1.1.0",
"gulp-postcss": "^6.1.0",
"gulp-sourcemaps": "^2.0.0-alpha",
"gulp-util": "^3.0.7",
"handlebars-loader": "^1.3.0",
"husky": "^0.11.4",
"nodemon": "1.9.2",
"nyc": "^6.6.1",
"postcss-assets": "^4.0.1",
"postcss-cachebuster": "^0.1.3",
"postcss-calc": "^5.2.1",
"postcss-center": "^1.0.0",
"postcss-clearfix": "^1.0.0",
"postcss-crip": "^2.0.0",
"postcss-opacity": "^3.0.0",
"postcss-position": "^0.5.0",
"postcss-pxtorem": "^3.3.1",
"postcss-short": "^1.4.0",
"postcss-sprites": "^3.1.2",
"postcss-use": "^2.0.2",
"precss": "^1.4.0",
"rewire": "^2.5.1",
"shelljs": "^0.7.0",
"stylelint": "^7.1.0",
"stylelint-config-yoho": "^1.2.7",
"webpack": "^1.13.1",
"webpack-dev-server": "^1.14.1",
"webpack-stream": "^3.1.0",
"yoho-eventproxy": "^0.3.6",
"yoho-handlebars": "^4.0.5",
"yoho-jquery": "^1.12.4",
"yoho-jquery-accordion": "0.0.2",
"yoho-jquery-dotdotdot": "0.0.1",
"yoho-jquery-lazyload": "^1.9.7",
"yoho-jquery-nanoscroller": "0.0.1",
"yoho-jquery-placeholder": "^2.3.1",
"yoho-jquery-qrcode": "0.0.3",
"yoho-json2": "^1.0.0",
"yoho-slider": "0.0.2"
}
}
... ...
var colorTpl = require('../../tpl/me/color-list.hbs');
var sizeTpl = require('../../tpl/me/size-list.hbs');
var lazyLoad = require('yoho-jquery-lazyload');
var dialog = require('../plugins/dialog');
var _alert = dialog.Alert;
var addrSelector = require('../plugins/cascading-address');
var addr;
var addressReg = /^[\s\S]{2,100}$/;
var phoneReg = /^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/;
var mobDefault = $('#mob').val();// 手机号默认值
var validate = require('./order/validation');
var imgBoxTpl = require('../../tpl/me/thumbnail.hbs');
var changeTypeTpl = require('../../tpl/me/change-type.hbs');
var upload = require('../plugins/upload');
var validateMap = {
user: {
sl: '#user',
v: {
maxLength: 12,
minLength: 2,
necessary: true,
errMsg: '真实姓名至少2个字符,最多12个字符'
}
},
addr: {
sl: '#addr',
v: {
reg: addressReg,
errMsg: '详细地址不能为空'
}
},
mob: {
sl: '#mob',
v: {
reg: phoneReg,
errMsg: '您输入的联系电话格式不正确'
}
},
mob1: {
sl: '#mob',
v: {
reg: /^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9, *]{8}$/,
errMsg: '您输入的联系电话格式不正确'
}
}
};
lazyLoad($('.banner-img'));
// 添加.check方法
require('../plugins/check');
// 个人中心共用代码加载
require('./me');
function setActive($item) {
var color = $item.find('.color-text').data('color');
var size = $item.find('.size-text').data('size');
var $colorList = $item.find('.color-list');
var $sizeList = $item.find('.size-list');
var activeIndex = 0;
$colorList.find('.img-box').each(function(i, box) {
var $box = $(box);
if ($box.find('img').data('color') === color) {
$colorList.find('.img-box').eq(i).addClass('active');
activeIndex = i;
return false;
}
});
$sizeList = $sizeList.eq(activeIndex).removeClass('hide');
$sizeList.find('span').each(function(i, s) {
var $size = $(s);
if ($size.data('size') === size) {
$sizeList.find('span').eq(i).addClass('active');
}
});
}
function renderList(data) {
var cTpl;
var sTpl;
var $el = $('.goods-container');
var resultId;
var resultSkn;
if (data) {
resultId = data.productId;
resultSkn = data.productSkn;
$el.each(function(index, item) {
var $item = $(item);
var id = $item.data('id');
var skn = $item.data('skn');
var $form;
if (id === resultId && skn === resultSkn) {
$form = $item.closest('.table-body').next('.form');
if (!$form.find('.color-list').length) {
cTpl = colorTpl(data);
sTpl = sizeTpl(data);
$form.find('.group.color').append(cTpl);
$form.find('.group.size').append(sTpl);
setActive($form);
}
}
});
}
}
function bindColorEvent() {
$('.color-list img').off('clice').on('click', function() {
var $this = $(this);
var $sizeList = $this.closest('.group').next('.group').find('.size-list');
var index = $this.data('index');
var colorId = $this.data('color');
var colorText = $this.attr('alt');
var $c = $this.closest('.group.color').find('.color-text');
$('.size-list .active').removeClass('active');
$c.text(colorText);
$c.attr('data-color', colorId);
$this.closest('.color-list').find('.active').removeClass('active');
$this.parent().addClass('active');
$sizeList.removeClass('hide');
$sizeList.addClass('hide');
$sizeList.eq(index).removeClass('hide');
});
}
function initSizeId() {
var s = $('.size-list:not("hide")').find('span').eq(0).data('size');
$('.group.size .size-text').eq(0).attr('data-size', s);
}
function bindSizeEvent() {
$('.size-list span').off('click').on('click', function() {
var $this = $(this);
var s = $this.text();
var id = $this.data('size');
var $s = $this.closest('.group.size').find('.size-text');
if ($this.hasClass('disable')) {
return false;
}
$this.parent().find('.active').removeClass('active');
$this.addClass('active');
$s.text(s);
$s.attr('data-size', id);
});
}
function getProductInfo() {
var $el = $('.goods-container');
$el.each(function(index, item) {
var id = $(item).data('id');
var skn = $(item).data('skn');
if (id && skn) {
$.ajax({
url: '/me/return/getProductInfo',
data: {
productId: id,
productSkn: skn
}
}).done(function(result) {
if (result.code === 200) {
renderList(result.data);
initSizeId();
bindColorEvent();
bindSizeEvent();
}
});
}
});
}
function bindSelectEvent() {
$('.exchange-reasons').on('change', function() {
var $op = $(this).find('option:selected');
$(this).attr('data-reason', $op.val());
if ($op.hasClass('is-special')) {
$op.closest('.table-body').siblings('.special-reason').show();
} else {
$op.closest('.table-body').siblings('.special-reason').hide();
}
});
}
function bindTypeEvent() {
$('.change-type .type').on('click', function() {
$('.change-type .type').removeClass('active');
$(this).addClass('active');
});
}
function bindCheckboxEvent() {
$('.checkbox-box').check({
type: 'checkbox',
group: 'exchange-good',
onChange: function(ele, checked) {
var $box = $(ele).closest('.change-info-box');
if (checked) {
$box.addClass('will-change');
$box.find('.form').removeClass('hide');
} else {
$box.removeClass('will-change');
$box.find('.form').addClass('hide');
}
if ($('.will-change').length) {
$('.btn.disable').removeClass('disable');
} else {
$('.btn.confirm').addClass('disable');
}
}
});
}
function submitChange(d) {
$.ajax({
url: '/me/return/submitExchange',
data: d
}).done(function(result) {
if (result.code === 200) {
location.href = 'http://www.yohoblk.com/me/return/exchange/detail/?orderCode=' + result.data.apply_id;
} else {
new _alert('<h1>' + result.message + '</h1>').show();
}
}).fail(function(err) {
console.log(err);
new _alert('<h1>出错了!</h1>').show();
});
}
function validateData() {
var $inputs = $('.express-info-box .require input');
var pass = true;
$inputs.each(function(idx, input) {
var k = input.id;
var v = null;
if (k && validateMap[k]) {
v = validateMap[k];
if (validateMap[k].sl === '#mob' && mobDefault === $(this).val()) {
v = validateMap.mob1;
}
if (!validate.start(v.sl, v.v)) {
pass = false;
}
}
});
// 检查地址
if (!validate.addr(addr.getAreaIds(), {
el: '#city',
errMsg: '请填写完整的省市区信息'
})) {
pass = false;
}
return pass;
}
function bindConfirmEvent() {
$('.confirm').on('click', function() {
var $changeGood = $('.change-info-box.will-change');
var changeGoodsList = [];
var changeData = {};
var $imgs;
var imgs = [];
if ($(this).hasClass('disable')) {
return false;
}
if (!validateData()) {
return false;
}
$changeGood.each(function(index, good) {
var goodObj = {};
var $good = $(good);
var $c = $good.find('.goods-container');
var $f = $good.find('.form');
var $specialReason = $good.find('.special-reason');
$imgs = null;
imgs = [];
goodObj.product_skn = $c.data('skn');
goodObj.product_skc = $c.data('skc');
goodObj.product_sku = $c.data('sku');
goodObj.last_price = $c.data('price');
goodObj.product_id = $c.data('id');
goodObj.goods_type = $c.data('goodsType');
goodObj.exchange_reason = $c.find('.exchange-reasons').data('reason');
goodObj.new_goods_id = $f.find('.color-list .img-box.active img').data('goodsId');
goodObj.new_product_sku = $f.find('.size-list span.active').data('sku');
if ($specialReason.length && $specialReason.get(0).style.display === 'block') {
goodObj.remark = $specialReason.find('.right-content').find('.mark-text').val();
$imgs = $specialReason.find('.right-content').find('.thumb-box');
if ($imgs.length) {
$imgs.each(function(idx, img) {
imgs.push($(img).data('img'));
});
goodObj.evidence_images = imgs;
}
}
changeGoodsList.push(goodObj);
});
changeData.app_type = 1; // BLK的类型规定为1
changeData.goods = changeGoodsList;
changeData.area_code = addr.getAreaIds().split(',')[2];
changeData.order_code = $('.returns-wrap>.order').data('code');
changeData.consignee_name = $('#user').val();
changeData.address = $('#addr').val();
changeData.delivery_tpye = $('.change-type .type.active').data('type');
changeData.mobile = $('#mob').val();
submitChange(changeData);
});
}
function bindBlurEvent() {
$('.express-info-box .require input').on('blur', function() {
var $this = $(this);
var v = null;
if ($this.val().length > 0 && validateMap[this.id]) {
v = validateMap[this.id];
if (v.sl === '#mob' && mobDefault === $(this).val()) {
v = validateMap.mob1;
}
validate.start(v.sl, v.v);
}
});
}
function initAddr(areaCode) {
addr = addrSelector({
el: '#city'
});
if (areaCode) {
addr.setAddress(areaCode.toString());
}
}
function bindImgDeleteEvent() {
$('.operation-box .delete').off('click').on('click', function() {
var $thumb = $(this).closest('.thumb-box');
var $t = $thumb.siblings('.img-up-tip');
var number = $(this).closest('.left.right-content').find('.thumb-box').length - 1;
$t.text(number + '/4');
$thumb.siblings('.img-upload').show();
$thumb.remove();
});
}
function doUpload(count, goodIndex) {
var $el = $('*[data-good-index=' + goodIndex + ']');
if (count < 4) {
upload.up({
callback: function(result) {
var img;
var $t;
var o;
var n;
if (result.code === 200) {
n = parseInt($el.siblings('.thumb-box').length, 10);
o = {src: result.data};
if (result.imgs && result.imgs.length) {
o.url = result.imgs[0];
}
img = imgBoxTpl(o);
$t = $el.next('.img-up-tip');
$el.before(img);
n += 1;
$t.text(n + '/4');
bindImgDeleteEvent();
if (n >= 4) {
$el.hide();
}
} else {
new _alert(result.message).show();
}
}
});
}
}
function bindUploadEvent() {
var $tip = $('.img-up-tip');
$tip.text('0/4');
$('.img-upload').each(function(index, uploadBtn) {
$(uploadBtn).on('click', function() {
var that = this;
var n = parseInt($(that).siblings('.thumb-box').length, 10);
var goodIndex = $(that).data('good-index');
if (n > 4) {
return false;
}
doUpload(n, goodIndex);
});
});
}
function bindKeyUpEvent() {
$('.mark-text').on('keyup', function() {
var $this = $(this),
str = $.trim($this.val());
if (str.length > 100) {
str = str.substring(0, 100);
}
$this.val(str);
});
}
function getChangeType(areaCode) {
$.ajax({
url: '/me/return/getChangeType',
data: {
areaCode: areaCode
}
}).done(function(result) {
var changeTypeHtml = changeTypeTpl({
type: result.data
});
if (changeTypeHtml.length) {
$('.change-type .box-title').after(changeTypeHtml);
bindTypeEvent();
}
});
}
$(document).on('ready', function() {
var areaCode = $('#city').data('code');
getProductInfo();
getChangeType(areaCode);
initAddr(areaCode);
bindSelectEvent();
bindCheckboxEvent();
bindConfirmEvent();
bindBlurEvent();
bindUploadEvent();
bindKeyUpEvent();
});
var colorTpl = require('../../tpl/me/color-list.hbs');
var sizeTpl = require('../../tpl/me/size-list.hbs');
var lazyLoad = require('yoho-jquery-lazyload');
var dialog = require('../plugins/dialog');
var _alert = dialog.Alert;
var addrSelector = require('../plugins/cascading-address');
var addr;
var addressReg = /^[\s\S]{2,100}$/;
var phoneReg = /^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/;
var mobDefault = $('#mob').val();// 手机号默认值
var validate = require('./order/validation');
var imgBoxTpl = require('../../tpl/me/thumbnail.hbs');
var changeTypeTpl = require('../../tpl/me/change-type.hbs');
var upload = require('../plugins/upload');
var validateMap = {
user: {
sl: '#user',
v: {
maxLength: 12,
minLength: 2,
necessary: true,
errMsg: '真实姓名至少2个字符,最多12个字符'
}
},
addr: {
sl: '#addr',
v: {
reg: addressReg,
errMsg: '详细地址不能为空'
}
},
mob: {
sl: '#mob',
v: {
reg: phoneReg,
errMsg: '您输入的联系电话格式不正确'
}
},
mob1: {
sl: '#mob',
v: {
reg: /^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9, *]{8}$/,
errMsg: '您输入的联系电话格式不正确'
}
}
};
lazyLoad($('.banner-img'));
// 添加.check方法
require('../plugins/check');
// 个人中心共用代码加载
require('./me');
function setActive($item) {
var color = $item.find('.color-text').data('color');
var size = $item.find('.size-text').data('size');
var $colorList = $item.find('.color-list');
var $sizeList = $item.find('.size-list');
var activeIndex = 0;
$colorList.find('.img-box').each(function(i, box) {
var $box = $(box);
if ($box.find('img').data('color') === color) {
$colorList.find('.img-box').eq(i).addClass('active');
activeIndex = i;
return false;
}
});
$sizeList = $sizeList.eq(activeIndex).removeClass('hide');
$sizeList.find('span').each(function(i, s) {
var $size = $(s);
if ($size.data('size') === size) {
$sizeList.find('span').eq(i).addClass('active');
}
});
}
function renderList(data) {
var cTpl;
var sTpl;
var $el = $('.goods-container');
var resultId;
var resultSkn;
if (data) {
resultId = data.productId;
resultSkn = data.productSkn;
$el.each(function(index, item) {
var $item = $(item);
var id = $item.data('id');
var skn = $item.data('skn');
var $form;
if (id === resultId && skn === resultSkn) {
$form = $item.closest('.table-body').next('.form');
if (!$form.find('.color-list').length) {
cTpl = colorTpl(data);
sTpl = sizeTpl(data);
$form.find('.group.color').append(cTpl);
$form.find('.group.size').append(sTpl);
setActive($form);
}
}
});
}
}
function bindColorEvent() {
$('.color-list img').off('clice').on('click', function() {
var $this = $(this);
var $sizeList = $this.closest('.group').next('.group').find('.size-list');
var index = $this.data('index');
var colorId = $this.data('color');
var colorText = $this.attr('alt');
var $c = $this.closest('.group.color').find('.color-text');
$('.size-list .active').removeClass('active');
$c.text(colorText);
$c.attr('data-color', colorId);
$this.closest('.color-list').find('.active').removeClass('active');
$this.parent().addClass('active');
$sizeList.removeClass('hide');
$sizeList.addClass('hide');
$sizeList.eq(index).removeClass('hide');
});
}
function initSizeId() {
var s = $('.size-list:not("hide")').find('span').eq(0).data('size');
$('.group.size .size-text').eq(0).attr('data-size', s);
}
function bindSizeEvent() {
$('.size-list span').off('click').on('click', function() {
var $this = $(this);
var s = $this.text();
var id = $this.data('size');
var $s = $this.closest('.group.size').find('.size-text');
if ($this.hasClass('disable')) {
return false;
}
$this.parent().find('.active').removeClass('active');
$this.addClass('active');
$s.text(s);
$s.attr('data-size', id);
});
}
function getProductInfo() {
var $el = $('.goods-container');
$el.each(function(index, item) {
var id = $(item).data('id');
var skn = $(item).data('skn');
if (id && skn) {
$.ajax({
url: '/me/return/getProductInfo',
data: {
productId: id,
productSkn: skn
}
}).done(function(result) {
if (result.code === 200) {
renderList(result.data);
initSizeId();
bindColorEvent();
bindSizeEvent();
}
});
}
});
}
function bindSelectEvent() {
$('.exchange-reasons').on('change', function() {
var $op = $(this).find('option:selected');
$(this).attr('data-reason', $op.val());
if ($op.hasClass('is-special')) {
$op.closest('.table-body').siblings('.special-reason').show();
} else {
$op.closest('.table-body').siblings('.special-reason').hide();
}
});
}
function bindTypeEvent() {
$('.change-type .type').on('click', function() {
$('.change-type .type').removeClass('active');
$(this).addClass('active');
});
}
function bindCheckboxEvent() {
$('.checkbox-box').check({
type: 'checkbox',
group: 'exchange-good',
onChange: function(ele, checked) {
var $box = $(ele).closest('.change-info-box');
if (checked) {
$box.addClass('will-change');
$box.find('.form').removeClass('hide');
} else {
$box.removeClass('will-change');
$box.find('.form').addClass('hide');
}
if ($('.will-change').length) {
$('.btn.disable').removeClass('disable');
} else {
$('.btn.confirm').addClass('disable');
}
}
});
}
function submitChange(d) {
$.ajax({
url: '/me/return/submitExchange',
data: d
}).done(function(result) {
if (result.code === 200) {
location.href = 'http://www.yohoblk.com/me/return/exchange/detail/?orderCode=' + result.data.apply_id;
} else {
new _alert('<h1>' + result.message + '</h1>').show();
}
}).fail(function(err) {
console.log(err);
new _alert('<h1>出错了!</h1>').show();
});
}
function validateData() {
var $inputs = $('.express-info-box .require input');
var pass = true;
$inputs.each(function(idx, input) {
var k = input.id;
var v = null;
if (k && validateMap[k]) {
v = validateMap[k];
if (validateMap[k].sl === '#mob' && mobDefault === $(this).val()) {
v = validateMap.mob1;
}
if (!validate.start(v.sl, v.v)) {
pass = false;
}
}
});
// 检查地址
if (!validate.addr(addr.getAreaIds(), {
el: '#city',
errMsg: '请填写完整的省市区信息'
})) {
pass = false;
}
return pass;
}
function bindConfirmEvent() {
$('.confirm').on('click', function() {
var $changeGood = $('.change-info-box.will-change');
var changeGoodsList = [];
var changeData = {};
var $imgs;
var imgs = [];
if ($(this).hasClass('disable')) {
return false;
}
if (!validateData()) {
return false;
}
$changeGood.each(function(index, good) {
var goodObj = {};
var $good = $(good);
var $c = $good.find('.goods-container');
var $f = $good.find('.form');
var $specialReason = $good.find('.special-reason');
$imgs = null;
imgs = [];
goodObj.product_skn = $c.data('skn');
goodObj.product_skc = $c.data('skc');
goodObj.product_sku = $c.data('sku');
goodObj.last_price = $c.data('price');
goodObj.product_id = $c.data('id');
goodObj.goods_type = $c.data('goodsType');
goodObj.exchange_reason = $c.find('.exchange-reasons').data('reason');
goodObj.new_goods_id = $f.find('.color-list .img-box.active img').data('goodsId');
goodObj.new_product_sku = $f.find('.size-list span.active').data('sku');
if ($specialReason.length && $specialReason.get(0).style.display === 'block') {
goodObj.remark = $specialReason.find('.right-content').find('.mark-text').val();
$imgs = $specialReason.find('.right-content').find('.thumb-box');
if ($imgs.length) {
$imgs.each(function(idx, img) {
imgs.push($(img).data('img'));
});
goodObj.evidence_images = imgs;
}
}
changeGoodsList.push(goodObj);
});
changeData.app_type = 1; // BLK的类型规定为1
changeData.goods = changeGoodsList;
changeData.area_code = addr.getAreaIds().split(',')[2];
changeData.order_code = $('.returns-wrap>.order').data('code');
changeData.consignee_name = $('#user').val();
changeData.address = $('#addr').val();
changeData.delivery_tpye = $('.change-type .type.active').data('type');
changeData.mobile = $('#mob').val();
submitChange(changeData);
});
}
function bindBlurEvent() {
$('.express-info-box .require input').on('blur', function() {
var $this = $(this);
var v = null;
if ($this.val().length > 0 && validateMap[this.id]) {
v = validateMap[this.id];
if (v.sl === '#mob' && mobDefault === $(this).val()) {
v = validateMap.mob1;
}
validate.start(v.sl, v.v);
}
});
}
function initAddr(areaCode) {
addr = addrSelector({
el: '#city'
});
if (areaCode) {
addr.setAddress(areaCode.toString());
}
}
function bindImgDeleteEvent() {
$('.operation-box .delete').off('click').on('click', function() {
var $thumb = $(this).closest('.thumb-box');
var $t = $thumb.siblings('.img-up-tip');
var number = $(this).closest('.left.right-content').find('.thumb-box').length - 1;
$t.text(number + '/4');
$thumb.siblings('.img-upload').show();
$thumb.remove();
});
}
function doUpload(count, goodIndex) {
var $el = $('*[data-good-index=' + goodIndex + ']');
if (count < 4) {
upload.up({
callback: function(result) {
var img;
var $t;
var o;
var n;
if (result.code === 200) {
n = parseInt($el.siblings('.thumb-box').length, 10);
o = {src: result.data};
if (result.imgs && result.imgs.length) {
o.url = result.imgs[0];
}
img = imgBoxTpl(o);
$t = $el.next('.img-up-tip');
$el.before(img);
n += 1;
$t.text(n + '/4');
bindImgDeleteEvent();
if (n >= 4) {
$el.hide();
}
} else {
new _alert(result.message).show();
}
}
});
}
}
function bindUploadEvent() {
var $tip = $('.img-up-tip');
$tip.text('0/4');
$('.img-upload').each(function(index, uploadBtn) {
$(uploadBtn).on('click', function() {
var that = this;
var n = parseInt($(that).siblings('.thumb-box').length, 10);
var goodIndex = $(that).data('good-index');
if (n > 4) {
return false;
}
doUpload(n, goodIndex);
});
});
}
function bindKeyUpEvent() {
$('.mark-text').on('keyup', function() {
var $this = $(this),
str = $.trim($this.val());
if (str.length > 100) {
str = str.substring(0, 100);
}
$this.val(str);
});
}
function getChangeType(areaCode) {
$.ajax({
url: '/me/return/getChangeType',
data: {
areaCode: areaCode
}
}).done(function(result) {
var changeTypeHtml = changeTypeTpl({
type: result.data
});
if (changeTypeHtml.length) {
$('.change-type .box-title').after(changeTypeHtml);
bindTypeEvent();
}
});
}
$(document).on('ready', function() {
var areaCode = $('#city').data('code');
getProductInfo();
getChangeType(areaCode);
initAddr(areaCode);
bindSelectEvent();
bindCheckboxEvent();
bindConfirmEvent();
bindBlurEvent();
bindUploadEvent();
bindKeyUpEvent();
});
... ...
/**
* [个人中心]个人设置
* @author: jiangmin
* @date: 2016/07/11
*/
var cascadingAddress = require('../plugins/cascading-address');
var dialog = require('../plugins/dialog');
var _dialog = dialog.Dialog;
var _alert = dialog.Alert;
var modifyHead = require('./setting/modifyHead');// flash操作
var tip;// 头像编辑弹框
var $year = $('#year');
var $month = $('#month');
var $day = $('#day');
var birthday = {
year: $year.val() || '',
month: $month.val() || '',
day: $day.val() || ''
};
var headHtml = modifyHead.swfobject('head', '600px', '400px', '../../img/me/head.swf?code=' + Math.random() +
'&upload_url=' + encodeURIComponent(location.protocol + '//' +
location.hostname + ':' + location.port + '/me/setting/modifyHead'));
var Bll = {
setIcon: function() {
var html = [];
html.push('<div style="width: 600px;height: 400px">');
html.push(headHtml);
html.push('</div>');
return html.join('');
},
validate: function(info) {
var regBirth = new RegExp(/^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/);
var regName = new RegExp(/^[\u4e00-\u9fa5_a-zA-Z0-9-]+$/);
var regRealName = new RegExp(/^[\u4e00-\u9fa5a-zA-Z]{2,12}$/);
var birthdayForm = $('#birthday');
var nickForm = $('#nick_name');
var realNameForm = $('#username');
// var addressForm = $('.form-group-address');
var flag = true;
!regBirth.test(info.birthday) ? birthdayForm.next().show() : birthdayForm.next().hide();
!regName.test(info.nick_name) ? nickForm.next().show() : nickForm.next().hide();
!regRealName.test(info.username) ? realNameForm.next().show() : realNameForm.next().hide();
// typeof (info.area_code) === 'undefined' ?
// addressForm.css('margin-bottom', '20px').find('.error-tips').show() :
// addressForm.css('margin-bottom', '70px').find('.error-tips').hide();
if (!regBirth.test(info.birthday) || !regName.test(info.nick_name) || !regRealName.test(info.username)) {
flag = false;
}
return flag;
}
};
require('./me');
require('../plugins/check');
require('yoho-jquery-placeholder');
// 第一步:身份验证
require('../me/setting/validate');
// 第二步:操作
require('../me/setting/operate');
$('[placeholder]').placeholder();
// 编辑头像移入移出切换效果
$('.user-icon').hover(function() {
$(this).find('.show-ico ').addClass('hide').end().find('.edit-ico').removeClass('hide');
}, function() {
$(this).find('.show-ico').removeClass('hide').end().find('.edit-ico').addClass('hide');
});
// 编辑头像打开弹框
$(document).on('click', '.edit-ico', function() {
tip = new _dialog({
className: 'settled-success',
content: Bll.setIcon(),
btns: [
{
id: 'apply',
btnClass: ['apply'],
name: '保存',
cb: function() {
modifyHead.uploadImage();
}
},
{
id: 'cancel',
btnClass: ['cancel'],
name: '取消',
cb: function() {
tip.close();
}
}
]
}).show();
});
/**
* 头像上传处理
* @param obj
*/
window.receive_image_bytes = function(obj) {
var result = JSON.parse(obj);
if (result.code === 200) {
tip.close();
$('.show-ico img').attr('src', result.data.image_url.split('?')[0]);
location.reload();
} else {
tip.close();
new _alert('头像修改失败!').show();
}
};
// 时间控件切换
$year.on('change', function() {
birthday.year = $(this).val();
});
$month.on('change', function() {
birthday.month = $(this).val();
});
$day.on('change', function() {
birthday.day = $(this).val();
});
$(function() {
var address = cascadingAddress({el: '#address'});
var areaCode = $('#area_code').val();
if (areaCode) {
address.setAddress(areaCode);
}
// 设置性别
$('.input-radio').check({
type: 'radio',
group: 'genders',
onChange: function(ele, checked, value) {
var gender = $('#gender').val();
checked ? $('#gender').val(value) : $('#gender').val(gender);
}
});
/**
* 保存修改
*/
$(document).on('click', '#save-settings', function() {
var area = address.getAreaIds();
var body = {
_csrf: $('#scrfToken').val(),
nick_name: $('#nick_name').val(),
username: $('#username').val(),
gender: $('#gender').val(),
birthday: birthday.year + '-' + birthday.month + '-' + birthday.day,
area_code: area.split(',')[2],
// todo 手机号码老接口必填
mobile: $('#infoMobile').val(),
full_address: $('#full_address').val(),
// todo 邮编老接口必填字段
zip_code: $('#zip_code').val() || '210000'
};
if (Bll.validate(body)) {
$.ajax({
type: 'POST',
url: '/me/setting/editUserInfo',
dataType: 'json',
data: body,
success: function(data) {
var len = 0;
data.forEach(function(x) {
if (x.code === 200) {
len++;
}
});
if (len === 2) {
new _alert('修改成功!').show();
} else {
new _alert(data[0].message).show();
}
}
});
}
});
});
/**
* [个人中心]个人设置
* @author: jiangmin
* @date: 2016/07/11
*/
var cascadingAddress = require('../plugins/cascading-address');
var dialog = require('../plugins/dialog');
var _dialog = dialog.Dialog;
var _alert = dialog.Alert;
var modifyHead = require('./setting/modifyHead');// flash操作
var tip;// 头像编辑弹框
var $year = $('#year');
var $month = $('#month');
var $day = $('#day');
var birthday = {
year: $year.val() || '',
month: $month.val() || '',
day: $day.val() || ''
};
var headHtml = modifyHead.swfobject('head', '600px', '400px', '../../img/me/head.swf?code=' + Math.random() +
'&upload_url=' + encodeURIComponent(location.protocol + '//' +
location.hostname + ':' + location.port + '/me/setting/modifyHead'));
var Bll = {
setIcon: function() {
var html = [];
html.push('<div style="width: 600px;height: 400px">');
html.push(headHtml);
html.push('</div>');
return html.join('');
},
validate: function(info) {
var regBirth = new RegExp(/^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/);
var regName = new RegExp(/^[\u4e00-\u9fa5_a-zA-Z0-9-]+$/);
var regRealName = new RegExp(/^[\u4e00-\u9fa5a-zA-Z]{2,12}$/);
var birthdayForm = $('#birthday');
var nickForm = $('#nick_name');
var realNameForm = $('#username');
// var addressForm = $('.form-group-address');
var flag = true;
!regBirth.test(info.birthday) ? birthdayForm.next().show() : birthdayForm.next().hide();
!regName.test(info.nick_name) ? nickForm.next().show() : nickForm.next().hide();
!regRealName.test(info.username) ? realNameForm.next().show() : realNameForm.next().hide();
// typeof (info.area_code) === 'undefined' ?
// addressForm.css('margin-bottom', '20px').find('.error-tips').show() :
// addressForm.css('margin-bottom', '70px').find('.error-tips').hide();
if (!regBirth.test(info.birthday) || !regName.test(info.nick_name) || !regRealName.test(info.username)) {
flag = false;
}
return flag;
}
};
require('./me');
require('../plugins/check');
require('yoho-jquery-placeholder');
// 第一步:身份验证
require('../me/setting/validate');
// 第二步:操作
require('../me/setting/operate');
$('[placeholder]').placeholder();
// 编辑头像移入移出切换效果
$('.user-icon').hover(function() {
$(this).find('.show-ico ').addClass('hide').end().find('.edit-ico').removeClass('hide');
}, function() {
$(this).find('.show-ico').removeClass('hide').end().find('.edit-ico').addClass('hide');
});
// 编辑头像打开弹框
$(document).on('click', '.edit-ico', function() {
tip = new _dialog({
className: 'settled-success',
content: Bll.setIcon(),
btns: [
{
id: 'apply',
btnClass: ['apply'],
name: '保存',
cb: function() {
modifyHead.uploadImage();
}
},
{
id: 'cancel',
btnClass: ['cancel'],
name: '取消',
cb: function() {
tip.close();
}
}
]
}).show();
});
/**
* 头像上传处理
* @param obj
*/
window.receive_image_bytes = function(obj) {
var result = JSON.parse(obj);
if (result.code === 200) {
tip.close();
$('.show-ico img').attr('src', result.data.image_url.split('?')[0]);
location.reload();
} else {
tip.close();
new _alert('头像修改失败!').show();
}
};
// 时间控件切换
$year.on('change', function() {
birthday.year = $(this).val();
});
$month.on('change', function() {
birthday.month = $(this).val();
});
$day.on('change', function() {
birthday.day = $(this).val();
});
$(function() {
var address = cascadingAddress({el: '#address'});
var areaCode = $('#area_code').val();
if (areaCode) {
address.setAddress(areaCode);
}
// 设置性别
$('.input-radio').check({
type: 'radio',
group: 'genders',
onChange: function(ele, checked, value) {
var gender = $('#gender').val();
checked ? $('#gender').val(value) : $('#gender').val(gender);
}
});
/**
* 保存修改
*/
$(document).on('click', '#save-settings', function() {
var area = address.getAreaIds();
var body = {
_csrf: $('#scrfToken').val(),
nick_name: $('#nick_name').val(),
username: $('#username').val(),
gender: $('#gender').val(),
birthday: birthday.year + '-' + birthday.month + '-' + birthday.day,
area_code: area.split(',')[2],
// todo 手机号码老接口必填
mobile: $('#infoMobile').val(),
full_address: $('#full_address').val(),
// todo 邮编老接口必填字段
zip_code: $('#zip_code').val() || '210000'
};
if (Bll.validate(body)) {
$.ajax({
type: 'POST',
url: '/me/setting/editUserInfo',
dataType: 'json',
data: body,
success: function(data) {
var len = 0;
data.forEach(function(x) {
if (x.code === 200) {
len++;
}
});
if (len === 2) {
new _alert('修改成功!').show();
} else {
new _alert(data[0].message).show();
}
}
});
}
});
});
... ...
/**
* 订单确认页地址相关
* @author:xuqi<qi.xu@yoho.cn>
* @date: 2016/7/12
*/
var $ = require('yoho-jquery'),
cascadingAddress = require('../../plugins/cascading-address'),
common = require('../../common'),
popup = require('../../plugins/dialog'),
xss = require('xss');
var $receiver = $('#receiver');
var Dialog = popup.Dialog,
Confirm = popup.Confirm,
Alert = popup.Alert;
var detailErr = '2-100字符。1个中文为2个字符';
var addressDialogTpl;
var addressTpl;
require('yoho-jquery-placeholder');
require('yoho-jquery-dotdotdot');
// dot someone
function dotYou($el) {
$el.find('.address-detail').dotdotdot({
wrap: 'letter'
});
}
// place holder
function placeHolderYou($el) {
$el.placeholder();
}
// set address-all show or not
function setAllOfAddress() {
// 显示全部地址[3个地址块+1个新增地址按钮]
if ($('#address-list .address').length > 3) {
$('.address-all').removeClass('vhide');
} else {
$('.address-all').addClass('vhide');
}
}
addressDialogTpl = require('../../../tpl/shopping/address-dialog.hbs');
addressTpl = require('../../../tpl/shopping/address-list.hbs');
// address dialog 数据验证
function validateAddress($el, isUpdate) {
var field = {
name: [
{
noEmpty: true,
err: '收货人不能为空'
},
{
regx: /[\u4e00-\u9fa5a-zA-Z\d]{2,12}/,
err: '请输入2-12个汉字、英文或数字'
}
],
detail: [
{
noEmpty: true,
err: '详细地址不能为空'
}
],
mobile: [
{
noEmpty: true,
err: '手机号码不能为空'
}
],
phone: [
{
regx: /^[\d-]+$/,
err: '只能包含数字、-组合',
skipWhenEmpty: true
}
]
};
var key,
$cur,
cur,
vaKey,
vaRegx;
var pass = true;
// 新增情况下须验证正确的手机号;编辑情况下可通过****的验证
if (isUpdate) {
field.mobile.push({
regx: /^\d{3}(\d|\*){4}\d{4}$/, // 验证正常数字或者****
err: '手机号码格式不正确'
});
} else {
field.mobile.push({
regx: /^\d{11}$/,
err: '手机号码格式不正确'
});
}
for (key in field) {
if (field.hasOwnProperty(key)) {
$cur = $el.find('.address-' + key);
cur = $cur.val();
// 按顺序去验证对应filed的值
for (vaKey = 0; vaKey < field[key].length; vaKey++) {
vaRegx = field[key][vaKey];
// 非空验证、非空下正则验证、其他正则验证
if ((vaRegx.noEmpty && cur === '') || (vaRegx.regx &&
(vaRegx.skipWhenEmpty ? !(cur === '' || vaRegx.regx.test(cur)) : !vaRegx.regx.test(cur))
)) {
pass = false;
$cur.siblings('.error-tips').find('em').text(vaRegx.err).end().show();
break;
}
// 否则隐藏提示
$cur.siblings('.error-tips').hide();
}
if (key === 'detail' && common.getStrLength($cur.val()) > 100) {
pass = false;
$cur.siblings('.error-tips').find('em').text(detailErr).end().show();
}
}
}
// 区域判断
if (!$el.address.hasFullAera()) {
pass = false;
$('.cascading-address + .error-tips').show();
} else {
$('.cascading-address + .error-tips').hide();
}
return pass;
}
// 更新收货信息:姓名,手机号码,区域,详细
function receiver(ad) {
var html = ad.consignee + ' ' + ad.mobile + ' ' + ad.area + ' ' + ad.address;
$receiver.html(xss(html));
}
// 地址弹窗Factory
function addressDialogFactory(opt, $the) {
var address = new Dialog({
closeIcon: false,
className: 'address',
content: addressDialogTpl(opt),
btns: [
{
id: 'save-address',
btnClass: ['save-address'],
name: '保存',
cb: function() {
var $el = address.$el,
consignee,
detail,
mobile,
phone,
areaCode;
// 验证输入
if (validateAddress(address.$el, opt && opt.id)) {
// form value
consignee = $el.find('.address-name').val();
detail = $el.find('.address-detail').val();
mobile = $el.find('.address-mobile').val();
phone = $el.find('.address-phone').val();
areaCode = $el.address.getAreaIds().split(',')[2];
if (opt && opt.id) {
// update
$.ajax({
type: 'POST',
url: '/me/address/update',
data: {
id: opt.id,
consignee: consignee,
address: detail,
mobile: mobile,
phone: phone,
'area_code': areaCode // eslint-disable-line
}
}).then(function(data) {
var updated;
if (data.code === 200) {
updated = {
consignee: consignee,
address: detail,
mobile: mobile.replace(/^(\d{3}).*(\d{4})$/, '$1****$2'),
phone: phone,
area_code: data.data.area_code, // eslint-disable-line
address_id: opt.id,
focus: $the.hasClass('focus'),
area: $el.address.getAreaLabels().replace(/,/g, ' '),
is_default: $the.hasClass('default') ? 'Y' : 'N'
};
$the.before(addressTpl({
address: [updated]
}));
// 如果当前地址正在被使用,则更新收货信息
if ($the.hasClass('focus')) {
receiver(updated);
}
dotYou($the.prev('.address'));
$the.remove();
address.close();
}
});
} else {
// add
$.ajax({
type: 'POST',
url: '/me/address/add',
data: {
consignee: consignee,
address: detail,
mobile: mobile,
phone: phone,
'area_code': areaCode, // eslint-disable-line
init: opt.init
}
}).then(function(data) {
var the;
if (data.code === 200) {
the = $.extend(data.data, {
focus: true
});
$('.address.focus').removeClass('focus');
$('#address-list').prepend(addressTpl({
address: [the],
hasNew: opt.init ? true : false // 初始地址添加增加收货地址的block
}));
dotYou($('#address-list .address').first());
setAllOfAddress();
// 新地址默认使用,更新收货信息
receiver(the);
address.close();
}
});
}
}
}
},
{
id: 'cancel-address',
btnClass: ['cancel-address', 'white'],
name: '取消',
cb: function() {
address.close();
}
}
]
});
return address;
}
/**
* 初始化弹窗内容
* @param $el dialog的jquery对象
* @param areaCode 区码,初始化选择区域的组件
*/
function initAddressContent($el, areaCode) {
// 初始化地址组件/将组件attr到$el方便操作
$el.address = cascadingAddress({
el: '#address'
});
if (areaCode) {
$el.address.setAddress(areaCode + ''); // need convert to string
}
// blur验证
$('.address-detail').on('blur', function() {
var $cur = $(this);
if (common.getStrLength($cur.val()) > 100) {
$cur.siblings('.error-tips').find('em').text(detailErr).end().show();
} else {
$cur.siblings('.error-tips').hide();
}
});
// place holder
placeHolderYou($el.find('[placeholder]'));
}
/**
* 新增地址
* @param isInit Boolean 是否地址列表无地址(首次添加不显示取消按钮)
*/
function newAddress(isInit) {
var address;
address = addressDialogFactory({
init: isInit ? true : false
});
if (isInit) {
address.$el.addClass('is-init');
}
initAddressContent(address.$el);
address.show();
}
function newAddressHandle() {
// 判断是否超过20条地址
if ($('#address-list .address').length >= 7) {
new Alert('您最多添加7个收货地址,可删除不需要的地址后再添加新地址').show();
return;
}
newAddress();
}
// 显示全部地址
$('.address-all').click(function() {
$(this).siblings('.address-list').removeClass('shrink').end().addClass('vhide');
});
// 新增地址
$('.new-address').click(newAddressHandle);
$('.address-list').on('click', '.address', function() {
// 地址切换
var $this = $(this);
if ($this.hasClass('focus')) {
return;
}
$this.addClass('focus');
$this.siblings('.focus').removeClass('focus');
// 切换地址后切换收货信息
receiver({
consignee: $this.data('name'),
area: $this.data('area'),
mobile: $this.data('mobile'),
address: $this.data('address')
});
}).on('click', '.modify', function(e) {
// 修改地址
var $this = $(this).closest('.address');
var areaCode = $this.data('areacode');
var address = addressDialogFactory({
updateAddress: true,
id: $this.data('id'),
name: $this.data('name'),
mobile: $this.data('mobile'),
phone: $this.data('phone'),
areacode: areaCode,
detail: $this.data('address')
}, $this);
initAddressContent(address.$el, areaCode);
address.show();
e.stopPropagation();
}).on('click', '.delete', function(e) {
// 删除地址
var $this = $(this).closest('.address');
var delConfirm = new Confirm({
className: 'address-confirm-dialog',
content: '<p class="main">删除地址</p><p class="sub">您确定要删除该收货地址吗?</p>',
cb: function() {
// 确认删除,do something
$.ajax({
type: 'POST',
url: '/me/address/del',
data: {
id: $this.data('id')
}
}).then(function(data) {
if (data.code === 200) {
// 若当前选中,则移除后选中默认地址
if ($this.hasClass('focus')) {
$this.siblings('.default').addClass('focus');
}
$this.remove();
delConfirm.close();
setAllOfAddress();
}
});
}
}).show();
e.stopPropagation();
}).on('click', '.set-default', function(e) {
// 设置为默认地址
var $this = $(this).closest('.address');
$.ajax({
type: 'POST',
url: '/me/address/default',
data: {
id: $this.data('id')
}
}).then(function(data) {
if (data.code === 200) {
// 切换default和focus状态
$this.addClass('default focus');
$this.siblings('.default, .focus').removeClass('default focus');
}
});
e.stopPropagation();
}).on('click', '.new-address-block', newAddressHandle);
// 页面加载时请求地址列表,若有则展示列表;若无则直接显示新建弹窗并不可被关闭
$.ajax({
url: '/me/address/list'
}).then(function(data) {
var list;
if (data && data.code === 200) {
if (data.data.length === 0) {
// new address
newAddress(true);
} else {
list = data.data.slice(0, 7);
$('#address-list').append(addressTpl({
address: list,
hasNew: true
}));
// 3个地址块+1个新增地址块
if (list.length > 3) {
$('.address-all').removeClass('vhide');
}
dotYou($('.address'));
}
}
});
/**
* 订单确认页地址相关
* @author:xuqi<qi.xu@yoho.cn>
* @date: 2016/7/12
*/
var $ = require('yoho-jquery'),
cascadingAddress = require('../../plugins/cascading-address'),
common = require('../../common'),
popup = require('../../plugins/dialog'),
xss = require('xss');
var $receiver = $('#receiver');
var Dialog = popup.Dialog,
Confirm = popup.Confirm,
Alert = popup.Alert;
var detailErr = '2-100字符。1个中文为2个字符';
var addressDialogTpl;
var addressTpl;
require('yoho-jquery-placeholder');
require('yoho-jquery-dotdotdot');
// dot someone
function dotYou($el) {
$el.find('.address-detail').dotdotdot({
wrap: 'letter'
});
}
// place holder
function placeHolderYou($el) {
$el.placeholder();
}
// set address-all show or not
function setAllOfAddress() {
// 显示全部地址[3个地址块+1个新增地址按钮]
if ($('#address-list .address').length > 3) {
$('.address-all').removeClass('vhide');
} else {
$('.address-all').addClass('vhide');
}
}
addressDialogTpl = require('../../../tpl/shopping/address-dialog.hbs');
addressTpl = require('../../../tpl/shopping/address-list.hbs');
// address dialog 数据验证
function validateAddress($el, isUpdate) {
var field = {
name: [
{
noEmpty: true,
err: '收货人不能为空'
},
{
regx: /[\u4e00-\u9fa5a-zA-Z\d]{2,12}/,
err: '请输入2-12个汉字、英文或数字'
}
],
detail: [
{
noEmpty: true,
err: '详细地址不能为空'
}
],
mobile: [
{
noEmpty: true,
err: '手机号码不能为空'
}
],
phone: [
{
regx: /^[\d-]+$/,
err: '只能包含数字、-组合',
skipWhenEmpty: true
}
]
};
var key,
$cur,
cur,
vaKey,
vaRegx;
var pass = true;
// 新增情况下须验证正确的手机号;编辑情况下可通过****的验证
if (isUpdate) {
field.mobile.push({
regx: /^\d{3}(\d|\*){4}\d{4}$/, // 验证正常数字或者****
err: '手机号码格式不正确'
});
} else {
field.mobile.push({
regx: /^\d{11}$/,
err: '手机号码格式不正确'
});
}
for (key in field) {
if (field.hasOwnProperty(key)) {
$cur = $el.find('.address-' + key);
cur = $cur.val();
// 按顺序去验证对应filed的值
for (vaKey = 0; vaKey < field[key].length; vaKey++) {
vaRegx = field[key][vaKey];
// 非空验证、非空下正则验证、其他正则验证
if ((vaRegx.noEmpty && cur === '') || (vaRegx.regx &&
(vaRegx.skipWhenEmpty ? !(cur === '' || vaRegx.regx.test(cur)) : !vaRegx.regx.test(cur))
)) {
pass = false;
$cur.siblings('.error-tips').find('em').text(vaRegx.err).end().show();
break;
}
// 否则隐藏提示
$cur.siblings('.error-tips').hide();
}
if (key === 'detail' && common.getStrLength($cur.val()) > 100) {
pass = false;
$cur.siblings('.error-tips').find('em').text(detailErr).end().show();
}
}
}
// 区域判断
if (!$el.address.hasFullAera()) {
pass = false;
$('.cascading-address + .error-tips').show();
} else {
$('.cascading-address + .error-tips').hide();
}
return pass;
}
// 更新收货信息:姓名,手机号码,区域,详细
function receiver(ad) {
var html = ad.consignee + ' ' + ad.mobile + ' ' + ad.area + ' ' + ad.address;
$receiver.html(xss(html));
}
// 地址弹窗Factory
function addressDialogFactory(opt, $the) {
var address = new Dialog({
closeIcon: false,
className: 'address',
content: addressDialogTpl(opt),
btns: [
{
id: 'save-address',
btnClass: ['save-address'],
name: '保存',
cb: function() {
var $el = address.$el,
consignee,
detail,
mobile,
phone,
areaCode;
// 验证输入
if (validateAddress(address.$el, opt && opt.id)) {
// form value
consignee = $el.find('.address-name').val();
detail = $el.find('.address-detail').val();
mobile = $el.find('.address-mobile').val();
phone = $el.find('.address-phone').val();
areaCode = $el.address.getAreaIds().split(',')[2];
if (opt && opt.id) {
// update
$.ajax({
type: 'POST',
url: '/me/address/update',
data: {
id: opt.id,
consignee: consignee,
address: detail,
mobile: mobile,
phone: phone,
'area_code': areaCode // eslint-disable-line
}
}).then(function(data) {
var updated;
if (data.code === 200) {
updated = {
consignee: consignee,
address: detail,
mobile: mobile.replace(/^(\d{3}).*(\d{4})$/, '$1****$2'),
phone: phone,
area_code: data.data.area_code, // eslint-disable-line
address_id: opt.id,
focus: $the.hasClass('focus'),
area: $el.address.getAreaLabels().replace(/,/g, ' '),
is_default: $the.hasClass('default') ? 'Y' : 'N'
};
$the.before(addressTpl({
address: [updated]
}));
// 如果当前地址正在被使用,则更新收货信息
if ($the.hasClass('focus')) {
receiver(updated);
}
dotYou($the.prev('.address'));
$the.remove();
address.close();
}
});
} else {
// add
$.ajax({
type: 'POST',
url: '/me/address/add',
data: {
consignee: consignee,
address: detail,
mobile: mobile,
phone: phone,
'area_code': areaCode, // eslint-disable-line
init: opt.init
}
}).then(function(data) {
var the;
if (data.code === 200) {
the = $.extend(data.data, {
focus: true
});
$('.address.focus').removeClass('focus');
$('#address-list').prepend(addressTpl({
address: [the],
hasNew: opt.init ? true : false // 初始地址添加增加收货地址的block
}));
dotYou($('#address-list .address').first());
setAllOfAddress();
// 新地址默认使用,更新收货信息
receiver(the);
address.close();
}
});
}
}
}
},
{
id: 'cancel-address',
btnClass: ['cancel-address', 'white'],
name: '取消',
cb: function() {
address.close();
}
}
]
});
return address;
}
/**
* 初始化弹窗内容
* @param $el dialog的jquery对象
* @param areaCode 区码,初始化选择区域的组件
*/
function initAddressContent($el, areaCode) {
// 初始化地址组件/将组件attr到$el方便操作
$el.address = cascadingAddress({
el: '#address'
});
if (areaCode) {
$el.address.setAddress(areaCode + ''); // need convert to string
}
// blur验证
$('.address-detail').on('blur', function() {
var $cur = $(this);
if (common.getStrLength($cur.val()) > 100) {
$cur.siblings('.error-tips').find('em').text(detailErr).end().show();
} else {
$cur.siblings('.error-tips').hide();
}
});
// place holder
placeHolderYou($el.find('[placeholder]'));
}
/**
* 新增地址
* @param isInit Boolean 是否地址列表无地址(首次添加不显示取消按钮)
*/
function newAddress(isInit) {
var address;
address = addressDialogFactory({
init: isInit ? true : false
});
if (isInit) {
address.$el.addClass('is-init');
}
initAddressContent(address.$el);
address.show();
}
function newAddressHandle() {
// 判断是否超过20条地址
if ($('#address-list .address').length >= 7) {
new Alert('您最多添加7个收货地址,可删除不需要的地址后再添加新地址').show();
return;
}
newAddress();
}
// 显示全部地址
$('.address-all').click(function() {
$(this).siblings('.address-list').removeClass('shrink').end().addClass('vhide');
});
// 新增地址
$('.new-address').click(newAddressHandle);
$('.address-list').on('click', '.address', function() {
// 地址切换
var $this = $(this);
if ($this.hasClass('focus')) {
return;
}
$this.addClass('focus');
$this.siblings('.focus').removeClass('focus');
// 切换地址后切换收货信息
receiver({
consignee: $this.data('name'),
area: $this.data('area'),
mobile: $this.data('mobile'),
address: $this.data('address')
});
}).on('click', '.modify', function(e) {
// 修改地址
var $this = $(this).closest('.address');
var areaCode = $this.data('areacode');
var address = addressDialogFactory({
updateAddress: true,
id: $this.data('id'),
name: $this.data('name'),
mobile: $this.data('mobile'),
phone: $this.data('phone'),
areacode: areaCode,
detail: $this.data('address')
}, $this);
initAddressContent(address.$el, areaCode);
address.show();
e.stopPropagation();
}).on('click', '.delete', function(e) {
// 删除地址
var $this = $(this).closest('.address');
var delConfirm = new Confirm({
className: 'address-confirm-dialog',
content: '<p class="main">删除地址</p><p class="sub">您确定要删除该收货地址吗?</p>',
cb: function() {
// 确认删除,do something
$.ajax({
type: 'POST',
url: '/me/address/del',
data: {
id: $this.data('id')
}
}).then(function(data) {
if (data.code === 200) {
// 若当前选中,则移除后选中默认地址
if ($this.hasClass('focus')) {
$this.siblings('.default').addClass('focus');
}
$this.remove();
delConfirm.close();
setAllOfAddress();
}
});
}
}).show();
e.stopPropagation();
}).on('click', '.set-default', function(e) {
// 设置为默认地址
var $this = $(this).closest('.address');
$.ajax({
type: 'POST',
url: '/me/address/default',
data: {
id: $this.data('id')
}
}).then(function(data) {
if (data.code === 200) {
// 切换default和focus状态
$this.addClass('default focus');
$this.siblings('.default, .focus').removeClass('default focus');
}
});
e.stopPropagation();
}).on('click', '.new-address-block', newAddressHandle);
// 页面加载时请求地址列表,若有则展示列表;若无则直接显示新建弹窗并不可被关闭
$.ajax({
url: '/me/address/list'
}).then(function(data) {
var list;
if (data && data.code === 200) {
if (data.data.length === 0) {
// new address
newAddress(true);
} else {
list = data.data.slice(0, 7);
$('#address-list').append(addressTpl({
address: list,
hasNew: true
}));
// 3个地址块+1个新增地址块
if (list.length > 3) {
$('.address-all').removeClass('vhide');
}
dotYou($('.address'));
}
}
});
... ...
.brand-page {
padding-bottom: 80px;
.brands-tabs {
position: relative;
margin-bottom: 20px;
overflow: hidden;
height: 304px;
a {
display: block;
width: 370px;
height: 304px;
img {
width: 100%;
height: 100%;
display: block;
}
.g-mask {
width: 100%;
height: 100%;
display: block;
position: absolute;
z-index: 1;
background: #ffec07;
border: 1px solid #ffec07;
opacity: 0;
}
}
li {
float: left;
margin-left: 20px;
position: relative;
p {
display: block;
font-size: 30px;
text-align: center;
color: #ffec07;
position: absolute;
top: 50%;
width: 100%;
margin-top: -15px;
z-index: 3;
}
}
li:first-child {
margin-left: 0;
}
li:hover {
.g-mask {
opacity: 0.3;
}
}
}
.category-nav {
border-top: 1px solid #eee;
border-bottom: 1px solid #eee;
width: 1150px;
height: 44px;
line-height: 44px;
font-size: 12px;
font-weight: bold;
position: relative;
z-index: 9;
background-color: #fff;
overflow: hidden;
a {
display: inline-block;
padding-left: 29px;
text-align: center;
color: #222;
cursor: pointer;
font-size: 14px;
}
}
.brands-list {
dt {
height: 58px;
line-height: 58px;
font-weight: bold;
font-size: 16px;
}
dd {
width: 1180px;
li {
float: left;
display: block;
width: 275px;
height: 250px;
margin-right: 15px;
border: 1px solid #eee;
margin-top: 20px;
}
li:nth-child(-n+4) {
margin-top: 0;
}
a {
font-size: 16px;
display: block;
width: 100%;
height: 100%;
img {
width: 275px;
height: 190px;
}
span {
display: block;
height: 60px;
line-height: 60px;
text-align: center;
font-size: 14px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
}
}
.category-fix {
position: fixed;
top: 0;
z-index: 100;
margin-top: 0 !important;
}
}
.brand-page {
padding-bottom: 80px;
.brands-tabs {
position: relative;
margin-bottom: 20px;
overflow: hidden;
height: 304px;
a {
display: block;
width: 370px;
height: 304px;
img {
width: 100%;
height: 100%;
display: block;
}
.g-mask {
width: 100%;
height: 100%;
display: block;
position: absolute;
z-index: 1;
background: #ffec07;
border: 1px solid #ffec07;
opacity: 0;
}
}
li {
float: left;
margin-left: 20px;
position: relative;
p {
display: block;
font-size: 30px;
text-align: center;
color: #ffec07;
position: absolute;
top: 50%;
width: 100%;
margin-top: -15px;
z-index: 3;
}
}
li:first-child {
margin-left: 0;
}
li:hover {
.g-mask {
opacity: 0.3;
}
}
}
.category-nav {
border-top: 1px solid #eee;
border-bottom: 1px solid #eee;
width: 1150px;
height: 44px;
line-height: 44px;
font-size: 12px;
font-weight: bold;
position: relative;
z-index: 9;
background-color: #fff;
overflow: hidden;
a {
display: inline-block;
padding-left: 29px;
text-align: center;
color: #222;
cursor: pointer;
font-size: 14px;
}
}
.brands-list {
dt {
height: 58px;
line-height: 58px;
font-weight: bold;
font-size: 16px;
}
dd {
width: 1180px;
li {
float: left;
display: block;
width: 275px;
height: 250px;
margin-right: 15px;
border: 1px solid #eee;
margin-top: 20px;
}
li:nth-child(-n+4) {
margin-top: 0;
}
a {
font-size: 16px;
display: block;
width: 100%;
height: 100%;
img {
width: 275px;
height: 190px;
}
span {
display: block;
height: 60px;
line-height: 60px;
text-align: center;
font-size: 14px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
}
}
.category-fix {
position: fixed;
top: 0;
z-index: 100;
margin-top: 0 !important;
}
}
... ...