diff --git a/src/typings/panel.d.ts b/src/typings/panel.d.ts index 362bf3f..778bd4a 100644 --- a/src/typings/panel.d.ts +++ b/src/typings/panel.d.ts @@ -13,6 +13,7 @@ declare namespace Panel { description?: string openMethod: number itemIconGroupId ?:number + time ?:number|string|null } interface ItemIconGroup extends Common.InfoBase { diff --git a/src/utils/functions/ping.ts b/src/utils/functions/ping.ts new file mode 100644 index 0000000..7a45a7e --- /dev/null +++ b/src/utils/functions/ping.ts @@ -0,0 +1,21 @@ +export function ping(url:string) { + return new Promise((resolve, reject) => { + var start = new Date().getTime(); + var xhr = new XMLHttpRequest(); + + xhr.onreadystatechange = function () { + if (xhr.readyState === XMLHttpRequest.DONE) { + var end = new Date().getTime(); + var time = end - start; + resolve(time); + } + }; + + xhr.onerror = function () { + reject(new Error('请求失败')); + }; + + xhr.open("GET", url, true); + xhr.send(); + }); +} diff --git a/src/utils/is/index.ts b/src/utils/is/index.ts index 27a8230..ed561a4 100644 --- a/src/utils/is/index.ts +++ b/src/utils/is/index.ts @@ -53,3 +53,36 @@ export function isMap>(value: T | unknown): value is T { export function isFile(value: T | unknown): value is T { return Object.prototype.toString.call(value) === '[object File]' } +/** + * @Author: wintsa + * @Date: 2024-03-18 16:32:53 + * @LastEditors: wintsa + * @Description: 判断ip是否为局域网 + * @return {*} + */ +export function isLocalUrl(url:string) { + // 创建一个 元素 + var anchor = document.createElement('a'); + // 设置其 href 属性为所检查的 URL + anchor.href = url; + // 获取主机名 + var hostname = anchor.hostname; + + // 检查主机名是否是局域网的 + // 这里假设局域网主机名的特征 + var ip = hostname.split('.'); + if ( + // 检查是否为localhost + hostname === 'localhost' || + // 检查是否为私有IP地址 + (ip.length === 4 && ( + ip[0] === '10' || + (ip[0] === '172' && parseInt(ip[1]) >= 16 && parseInt(ip[1]) <= 31) || + (ip[0] === '192' && ip[1] === '168') + )) + ) { + return true; + } else { + return false; + } +} diff --git a/src/views/home/components/AppIcon/index.vue b/src/views/home/components/AppIcon/index.vue index a5f3455..ec2b88d 100644 --- a/src/views/home/components/AppIcon/index.vue +++ b/src/views/home/components/AppIcon/index.vue @@ -37,21 +37,25 @@ const textColor = computed(() => { + + \ No newline at end of file diff --git a/src/views/home/index.vue b/src/views/home/index.vue index 030ad81..7bfb2eb 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -14,6 +14,8 @@ import { PanelPanelConfigStyleEnum, PanelStateNetworkModeEnum } from '@/enums' import { VisitMode } from '@/enums/auth' import { router } from '@/router' import { t } from '@/locales' +import { isLocalUrl } from '@/utils/is' +import { ping } from '@/utils/functions/ping' interface ItemGroup extends Panel.ItemIconGroup { sortStatus?: boolean @@ -76,10 +78,20 @@ function handleItemClick(itemGroupIndex: number, item: Panel.ItemInfo) { let jumpUrl = '' - if (item) - jumpUrl = (panelState.networkMode === PanelStateNetworkModeEnum.lan ? item.lanUrl : item.url) as string - if (item.lanUrl === '') + // if (item) + // jumpUrl = (panelState.networkMode === PanelStateNetworkModeEnum.lan ? item.lanUrl : item.url) as string + // if (item.lanUrl === '') + // jumpUrl = item.url + + //修改为自动判断目前为局域网/公网 + const isflag = isLocalUrl(window.location.origin) + + if (isflag && item.lanUrl) { + jumpUrl = item.lanUrl as string + + } else { jumpUrl = item.url + } openPage(item.openMethod, jumpUrl, item.title) } @@ -184,6 +196,7 @@ function handleEditSuccess(item: Panel.ItemInfo) { function handleChangeNetwork(mode: PanelStateNetworkModeEnum) { panelState.setNetworkMode(mode) if (mode === PanelStateNetworkModeEnum.lan) + ms.success(t('panelHome.changeToLanModelSuccess')) else @@ -307,8 +320,26 @@ function handleSetSortStatus(groupIndex: number, sortStatus: boolean) { updateItemIconGroupByNet(groupIndex, items.value[groupIndex].id as number) } } -function ping(params: any) { - return params +async function usePing(params: any, itemGroupIndex: any) { + const isflag = isLocalUrl(window.location.origin) + const promises = params.items.map(async (e: any) => { + if (isflag && e.lanUrl) { + return ping(e.lanUrl) + + } else { + return ping(e.url) + + } + }) + const result = await Promise.all(promises) + items.value[itemGroupIndex].items?.forEach((e: any, i) => { + e['time'] = result[i] + }) + setTimeout(() => { + items.value[itemGroupIndex].items?.forEach((e: any) => { + delete e['time'] + }) + }, 5000); } function handleEditItem(item: Panel.ItemInfo) { editItemInfoData.value = item @@ -326,24 +357,19 @@ function handleAddItem(itemIconGroupId?: number) {