d9793300f9
- 新增 users 表(user_id 数据隔离,bcrypt 密码) - 认证: 注册/登录(用户名+密码)/会话绑定用户, 首个用户成为管理员并接管旧数据 - 数据隔离: 笔记/分类/标签/回收站/版本/草稿/图谱/FTS 全部按用户隔离 - 前台: 登录/注册弹窗, 登录后★收藏自己的笔记, 游客只读公开笔记 - 后台: 用户名+密码登录, 每人管理自己的工作区, 越权访问返回404 - 冒烟测试重构+新增多租户隔离用例(78/78)
103 lines
2.4 KiB
Go
103 lines
2.4 KiB
Go
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": "笔记管理后台",
|
||
})
|
||
}
|