整理router
This commit is contained in:
@@ -235,3 +235,9 @@ func ChangePassword(c *gin.Context) {
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "密码修改成功"})
|
||||
}
|
||||
|
||||
// 判断是否为管理员
|
||||
func isAdmin(c *gin.Context) bool {
|
||||
role, exists := c.Get("role")
|
||||
return exists && role == "admin"
|
||||
}
|
||||
|
||||
@@ -17,15 +17,15 @@ func GetComments(c *gin.Context) {
|
||||
postSlug := c.Query("post_slug") // 前台使用 slug
|
||||
status := c.Query("status")
|
||||
pageStr := c.DefaultQuery("page", "1")
|
||||
pageSizeStr := c.DefaultQuery("page_size", "10")
|
||||
pageSizeStr := c.DefaultQuery("page_size", "1000")
|
||||
|
||||
// 解析分页参数
|
||||
page := 1
|
||||
pageSize := 10
|
||||
pageSize := 1000
|
||||
if p, err := strconv.Atoi(pageStr); err == nil && p > 0 {
|
||||
page = p
|
||||
}
|
||||
if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 100 {
|
||||
if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 1000 {
|
||||
pageSize = ps
|
||||
}
|
||||
|
||||
|
||||
@@ -371,9 +371,3 @@ func DeletePost(c *gin.Context) {
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
|
||||
}
|
||||
|
||||
// 判断是否为管理员
|
||||
func isAdmin(c *gin.Context) bool {
|
||||
role, exists := c.Get("role")
|
||||
return exists && role == "admin"
|
||||
}
|
||||
|
||||
@@ -129,6 +129,15 @@ func IndexView(c *gin.Context) {
|
||||
db.Order("is_top DESC, published_at DESC, created_at DESC").
|
||||
Offset(offset).Limit(pageSize).Find(&posts)
|
||||
|
||||
// 如果摘要为空,则从内容中提取摘要
|
||||
for i := range posts {
|
||||
if posts[i].Summary == "" && posts[i].Content != "" && len(posts[i].Content) > 120 {
|
||||
posts[i].Summary = posts[i].Content[:120]
|
||||
} else {
|
||||
posts[i].Summary = posts[i].Content
|
||||
}
|
||||
}
|
||||
|
||||
totalPages := int(math.Ceil(float64(total) / float64(pageSize)))
|
||||
categories, tags, postCount, categoryCount, tagCount := loadSidebarData()
|
||||
siteName, siteDesc := loadSiteInfo(cfg)
|
||||
@@ -397,7 +406,6 @@ func SubmitComment(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// 检查文章是否存在
|
||||
// 检查文章是否存在
|
||||
var post models.Post
|
||||
if err := database.DB.First(&post, req.PostID).Error; err != nil {
|
||||
|
||||
+24
-39
@@ -9,30 +9,19 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
staticPath = "/static"
|
||||
adminStaticPath = "/admin/static"
|
||||
adminPath = "/admin"
|
||||
apiPrefix = "/api"
|
||||
staticPath = "/static"
|
||||
adminPath = "/admin"
|
||||
apiPrefix = "/api"
|
||||
)
|
||||
|
||||
// SetupRoutes 配置所有路由
|
||||
func SetupRoutes(r *gin.Engine) {
|
||||
setupStaticRoutes(r)
|
||||
setupAdminPageRoutes(r)
|
||||
setupFrontendRoutes(r)
|
||||
setupAPIRoutes(r)
|
||||
}
|
||||
|
||||
// setupStaticRoutes 静态资源
|
||||
func setupStaticRoutes(r *gin.Engine) {
|
||||
// 静态资源路由
|
||||
r.Static(staticPath, "./static")
|
||||
r.Static(adminStaticPath, "./static/admin")
|
||||
}
|
||||
|
||||
// setupAdminPageRoutes 后台管理页面(服务端渲染)
|
||||
func setupAdminPageRoutes(r *gin.Engine) {
|
||||
r.GET(adminPath+"/login", backend.AdminLoginView)
|
||||
r.GET(adminPath, middleware.JWTAuth(), backend.AdminView)
|
||||
// 前台页面
|
||||
setupFrontendRoutes(r)
|
||||
// 后台管理页面
|
||||
setupAdminPageRoutes(r)
|
||||
}
|
||||
|
||||
// setupFrontendRoutes 前台页面(服务端渲染)
|
||||
@@ -41,12 +30,20 @@ func setupFrontendRoutes(r *gin.Engine) {
|
||||
r.GET("/post/:slug", frontend.PostView)
|
||||
r.GET("/page/:slug", frontend.PageView)
|
||||
r.GET("/search", frontend.SearchView)
|
||||
|
||||
// 评论管理
|
||||
r.GET("/posts/:postID/comments", frontend.ListComments)
|
||||
r.POST("/posts/:postID/comment", frontend.SubmitComment)
|
||||
r.GET("/logout", backend.WebLogout)
|
||||
}
|
||||
|
||||
// setupAdminPageRoutes 后台管理页面(服务端渲染)
|
||||
func setupAdminPageRoutes(r *gin.Engine) {
|
||||
r.GET(adminPath+"/login", backend.AdminLoginView)
|
||||
r.GET(adminPath, middleware.JWTAuth(), backend.AdminView)
|
||||
// API 路由
|
||||
setupAPIRoutes(r)
|
||||
}
|
||||
|
||||
// setupAPIRoutes API 路由分组
|
||||
func setupAPIRoutes(r *gin.Engine) {
|
||||
api := r.Group(apiPrefix)
|
||||
@@ -61,7 +58,7 @@ func setupAuthenticatedAPIRoutes(api *gin.RouterGroup) {
|
||||
auth := api.Group("/")
|
||||
auth.Use(middleware.JWTAuth())
|
||||
|
||||
// 仪表盘公开统计数据(可选认证,登录后返回更多数据)
|
||||
// 仪表盘公开统计数据
|
||||
auth.GET("/dashboard/stats", backend.GetDashboardStats)
|
||||
// 当前用户信息
|
||||
auth.GET("/auth/me", backend.GetCurrentUser)
|
||||
@@ -81,12 +78,9 @@ func setupAuthenticatedAPIRoutes(api *gin.RouterGroup) {
|
||||
|
||||
// 评论管理(查看所有评论,需登录)
|
||||
auth.GET("/comments", backend.GetComments)
|
||||
|
||||
// 我的评论管理(用户自己文章下的评论)
|
||||
auth.GET("/my/comments", backend.GetComments)
|
||||
auth.PUT("/my/comments/:id/approve", backend.ApproveComment)
|
||||
auth.PUT("/my/comments/:id/spam", backend.MarkSpamComment)
|
||||
auth.DELETE("/my/comments/:id", backend.DeleteComment)
|
||||
auth.PUT("/comments/:id/approve", backend.ApproveComment)
|
||||
auth.PUT("/comments/:id/spam", backend.MarkSpamComment)
|
||||
auth.DELETE("/comments/:id", backend.DeleteComment)
|
||||
|
||||
// Markdown 预览
|
||||
auth.POST("/markdown/preview", backend.PreviewMarkdown)
|
||||
@@ -110,6 +104,8 @@ func setupAdminAPIRoutes(api *gin.RouterGroup) {
|
||||
admin.DELETE("/categories/:id", backend.DeleteCategory)
|
||||
|
||||
// 标签管理(写入)
|
||||
admin.GET("/tags", backend.GetTags)
|
||||
admin.POST("/tags", backend.CreateTag)
|
||||
admin.GET("/tags/:id", backend.GetTag)
|
||||
admin.PUT("/tags/:id", backend.UpdateTag)
|
||||
admin.DELETE("/tags/:id", backend.DeleteTag)
|
||||
@@ -117,15 +113,10 @@ func setupAdminAPIRoutes(api *gin.RouterGroup) {
|
||||
// 页面管理(写入)
|
||||
admin.GET("/pages", backend.GetPages)
|
||||
admin.POST("/pages", backend.CreatePage)
|
||||
admin.GET("/pages/:id", backend.GetPage)
|
||||
admin.PUT("/pages/:id", backend.UpdatePage)
|
||||
admin.DELETE("/pages/:id", backend.DeletePage)
|
||||
|
||||
// 评论管理(所有评论,写入 + 删除)
|
||||
admin.GET("/comments", backend.GetComments) // 管理员可查看所有评论
|
||||
admin.PUT("/comments/:id/approve", backend.ApproveComment)
|
||||
admin.PUT("/comments/:id/spam", backend.MarkSpamComment)
|
||||
admin.DELETE("/comments/:id", backend.DeleteComment)
|
||||
|
||||
// 用户管理
|
||||
admin.GET("/users", backend.GetUsers)
|
||||
admin.POST("/users", backend.CreateUser)
|
||||
@@ -137,13 +128,7 @@ func setupAdminAPIRoutes(api *gin.RouterGroup) {
|
||||
admin.GET("/settings", backend.GetSettings)
|
||||
admin.PUT("/settings", backend.UpdateSettings)
|
||||
|
||||
// 文件管理
|
||||
admin.POST("/upload", backend.UploadImage) // 管理员上传(也可在认证组)
|
||||
admin.GET("/uploads", backend.ListUploads)
|
||||
admin.DELETE("/uploads/:id", backend.DeleteUpload)
|
||||
|
||||
// 主题管理(登录用户可切换主题、创建主题、编辑文件)
|
||||
// 主题公开信息
|
||||
admin.GET("/themes", backend.GetThemes)
|
||||
admin.GET("/theme", backend.GetCurrentTheme)
|
||||
admin.POST("/theme", backend.SwitchTheme)
|
||||
|
||||
+3
-8
@@ -746,15 +746,10 @@ async function loadPages() {
|
||||
}
|
||||
}
|
||||
|
||||
// 评论管理 API 基础路径(管理员走 admin 组,普通用户走 my 组)
|
||||
function commentsAPIBase() {
|
||||
return (currentUser && currentUser.role === 'admin') ? `${API_BASE}/admin` : `${API_BASE}/my`;
|
||||
}
|
||||
|
||||
// 加载评论(postId 为空时加载全部)
|
||||
async function loadComments(postId = '') {
|
||||
try {
|
||||
const url = postId ? `${commentsAPIBase()}/comments?post_id=${postId}` : `${commentsAPIBase()}/comments`;
|
||||
const url = postId ? `${API_BASE}/comments?post_id=${postId}` : `${API_BASE}/comments`;
|
||||
const res = await fetch(url, { headers: getHeaders() });
|
||||
const data = await res.json();
|
||||
|
||||
@@ -958,7 +953,7 @@ async function deletePage(id) {
|
||||
|
||||
// 通过评论
|
||||
async function approveComment(id) {
|
||||
await fetch(`${commentsAPIBase()}/comments/${id}/approve`, {
|
||||
await fetch(`${API_BASE}/comments/${id}/approve`, {
|
||||
method: 'PUT',
|
||||
headers: getHeaders()
|
||||
});
|
||||
@@ -968,7 +963,7 @@ async function approveComment(id) {
|
||||
// 删除评论
|
||||
async function deleteComment(id) {
|
||||
if (!confirm('确定要删除这条评论吗?')) return;
|
||||
await fetch(`${commentsAPIBase()}/comments/${id}`, {
|
||||
await fetch(`${API_BASE}/comments/${id}`, {
|
||||
method: 'DELETE',
|
||||
headers: getHeaders()
|
||||
});
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>后台管理 - GoBlog</title>
|
||||
<link rel="icon" href="/static/images/favicon.ico" type="image/x-icon">
|
||||
<link rel="stylesheet" href="/static/css/adminstyle.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/admin.css?v=3">
|
||||
</head>
|
||||
<body>
|
||||
<div class="admin-header">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>登录 - GoBlog 后台管理</title>
|
||||
<link rel="icon" href="/static/images/favicon.ico" type="image/x-icon">
|
||||
<link rel="stylesheet" href="/static/css/adminstyle.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/admin.css?v=3">
|
||||
</head>
|
||||
<body>
|
||||
<div id="login-page">
|
||||
|
||||
Reference in New Issue
Block a user