From 34ea207639539bdb29bde3df078a7efe0d0cf192 Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 13 Jan 2026 18:25:59 +0800
Subject: [PATCH] 1
---
src/App.vue | 242 +++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 225 insertions(+), 17 deletions(-)
diff --git a/src/App.vue b/src/App.vue
index ab6cfa1..5a9b2a5 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -3,12 +3,22 @@
<div :class="`header-box`" v-if="hasHeader && title !== $t('hj248')">
<mt-header :title="title">
<mt-button icon="back" slot="left" @click="$router.go(-1)"></mt-button>
- <div v-if="!is_Show">
- <template v-if="iconRight == 'search'">
- <img slot="right" class="search-right" src="./assets/ico/fangdajing.png" alt />
- </template>
- <template v-else>
- <mt-button icon="more" slot="right"></mt-button>
+ <div slot="right" class="header-right">
+ <!-- 消息图标 - 始终显示(如果已登录) -->
+ <div class="message-icon-wrapper" @click="goToMessage" v-if="isLoggedIn">
+ <!-- <svg class="message-icon" viewBox="0 0 24 24" fill="currentColor">
+ <path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/>
+ </svg> -->
+ <span v-if="unreadCount > 0" class="message-badge">{{ unreadCount > 99 ? '99+' : unreadCount }}</span>
+ </div>
+ <!-- 其他图标 -->
+ <template v-if="!is_Show">
+ <template v-if="iconRight == 'search'">
+ <img class="search-right" src="./assets/ico/fangdajing.png" alt />
+ </template>
+ <template v-else-if="iconRight != 'message'">
+ <mt-button icon="more"></mt-button>
+ </template>
</template>
</div>
</mt-header>
@@ -28,6 +38,7 @@
import elalert from "@/components/elalert.vue";
import foot from "@/components/foot.vue";
import loginPopup from "@/components/loginDialog.vue";
+import * as api from "@/axios/api";
//引入css
import "@/assets/iconfont/iconfont.css";
import "@/assets/iconfont/iconfont.ttf";
@@ -61,6 +72,49 @@
}
// this.$store.state.className = window.localStorage.getItem('styleName')?window.localStorage.getItem('styleName'):'red'
},
+ data() {
+ return {
+ title: this.$t('hj224'),
+ hasHeader: false,
+ iconRight: "default",
+ transitionName: '',
+ is_Show: true,
+ is_foot: true,
+ unreadCount: 0,
+ messageTimer: null,
+ loginCheckTimer: null,
+ lastToken: null,
+ };
+ },
+ computed: {
+ isLoggedIn() {
+ // 实时检查登录状态
+ return !!window.localStorage.getItem("USERTOKEN");
+ }
+ },
+ mounted() {
+ // 初始化时检查登录状态并获取消息数
+ this.checkLoginAndLoadMessages();
+
+ // 监听localStorage变化(用于跨标签页同步)
+ window.addEventListener('storage', this.handleStorageChange);
+
+ // 定期检查登录状态(处理同标签页内的登录/登出)
+ this.loginCheckTimer = setInterval(() => {
+ this.checkLoginAndLoadMessages();
+ }, 1000);
+ },
+ beforeDestroy() {
+ // 清除定时器
+ if (this.messageTimer) {
+ clearInterval(this.messageTimer);
+ }
+ if (this.loginCheckTimer) {
+ clearInterval(this.loginCheckTimer);
+ }
+ // 移除事件监听
+ window.removeEventListener('storage', this.handleStorageChange);
+ },
watch: {
$route(to, from) {
let title = to.meta.title || this.$t('hj224');
@@ -84,17 +138,10 @@
console.log("slide-right");
this.transitionName = "slide-right";
}
+
+ // 路由变化时,如果已登录则刷新未读消息数
+ this.checkLoginAndLoadMessages();
}
- },
- data() {
- return {
- title: this.$t('hj224'),
- hasHeader: false,
- iconRight: "default",
- transitionName: '',
- is_Show: true,
- is_foot: true,
- };
},
methods: {
footColse() {
@@ -102,12 +149,91 @@
},
dialogClose() {
this.$store.commit('dialogVisible', false);
+ },
+ // 跳转到消息页面
+ goToMessage() {
+ this.$router.push('/notify');
+ },
+ // 获取未读消息数
+ async getUnreadCount() {
+ try {
+ console.log('开始获取未读消息数...');
+ const data = await api.getUnreadCount();
+ console.log('未读消息数API响应:', data);
+ if (data && data.status === 0) {
+ this.unreadCount = data.data || 0;
+ console.log('未读消息数:', this.unreadCount);
+ } else {
+ console.warn('获取未读消息数失败:', data ? data.msg : '响应为空');
+ this.unreadCount = 0;
+ }
+ } catch (error) {
+ console.error('获取未读消息数异常:', error);
+ this.unreadCount = 0;
+ }
+ },
+ // 开始轮询未读消息数(每30秒)
+ startMessagePolling() {
+ // 如果已有定时器,先清除
+ if (this.messageTimer) {
+ clearInterval(this.messageTimer);
+ }
+ this.messageTimer = setInterval(() => {
+ if (this.isLoggedIn) {
+ this.getUnreadCount();
+ }
+ }, 30000);
+ },
+ // 检查登录状态并加载消息
+ checkLoginAndLoadMessages() {
+ const token = window.localStorage.getItem("USERTOKEN");
+ const isLoggedIn = !!token;
+
+ // 如果登录状态发生变化
+ if (this.lastToken !== token) {
+ this.lastToken = token;
+
+ if (isLoggedIn) {
+ console.log('检测到登录,开始加载消息');
+ this.getUnreadCount();
+ this.startMessagePolling();
+ } else {
+ console.log('检测到登出,清除消息');
+ this.unreadCount = 0;
+ if (this.messageTimer) {
+ clearInterval(this.messageTimer);
+ this.messageTimer = null;
+ }
+ }
+ } else if (isLoggedIn && !this.messageTimer) {
+ // 如果已登录但没有启动轮询,启动它
+ this.getUnreadCount();
+ this.startMessagePolling();
+ }
+ },
+ // 处理localStorage变化事件
+ handleStorageChange(e) {
+ if (e.key === 'USERTOKEN') {
+ this.checkLoginAndLoadMessages();
+ }
}
}
};
</script>
<style lang="less" scoped>
+// 全局隐藏滚动条
+/deep/ html,
+/deep/ body {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+ &::-webkit-scrollbar {
+ display: none; /* Chrome, Safari, Opera */
+ width: 0;
+ height: 0;
+ }
+}
+
/deep/ .van-list__finished-text {
line-height: 1.925926rem !important;
}
@@ -154,6 +280,14 @@
// height: calc(100% - 1rem);
box-sizing: border-box;
overflow-y: auto;
+ // 隐藏滚动条
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+ &::-webkit-scrollbar {
+ display: none; /* Chrome, Safari, Opera */
+ width: 0;
+ height: 0;
+ }
}
&.red-theme {
@@ -257,7 +391,6 @@
color: #000;
}
- /deep/.mint-tab-container {}
/deep/.mint-tab-item {
background: #272733;
@@ -311,4 +444,79 @@
/deep/.icon-icon_A::before {
font-size: 0.6rem !important;
}
+
+.header-right {
+ display: flex;
+ align-items: center;
+ gap: 0.2rem;
+}
+
+.message-icon-wrapper {
+ position: relative;
+ display: inline-block;
+ margin-right: 0.2rem;
+ cursor: pointer;
+}
+
+.message-icon {
+ width: 0.48rem;
+ height: 0.48rem;
+ color: rgba(255, 255, 255, 0.8);
+ cursor: pointer;
+}
+
+.message-badge {
+ position: absolute;
+ top: -0.1rem;
+ right: -0.1rem;
+ min-width: 0.32rem;
+ height: 0.32rem;
+ line-height: 0.32rem;
+ padding: 0 0.08rem;
+ background-color: #ff4444;
+ color: #fff;
+ border-radius: 0.16rem;
+ font-size: 0.2rem;
+ text-align: center;
+ font-weight: bold;
+ border: 0.02rem solid #fff;
+}
+
+#app.red-theme {
+ .message-icon {
+ color: #212121;
+ }
+
+ .message-badge {
+ border-color: #fff;
+ }
+}
+</style>
+
+<style lang="less">
+/* 全局隐藏滚动条 - 确保整个项目都不显示滚动条 */
+html,
+body {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+}
+
+html::-webkit-scrollbar,
+body::-webkit-scrollbar {
+ display: none; /* Chrome, Safari, Opera */
+ width: 0;
+ height: 0;
+}
+
+/* 隐藏所有元素的滚动条 */
+* {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+}
+
+*::-webkit-scrollbar {
+ display: none; /* Chrome, Safari, Opera */
+ width: 0;
+ height: 0;
+}
</style>
--
Gitblit v1.9.3