jwyu 3 ani în urmă
părinte
comite
fc6c31e9e0

+ 23 - 0
api/common.js

@@ -29,4 +29,27 @@ export const apiGetPermissionList=params=>{
 // 获取手机号
 export const apiGetWechatPhone=params=>{
     return httpPost('/wechat/getEncryptInfo',params)
+}
+
+/**
+ * 获取海报
+ * @param code_page 分享海报小程序页面地址
+ * @param code_scene 小程序页面参数
+ * @param source 来源 activity_detail(活动详情) activity_list(活动列表)
+ *                    special_column_list(专栏列表) special_column_detail(专栏详情)
+ *                    report_list(报告列表) report_detail(报告详情)
+ *                    chart_list(图库列表) chart_detail(图库详情)
+ * @param version 
+ * @param pars 生成海报需要的页面参数
+ */
+export const apiGetPoster=params=>{
+    return httpPost('/public/get_share_poster',{version:'3.0',...params})
+}
+
+/**
+ * 获取通过海报二维码扫码进入的页面所需要的参数
+ * @param scene_key
+ */
+export const apiGetSceneToParams=params=>{
+    return httpGet('/public/get_suncode_scene',params)
 }

+ 51 - 10
components/sharePoster/sharePoster.vue

@@ -1,20 +1,22 @@
 <template>
-  <view class="share-poster-wrap">
-      <image @click="handleCreatePoster" :style="style" class="share-icon" src="@/static/share-poster-icon.png" mode="aspectFill"/>
+    <view class="share-poster-wrap">
+        <image @click="handleCreatePoster" :style="style" class="share-icon" src="@/static/share-poster-icon.png" mode="aspectFill"/>
 
-      <van-popup :show="show" @close="show=false" :close-on-click-overlay="false">
-        <view class="loading-box" v-if="!posterImg">
+        <view class="poster-mask" v-if="show||showPoster" @click="showPoster=false"></view>
+        <view class="loading-box" v-if="show">
             <image class="load-img" src="../../static/loading.png" mode="aspectFill" />
-            <view>加载中...</view>
+            <view>海报生成中...</view>
         </view>
-      </van-popup>
-      
+        <image v-if="showPoster" class="poster-img" :src="posterImg" mode="widthFix" show-menu-by-longpress />
   </view>
 </template>
 
 <script>
+import {apiGetPoster} from '@/api/common'
 export default {
-    // shareData.type 分享页面: chartList(图列表), reportList(报告列表), specialColumnList(专栏列表),
+    // shareData.type 分享页面: 
+    //activity_detail(活动详情) activity_list(活动列表) special_column_list(专栏列表) special_column_detail(专栏详情) 
+    //report_list(报告列表) report_detail(报告详情) chart_list(图库列表) chart_detail(图库详情)
     props:{
         style:null,
         shareData:null,
@@ -23,12 +25,25 @@ export default {
         return {
             loading:false,
             show:false,
-            posterImg:''
+            posterImg:'',
+            showPoster:false
         }
     },
     methods: {
-        handleCreatePoster(){
+        async handleCreatePoster(){
             this.show=true
+            
+            const res=await apiGetPoster({
+                code_page:this.shareData.code_page,
+                code_scene:this.shareData.code_scene,
+                source:this.shareData.type,
+                pars:this.shareData.data
+            })
+            if(res.code==200){
+                this.show=false
+                this.posterImg=res.data
+                this.showPoster=true
+            }
         }
     }
 
@@ -45,7 +60,22 @@ export default {
         width: 76rpx;
         height: 76rpx;
     }
+    .poster-mask{
+        position: fixed;
+        left: 0;
+        top: 0;
+        right: 0;
+        bottom: 0;
+        background: rgba(0, 0, 0, 0.4);
+        z-index: 998;
+    }
     .loading-box{
+        background-color: #fff;
+        position: fixed;
+        left: 50%;
+        top: 50%;
+        z-index: 999;
+        transform: translate(-50%,-50%);
         width: 417rpx;
         height: 261rpx;
         text-align: center;
@@ -66,5 +96,16 @@ export default {
             }
         }
     }
+    .poster-img{
+        width: 90vw;
+        display: block;
+        position: fixed;
+        left: 50%;
+        top: 50%;
+        z-index: 999;
+        transform: translate(-50%,-50%);
+        border-radius: 16rpx;
+    }
 }
+
 </style>

+ 50 - 3
pages-activity/detail.vue

@@ -161,6 +161,17 @@
                 </view>
             </view>
         </van-popup>
+
+        <!-- 分享海报 -->
+        <sharePoster 
+            :style="{bottom:'250rpx'}" 
+            :shareData="{
+                type:'activity_detail',
+                code_page:'pages-activity/detail',
+                code_scene:code_scene,
+                data:shareParams
+            }"
+        ></sharePoster>
     </view>
 </template>
 
@@ -175,8 +186,14 @@ import {
     apiActivityCancelRegister
 } from "@/api/activity";
 import {baseApiUrl} from '@/utils/config.js'
+import sharePoster from '../components/sharePoster/sharePoster.vue'
+const moment=require('@/utils/moment-with-locales.min')
+moment.locale('zh-cn');
 export default {
     name: "ActivityDetail",
+    components: {
+        sharePoster
+    },
     computed: {
       isFirstAudio(){
           if(this.audioList.length>0){
@@ -188,6 +205,21 @@ export default {
               return this.activeAudioUrl==this.audioList[this.audioList.length-1].voiceUrl
           }
       },
+      shareParams(){ //生成海报数据
+        if(this.info){
+            let obj={
+                activity_title:this.info.activityTypeName+'电话会',
+                activity_speaker:this.info.speaker,
+                activity_time:this.formatActivityTime(this.info.startTime,this.info.endTime),
+                activity_avatar:this.info.speakerHeadPic
+            }   
+            return obj
+        }
+        
+      },
+      code_scene(){//生成海报的小程序页面参数
+        return  `id=${this.id}`
+      }
     },
     data() {
         return {
@@ -250,6 +282,13 @@ export default {
         }
     },
     methods: {
+        formatActivityTime(start,end){
+            const week=moment(start).format('dddd');
+            const day=moment(start).format('YYYY-MM-DD');
+            const startTime=moment(start).format('HH:mm');
+            const endTime=moment(end).format('HH:mm');
+            return `${day} ${startTime}-${endTime} ${week}`
+        },
         // 点击音频项
         handleClickAudioItem(item){
             // 点击同一个音频
@@ -392,9 +431,17 @@ export default {
             const res = await apiActivityDetail({ activity_id: Number(this.id) });
             // 无权限
             if (res.code === 403) {
-                uni.redirectTo({
-                    url: "/pages-activity/noAuthority?data=" + JSON.stringify(res.data),
-                });
+                // 如果是pc进入的 则不跳转 
+                //防止无权限用户在pc点击分享的或者识别的二维码,没法正常跳转到pc页
+                uni.getSystemInfo({
+                    success:(res)=>{
+                        if (res.windowWidth < 700){
+                            uni.redirectTo({
+                                url: "/pages-activity/noAuthority?data=" + JSON.stringify(res.data),
+                            });
+                        }
+                    }
+                })
                 return;
             }
             if (res.code === 200) {

+ 35 - 2
pages-report/reportList.vue

@@ -55,8 +55,10 @@
     <sharePoster 
       :style="{bottom:'140rpx'}" 
       :shareData="{
-        type:'reportList',
-        params:{classify_id_first:classifyId,classify_id_second:selectSecClassifyId}
+        type:'report_list',
+        code_page:'pages-report/reportList',
+        code_scene:code_scene,
+        data:shareParams
       }"></sharePoster>
   </view>
 </template>
@@ -66,6 +68,7 @@ import searchBox from "./components/searchBox.vue";
 import audioBox from './components/audioBox.vue'
 import sharePoster from '@/components/sharePoster/sharePoster.vue'
 import {apiReportList,apiSubClassifyList} from '@/api/report'
+const moment=require('@/utils/moment-with-locales.min')
 export default {
   computed: {
     showAudioPop(){//是否显示音频弹窗
@@ -76,6 +79,35 @@ export default {
     },
     curAudioPaused(){//当前音频是否暂停状态
       return this.$store.state.report.audioData.paused
+    },
+    shareParams(){
+      let obj={
+        list_title:this.classifyName,
+        img_1:'',
+        title_1:'',
+        abstract_1:'',
+        time_1:'',
+        img_2:'',
+        title_2:'',
+        abstract_2:'',
+        time_2:'',
+      }
+      if(this.list[0]){
+        obj.img_1=this.list[0].report_img_url
+        obj.title_1=this.list[0].title 
+        obj.abstract_1=this.list[0].classify_name_second
+        obj.time_1=`${this.list[0].stage}期 | ${moment(this.list[0].publish_time).format('YYYY.MM.DD')}`
+      }
+      if(this.list[1]){
+        obj.img_2=this.list[1].report_img_url
+        obj.title_2=this.list[1].title 
+        obj.abstract_2=this.list[1].classify_name_second
+        obj.time_2=`${this.list[1].stage}期 | ${moment(this.list[1].publish_time).format('YYYY.MM.DD')}`
+      }
+      return obj
+    },
+    code_scene(){
+      return `classifyId=${this.classifyId}&classifyName=${this.classifyName}`
     }
   },
   components: {
@@ -100,6 +132,7 @@ export default {
     };
   },
   onLoad(options) {
+    console.log(options);
     this.classifyId=options.classifyId
     this.classifyName=decodeURIComponent(options.classifyName)
     // 设置title

+ 19 - 3
pages-report/specialColumn/detail.vue

@@ -47,9 +47,12 @@
         <sharePoster
             :style="{bottom:'140rpx'}" 
             :shareData="{
-                type:'specialColumnDetail',
-                params:{columnId:columnId}
-            }"></sharePoster>
+                type:'special_column_detail',
+                code_page:'pages-report/specialColumn/detail',
+                code_scene:code_scene,
+                data:shareParams
+            }"
+        ></sharePoster>
     </view>
 </template>
 
@@ -67,6 +70,19 @@ export default {
         },
         curAudioPaused(){//当前音频是否暂停状态
             return this.$store.state.report.audioData.paused
+        },
+        shareParams(){
+            if(this.info){
+                let obj={
+                    report_avatar:this.info.avatar_img_url,
+                    report_title:this.info.classify_name_second,
+                    report_abstract:this.info.abstract
+                }
+                return obj
+            }
+        },
+        code_scene(){
+            return `columnId=${this.columnId}`
         }
     },
     components: {

+ 42 - 1
pages-report/specialColumn/list.vue

@@ -22,7 +22,12 @@
       <!-- 分享海报 -->
       <sharePoster 
         :style="{bottom:'140rpx'}" 
-        :shareData="{type:'specialColumnList',params:{classify_id_first:classifyId}}"
+        :shareData="{
+          type:'special_column_list',
+          code_page:'pages-report/specialColumn/list',
+          code_scene:code_scene,
+          data:shareParams
+        }"
       ></sharePoster>
       
     </view>
@@ -35,6 +40,42 @@ export default {
   components: {
     sharePoster
   },
+  computed: {
+    shareParams(){
+      let obj={
+        list_title:this.classifyName,
+        stage_1:'',
+        avatar_1:'',
+        title_1:'',
+        author_1:'',
+        tag_1:'',
+        stage_2:'',
+        avatar_2:'',
+        title_2:'',
+        author_2:'',
+        tag_2:'',
+      }
+      if(this.list[0]){
+        obj.stage_1=this.list[0].stage
+        obj.avatar_1=this.list[0].home_img_url
+        obj.title_1=this.list[0].classify_name_second
+        obj.author_1=this.list[0].report_author
+        obj.tag_1=this.list[0].author_descript
+      }
+      if(this.list[1]){
+        obj.stage_2=this.list[1].stage
+        obj.avatar_2=this.list[1].home_img_url
+        obj.title_2=this.list[1].classify_name_second
+        obj.author_2=this.list[1].report_author
+        obj.tag_2=this.list[1].author_descript
+      }
+      return obj
+
+    },
+    code_scene(){
+      return `classifyId=${this.classifyId}&classifyName=${this.classifyName}`
+    }
+  },
   data () {
     return {
       classifyId:0,

+ 56 - 1
pages/activity/activity.vue

@@ -179,7 +179,17 @@
                 </view>
             </view>
         </van-popup>
-  
+
+        <!-- 分享海报 -->
+        <sharePoster 
+            :style="{bottom:'250rpx'}" 
+            :shareData="{
+                type:'activity_list',
+                code_page:'pages/activity/activity',
+                code_scene:'',
+                data:shareParams
+            }"
+        ></sharePoster>
     </view>
 </template>
 
@@ -193,7 +203,13 @@ import {
     apiActivityAudios
 } from '@/api/activity'
 import {apiApplyPermission,apiUserInfo} from '@/api/user'
+import sharePoster from '../../components/sharePoster/sharePoster.vue'
+const moment=require('@/utils/moment-with-locales.min')
+moment.locale('zh-cn');
 export default {
+    components: {
+        sharePoster
+    },
     computed: {
         isFirstAudio(){
             if(!this.currentAudioMsg.audioCurrentUrl){
@@ -210,6 +226,38 @@ export default {
             if(this.currentAudioMsg.list.length>0){
                 return this.currentAudioMsg.audioCurrentUrl==this.currentAudioMsg.list[this.currentAudioMsg.list.length-1].voiceUrl
             }
+        },
+
+        shareParams(){ //生成海报数据
+            let obj={
+                list_title:'弘则FICC周度电话会安排',
+                status_1:'',
+                avatar_1:'',
+                title_1:'',
+                speaker_1:'',
+                time_1:'',
+                status_2:'',
+                avatar_2:'',
+                title_2:'',
+                speaker_2:'',
+                time_2:'',
+            }
+            if(this.list[0]){
+                obj.status_1=this.list[0].activityState==1?'未开始':this.list[0].activityState==2?'进行中':'已结束'
+                obj.avatar_1=this.list[0].speakerHeadPic
+                obj.title_1=this.list[0].activityTypeName
+                obj.speaker_1=this.list[0].speaker
+                obj.time_1=this.formatActivityTime(this.list[0].startTime,this.list[0].endTime)
+            }
+            if(this.list[1]){
+                obj.status_2=this.list[1].activityState==1?'未开始':this.list[1].activityState==2?'进行中':'已结束'
+                obj.avatar_2=this.list[1].speakerHeadPic
+                obj.title_2=this.list[1].activityTypeName
+                obj.speaker_2=this.list[1].speaker
+                obj.time_2=this.formatActivityTime(this.list[1].startTime,this.list[1].endTime)
+            }
+
+            return obj
         }
     },
     watch: {
@@ -314,6 +362,13 @@ export default {
     },
 
     methods: {
+        formatActivityTime(start,end){
+            const week=moment(start).format('dddd');
+            const day=moment(start).format('YYYY-MM-DD');
+            const startTime=moment(start).format('HH:mm');
+            const endTime=moment(end).format('HH:mm');
+            return `${day} ${startTime}-${endTime} ${week}`
+        },
         // 初始化音频状态
         initAudio(){
             console.log('音频src',this.globalBgMusic.src);

+ 29 - 1
pages/chart/chart.vue

@@ -94,7 +94,15 @@
       </van-popup>
 
     <!-- 分享海报 -->
-    <sharePoster :style="{bottom:'250rpx'}" :shareData="{type:'chartList'}"></sharePoster>
+    <sharePoster 
+      :style="{bottom:'250rpx'}" 
+      :shareData="{
+        type:'chart_list',
+        code_page:'pages/chart/chart',
+        code_scene:'',
+        data:shareParams
+      }"
+    ></sharePoster>
 </template>
 
 <script>
@@ -110,6 +118,26 @@ export default {
       noAuth,
       sharePoster
     },
+    computed: {
+      shareParams(){//生成海报要的数据
+        let obj={
+          list_title:'ETA图库',
+          title_1:'',
+          img_1:'',
+          title_2:'',
+          img_2:'',
+        }
+        if(this.list[0]){
+          obj.title_1=this.list[0].ChartName
+          obj.img_1=this.list[0].ChartImage
+        }
+        if(this.list[1]){
+          obj.title_2=this.list[0].ChartName
+          obj.img_2=this.list[0].ChartImage
+        }
+        return obj
+      }
+    },
     data() {
         return {
           list:[],