Authored by 周少峰

Merge branch 'develop' of git.dev.yoho.cn:web/yohobuy into feature/web-list

... ... @@ -14,6 +14,7 @@ var swiper,
$brandList = $('.brand-list'),
$icon = $('.search-icon'),
$genderItem = $('.genderNav li'),
$searchAction = $('.search-action'),
hotBrandsSwiper;
var searchH = $('.newbrand-search').outerHeight(),
... ... @@ -156,20 +157,25 @@ if ($('.brand-search-page').length) {
if ($keyword.val().length) {
$icon.css('color', '#000');
$(this).closest('.search-box').css('width', '11.25rem');
$('.search-action').show();
$searchAction.show();
} else {
$icon.css('color', '#b2b2b2');
$(this).closest('.search-box').css('width', '12.5rem');
$('.search-action').hide();
$searchAction.hide();
}
searchResult();
}).focus();
// 2016.1.13 产品(高扬)要求进入页面默认显示取消按钮
$icon.css('color', '#000');
$keyword.closest('.search-box').css('width', '11.25rem');
$searchAction.show();
clearTextHammer = new Hammer($('.clear-text')[0]);
clearTextHammer.on('tap', function(e) {
e.preventDefault();
$('.search-result').html('');
$('#keyword').val('').trigger('input');
e.preventDefault();
e.srcEvent.stopPropagation();
});
... ...
... ... @@ -5,9 +5,9 @@
}
.coin-num {
color: #d0021b;
font-size: pxToRem(66px);
font-size: pxToRem(80px);
font-weight: bold;
line-height: pxToRem(106px);
line-height: pxToRem(88px);
// letter-spacing: pxToRem(8px);
}
... ...
... ... @@ -9,7 +9,7 @@
<li class="po-re">
<label class="pn-label">手机号码</label>
<span class="country-code">+{{area}}</span>
<span class="phone-num">{{phoneNum}}</span>
<span class="phone-num">{{mobile}}</span>
</li>
<li class="po-re">
<input id="captcha" class="input va captcha" type="text" name="captcha">
... ... @@ -22,8 +22,8 @@
</li>
<li>
<input name="area" id="area" type="hidden" value="{{area}}">
<input name="mobile" id="mobile" type="hidden" value="{{phoneNum}}">
<input name="captchaPic" id="captchaPic" type="hidden" value="{{captcha}}">
<input name="mobile" id="mobile" type="hidden" value="{{mobile}}">
<input name="captchaPic" id="captchaPic" type="hidden" value="{{verifyCode}}">
<input name="refer" id="refer" type="hidden" value="">
<input id="next-step" class="btn next-step disable" type="submit" value="下一步" disabled="">
</li>
... ...
... ... @@ -44,6 +44,7 @@
<li>
<span class="attr {{#if checked}}checked{{/if}}">
{{name}}
<div class="sort-up-icon"></div>
</span>
</li>
{{/each}}
... ... @@ -102,16 +103,20 @@
</div>
</div>
<ul class="panel-body check-container clearfix">
{{# brandsShow}}
<li class="attr" data-index="{{index}}" data-key="{{key}}">
<a href="{{href}}">
<span class="iconfont checkbox" data-id="{{id}}">&#xe613;</span>
<span title="{{name}}">{{name}}</span>
</a>
</li>
{{/ brandsShow}}
</ul>
<div class="panel-body">
<div class="ul-scroll">
<ul class="check-container clearfix">
{{# brandsShow}}
<li class="attr" data-index="{{index}}" data-key="{{key}}">
<a href="{{href}}">
<span class="iconfont checkbox" data-id="{{id}}">&#xe613;</span>
<span title="{{name}}">{{name}}</span>
</a>
</li>
{{/ brandsShow}}
</ul>
</div>
</div>
<div class="btns">
<button id="brand-multi-ok" class="multi-select-ok dis">确定</button>
... ...
<div class="sort-pager">
{{# sortType}}
<a class="sort-type{{#if active}} active{{/if}}" href="{{href}}">
{{name}}
{{#if hasSortOrient}}
{{#if active}}
{{#if desc}}
<span class="active-icon iconfont">&#xe603;</span>
{{^}}
<span class="active-icon iconfont">&#xe604;</span>
{{/if}}
{{^}}
<span class="iconfont">&#xe614;</span>
{{/if}}
{{^}}
<span class="iconfont">&#xe604;</span>
{{/if}}
</a>
{{/ sortType}}
{{# checks}}
<a class="checks{{#if checked}} checked{{/if}}" href="{{href}}">
{{#if checked}}
<span class="iconfont">&#xe612;</span>
{{^}}
<span class="iconfont">&#xe613;</span>
{{/if}}
{{name}}
</a>
{{/ checks}}
<div class="pager-wrap">
<div class="page-count">
<span id="count-per-page">
{{countPerPage}}
<i class="iconfont">&#xe604;</i>
</span>
每页
<ul>
{{# pageCounts}}
<li>
<a href="{{href}}">{{count}}</a>
</li>
{{/ pageCounts}}
</ul>
</div>
<p class="pager">
{{#if preHref}}
<a href="{{preHref}}">
<span class="iconfont">&#xe615;</span>
</a>
{{^}}
<span class="dis-icon iconfont">&#xe615;</span>
{{/if}}
<span>
<i>{{curPage}}</i>/{{pageCount}}
</span>
{{#if nextHref}}
<a href="{{nextHref}}">
<span class="iconfont">&#xe601;</span>
</a>
{{^}}
<span class="dis-icon iconfont">&#xe601;</span>
{{/if}}
</p>
</div>
</div>
\ No newline at end of file
... ... @@ -52,7 +52,7 @@
</ul>
</div>
<p class="pager">
<p class="page-orient">
{{#if preHref}}
<a href="{{preHref}}">
<span class="iconfont">&#xe615;</span>
... ...
... ... @@ -152,7 +152,7 @@ $('#brand-search-input').keyup(function() {
if (val === '') {
$brandAttrs.removeClass('hide');
} else {
$brandAttrs.addClass('hide').filter('[data-key*=' + val + ']').removeClass('hide');
$brandAttrs.addClass('hide').filter('[data-key*="' + val + '"]').removeClass('hide');
}
});
... ...
... ... @@ -14,16 +14,12 @@
.title {
float: left;
width: 90px;
width: 75px;
line-height: 30px;
}
.attr-content {
margin-left: 90px;
.default {
padding-right: 140px;
}
margin-left: 75px;
}
.multi-select {
... ... @@ -89,11 +85,42 @@
border: 1px solid #000;
}
.sort-pre {
.attr {
position: relative;
}
}
.active {
.sort-up-icon {
visibility: visible;
}
}
.sort-up-icon {
position: absolute;
width: 15px;
height: 9px;
left: 50%;
margin-left: -7px;
bottom: -17px;
z-index: 3;
visibility: hidden;
background: image-url('product/senior-up.png') no-repeat;
background-position-x: 50%;
}
.sort-sub-wrap {
width: 100%;
.sort-sub {
padding: 15px 0;
border-top: 1px solid #dfdfdf;
margin-top: 15px;
padding: 0 0 15px;
.attr {
padding-top: 15px;
}
}
}
... ... @@ -120,16 +147,17 @@
}
.brand-more {
margin-right: 20px;
margin-right: 10px;
cursor: pointer;
}
.brands-index {
float: left;
line-height: 30px;
margin-right: 5px;
span {
margin: 0 5px;
margin: 0 2px;
cursor: pointer;
-moz-user-select: none;
... ... @@ -145,7 +173,7 @@
line-height: 18px;
border: 1px solid #b0b0b0;
margin-top: 5px;
margin-left: 15px;
margin-left: 10px;
input {
float: left;
... ... @@ -159,7 +187,7 @@
display: inline-block;
width: 55px;
height: 18px;
background: #b0b0b0;
background: #3a3a3a;
color: #fff;
text-align: center;
cursor: default;
... ... @@ -168,10 +196,15 @@
.panel-body {
padding: 15px 20px;
margin-top: 5px;
background: #f4f7f6;
min-height: 30px;
border: 1px solid #000;
margin-top: 5px;
margin-left: 10px;
.ul-scroll {
overflow: auto;
min-height: 30px;
max-height: 150px;
}
}
}
... ... @@ -284,12 +317,12 @@
}
.senior-up-icon {
position: relative;
width: 100%;
height: 9px;
z-index: 1;
z-index: 3;
margin-left: -11px;
visibility: hidden;
background: image-url('product/senior-up.png') no-repeat;
background-position-x: 50%;
}
... ...
@import "search", "list", "new-sale", "filter-box", "sort-pager", "good", "latest-walk", "left-content", "no-result", "hot-rank";
@import "search", "list", "new-sale", "filter-box", "sort-pager", "good", "latest-walk", "left-content", "no-result", "hot-rank", "shop-entry";
.product-page {
... ... @@ -44,6 +44,14 @@
height: 315px;
}
}
.panel-body .attr {
width: 25%;
}
.filter-box .brand .attr-content {
max-width: 730px;
}
}
/*990px*/
... ... @@ -74,5 +82,9 @@
height: 261px;
}
}
.filter-box .brand .attr-content {
max-width: 570px;
}
}
}
\ No newline at end of file
... ...
... ... @@ -148,6 +148,4 @@
color: #f00;
}
}
@import "shop-entry";
}
... ...
... ... @@ -5,7 +5,6 @@
*/
.product-search-page {
@import "shop-entry";
.goods-container {
height: auto;
padding: 25px 0 0 0;
... ... @@ -22,7 +21,6 @@
/*990px*/
@media (max-width: 1180px) {
.product-search-page {
.goods-container {
height: auto;
padding-top: 25px;
... ... @@ -42,5 +40,9 @@
height: 255px;
}
}
.filter-box .brand .attr-content {
max-width: 750px;
}
}
}
... ...
... ... @@ -78,7 +78,7 @@
}
}
.pager {
.page-orient {
float: left;
font-size: 14px;
line-height: 15px;
... ...
<?php
use Action\WebAction;
use LibModels\Web\Passport\RegData;
use Passport\PassportModel;
use Plugin\Helpers;
use LibModels\Wap\Passport\BackData;
use Plugin\AuthCode;
class BackController extends WebAction
{
/**
* 找回密码
*/
public function indexAction()
{
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'backPage' => true,
'back' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countryCode' => '86',
'countryName' => '中国',
'captchaUrl'=>'/passport/images?t=1449799445',
'countryList' => RegData::getAreasData(),
)
);
$this->_view->display('index', $data);
}
public function authcodeAction()
{
echo $this->echoJson(array('code'=> 200));
}
/**
*
*/
public function emailAction()
{
$phoneNum = $this->post('phoneNum','');
$area = $this->post('area','86');
$verifyCode = $this->post('verifyCode','');
if(Helpers::verifyEmail($phoneNum)){ //验证邮箱
$email = $phoneNum;
$data = BackData::sendCodeToEmail($email);
$this->setSession('phoneNum', $phoneNum);
if($data['code'] == 200) {
$this->redirect('sendemail');
}
else {
$this->redirect('index');
}
} else if(Helpers::verifyMobile($phoneNum)) {//验证手机号
$mobile = $phoneNum;
$data = BackData::sendCodeToMobile($mobile);
$this->setSession('phoneNum', $phoneNum);
$this->setSession('area', $area);
$this->setSession('verifyCode', $verifyCode);
if($data['code'] == 200) {
$this->redirect('verification');
}
else {
$this->redirect('index');
}
}
}
/**
* 发送邮件页面
*/
public function sendemailAction() {
$phoneNum = $this->getSession('phoneNum');
if(empty($phoneNum)) {
$this->redirect('index');
}
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'sendEmail' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countrys' => array(),
)
);
$this->_view->display('send-email', $data);
}
/**
* 重置密码页面
*/
public function backcodeAction() {
$code = $this->get('code');
$info = $this->checkCode($code);
if(empty($info)) {
$this->redirect('index');
}
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'resetPage' => true,
'resetPwd' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countrys' => array(),
'code' => $code,
)
);
$this->_view->display('reset-pwd', $data);
}
/**
* 更新密码接口
*
*/
public function updateAction()
{
$code = $this->post('code');
$password = $this->post('pwd');
$info = $this->checkCode($code);
if(Helpers::verifyPassword($password) && !empty($info)) {
//修改密码
if(isset($info['mobile'])) {//手机号修改密码
$mobile = $info['mobile'];
$token = $info['token'];
$area = $info['area'];
$data = BackData::modifyPasswordByMobile($mobile, $token, $password, $area);
if($data['code']) {
$this->redirect('resetSuccess');
}
} else if(isset($info['uid'])) {//其他方式修改密码
$uid = $info['uid'];
$this->redirect('resetSuccess');
}
}
//跳转错误页面
$this->redirect('/error/index');
}
/**
* 重置密码成功
*/
public function resetSuccessAction() {
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'resetSuccess' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countrys' => array()
)
);
$this->_view->display('reset-success', $data);
}
/**
* 手机验证页面
*/
public function verificationAction() {
$phoneNum = $this->getSession('phoneNum');
$area = $this->getSession('area');
$verifyCode = $this->getSession('verifyCode');
if(empty($phoneNum)) {
$this->redirect('index');
}
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'vertificationPage' => true,
'verification' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'phoneNum' => $phoneNum,
'area' => $area,
'captcha'=> $captcha,
'countrys' => array()
)
);
$this->_view->display('verification', $data);
}
/**
* 手机找回密码验证
*/
public function backmobileAction()
{
$mobile = $this->post('mobile');//phoneNum
$area = $this->post('area');
//$captcha = $this->post('captcha');
$code = $this->post('captcha');//code
if($this->getSession('phoneNum') == $mobile && $this->getSession('area') == $area)
{
$result = BackData::validateMobileCode($mobile, $code, $area);
if($result['code'] == 200) {
$str = json_encode(array(
'mobile'=> $mobile,
'area' => $area,
'token'=> $result['data']['token'],
'create_time' => time()
));
$code = AuthCode::encode($str, PassportModel::BACK_FIND_SECRET_KEY);
$url = '/passport/back/backcode?code='.base64_encode($code);
$this->redirect(SITE_MAIN.$url);
}
}
}
/**
* 检查code
*
* @param string $code
* @return boolean
*/
private function checkCode($code)
{
$code = base64_decode($code);
$info = json_decode(AuthCode::decode($code, PassportModel::BACK_FIND_SECRET_KEY), true);
if ($info['create_time'] < 1 || (time() - $info['create_time']) > 86400) {
return array();
}
return $info;
}
<?php
use Action\WebAction;
use LibModels\Web\Passport\RegData;
use Passport\PassportModel;
use Plugin\Helpers;
use LibModels\Wap\Passport\BackData;
use Plugin\AuthCode;
class BackController extends WebAction
{
/**
* 找回密码
*/
public function indexAction()
{
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'backPage' => true,
'back' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countryCode' => '86',
'countryName' => '中国',
'captchaUrl'=>'/passport/images?t=1449799445',
'countryList' => RegData::getAreasData(),
)
);
$this->_view->display('index', $data);
}
public function authcodeAction()
{
echo $this->echoJson(array('code'=> 200));
}
/**
*
*/
public function emailAction()
{
$phoneNum = $this->post('phoneNum','');
$area = $this->post('area','86');
$verifyCode = $this->post('verifyCode','');
if(Helpers::verifyEmail($phoneNum)){ //验证邮箱
$email = $phoneNum;
$data = BackData::sendCodeToEmail($email);
if($data['code'] == 200) {
$this->setSession('email', $email);
$this->redirect('sendemail');
}
else {
$this->redirect('index');
}
} else if(Helpers::verifyMobile($phoneNum)) {//验证手机号
$mobile = $phoneNum;
$data = BackData::sendCodeToMobile($mobile);
if($data['code'] == 200) {
$this->setSession('mobile', $mobile);
$this->setSession('area', $area);
$this->setSession('verifyCode', $verifyCode);
$this->redirect('verification');
}
else {
$this->redirect('index');
}
}
}
/**
* 发送邮件页面
*/
public function sendemailAction() {
$email = $this->getSession('email');
if(empty($email)) {
$this->redirect('index');
}
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'sendEmail' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countrys' => array(),
)
);
$this->_view->display('send-email', $data);
}
/**
* 重置密码页面
*/
public function backcodeAction() {
$code = $this->get('code');
$info = $this->checkCode($code);
if(empty($info)) {
$this->redirect('index');
}
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'resetPage' => true,
'resetPwd' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countrys' => array(),
'code' => $code,
)
);
$this->_view->display('reset-pwd', $data);
}
/**
* 更新密码接口
*
*/
public function updateAction()
{
$code = $this->post('code');
$password = $this->post('pwd');
$info = $this->checkCode($code);
if(Helpers::verifyPassword($password) && !empty($info)) {
//修改密码
if(isset($info['mobile'])) {//手机号修改密码
$mobile = $info['mobile'];
$token = $info['token'];
$area = $info['area'];
$data = BackData::modifyPasswordByMobile($mobile, $token, $password, $area);
if($data['code']) {
$this->redirect('resetSuccess');
}
} else if(isset($info['uid'])) {//其他方式修改密码
$uid = $info['uid'];
$this->redirect('resetSuccess');
}
}
//跳转错误页面
$this->redirect('/error/index');
}
/**
* 重置密码成功
*/
public function resetSuccessAction() {
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'resetSuccess' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'countrys' => array()
)
);
$this->_view->display('reset-success', $data);
}
/**
* 手机验证页面
*/
public function verificationAction() {
$mobile = $this->getSession('mobile');
$area = $this->getSession('area');
$verifyCode = $this->getSession('verifyCode');
if(empty($mobile)) {
$this->redirect('index');
}
$banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
$data = array(
'simpleHeader' => PassportModel::getSimpleHeader(false),
'vertificationPage' => true,
'verification' => array(
'coverHref' => $banner['url'],
'coverImg' => $banner['img'],
'mobile' => $mobile,
'area' => $area,
'verifyCode'=> $verifyCode,
'countrys' => array()
)
);
$this->_view->display('verification', $data);
}
/**
* 手机找回密码验证
*/
public function backmobileAction()
{
$mobile = $this->post('mobile');
$area = $this->post('area');
$verifyCode = $this->post('verifyCode');
$code = $this->post('code');//code
if($this->getSession('mobile') == $mobile && $this->getSession('area') == $area)
{
$result = BackData::validateMobileCode($mobile, $code, $area);
if($result['code'] == 200) {
$str = json_encode(array(
'mobile'=> $mobile,
'area' => $area,
'token'=> $result['data']['token'],
'create_time' => time()
));
$code = AuthCode::encode($str, PassportModel::BACK_FIND_SECRET_KEY);
$url = '/passport/back/backcode?code='.base64_encode($code);
$this->redirect(SITE_MAIN.$url);
}
}
}
/**
* 检查code
*
* @param string $code
* @return boolean
*/
private function checkCode($code)
{
$code = base64_decode($code);
$info = json_decode(AuthCode::decode($code, PassportModel::BACK_FIND_SECRET_KEY), true);
if ($info['create_time'] < 1 || (time() - $info['create_time']) > 86400) {
return array();
}
return $info;
}
}
\ No newline at end of file
... ...
... ... @@ -22,7 +22,7 @@ class RegisterController extends WebAction
'region' => RegData::getAreasData(),
'location' => '+86',
'captchaUrl' => '/passport/images?t=1449799445',
'itemUrl' => '##',
'itemUrl' => 'http://www.yohobuy.com/help/?category_id=9',
'referUrl' => $refer,
'loginUrl' => '/signin.html?refer='.$refer,
'coverHref' => $cover['url'],
... ...