docs(README): 更新安装后端依赖说明
- 添加安装 Wails 最新版本的命令 - 更新 package.json.md5 校验值
This commit is contained in:
@@ -64,36 +64,36 @@ function CapturePage() {
|
|||||||
|
|
||||||
const safeApiCall = async <T,>(
|
const safeApiCall = async <T,>(
|
||||||
apiCall: () => Promise<T>,
|
apiCall: () => Promise<T>,
|
||||||
errorMessage: string,
|
errorMessage: string
|
||||||
fallbackValue: T
|
): Promise<T | undefined> => {
|
||||||
): Promise<T> => {
|
|
||||||
try {
|
try {
|
||||||
return await apiCall();
|
return await apiCall();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`${errorMessage}:`, error);
|
console.error(`${errorMessage}:`, error);
|
||||||
showMessage('error', errorMessage);
|
showMessage('error', errorMessage);
|
||||||
return fallbackValue;
|
return undefined;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const fetchInterfaces = async () => {
|
const fetchInterfaces = async () => {
|
||||||
setIsCapturing(false);
|
setIsCapturing(false);
|
||||||
setCapturedData([]);
|
setCapturedData([]);
|
||||||
// setParsedData(null);
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
setInterfaceLoading(true);
|
setInterfaceLoading(true);
|
||||||
try {
|
try {
|
||||||
const response = await safeApiCall(
|
const response = await safeApiCall(
|
||||||
() => GetNetworkInterfaces(),
|
() => GetNetworkInterfaces(),
|
||||||
'获取网络接口失败,使用模拟数据',
|
'获取网络接口失败'
|
||||||
[
|
|
||||||
{ name: 'eth0', description: 'Ethernet', addresses: ['192.168.1.100'], is_loopback: false },
|
|
||||||
{ name: 'wlan0', description: 'Wireless', addresses: ['192.168.1.101'], is_loopback: false },
|
|
||||||
{ name: 'lo', description: 'Loopback', addresses: ['127.0.0.1'], is_loopback: true }
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
|
if (!response || response.length === 0) {
|
||||||
|
showMessage('error', '未获取到任何网络接口');
|
||||||
|
setInterfaces([]);
|
||||||
|
setSelectedInterface('');
|
||||||
|
return;
|
||||||
|
}
|
||||||
setInterfaces(response);
|
setInterfaces(response);
|
||||||
let defaultSelected = '';
|
let defaultSelected = '';
|
||||||
|
console.log("获取的网卡:"+JSON.stringify(response))
|
||||||
for (const iface of response) {
|
for (const iface of response) {
|
||||||
if (iface.addresses && iface.addresses.some(ip => ip.includes('192.168'))) {
|
if (iface.addresses && iface.addresses.some(ip => ip.includes('192.168'))) {
|
||||||
defaultSelected = iface.name;
|
defaultSelected = iface.name;
|
||||||
@@ -106,13 +106,9 @@ function CapturePage() {
|
|||||||
setSelectedInterface(defaultSelected);
|
setSelectedInterface(defaultSelected);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取网络接口时发生未知错误:', error);
|
console.error('获取网络接口时发生未知错误:', error);
|
||||||
const defaultInterfaces = [
|
showMessage('error', '获取网络接口时发生未知错误');
|
||||||
{ name: 'eth0', description: 'Ethernet', addresses: ['192.168.1.100'], is_loopback: false },
|
setInterfaces([]);
|
||||||
{ name: 'wlan0', description: 'Wireless', addresses: ['192.168.1.101'], is_loopback: false },
|
setSelectedInterface('');
|
||||||
{ name: 'lo', description: 'Loopback', addresses: ['127.0.0.1'], is_loopback: true }
|
|
||||||
];
|
|
||||||
setInterfaces(defaultInterfaces);
|
|
||||||
setSelectedInterface(defaultInterfaces[0].name);
|
|
||||||
} finally {
|
} finally {
|
||||||
setInterfaceLoading(false);
|
setInterfaceLoading(false);
|
||||||
}
|
}
|
||||||
@@ -125,17 +121,20 @@ function CapturePage() {
|
|||||||
}
|
}
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
await safeApiCall(
|
const result = await safeApiCall(
|
||||||
() => StartCapture(selectedInterface),
|
() => StartCapture(selectedInterface),
|
||||||
'开始抓包失败,但界面将继续工作',
|
'开始抓包失败'
|
||||||
undefined
|
|
||||||
);
|
);
|
||||||
|
if (result === undefined) {
|
||||||
|
setIsCapturing(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
setIsCapturing(true);
|
setIsCapturing(true);
|
||||||
showMessage('success', '开始抓包');
|
showMessage('success', '开始抓包');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('开始抓包时发生未知错误:', error);
|
console.error('开始抓包时发生未知错误:', error);
|
||||||
setIsCapturing(true);
|
setIsCapturing(false);
|
||||||
showMessage('success', '开始抓包(模拟模式)');
|
showMessage('error', '开始抓包失败');
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
@@ -145,20 +144,26 @@ function CapturePage() {
|
|||||||
setLoading(false);
|
setLoading(false);
|
||||||
setIsCapturing(false);
|
setIsCapturing(false);
|
||||||
setCapturedData([]);
|
setCapturedData([]);
|
||||||
// setParsedData(null);
|
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
await safeApiCall(
|
const stopResult = await safeApiCall(
|
||||||
() => StopCapture(),
|
() => StopCapture(),
|
||||||
'停止抓包失败,但界面将继续工作',
|
'停止抓包失败'
|
||||||
undefined
|
|
||||||
);
|
);
|
||||||
|
if (stopResult === undefined) {
|
||||||
|
setIsCapturing(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
setIsCapturing(false);
|
setIsCapturing(false);
|
||||||
const data = await safeApiCall(
|
const data = await safeApiCall(
|
||||||
() => GetCapturedData(),
|
() => GetCapturedData(),
|
||||||
'获取抓包数据失败,使用模拟数据',
|
'获取抓包数据失败'
|
||||||
['mock_data_1', 'mock_data_2', 'mock_data_3']
|
|
||||||
);
|
);
|
||||||
|
if (!data || data.length === 0) {
|
||||||
|
setCapturedData([]);
|
||||||
|
showMessage('warning', '未捕获到数据');
|
||||||
|
return;
|
||||||
|
}
|
||||||
setCapturedData(data);
|
setCapturedData(data);
|
||||||
if (data && data.length > 0) {
|
if (data && data.length > 0) {
|
||||||
data.forEach((item, idx) => {
|
data.forEach((item, idx) => {
|
||||||
@@ -174,31 +179,26 @@ function CapturePage() {
|
|||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
const parsed = await safeApiCall(
|
const parsed = await safeApiCall(
|
||||||
() => ParseData(data),
|
() => ParseData(data),
|
||||||
'解析数据失败,使用模拟数据',
|
'解析数据失败'
|
||||||
JSON.stringify({
|
|
||||||
items: [
|
|
||||||
{ id: '1', code: 'SWORD001', ct: 100, e: 1500, g: 5, l: false, mg: 10, op: [], p: 25, s: 'Legendary', sk: 3 },
|
|
||||||
{ id: '2', code: 'SHIELD002', ct: 80, e: 1200, g: 4, l: true, mg: 15, op: [], p: 20, s: 'Rare', sk: 2 },
|
|
||||||
{ id: '3', code: 'HELMET003', ct: 60, e: 800, g: 3, l: false, mg: 8, op: [], p: 12, s: 'Common', sk: 1 }
|
|
||||||
],
|
|
||||||
heroes: []
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
|
if (!parsed) {
|
||||||
|
setParsedData({ items: [], heroes: [] });
|
||||||
|
showMessage('error', '解析数据失败');
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
const parsedData = JSON.parse(parsed);
|
const parsedData = JSON.parse(parsed);
|
||||||
|
if (!parsedData || !Array.isArray(parsedData.items)) {
|
||||||
|
setParsedData({ items: [], heroes: [] });
|
||||||
|
showMessage('error', '解析数据失败');
|
||||||
|
return;
|
||||||
|
}
|
||||||
setParsedData(parsedData);
|
setParsedData(parsedData);
|
||||||
showMessage('success', '数据处理完成');
|
showMessage('success', '数据处理完成');
|
||||||
} catch (parseError) {
|
} catch (parseError) {
|
||||||
console.error('解析JSON失败:', parseError);
|
console.error('解析JSON失败:', parseError);
|
||||||
setParsedData({
|
setParsedData({ items: [], heroes: [] });
|
||||||
items: [
|
showMessage('error', '解析数据失败');
|
||||||
{ id: '1', code: 'SWORD001', ct: 100, e: 1500, g: 5, l: false, mg: 10, op: [], p: 25, s: 'Legendary', sk: 3 },
|
|
||||||
{ id: '2', code: 'SHIELD002', ct: 80, e: 1200, g: 4, l: true, mg: 15, op: [], p: 20, s: 'Rare', sk: 2 },
|
|
||||||
{ id: '3', code: 'HELMET003', ct: 60, e: 800, g: 3, l: false, mg: 8, op: [], p: 12, s: 'Common', sk: 1 }
|
|
||||||
],
|
|
||||||
heroes: []
|
|
||||||
});
|
|
||||||
showMessage('success', '数据处理完成(使用模拟数据)');
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
showMessage('warning', '未捕获到数据');
|
showMessage('warning', '未捕获到数据');
|
||||||
@@ -207,7 +207,7 @@ function CapturePage() {
|
|||||||
console.error('停止抓包时发生未知错误:', error);
|
console.error('停止抓包时发生未知错误:', error);
|
||||||
setIsCapturing(false);
|
setIsCapturing(false);
|
||||||
setCapturedData([]);
|
setCapturedData([]);
|
||||||
setParsedData(null);
|
setParsedData({ items: [], heroes: [] });
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
showMessage('error', '抓包失败,已重置状态');
|
showMessage('error', '抓包失败,已重置状态');
|
||||||
return;
|
return;
|
||||||
@@ -223,15 +223,18 @@ function CapturePage() {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const filename = `equipment_data_${Date.now()}.json`;
|
const filename = `equipment_data_${Date.now()}.json`;
|
||||||
await safeApiCall(
|
const result = await safeApiCall(
|
||||||
() => ExportData(capturedData, filename),
|
() => ExportData(capturedData, filename),
|
||||||
'导出数据失败',
|
'导出数据失败'
|
||||||
undefined
|
|
||||||
);
|
);
|
||||||
|
if (result === undefined) {
|
||||||
|
showMessage('error', '导出数据失败');
|
||||||
|
return;
|
||||||
|
}
|
||||||
showMessage('success', '数据导出成功');
|
showMessage('success', '数据导出成功');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('导出数据时发生未知错误:', error);
|
console.error('导出数据时发生未知错误:', error);
|
||||||
showMessage('success', '数据导出成功(模拟模式)');
|
showMessage('error', '导出数据失败');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -433,9 +436,10 @@ function CapturePage() {
|
|||||||
<Card title="抓包状态" size="small" style={{ marginTop: 12 }}>
|
<Card title="抓包状态" size="small" style={{ marginTop: 12 }}>
|
||||||
<div>
|
<div>
|
||||||
<p style={{ marginBottom: 4 }}>状态: {isCapturing ? '正在抓包...' : '准备就绪'}</p>
|
<p style={{ marginBottom: 4 }}>状态: {isCapturing ? '正在抓包...' : '准备就绪'}</p>
|
||||||
<p style={{ marginBottom: 4 }}>捕获数据: {capturedData.length} 条</p>
|
{/*<p style={{ marginBottom: 4 }}>捕获数据: {capturedData.length} 条</p>*/}
|
||||||
|
<p style={{ marginBottom: 4 }}>英雄数目: {Array.isArray(parsedData?.heroes) ? parsedData.heroes.length : 0} 个</p>
|
||||||
{parsedData && (
|
{parsedData && (
|
||||||
<p style={{ marginBottom: 0 }}>解析装备: {parsedData.items.length} 件</p>
|
<p style={{ marginBottom: 0 }}>解析装备: {Array.isArray(parsedData?.items) ? parsedData.items.length : 0} 件</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
@@ -444,7 +448,7 @@ function CapturePage() {
|
|||||||
|
|
||||||
<Content style={{ padding: '16px' }}>
|
<Content style={{ padding: '16px' }}>
|
||||||
<Spin spinning={loading}>
|
<Spin spinning={loading}>
|
||||||
{parsedData && parsedData.items.length > 0 ? (
|
{Array.isArray(parsedData?.items) && parsedData.items.length > 0 ? (
|
||||||
<Card title="装备数据">
|
<Card title="装备数据">
|
||||||
<Table
|
<Table
|
||||||
dataSource={parsedData.items}
|
dataSource={parsedData.items}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"equipment-analyzer/internal/model"
|
"equipment-analyzer/internal/model"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/gopacket/pcap"
|
"github.com/google/gopacket/pcap"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetNetworkInterfaces 获取网络接口列表
|
// GetNetworkInterfaces 获取网络接口列表
|
||||||
@@ -13,6 +14,8 @@ func GetNetworkInterfaces() ([]model.NetworkInterface, error) {
|
|||||||
return nil, fmt.Errorf("failed to find network devices: %v", err)
|
return nil, fmt.Errorf("failed to find network devices: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Printf("抓取到的网卡设备数量: %d", len(devices)) // 打印网卡总数
|
||||||
|
|
||||||
var interfaces []model.NetworkInterface
|
var interfaces []model.NetworkInterface
|
||||||
for _, device := range devices {
|
for _, device := range devices {
|
||||||
// 跳过回环接口
|
// 跳过回环接口
|
||||||
@@ -20,6 +23,8 @@ func GetNetworkInterfaces() ([]model.NetworkInterface, error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Printf("网卡名称: %s, 描述: %s", device.Name, device.Description) // 打印每个网卡的名称和描述
|
||||||
|
|
||||||
// 提取IP地址
|
// 提取IP地址
|
||||||
var addresses []string
|
var addresses []string
|
||||||
for _, address := range device.Addresses {
|
for _, address := range device.Addresses {
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ func (ps *ParserService) ParseHexData(hexDataList []string) (*model.CaptureResul
|
|||||||
ps.logger.Info("开始远程解析数据", "count", len(hexDataList))
|
ps.logger.Info("开始远程解析数据", "count", len(hexDataList))
|
||||||
|
|
||||||
// 远程接口解析
|
// 远程接口解析
|
||||||
|
//fmt.Println("开始远程解析数据", len(hexDataList))
|
||||||
url := "https://krivpfvxi0.execute-api.us-west-2.amazonaws.com/dev/getItems"
|
url := "https://krivpfvxi0.execute-api.us-west-2.amazonaws.com/dev/getItems"
|
||||||
reqBody := map[string]interface{}{
|
reqBody := map[string]interface{}{
|
||||||
"data": hexDataList,
|
"data": hexDataList,
|
||||||
@@ -110,7 +111,7 @@ func (ps *ParserService) ReadRawJsonFile() (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. 原始装备总数
|
// 1. 原始装备总数
|
||||||
fmt.Println("原始装备总数:", len(equips))
|
//fmt.Println("原始装备总数:", len(equips))
|
||||||
|
|
||||||
// 过滤有效装备 (x => !!x.f)
|
// 过滤有效装备 (x => !!x.f)
|
||||||
var validEquips []interface{}
|
var validEquips []interface{}
|
||||||
@@ -121,11 +122,11 @@ func (ps *ParserService) ReadRawJsonFile() (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Println("过滤f字段后装备数:", len(validEquips))
|
//fmt.Println("过滤f字段后装备数:", len(validEquips))
|
||||||
|
|
||||||
// 转换装备数据
|
// 转换装备数据
|
||||||
convertedItems := ps.convertItemsAllWithLog(validEquips)
|
convertedItems := ps.convertItemsAllWithLog(validEquips)
|
||||||
fmt.Println("转换后装备数:", len(convertedItems))
|
//fmt.Println("转换后装备数:", len(convertedItems))
|
||||||
|
|
||||||
// 转换英雄数据(只对最大组)
|
// 转换英雄数据(只对最大组)
|
||||||
convertedHeroes := ps.convertUnits(rawUnits)
|
convertedHeroes := ps.convertUnits(rawUnits)
|
||||||
|
|||||||
95153
output_raw.json
95153
output_raw.json
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user