Authored by shuaiguo

Merge branch 'master' into develop

... ... @@ -107,6 +107,7 @@ export const createApi = (context, store) => {
.then(resolve({ context, store, reqParams }))
.catch(err => {
console.log('----create----api--server--get---', err);
return err;
});
},
post(url, reqParams = {}) {
... ... @@ -119,6 +120,7 @@ export const createApi = (context, store) => {
.then(resolve({ context, store, reqParams }))
.catch(err => {
console.log('----create----api--server--post---', err);
return err;
});
},
};
... ...
... ... @@ -48,7 +48,7 @@ export default {
loadingOptions() {
return {
hide: !this.totalPage,
noMore: this.page > this.totalPage
noMore: this.page >= this.totalPage
};
}
},
... ... @@ -83,7 +83,7 @@ export default {
let { page, pagetotal } = res.data || {};
this.page = page || 0;
this.pageTotal = pagetotal || 0;
this.totalPage = pagetotal || 0;
}
});
}
... ...
... ... @@ -72,11 +72,11 @@ export default {
activated() {
let params = {...this.$route.query};
if (this.yoho.direction === 'forword') {
// if (this.yoho.direction === 'forword') {
Object.assign(this.$data, this.$options.data());
!params.order && (params.order = 'sale_desc');
this.fetchData(params);
}
// }
},
computed: {
... ...
... ... @@ -133,6 +133,10 @@ export default {
}
},
deactivated() {
this.$refs.filtrate.hide();
},
methods: {
...mapActions(['fetchProductList', 'getDirection']),
... ...
... ... @@ -547,6 +547,17 @@ export default {
return;
}
// 商品是否指定出售
const limitInfo = get(this.productDetail, 'limitInfo', {});
if(limitInfo.isLimit === '1') {
this.$createDialog({
type: "alert",
title: "商品出售限制",
content: limitInfo.tip || '',
confirmBtn: { text: "我知道了" }
}).show();
return;
}
/**
* 数据埋点
* 商品详情页点击出售/购买/求购按钮
... ...
... ... @@ -8,7 +8,7 @@ export default {
return state.products[productId];
},
async fetchProductInfo({ commit, state }, { productId }) {
const queryTasks = ['', '/resource', '/activity', '/recommend'].map(path => {
const queryTasks = ['', '/resource', '/activity', '/recommend', '/limit/info'].map(path => {
let params = { product_id: productId };
if (path === '/resource') {
... ... @@ -25,14 +25,16 @@ export default {
});
});
let [detail, resource, activity, recommend] = await Promise.all(queryTasks);
let [detail, resource, activity, recommend, limitInfo] = await Promise.all(queryTasks);
resource = get(resource, '[0].data[0]', {});
commit(Types.UPDATE_PRODUCT_DETAIL, Object.assign(detail.product_info, {
const {product_info = {}} = detail || {};
commit(Types.UPDATE_PRODUCT_DETAIL, Object.assign(product_info, {
resource,
activity: activity || [],
recommend: recommend && recommend.product_list || [],
limitInfo: limitInfo || {}
}));
},
async fetchRecommendProduct({ commit }, { productId }) {
... ...
... ... @@ -124,4 +124,14 @@ module.exports = {
skup: {type: Number},
},
},
// 商品限制信息查询
'/api/ufo/product/limit/info': {
ufo: true,
auth: true,
api: 'ufo.product.limitInfo',
params: {
product_id: {type: Number}, // 商品id
},
},
};
... ...
... ... @@ -95,6 +95,7 @@ exports.createApp = async(app) => {
const errorMiddleware = require('./doraemon/middleware/error-handler');
const ssrApiMiddleware = require('./doraemon/middleware/ssr-api');
const ssrRouteMiddleware = require('./doraemon/middleware/ssr');
const reportYasMiddleware = require('./doraemon/middleware/report-yas');
// YOHO 前置中间件
app.use(setYohoDataMiddleware);
... ... @@ -107,12 +108,12 @@ exports.createApp = async(app) => {
let udid = uuid.v4();
if (req.yoho.isApp && req.query.udid) {
udid = req.query.udid;
udid = req.query.udid;
}
res.cookie('udid', udid, {
domain: 'yohobuy.com',
expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)
domain: 'yohobuy.com',
expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)
});
req.cookies.udid = udid;
}
... ... @@ -155,7 +156,7 @@ exports.createApp = async(app) => {
app.use('/xianyu', ssrApiMiddleware);
app.use(ssrRouteMiddleware.routers);
app.use([reportYasMiddleware, ssrRouteMiddleware.routers]);
app.all('*', ssrRouteMiddleware.ssrRender); // 404
... ...
const axios = require('axios');
const _ = require('lodash');
const logger = global.yoho.logger;
module.exports = (req, res, next) => {
if (req.path === '/xianyu/index/channel') {
try {
const json = { appop: 'XY_UFO_MAIN_START_SERVICE', param: {} };
const xianyu = {
isiOS: /\(i[^;]+;( U;)? CPU.+Mac OS X/i.test(req.get('User-Agent') || ''),
isAndroid: /Android/i.test(req.get('User-Agent') || ''),
};
const appBaseLogs = {
status: [
{
ca: '',
lo: '',
cy: 'CN',
av: '',
udid: req.cookies.udid,
ln: '',
ab: '',
sid: '',
net: '',
la: ''
}
],
device: {
res: '',
ifa: '',
mac: '',
osv: '',
ifv: '',
ps: '',
os: xianyu.isiOS ? 'ios' : 'android',
ak: 'yoho_xianyu_' + (xianyu.isiOS ? 'ios' : 'android'),
sv: '',
ch: '',
dm: '',
tdid: '',
afp: '',
udid: req.cookies.udid
},
events: [{
sid: '',
uid: req.user.uid
}]
};
let param = json.param;
const srcId = req.cookies.SRC_ID || '';
param.SRC_ID = srcId;
let ev = appBaseLogs.events[0];
let event = _.merge(ev, {
ts: (new Date()).getTime().toString(),
indx: 1,
op: json.appop,
param: param
});
let logs = _.merge(appBaseLogs, {
events: [event]
});
const data = '_mlogs=' + encodeURIComponent(JSON.stringify(logs));
axios.post('https://analytics.m.yohobuy.com/yas_mobile', data, {
headers: {
'content-type': 'application/x-www-form-urlencoded'
}
});
} catch (e) {
logger.error(e);
}
}
next();
};
... ...
{
"name": "xianyu-ufo-app-web",
"version": "0.0.4",
"version": "1.0.1",
"private": true,
"description": "Xianyu Project With Express",
"repository": {
... ...