Authored by 陈峰

commit

@@ -15,12 +15,16 @@ export default { @@ -15,12 +15,16 @@ export default {
15 user: { 15 user: {
16 type: String, 16 type: String,
17 default: '' 17 default: ''
18 - } 18 + },
  19 + share: Boolean
19 }, 20 },
20 methods: { 21 methods: {
21 ...mapActions(['postComment']), 22 ...mapActions(['postComment']),
22 ...articleMapActions(['fetchArticleUpdate']), 23 ...articleMapActions(['fetchArticleUpdate']),
23 async openComentInput() { 24 async openComentInput() {
  25 + if (this.share) {
  26 + return this.$links.toDownloadApp();
  27 + }
24 const user = await this.$sdk.getUser(); 28 const user = await this.$sdk.getUser();
25 29
26 if (user && user.uid) { 30 if (user && user.uid) {
@@ -26,7 +26,8 @@ export default { @@ -26,7 +26,8 @@ export default {
26 props: { 26 props: {
27 single: Boolean, 27 single: Boolean,
28 lazy: Boolean, 28 lazy: Boolean,
29 - product: Object 29 + product: Object,
  30 + share: Boolean
30 }, 31 },
31 data() { 32 data() {
32 return { 33 return {
@@ -50,6 +51,9 @@ export default { @@ -50,6 +51,9 @@ export default {
50 methods: { 51 methods: {
51 ...mapActions(['postProductFav']), 52 ...mapActions(['postProductFav']),
52 async onFav() { 53 async onFav() {
  54 + if (this.share) {
  55 + return this.$links.toDownloadApp();
  56 + }
53 if (this.posting) { 57 if (this.posting) {
54 return; 58 return;
55 } 59 }
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 <div class="product-group"> 2 <div class="product-group">
3 <ProductGroupItem 3 <ProductGroupItem
4 v-for="(product, inx) in data" 4 v-for="(product, inx) in data"
  5 + :share="share"
5 :single="single" 6 :single="single"
6 :product="product" 7 :product="product"
7 :lazy="lazy" 8 :lazy="lazy"
@@ -25,7 +26,8 @@ export default { @@ -25,7 +26,8 @@ export default {
25 lazy: { 26 lazy: {
26 type: Boolean, 27 type: Boolean,
27 default: true 28 default: true
28 - } 29 + },
  30 + share: Boolean
29 }, 31 },
30 computed: { 32 computed: {
31 single() { 33 single() {
1 <template> 1 <template>
2 - <WidgetIconBtn type="msg" :text="num" :option="selfOption"></WidgetIconBtn> 2 + <WidgetIconBtn type="msg" :share="share" :text="num" :option="selfOption"></WidgetIconBtn>
3 </template> 3 </template>
4 4
5 <script> 5 <script>
@@ -7,7 +7,8 @@ export default { @@ -7,7 +7,8 @@ export default {
7 name: 'WidgetComment', 7 name: 'WidgetComment',
8 props: { 8 props: {
9 num: [String, Number], 9 num: [String, Number],
10 - option: Object 10 + option: Object,
  11 + share: Boolean
11 }, 12 },
12 computed: { 13 computed: {
13 selfOption() { 14 selfOption() {
1 <template> 1 <template>
2 - <WidgetIconBtn type="fav" :text="num" :article-id="articleId" :comment-id="commentId" :option="option"></WidgetIconBtn> 2 + <WidgetIconBtn type="fav" :share="share" :text="num" :article-id="articleId" :comment-id="commentId" :option="option"></WidgetIconBtn>
3 </template> 3 </template>
4 4
5 <script> 5 <script>
@@ -9,7 +9,8 @@ export default { @@ -9,7 +9,8 @@ export default {
9 num: [String, Number], 9 num: [String, Number],
10 articleId: Number, 10 articleId: Number,
11 commentId: Number, 11 commentId: Number,
12 - option: Object 12 + option: Object,
  13 + share: Boolean
13 } 14 }
14 }; 15 };
15 </script> 16 </script>
@@ -16,7 +16,8 @@ export default { @@ -16,7 +16,8 @@ export default {
16 authorType: { 16 authorType: {
17 type: [Number, String], 17 type: [Number, String],
18 default: 1 18 default: 1
19 - } 19 + },
  20 + share: Boolean
20 }, 21 },
21 data() { 22 data() {
22 return { 23 return {
@@ -43,6 +44,9 @@ export default { @@ -43,6 +44,9 @@ export default {
43 methods: { 44 methods: {
44 ...mapActions(['followUser']), 45 ...mapActions(['followUser']),
45 async onFollow() { 46 async onFollow() {
  47 + if (this.share) {
  48 + return this.$links.toDownloadApp();
  49 + }
46 if (this.loading) { 50 if (this.loading) {
47 return; 51 return;
48 } 52 }
@@ -65,7 +65,8 @@ export default { @@ -65,7 +65,8 @@ export default {
65 default() { 65 default() {
66 return defaultOption; 66 return defaultOption;
67 } 67 }
68 - } 68 + },
  69 + share: Boolean
69 }, 70 },
70 data() { 71 data() {
71 return { 72 return {
@@ -189,6 +190,9 @@ export default { @@ -189,6 +190,9 @@ export default {
189 } 190 }
190 }, 191 },
191 onClick(evt) { 192 onClick(evt) {
  193 + if (this.share) {
  194 + return this.$links.toDownloadApp();
  195 + }
192 if (this.syncing) { 196 if (this.syncing) {
193 return; 197 return;
194 } 198 }
1 <template> 1 <template>
2 - <WidgetIconBtn type="star" :text="num" :article-id="articleId" :comment-id="commentId" :option="option"></WidgetIconBtn> 2 + <WidgetIconBtn type="star" :share="share" :text="num" :article-id="articleId" :comment-id="commentId" :option="option"></WidgetIconBtn>
3 </template> 3 </template>
4 4
5 <script> 5 <script>
@@ -9,7 +9,8 @@ export default { @@ -9,7 +9,8 @@ export default {
9 num: [String, Number], 9 num: [String, Number],
10 articleId: Number, 10 articleId: Number,
11 commentId: Number, 11 commentId: Number,
12 - option: Object 12 + option: Object,
  13 + share: Boolean
13 } 14 }
14 }; 15 };
15 </script> 16 </script>
@@ -10,6 +10,7 @@ import {get} from 'lodash'; @@ -10,6 +10,7 @@ import {get} from 'lodash';
10 import Lazy from 'vue-lazyload'; 10 import Lazy from 'vue-lazyload';
11 import yoho from 'common/yoho'; 11 import yoho from 'common/yoho';
12 import sdk from 'common/sdk'; 12 import sdk from 'common/sdk';
  13 +import links from 'utils/links';
13 import InitClient from 'utils/init-client'; 14 import InitClient from 'utils/init-client';
14 import 'statics/scss/common.scss'; 15 import 'statics/scss/common.scss';
15 import 'statics/scss/grass-prompt.scss'; 16 import 'statics/scss/grass-prompt.scss';
@@ -30,6 +31,7 @@ window._router = get(store, 'state.yoho.context.route'); @@ -30,6 +31,7 @@ window._router = get(store, 'state.yoho.context.route');
30 31
31 Vue.prop('yoho', yoho); 32 Vue.prop('yoho', yoho);
32 Vue.prop('sdk', sdk); 33 Vue.prop('sdk', sdk);
  34 +Vue.prop('links', links);
33 Vue.prop('auth', function() { 35 Vue.prop('auth', function() {
34 if (!get(this.$store, '$context.isLogin')) { 36 if (!get(this.$store, '$context.isLogin')) {
35 this.$sdk && this.$sdk.goLogin && this.$sdk.goLogin(); 37 this.$sdk && this.$sdk.goLogin && this.$sdk.goLogin();
  1 +<template>
  2 + <Article
  3 + ref="article"
  4 + type="article"
  5 + share
  6 + :on-fetch="onFetch">
  7 + </Article>
  8 +</template>
  9 +
  10 +<script>
  11 +import {get} from 'lodash';
  12 +import Article from './components/article/article';
  13 +import ArticleItem from './components/article/article-item';
  14 +import {createNamespacedHelpers} from 'vuex';
  15 +const {mapActions} = createNamespacedHelpers('article');
  16 +
  17 +export default {
  18 + name: 'ArticleSharePage',
  19 + data() {
  20 + return {
  21 + page: 1,
  22 + id: 0,
  23 + };
  24 + },
  25 + created() {
  26 + this.id = +this.$route.params.id;
  27 + },
  28 + activated() {
  29 + if (+this.$route.params.id !== this.id) {
  30 + this.id = +this.$route.params.id;
  31 + this.init();
  32 + }
  33 + },
  34 + methods: {
  35 + ...mapActions(['fetchArticleList']),
  36 + init() {
  37 + this.page = 1;
  38 + this.$refs.article.init();
  39 + },
  40 + async onFetch() {
  41 + const articleId = parseInt(this.id, 10);
  42 +
  43 + if (!articleId) {
  44 + return;
  45 + }
  46 + const result = await this.fetchArticleList({
  47 + articleId,
  48 + page: this.page,
  49 + authorUid: this.authorUid,
  50 + authorType: this.authorType,
  51 + type: this.type
  52 + });
  53 +
  54 + if (result.code === 200) {
  55 + if (get(result, 'data.detailList', []).length) {
  56 + this.page++;
  57 + return Promise.resolve(result.data.detailList);
  58 + }
  59 + return Promise.resolve(false);
  60 + } else {
  61 + this.$createToast && this.$createToast({
  62 + txt: result.message || '服务器开小差了',
  63 + type: 'warn',
  64 + time: 1000
  65 + }).show();
  66 + }
  67 + }
  68 + },
  69 + components: {
  70 + Article,
  71 + ArticleItem
  72 + }
  73 +};
  74 +</script>
  75 +
  76 +<style lang="scss" scoped>
  77 +.article-page {
  78 + background-color: #f0f0f0;
  79 +}
  80 +</style>
1 <template> 1 <template>
2 <div class="article-item-comment"> 2 <div class="article-item-comment">
3 <CommentPlaceholder 3 <CommentPlaceholder
  4 + :share="share"
4 tag="p" 5 tag="p"
5 class="comment-item" 6 class="comment-item"
6 v-for="(comment, inx) in data.comments" 7 v-for="(comment, inx) in data.comments"
@@ -14,6 +15,7 @@ @@ -14,6 +15,7 @@
14 </CommentPlaceholder> 15 </CommentPlaceholder>
15 <div class="comment"> 16 <div class="comment">
16 <CommentPlaceholder 17 <CommentPlaceholder
  18 + :share="share"
17 class="comment-input hover-opacity" 19 class="comment-input hover-opacity"
18 :dest-id="data.articleId" 20 :dest-id="data.articleId"
19 :add-type="0" 21 :add-type="0"
@@ -42,7 +44,8 @@ export default { @@ -42,7 +44,8 @@ export default {
42 return {}; 44 return {};
43 } 45 }
44 }, 46 },
45 - type: String 47 + type: String,
  48 + share: Boolean
46 }, 49 },
47 computed: { 50 computed: {
48 ...mapState(['articleStates']), 51 ...mapState(['articleStates']),
@@ -53,6 +56,9 @@ export default { @@ -53,6 +56,9 @@ export default {
53 methods: { 56 methods: {
54 ...mapMutations(['ASYNC_ARTICLE_COMMENT']), 57 ...mapMutations(['ASYNC_ARTICLE_COMMENT']),
55 onShowComment() { 58 onShowComment() {
  59 + if (this.share) {
  60 + return this.$links.toDownloadApp();
  61 + }
56 if (this.articleState.commentCount) { 62 if (this.articleState.commentCount) {
57 this.$emit('on-show-comment'); 63 this.$emit('on-show-comment');
58 } 64 }
1 <template> 1 <template>
2 <div class="article-item-header"> 2 <div class="article-item-header">
3 - <router-link class="avatar" :to="`/grass/author/${data.authorType}/${data.authorUid}`">  
4 - <WidgetAvatar :lazy="lazy" class="widget-avatar" :src="data.authorHeadIco" :width="70" :height="70"></WidgetAvatar> 3 + <div class="avatar" @click="toUserPage">
  4 + <WidgetAvatar :share="share" :lazy="lazy" class="widget-avatar" :src="data.authorHeadIco" :width="70" :height="70"></WidgetAvatar>
5 <span class="user-name">{{data.authorName}}</span> 5 <span class="user-name">{{data.authorName}}</span>
6 - </router-link> 6 + </div>
7 <div class="opts"> 7 <div class="opts">
8 - <WidgetFollow :author-uid="data.authorUid" :authorType="data.authorType" :follow="data.hasAttention === 'Y'" @on-follow="onFollow"></WidgetFollow> 8 + <WidgetFollow :share="share" :author-uid="data.authorUid" :authorType="data.authorType" :follow="data.hasAttention === 'Y'" @on-follow="onFollow"></WidgetFollow>
9 <i class="iconfont icon-more1" @click="onMore"></i> 9 <i class="iconfont icon-more1" @click="onMore"></i>
10 </div> 10 </div>
11 </div> 11 </div>
@@ -28,7 +28,8 @@ export default { @@ -28,7 +28,8 @@ export default {
28 type: Boolean, 28 type: Boolean,
29 default: true 29 default: true
30 }, 30 },
31 - type: String 31 + type: String,
  32 + share: Boolean
32 }, 33 },
33 methods: { 34 methods: {
34 ...mapMutations(['CHANGE_AUTHOR_FOLLOW']), 35 ...mapMutations(['CHANGE_AUTHOR_FOLLOW']),
@@ -46,6 +47,18 @@ export default { @@ -46,6 +47,18 @@ export default {
46 } 47 }
47 }).show(); 48 }).show();
48 }, 49 },
  50 + toUserPage() {
  51 + if (this.share) {
  52 + return this.$links.toDownloadApp();
  53 + }
  54 + this.$router.push({
  55 + name: 'author',
  56 + params: {
  57 + type: this.data.authorType,
  58 + id: this.data.authorUid
  59 + }
  60 + });
  61 + },
49 onFollow(follow) { 62 onFollow(follow) {
50 this.CHANGE_AUTHOR_FOLLOW({authorUid: this.data.authorUid, follow, type: this.type}); 63 this.CHANGE_AUTHOR_FOLLOW({authorUid: this.data.authorUid, follow, type: this.type});
51 this.$emit('on-follow', follow); 64 this.$emit('on-follow', follow);
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 </div> 8 </div>
9 <div class="topics"> 9 <div class="topics">
10 <WidgetTopic 10 <WidgetTopic
  11 + :share="share"
11 :topic="label.labelName" 12 :topic="label.labelName"
12 @click.native="onTopic(label)" 13 @click.native="onTopic(label)"
13 v-for="label in data.labelList" 14 v-for="label in data.labelList"
@@ -16,12 +17,12 @@ @@ -16,12 +17,12 @@
16 </div> 17 </div>
17 <div class="widgets"> 18 <div class="widgets">
18 <div class="share"> 19 <div class="share">
19 - <WidgetShare @click.native="onShare"></WidgetShare> 20 + <WidgetShare :share="share" @click.native="onShare"></WidgetShare>
20 </div> 21 </div>
21 <div class="opts"> 22 <div class="opts">
22 - <WidgetFav :num="articleState.praiseCount" :article-id="data.articleId" :option="praiseOption"></WidgetFav>  
23 - <WidgetLike :num="articleState.favoriteCount" :article-id="data.articleId" :option="favoriteOption"></WidgetLike>  
24 - <WidgetComment :num="articleState.commentCount" @click.native="onShowComment"></WidgetComment> 23 + <WidgetFav :share="share" :num="articleState.praiseCount" :article-id="data.articleId" :option="praiseOption"></WidgetFav>
  24 + <WidgetLike :share="share" :num="articleState.favoriteCount" :article-id="data.articleId" :option="favoriteOption"></WidgetLike>
  25 + <WidgetComment :share="share" :num="articleState.commentCount" @click.native="onShowComment"></WidgetComment>
25 </div> 26 </div>
26 </div> 27 </div>
27 </div> 28 </div>
@@ -40,7 +41,8 @@ export default { @@ -40,7 +41,8 @@ export default {
40 return {}; 41 return {};
41 } 42 }
42 }, 43 },
43 - type: String 44 + type: String,
  45 + share: Boolean
44 }, 46 },
45 data() { 47 data() {
46 return { 48 return {
@@ -122,6 +124,9 @@ export default { @@ -122,6 +124,9 @@ export default {
122 methods: { 124 methods: {
123 ...mapMutations(['CHANGE_ARTICLE_LIST_INTRO_HEIGHT', 'CHANGE_ARTICLE_LIST_INTRO']), 125 ...mapMutations(['CHANGE_ARTICLE_LIST_INTRO_HEIGHT', 'CHANGE_ARTICLE_LIST_INTRO']),
124 onTopic({labelId, labelName}) { 126 onTopic({labelId, labelName}) {
  127 + if (this.share) {
  128 + return this.$links.toDownloadApp();
  129 + }
125 this.$router.push({ 130 this.$router.push({
126 name: 'topic', 131 name: 'topic',
127 params: { 132 params: {
@@ -132,9 +137,9 @@ export default { @@ -132,9 +137,9 @@ export default {
132 }, 137 },
133 onShare() { 138 onShare() {
134 this.$yoho.share({ 139 this.$yoho.share({
135 - title: '逛资讯',  
136 - imgUrl: this.data.imageUrl,  
137 - link: `http://yoho-community-web.test3.ingress.dev.yohocorp.com/article/${this.data.articleId}?isShare=1`, 140 + title: '逛',
  141 + imgUrl: this.data.shareImage,
  142 + link: `http://yoho-community-web.test3.ingress.dev.yohocorp.com/grass/article/share/${this.data.articleId}`,
138 desc: this.data.intro, 143 desc: this.data.intro,
139 hideType: ['7', '8', '9'] 144 hideType: ['7', '8', '9']
140 }); 145 });
1 <template> 1 <template>
2 <div class="article-item"> 2 <div class="article-item">
3 - <ArticleItemHeader :type="type" :data="headerData" :lazy="lazy" @on-follow="onFollow"></ArticleItemHeader>  
4 - <ArticleItemSlide :type="type" :data="slideData" :slide-index="data.blockIndex" :lazy="lazy"></ArticleItemSlide>  
5 - <ProductGroup v-if="productListData.length" :data="productListData" :lazy="lazy"></ProductGroup>  
6 - <ArticleItemIntro :type="type" :data="introData" @on-expand="onExpand" @on-expanding="onExpanding" @on-show-guang="onShowGuang" @on-show-comment="onShowComment"></ArticleItemIntro>  
7 - <ArticleItemComment :type="type" :data="commentData" @on-show-comment="onShowComment" @on-resize="onResize"></ArticleItemComment> 3 + <ArticleItemHeader :type="type" :share="share" :data="headerData" :lazy="lazy" @on-follow="onFollow"></ArticleItemHeader>
  4 + <ArticleItemSlide :type="type" :share="share" :data="slideData" :slide-index="data.blockIndex" :lazy="lazy"></ArticleItemSlide>
  5 + <ProductGroup v-if="productListData.length" :share="share" :data="productListData" :lazy="lazy"></ProductGroup>
  6 + <ArticleItemIntro :type="type" :share="share" :data="introData" @on-expand="onExpand" @on-expanding="onExpanding" @on-show-guang="onShowGuang" @on-show-comment="onShowComment"></ArticleItemIntro>
  7 + <ArticleItemComment :type="type" :share="share" :data="commentData" @on-show-comment="onShowComment" @on-resize="onResize"></ArticleItemComment>
8 <div class="line"></div> 8 <div class="line"></div>
9 </div> 9 </div>
10 </template> 10 </template>
@@ -26,6 +26,7 @@ export default { @@ -26,6 +26,7 @@ export default {
26 return {}; 26 return {};
27 } 27 }
28 }, 28 },
  29 + share: Boolean,
29 type: String 30 type: String
30 }, 31 },
31 computed: { 32 computed: {
@@ -60,7 +61,7 @@ export default { @@ -60,7 +61,7 @@ export default {
60 praiseCount: this.data.praiseCount, 61 praiseCount: this.data.praiseCount,
61 favoriteCount: this.data.favoriteCount, 62 favoriteCount: this.data.favoriteCount,
62 articleId: this.data.articleId, 63 articleId: this.data.articleId,
63 - imageUrl: get(first(this.slideData.blockList), 'contentData', '').replace('{mode}', 2).replace('{width}', 200).replace('{height}', 200) 64 + shareImage: get(first(this.slideData.blockList), 'contentData', '').replace('{mode}', 2).replace('{width}', 200).replace('{height}', 200)
64 }; 65 };
65 }, 66 },
66 commentData() { 67 commentData() {
@@ -3,13 +3,13 @@ @@ -3,13 +3,13 @@
3 <Layout class="article"> 3 <Layout class="article">
4 <LayoutHeader theme="white" slot='header' :title="title" :opacity="currentAuthor.opacity"> 4 <LayoutHeader theme="white" slot='header' :title="title" :opacity="currentAuthor.opacity">
5 <template v-if="showHeader"> 5 <template v-if="showHeader">
6 - <router-link class="avatar-wrapper" :to="`/grass/author/${currentAuthor.authorType}/${currentAuthor.authorUid}`"> 6 + <div class="avatar-wrapper" @click="toUserPage">
7 <WidgetAvatar class="widget-avatar" :src="currentAuthor.authorHeadIco" :width="70" :height="70"></WidgetAvatar> 7 <WidgetAvatar class="widget-avatar" :src="currentAuthor.authorHeadIco" :width="70" :height="70"></WidgetAvatar>
8 <span class="user-name">{{currentAuthor.authorName}}</span> 8 <span class="user-name">{{currentAuthor.authorName}}</span>
9 - </router-link> 9 + </div>
10 </template> 10 </template>
11 <template v-if="showHeader" v-slot:opts> 11 <template v-if="showHeader" v-slot:opts>
12 - <WidgetFollow class="widget-follow" :author-uid="currentAuthor.authorUid" :follow="currentAuthor.hasAttention === 'Y'" @on-follow="follow => onFollow(currentAuthor, follow)"></WidgetFollow> 12 + <WidgetFollow :share="share" class="widget-follow" :author-uid="currentAuthor.authorUid" :follow="currentAuthor.hasAttention === 'Y'" @on-follow="follow => onFollow(currentAuthor, follow)"></WidgetFollow>
13 </template> 13 </template>
14 </LayoutHeader> 14 </LayoutHeader>
15 <LayoutRecycleList :size="30" ref="scroll" @scroll="onScroll" :offset="2000" :on-fetch="onFetch"> 15 <LayoutRecycleList :size="30" ref="scroll" @scroll="onScroll" :offset="2000" :on-fetch="onFetch">
@@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
19 :type="type" 19 :type="type"
20 :data="data" 20 :data="data"
21 :data-id="data.articleId" 21 :data-id="data.articleId"
  22 + :share="share"
22 @on-follow="follow => onFollow(data, follow)" 23 @on-follow="follow => onFollow(data, follow)"
23 @on-resize="onResize" 24 @on-resize="onResize"
24 @on-show-guang="onShowGuang" 25 @on-show-guang="onShowGuang"
@@ -48,6 +49,7 @@ export default { @@ -48,6 +49,7 @@ export default {
48 type: String, 49 type: String,
49 default: '逛' 50 default: '逛'
50 }, 51 },
  52 + share: Boolean,
51 type: String, 53 type: String,
52 onFetch: Function 54 onFetch: Function
53 }, 55 },
@@ -82,6 +84,18 @@ export default { @@ -82,6 +84,18 @@ export default {
82 }, 84 },
83 methods: { 85 methods: {
84 ...mapMutations(['CHANGE_ARTICLE_LIST_PRELAZY', 'ASYNC_ARTICLE_COMMENT']), 86 ...mapMutations(['CHANGE_ARTICLE_LIST_PRELAZY', 'ASYNC_ARTICLE_COMMENT']),
  87 + toUserPage() {
  88 + if (this.share) {
  89 + return this.$links.toDownloadApp();
  90 + }
  91 + this.$router.push({
  92 + name: 'author',
  93 + params: {
  94 + type: this.currentAuthor.authorType,
  95 + id: this.currentAuthor.authorUid
  96 + }
  97 + });
  98 + },
85 onShowComment({articleId, index}) { 99 onShowComment({articleId, index}) {
86 this.articleId = articleId; 100 this.articleId = articleId;
87 this.articleIndex = index; 101 this.articleIndex = index;
@@ -7,6 +7,14 @@ export default [{ @@ -7,6 +7,14 @@ export default [{
7 keepAlive: true 7 keepAlive: true
8 } 8 }
9 }, { 9 }, {
  10 + path: '/article/share/:id',
  11 + name: 'article.share',
  12 + alias: '/article/share/:id',
  13 + component: () => import(/* webpackChunkName: "article" */ './article-share'),
  14 + meta: {
  15 + keepAlive: true
  16 + }
  17 +}, {
10 path: '/article/:id/user/:type/:authorType/:authorUid', 18 path: '/article/:id/user/:type/:authorType/:authorUid',
11 name: 'article.user', 19 name: 'article.user',
12 alias: '/article/:id/user/:type/:authorType/:authorUid', 20 alias: '/article/:id/user/:type/:authorType/:authorUid',
  1 +export default {
  2 + toDownloadApp() {
  3 + window.location.href = 'https://union.yoho.cn/union/app-downloads.html?union_type=100000000000349&client_id=1927079456&openby:yohobuy={"action":"go.home","params":{"channel":"1"}}';
  4 + }
  5 +};