Browse Source

mp:支持 wx-news、wx-location 类型的消息

YunaiV 2 years ago
parent
commit
b0386429fe

+ 36 - 0
yudao-ui-admin/src/views/mp/components/wx-location/main.vue

@@ -0,0 +1,36 @@
+<!--
+  【微信消息 - 定位】
+-->
+<template>
+  <div>
+    <el-link type="primary" target="_blank" :href="'https://map.qq.com/?type=marker&isopeninfowin=1&markertype=1&pointx=' + locationY + '&pointy=' + locationX + '&name=' + label + '&ref=yudao'">
+      <img :src="'https://apis.map.qq.com/ws/staticmap/v2/?zoom=10&markers=color:blue|label:A|' + locationX + ',' + locationY + '&key=' + qqMapKey + '&size=250*180'">
+      <p/><i class="el-icon-map-location"></i>{{label}}
+    </el-link>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "wxLocation",
+    props: {
+      locationX: {
+        required: true,
+        type: Number
+      },
+      locationY: {
+        required: true,
+        type: Number
+      },
+      label: { // 地名
+        required: true,
+        type: String
+      },
+      qqMapKey: { // QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
+        required: false,
+        type: String,
+        default: 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E' // 需要自定义
+      }
+    }
+  };
+</script>

+ 14 - 13
yudao-ui-admin/src/views/mp/components/wx-msg/main.vue

@@ -58,23 +58,20 @@
               <div v-else-if="item.type === 'video' || item.type === 'shortvideo'" style="text-align: center">
                 <wx-video-player :url="item.mediaUrl" />
               </div>
-              <div v-if="item.type === 'link'" class="avue-card__detail">
+              <div v-else-if="item.type === 'link'" class="avue-card__detail">
                 <el-link type="success" :underline="false" target="_blank" :href="item.url">
                   <div class="avue-card__title"><i class="el-icon-link"></i>{{ item.title }}</div>
                 </el-link>
                 <div class="avue-card__info" style="height: unset">{{item.description}}</div>
               </div>
               <!-- TODO 芋艿:待完善 -->
-<!--              <div v-if="item.repType == 'location'">-->
-<!--                <el-link type="primary" target="_blank" :href="'https://map.qq.com/?type=marker&isopeninfowin=1&markertype=1&pointx='+item.repLocationY+'&pointy='+item.repLocationX+'&name='+item.repContent+'&ref=joolun'">-->
-<!--                  <img :src="'https://apis.map.qq.com/ws/staticmap/v2/?zoom=10&markers=color:blue|label:A|'+item.repLocationX+','+item.repLocationY+'&key='+qqMapKey+'&size=250*180'">-->
-<!--                  <p/><i class="el-icon-map-location"></i>{{item.repContent}}-->
-<!--                </el-link>-->
-<!--              </div>-->
+              <div v-else-if="item.type === 'location'">
+                <wx-location :label="item.label" :location-y="item.locationY" :location-x="item.locationX" />
+              </div>
 
-<!--              <div v-if="item.repType == 'news'" style="width: 300px">-->
-<!--                <WxNews :objData="item.content.articles"></WxNews>-->
-<!--              </div>-->
+              <div v-else-if="item.type === 'news'" style="width: 300px"> <!-- TODO 芋艿:待测试;详情页也存在类似的情况 -->
+                <wx-news :articles="item.articles" />
+              </div>
 
 <!--              <div v-if="item.repType == 'music'">-->
 <!--                <el-link type="success" :underline="false" target="_blank" :href="item.repUrl">-->
@@ -105,14 +102,17 @@
   // import WxNews from '@/components/wx-news/main.vue'
   import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue';
   import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue';
+  import WxNews from '@/views/mp/components/wx-news/main.vue';
+  import WxLocation from '@/views/mp/components/wx-location/main.vue';
 
   export default {
     name: "wxMsg",
     components: {
       // WxReplySelect,
-      // WxNews,
       WxVideoPlayer,
-      WxVoicePlayer
+      WxVoicePlayer,
+      WxNews,
+      WxLocation
     },
     props: {
       wxUserId: {
@@ -140,7 +140,8 @@
         mp: {
           nickname: '公众号',
           avatar: require("@/assets/images/wechat.png"),
-        }
+        },
+        qqMapKey: '' //
       }
     },
     created() {

+ 101 - 0
yudao-ui-admin/src/views/mp/components/wx-news/main.vue

@@ -0,0 +1,101 @@
+<!--
+  - Copyright (C) 2018-2019
+  - All rights reserved, Designed By www.joolun.com
+  【微信消息 - 图文】
+  芋道源码:
+  ① 代码优化,补充注释,提升阅读性
+-->
+<template>
+  <div class="news-home">
+    <div v-for="(article, index) in articles" :key="index" class="news-div">
+      <!-- 头条 -->
+      <a target="_blank" :href="article.url" v-if="index === 0">
+        <div class="news-main">
+          <div class="news-content">
+            <img class="material-img" :src="article.picUrl" width="280px" height="120px"/>
+            <div class="news-content-title">
+              <span>{{article.title}}</span>
+            </div>
+          </div>
+        </div>
+      </a>
+      <!-- 二条/三条等等 -->
+      <a target="_blank" :href="article.url" v-else>
+        <div class="news-main-item">
+          <div class="news-content-item">
+            <div class="news-content-item-title">{{article.title}}</div>
+            <div class="news-content-item-img">
+              <img class="material-img" :src="article.picUrl" height="100%"/>
+            </div>
+          </div>
+        </div>
+      </a>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "wxNews",
+    props: {
+      articles: {
+        type: Array // title - 标题;description - 描述;picUrl - 图片连接;url - 跳转链接
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .news-home {
+    background-color: #FFFFFF;
+    width: 100%;
+    margin: auto;
+  }
+  .news-main {
+    width: 100%;
+    margin: auto;
+  }
+  .news-content {
+    background-color: #acadae;
+    width: 100%;
+    position: relative;
+  }
+  .news-content-title {
+    display: inline-block;
+    font-size: 12px;
+    color: #FFFFFF;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    background-color: black;
+    width: 98%;
+    padding: 1%;
+    opacity: 0.65;
+    white-space: normal;
+    box-sizing: unset!important
+  }
+  .news-main-item {
+    background-color: #FFFFFF;
+    padding: 5px 0;
+    border-top: 1px solid #eaeaea;
+  }
+  .news-content-item {
+    position: relative;
+  }
+  .news-content-item-title {
+    display: inline-block;
+    font-size: 10px;
+    width: 70%;
+    margin-left: 1%;
+    white-space: normal
+  }
+  .news-content-item-img {
+    display: inline-block;
+    width: 25%;
+    background-color: #acadae;
+    margin-right: 1%;
+  }
+  .material-img {
+    width: 100%;
+  }
+</style>

+ 1 - 0
yudao-ui-admin/src/views/mp/components/wx-video-play/main.vue

@@ -1,6 +1,7 @@
 <!--
   - Copyright (C) 2018-2019
   - All rights reserved, Designed By www.joolun.com
+  【微信消息 - 视频】
   芋道源码:
   ① bug 修复:
     1)joolun 的做法:使用 mediaId 从微信公众号,下载对应的 mp4 素材,从而播放内容;

+ 1 - 0
yudao-ui-admin/src/views/mp/components/wx-voice-play/main.vue

@@ -1,6 +1,7 @@
 <!--
   - Copyright (C) 2018-2019
   - All rights reserved, Designed By www.joolun.com
+  【微信消息 - 语音】
    芋道源码:
   ① bug 修复:
     1)joolun 的做法:使用 mediaId 从微信公众号,下载对应的 mp4 素材,从而播放内容;

+ 6 - 1
yudao-ui-admin/src/views/mp/message/index.vue

@@ -86,6 +86,9 @@
             <el-tag size="mini">链接</el-tag>:
             <a :href="scope.row.url" target="_blank">{{scope.row.title}}</a>
           </div>
+          <div v-else-if="scope.row.type === 'location'">
+            <wx-location :label="scope.row.label" :location-y="scope.row.locationY" :location-x="scope.row.locationX" />
+          </div>
           <div v-else>
             <el-tag type="danger" size="mini">未知消息类型</el-tag>
           </div>
@@ -115,13 +118,15 @@ import { getMessagePage } from "@/api/mp/message";
 import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue';
 import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue';
 import WxMsg from '@/views/mp/components/wx-msg/main.vue';
+import WxLocation from '@/views/mp/components/wx-location/main.vue';
 
 export default {
   name: "WxFansMsg",
   components: {
     WxVideoPlayer,
     WxVoicePlayer,
-    WxMsg
+    WxMsg,
+    WxLocation
   },
   data() {
     return {