diff --git a/pages/tool.vue b/pages/tool.vue index 16abb5b..43cc621 100644 --- a/pages/tool.vue +++ b/pages/tool.vue @@ -144,7 +144,7 @@ Ping一下 @@ -181,6 +182,7 @@ import useMainStore from "@/stores/index"; import { handleWinipBcStart, initStartWinIpBroadcast } from "@/composables/netcard"; import { getCurrentWindow } from "@tauri-apps/api/window"; + import { isValidIP } from "~/utils"; const mainStore = useMainStore(); const data = reactive({ @@ -189,6 +191,7 @@ pingNum: 1, winipBcStart: false, pingIp: "", + isPing: false, pingLog: "", firewallStatus: { domain: false, @@ -228,28 +231,41 @@ } }; + const awaitTime = (time: number) => { + return new Promise(res => { + setTimeout(res, time); + }); + }; + const handleTestPing = async () => { - /^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/; + // const is = isValidIP(data.pingIp); if (data.pingIp) { data.pingLog = ""; + data.isPing = true; try { for (let i = 0; i < data.pingNum; i++) { const output = await Command.create("ping", ["-n", "1", data.pingIp], { encoding: "gb2312" }).execute(); - - data.pingLog = data.pingLog.slice(-1000); if (output.stdout) { - data.pingLog += output.stdout.split("\n")[2]; + data.pingLog += `${i + 1} - ${output.stdout.split("\n")[2]}`; } if (output.stderr) { - data.pingLog += output.stderr; + data.pingLog += `${i + 1}error - ${output.stderr}`; + } + if(i != data.pingNum - 1) { + await awaitTime(1000); } } + data.pingLog += '完毕' } catch (err) { ElMessage.error("Ping发生错误"); console.log(err); + } finally { + data.isPing = false; } + }else { + ElMessage.error("请输入正确的IP"); } }; @@ -306,6 +322,7 @@ } } } catch (err) { + // netsh advfirewall firewall add rule name="EXE名称" dir=out action=allow program="EXE绝对路径" ElMessage.error("获取防火墙状态失败"); console.log(err); } @@ -318,6 +335,7 @@ }); onMounted(() => { + data.pingIp = mainStore.config.ipv4; initStartWinIpBroadcast(); }); diff --git a/utils/index.ts b/utils/index.ts index cd1c0ae..87a33c7 100644 --- a/utils/index.ts +++ b/utils/index.ts @@ -1,4 +1,3 @@ - import { ElMessage } from "element-plus"; import Clipboard from "vue-clipboard3"; @@ -79,36 +78,43 @@ export const ATJ = (promise: Promise, errorExt: string | undefined = undefi export const parsePeerInfo = (content: string) => { // 将表格字符串分割成行 - const lines = content.split('\n') - + const lines = content.split("\n"); + // 提取表头(keys) const headers = lines[1] - .split('│') - .slice(1, -1) - .map((h) => h.trim()) - + .split("│") + .slice(1, -1) + .map(h => h.trim()); + // 初始化结果数组 - const result: any[] = [] - + const result: any[] = []; + // 遍历数据行 for (let i = 3; i < lines.length - 1; i += 2) { - if (lines[i].trim() === '') continue // 跳过空行 - - // 分割每一行的数据 - const values = lines[i] - .split('│') - .slice(1, -1) - .map((v) => v.trim()) - - // 创建对象并添加到结果数组 - const obj: any = {} - headers.forEach((header, index) => { - obj[header] = values[index] === '-' || values[index] === '' ? null : values[index] - }) - - // 每行数据都作为一个新对象添加到结果数组中 - result.push(obj) + if (lines[i].trim() === "") continue; // 跳过空行 + + // 分割每一行的数据 + const values = lines[i] + .split("│") + .slice(1, -1) + .map(v => v.trim()); + + // 创建对象并添加到结果数组 + const obj: any = {}; + headers.forEach((header, index) => { + obj[header] = values[index] === "-" || values[index] === "" ? null : values[index]; + }); + + // 每行数据都作为一个新对象添加到结果数组中 + result.push(obj); } - - return result - } + + return result; +}; + +export function isValidIP(ip: string) { + const ipv4Pattern = + /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; + const ipv6Pattern = /^(?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}$/; + return ipv4Pattern.test(ip) || ipv6Pattern.test(ip); +}