mirror of
https://github.com/yangjian102621/geekai.git
synced 2026-07-18 01:06:06 +00: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()
|
|
}
|