fix bug of main.go

This commit is contained in:
douxu 2025-10-14 16:12:00 +08:00
parent 5d02ca9fca
commit bcf80842b0
9 changed files with 72 additions and 100 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

83
main.go
View File

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

View File

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

View File

@ -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.")
}
}