You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.9 KiB
156 lines
4.9 KiB
<template>
|
|
<cu-custom bgColor="bg-white" :isBack="true">
|
|
<template #backText></template>
|
|
<template #content>消息</template>
|
|
</cu-custom>
|
|
<!-- #ifdef APP-PLUS -->
|
|
<scroll-view scroll-y style="height: 88vh;" @scrolltolower="scrollbot">
|
|
<!-- #endif -->
|
|
<!-- #ifdef H5 -->
|
|
<scroll-view scroll-y style="height: 93vh;" @scrolltolower="scrollbot">
|
|
<!-- #endif -->
|
|
<view v-for="(item,index) in filteredList" :key="index" class="flex align-center" @click="JumpDetails(item)">
|
|
<view style="padding: 25rpx 25rpx 25rpx 20rpx;">
|
|
<image :src="item.option_user.avatar" mode="widthFix" style="width: 80rpx;border-radius: 10rpx;"></image>
|
|
</view>
|
|
<view class="flex align-center" style="border-bottom: 1px solid #e7e7e7;padding: 25rpx 0px;width: 100%;margin-right: 30rpx;justify-content: space-between;">
|
|
<view>
|
|
<view style="color: #576b95;font-size: 16px;margin-bottom: 10rpx;">{{item.option_user.nickname}}</view>
|
|
<view v-if="item.content">
|
|
<mp-html container-style="overflow: hidden;display:inline;white-space: pre-wrap;font-size: 13px;line-break: anywhere;" :content="emojiToHtml(item.content)"/>
|
|
</view>
|
|
<view v-if="item.type==1">
|
|
<uni-icons type="heart" size="15" color="#576b95"></uni-icons>
|
|
</view>
|
|
<view style="font-size: 10px;margin-top: 10rpx;">{{item.create_time}}</view>
|
|
</view>
|
|
<view v-if="item.file.src">
|
|
<image :src="apiUrl+item.file.src" mode="widthFix" style="width: 80rpx;border-radius: 10rpx;margin-left: 20px;"></image>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view v-if="!showEarlier && hasUnread" @click="showEarlier = true" style="text-align: center; padding: 20rpx; color: #576b95;">
|
|
查看更早的消息...
|
|
</view>
|
|
<uni-load-more v-if="showEarlier" :status="status" :content-text="contentText"></uni-load-more>
|
|
</scroll-view>
|
|
</template>
|
|
|
|
<script>
|
|
import pinia from '@/store/index';
|
|
import config from "@/common/config";
|
|
import emoji from '@/utils/emoji.js';
|
|
import { useMsgStore } from '@/store/message';
|
|
|
|
const msgStore = useMsgStore(pinia)
|
|
export default {
|
|
data() {
|
|
return {
|
|
list:[],
|
|
apiUrl:config.apiUrl,
|
|
emojiMap:[],
|
|
page:1,
|
|
limit:20,
|
|
status: 'more',//状态
|
|
//显示的状态
|
|
contentText: {
|
|
contentdown: '查看更多',
|
|
contentrefresh: '加载中....',
|
|
contentnomore: '没有更多咯'
|
|
},
|
|
showEarlier: false, // 控制是否显示更早消息
|
|
hasUnread: false // 标记是否存在未读消息
|
|
}
|
|
},
|
|
computed: {
|
|
filteredList() {
|
|
if (this.showEarlier) {
|
|
// 显示所有已读消息(is_read=1)
|
|
return this.list.sort((a, b) => new Date(b.create_time) - new Date(a.create_time))
|
|
} else {
|
|
// 优先显示未读消息(is_read=0)
|
|
const unread = this.list.filter(item => item.is_read === 0);
|
|
return unread.length ? unread : this.list;
|
|
}
|
|
}
|
|
},
|
|
created() {
|
|
let emojiMap=[];
|
|
// 解析所有表情
|
|
emoji.forEach(function (item) {
|
|
let child=item.children;
|
|
if(child.length>0){
|
|
child.forEach(function (val) {
|
|
let name=val.name;
|
|
let src=val.src;
|
|
emojiMap[name]=src;
|
|
})
|
|
}
|
|
});
|
|
this.emojiMap=emojiMap;
|
|
},
|
|
onShow() {
|
|
this.getNoticeList()
|
|
},
|
|
methods: {
|
|
getNoticeList(){
|
|
let params = {page:this.page,limit:this.limit}
|
|
this.status = 'loading'; // 加载中
|
|
this.$api.compaApi.getNoticeList(params).then(res => {
|
|
// 判断是否还有更多数据
|
|
if (res.data.length <= res.count) {
|
|
this.status = 'noMore'; // 没有更多数据
|
|
} else {
|
|
this.status = 'more'; // 还有更多数据
|
|
}
|
|
|
|
this.list = res.data
|
|
msgStore.getCount(0);
|
|
this.hasUnread = this.list.some(item => item.is_read === 0)
|
|
// 默认按时间倒序排列(确保最新消息在顶部)
|
|
this.list.sort((a, b) => new Date(b.create_time) - new Date(a.create_time))
|
|
|
|
// 如果没有未读消息,直接显示所有已读
|
|
if (!this.hasUnread) {
|
|
this.showEarlier = true;
|
|
}
|
|
|
|
|
|
})
|
|
},
|
|
JumpDetails(item){
|
|
uni.navigateTo({
|
|
url:`/pages/compass/friendscircledetails?posts_id=${item.posts_id}&userid=${item.posts_user_id}`
|
|
})
|
|
},
|
|
scrollbot(){
|
|
if (this.status == 'noMore') {
|
|
return;
|
|
}
|
|
this.page++
|
|
this.getNoticeList()
|
|
// console.log('已触发底部事件');
|
|
},
|
|
// 自动解析消息中的表情
|
|
emojiToHtml(str){
|
|
if(!str){
|
|
return;
|
|
}
|
|
let emojiMap=this.emojiMap;
|
|
return str.replace(/\[!(\w+)\]/gi, function (str, match) {
|
|
var file = match;
|
|
return emojiMap[file] ? "<img class='mr-5' style=\"width:18px;height:18px\" emoji-name=\"".concat(match, "\" src=\"").concat(emojiMap[file], "\" />") : "[!".concat(match, "]");
|
|
});
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.load-more-button {
|
|
font-size: 28rpx;
|
|
color: #576b95;
|
|
padding: 30rpx 0;
|
|
border-top: 1px solid #e7e7e7;
|
|
}
|
|
</style>
|
|
|