Files
NetworkAuth/controllers/admin/dashboard.go

148 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}