Compare commits
6 Commits
94c09366bc
...
39847cbad4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39847cbad4 | ||
| a01194c726 | |||
| 253970b860 | |||
| f2bad7b3de | |||
| 6b9d720134 | |||
| e71caa6d69 |
2
App.vue
2
App.vue
@ -40,7 +40,7 @@ export default {
|
||||
if (success) {
|
||||
console.log("IM 初始化成功");
|
||||
// IM 初始化成功后,设置全局未读消息监听
|
||||
globalUnreadListenerManager.setup();
|
||||
// globalUnreadListenerManager.setup();
|
||||
} else {
|
||||
console.warn("IM 初始化失败");
|
||||
}
|
||||
|
||||
@ -1,31 +1,34 @@
|
||||
<template>
|
||||
<view class="article-detail-page">
|
||||
<view v-if="loading" class="loading-container">
|
||||
<uni-icons type="spinner-cycle" size="40" color="#999" />
|
||||
<text class="loading-text">加载中...</text>
|
||||
</view>
|
||||
|
||||
<view v-else-if="error" class="error-container">
|
||||
<text class="error-text">{{ error }}</text>
|
||||
<button class="retry-btn" @click="loadArticle">重试</button>
|
||||
</view>
|
||||
|
||||
<scroll-view v-else scroll-y class="article-content">
|
||||
<view class="article-header">
|
||||
<text class="article-title">{{ articleData.title }}</text>
|
||||
<text class="article-date">{{ articleData.date }}</text>
|
||||
<full-page mainClass="bg-white">
|
||||
<view class="article-detail-page">
|
||||
<view v-if="loading" class="loading-container">
|
||||
<uni-icons type="spinner-cycle" size="40" color="#999" />
|
||||
<text class="loading-text">加载中...</text>
|
||||
</view>
|
||||
<view class="article-body">
|
||||
<view class="rich-text-wrapper">
|
||||
<rich-text :nodes="articleData.content"></rich-text>
|
||||
|
||||
<view v-else-if="error" class="error-container">
|
||||
<text class="error-text">{{ error }}</text>
|
||||
<button class="retry-btn" @click="loadArticle">重试</button>
|
||||
</view>
|
||||
|
||||
<scroll-view v-else scroll-y class="article-content">
|
||||
<view class="article-header">
|
||||
<text class="article-title">{{ articleData.title }}</text>
|
||||
<text class="article-date">{{ articleData.date }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<view class="article-body">
|
||||
<view class="rich-text-wrapper">
|
||||
<rich-text :nodes="articleData.content"></rich-text>
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</full-page>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { onLoad } from "@dcloudio/uni-app";
|
||||
import FullPage from "@/components/full-page.vue";
|
||||
import api from "@/utils/api.js";
|
||||
import { ref } from "vue";
|
||||
import { storeToRefs } from "pinia";
|
||||
@ -40,7 +43,7 @@ const articleData = ref({
|
||||
});
|
||||
|
||||
let articleId = "";
|
||||
const corpId = ref('')
|
||||
const corpId = ref("");
|
||||
|
||||
const markArticleRead = async () => {
|
||||
const unionid = account.value?.unionid;
|
||||
@ -91,7 +94,10 @@ const loadArticle = async () => {
|
||||
loading.value = true;
|
||||
error.value = "";
|
||||
try {
|
||||
const res = await api("getArticle", { id: articleId, corpId: corpId.value });
|
||||
const res = await api("getArticle", {
|
||||
id: articleId,
|
||||
corpId: corpId.value,
|
||||
});
|
||||
|
||||
if (res.success && res.data) {
|
||||
// 格式化日期
|
||||
|
||||
@ -407,7 +407,7 @@ $primary-color: #0877F1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 12rpx 20rpx;
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
padding-bottom: 40rpx;
|
||||
gap: 12rpx;
|
||||
}
|
||||
|
||||
@ -514,7 +514,7 @@ $primary-color: #0877F1;
|
||||
background: #fff;
|
||||
border-top: 1rpx solid #eee;
|
||||
padding: 20rpx 0 20rpx 60rpx;
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
padding-bottom: 40rpx;
|
||||
gap: 40rpx 50rpx;
|
||||
flex-wrap: wrap;
|
||||
background-color: #f5f5f5;
|
||||
@ -544,7 +544,7 @@ $primary-color: #0877F1;
|
||||
background-color: white;
|
||||
border-top: 1rpx solid #e0e0e0;
|
||||
padding: 16rpx;
|
||||
margin-bottom: env(safe-area-inset-bottom);
|
||||
margin-bottom: 40rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
@ -689,7 +689,7 @@ $primary-color: #0877F1;
|
||||
width: 100%;
|
||||
max-height: 80vh;
|
||||
padding: 20rpx;
|
||||
padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
|
||||
padding-bottom: calc(20rpx + 40rpx);
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
@ -821,7 +821,7 @@ $primary-color: #0877F1;
|
||||
background-color: white;
|
||||
width: auto;
|
||||
padding: 32rpx 20rpx 48rpx 20rpx;
|
||||
padding-bottom: calc(48rpx + env(safe-area-inset-bottom));
|
||||
padding-bottom: calc(48rpx + 40rpx);
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
|
||||
@ -36,6 +36,8 @@ const handleApply = () => {
|
||||
padding: 20rpx 32rpx;
|
||||
background-color: #f5f5f5;
|
||||
box-sizing: border-box;
|
||||
position:absolute;
|
||||
bottom: 40rpx;
|
||||
}
|
||||
|
||||
.apply-card {
|
||||
|
||||
@ -12,11 +12,10 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
const emit = defineEmits(['cancel']);
|
||||
const emit = defineEmits(["cancel"]);
|
||||
|
||||
const handleCancel = () => {
|
||||
emit('cancel');
|
||||
emit("cancel");
|
||||
};
|
||||
</script>
|
||||
|
||||
@ -26,6 +25,8 @@ const handleCancel = () => {
|
||||
padding: 20rpx 32rpx;
|
||||
background-color: #f5f5f5;
|
||||
box-sizing: border-box;
|
||||
position: absolute;
|
||||
bottom: 40rpx;
|
||||
}
|
||||
|
||||
.cancel-card {
|
||||
|
||||
@ -47,7 +47,7 @@ export default function useGroupChat(groupID) {
|
||||
const getUserAvatar = (userId) => {
|
||||
const member = chatMember.value[userId]
|
||||
if (!member) {
|
||||
return userId === openid.value ? '/static/default-patient-avatar.png' : '/static/default-avatar.png'
|
||||
return userId === openid.value ? '/static/default-patient-avatar.png' : '/static/default-avatar.svg'
|
||||
}
|
||||
|
||||
// 如果有头像且不为空字符串,返回头像
|
||||
@ -55,11 +55,11 @@ export default function useGroupChat(groupID) {
|
||||
return member.avatar
|
||||
}
|
||||
|
||||
return member.isTeamMember ? '/static/default-avatar.png' : '/static/default-patient-avatar.png'
|
||||
return member.isTeamMember ? '/static/default-avatar.svg' : '/static/default-patient-avatar.png'
|
||||
}
|
||||
// 获取群聊信息和成员头像
|
||||
async function getGroupInfo() {
|
||||
const gid = typeof groupID === 'string' ? groupID : groupID.value
|
||||
async function getGroupInfo(id) {
|
||||
const gid = id || groupID;
|
||||
if (!gid) return
|
||||
|
||||
try {
|
||||
@ -73,10 +73,8 @@ export default function useGroupChat(groupID) {
|
||||
status: groupResult.data.orderStatus || 'active',
|
||||
teamId: groupResult.data.teamId
|
||||
}
|
||||
|
||||
// 2. 如果有teamId,获取团队成员头像和名称
|
||||
if (groupResult.data.teamId) {
|
||||
|
||||
const memberMap = await teamStore.getTeamMemberAvatarsAndName(groupResult.data.teamId)
|
||||
|
||||
// 3. 存储团队成员ID列表
|
||||
@ -112,13 +110,14 @@ export default function useGroupChat(groupID) {
|
||||
}
|
||||
}
|
||||
|
||||
onShow(() => {
|
||||
getGroupInfo()
|
||||
})
|
||||
// onShow(() => {
|
||||
|
||||
onUnload(() => {
|
||||
// 清理资源
|
||||
})
|
||||
// getGroupInfo()
|
||||
// })
|
||||
|
||||
// onUnload(() => {
|
||||
// // 清理资源
|
||||
// })
|
||||
|
||||
return {
|
||||
groupInfo,
|
||||
|
||||
@ -444,7 +444,7 @@ function getBubbleClass(message) {
|
||||
}
|
||||
|
||||
// 页面加载
|
||||
onLoad((options) => {
|
||||
onLoad(async (options) => {
|
||||
groupId.value = options.groupID || "";
|
||||
messageList.value = [];
|
||||
isLoading.value = false;
|
||||
@ -456,7 +456,7 @@ onLoad((options) => {
|
||||
if (options.userID) {
|
||||
chatInfo.value.userID = options.userID;
|
||||
}
|
||||
|
||||
await getGroupInfo(groupId.value);
|
||||
// 监听键盘高度变化
|
||||
uni.onKeyboardHeightChange((res) => {
|
||||
console.log("键盘高度变化:", res.height);
|
||||
@ -473,6 +473,8 @@ onLoad((options) => {
|
||||
}
|
||||
});
|
||||
|
||||
// 先获取群组信息和成员信息,确保 chatMember 已初始化
|
||||
|
||||
checkLoginAndInitTIM();
|
||||
updateNavigationTitle();
|
||||
});
|
||||
@ -563,7 +565,7 @@ const initTIMCallbacks = async () => {
|
||||
.then(async () => {
|
||||
console.log("✓ 收到新消息后已标记为已读");
|
||||
// 标记为已读后,立即刷新 tabBar 徽章
|
||||
await globalUnreadListenerManager.refreshBadge();
|
||||
// await globalUnreadListenerManager.refreshBadge();
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("✗ 标记已读失败:", error);
|
||||
@ -717,7 +719,7 @@ const loadMessageList = async () => {
|
||||
.then(async () => {
|
||||
console.log("✓ 会话已标记为已读:", chatInfo.value.conversationID);
|
||||
// 标记为已读后,立即刷新 tabBar 徽章
|
||||
await globalUnreadListenerManager.refreshBadge();
|
||||
// await globalUnreadListenerManager.refreshBadge();
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("✗ 标记会话已读失败:", error);
|
||||
@ -913,10 +915,10 @@ onHide(() => {
|
||||
timChatManager.currentConversationID = null;
|
||||
console.log("✓ 页面隐藏,已清空当前会话ID");
|
||||
|
||||
// 页面隐藏时刷新 tabBar 徽章,确保显示正确的未读数
|
||||
if (globalUnreadListenerManager.isInitialized) {
|
||||
globalUnreadListenerManager.refreshBadge();
|
||||
}
|
||||
// // 页面隐藏时刷新 tabBar 徽章,确保显示正确的未读数
|
||||
// if (globalUnreadListenerManager.isInitialized) {
|
||||
// globalUnreadListenerManager.refreshBadge();
|
||||
// }
|
||||
});
|
||||
|
||||
// 处理取消申请
|
||||
|
||||
@ -380,8 +380,8 @@ const setupConversationListener = () => {
|
||||
// 将回调添加到全局未读监听器的回调链中
|
||||
// 这样不会覆盖全局未读监听器,而是与之共存
|
||||
if (globalUnreadListenerManager.isInitialized) {
|
||||
globalUnreadListenerManager.addCallback("onConversationListUpdated", handleConversationListUpdate);
|
||||
globalUnreadListenerManager.addCallback("onMessageReceived", handleMessageReceived);
|
||||
// globalUnreadListenerManager.addCallback("onConversationListUpdated", handleConversationListUpdate);
|
||||
// globalUnreadListenerManager.addCallback("onMessageReceived", handleMessageReceived);
|
||||
console.log("【消息列表页】已添加回调到全局监听器回调链");
|
||||
} else {
|
||||
console.warn("【消息列表页】全局未读监听器未初始化,使用直接回调方式");
|
||||
@ -454,7 +454,7 @@ const handleClickConversation = async (conversation) => {
|
||||
console.log("✓ 已标记会话为已读:", conversation.conversationID);
|
||||
|
||||
// 立即刷新 tabBar 徽章
|
||||
await globalUnreadListenerManager.refreshBadge();
|
||||
// await globalUnreadListenerManager.refreshBadge();
|
||||
} catch (error) {
|
||||
console.error("✗ 标记会话已读失败:", error);
|
||||
}
|
||||
@ -514,9 +514,9 @@ const cleanMessageText = (text) => {
|
||||
// 页面显示
|
||||
onShow(async () => {
|
||||
// 页面显示时刷新 tabBar 徽章
|
||||
if (globalUnreadListenerManager.isInitialized) {
|
||||
await globalUnreadListenerManager.refreshBadge();
|
||||
}
|
||||
// if (globalUnreadListenerManager.isInitialized) {
|
||||
// await globalUnreadListenerManager.refreshBadge();
|
||||
// }
|
||||
});
|
||||
|
||||
// 页面隐藏
|
||||
@ -544,12 +544,12 @@ onUnmounted(() => {
|
||||
updateTimer = null;
|
||||
}
|
||||
|
||||
// 从全局未读监听器的回调链中移除本页面的回调
|
||||
if (globalUnreadListenerManager.isInitialized) {
|
||||
globalUnreadListenerManager.removeCallback("onConversationListUpdated", handleConversationListUpdate);
|
||||
globalUnreadListenerManager.removeCallback("onMessageReceived", handleMessageReceived);
|
||||
console.log("【消息列表页】已从回调链移除回调");
|
||||
}
|
||||
// // 从全局未读监听器的回调链中移除本页面的回调
|
||||
// if (globalUnreadListenerManager.isInitialized) {
|
||||
// globalUnreadListenerManager.removeCallback("onConversationListUpdated", handleConversationListUpdate);
|
||||
// globalUnreadListenerManager.removeCallback("onMessageReceived", handleMessageReceived);
|
||||
// console.log("【消息列表页】已从回调链移除回调");
|
||||
// }
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@ -79,7 +79,7 @@ export default defineStore("accountStore", () => {
|
||||
console.log('IM 初始化成功');
|
||||
|
||||
// IM 初始化成功后,设置全局未读消息监听
|
||||
globalUnreadListenerManager.setup();
|
||||
// globalUnreadListenerManager.setup();
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
@ -99,7 +99,7 @@ export default defineStore("accountStore", () => {
|
||||
|
||||
// 清除全局未读监听
|
||||
if (globalUnreadListenerManager.isInitialized) {
|
||||
globalUnreadListenerManager.destroy();
|
||||
// globalUnreadListenerManager.destroy();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('退出腾讯IM失败:', error);
|
||||
|
||||
@ -40,10 +40,10 @@ export default defineStore("teamStore", () => {
|
||||
|
||||
// 获取团队成员头像和名称映射
|
||||
async function getTeamMemberAvatarsAndName(teamId) {
|
||||
if (!teamId || !account.value?.corpId) return {};
|
||||
|
||||
if (!teamId) return {};
|
||||
const res = await api('getTeamMemberAvatarsAndName', {
|
||||
teamId,
|
||||
corpId: account.value.corpId
|
||||
teamId
|
||||
}, false);
|
||||
if (res && res.success && res.data) {
|
||||
return res.data;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user