import type { AppProduct } from '@/api/app/appProduct/model' import { APP_TYPE } from '@/api/app/appProduct/model' /** 入口动作类型 */ export type EntryType = | 'visit-site' // 访问网站 | 'scan-qr' // 扫码体验(小程序) | 'download' // 下载安装 | 'admin' // 管理后台 /** 单个入口配置 */ export interface AppEntry { type: EntryType label: string /** Ant Design 图标组件名 */ icon: string url?: string available: boolean isPrimary: boolean } /** 扫码提示文案映射 */ const SCAN_TIPS: Record = { [APP_TYPE.WECHAT_MP]: '打开微信扫一扫体验', [APP_TYPE.DOUYIN_MP]: '打开抖音扫一扫体验', [APP_TYPE.BAIDU_MP]: '打开百度APP扫一扫体验', [APP_TYPE.ALIPAY_MP]: '打开支付宝扫一扫体验', } /** 小程序 appType 集合 */ const MINI_PROGRAM_TYPES = new Set([ APP_TYPE.WECHAT_MP, APP_TYPE.DOUYIN_MP, APP_TYPE.BAIDU_MP, APP_TYPE.ALIPAY_MP, ]) /** 移动端/桌面端 appType 集合 */ const INSTALLABLE_TYPES = new Set([ APP_TYPE.ANDROID, APP_TYPE.IOS, APP_TYPE.MACOS, APP_TYPE.WINDOWS, ]) /** * 解析 Web 应用的前台 URL * 优先使用显式配置的 homeUrl,否则用 domain + prefix 拼接 */ export function resolveWebHomeUrl(app: AppProduct): string | null { if (app.homeUrl) return app.homeUrl if (app.domain) { const prefix = app.prefix ? `/${app.prefix.replace(/^\//, '')}` : '' return `https://${app.domain}${prefix}` } return null } /** * 获取应用的所有可用入口(按优先级排列) */ export function getAppEntries(app: AppProduct): AppEntry[] { const entries: AppEntry[] = [] const type = app.appType // 1. 访问网站(仅 Web 应用) if (type === APP_TYPE.WEBSITE) { const url = resolveWebHomeUrl(app) entries.push({ type: 'visit-site', label: '访问网站', icon: 'GlobalOutlined', url: url || undefined, available: !!url, isPrimary: true, }) } // 2. 扫码体验(小程序类型) if (type && MINI_PROGRAM_TYPES.has(type)) { entries.push({ type: 'scan-qr', label: '扫码体验', icon: 'QrcodeOutlined', url: app.qrcode, available: !!app.qrcode, isPrimary: true, }) } // 3. 下载安装(移动端 / 桌面端) if (type && INSTALLABLE_TYPES.has(type)) { entries.push({ type: 'download', label: '下载安装', icon: 'DownloadOutlined', url: app.downloadUrl, available: !!app.downloadUrl, isPrimary: true, }) } // 4. 管理后台(所有类型通用) entries.push({ type: 'admin', label: '管理后台', icon: 'SettingOutlined', url: app.adminUrl, available: !!app.adminUrl, // 插件的后台即主入口 isPrimary: type === APP_TYPE.PLUGIN, }) return entries } /** * 获取主入口 */ export function getPrimaryEntry(app: AppProduct): AppEntry | null { return getAppEntries(app).find(e => e.isPrimary && e.available) || null } /** * 获取扫码提示文案 */ export function getScanTip(appType: number): string { return SCAN_TIPS[appType] || '扫一扫体验' } /** * 执行入口动作(返回是否由调用方自行处理,如扫码弹窗) */ export function executeEntry(entry: AppEntry): boolean { if (!entry.available) return false switch (entry.type) { case 'visit-site': case 'download': case 'admin': window.open(entry.url, '_blank', 'noreferrer') return false case 'scan-qr': // 需要调用方弹出二维码弹窗 return true default: return false } }