feat: 管理员后台配置 + PostgreSQL 支持
管理员后台: - User 新增 IsAdmin,第一个注册的用户自动成为管理员; 老库升级时自动把最早注册的用户提升为管理员 - 新增 AdminMiddleware 与 /api/v1/admin/config 读写接口 - 可改开放注册、检查间隔、规则重试时长、日志保留条数,保存即生效 - 检查间隔改动后自动重排定时任务,为此把 cron 抽成 handler/scheduler - 监听地址、数据库、会话密钥等启动项不开放,接口只返回只读展示 - 设置页新增"系统配置"区块,仅管理员可见 PostgreSQL: - 新增 database_driver / database_dsn 配置,默认仍为 sqlite - postgres 用独立连接池(20/5/1h),sqlite 保持单连接避免写锁 - 启动时先 Ping,配置写错在启动阶段就报错而不是等到首次查询 - 支持 GOODBABY_DB_DRIVER / GOODBABY_DB_DSN 环境变量, 只给 DSN 时自动按 postgres 处理 文档: 新增 docs/database.md(含 compose 示例与切换说明),README 补充管理员与数据库章节 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-contrib/sessions"
|
||||
"github.com/gin-contrib/sessions/cookie"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/robfig/cron/v3"
|
||||
"github.com/ssdomei232/goodBaby/api/account"
|
||||
"github.com/ssdomei232/goodBaby/api/admin"
|
||||
"github.com/ssdomei232/goodBaby/api/dashboard"
|
||||
apilog "github.com/ssdomei232/goodBaby/api/log"
|
||||
apimeta "github.com/ssdomei232/goodBaby/api/meta"
|
||||
@@ -17,9 +16,9 @@ import (
|
||||
"github.com/ssdomei232/goodBaby/api/timer"
|
||||
"github.com/ssdomei232/goodBaby/api/user"
|
||||
"github.com/ssdomei232/goodBaby/configs"
|
||||
"github.com/ssdomei232/goodBaby/handler/checker"
|
||||
"github.com/ssdomei232/goodBaby/handler/db"
|
||||
"github.com/ssdomei232/goodBaby/handler/runner"
|
||||
"github.com/ssdomei232/goodBaby/handler/scheduler"
|
||||
"github.com/ssdomei232/goodBaby/web"
|
||||
)
|
||||
|
||||
@@ -38,13 +37,11 @@ func main() {
|
||||
db.MustInit()
|
||||
runner.InitExecutorRegistry()
|
||||
|
||||
// 启动定时检查
|
||||
c := cron.New()
|
||||
spec := fmt.Sprintf("@every %dm", config.CheckIntervalMinutes)
|
||||
if _, err := c.AddFunc(spec, checker.CheckTimers); err != nil {
|
||||
log.Fatalf("注册定时任务失败: %v", err)
|
||||
// 启动定时检查(间隔可由管理员在 WebUI 调整,无需重启)
|
||||
if err := scheduler.Start(config.CheckIntervalMinutes); err != nil {
|
||||
log.Fatalf("启动定时任务失败: %v", err)
|
||||
}
|
||||
c.Start()
|
||||
defer scheduler.Stop()
|
||||
|
||||
r := gin.Default()
|
||||
|
||||
@@ -122,6 +119,14 @@ func main() {
|
||||
logs.GET("/", apilog.HandleGetLogs)
|
||||
logs.DELETE("/", apilog.HandleClearLogs)
|
||||
}
|
||||
|
||||
// 仅管理员可用
|
||||
adminGroup := authorized.Group("/admin")
|
||||
adminGroup.Use(user.AdminMiddleware())
|
||||
{
|
||||
adminGroup.GET("/config", admin.HandleGetConfig)
|
||||
adminGroup.PUT("/config", admin.HandleUpdateConfig)
|
||||
}
|
||||
}
|
||||
|
||||
// 挂载内嵌前端
|
||||
|
||||
Reference in New Issue
Block a user