wlzboy
2025-11-02 2cd31915236257e325b49f2e86f6912512e1f7ce
app/App.vue
@@ -5,14 +5,66 @@
  import { getUnreadCount } from '@/api/message'
  export default {
    data() {
      return {
        messagePollingTimer: null,
        lastToken: null // 用于检测 token 变化
      }
    },
    onLaunch: function() {
      this.lastToken = getToken()
      this.initApp()
      // 监听用户登录事件
      uni.$on('user-login', () => {
        console.log('接收到用户登录事件,启动消息轮询')
        const token = getToken()
        if (token) {
          this.lastToken = token
          this.updateUnreadMessageBadge()
          this.startMessagePolling()
        }
      })
      // 监听用户登出事件
      uni.$on('user-logout', () => {
        console.log('接收到用户登出事件,停止消息轮询')
        this.stopMessagePolling()
        this.lastToken = null
        // 清除消息徽标
        uni.removeTabBarBadge({ index: 3 })
      })
    },
    onShow: function() {
      // 应用显示时刷新未读消息数量
      if (getToken()) {
        this.updateUnreadMessageBadge()
      const currentToken = getToken()
      // 检测 token 变化:从有到无(登出)
      if (this.lastToken && !currentToken) {
        console.log('检测到用户已登出,停止消息轮询')
        this.stopMessagePolling()
        this.lastToken = currentToken
        return
      }
      // 检测 token 变化:从无到有(登录)
      if (!this.lastToken && currentToken) {
        console.log('检测到用户已登录,启动消息轮询')
        this.lastToken = currentToken
      }
      // 应用显示时刷新未读消息数量
      // 注意:只有已登录且不在登录页面时才调用
      if (currentToken && !this.isLoginPage()) {
        this.updateUnreadMessageBadge()
        // 重新启动轮询(如果之前已停止)
        if (!this.messagePollingTimer) {
          this.startMessagePolling()
        }
      }
    },
    onHide: function() {
      // 应用隐藏时停止轮询,节省资源
      this.stopMessagePolling()
    },
    methods: {
      // 初始化应用
@@ -24,12 +76,8 @@
        this.checkLogin()
        //#endif
        
        // 如果已登录,启动未读消息轮询
        if (getToken()) {
          this.updateUnreadMessageBadge()
          // 每30秒轮询一次
          this.startMessagePolling()
        }
        // 注意:不在应用启动时自动启动轮询
        // 只有在用户主动登录成功后才启动(通过 user-login 事件触发)
      },
      initConfig() {
        this.globalData.config = config
@@ -40,8 +88,26 @@
        }
      },
      
      // 判断当前是否在登录页面
      isLoginPage() {
        const pages = getCurrentPages()
        if (pages.length === 0) {
          return false
        }
        const currentPage = pages[pages.length - 1]
        const route = currentPage.route || ''
        // 判断是否为登录相关页面
        return route.includes('login') || route.includes('register')
      },
      // 更新未读消息徽标
      updateUnreadMessageBadge() {
        // 检查是否已登录,未登录则不请求
        if (!getToken()) {
          console.log('用户未登录,跳过获取未读消息数量')
          return
        }
        getUnreadCount().then(response => {
          const count = response.data || 0
          console.log('未读消息数量:', count)