Newer
Older
dxCard-admin / src / electron / index.ts
YFJ on 23 Sep 2 KB 项目推送
import type {App} from "vue";
import {router} from "@/router";
import {useGlobSetting} from "@/hooks/setting";
import { ElectronEnum } from '/@/enums/jeecgEnum'
const glob = useGlobSetting();

const _PRELOAD_UTILS = ElectronEnum.ELECTRON_API;

export const $electron = {
  // 当前是否为Electron平台
  isElectron: () => glob.isElectronPlatform,

  // 通过浏览器打开链接
  openInBrowser: bindUtils('openInBrowser') as (url: string) => void,

  resolveRoutePath,
}

function bindUtils(n: string) {
  const fn = window[_PRELOAD_UTILS]?.[n];
  if (typeof fn?.bind === 'function') {
    return fn.bind(null);
  }
  return () => console.warn(`Electron preload util ${n} is not a function`);
}

// 解析路由路径
function resolveRoutePath(path: string) {
  return window.location.origin + window.location.pathname + router.resolve(path).href;
}

/**
 * 配置Electron
 */
export function setupElectron(_: App) {
  // 非Electron平台不执行
  if (!$electron.isElectron()) {
    return;
  }
  hookWindowOpen();
  // update-begin--author:liaozhiyang---date:20250725---for:【JHHB-13】桌面应用消息通知
  hookNavigate();
  // update-end--author:liaozhiyang---date:20250725---for:【JHHB-13】桌面应用消息通知
}
function hookNavigate() {
  // @ts-ignore
  window[ElectronEnum.ELECTRON_API].onNavigate((path) => {
    router.push({ path });
  });
}
function hookWindowOpen() {
  // 保存原生方法引用
  const originFunc = window.open;
  // 重写window.open方法
  window['open'] = function (url, windowName, windowFeatures) {
    url = typeof url === 'string' ? url.trim() : '';
    if (!url) {
      throw new Error('window.open: url is required');
    }
    // 判断是否以http或https开头
    if (/^https?:\/\//.test(url)) {
      // 判断是否为本地地址
      if (url.startsWith(window.location.origin) || url.startsWith(window['_CONFIG']['domianURL'])) {
        // 直接打开
        return originFunc(url, windowName, windowFeatures);
      }
      // 调用Electron进行外部浏览器打开
      return $electron.openInBrowser(url) as any;
    }
    // 自定义逻辑
    return originFunc(url, windowName, windowFeatures)
  }
}