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,>( 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}

View File

@@ -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 {

View File

@@ -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)

File diff suppressed because one or more lines are too long