From bcf80842b012c27075ac77f38c3d718b9131e4e9 Mon Sep 17 00:00:00 2001 From: douxu Date: Tue, 14 Oct 2025 16:12:00 +0800 Subject: [PATCH] fix bug of main.go --- config/config.yaml | 8 +-- handler/attr_delete.go | 4 +- handler/attr_load.go | 4 +- handler/attr_update.go | 4 +- handler/measurement_load.go | 2 +- handler/measurement_recommend.go | 9 ++++ main.go | 83 +++++++++++++++----------------- sql/topologic.go | 2 +- util/token.go | 56 +++++---------------- 9 files changed, 72 insertions(+), 100 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 8e38666..4d8ea75 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -1,5 +1,5 @@ postgres: - host: "192.168.2.103" + host: "192.168.1.20" port: 5432 database: "demo" user: "postgres" @@ -38,14 +38,14 @@ ants: # redis config locker_redis: - addr: "192.168.2.104:6379" + addr: "127.0.0.1:6379" password: "" db: 1 poolsize: 50 timeout: 10 storage_redis: - addr: "192.168.2.104:6379" + addr: "127.0.0.1:6379" password: "" db: 0 poolsize: 50 @@ -60,7 +60,7 @@ base: # modelRT service config service: service_name: "modelRT" - secret_key: "modelRT" + secret_key: "modelrt_key" # dataRT api config dataRT: diff --git a/handler/attr_delete.go b/handler/attr_delete.go index 62f45fc..812acba 100644 --- a/handler/attr_delete.go +++ b/handler/attr_delete.go @@ -27,7 +27,7 @@ func AttrDeleteHandler(c *gin.Context) { } if err := c.ShouldBindJSON(&request); err != nil { - logger.Error(c, "Failed to unmarshal attribute delete request", "error", err) + logger.Error(c, "failed to unmarshal attribute delete request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), @@ -37,7 +37,7 @@ func AttrDeleteHandler(c *gin.Context) { rs := diagram.NewRedisString(c, request.AttrToken, clientToken, 10, true) if err := rs.GETDEL(request.AttrToken); err != nil { - logger.Error(c, "Failed to delete attribute from Redis", "attr_token", request.AttrToken, "error", err) + logger.Error(c, "failed to delete attribute from Redis", "attr_token", request.AttrToken, "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), diff --git a/handler/attr_load.go b/handler/attr_load.go index 7843551..b669120 100644 --- a/handler/attr_load.go +++ b/handler/attr_load.go @@ -28,7 +28,7 @@ func AttrGetHandler(c *gin.Context) { } if err := c.ShouldBindJSON(&request); err != nil { - logger.Error(c, "Failed to unmarshal attribute get request", "error", err) + logger.Error(c, "failed to unmarshal attribute get request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), @@ -42,7 +42,7 @@ func AttrGetHandler(c *gin.Context) { attrModel, err := database.ParseAttrToken(c, tx, request.AttrToken, clientToken) if err != nil { tx.Rollback() - logger.Error(c, "Failed to parse attribute token", "attr_token", request.AttrToken, "error", err) + logger.Error(c, "failed to parse attribute token", "attr_token", request.AttrToken, "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), diff --git a/handler/attr_update.go b/handler/attr_update.go index 92607f1..9ecc24c 100644 --- a/handler/attr_update.go +++ b/handler/attr_update.go @@ -28,7 +28,7 @@ func AttrSetHandler(c *gin.Context) { } if err := c.ShouldBindJSON(&request); err != nil { - logger.Error(c, "Failed to unmarshal attribute set request", "error", err) + logger.Error(c, "failed to unmarshal attribute set request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), @@ -39,7 +39,7 @@ func AttrSetHandler(c *gin.Context) { // The logic for handling Redis operations directly from the handler rs := diagram.NewRedisString(c, request.AttrToken, clientToken, 10, true) if err := rs.Set(request.AttrToken, request.AttrValue); err != nil { - logger.Error(c, "Failed to set attribute value in Redis", "attr_token", request.AttrToken, "error", err) + logger.Error(c, "failed to set attribute value in Redis", "attr_token", request.AttrToken, "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), diff --git a/handler/measurement_load.go b/handler/measurement_load.go index ee0d6e0..3d1b718 100644 --- a/handler/measurement_load.go +++ b/handler/measurement_load.go @@ -30,7 +30,7 @@ func MeasurementGetHandler(c *gin.Context) { } if err := c.ShouldBindJSON(&request); err != nil { - logger.Error(c, "Failed to unmarshal measurement get request", "error", err) + logger.Error(c, "failed to unmarshal measurement get request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), diff --git a/handler/measurement_recommend.go b/handler/measurement_recommend.go index b86bd28..0ed7490 100644 --- a/handler/measurement_recommend.go +++ b/handler/measurement_recommend.go @@ -15,6 +15,15 @@ import ( func MeasurementRecommendHandler(c *gin.Context) { var request network.MeasurementRecommendRequest + if err := c.ShouldBindJSON(&request); err != nil { + logger.Error(c, "failed to unmarshal measurement recommend request", "error", err) + c.JSON(http.StatusOK, network.FailureResponse{ + Code: http.StatusBadRequest, + Msg: err.Error(), + }) + return + } + recommends, err := model.RedisSearchRecommend(c, request.Input) if err != nil { logger.Error(c, "failed to get recommend data from redis", "input", request.Input, "error", err) diff --git a/main.go b/main.go index b29473b..d0ae3b0 100644 --- a/main.go +++ b/main.go @@ -66,7 +66,7 @@ func main() { panic(err) } - serviceToken, err := util.GenerateClientToken(hostName, modelRTConfig.ServiceConfig.ServiceName) + serviceToken, err := util.GenerateClientToken(hostName, modelRTConfig.ServiceConfig.ServiceName, modelRTConfig.ServiceConfig.SecretKey) if err != nil { logger.Error(ctx, "generate client token failed", "error", err) panic(err) @@ -136,8 +136,46 @@ func main() { // TODO 暂时屏蔽完成 swagger 启动测试 // go realtimedata.RealTimeDataComputer(ctx, nil, []string{}, "") + // use release mode in productio + // gin.SetMode(gin.ReleaseMode) engine := gin.New() router.RegisterRoutes(engine, serviceToken) + + // real time data api + engine.GET("/ws/rtdatas", handler.RealTimeDataReceivehandler) + + // anchor api + engine.POST("/model/anchor_replace", handler.ComponentAnchorReplaceHandler) + + // alert api + engine.GET("/alert/events/query", handler.QueryAlertEventHandler) + + // real time data api + engine.GET("/rt/datas/query", handler.QueryRealTimeDataHandler) + + // dashborad api + dashboard := engine.Group("/dashboard", limiter.Middleware) + { + dashboard.GET("/load", nil) + dashboard.GET("/query", nil) + dashboard.POST("/create", nil) + dashboard.POST("/update", nil) + dashboard.POST("/delete", nil) + } + + // Swagger UI + engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + + // 注册 Swagger UI 路由 + // docs.SwaggerInfo.BasePath = "/model" + // v1 := engine.Group("/api/v1") + // { + // eg := v1.Group("/example") + // { + // eg.GET("/helloworld", Helloworld) + // } + // } + server := http.Server{ Addr: ":8080", Handler: engine, @@ -164,47 +202,4 @@ func main() { logger.Error(ctx, "Server closed unexpected", "err", err) } } - - // real time data api - engine.GET("/ws/rtdatas", handler.RealTimeDataReceivehandler) - - // anchor api - engine.POST("/model/anchor_replace", handler.ComponentAnchorReplaceHandler) - - // alert api - engine.GET("/alert/events/query", handler.QueryAlertEventHandler) - - // real time data api - engine.GET("/rt/datas/query", handler.QueryRealTimeDataHandler) - - // dashborad api - dashboard := engine.Group("/dashboard", limiter.Middleware) - { - dashboard.GET("/load", nil) - dashboard.GET("/query", nil) - dashboard.POST("/create", nil) - dashboard.POST("/update", nil) - dashboard.POST("/delete", nil) - } - - // engine.Group() - // Swagger UI - engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) - - // 注册 Swagger UI 路由 - // docs.SwaggerInfo.BasePath = "/model" - // v1 := engine.Group("/api/v1") - // { - // eg := v1.Group("/example") - // { - // eg.GET("/helloworld", Helloworld) - // } - // } - - // start route with 8080 port - engine.Run(":8080") - - // Redis hashmap 母线模型、异步电动机模型 - - // kv key name value busx } diff --git a/sql/topologic.go b/sql/topologic.go index 95f292d..7ec8ec1 100644 --- a/sql/topologic.go +++ b/sql/topologic.go @@ -7,7 +7,7 @@ var RecursiveSQL = `WITH RECURSIVE recursive_tree as ( FROM "Topologic" WHERE uuid_from = ? UNION ALL - SELECT t.uuid_from,t.uuid_to,t.page_id,t.flag + SELECT t.uuid_from,t.uuid_to,t.flag FROM "Topologic" t JOIN recursive_tree rt ON t.uuid_from = rt.uuid_to ) diff --git a/util/token.go b/util/token.go index 9f9e0e6..8811922 100644 --- a/util/token.go +++ b/util/token.go @@ -12,15 +12,20 @@ import ( ) // GenerateClientToken define func of generate a secure token for client identification -func GenerateClientToken(host string, serviceName string) (string, error) { - uniqueID := fmt.Sprintf("%d", time.Now().UnixNano()) - clientInfo := fmt.Sprintf("host=%s;service=%s;id=%s", host, serviceName, uniqueID) - secretKey := os.Getenv("TOKEN_SECRET_KEY") - if secretKey == "" { - return "", fmt.Errorf("TOKEN_SECRET_KEY environment variable not set") +func GenerateClientToken(host string, serviceName string, secretKey string) (string, error) { + finalSecretKey := secretKey + if finalSecretKey == "" { + finalSecretKey = os.Getenv("TOKEN_SECRET_KEY") } - mac := hmac.New(sha256.New, []byte(secretKey)) + if finalSecretKey == "" { + return "", fmt.Errorf("TOKEN_SECRET_KEY environment variable not set and no key provided in parameters") + } + + uniqueID := fmt.Sprintf("%d", time.Now().UnixNano()) + clientInfo := fmt.Sprintf("host=%s;service=%s;id=%s", host, serviceName, uniqueID) + + mac := hmac.New(sha256.New, []byte(finalSecretKey)) mac.Write([]byte(clientInfo)) signature := mac.Sum(nil) @@ -61,40 +66,3 @@ func verifyClientToken(token string, secretKey string) (bool, string, error) { clientInfo := string(clientInfoBytes) return true, clientInfo, nil } - -// --- 示例使用 --- - -func main() { - // 模拟获取客户端信息 - // 实际应用中,host 可以通过获取本地主机名,serviceName 可以是当前服务的标识。 - host, err := os.Hostname() - if err != nil { - fmt.Println("Error getting hostname:", err) - host = "unknown-host" - } - serviceName := "my-web-service" // 替换为你的服务名 - - // 设置一个示例密钥(在实际应用中,请从环境变量加载) - // export TOKEN_SECRET_KEY="your-super-secret-key-here" - os.Setenv("TOKEN_SECRET_KEY", "my-super-secret-and-long-key-for-hmac") - - token, err := GenerateClientToken(host, serviceName) - if err != nil { - fmt.Println("Error generating token:", err) - return - } - - fmt.Println("Generated Token:", token) - - // --- 验证 Token (示例) --- - // 在接收方,你需要实现一个验证函数 - isValid, clientInfo, err := verifyClientToken(token, os.Getenv("TOKEN_SECRET_KEY")) - if err != nil { - fmt.Println("Error verifying token:", err) - } else if isValid { - fmt.Println("Token is valid!") - fmt.Println("Client Info:", clientInfo) // 包含 host, service, id - } else { - fmt.Println("Token is invalid.") - } -}