docs(README): 更新安装后端依赖说明

- 添加安装 Wails 最新版本的命令
- 更新 package.json.md5 校验值
This commit is contained in:
hxt
2025-07-02 21:20:58 +08:00
parent c4014499e3
commit 3af8fd6e5e
4 changed files with 69 additions and 95210 deletions

View File

@@ -64,36 +64,36 @@ function CapturePage() {
const safeApiCall = async <T,>(
apiCall: () => Promise<T>,
errorMessage: string,
fallbackValue: T
): Promise<T> => {
errorMessage: string
): Promise<T | undefined> => {
try {
return await apiCall();
} catch (error) {
console.error(`${errorMessage}:`, error);
showMessage('error', errorMessage);
return fallbackValue;
return undefined;
}
};
const fetchInterfaces = async () => {
setIsCapturing(false);
setCapturedData([]);
// setParsedData(null);
setLoading(false);
setInterfaceLoading(true);
try {
const response = await safeApiCall(
() => 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);
let defaultSelected = '';
console.log("获取的网卡:"+JSON.stringify(response))
for (const iface of response) {
if (iface.addresses && iface.addresses.some(ip => ip.includes('192.168'))) {
defaultSelected = iface.name;
@@ -106,13 +106,9 @@ function CapturePage() {
setSelectedInterface(defaultSelected);
} catch (error) {
console.error('获取网络接口时发生未知错误:', error);
const defaultInterfaces = [
{ 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 }
];
setInterfaces(defaultInterfaces);
setSelectedInterface(defaultInterfaces[0].name);
showMessage('error', '获取网络接口时发生未知错误');
setInterfaces([]);
setSelectedInterface('');
} finally {
setInterfaceLoading(false);
}
@@ -125,17 +121,20 @@ function CapturePage() {
}
setLoading(true);
try {
await safeApiCall(
const result = await safeApiCall(
() => StartCapture(selectedInterface),
'开始抓包失败,但界面将继续工作',
undefined
'开始抓包失败'
);
if (result === undefined) {
setIsCapturing(false);
return;
}
setIsCapturing(true);
showMessage('success', '开始抓包');
} catch (error) {
console.error('开始抓包时发生未知错误:', error);
setIsCapturing(true);
showMessage('success', '开始抓包(模拟模式)');
setIsCapturing(false);
showMessage('error', '开始抓包失败');
} finally {
setLoading(false);
}
@@ -145,20 +144,26 @@ function CapturePage() {
setLoading(false);
setIsCapturing(false);
setCapturedData([]);
// setParsedData(null);
try {
setLoading(true);
await safeApiCall(
const stopResult = await safeApiCall(
() => StopCapture(),
'停止抓包失败,但界面将继续工作',
undefined
'停止抓包失败'
);
if (stopResult === undefined) {
setIsCapturing(false);
return;
}
setIsCapturing(false);
const data = await safeApiCall(
() => GetCapturedData(),
'获取抓包数据失败,使用模拟数据',
['mock_data_1', 'mock_data_2', 'mock_data_3']
'获取抓包数据失败'
);
if (!data || data.length === 0) {
setCapturedData([]);
showMessage('warning', '未捕获到数据');
return;
}
setCapturedData(data);
if (data && data.length > 0) {
data.forEach((item, idx) => {
@@ -174,31 +179,26 @@ function CapturePage() {
if (data.length > 0) {
const parsed = await safeApiCall(
() => 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 {
const parsedData = JSON.parse(parsed);
if (!parsedData || !Array.isArray(parsedData.items)) {
setParsedData({ items: [], heroes: [] });
showMessage('error', '解析数据失败');
return;
}
setParsedData(parsedData);
showMessage('success', '数据处理完成');
} catch (parseError) {
console.error('解析JSON失败:', parseError);
setParsedData({
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: []
});
showMessage('success', '数据处理完成(使用模拟数据)');
setParsedData({ items: [], heroes: [] });
showMessage('error', '解析数据失败');
}
} else {
showMessage('warning', '未捕获到数据');
@@ -207,7 +207,7 @@ function CapturePage() {
console.error('停止抓包时发生未知错误:', error);
setIsCapturing(false);
setCapturedData([]);
setParsedData(null);
setParsedData({ items: [], heroes: [] });
setLoading(false);
showMessage('error', '抓包失败,已重置状态');
return;
@@ -223,15 +223,18 @@ function CapturePage() {
}
try {
const filename = `equipment_data_${Date.now()}.json`;
await safeApiCall(
const result = await safeApiCall(
() => ExportData(capturedData, filename),
'导出数据失败',
undefined
'导出数据失败'
);
if (result === undefined) {
showMessage('error', '导出数据失败');
return;
}
showMessage('success', '数据导出成功');
} catch (error) {
console.error('导出数据时发生未知错误:', error);
showMessage('success', '数据导出成功(模拟模式)');
showMessage('error', '导出数据失败');
}
};
@@ -433,9 +436,10 @@ function CapturePage() {
<Card title="抓包状态" size="small" style={{ marginTop: 12 }}>
<div>
<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 && (
<p style={{ marginBottom: 0 }}>: {parsedData.items.length} </p>
<p style={{ marginBottom: 0 }}>: {Array.isArray(parsedData?.items) ? parsedData.items.length : 0} </p>
)}
</div>
</Card>
@@ -444,7 +448,7 @@ function CapturePage() {
<Content style={{ padding: '16px' }}>
<Spin spinning={loading}>
{parsedData && parsedData.items.length > 0 ? (
{Array.isArray(parsedData?.items) && parsedData.items.length > 0 ? (
<Card title="装备数据">
<Table
dataSource={parsedData.items}

View File

@@ -4,6 +4,7 @@ import (
"equipment-analyzer/internal/model"
"fmt"
"github.com/google/gopacket/pcap"
"log"
)
// GetNetworkInterfaces 获取网络接口列表
@@ -13,6 +14,8 @@ func GetNetworkInterfaces() ([]model.NetworkInterface, error) {
return nil, fmt.Errorf("failed to find network devices: %v", err)
}
log.Printf("抓取到的网卡设备数量: %d", len(devices)) // 打印网卡总数
var interfaces []model.NetworkInterface
for _, device := range devices {
// 跳过回环接口
@@ -20,6 +23,8 @@ func GetNetworkInterfaces() ([]model.NetworkInterface, error) {
continue
}
log.Printf("网卡名称: %s, 描述: %s", device.Name, device.Description) // 打印每个网卡的名称和描述
// 提取IP地址
var addresses []string
for _, address := range device.Addresses {

View File

@@ -40,6 +40,7 @@ func (ps *ParserService) ParseHexData(hexDataList []string) (*model.CaptureResul
ps.logger.Info("开始远程解析数据", "count", len(hexDataList))
// 远程接口解析
//fmt.Println("开始远程解析数据", len(hexDataList))
url := "https://krivpfvxi0.execute-api.us-west-2.amazonaws.com/dev/getItems"
reqBody := map[string]interface{}{
"data": hexDataList,
@@ -110,7 +111,7 @@ func (ps *ParserService) ReadRawJsonFile() (string, error) {
}
// 1. 原始装备总数
fmt.Println("原始装备总数:", len(equips))
//fmt.Println("原始装备总数:", len(equips))
// 过滤有效装备 (x => !!x.f)
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)
fmt.Println("转换后装备数:", len(convertedItems))
//fmt.Println("转换后装备数:", len(convertedItems))
// 转换英雄数据(只对最大组)
convertedHeroes := ps.convertUnits(rawUnits)

File diff suppressed because one or more lines are too long