Initial commit

This commit is contained in:
2026-06-30 15:14:37 +08:00
commit 15dab96872
311 changed files with 95639 additions and 0 deletions
+195
View File
@@ -0,0 +1,195 @@
package handler
import (
"net/http"
"git.zkcoi.com/zkcoi/meshray/internal/service"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// AdminHandler 管理员 Handler
type AdminHandler struct {
userService *service.UserService
restartCoreSvc *service.RestartCoreService
logger *zap.Logger
}
// NewAdminHandler 创建管理员 Handler
func NewAdminHandler(userService *service.UserService, logger *zap.Logger) *AdminHandler {
return &AdminHandler{
userService: userService,
restartCoreSvc: service.NewRestartCoreService(logger),
logger: logger,
}
}
// GetProfile 获取管理员信息
func (h *AdminHandler) GetProfile(c *gin.Context) {
// 从上下文获取用户 ID(由 JWT 中间件注入)
userID, exists := c.Get("user_id")
if !exists {
c.JSON(http.StatusUnauthorized, gin.H{"error": "未认证"})
return
}
// 获取用户信息
user, err := h.userService.GetUserByID(userID.(uint))
if err != nil {
h.logger.Error("获取管理员信息失败", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": "获取信息失败"})
return
}
c.JSON(http.StatusOK, gin.H{
"data": gin.H{
"id": user.ID,
"username": user.Username,
"email": user.Email,
"role": user.Role,
"status": user.Status,
"created_at": user.CreatedAt,
},
})
}
// UpdateProfileRequest 更新资料请求
type UpdateProfileRequest struct {
Username string `json:"username"`
Email string `json:"email"`
Password string `json:"password"` // 可选,留空则不修改
}
// UpdateProfile 更新管理员资料
func (h *AdminHandler) UpdateProfile(c *gin.Context) {
var req UpdateProfileRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误"})
return
}
// 从上下文获取当前用户名(用于验证)
currentUsername, _ := c.Get("username")
// 如果修改了用户名,需要验证不为空
if req.Username != "" && req.Username != currentUsername {
// 用户名不能为空
if len(req.Username) < 3 {
c.JSON(http.StatusBadRequest, gin.H{"error": "用户名至少 3 个字符"})
return
}
}
// 如果提供了密码,验证长度
if req.Password != "" && len(req.Password) < 6 {
c.JSON(http.StatusBadRequest, gin.H{"error": "密码至少 6 个字符"})
return
}
// 如果提供了邮箱,验证格式
if req.Email != "" {
if len(req.Email) < 5 || len(req.Email) > 255 {
c.JSON(http.StatusBadRequest, gin.H{"error": "邮箱格式无效"})
return
}
}
// 调用服务层更新
err := h.userService.UpdateAdminProfile(req.Username, req.Email, req.Password)
if err != nil {
h.logger.Error("更新管理员资料失败", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
h.logger.Info("管理员资料已更新",
zap.String("username", req.Username),
zap.Bool("password_changed", req.Password != ""))
c.JSON(http.StatusOK, gin.H{
"message": "资料已更新",
"data": gin.H{
"username": req.Username,
"email": req.Email,
"password_changed": req.Password != "",
},
})
}
// ChangePassword 修改密码
func (h *AdminHandler) ChangePassword(c *gin.Context) {
var req ChangePasswordRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误"})
return
}
// 从上下文获取用户 ID
userID, exists := c.Get("user_id")
if !exists {
c.JSON(http.StatusUnauthorized, gin.H{"error": "未认证"})
return
}
// 调用服务层修改密码
err := h.userService.ChangePassword(userID.(uint), &service.ChangePasswordRequest{
OldPassword: req.OldPassword,
NewPassword: req.NewPassword,
})
if err != nil {
h.logger.Error("修改密码失败", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
h.logger.Info("密码修改成功",
zap.Uint("user_id", userID.(uint)))
c.JSON(http.StatusOK, gin.H{
"message": "密码已修改",
})
}
// AdminRestartCoreRequest 重启核心服务请求(管理员接口)
type AdminRestartCoreRequest struct {
Force bool `json:"force"` // 是否强制重启
}
// RestartCore 重启核心服务
func (h *AdminHandler) RestartCore(c *gin.Context) {
var req AdminRestartCoreRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误"})
return
}
// 从上下文获取用户 ID(验证管理员权限)
userID, exists := c.Get("user_id")
if !exists {
c.JSON(http.StatusUnauthorized, gin.H{"error": "未认证"})
return
}
// 验证是否为管理员
user, err := h.userService.GetUserByID(userID.(uint))
if err != nil || user.Role != "admin" {
c.JSON(http.StatusForbidden, gin.H{"error": "需要管理员权限"})
return
}
// 调用服务层重启核心
err = h.restartCoreSvc.RestartCore()
if err != nil {
h.logger.Error("重启核心服务失败", zap.Error(err))
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
h.logger.Info("核心服务已重启",
zap.Uint("user_id", userID.(uint)),
zap.Bool("force", req.Force))
c.JSON(http.StatusOK, gin.H{
"message": "核心服务正在重启",
})
}