Files
mce/internal/router/frontend.go
Victor_Jay 0b8f6f890d feat: 分类系统 + 标签系统 — Phase 4 完成
分类:Model/Repo/Service/Controller + 管理后台树形页面 + 首页导航栏
标签:Model/Repo/Service/Controller + /tags/{slug} 落地页 + 写文章页输入
Post 加 CategoryID,Create/Update 支持分类和标签
SQL 迁移含 categories/tags/post_tags 表及预设未分类
2026-06-22 00:30:29 +08:00

93 lines
2.6 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 router
import (
"net/http"
"metazone.cc/mce/internal/common"
"metazone.cc/mce/internal/config"
"metazone.cc/mce/internal/middleware"
"github.com/gin-gonic/gin"
)
// setupFrontendRoutes 注册前端页面路由
func setupFrontendRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
// --- 页面路由CSRF 仅下发 token不验证 ---
pages := r.Group("/")
pages.Use(d.authMdw.Optional())
pages.Use(middleware.CSRF(cfg))
pages.Use(func(c *gin.Context) {
middleware.SetCSRFToken(c, cfg)
c.Next()
})
{
pages.GET("/", func(c *gin.Context) {
posts, total, ok := d.homeCache.Get()
if !ok {
var err error
posts, total, err = d.postService.List("", 1, 6)
if err != nil {
posts = nil
total = 0
} else {
d.homeCache.Set(posts, total)
}
}
announcements, _ := d.announcementService.ListActive()
categoryNav, _ := d.categoryService.GetLeaves()
c.HTML(http.StatusOK, "home/index.html", common.BuildPageData(c, gin.H{
"Title": "首页",
"ExtraCSS": "/static/css/home.css",
"Posts": posts,
"PostCount": total,
"Announcements": announcements,
"CategoryNav": categoryNav,
}))
})
pages.GET("/settings", func(c *gin.Context) {
c.Redirect(http.StatusFound, "/settings/profile")
})
pages.GET("/settings/:tab", d.settingsCtrl.SettingsPage)
pages.GET("/messages", d.messageCtrl.MessagesPage)
// 用户空间(静态 /space 必须在 :uid 之前注册)
pages.GET("/space", d.spaceCtrl.MySpace)
pages.GET("/space/:uid", d.spaceCtrl.ShowSpace)
// 帖子页面
pages.GET("/posts", d.postCtrl.ListPage)
pages.GET("/posts/:id", d.postCtrl.ShowPage)
// 标签落地页
pages.GET("/tags/:slug", d.tagCtrl.TagPage)
pages.GET("/posts/:id/edit", d.authMdw.Required(), func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "/studio/write?id="+c.Param("id"))
})
// 创作中心(需登录)
studioPages := pages.Group("/studio")
studioPages.Use(d.authMdw.Required())
{
studioPages.GET("", d.studioCtrl.OverviewPage)
studioPages.GET("/posts", d.studioCtrl.PostsPage)
studioPages.GET("/drafts", d.studioCtrl.DraftsPage)
studioPages.GET("/write", d.studioCtrl.WritePage)
studioPages.GET("/analytics", d.studioCtrl.AnalyticsPage)
}
}
// 认证页面(已登录自动跳走)
authPages := r.Group("/auth")
authPages.Use(d.authMdw.Optional())
authPages.Use(middleware.CSRF(cfg))
authPages.Use(func(c *gin.Context) {
middleware.SetCSRFToken(c, cfg)
c.Next()
})
{
authPages.GET("/register", d.authCtrl.RegisterPage)
authPages.GET("/login", d.authCtrl.LoginPage)
}
}