Authored by 陈峰

Merge branch 'master' of http://git.yoho.cn/fe/yoho-community-web

... ... @@ -228,14 +228,11 @@ const yoho = {
}
});
}
if (window.parent && window.parent !== window) {
window.parent.blkDocument.goNewPage({url});
} else {
$appLink.href = url;
$appLink.href = url;
$appLink.click();
if (this.isiOS) {
$appLink.click();
if (this.isiOS) {
$appLink.click();
}
}
} else {
if (args.url) {
... ...
... ... @@ -153,6 +153,12 @@ export default {
this.$nextTick(() => {
this.$refs.actionSheet.show(params).then(() => {
toast.hide();
}).catch(() => {
this.$createToast && this.$createToast({
txt: '服务器开小差了',
type: 'warn',
time: 1000
}).show();
});
});
}
... ...
<template>
<div class="article-item-header">
<div class="avatar">
<router-link class="avatar" :to="`/author/${data.authorType}/${data.authorUid}`">
<WidgetAvatar class="widget-avatar" :src="data.avatar" :width="70" :height="70"></WidgetAvatar>
<span class="name">{{data.name}}</span>
</div>
</router-link>
<div class="opts">
<WidgetFollow v-bind="data"></WidgetFollow>
</div>
... ... @@ -37,7 +37,7 @@ export default {
align-items: center;
padding: 16px 30px;
width: 400px;
height: 100px;
height: 44PX;
overflow: hidden;
background-color: #fff;
... ...
... ... @@ -11,13 +11,13 @@
<template v-if="item.bigImage">
<div class="big-img-block">
<ImageFormat :lazy="false" :src="item.bigImage" width="640" height="640" ></ImageFormat>
<ImageFormat :src="item.bigImage" width="640" height="640" ></ImageFormat>
</div>
</template>
<template v-if="item.smallImage">
<div class="small-img-block clearfix">
<ImageFormat :lazy="false" :src="i.src" width="315" height="420" v-for="(i,index) in item.smallImage" :key="index"></ImageFormat>
<ImageFormat :src="i.src" width="315" height="420" v-for="(i,index) in item.smallImage" :key="index"></ImageFormat>
</div>
</template>
... ... @@ -48,7 +48,7 @@
import RecommendProductList from './recommend-product-list';
import Recommend from './recommend';
import Author from './author';
import Author from './article-author';
import ZanBar from './zan-bar';
import TagBar from './tag-bar';
import { createNamespacedHelpers } from 'vuex';
... ...
<template>
<div class="article-footer-wrapper">
<div class="tool-bar">
<WidgetIconBtn class="item" type="fav" :text="praiseCount" :option="optionPraise" @click="onZanClick"></WidgetIconBtn>
<WidgetIconBtn class="item" type="star" :text="favoriteCount" :option="optionFav" @click="onFavClick"></WidgetIconBtn>
<WidgetIconBtn class="item" type="fav" :text="praiseCount" :articleId="articleId" :option="optionPraise"></WidgetIconBtn>
<WidgetIconBtn class="item" type="star" :text="favoriteCount" :articleId="articleId" :option="optionFav" ></WidgetIconBtn>
<WidgetIconBtn class="item" type="msg" :text="commentCount" :option="optionComment" @click="onComment"></WidgetIconBtn>
</div>
<div class="close ml20" @click="onClose">收起</div>
... ... @@ -13,15 +13,13 @@
export default {
name: 'ArticleFooter',
props: ['favoriteCount', 'praiseCount', 'commentCount', 'hasFavor', 'hasPraise'],
props: ['favoriteCount', 'praiseCount', 'commentCount', 'hasFavor', 'hasPraise', 'articleId'],
data() {
return {
optionPraise: {
emitName: 'click',
selected: this.hasPraise === 'Y'
},
optionFav: {
emitName: 'click',
selected: this.hasFavor === 'Y'
},
optionComment: {
... ... @@ -33,12 +31,6 @@ export default {
computed: {
},
methods: {
onZanClick() {
},
onFavClick() {
},
onComment() {
this.$emit('on-comment-click');
},
... ...
<template>
<div class="product-list">
<RecommendProductItem class="item" v-for="(i, index) in list" v-bind="i" :key="index"></RecommendProductItem>
<RecommendProductItem class="item" v-for="(i, index) in list" v-bind="i" :key="index" @click.native="onClick(i.href)"></RecommendProductItem>
</div>
</template>
... ... @@ -13,6 +13,12 @@ export default {
props: ['list'],
components: {
RecommendProductItem
},
methods: {
onClick(url) {
console.log(url);
this.$yoho.goNewPage({url});
}
}
};
</script>
... ...
<template>
<div>
<WidgetTopic v-for="(i, index) in list" :topic="i.name" :key="index" @click="onClick"></WidgetTopic>
<WidgetTopic v-for="(i, index) in list" :topic="i.name" :key="index"></WidgetTopic>
</div>
</template>
... ... @@ -9,13 +9,9 @@ export default {
name: 'TagBar',
props: ['list'],
methods: {
onClick() {
console.log('click');
}
}
};
</script>
<style :lang="scss" scoped>
</style>
... ...
... ... @@ -15,6 +15,10 @@ export default {
props: ['praiseHeadIco', 'praiseCount', 'publish_time'],
filters: {
formatTime(str) {
if (!str) {
return '';
}
const now = dayjs();
const pubTime = dayjs(str * 1000);
... ...
import * as Types from './types';
import { get } from 'lodash';
import { get, concat } from 'lodash';
import * as guangProcess from './guangProcess';
export default {
async fetchArticleList({ commit }, { articleId, limit = 5, page = 1 }) {
commit(Types.FETCH_ARTICLE_DETAIL_REQUEST);
... ... @@ -104,56 +103,59 @@ export default {
if (!data || data.code !== 200) {
result.code = 400;
return result;
return Promise.reject(result);
}
let article = result.getArticle = data && data.data || {};
let article = (result.getArticle = (data && data.data) || {});
let promises = [
this.$api.get('/api/guang/article/author', { author_id: article.author_id }),
this.$api.get('/api/guang/article/content', { article_id }),
this.$api.get('/api/guang/article/zan', { articleId: grass_id })
];
const [author, content, zan] = await Promise.all(promises);
if (author && author.code === 200 && author.data) {
result.getAuthor = author.data;
result.getAuthor.authorUid = result.getAuthor.author_id;
result.getAuthor.fellow = get(zan, 'data.hasAttention', false);
}
const [content, zan] = await Promise.all(promises);
if (content && content.code === 200 && content.data) {
const recommendProducts = content.data.filter(i => 'recommend_products' in i).reduce((t, c) => {
t = t.concat(c.recommend_products.data);
return t;
}, []);
result.getRecommendProducts = recommendProducts;
const processContents = guangProcess.processArticleDetail(content.data);
// 插入商品
const [goodsList, favsList] = await Promise.all([this.$api.get('/api/guang/article/queryGoods', {
query: processContents.allgoods.join(','),
order: 's_t_desc',
limit: processContents.allgoods.length || 1
}), this.$api.get('/api/favorite/batchCheckIsFavorite', {
favIds: processContents.allgoods.join(','),
type: 'product'
})]).then(([res1, res2]) => {
const [goodsList, favsList] = await Promise.all([
this.$api.get('/api/guang/article/queryGoods', {
query: processContents.allgoods.join(','),
order: 's_t_desc',
limit: processContents.allgoods.length || 1
}),
this.$api.get('/api/favorite/batchCheckIsFavorite', {
favIds: processContents.allgoods.join(','),
type: 'product'
})
]).then(([res1, res2]) => {
return [get(res1, 'data.product_list', []), get(res2, 'data', [])];
});
result.getArticleContent = guangProcess.pushGoodsInfo(processContents.finalDetail, goodsList, favsList);
result.getArticleContent = guangProcess.pushGoodsInfo(
processContents.finalDetail,
goodsList,
favsList
);
result.getRecommendProducts = processContents.recommends;
}
if (zan && zan.code === 200 && zan.data) {
result.footer = zan.data;
result.footer.articleId = grass_id;
result.zanBar.praiseHeadIco = result.footer.praiseHeadIco;
result.zanBar.praiseCount = result.footer.praiseCount;
result.zanBar.publish_time = article.publish_time;
// author
result.getAuthor.authorUid = zan.data.authorUid;
result.getAuthor.name = zan.data.authorName;
result.getAuthor.avatar = zan.data.authorHeadIco;
result.getAuthor.authorType = zan.data.authorType;
result.getAuthor.follow = get(zan, 'data.hasAttention', false);
}
if (article && article.tags) {
... ... @@ -161,27 +163,5 @@ export default {
}
commit(Types.FETCH_GUANG_SUCCESS, result);
},
async setFav({ commit }, { status, articleId }) {
const FAV = {
0: 'N', // 取消
1: 'Y' // 收藏
};
const result = await this.$api.get('/api/guang/article/setFav', { isAdd: FAV[status], articleId });
commit(Types.FETCH_FAV_SUCCESS, result);
},
async setZan({ commit }, { status, articleId }) {
const ZAN = {
0: 1, // 取消
1: 0 // 收藏
};
const result = await this.$api.get('/api/guang/article/setZan', { status: ZAN[status], articleId });
commit(Types.FETCH_ZAN_SUCCESS, result);
},
}
};
... ...
import { get, forEach, keyBy, uniq, remove, cloneDeep } from 'lodash';
import { get, forEach, keyBy, uniq, remove, cloneDeep, concat } from 'lodash';
let domainList = {
'01': [
... ... @@ -67,9 +67,22 @@ function productNameProcess(nameStr) {
return nameStr.match(/\w/ig).join('');
}
function productUrl(skn) {
const url = '//m.yohobuy.com/product/' + skn + '.html';
return `http:${url}?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":"${skn}"}}`;
}
function productGlobalUrl(skn) {
const url = '//m.yohobuy.com/product/global/' + skn + '.html';
return `http:${url}?openby:yohobuy={"action":"go.globalpurchase","params":{"skn":"${skn}"}}`;
}
export function processArticleDetail(articleContent) {
let finalDetail = [];
let allgoods = [];
let recommends = [];
for (let value of articleContent) {
// 文本
... ... @@ -90,7 +103,7 @@ export function processArticleDetail(articleContent) {
// 普通商品
if (tagList.length > 0) {
forEach(tagList, (tag, tagIndex) => {
tagList[tagIndex].href = '//m.yohobuy.com/product/' + tag.product_skn + '.html';
tagList[tagIndex].href = productUrl(tag.product_skn);
});
}
... ... @@ -98,8 +111,7 @@ export function processArticleDetail(articleContent) {
if (tagListGlobal.length > 0) {
forEach(tagListGlobal, tagGlobal => {
tagList.push(Object.assign(tagGlobal, {
href: '//m.yohobuy.com/product/global/' + tagGlobal.product_skn + '.html',
noCart: true
href: productGlobalUrl(tagGlobal.product_skn),
}));
});
}
... ... @@ -108,8 +120,7 @@ export function processArticleDetail(articleContent) {
if (tagListLimit.length > 0) {
forEach(tagListLimit, tagLimit => {
tagList.push(Object.assign(tagLimit, {
href: '//m.yohobuy.com/product/' + tagLimit.product_skn + '.html',
noCart: true
href: productUrl(tagLimit.product_skn)
}));
});
}
... ... @@ -186,11 +197,36 @@ export function processArticleDetail(articleContent) {
}
});
}
// 推荐商品
if (get(value, 'recommend_products', false)) {
let recommendProducts = get(value, 'recommend_products.data', []);
let recommendProductsGlobal = get(value, 'recommend_products.dataGlobal', []);
let recommendProductsLimit = get(value, 'recommend_products.dataLimit', []);
recommendProducts.forEach(p => {
p.sales_price = parseFloat(p.sales_price).toFixed(2);
p.href = `http://m.yohobuy.com/product/${ p.product_skn }.html?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":"${ p.product_skn}"}}`;
});
recommendProductsGlobal.forEach(p => {
p.sales_price = parseFloat(p.sales_price).toFixed(2);
p.href = `http://m.yohobuy.com/product/${ p.product_skn }.html?openby:yohobuy={"action":"go.globalpurchase","params":{"skn":"${ p.product_skn}"}}`;
});
recommendProductsGlobal.forEach(p => {
p.sales_price = parseFloat(p.sales_price).toFixed(2);
p.href = `http://m.yohobuy.com/product/${ p.product_skn }.html?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":"${ p.product_skn}"}}`;
});
recommends = concat(recommendProducts, recommendProductsLimit, recommendProductsGlobal);
}
}
return {
finalDetail,
allgoods
allgoods,
recommends
};
}
... ... @@ -261,9 +297,6 @@ function processProductList(list, favsList) {
product.favorite = fav || false;
product.url = product.is_global === 'Y' ? `/product/global/${product.product_skn}.html` :
`/product/${product.product_skn}.html`; // 商品url改版 // eslint-disable-line
/**
* 全球购商品标记
*/
... ... @@ -278,12 +311,10 @@ function processProductList(list, favsList) {
product.isLimitbuy = true;
}
// APP访问需要加附加的参数
// 备注:如果以后APP的接口太多,可以把这边参数提取出来,变成一个公共的方法来生成,便于以后管理维护
if (product.is_global === 'Y') {
product.url = `http:${product.url}?openby:yohobuy={"action":"go.globalpurchase","params":{"skn":"${product.product_skn}"}}`; // eslint-disable-line
product.url = productGlobalUrl(product.product_skn);
} else {
product.url = `http:${product.url}?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":"${product.product_skn}"}}`; // eslint-disable-line
product.url = productUrl(product.product_skn);
}
pruductList.push(product);
... ...
export default {
async followUser(actions, {followUid, status}) {
const result = await this.$api.get('/api/grass/updateAttention', {
const result = await this.$api.post('/api/grass/updateAttention', {
followUid,
status,
attentionType: 1
... ... @@ -9,7 +9,7 @@ export default {
return result;
},
async followTopic(actions, {topicId, status}) {
const result = await this.$api.get('/api/grass/updateAttention', {
const result = await this.$api.post('/api/grass/updateAttention', {
topicId,
status,
attentionType: 0
... ... @@ -18,7 +18,7 @@ export default {
return result;
},
async followArticle(actions, {articleId, status}) {
const result = await this.$api.get('/api/grass/updateFavorite', {
const result = await this.$api.post('/api/grass/updateFavorite', {
articleId,
isAdd: status ? 'Y' : 'N'
});
... ...