|
@@ -1,32 +1,33 @@
|
|
|
<template>
|
|
|
<div class="j-container message-detail">
|
|
|
- <div class="j-main" ref="main" v-show="!emptyShow">
|
|
|
+ <div v-show="!emptyShow" ref="main" class="j-main">
|
|
|
<van-list
|
|
|
- ref="listRef"
|
|
|
- v-model="listState.loading"
|
|
|
- :finished="listState.finished"
|
|
|
- :offset="listState.offset"
|
|
|
- direction="up"
|
|
|
- finished-text=""
|
|
|
- @load="getList"
|
|
|
+ ref="listRef" v-model="listState.loading" :finished="listState.finished" :offset="listState.offset"
|
|
|
+ direction="up" finished-text="" @load="getList"
|
|
|
>
|
|
|
- <div class="d-list" v-for="item in listState.list" :key="item.id">
|
|
|
- <p class="list-time">{{ item.createTime }}</p>
|
|
|
+ <div v-for="item in listState.list" :key="item.id" class="d-list">
|
|
|
+ <p class="list-time">
|
|
|
+ {{ item.createTime }}
|
|
|
+ </p>
|
|
|
<div class="list-main">
|
|
|
- <div class="red-hot" v-if="item.isRead === 0"></div>
|
|
|
- <img class="list-icon" :src="item.icon" />
|
|
|
+ <div v-if="item.isRead === 0" class="red-hot" />
|
|
|
+ <img class="list-icon" :src="item.icon">
|
|
|
<div class="list-words clickable" @click="onMsgClick(item)">
|
|
|
- <span class="triangle"></span>
|
|
|
- <p class="l-w-title">{{ item.title }}</p>
|
|
|
- <p class="l-w-content" v-html="item.content"></p>
|
|
|
+ <span class="triangle" />
|
|
|
+ <p class="l-w-title">
|
|
|
+ {{ item.title }}
|
|
|
+ </p>
|
|
|
+ <p class="l-w-content" v-html="item.content" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</van-list>
|
|
|
</div>
|
|
|
- <div class="j-main" v-show="emptyShow">
|
|
|
+ <div v-show="emptyShow" class="j-main">
|
|
|
<AppEmpty>
|
|
|
- <p slot="default">暂无消息</p>
|
|
|
+ <p slot="default">
|
|
|
+ 暂无消息
|
|
|
+ </p>
|
|
|
</AppEmpty>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -35,9 +36,9 @@
|
|
|
<script>
|
|
|
import { List } from 'vant'
|
|
|
import {
|
|
|
- ajaxMessageList,
|
|
|
+ ajaxAppClickMessage,
|
|
|
ajaxMarkRead,
|
|
|
- ajaxAppClickMessage
|
|
|
+ ajaxMessageList
|
|
|
} from '@/api/modules'
|
|
|
import { dateFormatter } from '@/utils/date/'
|
|
|
import { mixinHeader } from '@/utils/mixins/header'
|
|
@@ -49,11 +50,11 @@ import { openLinkOfOther, replaceKeyword } from '@/utils'
|
|
|
|
|
|
export default {
|
|
|
name: 'AppMessageDetail',
|
|
|
- mixins: [mixinHeader],
|
|
|
components: {
|
|
|
[List.name]: List,
|
|
|
[AppEmpty.name]: AppEmpty
|
|
|
},
|
|
|
+ mixins: [mixinHeader],
|
|
|
data() {
|
|
|
return {
|
|
|
pageLayoutConf: {
|
|
@@ -88,7 +89,8 @@ export default {
|
|
|
this.restored = this.restoreState()
|
|
|
if (this.restored) {
|
|
|
this.mergePageConf()
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
this.type = this.$route.query?.type
|
|
|
this.isClassSearch = this.$route.query?.isClassSearch
|
|
|
}
|
|
@@ -104,9 +106,9 @@ export default {
|
|
|
// this.appClickMsg(this.type)
|
|
|
this.listState.loading = true
|
|
|
try {
|
|
|
- let { data, total, column } = await ajaxMessageList({
|
|
|
+ const { data, total, column } = await ajaxMessageList({
|
|
|
offset: this.listState.pageNum,
|
|
|
- msgType: parseInt(this.type),
|
|
|
+ msgType: Number.parseInt(this.type),
|
|
|
isColumn: true,
|
|
|
isColumnNewMsg: false,
|
|
|
isRead: -1,
|
|
@@ -116,7 +118,7 @@ export default {
|
|
|
})
|
|
|
let selectData = []
|
|
|
if (Array.isArray(column)) {
|
|
|
- selectData = column.filter((m) => m.msg_type === parseInt(this.type))
|
|
|
+ selectData = column.filter(m => m.msg_type === Number.parseInt(this.type))
|
|
|
this.setDocumentTitle(selectData[0])
|
|
|
}
|
|
|
if (Array.isArray(data) && data.length > 0) {
|
|
@@ -124,7 +126,7 @@ export default {
|
|
|
.map((v) => {
|
|
|
const arr = ['点击前往支付>>', '请再次购买>>', '前往续费>>']
|
|
|
arr.forEach((r, i) => {
|
|
|
- if (v.content.indexOf(r) !== -1) {
|
|
|
+ if (v.content.includes(r)) {
|
|
|
v.content = replaceKeyword(v.content, r)
|
|
|
}
|
|
|
})
|
|
@@ -138,7 +140,8 @@ export default {
|
|
|
content: v.content,
|
|
|
msgType: v.msg_type,
|
|
|
link: v.link,
|
|
|
- url: v.url
|
|
|
+ url: v.url,
|
|
|
+ realType: v.realType
|
|
|
}
|
|
|
})
|
|
|
.reverse()
|
|
@@ -154,28 +157,33 @@ export default {
|
|
|
// 必须在list赋值后,loading结束前进行滚动,才不会直接触发加载下页
|
|
|
if (this.listState.pageNum <= 1) {
|
|
|
this.scrollToBottom()
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
this.scrollTo()
|
|
|
}
|
|
|
|
|
|
if (
|
|
|
- this.listState.pageNum * this.listState.pageSize <
|
|
|
- this.listState.total
|
|
|
+ this.listState.pageNum * this.listState.pageSize
|
|
|
+ < this.listState.total
|
|
|
) {
|
|
|
this.listState.loading = false
|
|
|
this.listState.pageNum++
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
this.listState.finished = true
|
|
|
}
|
|
|
})
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
this.listState.finished = true
|
|
|
this.$forceUpdate()
|
|
|
}
|
|
|
- } catch (error) {
|
|
|
+ }
|
|
|
+ catch (error) {
|
|
|
this.listState.finished = true
|
|
|
console.log(error)
|
|
|
- } finally {
|
|
|
+ }
|
|
|
+ finally {
|
|
|
this.listState.loaded = true
|
|
|
}
|
|
|
},
|
|
@@ -186,15 +194,22 @@ export default {
|
|
|
if (inWX) {
|
|
|
if (url.weChatUrl) {
|
|
|
this.wxLocationTo(url.weChatUrl)
|
|
|
- } else {
|
|
|
- this.setLinkDetail(item)
|
|
|
}
|
|
|
- } else {
|
|
|
+ else {
|
|
|
+ if (item.realType === 14) {
|
|
|
+ this.gomaterialDetail(item)
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ this.setLinkDetail(item)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
let toLink = inIOS ? url.iosUrl : url.androidUrl
|
|
|
if (toLink) {
|
|
|
const hasHttp = /^http(s)?:\/\//.test(toLink)
|
|
|
if (!hasHttp && toLink[0] !== '/') {
|
|
|
- toLink = '/' + toLink
|
|
|
+ toLink = `/${toLink}`
|
|
|
}
|
|
|
// 检查是否tabBar页面
|
|
|
const tabBarKey = checkNowInAppTabbarPage(toLink)
|
|
@@ -202,12 +217,19 @@ export default {
|
|
|
// 刷新客户端对应 tabBar页面
|
|
|
appCallReloadTab(tabBarKey, 1)
|
|
|
callChangeTab(tabBarKey)
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
appCallReloadTab('search', 0)
|
|
|
openLinkOfOther(toLink)
|
|
|
}
|
|
|
- } else {
|
|
|
- this.setLinkDetail(item)
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (item.realType === 14) {
|
|
|
+ this.gomaterialDetail(item)
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ this.setLinkDetail(item)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
},
|
|
@@ -222,7 +244,7 @@ export default {
|
|
|
async onMsgClick(item) {
|
|
|
item.isRead = 1
|
|
|
const { code } = await ajaxMarkRead({
|
|
|
- msgId: parseInt(item.id)
|
|
|
+ msgId: Number.parseInt(item.id)
|
|
|
})
|
|
|
if (code === 0) {
|
|
|
this.saveState()
|
|
@@ -240,17 +262,29 @@ export default {
|
|
|
})
|
|
|
}, 1000)
|
|
|
},
|
|
|
+ gomaterialDetail(item) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.$router.push({
|
|
|
+ path: '/message/materialDetail',
|
|
|
+ query: {
|
|
|
+ msgLogId: item.msgLogId,
|
|
|
+ id: item.id
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }, 1000)
|
|
|
+ },
|
|
|
// 微信端跳转
|
|
|
wxLocationTo(url) {
|
|
|
// 链接中如果是www.jianyu360.cn域名,微信中会唤起app,该用window.open
|
|
|
// window.open(url)
|
|
|
// window.open在安卓正常,但是ios无法跳转。改为location.href跳转
|
|
|
- if (!url) return
|
|
|
+ if (!url)
|
|
|
+ return
|
|
|
location.href = url
|
|
|
},
|
|
|
saveState() {
|
|
|
const { main } = this.$refs
|
|
|
- this.listState.scrollTop = main ? parseInt(main.scrollTop) : 0
|
|
|
+ this.listState.scrollTop = main ? Number.parseInt(main.scrollTop) : 0
|
|
|
this.$storage.set(
|
|
|
this.$route.path,
|
|
|
{
|
|
@@ -309,16 +343,20 @@ export default {
|
|
|
line-height: 24px;
|
|
|
color: $gray_9;
|
|
|
}
|
|
|
+
|
|
|
.message-detail {
|
|
|
.j-main {
|
|
|
padding: 0 24px 0 12px;
|
|
|
}
|
|
|
+
|
|
|
.d-list {
|
|
|
margin-top: 24px;
|
|
|
+
|
|
|
&:last-of-type {
|
|
|
padding-bottom: 24px;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.list-time {
|
|
|
font-size: 11px;
|
|
|
color: $gray_6;
|
|
@@ -326,10 +364,12 @@ export default {
|
|
|
text-align: center;
|
|
|
padding-left: 12px;
|
|
|
}
|
|
|
+
|
|
|
.list-main {
|
|
|
position: relative;
|
|
|
display: flex;
|
|
|
margin-top: 8px;
|
|
|
+
|
|
|
.red-hot {
|
|
|
position: absolute;
|
|
|
top: 1px;
|
|
@@ -340,12 +380,14 @@ export default {
|
|
|
background: #fb483d;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.list-icon {
|
|
|
width: 40px;
|
|
|
height: 40px;
|
|
|
flex-shrink: 0;
|
|
|
margin-right: 16px;
|
|
|
}
|
|
|
+
|
|
|
.list-words {
|
|
|
position: relative;
|
|
|
flex: 1;
|
|
@@ -355,10 +397,12 @@ export default {
|
|
|
box-shadow: 0px 2px 8px 0px rgb(54 147 179 / 5%);
|
|
|
z-index: 2;
|
|
|
word-break: break-word;
|
|
|
+
|
|
|
&::before {
|
|
|
z-index: 3;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.triangle {
|
|
|
position: absolute;
|
|
|
left: -8px;
|
|
@@ -369,10 +413,12 @@ export default {
|
|
|
border-bottom: 8px solid transparent;
|
|
|
border-right: 12px solid #fff;
|
|
|
}
|
|
|
+
|
|
|
.l-w-title {
|
|
|
font-weight: 700;
|
|
|
@extend %base-text;
|
|
|
}
|
|
|
+
|
|
|
.l-w-content {
|
|
|
margin-top: 4px;
|
|
|
font-size: 13px;
|