Commit 9e4a978f85fa94792895954faac2b4a929db7f15

Authored by YunaiV
1 parent cc23ca2d

mp:解决 wx-msg 的 css 问题

yudao-ui-admin/src/assets/images/wechat.png 0 → 100644

1.84 KB

yudao-ui-admin/src/views/mp/components/wx-msg/card.scss 0 → 100644
  1 +.avue-card{
  2 + &__item{
  3 + margin-bottom: 16px;
  4 + border: 1px solid #e8e8e8;
  5 + background-color: #fff;
  6 + box-sizing: border-box;
  7 + color: rgba(0,0,0,.65);
  8 + font-size: 14px;
  9 + font-variant: tabular-nums;
  10 + line-height: 1.5;
  11 + list-style: none;
  12 + font-feature-settings: "tnum";
  13 + cursor: pointer;
  14 + height:200px;
  15 + &:hover{
  16 + border-color: rgba(0,0,0,.09);
  17 + box-shadow: 0 2px 8px rgba(0,0,0,.09);
  18 + }
  19 + &--add{
  20 + border:1px dashed #000;
  21 + width: 100%;
  22 + color: rgba(0,0,0,.45);
  23 + background-color: #fff;
  24 + border-color: #d9d9d9;
  25 + border-radius: 2px;
  26 + display: flex;
  27 + align-items: center;
  28 + justify-content: center;
  29 + font-size: 16px;
  30 + i{
  31 + margin-right: 10px;
  32 + }
  33 + &:hover{
  34 + color: #40a9ff;
  35 + background-color: #fff;
  36 + border-color: #40a9ff;
  37 + }
  38 + }
  39 + }
  40 + &__body{
  41 + display: flex;
  42 + padding: 24px;
  43 + }
  44 + &__detail{
  45 + flex:1
  46 + }
  47 + &__avatar{
  48 + width: 48px;
  49 + height: 48px;
  50 + border-radius: 48px;
  51 + overflow: hidden;
  52 + margin-right: 12px;
  53 + img{
  54 + width: 100%;
  55 + height: 100%;
  56 + }
  57 + }
  58 + &__title{
  59 + color: rgba(0,0,0,.85);
  60 + margin-bottom: 12px;
  61 + font-size: 16px;
  62 + &:hover{
  63 + color:#1890ff;
  64 + }
  65 + }
  66 + &__info{
  67 + color: rgba(0,0,0,.45);
  68 + display: -webkit-box;
  69 + -webkit-box-orient: vertical;
  70 + -webkit-line-clamp: 3;
  71 + overflow: hidden;
  72 + height: 64px;
  73 + }
  74 + &__menu{
  75 + display: flex;
  76 + justify-content:space-around;
  77 + height: 50px;
  78 + background: #f7f9fa;
  79 + color: rgba(0,0,0,.45);
  80 + text-align: center;
  81 + line-height: 50px;
  82 + &:hover{
  83 + color:#1890ff;
  84 + }
  85 + }
  86 +}
yudao-ui-admin/src/views/mp/components/wx-msg/comment.scss 0 → 100644
  1 +/* 来自 https://github.com/nmxiaowei/avue/blob/master/styles/src/element-ui/comment.scss */
  2 +.avue-comment{
  3 + margin-bottom: 30px;
  4 + display: flex;
  5 + align-items: flex-start;
  6 + &--reverse{
  7 + flex-direction:row-reverse;
  8 + .avue-comment__main{
  9 + &:before,&:after{
  10 + left: auto;
  11 + right: -8px;
  12 + border-width: 8px 0 8px 8px;
  13 + }
  14 + &:before{
  15 + border-left-color: #dedede;
  16 + }
  17 + &:after{
  18 + border-left-color: #f8f8f8;
  19 + margin-right: 1px;
  20 + margin-left: auto;
  21 + }
  22 + }
  23 + }
  24 + &__avatar{
  25 + width: 48px;
  26 + height: 48px;
  27 + border-radius: 50%;
  28 + border: 1px solid transparent;
  29 + box-sizing: border-box;
  30 + vertical-align: middle;
  31 + }
  32 + &__header{
  33 + padding: 5px 15px;
  34 + background: #f8f8f8;
  35 + border-bottom: 1px solid #eee;
  36 + display: flex;
  37 + align-items: center;
  38 + justify-content: space-between;
  39 + }
  40 + &__author{
  41 + font-weight: 700;
  42 + font-size: 14px;
  43 + color: #999;
  44 + }
  45 + &__main{
  46 + flex:1;
  47 + margin: 0 20px;
  48 + position: relative;
  49 + border: 1px solid #dedede;
  50 + border-radius: 2px;
  51 + &:before,&:after{
  52 + position: absolute;
  53 + top: 10px;
  54 + left: -8px;
  55 + right: 100%;
  56 + width: 0;
  57 + height: 0;
  58 + display: block;
  59 + content: " ";
  60 + border-color: transparent;
  61 + border-style: solid solid outset;
  62 + border-width: 8px 8px 8px 0;
  63 + pointer-events: none;
  64 + }
  65 + &:before {
  66 + border-right-color: #dedede;
  67 + z-index: 1;
  68 + }
  69 + &:after{
  70 + border-right-color: #f8f8f8;
  71 + margin-left: 1px;
  72 + z-index: 2;
  73 + }
  74 + }
  75 + &__body{
  76 + padding: 15px;
  77 + overflow: hidden;
  78 + background: #fff;
  79 + font-family: Segoe UI,Lucida Grande,Helvetica,Arial,Microsoft YaHei,FreeSans,Arimo,Droid Sans,wenquanyi micro hei,Hiragino Sans GB,Hiragino Sans GB W3,FontAwesome,sans-serif;color: #333;
  80 + font-size: 14px;
  81 + }
  82 + blockquote{
  83 + margin:0;
  84 + font-family: Georgia,Times New Roman,Times,Kai,Kaiti SC,KaiTi,BiauKai,FontAwesome,serif;
  85 + padding: 1px 0 1px 15px;
  86 + border-left: 4px solid #ddd;
  87 + }
  88 +}
yudao-ui-admin/src/views/mp/components/wx-msg/main.vue
1 <!-- 1 <!--
2 - Copyright (C) 2018-2019 2 - Copyright (C) 2018-2019
3 - All rights reserved, Designed By www.joolun.com 3 - All rights reserved, Designed By www.joolun.com
  4 + 芋道源码:
  5 + ① 移除暂时用不到的 websocket
  6 + ② 代码优化,补充注释,提升阅读性
4 --> 7 -->
5 <template> 8 <template>
6 - <div class="msg-main" v-loading="mainLoading">  
7 - <div class="msg-div" :id="'msg-div'+nowStr"> 9 + <div class="msg-main">
  10 + <div class="msg-div" :id="'msg-div' + nowStr">
8 <!-- 加载更多 --> 11 <!-- 加载更多 -->
9 <div v-loading="tableLoading"></div> 12 <div v-loading="tableLoading"></div>
10 <div v-if="!tableLoading"> 13 <div v-if="!tableLoading">
@@ -15,9 +18,8 @@ @@ -15,9 +18,8 @@
15 <div class="execution" v-for="item in tableData" :key='item.id'> 18 <div class="execution" v-for="item in tableData" :key='item.id'>
16 <div class="avue-comment" :class="item.sendFrom === 2 ? 'avue-comment--reverse' : ''"> 19 <div class="avue-comment" :class="item.sendFrom === 2 ? 'avue-comment--reverse' : ''">
17 <div class="avatar-div"> 20 <div class="avatar-div">
18 - <img :src="item.sendFrom === 1 ? item.headimgUrl : item.appLogo" class="avue-comment__avatar">  
19 -<!-- <div class="avue-comment__author">{{item.sendFrom === 1 ? item.nickName : item.appName}}</div>-->  
20 - <div class="avue-comment__author">{{item.sendFrom === 1 ? '用户' : '公众号' }}</div> 21 + <img :src="item.sendFrom === 1 ? user.avatar : mp.avatar" class="avue-comment__avatar">
  22 + <div class="avue-comment__author">{{item.sendFrom === 1 ? user.nickname : mp.nickname }}</div>
21 </div> 23 </div>
22 <div class="avue-comment__main"> 24 <div class="avue-comment__main">
23 <div class="avue-comment__header"> 25 <div class="avue-comment__header">
@@ -62,6 +64,7 @@ @@ -62,6 +64,7 @@
62 </el-link> 64 </el-link>
63 <div class="avue-card__info" style="height: unset">{{item.description}}</div> 65 <div class="avue-card__info" style="height: unset">{{item.description}}</div>
64 </div> 66 </div>
  67 + <!-- TODO 芋艿:待完善 -->
65 <!-- <div v-if="item.repType == 'location'">--> 68 <!-- <div v-if="item.repType == 'location'">-->
66 <!-- <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'">--> 69 <!-- <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'">-->
67 <!-- <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'">--> 70 <!-- <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'">-->
@@ -118,28 +121,25 @@ @@ -118,28 +121,25 @@
118 }, 121 },
119 data() { 122 data() {
120 return { 123 return {
121 - nowStr: new Date().getTime(), 124 + nowStr: new Date().getTime(), // 当前的时间戳,用于每次消息加载后,回到原位置;具体见 :id="'msg-div' + nowStr" 处
122 objData:{ 125 objData:{
123 repType: 'text' 126 repType: 'text'
124 }, 127 },
125 - mainLoading:false,  
126 - sendLoading:false,  
127 - tableLoading:false,  
128 - loadMore: true, 128 + sendLoading: false, // 发送消息是否加载中
  129 + tableLoading: false, // 消息列表是否正在加载中
  130 + loadMore: true, // 是否可以加载更多
129 tableData: [], // 消息列表 131 tableData: [], // 消息列表
130 page: { 132 page: {
131 - total: 0, // 总页数  
132 pageNo: 1, // 当前页数 133 pageNo: 1, // 当前页数
133 pageSize: 14, // 每页显示多少条 134 pageSize: 14, // 每页显示多少条
134 - ascs:[],//升序字段  
135 - descs:'create_time'//降序字段  
136 }, 135 },
137 - option: {  
138 - props: {  
139 - avatar: 'avatar',  
140 - author: 'author',  
141 - body: 'body'  
142 - } 136 + user: { // 由于微信不再提供昵称,直接使用“用户”展示
  137 + nickname: '用户',
  138 + avatar: require("@/assets/images/profile.jpg"),
  139 + },
  140 + mp: {
  141 + nickname: '公众号',
  142 + avatar: require("@/assets/images/wechat.png"),
143 } 143 }
144 } 144 }
145 }, 145 },
@@ -148,8 +148,8 @@ @@ -148,8 +148,8 @@
148 }, 148 },
149 methods:{ 149 methods:{
150 sendMsg(){ 150 sendMsg(){
151 - if(this.objData){  
152 - if(this.objData.repType == 'news'){ 151 + if (this.objData) {
  152 + if(this.objData.repType === 'news'){
153 this.objData.content.articles = [this.objData.content.articles[0]] 153 this.objData.content.articles = [this.objData.content.articles[0]]
154 this.$message({ 154 this.$message({
155 showClose: true, 155 showClose: true,
@@ -173,13 +173,7 @@ @@ -173,13 +173,7 @@
173 }) 173 })
174 } 174 }
175 }, 175 },
176 - scrollToBottom: function () {  
177 - this.$nextTick(() => {  
178 - let div = document.getElementById('msg-div'+this.nowStr)  
179 - div.scrollTop = div.scrollHeight  
180 - })  
181 - },  
182 - loadingMore(){ 176 + loadingMore() {
183 this.page.pageNo++ 177 this.page.pageNo++
184 this.getPage(this.page) 178 this.getPage(this.page)
185 }, 179 },
@@ -188,35 +182,35 @@ @@ -188,35 +182,35 @@
188 getMessagePage(Object.assign({ 182 getMessagePage(Object.assign({
189 pageNo: page.pageNo, 183 pageNo: page.pageNo,
190 pageSize: page.pageSize, 184 pageSize: page.pageSize,
191 - descs:page.descs,  
192 - ascs: page.ascs,  
193 wxUserId: this.wxUserId 185 wxUserId: this.wxUserId
194 }, params)).then(response => { 186 }, params)).then(response => {
195 - let msgDiv = document.getElementById('msg-div'+this.nowStr) 187 + // 计算当前的滚动高度
  188 + const msgDiv = document.getElementById('msg-div' + this.nowStr);
196 let scrollHeight = 0 189 let scrollHeight = 0
197 if(msgDiv){ 190 if(msgDiv){
198 scrollHeight = msgDiv.scrollHeight 191 scrollHeight = msgDiv.scrollHeight
199 } 192 }
200 - let data = response.data.list.reverse()  
201 - this.tableData = [...data , ...this.tableData]  
202 - this.page.total = response.data.total 193 +
  194 + // 处理数据
  195 + const data = response.data.list.reverse();
  196 + this.tableData = [...data, ...this.tableData]
203 this.tableLoading = false 197 this.tableLoading = false
204 - if(data.length < this.page.pageSize || data.length === 0){ 198 + if (data.length < this.page.pageSize || data.length === 0){
205 this.loadMore = false 199 this.loadMore = false
206 } 200 }
207 - if(this.page.pageNo == 1){//定位到消息底部  
208 - this.scrollToBottom()  
209 - }else{  
210 - if(data.length != 0){  
211 - this.$nextTick(() => {//定位滚动条  
212 - if(scrollHeight != 0){  
213 - msgDiv.scrollTop = document.getElementById('msg-div'+this.nowStr).scrollHeight - scrollHeight - 100  
214 - }  
215 - })  
216 - }  
217 - }  
218 this.page.pageNo = page.pageNo 201 this.page.pageNo = page.pageNo
219 this.page.pageSize = page.pageSize 202 this.page.pageSize = page.pageSize
  203 +
  204 + // 滚动到原来的位置
  205 + if(this.page.pageNo === 1) { // 定位到消息底部
  206 + this.scrollToBottom()
  207 + } else if (data.length !== 0) { // 定位滚动条
  208 + this.$nextTick(() => {
  209 + if (scrollHeight !== 0){
  210 + msgDiv.scrollTop = document.getElementById('msg-div'+this.nowStr).scrollHeight - scrollHeight - 100
  211 + }
  212 + })
  213 + }
220 }) 214 })
221 }, 215 },
222 /** 216 /**
@@ -224,120 +218,40 @@ @@ -224,120 +218,40 @@
224 */ 218 */
225 refreshChange() { 219 refreshChange() {
226 this.getPage(this.page) 220 this.getPage(this.page)
227 - } 221 + },
  222 + /** 定位到消息底部 */
  223 + scrollToBottom: function () {
  224 + this.$nextTick(() => {
  225 + let div = document.getElementById('msg-div' + this.nowStr)
  226 + div.scrollTop = div.scrollHeight
  227 + })
  228 + },
228 } 229 }
229 }; 230 };
230 </script> 231 </script>
231 <style lang="scss" scoped> 232 <style lang="scss" scoped>
232 -/* 来自 https://github.com/nmxiaowei/avue/blob/master/styles/src/element-ui/comment.scss */  
233 -/* 因为 joolun 实现依赖 avue 组件,该页面使用了 comment.scss */  
234 -.avue-comment{  
235 - margin-bottom: 30px;  
236 - display: flex;  
237 - align-items: flex-start;  
238 - &--reverse{  
239 - flex-direction:row-reverse;  
240 - .avue-comment__main{  
241 - &:before,&:after{  
242 - left: auto;  
243 - right: -8px;  
244 - border-width: 8px 0 8px 8px;  
245 - }  
246 - &:before{  
247 - border-left-color: #dedede;  
248 - }  
249 - &:after{  
250 - border-left-color: #f8f8f8;  
251 - margin-right: 1px;  
252 - margin-left: auto;  
253 - }  
254 - }  
255 - }  
256 - &__avatar{  
257 - width: 48px;  
258 - height: 48px;  
259 - border-radius: 50%;  
260 - border: 1px solid transparent;  
261 - box-sizing: border-box;  
262 - vertical-align: middle;  
263 - }  
264 - &__header{  
265 - padding: 5px 15px;  
266 - background: #f8f8f8;  
267 - border-bottom: 1px solid #eee;  
268 - display: flex;  
269 - align-items: center;  
270 - justify-content: space-between;  
271 - }  
272 - &__author{  
273 - font-weight: 700;  
274 - font-size: 14px;  
275 - color: #999;  
276 - }  
277 - &__main{  
278 - flex:1;  
279 - margin: 0 20px;  
280 - position: relative;  
281 - border: 1px solid #dedede;  
282 - border-radius: 2px;  
283 - &:before,&:after{  
284 - position: absolute;  
285 - top: 10px;  
286 - left: -8px;  
287 - right: 100%;  
288 - width: 0;  
289 - height: 0;  
290 - display: block;  
291 - content: " ";  
292 - border-color: transparent;  
293 - border-style: solid solid outset;  
294 - border-width: 8px 8px 8px 0;  
295 - pointer-events: none;  
296 - }  
297 - &:before {  
298 - border-right-color: #dedede;  
299 - z-index: 1;  
300 - }  
301 - &:after{  
302 - border-right-color: #f8f8f8;  
303 - margin-left: 1px;  
304 - z-index: 2;  
305 - }  
306 - }  
307 - &__body{  
308 - padding: 15px;  
309 - overflow: hidden;  
310 - background: #fff;  
311 - font-family: Segoe UI,Lucida Grande,Helvetica,Arial,Microsoft YaHei,FreeSans,Arimo,Droid Sans,wenquanyi micro hei,Hiragino Sans GB,Hiragino Sans GB W3,FontAwesome,sans-serif;color: #333;  
312 - font-size: 14px;  
313 - }  
314 - blockquote{  
315 - margin:0;  
316 - font-family: Georgia,Times New Roman,Times,Kai,Kaiti SC,KaiTi,BiauKai,FontAwesome,serif;  
317 - padding: 1px 0 1px 15px;  
318 - border-left: 4px solid #ddd;  
319 - }  
320 -}  
321 -</style>  
322 -<style lang="scss" scoped>  
323 -.msg-main{ 233 +/* 因为 joolun 实现依赖 avue 组件,该页面使用了 comment.scss、card.scc */
  234 +@import './comment.scss';
  235 +@import './card.scss';
  236 +
  237 +.msg-main {
324 margin-top: -30px; 238 margin-top: -30px;
325 padding: 10px; 239 padding: 10px;
326 } 240 }
327 -.msg-div{ 241 +.msg-div {
328 height: 50vh; 242 height: 50vh;
329 overflow: auto; 243 overflow: auto;
330 background-color: #eaeaea; 244 background-color: #eaeaea;
331 } 245 }
332 -.msg-send{ 246 +.msg-send {
333 padding: 10px; 247 padding: 10px;
334 } 248 }
335 -.avue-comment__main{ 249 +.avue-comment__main {
336 flex: unset!important; 250 flex: unset!important;
337 border-radius: 5px!important; 251 border-radius: 5px!important;
338 margin: 0 8px!important; 252 margin: 0 8px!important;
339 } 253 }
340 -.avue-comment__header{ 254 +.avue-comment__header {
341 border-top-left-radius: 5px; 255 border-top-left-radius: 5px;
342 border-top-right-radius: 5px; 256 border-top-right-radius: 5px;
343 } 257 }
@@ -345,11 +259,11 @@ @@ -345,11 +259,11 @@
345 border-bottom-right-radius: 5px; 259 border-bottom-right-radius: 5px;
346 border-bottom-left-radius: 5px; 260 border-bottom-left-radius: 5px;
347 } 261 }
348 -.avatar-div{ 262 +.avatar-div {
349 text-align: center; 263 text-align: center;
350 width: 80px; 264 width: 80px;
351 } 265 }
352 -.send-but{ 266 +.send-but {
353 float: right; 267 float: right;
354 margin-top: 8px!important; 268 margin-top: 8px!important;
355 } 269 }
yudao-ui-admin/src/views/mp/message/index.vue
@@ -40,6 +40,12 @@ @@ -40,6 +40,12 @@
40 </template> 40 </template>
41 </el-table-column> 41 </el-table-column>
42 <el-table-column label="消息类型" align="center" prop="type" width="80"/> 42 <el-table-column label="消息类型" align="center" prop="type" width="80"/>
  43 + <el-table-column label="发送方" align="center" prop="sendFrom" width="80">
  44 + <template slot-scope="scope">
  45 + <el-tag v-if="scope.row.sendFrom === 1" type="success">用户</el-tag>
  46 + <el-tag v-else type="info">公众号</el-tag>
  47 + </template>
  48 + </el-table-column>
43 <el-table-column label="用户标识" align="center" prop="openid" width="300" /> 49 <el-table-column label="用户标识" align="center" prop="openid" width="300" />
44 <!-- TODO 芋艿:发送/接收 --> 50 <!-- TODO 芋艿:发送/接收 -->
45 <el-table-column label="内容" prop="content"> 51 <el-table-column label="内容" prop="content">