package admin import ( "NetworkAuth/constants" "NetworkAuth/controllers" "NetworkAuth/middleware" "NetworkAuth/models" "NetworkAuth/services" "NetworkAuth/utils/timeutil" "github.com/gin-gonic/gin" "github.com/spf13/viper" ) // ============================================================================ // 全局变量 // ============================================================================ // 创建基础控制器实例 var handlersBaseController = controllers.NewBaseController() // ============================================================================ // 辅助函数 // ============================================================================ // formatDBType 格式化数据库类型显示 // 将配置文件中的小写类型转换为友好的显示格式 func formatDBType(dbType string) string { switch dbType { case "mysql": return "MySQL" case "sqlite": return "SQLite" case "postgresql", "postgres": return "PostgreSQL" case "sqlserver": return "SQL Server" default: return "SQLite" // 默认显示 } } // ============================================================================ // API处理器 // ============================================================================ // SystemInfoHandler 系统信息API接口 // 返回系统运行状态的JSON数据,用于前端定时刷新 func SystemInfoHandler(c *gin.Context) { version := constants.AppVersion mode := middleware.IsDevModeFromContext(c) dbType := viper.GetString("database.type") if dbType == "" { dbType = "sqlite" } uptime := timeutil.GetServerUptimeString() uptimeSeconds := int64(timeutil.GetServerUptime().Seconds()) data := gin.H{ "version": version, "mode": mode, "db_type": formatDBType(dbType), "uptime": uptime, "uptime_seconds": uptimeSeconds, } handlersBaseController.HandleSuccess(c, "ok", data) } // DashboardStatsHandler 仪表盘统计数据API接口 // - 返回应用统计数据的JSON数据,包括全部/启用/变量数量 func DashboardStatsHandler(c *gin.Context) { // 获取数据库连接 db, ok := handlersBaseController.GetDB(c) if !ok { return } // 统计应用数据 var totalApps int64 var totalFunctions int64 var totalVariables int64 // 统计全部应用数量 if err := db.Model(&models.App{}).Count(&totalApps).Error; err != nil { handlersBaseController.HandleInternalError(c, "统计应用数量失败", err) return } // 统计函数数量 if err := db.Model(&models.Function{}).Count(&totalFunctions).Error; err != nil { handlersBaseController.HandleInternalError(c, "统计函数数量失败", err) return } // 统计变量数量 if err := db.Model(&models.Variable{}).Count(&totalVariables).Error; err != nil { handlersBaseController.HandleInternalError(c, "统计变量数量失败", err) return } data := gin.H{ "total_apps": totalApps, "total_functions": totalFunctions, "total_variables": totalVariables, } handlersBaseController.HandleSuccess(c, "ok", data) } // DashboardLoginLogsHandler 获取管理员最近登录日志 func DashboardLoginLogsHandler(c *gin.Context) { db, ok := handlersBaseController.GetDB(c) if !ok { return } // 获取分页参数 page, limit := handlersBaseController.GetPaginationParams(c) // 获取当前管理员信息(可能是 username 或 admin_username,具体取决于认证中间件设置的 key) username := c.GetString("admin_username") if username == "" { // 尝试获取其他可能的键名 username = c.GetString("username") } var total int64 query := db.Model(&models.LoginLog{}).Where("type = ?", "admin") // 如果有用户名,则仅过滤该用户的日志 if username != "" { query = query.Where("username = ?", username) } logs, total, err := services.Paginate[models.LoginLog](query, page, limit, "created_at desc") if err != nil { handlersBaseController.HandleInternalError(c, "获取登录日志失败", err) return } data := gin.H{ "total": total, "list": logs, } handlersBaseController.HandleSuccess(c, "获取登录日志成功", data) }