package handler import ( "net/http" "github.com/gin-gonic/gin" "note-manager/middleware" "note-manager/service" ) // AdminHandler 后台管理处理器(登录页与页面跳转,多租户账号认证) type AdminHandler struct { userSvc *service.UserService } // NewAdminHandler 创建后台管理处理器 func NewAdminHandler(userSvc *service.UserService) *AdminHandler { return &AdminHandler{userSvc: userSvc} } // LoginPage 登录页面 func (h *AdminHandler) LoginPage(c *gin.Context) { c.HTML(http.StatusOK, "login.html", gin.H{ "title": "后台管理登录", }) } // Login 验证登录(用户名 + 密码,兼容 JSON 与 form) func (h *AdminHandler) Login(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") if username == "" && password == "" { // 尝试 JSON var req struct { Username string `json:"username"` Password string `json:"password"` } if err := c.ShouldBindJSON(&req); err == nil { username = req.Username password = req.Password } } u, err := h.userSvc.Login(username, password) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{ "code": 401, "message": err.Error(), }) return } token, _ := middleware.NewSession(u.ID) secure := c.Request.TLS != nil middleware.SetAuthCookie(c, token, secure) c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "登录成功", }) } // Logout 登出 func (h *AdminHandler) Logout(c *gin.Context) { middleware.RevokeSession(middleware.GetAuthToken(c)) middleware.ClearAuthCookie(c) c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "已退出登录", }) } // CheckAuth 检查是否已登录 func (h *AdminHandler) CheckAuth(c *gin.Context) { token := middleware.GetAuthToken(c) if middleware.IsValidSession(token) { c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "已登录", "data": gin.H{ "authenticated": true, }, }) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "message": "未登录", "data": gin.H{ "authenticated": false, }, }) } // IndexPage 后台管理首页(需登录,否则跳转登录页) func (h *AdminHandler) IndexPage(c *gin.Context) { token := middleware.GetAuthToken(c) if !middleware.IsValidSession(token) { c.Redirect(http.StatusFound, "/admin/login") return } c.HTML(http.StatusOK, "index.html", gin.H{ "title": "笔记管理后台", }) }