app.js 3.92 KB
/*
 * @Date: 2025-06-28 10:33:00
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2026-01-08 19:36:25
 * @FilePath: /xyxBooking-weapp/src/app.js
 * @Description: 文件描述
 */
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import './utils/polyfill'
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'

/**
 * 格式化支付记录,按 pay_id 分组,相同 pay_id 下的记录 sort 为 0,否则为 1
 * @param {*} data 支付记录数组
 * @returns 格式化后的支付记录数组
 */
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)
    }

    /**
     * 预加载二维码数据
     * - 仅在有网络连接时调用
     * - 成功后将数据存储到本地缓存(key: OFFLINE_QR_DATA)
     * - 失败则移除缓存
     */
    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);
        }
    };

    /**
     * 检查网络状态并预加载二维码数据
     * - 仅在有网络连接时调用
     * - 成功后将数据存储到本地缓存(key: OFFLINE_QR_DATA)
     * - 失败则移除缓存
     */
    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) {
      console.error('静默授权失败:', error)
      // 授权失败后跳转到授权页,携带当前页路径作为回跳目标
      navigateToAuth(full_path || undefined)
    }
  },
  onShow() {
  },
  // 入口组件不需要实现 render 方法,即使实现了也会被 taro 所覆盖
});

App.use(createPinia())

export default App