app.js 2.87 KB
/*
 * @Date: 2025-06-28 10:33:00
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2026-01-07 20:54:02
 * @FilePath: /xyxBooking-weapp/src/app.js
 * @Description: 文件描述
 */
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import './app.less'
import { saveCurrentPagePath, needAuth, silentAuth, navigateToAuth } from '@/utils/authRedirect'
import Taro from '@tarojs/taro'
import { qrcodeListAPI } from '@/api/index'
import { formatDatetime } from '@/utils/tools'

const formatGroup = (data) => {
  let lastPayId = null;
  for (let i = 0; i < data.length; i++) {
    if (data[i].pay_id !== lastPayId) {
      data[i].sort = 1;
      lastPayId = data[i].pay_id;
    } else {
      data[i].sort = 0;
    }
  }
  return data;
}

const App = createApp({
    // 对应 onLaunch
  async onLaunch(options) {
    const path = options?.path || ''
    const query = options?.query || {}

    const query_string = Object.keys(query)
      .map((key) => `${key}=${encodeURIComponent(query[key])}`)
      .join('&')
    const full_path = query_string ? `${path}?${query_string}` : path

    if (full_path) {
      saveCurrentPagePath(full_path)
    }

    const preloadQrData = async () => {
        try {
            const { code, data } = await qrcodeListAPI();
            if (code && data) {
                data.forEach(item => {
                    item.qr_code_url = '/admin?m=srv&a=get_qrcode&key=' + item.qr_code;
                    item.datetime = formatDatetime({ begin_time: item.begin_time, end_time: item.end_time })
                    item.sort = 0;
                  });
                  const validData = data.filter(item => item.qr_code !== '');
                  if (validData.length > 0) {
                      const processed = formatGroup(validData);
                      Taro.setStorageSync('OFFLINE_QR_DATA', processed);
                  } else {
                      Taro.removeStorageSync('OFFLINE_QR_DATA');
                  }
            }
        } catch (e) {
            console.error('Preload QR failed', e);
        }
    };

    const checkNetworkAndPreload = () => {
        Taro.getNetworkType({
            success: (res) => {
                const isConnected = ['wifi', '4g', '5g', '3g'].includes(res.networkType);
                if (isConnected) {
                    preloadQrData();
                }
            }
        });
    };

    Taro.onNetworkStatusChange((res) => {
        if (res.isConnected) {
            preloadQrData();
        }
    });

    checkNetworkAndPreload();

    if (!needAuth()) return

    if (path === 'pages/auth/index') return

    try {
      await silentAuth()
      checkNetworkAndPreload();
    } catch (error) {
      navigateToAuth(full_path || undefined)
    }
  },
  onShow() {
  },
  // 入口组件不需要实现 render 方法,即使实现了也会被 taro 所覆盖
});

App.use(createPinia())

export default App