122 lines
3.6 KiB
Go
122 lines
3.6 KiB
Go
package controller
|
||
|
||
import (
|
||
"net/http"
|
||
"strconv"
|
||
|
||
"metazone.cc/mce/internal/common"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// SpaceController 用户空间控制器(统一页面:文章/关注/粉丝/收藏/设置)
|
||
type SpaceController struct {
|
||
spaceService spaceUseCase
|
||
followSvc followUseCase
|
||
favoriteSvc favoriteUseCaseForSpace
|
||
}
|
||
|
||
// NewSpaceController 构造函数
|
||
func NewSpaceController(spaceService spaceUseCase) *SpaceController {
|
||
return &SpaceController{spaceService: spaceService}
|
||
}
|
||
|
||
// WithFollowService 注入关注服务(可选依赖)
|
||
func (ctrl *SpaceController) WithFollowService(svc followUseCase) {
|
||
ctrl.followSvc = svc
|
||
}
|
||
|
||
// WithFavoriteService 注入收藏夹服务(可选依赖)
|
||
func (ctrl *SpaceController) WithFavoriteService(svc favoriteUseCaseForSpace) {
|
||
ctrl.favoriteSvc = svc
|
||
}
|
||
|
||
// MySpace 自己的空间(/space)— 需登录,重定向到 /space/{uid}
|
||
func (ctrl *SpaceController) MySpace(c *gin.Context) {
|
||
uid, _, ok := common.GetGinUser(c)
|
||
if !ok {
|
||
common.RedirectToLogin(c)
|
||
return
|
||
}
|
||
c.Redirect(http.StatusFound, "/space/"+strconv.FormatUint(uint64(uid), 10))
|
||
}
|
||
|
||
// ShowSpace 统一空间页面(/space/:uid?tab=articles|following|followers|collections|settings)
|
||
func (ctrl *SpaceController) ShowSpace(c *gin.Context) {
|
||
uidStr := c.Param("uid")
|
||
uid, err := strconv.ParseUint(uidStr, 10, 64)
|
||
if err != nil {
|
||
c.HTML(http.StatusNotFound, "space/index.html", common.BuildPageData(c, gin.H{
|
||
"Title": "用户不存在",
|
||
"Error": "用户不存在",
|
||
"ExtraCSS": "/static/css/space.css",
|
||
}))
|
||
return
|
||
}
|
||
|
||
spaceUser, err := ctrl.spaceService.GetSpaceUser(uint(uid))
|
||
if err != nil || spaceUser == nil {
|
||
c.HTML(http.StatusNotFound, "space/index.html", common.BuildPageData(c, gin.H{
|
||
"Title": "用户不存在",
|
||
"Error": "用户不存在",
|
||
"ExtraCSS": "/static/css/space.css",
|
||
}))
|
||
return
|
||
}
|
||
|
||
// 当前登录用户
|
||
currentUID, _, _ := common.GetGinUser(c)
|
||
isOwnSpace := currentUID == uint(uid)
|
||
|
||
// 当前激活的 Tab
|
||
tab := c.DefaultQuery("tab", "articles")
|
||
|
||
// 分页参数
|
||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||
if page < 1 { page = 1 }
|
||
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "18"))
|
||
if pageSize < 1 || pageSize > 50 { pageSize = 18 }
|
||
|
||
// 构建基础数据(含用户统计)
|
||
postCount, _ := ctrl.spaceService.CountUserPosts(uint(uid))
|
||
totalLikes, totalFavorites, totalReads, _ := ctrl.spaceService.GetUserStats(uint(uid))
|
||
|
||
data := gin.H{
|
||
"Title": spaceUser.Username + " 的空间",
|
||
"SpaceUser": spaceUser,
|
||
"IsOwnSpace": isOwnSpace,
|
||
"ActiveTab": tab,
|
||
"CurrentUID": currentUID,
|
||
"ExtraCSS": "/static/css/space.css",
|
||
"PostCount": postCount,
|
||
"TotalLikes": totalLikes,
|
||
"TotalFavorites": totalFavorites,
|
||
"TotalReads": totalReads,
|
||
}
|
||
|
||
// ---- 根据 Tab 加载对应数据 ----
|
||
switch tab {
|
||
case "following":
|
||
ctrl.loadFollowingData(c, data, uint(uid), currentUID, page, pageSize)
|
||
case "followers":
|
||
ctrl.loadFollowersData(c, data, uint(uid), currentUID, page, pageSize)
|
||
case "collections":
|
||
if !isOwnSpace {
|
||
// 访客不可看收藏夹,重定向到文章
|
||
c.Redirect(http.StatusFound, "/space/"+uidStr+"?tab=articles")
|
||
return
|
||
}
|
||
ctrl.loadCollectionsData(c, data, currentUID, page, pageSize)
|
||
case "settings":
|
||
if !isOwnSpace {
|
||
c.Redirect(http.StatusFound, "/space/"+uidStr+"?tab=articles")
|
||
return
|
||
}
|
||
// 设置页无需额外数据,模板中直接渲染隐私开关
|
||
default: // articles
|
||
ctrl.loadArticlesData(c, data, uint(uid), page, pageSize)
|
||
}
|
||
|
||
c.HTML(http.StatusOK, "space/index.html", common.BuildPageData(c, data))
|
||
}
|