Spaces:
Running
Running
File size: 5,098 Bytes
f68778c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | # router_users_social.py
# ==========================================
# 🤝 用户社交路由模块
# ==========================================
# 作用:处理用户间的社交互动(关注/取关)和隐私设置
# 关联文件:
# - 数据库连接.py (JSON数据库读写 users.json)
# - notifications.py (发送关注通知)
# - models.py (FollowToggle, PrivacySettings 数据模型)
# - router_users.py (主路由聚合此模块)
# 前端调用:
# - 个人中心视图.js (关注/取关按钮)
# - 个人设置表单组件.js (隐私设置)
# ==========================================
from fastapi import APIRouter, HTTPException
import 数据库连接 as db
from notifications import add_notification
from models import FollowToggle, PrivacySettings
# 创建子路由实例
router = APIRouter()
# ==========================================
# 👥 关注/取消关注接口
# ==========================================
# 作用:用户A关注或取消关注用户B
# 关联:
# - users.json 的 followers 和 following 字段
# - notifications.py 的 add_notification() (发送关注通知)
# 数据结构:
# - 用户A.following: 存储A关注的人的账号列表
# - 用户B.followers: 存储关注B的人的账号列表
# 前端调用:
# - 个人中心视图.js 的 handleFollowToggle()
@router.post("/api/users/follow")
async def toggle_follow(follow: FollowToggle):
"""
关注/取消关注接口
请求参数:(FollowToggle 模型)
- user_id: 当前操作用户的账号(执行关注动作的人)
- target_account: 被关注/取关的目标用户账号
- is_active: True=关注, False=取消关注
"""
# 加载用户数据库
users_db = db.load_data("users.json", default_data={})
# ========== 用户存在性校验 ==========
if follow.target_account not in users_db or follow.user_id not in users_db:
raise HTTPException(status_code=404, detail="用户不存在")
# 获取双方的关注/粉丝列表
# setdefault 确保字段存在,不存在则初始化为空列表
target_followers = users_db[follow.target_account].setdefault("followers", [])
current_following = users_db[follow.user_id].setdefault("following", [])
# ========== 执行关注或取关操作 ==========
if follow.is_active:
# === 关注操作 ===
# 将当前用户添加到目标用户的粉丝列表
if follow.user_id not in target_followers:
target_followers.append(follow.user_id)
# 发送关注通知给目标用户
# 关联:notifications.py 的 add_notification()
add_notification(follow.target_account, {
"type": "follow",
"from_user": follow.user_id
})
# 将目标用户添加到当前用户的关注列表
if follow.target_account not in current_following:
current_following.append(follow.target_account)
else:
# === 取消关注操作 ===
# 从目标用户的粉丝列表中移除当前用户
if follow.user_id in target_followers:
target_followers.remove(follow.user_id)
# 从当前用户的关注列表中移除目标用户
if follow.target_account in current_following:
current_following.remove(follow.target_account)
# 保存更新后的数据
db.save_data("users.json", users_db)
return {"status": "success"}
# ==========================================
# 🔒 隐私设置接口
# ==========================================
# 作用:更新用户的隐私偏好设置
# 关联:
# - users.json 的 privacy 字段
# - models.py 的 PrivacySettings 模型
# 隐私选项说明:
# - follows: 是否公开关注列表
# - likes: 是否公开点赞记录
# - favorites: 是否公开收藏记录
# - downloads: 是否公开下载/使用记录
# 前端调用:
# - 个人设置表单组件.js 的隐私设置区域
@router.put("/api/users/{account}/privacy")
async def update_privacy(account: str, privacy: PrivacySettings):
"""
更新隐私设置接口
路径参数:
- account: 用户账号
请求参数:(PrivacySettings 模型)
- follows: 是否隐藏关注列表 (True=隐藏)
- likes: 是否隐藏点赞记录 (True=隐藏)
- favorites: 是否隐藏收藏记录 (True=隐藏)
- downloads: 是否隐藏下载记录 (True=隐藏)
"""
# 加载用户数据库
users_db = db.load_data("users.json", default_data={})
# 检查用户是否存在
if account not in users_db:
raise HTTPException(status_code=404, detail="用户不存在")
# 更新用户的隐私设置
users_db[account]["privacy"] = privacy.dict()
# 保存更新后的数据
db.save_data("users.json", users_db)
return {"status": "success"}
|