Authored by 陈峰

push

... ... @@ -143,6 +143,7 @@ typings/
### YOHO ###
dist
public/build/bundle/*
public/build/dll/*
public/build/dist/*
public/css/*
public/bundle/*
... ...
... ... @@ -27,6 +27,7 @@ const pkg = require('./package.json');
const cookieSession = require('client-sessions');
const memcachedSession = require('yoho-express-session');
const memcached = require('connect-memcached');
const hbsEvent = require('./config/hbsevent');
const MemcachedStore = memcached(memcachedSession);
const _ = require('lodash');
... ... @@ -58,6 +59,8 @@ app.set('etag', false);
app.enable('trust proxy');
app.disable('x-powered-by');
const safeStringify = require('fast-safe-stringify');
// 循环对象检测
... ... @@ -95,7 +98,8 @@ app.use(global.yoho.hbs({
layoutsDir: path.join(__dirname, 'doraemon/views'),
partialsDir: path.join(__dirname, 'doraemon/views/partial'),
views: path.join(__dirname, 'doraemon/views'),
helpers: _.assign(global.yoho.helpers, require('./utils/helpers'))
helpers: _.assign(global.yoho.helpers, require('./utils/helpers')),
cb: hbsEvent.cb
}));
... ... @@ -229,4 +233,15 @@ try {
// listener
app.listen(config.port, function() {
logger.info('yohobuy start');
hbsEvent.event.on('hbs-complete', () => {
logger.info('hbs-all-complete');
if (!process.env.NODE_ENV || process.env.NODE_ENV === 'dev') {
let {devHost, port} = require('./config/devtools');
require('request-promise')({
url: `http://${devHost}:${port}/event?action=reload`
}).then(() => {}, () =>{});
}
});
});
... ...
... ... @@ -6,7 +6,8 @@
var express = require('express'),
path = require('path'),
helpers = require(path.join(global.utils, 'helpers'));
helpers = require(path.join(global.utils, 'helpers')),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -17,13 +18,17 @@ app.on('mount', function(parent) {
delete parent.locals.settings; // 不继承父 App 的设置
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: path.join(__dirname, 'views/partial'),
views: path.join(__dirname, 'views/action'),
helpers: Object.assign({}, global.yoho.helpers, helpers)
helpers: Object.assign({}, global.yoho.helpers, helpers),
cb: hbsEvent.cb
}));
// router
... ...
... ... @@ -6,7 +6,8 @@
var express = require('express'),
path = require('path'),
helpers = require(path.join(global.utils, 'helpers'));
helpers = require(path.join(global.utils, 'helpers')),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -17,13 +18,17 @@ app.on('mount', function(parent) {
delete parent.locals.settings; // 不继承父 App 的设置
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: path.join(__dirname, 'views/partial'),
views: path.join(__dirname, 'views/action'),
helpers: Object.assign({}, global.yoho.helpers, helpers)
helpers: Object.assign({}, global.yoho.helpers, helpers),
cb: hbsEvent.cb
}));
// router
... ...
... ... @@ -10,7 +10,7 @@
</div>
</div>
<div class="invite-code invitation">
<div class="title">方法二:使用邀请码</div>
<div class="title">方法二:使用潮流口令</div>
<div class="code-content">
<div class="invite-content">
<span class="code trend-code">{{#if trendWord}}{{trendWord}}{{else}}{{inviteCode}}{{/if}}</span>
... ... @@ -26,7 +26,7 @@
<div class="title">方法三:使用邀请链接</div>
<div class="code-content">
<div class="invite-content">
<span class="code">{{shareUrl}}</span>
<span class="code{{#unless isApp}} code-len{{/unless}}">{{shareUrl}}</span>
{{#if isApp}}
<span class="share button">分享</span>
<a class="copy button" href='//m.yohobuy.com/?openby:yohobuy={"action":"go.copy","params":{"text":"{{copyUrl}}","message":"复制成功"}}'>复制</a>
... ...
... ... @@ -15,6 +15,8 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
// router
app.use(require('./router'));
... ...
... ... @@ -5,7 +5,8 @@
*/
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -17,13 +18,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: path.join(__dirname, 'views/partial'),
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
// router
... ...
... ... @@ -5,7 +5,9 @@
*/
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -18,13 +20,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: path.join(__dirname, 'views/partial'),
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
// router
... ...
... ... @@ -5,7 +5,8 @@
*/
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -17,13 +18,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: path.join(__dirname, './views/partial'),
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
// router
... ...
... ... @@ -5,7 +5,8 @@
*/
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -17,13 +18,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: path.join(__dirname, './views/partial'),
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
// router
... ...
... ... @@ -5,7 +5,8 @@
*/
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -17,13 +18,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'mip',
layoutsDir: doraemon,
partialsDir: [path.join(__dirname, 'views/partial')],
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
app.locals.layout = 'mip';
... ...
... ... @@ -5,7 +5,8 @@
*/
'use strict';
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var passport = require('passport');
... ... @@ -19,13 +20,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: path.join(__dirname, 'views/partial'),
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
require('./auth');
... ...
... ... @@ -35,7 +35,7 @@ const shop = {
return shop.brand(req, res, next); // 品牌列表,有品牌ID就直接展示为品牌
}
return co(function*() {
return co(function* () {
if (shopId) {
let shopInfoApi = (yield shopModel.getShopInfo(shopId, uid)) || {};
let shopInfo = _.get(shopInfoApi, 'data', {});
... ... @@ -97,7 +97,7 @@ const shop = {
let uid = req.user.uid;
if (!brandId) {
return res.json({code: 404});
return res.json({ code: 404 });
}
return shopModel.getBrandIntro(brandId, uid).then(result => {
res.json(result);
... ... @@ -112,7 +112,7 @@ const shop = {
let isApp = req.query.app_version || req.query.appVersion || false;
return searchModel.searchProductBySkn(skns).then(hotList => {
hotList = productProcess.processProductList(hotList, {isApp: isApp});
hotList = productProcess.processProductList(hotList, { isApp: isApp });
_.forEach(hotList, (value, key) => {
hotList[key].tags = {};
hotList[key].is_soon_sold_out = false;
... ... @@ -202,7 +202,7 @@ const shop = {
let goodsListBySkn = yield searchModel.searchProductBySkn(decoratorsAll.skns);
let decorators = shopPrcs.pushGoodsInfo(decoratorsAll.decorators, goodsListBySkn);
shopInfo.shop_intro_link = helpers.urlFormat('/product/index/intro', {shop_id: shopId});
shopInfo.shop_intro_link = helpers.urlFormat('/product/index/intro', { shop_id: shopId });
res.render('newshop/shop-reds', {
title: shopInfo.shop_name + '|' + shopInfo.shop_name + '潮流服装服饰-Yoho!Buy有货',
... ... @@ -270,6 +270,9 @@ const shop = {
}
}
let appPath = 'yohobuy://yohobuy.com/goapp?openby:yohobuy={"action":"go.shop","params":{"shop_template_type":"1","shop_id":"' +
shopId + '","shop_name":"' + shopInfo.shop_name + '"}}';
res.render('newshop/shop-list', {
module: 'product',
page: 'shop-list',
... ... @@ -284,6 +287,7 @@ const shop = {
shopId: shopId,
shopInfo: shopInfo,
goodsList: goodsList,
appPath: appPath,
shopPage: true,
_noLazy: true,
localCss: true,
... ...
... ... @@ -6,7 +6,8 @@
'use strict';
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -18,13 +19,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: [path.join(__dirname, 'views/partial'), `${doraemon}/partial`],
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
// router
... ...
... ... @@ -2,7 +2,7 @@
<!-- 基础店铺页面 -->
{{# shopInfo}}
<div id="brand-header" class="brand-header" data-id={{shops_id}} data-isbaseshop="{{isBaseShop}}">
<img src={{image2 banner q=60}}>
<img src="{{image2 banner w=750 h=176 q=60}}">
<a class="btn-intro" id="shopIntroBtn" href="javascript:void(0);">
店铺介绍
</a>
... ... @@ -18,8 +18,7 @@
{{{shop_intro}}}
</div>
<p class="fo">
<span class="iconfont">&#xe629;</span>
100%品牌授权正品
<span class="iconfont">&#xe629;</span> 100%品牌授权正品
</p>
<span id="closeIntroBtn" class="iconfont close-intro">&#xe623;</span>
</div>
... ... @@ -34,15 +33,12 @@
<!-- /基础店铺页面 -->
{{!--筛选tab--}}
<div class="filter-box">
{{> product/filter-tab-new}}
{{> common/filter}}
{{> product/filter-tab-new}} {{> common/filter}}
</div>
<div id="goods-container" class="goods-container">
<div class="default-goods container clearfix">
{{#goodsList}}
{{> common/goods}}
{{/goodsList}}
{{#goodsList}} {{> common/goods}} {{/goodsList}}
</div>
</div>
... ...
... ... @@ -5,7 +5,8 @@
*/
var express = require('express'),
path = require('path');
path = require('path'),
hbsEvent = require('../../config/hbsevent');
var app = express();
... ... @@ -17,13 +18,16 @@ app.on('mount', function(parent) {
Object.assign(app.locals, parent.locals);
});
app.disable('x-powered-by');
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: [path.join(__dirname, 'views/partial')],
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
helpers: global.yoho.helpers,
cb: hbsEvent.cb
}));
... ...
... ... @@ -11,8 +11,8 @@ const isProduction = process.env.NODE_ENV === 'production';
const isTest = process.env.NODE_ENV === 'test';
const domains = {
api: 'http://api-test3.yohops.com:9999/',
service: 'http://service-test3.yohops.com:9999/',
api: 'http://api.yoho.cn/',
service: 'http://service.yoho.cn/',
singleApi: 'http://api-test3.yohops.com:9999/',
global: 'http://global-test-soa.yohops.com:9999',
liveApi: 'http://testapi.live.yohops.com:9999/',
... ...
const fs = require('fs');
let devHost = '127.0.0.1';
try {
let buf = fs.readFileSync('.devhost');
devHost = JSON.parse(buf.toString()).host;
} catch (e) {} //eslint-disable-line
module.exports = {
devHost,
port: 5001
};
... ...
/**
* hbs预编译回调事件
* @author: chenfeng<feng.chen@yoho.cn>
* @date: 2017/08/14
*/
const EventEmitter = require('events');
const event = new EventEmitter();
let hbsEvent = {
cbTick: 0,
cbComTick: 0,
event
};
Object.defineProperty(hbsEvent, 'cb', {
get() {
hbsEvent.cbTick++;
return this._cb;
},
set(val) {
this._cb = val;
}
});
hbsEvent.cb = () => {
hbsEvent.cbComTick++;
if (hbsEvent.cbTick <= hbsEvent.cbComTick) {
event.emit('hbs-complete');
}
};
module.exports = hbsEvent;
... ...
'use strict';
const fs = require('fs');
let devHost = '127.0.0.1';
fs.readFile('.devhost', (err, buf)=> {
if (!err) {
devHost = JSON.parse(buf.toString()).host;
}
});
const devHost = require('../../config/devtools');
module.exports = () => {
return (req, res, next) => {
Object.assign(res.locals, {
devHost: devHost
});
Object.assign(res.locals, devHost);
next();
};
... ...
... ... @@ -36,7 +36,7 @@ module.exports = () => {
sessionKey
};
}
}
} else {
if (!req.user.uid &&
req.cookies.app_uid &&
req.cookies.app_uid !== '0' &&
... ... @@ -77,7 +77,7 @@ module.exports = () => {
res.cookie('app_version', appVersion);
res.cookie('app_client_type', appSessionType);
}
}
next();
};
... ...
... ... @@ -40,7 +40,21 @@
</script>
{{/if}}
{{#unless devEnv}}
{{#if devEnv}}
{{#if localCss }}
<link rel="stylesheet" media="all" href="//{{devHost}}:5001/common.css?t={{startTime}}">
{{/if}}
{{#if isFeature}}
<link rel="stylesheet" media="all" href="//{{devHost}}:5001/feature.css?t={{startTime}}">
{{else}}
{{#ifor localCss vue}}
<link rel="stylesheet" media="all" href="//{{devHost}}:5001/{{module}}.{{page}}.css?t={{startTime}}">
{{^}}
<link rel="stylesheet" media="all" href="//{{devHost}}:5001/index.css?t={{startTime}}">
{{/ifor}}
{{/if}}
{{else}}
{{#if localCss }}
<link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/common.css?t={{startTime}}">
{{/if}}
... ... @@ -54,7 +68,7 @@
<link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/index.css?t={{startTime}}">
{{/ifor}}
{{/if}}
{{/unless}}
{{/if}}
<link rel="apple-touch-icon-precomposed" href="http://static.yohobuy.com/m/v1/img/touch/apple-touch-icon-144x144-precomposed-new.png">
<link rel="apple-touch-startup-image" sizes="640x920" href="http://static.yohobuy.com/m/v1/img/startup/startup-retina.png" media="screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)">
<link rel="apple-touch-startup-image" sizes="320x460" href="http://static.yohobuy.com/m/v1/img/startup/startup.png" media="screen and (max-device-width: 320)">
... ... @@ -103,14 +117,6 @@
<script>var STATIC_RESOURCE_PATH = '//{{devHost}}:5001';</script>
<script src="//{{devHost}}:5001/libs.js"></script>
{{!--开发环境的CSS需要hot reload, 所以使用 JS 方式加载--}}
{{#if localCss}}
<script src="//{{devHost}}:5001/common.js"></script>
{{else}}
<script src="//{{devHost}}:5001/index.js"></script>
{{/if}} {{#if isFeature}}
<script src="//{{devHost}}:5001/feature.js"></script>
{{/if}}
<script src="//{{devHost}}:5001/{{module}}.{{page}}.js"></script>
{{^}}
<script>var STATIC_RESOURCE_PATH = '//cdn.yoho.cn/m-yohobuy-node/assets';</script>
... ...
... ... @@ -10,7 +10,8 @@
"scripts": {
"start": "NODE_ENV=\"production\" node app.js",
"dev": "nodemon -e js,hbs -i public/ app.js",
"static": "webpack-dev-server --config ./public/build/webpack.dev.config.js",
"static": "node ./public/build/dev-server.js",
"build:dll": "webpack --config ./public/build/webpack.dll.indexcss.config.js",
"build": "webpack --config ./public/build/webpack.prod.config.js",
"debug": "DEBUG=\"express:*\" nodemon -e js,hbs -i public/ app.js",
"lint-js": "lint-js",
... ... @@ -72,7 +73,7 @@
"xml2js": "^0.4.17",
"yoho-express-session": "^2.0.0",
"yoho-md5": "^2.0.0",
"yoho-node-lib": "=0.2.28",
"yoho-node-lib": "=0.2.29",
"yoho-zookeeper": "^1.0.8"
},
"devDependencies": {
... ... @@ -87,10 +88,13 @@
"eslint-loader": "^1.9.0",
"eslint-plugin-html": "^3.1.1",
"extract-text-webpack-plugin": "^3.0.0",
"friendly-errors-webpack-plugin": "^1.6.1",
"handlebars-loader": "^1.5.0",
"happypack": "^3.1.0",
"husky": "^0.14.3",
"ignore-file-loader": "^1.0.0",
"nodemon": "^1.11.0",
"opn": "^5.1.0",
"postcss-assets": "^4.2.0",
"postcss-calc": "^6.0.0",
"postcss-center": "^1.0.0",
... ... @@ -118,7 +122,11 @@
"vue-loader": "^13.0.4",
"vue-template-compiler": "^2.4.2",
"webpack": "^3.5.2",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-middleware": "^1.12.0",
"webpack-dev-server": "^2.7.1",
"webpack-hot-middleware": "^2.18.2",
"webpack-merge": "^4.1.0",
"webpack-uglify-parallel": "^0.1.3",
"yoho-cookie": "^1.2.0",
"yoho-fastclick": "^1.0.6",
... ... @@ -130,6 +138,7 @@
"yoho-lint": "^1.0.1",
"yoho-mlellipsis": "0.0.3",
"yoho-qs": "^1.0.1",
"store": "^2.0.12",
"yoho-swiper": "^3.3.1",
"yoho-swiper2": "0.0.5"
}
... ...
const hotClient = require('webpack-hot-middleware/client?dynamicPublicPath=true&path=__webpack_hmr&noInfo=true&reload=true'); // eslint-disable-line
hotClient.subscribeAll(event => {
if (event.action === 'built') {
document.querySelectorAll('link[href][rel=stylesheet]').forEach((link) => {
fetch(link.href).then((res) => {
res.text().then(text => {
let head = document.getElementsByTagName('head')[0];
let style;
style = document.getElementById(link.href);
if (!style) {
style = document.createElement('style');
style.type = 'text/css';
style.id = link.href;
style.appendChild(document.createTextNode(text));
} else {
style.textContent = text;
}
head.appendChild(style);
});
});
});
}
});
... ...
const express = require('express');
const webpack = require('webpack');
const compression = require('compression');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const webpackConfig = require('./webpack.dev.config.js');
const path = require('path');
const compiler = webpack(webpackConfig);
const devMiddleware = webpackDevMiddleware(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true,
headers: {
'Access-Control-Allow-Origin': '*'
}
});
const hotMiddleware = webpackHotMiddleware(compiler, {
log: () => {}
});
const app = express();
app.use(devMiddleware);
app.use(hotMiddleware);
app.use((req, res, next) => {
res.set('Access-Control-Allow-Origin', '*');
next();
});
app.use('/',
express.static(path.join(__dirname, '../')),
express.static(path.join(__dirname, './bundle/')),
express.static(path.join(__dirname, './dll/')));
app.use('/event', (req, res) => {
if (req.query.action === 'reload') {
hotMiddleware.publish({
action: 'reload'
});
}
res.json({
action: req.query.action,
message: 'ok'
});
});
app.use(compression());
app.listen(5001, () => {
console.log('dev start 5001');
});
... ...
const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const postcssConfig = require('./postcss.config.js');
const cssLoader = (env, type) => {
let loaders = [{
loader: 'css-loader',
options: {
url: false,
sourceMap: env === 'dev'
}
}];
if (type === 'css') {
loaders.push({
loader: 'postcss-loader',
options: {
plugins: postcssConfig.postcssPlugin(env),
parser: 'postcss-scss'
}
});
}
// if (env === 'dev') {
// loaders.unshift({
// loader: 'style-loader'
// });
// return loaders;
// }
return ExtractTextPlugin.extract({
fallback: type === 'css' ? 'style-loader' : 'vue-style-loader',
use: loaders
});
};
const hbsLoader = {
loader: 'handlebars-loader',
options: {
helperDirs: [
path.join(__dirname, '../js/common/helpers')
],
partialDirs: [
path.join(__dirname, '../../doraemon/views/partial')
]
}
};
module.exports = {
cssLoader,
hbsLoader
};
... ...
... ... @@ -12,61 +12,17 @@ const shelljs = require('shelljs');
const _ = require('lodash');
const webpack = require('webpack');
const HappyPack = require('happypack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const { cssLoader, hbsLoader } = require('./utils.js');
const postcssConfig = require('./postcss.config.js');
const happyThreadPool = HappyPack.ThreadPool({ // eslint-disable-line
size: os.cpus().length
});
const hbsLoader = {
loader: 'handlebars-loader',
options: {
helperDirs: [
path.join(__dirname, '../js/common/helpers')
],
partialDirs: [
path.join(__dirname, '../../doraemon/views/partial')
]
}
};
const cssLoader = (env, type) => {
let loaders = [{
loader: 'css-loader',
options: {
url: false,
sourceMap: env === 'dev'
}
}];
if (type === 'css') {
loaders.push({
loader: 'postcss-loader',
options: {
plugins: postcssConfig.postcssPlugin(env),
parser: 'postcss-scss'
}
});
}
if (env === 'dev') {
loaders.unshift({
loader: 'style-loader'
});
return loaders;
}
return ExtractTextPlugin.extract({
fallback: type === 'css' ? 'style-loader' : 'vue-style-loader',
use: loaders
});
};
const getEntries = () => {
const entries = {
libs: ['babel-polyfill', 'yoho-jquery', path.join(__dirname, '../js/global.js')],
index: path.join(__dirname, '../scss/index.css'),
common: path.join(__dirname, '../scss/common.css'),
feature: path.join(__dirname, '../scss/feature.css')
};
... ...
'use strict';
const path = require('path');
const _ = require('lodash');
const webpack = require('webpack');
const StyleLintPlugin = require('stylelint-webpack-plugin');
const path = require('path');
const merge = require('webpack-merge');
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const devInfo = require('./dev-info.js');
let baseConfig = require('./webpack.base.config.js');
baseConfig = baseConfig('dev');
_.mergeWith(baseConfig, {
devtool: '#inline-source-map',
Object.keys(baseConfig.entry).forEach(function(name) {
baseConfig.entry[name] = [path.join(__dirname, './dev-client.js')].concat(baseConfig.entry[name]);
});
module.exports = merge(baseConfig, {
devtool: '#cheap-module-source-map',
output: {
publicPath: devInfo.publicPath
},
module: {
rules: [{
enforce: 'pre',
test: /(\.js|\.vue)$/,
exclude: /node_modules/,
loader: 'eslint-loader',
options: {
cache: true,
configFile: './.eslintrc',
formatter: require('eslint/lib/formatters/codeframe')
}
}]
},
devServer: {
host: devInfo.host,
port: devInfo.port,
publicPath: devInfo.publicPath,
contentBase: [path.join(__dirname, './bundle/'), path.join(__dirname, '../')],
hot: true,
inline: true,
compress: true,
stats: {
colors: true,
children: false,
chunks: false,
assetsSort: 'size',
},
headers: {
'Access-Control-Allow-Origin': '*'
}
},
plugins: [
new StyleLintPlugin({
files: ['public/scss/**/*.css', 'public/vue/**/*.vue'],
syntax: 'scss'
}),
new webpack.HotModuleReplacementPlugin()
new ExtractTextPlugin('[name].css'),
new webpack.HotModuleReplacementPlugin(),
new FriendlyErrorsPlugin(),
]
}, function customizer(objValue, srcValue) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
});
delete baseConfig.extends;
module.exports = baseConfig;
... ...
const webpack = require('webpack');
const path = require('path');
const {cssLoader} = require('./utils.js');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
let webpackConfig = {
entry: {
index: [path.join(__dirname, '../scss/index.css')]
},
output: {
path: path.join(__dirname, './dll'), // absolute path
filename: '[name].js'
},
module: {
rules: [{
test: /\.css$/,
use: cssLoader('pro', 'css')
}]
},
plugins: [
new ExtractTextPlugin('[name].css'),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
})
]
};
module.exports = webpackConfig;
... ...
... ... @@ -3,8 +3,8 @@
const os = require('os');
const path = require('path');
const shelljs = require('shelljs');
const _ = require('lodash');
const webpack = require('webpack');
const merge = require('webpack-merge');
const UglifyJsParallelPlugin = require('webpack-uglify-parallel');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const config = require('../../package.json');
... ... @@ -15,10 +15,11 @@ let baseConfig = require('./webpack.base.config.js');
shelljs.mkdir('-p', distDir);
shelljs.cp('-R', path.join(__dirname, '../img/'), distDir);
shelljs.cp('-R', path.join(__dirname, '../font/'), distDir);
shelljs.cp('-R', path.join(__dirname, './dll/*'), distDir);
baseConfig = baseConfig('pro');
_.mergeWith(baseConfig, {
module.exports = merge(baseConfig, {
output: {
path: distDir
},
... ... @@ -37,10 +38,4 @@ _.mergeWith(baseConfig, {
comments: false
})
]
}, function customizer(objValue, srcValue) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
});
module.exports = baseConfig;
... ...
No preview for this file type
No preview for this file type
No preview for this file type
{{#inviteShare}}
<div class="invite-share">
<span class="close-invite">×</span>
<span class="close-invite iconfont">&#xe72d;</span>
<img class="head-ico" src="{{image headIco 75 75}}">
<span class="invite-name">"{{nickname}}"邀请你来有货玩潮流</span>
<p class="invite-trend">{{#if trendWord}}# {{trendWord}} #{{else}}{{inviteCode}}{{/if}}</p>
... ...
require('index.css');
// require('index.css');
const Vue = require('vue');
const Logistics = require('home/refund/logistics.vue');
const LogisticsCompany = require('home/refund/logistics-company.vue');
... ...
const store = require('store');
const expirePlugin = require('store/plugins/expire');
store.addPlugin(expirePlugin);
module.exports = {
get: (...params) => {
store.enabled = false; // 暂时屏蔽
return store.enabled ? store.get(...params) : false;
},
set: (...params) => {
store.enabled = false; // 暂时屏蔽
return store.enabled ? store.set(...params, new Date().getTime() + 180000) : false;
}
};
... ...
... ... @@ -11,6 +11,7 @@
const filter = require('plugin/filter');
const noResultHbs = require('product/search/no-result-new.hbs');
const lazyLoad = require('yoho-jquery-lazyload');
const cacheStore = require('./cache-store');
class ProductListWithFilter {
constructor(filterParams, searchUrl, extra) {
... ... @@ -101,6 +102,42 @@ class ProductListWithFilter {
});
}
dataRender(result) {
// 去掉正在加载
$('.search-divide').remove();
let noResult = !result || result.length < 1 || (result.list && result.list.length < 1);
// 没有结果输出没有结果页面
if (noResult) {
if (this.isScrollLoad) {
this.view.container.after(() => {
return '<div class="search-divide">没有更多内容了...</div>';
});
} else {
this.view.container.html(noResultHbs());
}
if (this.nav) {
this.nav.end = true;
}
this.onSearching = false;
return false;
}
if (this.isScrollLoad) {
this.view.container.append(result);
} else {
this.view.container.html(result);
}
lazyLoad(this.view.container.find('img[class=lazy]').not('img[src]'));
this.onSearching = false;
}
/**
* 获取商品列表
*/
... ... @@ -128,6 +165,8 @@ class ProductListWithFilter {
}
if (!this.onSearching) {
let catchKey = this.searchUrl + '?' + $.param(this.defaultOpt);
this.onSearching = true;
$.ajax({
... ... @@ -138,46 +177,24 @@ class ProductListWithFilter {
withCredentials: true
},
beforeSend: () => {
let cacheData = cacheStore.get(catchKey);
if (cacheData) {
this.dataRender(cacheData);
return false;
}
if ($('.no-result-new').length > 0) {
$('.no-result-new').remove();
}
this.view.container.after(() => {
return '<div class="search-divide">正在加载...</div>';
});
},
success: (result) => {
// 去掉正在加载
$('.search-divide').remove();
let noResult = !result || result.length < 1 || (result.list && result.list.length < 1);
// 没有结果输出没有结果页面
if (noResult) {
if (this.isScrollLoad) {
this.view.container.after(() => {
return '<div class="search-divide">没有更多内容了...</div>';
});
} else {
this.view.container.html(noResultHbs());
}
if (this.nav) {
this.nav.end = true;
}
this.onSearching = false;
return false;
}
if (this.isScrollLoad) {
this.view.container.append(result);
} else {
this.view.container.html(result);
}
lazyLoad(this.view.container.find('img[class=lazy]').not('img[src]'));
this.onSearching = false;
cacheStore.set(catchKey, result);
this.dataRender(result);
},
error: () => {
let $divide = $('.search-divide');
... ...
... ... @@ -74,6 +74,10 @@
overflow: hidden;
}
.code-len {
width: 444px;
}
.button {
height: 68px;
width: 120px;
... ...
... ... @@ -8,17 +8,16 @@
position: relative;
.close-invite {
width: 34px;
width: 38px;
height: 34px;
position: absolute;
top: 50%;
left: 8px;
display: block;
border-radius: 34px;
border: 1px solid #fff;
text-align: center;
line-height: 34px;
transform: translateY(-50%);
font-size: 28px;
}
.head-ico {
... ...
... ... @@ -2,7 +2,7 @@
* @Author: Targaryen
* @Date: 2017-03-23 11:02:31
* @Last Modified by: Targaryen
* @Last Modified time: 2017-08-02 11:11:07
* @Last Modified time: 2017-08-11 11:40:02
*/
/* 红人店铺数据处理 */
... ... @@ -279,7 +279,7 @@ const floor = (decoratorsData) => {
*/
const shopIntro = (params) => {
if (params) {
params.shop_intro_link = helpers.urlFormat('/product/index/intro', {shop_id: params.shops_id});
params.shop_intro_link = helpers.urlFormat('/product/index/intro', { shop_id: params.shops_id });
}
return params;
... ... @@ -380,7 +380,8 @@ const getShopBanner = (shopDecoratorList) => {
// 店铺banner
if (floorData.shopTopBannerApp) {
banner = resData[0].shopSrc;
banner = resData[0].shopSrc +
'?imageMogr2/auto-orient/strip/thumbnail/x{height}/crop/{width}x{height}';
}
});
... ...
This diff could not be displayed because it is too large.