doum
2026-04-25 b7d451c91ec40bee70f23b1e2cf6a8797643faef
app/App.vue
@@ -1,17 +1,141 @@
<script>
   import { mapState } from 'vuex'
   export default {
      data() {
         return {
            locationTimer: null,
            jpushModule: null
         }
      },
      computed: {
         ...mapState(['userInfo'])
         ...mapState(['userInfo', 'token'])
      },
      watch: {
         token(newVal) {
            if (newVal) {
               this.startLocationPolling()
               this.bindJPushAlias()
            } else {
               this.stopLocationPolling()
               this.deleteJPushAlias()
            }
         }
      },
      onLaunch: function() {
         this.initJPush()
         this.checkAndStartLocationPolling()
      },
      onShow: function() {
         console.log('App Show')
         this.checkAndStartLocationPolling()
      },
      onHide: function() {
         console.log('App Hide')
         this.stopLocationPolling()
      },
      methods: {
         initJPush() {
            const jpushModule = uni.requireNativePlugin('JPush')
            if (!jpushModule) {
               console.log('极光推送插件未找到,请先安装插件')
               return
            }
            this.jpushModule = jpushModule
            jpushModule.init()
            console.log('极光推送初始化成功')
            jpushModule.setLoggerEnable(true)
            jpushModule.addReceiveNotificationListener((result) => {
               console.log('收到通知:', JSON.stringify(result))
               const extras = result.extras || {}
               if (extras.type === 'order') {
                  uni.$emit('jpush_order_notification', extras)
               }
            })
            jpushModule.addReceiveOpenNotificationListener((result) => {
               console.log('点击通知:', JSON.stringify(result))
               const extras = result.extras || {}
               if (extras.type === 'order') {
                  uni.navigateTo({
                     url: '/pages/order-detail/order-detail?id=' + extras.orderId
                  })
               } else if (extras.type === 'message') {
                  uni.switchTab({
                     url: '/pages/message/message'
                  })
               }
            })
            jpushModule.addReceiveMessageListener((result) => {
               console.log('收到透传消息:', JSON.stringify(result))
            })
            jpushModule.getRegistrationID((res) => {
               console.log('JPush RegistrationID:', res)
               if (res && res.registerID) {
                  uni.setStorageSync('jpush_registration_id', res.registerID)
               }
            })
         },
         bindJPushAlias() {
            if (!this.jpushModule || !this.token) return
            const userId = this.$store.state.userInfo?.id || ''
            if (userId) {
               this.jpushModule.setAlias({
                  alias: String(userId),
                  sequence: Date.now()
               }, (result) => {
                  console.log('设置极光别名成功:', JSON.stringify(result))
               })
            }
         },
         deleteJPushAlias() {
            if (!this.jpushModule) return
            this.jpushModule.deleteAlias({
               sequence: Date.now()
            }, (result) => {
               console.log('删除极光别名成功:', JSON.stringify(result))
            })
         },
         checkAndStartLocationPolling() {
            if (this.token) {
               this.startLocationPolling()
            }
         },
         startLocationPolling() {
            this.stopLocationPolling()
            this.updateLocation()
            this.locationTimer = setInterval(() => {
               this.updateLocation()
            }, 60000)
         },
         stopLocationPolling() {
            if (this.locationTimer) {
               clearInterval(this.locationTimer)
               this.locationTimer = null
            }
         },
         updateLocation() {
            uni.getLocation({
               type: 'gcj02',
               success: (res) => {
                  console.log(res)
                  this.$u.api.updateLocation({
                     latitude: res.latitude,
                     longitude: res.longitude
                  })
               }
            })
         }
      }
   }
</script>