mirror of
https://github.com/yangjian102621/geekai.git
synced 2026-04-11 13:44:25 +08:00
98 lines
2.7 KiB
Go
98 lines
2.7 KiB
Go
package core
|
||
|
||
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
|
||
// * Use of this source code is governed by a Apache-2.0 license
|
||
// * that can be found in the LICENSE file.
|
||
// * @Author yangjian102621@163.com
|
||
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
import (
|
||
"fmt"
|
||
"geekai/core/middleware"
|
||
"geekai/core/types"
|
||
"geekai/store/model"
|
||
"geekai/utils"
|
||
"io"
|
||
"net/http"
|
||
"runtime/debug"
|
||
"time"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/go-redis/redis/v8"
|
||
"github.com/imroc/req/v3"
|
||
"github.com/shirou/gopsutil/host"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type AppServer struct {
|
||
Config *types.AppConfig
|
||
Engine *gin.Engine
|
||
SysConfig *types.SystemConfig // system config cache
|
||
Redis *redis.Client
|
||
}
|
||
|
||
func NewServer(appConfig *types.AppConfig, redis *redis.Client, sysConfig *types.SystemConfig) *AppServer {
|
||
gin.SetMode(gin.ReleaseMode)
|
||
gin.DefaultWriter = io.Discard
|
||
return &AppServer{
|
||
Config: appConfig,
|
||
Redis: redis,
|
||
Engine: gin.Default(),
|
||
SysConfig: sysConfig,
|
||
}
|
||
}
|
||
|
||
func (s *AppServer) Init(client *redis.Client) {
|
||
s.Engine.Use(middleware.ParameterHandlerMiddleware())
|
||
s.Engine.Use(errorHandler)
|
||
// 添加静态资源访问
|
||
s.Engine.Static("/static", s.Config.StaticDir)
|
||
s.Engine.Use(middleware.StaticMiddleware())
|
||
}
|
||
|
||
func (s *AppServer) Run(db *gorm.DB) error {
|
||
// load system configs
|
||
var sysConfig model.Config
|
||
err := db.Where("name", "system").First(&sysConfig).Error
|
||
if err != nil {
|
||
return fmt.Errorf("failed to load system config: %v", err)
|
||
}
|
||
err = utils.JsonDecode(sysConfig.Value, &s.SysConfig)
|
||
if err != nil {
|
||
return fmt.Errorf("failed to decode system config: %v", err)
|
||
}
|
||
|
||
// 统计安装信息
|
||
go func() {
|
||
info, err := host.Info()
|
||
if err == nil {
|
||
apiURL := fmt.Sprintf("%s/api/installs/push", types.GeekAPIURL)
|
||
timestamp := time.Now().Unix()
|
||
product := "geekai-plus"
|
||
signStr := fmt.Sprintf("%s#%s#%d", product, info.HostID, timestamp)
|
||
sign := utils.Sha256(signStr)
|
||
resp, err := req.C().R().SetBody(map[string]interface{}{"product": product, "device_id": info.HostID, "timestamp": timestamp, "sign": sign}).Post(apiURL)
|
||
if err == nil {
|
||
logger.Debugf("register install info success: %v", resp.String())
|
||
}
|
||
}
|
||
}()
|
||
logger.Infof("http://%s", s.Config.Listen)
|
||
return s.Engine.Run(s.Config.Listen)
|
||
}
|
||
|
||
// 全局异常处理
|
||
func errorHandler(c *gin.Context) {
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
logger.Errorf("Handler Panic: %v", r)
|
||
debug.PrintStack()
|
||
c.JSON(http.StatusBadRequest, types.BizVo{Code: types.Failed, Message: types.ErrorMsg})
|
||
c.Abort()
|
||
}
|
||
}()
|
||
//加载完 defer recover,继续后续接口调用
|
||
c.Next()
|
||
}
|