refactor(frontend): 重构数据解析逻辑
- 新增 StopAndParseCapture 函数,整合停止抓包和解析数据流程 -重构 ReadRawJsonFile 函数,返回解析后的 ParsedResult 对象 - 优化数据解析流程,提高代码可读性和性能 - 调整前端 CapturePage组件,使用新的解析接口
This commit is contained in:
@@ -28,19 +28,17 @@ func NewParserService(cfg *config.Config, logger *utils.Logger) *ParserService {
|
||||
}
|
||||
|
||||
// ParseHexData 解析十六进制数据
|
||||
func (ps *ParserService) ParseHexData(hexDataList []string) (*model.CaptureResult, error) {
|
||||
func (ps *ParserService) ParseHexData(hexDataList []string) (*model.ParsedResult, string, error) {
|
||||
if len(hexDataList) == 0 {
|
||||
ps.logger.Warn("没有数据需要解析")
|
||||
return &model.CaptureResult{
|
||||
Data: make([]model.Equipment, 0),
|
||||
Units: make([]interface{}, 0),
|
||||
}, nil
|
||||
return &model.ParsedResult{
|
||||
Items: make([]interface{}, 0),
|
||||
Heroes: make([]interface{}, 0),
|
||||
}, "", nil
|
||||
}
|
||||
|
||||
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,
|
||||
@@ -55,45 +53,51 @@ func (ps *ParserService) ParseHexData(hexDataList []string) (*model.CaptureResul
|
||||
defer resp.Body.Close()
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
|
||||
// 直接写入本地文件
|
||||
// 新校验逻辑:校验data和units字段
|
||||
var raw map[string]interface{}
|
||||
if err := json.Unmarshal(body, &raw); err != nil {
|
||||
ps.logger.Error("远程json解析失败", "error", err)
|
||||
return nil, "", fmt.Errorf("远程json解析失败: %v", err)
|
||||
}
|
||||
|
||||
// 校验data字段
|
||||
dataArr, dataOk := raw["data"].([]interface{})
|
||||
if !dataOk || len(dataArr) == 0 {
|
||||
ps.logger.Error("远程json校验失败,data字段缺失或为空")
|
||||
return nil, "", fmt.Errorf("远程json校验失败,data字段缺失或为空")
|
||||
}
|
||||
|
||||
// 校验通过再写入本地文件
|
||||
fileErr := ioutil.WriteFile("output_raw.json", body, 0644)
|
||||
if fileErr != nil {
|
||||
ps.logger.Error("写入原始json文件失败", "error", fileErr)
|
||||
}
|
||||
|
||||
ps.logger.Info("远程原始数据已写入output_raw.json")
|
||||
parsedResult, err := ps.ReadRawJsonFile(string(body))
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
// 返回空集合,保证前端不报错
|
||||
return &model.CaptureResult{
|
||||
Data: make([]model.Equipment, 0),
|
||||
Units: make([]interface{}, 0),
|
||||
}, nil
|
||||
return parsedResult, "", nil
|
||||
} else if err != nil {
|
||||
ps.logger.Error("远程解析请求失败", "error", err)
|
||||
return nil, fmt.Errorf("远程解析请求失败: %v", err)
|
||||
return nil, "", fmt.Errorf("远程解析请求失败: %v", err)
|
||||
} else {
|
||||
ps.logger.Error("远程解析响应码异常", "status", resp.StatusCode)
|
||||
return nil, fmt.Errorf("远程解析响应码异常: %d", resp.StatusCode)
|
||||
return nil, "", fmt.Errorf("远程解析响应码异常: %d", resp.StatusCode)
|
||||
}
|
||||
} else {
|
||||
ps.logger.Error("远程解析请求构建失败", "error", err)
|
||||
return nil, fmt.Errorf("远程解析请求构建失败: %v", err)
|
||||
return nil, "", fmt.Errorf("远程解析请求构建失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// ReadRawJsonFile 读取output_raw.json文件内容并进行数据转换
|
||||
func (ps *ParserService) ReadRawJsonFile() (string, error) {
|
||||
data, err := ioutil.ReadFile("output_raw.json")
|
||||
if err != nil {
|
||||
ps.logger.Error("读取output_raw.json失败", "error", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
// 解析原始JSON数据
|
||||
// ReadRawJsonFile 读取rawJson内容并进行数据转换,返回ParsedResult对象
|
||||
func (ps *ParserService) ReadRawJsonFile(rawJson string) (*model.ParsedResult, error) {
|
||||
var rawData map[string]interface{}
|
||||
if err := json.Unmarshal(data, &rawData); err != nil {
|
||||
if err := json.Unmarshal([]byte(rawJson), &rawData); err != nil {
|
||||
ps.logger.Error("解析JSON失败", "error", err)
|
||||
return "", err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 提取装备和英雄数据
|
||||
@@ -110,9 +114,6 @@ func (ps *ParserService) ReadRawJsonFile() (string, error) {
|
||||
}
|
||||
}
|
||||
|
||||
// 1. 原始装备总数
|
||||
//fmt.Println("原始装备总数:", len(equips))
|
||||
|
||||
// 过滤有效装备 (x => !!x.f)
|
||||
var validEquips []interface{}
|
||||
for _, equip := range equips {
|
||||
@@ -122,29 +123,24 @@ func (ps *ParserService) ReadRawJsonFile() (string, error) {
|
||||
}
|
||||
}
|
||||
}
|
||||
//fmt.Println("过滤f字段后装备数:", len(validEquips))
|
||||
|
||||
// 转换装备数据
|
||||
convertedItems := ps.convertItemsAllWithLog(validEquips)
|
||||
//fmt.Println("转换后装备数:", len(convertedItems))
|
||||
|
||||
// 转换英雄数据(只对最大组)
|
||||
convertedHeroes := ps.convertUnits(rawUnits)
|
||||
|
||||
// 构建最终结果
|
||||
result := map[string]interface{}{
|
||||
"items": convertedItems,
|
||||
"heroes": convertedHeroes,
|
||||
result := &model.ParsedResult{
|
||||
Items: make([]interface{}, len(convertedItems)),
|
||||
Heroes: make([]interface{}, len(convertedHeroes)),
|
||||
}
|
||||
for i, v := range convertedItems {
|
||||
result.Items[i] = v
|
||||
}
|
||||
for i, v := range convertedHeroes {
|
||||
result.Heroes[i] = v
|
||||
}
|
||||
|
||||
// 序列化为JSON字符串
|
||||
resultJSON, err := json.Marshal(result)
|
||||
if err != nil {
|
||||
ps.logger.Error("序列化结果失败", "error", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(resultJSON), nil
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// convertItems 转换装备数据
|
||||
|
||||
Reference in New Issue
Block a user