refactor: 将recognizer模块拆分到现有模块中

- 将课表识别功能合并到captcha模块
- 将RecognizerClient添加到client模块
- 将输出函数移至models/output.go
- 更新API结构体添加扩展字段
- 删除recognizer目录
This commit is contained in:
lafay
2026-03-16 13:15:56 +08:00
parent 01ea9ac77d
commit 294151cd40
6 changed files with 287 additions and 323 deletions

60
main.go
View File

@@ -16,8 +16,8 @@ import (
"jwts/client"
"jwts/config"
grpcClient "jwts/grpc"
"jwts/models"
"jwts/parser"
"jwts/recognizer"
"github.com/gin-gonic/gin"
)
@@ -49,35 +49,55 @@ func runGRPCClient(serverAddr string) {
log.Printf("启动 gRPC 客户端, Runner ID: %s, 版本: %s", runnerID, version)
client := grpcClient.NewClient(serverAddr, runnerID, version)
handler := grpcClient.NewTaskHandler()
client.SetHandler(handler)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// 处理信号
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
if err := client.Connect(ctx); err != nil {
log.Printf("连接失败: %v", err)
os.Exit(1)
}
go func() {
<-sigChan
log.Println("正在关闭...")
client.Close()
cancel()
}()
// 启动心跳
go client.HeartbeatLoop(ctx, 30*time.Second)
reconnectInterval := 5 * time.Second
// 运行主循环
if err := client.Run(ctx); err != nil {
log.Printf("客户端错误: %v", err)
for {
select {
case <-ctx.Done():
log.Println("客户端已停止")
return
default:
}
client := grpcClient.NewClient(serverAddr, runnerID, version)
handler := grpcClient.NewTaskHandler()
client.SetHandler(handler)
if err := client.Connect(ctx); err != nil {
log.Printf("连接失败: %v, %v 后重试...", err, reconnectInterval)
time.Sleep(reconnectInterval)
continue
}
heartbeatCtx, heartbeatCancel := context.WithCancel(ctx)
go client.HeartbeatLoop(heartbeatCtx, 30*time.Second)
err := client.Run(ctx)
heartbeatCancel()
client.Close()
if ctx.Err() != nil {
return
}
if err != nil {
log.Printf("连接断开: %v, %v 后重连...", err, reconnectInterval)
} else {
log.Printf("连接已关闭, %v 后重连...", reconnectInterval)
}
time.Sleep(reconnectInterval)
}
}
@@ -117,15 +137,15 @@ func runHTTPServer() {
return
}
courses, err := recognizer.RecognizeFromBytes(imageData)
courses, err := captcha.RecognizeScheduleFromBytes(imageData)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "识别失败", "details": err.Error()})
return
}
recognizer.PrintCourses(courses)
models.PrintCourses(courses)
err = recognizer.SaveToJSON(courses, "schedule_result.json")
err = models.SaveToJSON(courses, "schedule_result.json")
if err != nil {
log.Printf("保存JSON失败: %v", err)
}