2025-10-24 00:09:45 +08:00
|
|
|
|
package admin
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-18 21:51:17 +08:00
|
|
|
|
"NetworkAuth/constants"
|
|
|
|
|
|
"NetworkAuth/controllers"
|
|
|
|
|
|
"NetworkAuth/middleware"
|
|
|
|
|
|
"NetworkAuth/models"
|
|
|
|
|
|
"NetworkAuth/services"
|
|
|
|
|
|
"NetworkAuth/utils/timeutil"
|
2025-10-24 00:09:45 +08:00
|
|
|
|
|
2025-10-26 14:48:02 +08:00
|
|
|
|
"github.com/gin-gonic/gin"
|
2025-10-24 00:09:45 +08:00
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-27 23:12:15 +08:00
|
|
|
|
// ============================================================================
|
|
|
|
|
|
// 全局变量
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
2025-10-26 14:48:02 +08:00
|
|
|
|
// 创建基础控制器实例
|
|
|
|
|
|
var handlersBaseController = controllers.NewBaseController()
|
|
|
|
|
|
|
2025-10-27 23:12:15 +08:00
|
|
|
|
// ============================================================================
|
|
|
|
|
|
// 辅助函数
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
2025-10-26 11:57:31 +08:00
|
|
|
|
// 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" // 默认显示
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-27 23:12:15 +08:00
|
|
|
|
// ============================================================================
|
|
|
|
|
|
// API处理器
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
2025-10-24 00:09:45 +08:00
|
|
|
|
// SystemInfoHandler 系统信息API接口
|
2026-03-28 23:30:02 +08:00
|
|
|
|
// 返回系统运行状态的JSON数据,用于前端定时刷新
|
2025-10-26 14:48:02 +08:00
|
|
|
|
func SystemInfoHandler(c *gin.Context) {
|
|
|
|
|
|
version := constants.AppVersion
|
2025-10-26 22:28:50 +08:00
|
|
|
|
mode := middleware.IsDevModeFromContext(c)
|
2025-10-24 00:09:45 +08:00
|
|
|
|
dbType := viper.GetString("database.type")
|
|
|
|
|
|
if dbType == "" {
|
|
|
|
|
|
dbType = "sqlite"
|
|
|
|
|
|
}
|
|
|
|
|
|
uptime := timeutil.GetServerUptimeString()
|
2026-03-28 23:30:02 +08:00
|
|
|
|
uptimeSeconds := int64(timeutil.GetServerUptime().Seconds())
|
2025-10-24 00:09:45 +08:00
|
|
|
|
|
2025-10-26 14:48:02 +08:00
|
|
|
|
data := gin.H{
|
2026-03-28 23:30:02 +08:00
|
|
|
|
"version": version,
|
|
|
|
|
|
"mode": mode,
|
|
|
|
|
|
"db_type": formatDBType(dbType),
|
|
|
|
|
|
"uptime": uptime,
|
|
|
|
|
|
"uptime_seconds": uptimeSeconds,
|
2025-10-24 00:09:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-26 14:48:02 +08:00
|
|
|
|
handlersBaseController.HandleSuccess(c, "ok", data)
|
2025-10-24 00:09:45 +08:00
|
|
|
|
}
|
2025-10-26 11:57:31 +08:00
|
|
|
|
|
|
|
|
|
|
// DashboardStatsHandler 仪表盘统计数据API接口
|
2026-03-28 23:30:02 +08:00
|
|
|
|
// - 返回应用统计数据的JSON数据,包括全部/启用/变量数量
|
2025-10-26 14:48:02 +08:00
|
|
|
|
func DashboardStatsHandler(c *gin.Context) {
|
2025-10-26 11:57:31 +08:00
|
|
|
|
// 获取数据库连接
|
2025-10-26 14:48:02 +08:00
|
|
|
|
db, ok := handlersBaseController.GetDB(c)
|
|
|
|
|
|
if !ok {
|
2025-10-26 11:57:31 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 统计应用数据
|
|
|
|
|
|
var totalApps int64
|
2026-03-28 23:30:02 +08:00
|
|
|
|
var totalFunctions int64
|
2025-10-26 11:57:31 +08:00
|
|
|
|
var totalVariables int64
|
|
|
|
|
|
|
|
|
|
|
|
// 统计全部应用数量
|
|
|
|
|
|
if err := db.Model(&models.App{}).Count(&totalApps).Error; err != nil {
|
2025-10-26 14:48:02 +08:00
|
|
|
|
handlersBaseController.HandleInternalError(c, "统计应用数量失败", err)
|
2025-10-26 11:57:31 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-28 23:30:02 +08:00
|
|
|
|
// 统计函数数量
|
|
|
|
|
|
if err := db.Model(&models.Function{}).Count(&totalFunctions).Error; err != nil {
|
|
|
|
|
|
handlersBaseController.HandleInternalError(c, "统计函数数量失败", err)
|
2025-10-26 11:57:31 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 统计变量数量
|
|
|
|
|
|
if err := db.Model(&models.Variable{}).Count(&totalVariables).Error; err != nil {
|
2025-10-26 14:48:02 +08:00
|
|
|
|
handlersBaseController.HandleInternalError(c, "统计变量数量失败", err)
|
2025-10-26 11:57:31 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-26 14:48:02 +08:00
|
|
|
|
data := gin.H{
|
2025-10-26 11:57:31 +08:00
|
|
|
|
"total_apps": totalApps,
|
2026-03-28 23:30:02 +08:00
|
|
|
|
"total_functions": totalFunctions,
|
2025-10-26 11:57:31 +08:00
|
|
|
|
"total_variables": totalVariables,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-26 14:48:02 +08:00
|
|
|
|
handlersBaseController.HandleSuccess(c, "ok", data)
|
2025-10-26 11:57:31 +08:00
|
|
|
|
}
|
2026-03-18 21:51:17 +08:00
|
|
|
|
|
|
|
|
|
|
// DashboardLoginLogsHandler 获取管理员最近登录日志
|
|
|
|
|
|
func DashboardLoginLogsHandler(c *gin.Context) {
|
|
|
|
|
|
db, ok := handlersBaseController.GetDB(c)
|
|
|
|
|
|
if !ok {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取分页参数
|
2026-03-19 19:17:37 +08:00
|
|
|
|
page, limit := handlersBaseController.GetPaginationParams(c)
|
2026-03-18 21:51:17 +08:00
|
|
|
|
|
2026-03-19 05:11:44 +08:00
|
|
|
|
// 获取当前管理员信息(可能是 username 或 admin_username,具体取决于认证中间件设置的 key)
|
|
|
|
|
|
username := c.GetString("admin_username")
|
|
|
|
|
|
if username == "" {
|
|
|
|
|
|
// 尝试获取其他可能的键名
|
|
|
|
|
|
username = c.GetString("username")
|
|
|
|
|
|
}
|
2026-03-19 19:17:37 +08:00
|
|
|
|
|
2026-03-18 21:51:17 +08:00
|
|
|
|
var total int64
|
2026-03-19 05:11:44 +08:00
|
|
|
|
query := db.Model(&models.LoginLog{}).Where("type = ?", "admin")
|
|
|
|
|
|
|
|
|
|
|
|
// 如果有用户名,则仅过滤该用户的日志
|
|
|
|
|
|
if username != "" {
|
|
|
|
|
|
query = query.Where("username = ?", username)
|
|
|
|
|
|
}
|
2026-03-18 21:51:17 +08:00
|
|
|
|
|
2026-03-19 19:17:37 +08:00
|
|
|
|
logs, total, err := services.Paginate[models.LoginLog](query, page, limit, "created_at desc")
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
handlersBaseController.HandleInternalError(c, "获取登录日志失败", err)
|
2026-03-18 21:51:17 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
data := gin.H{
|
|
|
|
|
|
"total": total,
|
|
|
|
|
|
"list": logs,
|
|
|
|
|
|
}
|
|
|
|
|
|
handlersBaseController.HandleSuccess(c, "获取登录日志成功", data)
|
|
|
|
|
|
}
|