fix: 修复关注/粉丝列表隐私检查假阳性导致本人也无法访问

- follow_repo.go: GetFollowListPublic 改用显式 WHERE uid=? 避免 GORM 主键解析潜在问题
- follow_service.go: GetFollowListPublic 失败时默认公开并记录日志,而非返回错误
- follow_controller.go: 错误兜底时 Accessible 默认 true,避免误锁用户
This commit is contained in:
2026-06-01 20:22:50 +08:00
parent bab8e47d63
commit a0df66587b
3 changed files with 13 additions and 7 deletions

View File

@ -140,7 +140,7 @@ func (fpc *FollowPageController) FollowersPage(c *gin.Context) {
uid, _, _ := common.GetGinUser(c) uid, _, _ := common.GetGinUser(c)
result, err := fpc.followSvc.ListFollowers(uint(targetUID), uid, page, 20) result, err := fpc.followSvc.ListFollowers(uint(targetUID), uid, page, 20)
if err != nil { if err != nil {
result = &service.FollowListResult{Items: []model.UserFollow{}, Total: 0} result = &service.FollowListResult{Items: []model.UserFollow{}, Total: 0, Accessible: true}
} }
c.HTML(http.StatusOK, "follow/followers.html", common.BuildPageData(c, gin.H{ c.HTML(http.StatusOK, "follow/followers.html", common.BuildPageData(c, gin.H{
@ -170,7 +170,7 @@ func (fpc *FollowPageController) FollowingPage(c *gin.Context) {
uid, _, _ := common.GetGinUser(c) uid, _, _ := common.GetGinUser(c)
result, err := fpc.followSvc.ListFollowing(uint(targetUID), uid, page, 20) result, err := fpc.followSvc.ListFollowing(uint(targetUID), uid, page, 20)
if err != nil { if err != nil {
result = &service.FollowListResult{Items: []model.UserFollow{}, Total: 0} result = &service.FollowListResult{Items: []model.UserFollow{}, Total: 0, Accessible: true}
} }
c.HTML(http.StatusOK, "follow/following.html", common.BuildPageData(c, gin.H{ c.HTML(http.StatusOK, "follow/following.html", common.BuildPageData(c, gin.H{

View File

@ -106,7 +106,10 @@ func (r *FollowRepo) IncrFollowingCount(userID uint, delta int) error {
// GetFollowListPublic 查询用户关注列表公开性 // GetFollowListPublic 查询用户关注列表公开性
func (r *FollowRepo) GetFollowListPublic(userID uint) (bool, error) { func (r *FollowRepo) GetFollowListPublic(userID uint) (bool, error) {
var user model.User var listPublic bool
err := r.db.Select("follow_list_public").First(&user, userID).Error err := r.db.Model(&model.User{}).
return user.FollowListPublic, err Select("follow_list_public").
Where("uid = ?", userID).
Scan(&listPublic).Error
return listPublic, err
} }

View File

@ -2,6 +2,7 @@ package service
import ( import (
"fmt" "fmt"
"log"
"metazone.cc/metalab/internal/common" "metazone.cc/metalab/internal/common"
"metazone.cc/metalab/internal/model" "metazone.cc/metalab/internal/model"
@ -132,7 +133,8 @@ func (s *FollowService) GetStatus(currentUserID, targetUserID uint) (*FollowStat
func (s *FollowService) ListFollowers(userID, currentUserID uint, page, pageSize int) (*FollowListResult, error) { func (s *FollowService) ListFollowers(userID, currentUserID uint, page, pageSize int) (*FollowListResult, error) {
listPublic, err := s.repo.GetFollowListPublic(userID) listPublic, err := s.repo.GetFollowListPublic(userID)
if err != nil { if err != nil {
return nil, fmt.Errorf("查询公开设置: %w", err) log.Printf("[FollowService] ListFollowers GetFollowListPublic error uid=%d: %v, fallback to public", userID, err)
listPublic = true
} }
p := common.Pagination{Page: page, PageSize: pageSize} p := common.Pagination{Page: page, PageSize: pageSize}
@ -174,7 +176,8 @@ func (s *FollowService) ListFollowers(userID, currentUserID uint, page, pageSize
func (s *FollowService) ListFollowing(userID, currentUserID uint, page, pageSize int) (*FollowListResult, error) { func (s *FollowService) ListFollowing(userID, currentUserID uint, page, pageSize int) (*FollowListResult, error) {
listPublic, err := s.repo.GetFollowListPublic(userID) listPublic, err := s.repo.GetFollowListPublic(userID)
if err != nil { if err != nil {
return nil, fmt.Errorf("查询公开设置: %w", err) log.Printf("[FollowService] ListFollowing GetFollowListPublic error uid=%d: %v, fallback to public", userID, err)
listPublic = true
} }
p := common.Pagination{Page: page, PageSize: pageSize} p := common.Pagination{Page: page, PageSize: pageSize}