Files
note-manager/handler/admin_handler.go
T
Your Name d9793300f9 feat: 多租户账号体系 + 前台收藏按钮
- 新增 users 表(user_id 数据隔离,bcrypt 密码)
- 认证: 注册/登录(用户名+密码)/会话绑定用户, 首个用户成为管理员并接管旧数据
- 数据隔离: 笔记/分类/标签/回收站/版本/草稿/图谱/FTS 全部按用户隔离
- 前台: 登录/注册弹窗, 登录后★收藏自己的笔记, 游客只读公开笔记
- 后台: 用户名+密码登录, 每人管理自己的工作区, 越权访问返回404
- 冒烟测试重构+新增多租户隔离用例(78/78)
2026-08-11 12:58:12 +08:00

103 lines
2.4 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 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": "笔记管理后台",
})
}