Authored by ccbikai

Merge branch 'release/4.6'

... ... @@ -8,35 +8,37 @@
const mRoot = '../models';
const library = '../../../library';
const _ = require('lodash');
const headerModel = require('../../../doraemon/models/header');
const starModel = require(`${mRoot}/star`);
const helpers = require(`${library}/helpers`);
// const headerModel = require('../../../doraemon/models/header');
const headTab = [
{
url: '/guang/star?openby:yohobuy={"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"http:\/\/m.yohobuy.com\/guang\/star","param":{}}}', // eslint-disable-line
url: '/guang/star',
name: '全部'
},
{
url: '/guang/star/special?openby:yohobuy={"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"http:\/\/m.yohobuy.com\/guang\/star\/special","param":{}}}', // eslint-disable-line
url: '/guang/star/special',
name: '星专题'
},
{
url: '/guang/star/collocation?openby:yohobuy={"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"http:\/\/m.yohobuy.com\/guang\/star\/collocation","param":{}}}', // eslint-disable-line
url: '/guang/star/collocation',
name: '星搭配'
}
];
const processPublicData = (req, title, navBtn) => {
let headerData = headerModel.setNav({
navTitle: title,
navBtn: navBtn
});
const processPublicData = (req, title) => {
// let headerData = headerModel.setNav({
// navTitle: title,
// navBtn: navBtn
// });
let renderData = {
module: 'guang',
title: title,
pageHeader: headerData
title: title
// pageHeader: headerData
};
if (req.query.app_version || req.query.appVersion) {
... ... @@ -71,7 +73,7 @@ exports.getIndexHtml = (req, res, next) => {
focus: true,
data: result.ads
},
starAvatar: result.starAvatar,
starAvatar: result.starAvatar.concat(result.starAvatar).concat(result.starAvatar), // 需要优化,数组重复三次
articles: result.articles
}));
}).catch(next);
... ...
... ... @@ -79,7 +79,7 @@ const _processIndexData = (list) => {
_.forEach(data.ext.tags, (tags) => {
avatar.tags.push({
avatarUrl: `/guang/star/detail?tag=${tags.tagName}&openby:yohobuy{"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"http:\/\/m.yohobuy.com\/guang\/star\/detail","param":{"tag":"${tags.tagName}"}}}`, // eslint-disable-line
avatarUrl: `/guang/star/detail?tag=${tags.tagName}&openby:yohobuy{"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"http://m.yohobuy.com/guang/star/detail","param":{"tag":"${tags.tagName}"}}}`, // eslint-disable-line
cover: tags.cover,
tagName: tags.tagName
});
... ... @@ -104,7 +104,7 @@ const _processIndexData = (list) => {
// 首页明星头像数据处理
if (list.tags) {
_.forEach(list.tags, (data) => {
let url = `/guang/star/detail?tag=${data.tagName}&openby:yohobuy{"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"http:\/\/m.yohobuy.com\/guang\/star\/detail","param":{"tag":"${data.tagName}"}}}`; // eslint-disable-line
let url = `/guang/star/detail?tag=${data.tagName}&openby:yohobuy{"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"http://m.yohobuy.com/guang/star/detail","param":{"tag":"${data.tagName}"}}}`; // eslint-disable-line
formatData.starAvatar.push({
url: url,
... ... @@ -136,6 +136,10 @@ const _processDetailData = (list) => {
if (data.share && data.share.url) {
data.share.url = _processShareUrl(data);
}
let urlObj = url.parse(data.url);
let appUrl = `&openby:yohobuy{"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"${ urlObj.protocol + '//' + urlObj.host + urlObj.pathname}","param":${JSON.stringify(qs.parse(urlObj.query))}}}`.replace(/\//g, '\/'); // eslint-disable-line
data.url += appUrl;
formatData.push(data);
});
... ... @@ -214,7 +218,10 @@ const getSpecialData = () => {
// 数据结构嵌套太深
_.forEach(result, (data) => {
_.map(data.data, (item) => {
let urlObj = url.parse(item.url);
if (!_.isObject(item)) {
return;
}
let urlObj = url.parse(item.url || '');
let appUrl = `&openby:yohobuy{"action":"go.h5","params":{"id":"","share":"","shareparam":{},"islogin":"N","type":0,"updateflag":"N","url":"${ urlObj.protocol + '//' + urlObj.host + urlObj.pathname}","param":${JSON.stringify(qs.parse(urlObj.query))}}}`.replace(/\//g, '\/'); // eslint-disable-line
item.url += appUrl;
... ...
<div class="loading-tip">下拉刷新</div>
<div class="star-wrap">
<div class="star-content">
{{#content}}
{{#if focus}}
{{> resources/banner-top}}
{{/if}}
{{/content}}
<div class="avatar-wrap">
<div class="avatar-swiper avatar">
<ul class="clearfix swiper-wrapper">
{{# starAvatar}}
<li class="swiper-slide">
<a class="rank-avatar" href='{{url}}' data-avatar="{{image cover 180 180}}"></a>
</li>
{{/ starAvatar}}
</ul>
</div>
</div>
<ul class="star-info clearfix">
{{#each articles}}
<li data-id="{{id}}">
<div class="star-avatar">
{{#if isSwiper}}
<div class="article-avatar-swiper">
<ul class="clearfix swiper-wrapper">
{{#each tags}}
<li class="swiper-slide">
<a href='{{avatarUrl}}'>
<div data-avatar="{{image cover 100 100}}" class="rank-avatar" ></div>
<p class="name">{{tagName}}</p>
</a>
</li>
{{/each}}
</ul>
</div>
{{else}}
{{# tags}}
<a href="{{avatarUrl}}">
<div data-avatar="{{image cover 100 100}}" class="rank-avatar" ></div>
<p class="name">{{tagName}}</p>
</a>
{{/ tags}}
{{/if}}
</div>
<a class="star-article" href='{{url}}'>
<i class="article-arrow"></i>
<h2 class="article-title">{{title}}</h2>
<div class="artice-cont">
<p>{{articeTxt}}</p>
<div class="artice-imgs-area">
<img src="{{image src 266 266}}" />
{{!-- <ul class="artice-imgs">
{{#each articeImg}}
<li><img src="{{image . 640 640}}" /></li>
{{/each}}
</ul> --}}
</div>
</div>
<div class="artice-o">
<span class="time"><i class="iconfont time-ico">&#xe603;</i>{{publishTime}}</span>
<span class="see"><i class="iconfont see-ico">&#xe602;</i>{{viewsNum}}</span>
</div>
</a>
</li>
{{/each}}
</ul>
</div>
</div>
{{!-- <div class="view-img">
<div class="mask-bg"></div>
<div class="view-area">
<div class="swiper-view">
<ul class="clearfix swiper-wrapper"></ul>
</div>
</div>
</div> --}}
{{> star/index-html}}
... ...
<div class="star-page yoho-page">
{{> star/head-tab}}
<div class="swiper-num"></div>
<div class="star-main"></div>
<div class="star-main">
</div>
</div>
... ...
... ... @@ -3,12 +3,14 @@
<ul class="special-list">
{{#each resources}}
{{# data}}
{{#if url}}
<li data-bp-id="guang_subjectList_{{title}}_false" class="buriedpoint">
<a href='{{url}}'>
<img class="lazy" data-original="{{image src 640 310}}" alt="{{alt}}"/>
<p>{{title}}</p>
</a>
</li>
{{/if}}
{{/ data}}
{{/each}}
</ul>
... ...
<div class="loading-tip">下拉刷新</div>
<div class="star-wrap">
<div class="star-content">
{{#content}}
{{#if focus}}
{{> resources/banner-top}}
{{/if}}
{{/content}}
<div class="avatar-wrap">
<div class="avatar-swiper avatar">
<ul class="clearfix swiper-wrapper">
{{# starAvatar}}
<li class="swiper-slide">
<a class="rank-avatar" href='{{url}}' data-avatar="{{image cover 180 180}}"></a>
</li>
{{/ starAvatar}}
</ul>
</div>
</div>
<ul class="star-info clearfix">
{{#each articles}}
<li data-id="{{id}}">
<div class="star-avatar">
{{#if isSwiper}}
<div class="article-avatar-swiper">
<ul class="clearfix swiper-wrapper">
{{#each tags}}
<li class="swiper-slide">
<a href='{{avatarUrl}}'>
<div data-avatar="{{image cover 100 100}}" class="rank-avatar" ></div>
<p class="name">{{tagName}}</p>
</a>
</li>
{{/each}}
</ul>
</div>
{{else}}
{{# tags}}
<a href="{{avatarUrl}}">
<div data-avatar="{{image cover 100 100}}" class="rank-avatar" ></div>
<p class="name">{{tagName}}</p>
</a>
{{/ tags}}
{{/if}}
</div>
<a class="star-article" href='{{url}}'>
<i class="article-arrow"></i>
<h2 class="article-title">{{title}}</h2>
<div class="artice-cont">
<p>{{articeTxt}}</p>
<div class="artice-imgs-area">
<img src="{{image src 266 266}}" />
{{!-- <ul class="artice-imgs">
{{#each articeImg}}
<li><img src="{{image . 640 640}}" /></li>
{{/each}}
</ul> --}}
</div>
</div>
<div class="artice-o">
<span class="time"><i class="iconfont time-ico">&#xe603;</i>{{publishTime}}</span>
<span class="see"><i class="iconfont see-ico">&#xe602;</i>{{viewsNum}}</span>
</div>
</a>
</li>
{{/each}}
</ul>
</div>
</div>
{{!-- <div class="view-img">
<div class="mask-bg"></div>
<div class="view-area">
<div class="swiper-view">
<ul class="clearfix swiper-wrapper"></ul>
</div>
</div>
</div> --}}
... ...
... ... @@ -114,6 +114,7 @@ const convertActicityData = (data) => {
discountText = transDiscountToArr(discountArr[1])[1];
}
formatData.push({
activityUrl: '/product/outlet/activity?id=' + item.id,
coverUrl: item.coverUrl,
... ... @@ -121,6 +122,7 @@ const convertActicityData = (data) => {
title: item.title,
discountNum: discountNum,
discountText: discountText,
productPoolId: item.productPoolId || '',
leftTime: item.startLeftTime > 0 ? dateFormate(item.startTime) : item.endLeftTime,
hide: false
});
... ... @@ -132,13 +134,13 @@ const convertActicityData = (data) => {
const getActivityDetail = (id) => {
var params = {
method: 'app.outlets.activityGet',
sort: 2,
sort: 1,
platform: 3,
yh_channel: 1,
id: id,
type: 0
};
return api.get('', sign.apiSign(params)).then(res => {
if (res.code === 200) {
return convertActicityData(res.data);
... ...
... ... @@ -5,7 +5,7 @@
}}
{{#data}}
<li class='category'>
<a href="{{url}}">{{categoryName}}</a>
<a href="{{url}}" {{#if @first}}class="active"{{/if}}>{{categoryName}}</a>
{{#unless @last}}
<span>|</span>
{{/unless}}
... ...
... ... @@ -13,8 +13,8 @@ module.exports = {
port: 6001,
siteUrl: '//m.yohobuy.com',
domains: {
api: 'http://devapi.yoho.cn:58078/',
service: 'http://devservice.yoho.cn:58077/'
api: 'http://testapi.yoho.cn:28078/',
service: 'http://testservice.yoho.cn:28077/'
},
useOneapm: false,
useCache: false,
... ...
... ... @@ -3,6 +3,7 @@
* @return {[type]}
*/
const headerModel = require('../models/header');
const logger = require('../../library/logger');
exports.notFound = () => {
return (req, res) => {
... ... @@ -39,6 +40,7 @@ exports.serverError = () => {
});
}
logger.error(err);
return res.render('error/500', {
err: err,
module: 'common',
... ...
This diff could not be displayed because it is too large.
... ... @@ -9,8 +9,9 @@ var $categoryNavItem = $('.outlet-category-nav a');
var search = require('./sale/search');
var iscroll = require('./outlet/nav');
lazyLoad($('img.lazy'));
require('./outlet/fix-nav');
lazyLoad($('img.lazy'));
// 搜索条件初始化
function searchInitParam(dom) {
... ... @@ -42,6 +43,8 @@ if ($el.length > 0) {
});
}
$('.outlet-category-nav').fixNav();
if ($('.swiper-container .swiper-slide').length > 1) {
new Swiper('.swiper-container', {
lazyLoading: true,
... ...
/**
* make the nav (or any element) to be fixed on top
* author: Bill.Zhao
* repository: https://github.com/buildAll/fix-nav.js/blob/master/fix-nav.js
* license: MIT
*/
var $ = require('yoho-jquery');
(function() {
$.fn.fixNav = function() {
// var defaults = {
// };
// var settings = $.extend({}, defaults, options);
var scrollDirection = {
direction: '',
preScrollTop: 0,
curScrollTop: 0,
getDirection: function() {
this.curScrollTop = $(window).scrollTop();
this.curScrollTop < this.preScrollTop ?
this.direction = 'up' :
this.direction = 'down';
this.preScrollTop = this.curScrollTop;
},
isUp: function() {
this.getDirection();
return this.direction === 'up';
},
isDown: function() {
this.getDirection();
return this.direction === 'down';
}
};
var styleCtrl = {
isSet: false,
preStyle: '',
preTop: null,
$el: null,
setFix: function(el, originTop) {
if (!this.isSet) {
this.$el = $(el);
this.preStyle = this.$el.attr('style');
this.preTop = originTop;
this.$el.css({
position: 'fixed',
top: 0,
'z-index': 9999
});
this.isSet = true;
}
},
clearFix: function() {
var windowTop;
if (this.$el) {
windowTop = $(window).scrollTop();
if (windowTop <= this.preTop) {
if (this.preStyle) {
this.$el.attr('style', this.preStyle);
} else {
this.$el.removeAttr('style');
}
this.isSet = false;
}
}
}
};
return this.each(function(index, el) {
var viewportOffset = el.getBoundingClientRect();
var originPoistion = viewportOffset.top;
$(window).scroll(function() {
var subViewportOffset = el.getBoundingClientRect();
var elementTop = subViewportOffset.top;
if (scrollDirection.isDown() && elementTop <= 0) {
styleCtrl.setFix(el, originPoistion);
} else {
styleCtrl.clearFix();
}
});
});
};
}());
... ...
... ... @@ -92,28 +92,7 @@ function activeNav() {
}
function fixNav() {
var navHeight = 0;
var $navContainer = $('#index_nav');
if ($navContainer.size() > 0) {
navHeight = $navContainer.height();
// 顶部app下载位置
$(window).on('scroll', function() {
var scrollTop = $(window).scrollTop();
if (scrollTop >= navHeight) {
$navContainer.addClass('nav-fix');
} else {
$navContainer.removeClass('nav-fix');
}
});
}
}
activeNav();
fixNav();
module.exports = initNavScroll;
... ...
... ... @@ -106,11 +106,9 @@
.no-storage-img {
display: block;
width: 90px;
height: 90px;
margin-left: 93px;
margin-top: 139px;
background-image: resolve("product/bag_moren.png");
width: 100%;
height: 100%;
background-image: resolve("product/outlet_sellout_bg.png");
background-repeat: no-repeat;
background-size: contain;
}
... ...
... ... @@ -115,6 +115,10 @@
}
}
.avatar-wrap {
height: 180px;
}
.avatar-swiper {
overflow: hidden;
margin-top: 30px;
... ... @@ -370,7 +374,7 @@
display: block;
width: 100%;
height: 100%;
background-image: resolve("guang/star/user-avatar.png");
background-color: #000;
background-repeat: no-repeat;
background-size: contain;
}
... ...