1808837298@qq.com 2 лет назад
Родитель
Сommit
fe7f42fc2e
3 измененных файлов с 49 добавлено и 0 удалено
  1. 16 0
      controller/misc.go
  2. 32 0
      model/main.go
  3. 1 0
      router/api-router.go

+ 16 - 0
controller/misc.go

@@ -11,6 +11,22 @@ import (
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
 )
 )
 
 
+func TestStatus(c *gin.Context) {
+	err := model.PingDB()
+	if err != nil {
+		c.JSON(http.StatusServiceUnavailable, gin.H{
+			"success": false,
+			"message": "数据库连接失败",
+		})
+		return
+	}
+	c.JSON(http.StatusOK, gin.H{
+		"success": true,
+		"message": "Server is running",
+	})
+	return
+}
+
 func GetStatus(c *gin.Context) {
 func GetStatus(c *gin.Context) {
 	c.JSON(http.StatusOK, gin.H{
 	c.JSON(http.StatusOK, gin.H{
 		"success": true,
 		"success": true,

+ 32 - 0
model/main.go

@@ -5,9 +5,11 @@ import (
 	"gorm.io/driver/postgres"
 	"gorm.io/driver/postgres"
 	"gorm.io/driver/sqlite"
 	"gorm.io/driver/sqlite"
 	"gorm.io/gorm"
 	"gorm.io/gorm"
+	"log"
 	"one-api/common"
 	"one-api/common"
 	"os"
 	"os"
 	"strings"
 	"strings"
+	"sync"
 	"time"
 	"time"
 )
 )
 
 
@@ -148,3 +150,33 @@ func CloseDB() error {
 	err = sqlDB.Close()
 	err = sqlDB.Close()
 	return err
 	return err
 }
 }
+
+var (
+	lastPingTime time.Time
+	pingMutex    sync.Mutex
+)
+
+func PingDB() error {
+	pingMutex.Lock()
+	defer pingMutex.Unlock()
+
+	if time.Since(lastPingTime) < time.Second*10 {
+		return nil
+	}
+
+	sqlDB, err := DB.DB()
+	if err != nil {
+		log.Printf("Error getting sql.DB from GORM: %v", err)
+		return err
+	}
+
+	err = sqlDB.Ping()
+	if err != nil {
+		log.Printf("Error pinging DB: %v", err)
+		return err
+	}
+
+	lastPingTime = time.Now()
+	common.SysLog("Database pinged successfully")
+	return nil
+}

+ 1 - 0
router/api-router.go

@@ -14,6 +14,7 @@ func SetApiRouter(router *gin.Engine) {
 	apiRouter.Use(middleware.GlobalAPIRateLimit())
 	apiRouter.Use(middleware.GlobalAPIRateLimit())
 	{
 	{
 		apiRouter.GET("/status", controller.GetStatus)
 		apiRouter.GET("/status", controller.GetStatus)
+		apiRouter.GET("/status/test", middleware.AdminAuth(), controller.TestStatus)
 		apiRouter.GET("/notice", controller.GetNotice)
 		apiRouter.GET("/notice", controller.GetNotice)
 		apiRouter.GET("/about", controller.GetAbout)
 		apiRouter.GET("/about", controller.GetAbout)
 		apiRouter.GET("/midjourney", controller.GetMidjourney)
 		apiRouter.GET("/midjourney", controller.GetMidjourney)