diff --git a/backend/app/routers/friends.py b/backend/app/routers/friends.py index 2f834a7..351f27a 100644 --- a/backend/app/routers/friends.py +++ b/backend/app/routers/friends.py @@ -56,21 +56,6 @@ async def send_friend_request( raise HTTPException(status_code=400, detail=str(e)) -@router.post("/add-direct") -async def add_friend_direct( - req: FriendRequestCreate, - user: User = Depends(get_current_user), - db: AsyncSession = Depends(get_db), -): - """直接添加好友(跳过验证)""" - service = FriendService(db) - try: - await service.add_direct(user.id, req.to_user_id) - return {"success": True, "message": "已添加好友"} - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - - @router.put("/{friend_user_id}/remark") async def update_friend_remark( friend_user_id: str, diff --git a/backend/app/routers/users.py b/backend/app/routers/users.py index d775303..b19b1bb 100644 --- a/backend/app/routers/users.py +++ b/backend/app/routers/users.py @@ -25,6 +25,10 @@ class StatusUpdate(BaseModel): expires_hours: int | None = None +class DeleteAccountRequest(BaseModel): + password: str + + @router.get("/me", response_model=UserRead) async def get_me(user: User = Depends(get_current_user)): """获取当前用户信息""" @@ -58,6 +62,21 @@ async def change_password( raise HTTPException(status_code=400, detail=str(e)) +@router.delete("/me") +async def delete_account( + req: DeleteAccountRequest, + user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_db), +): + """注销账号(需验证密码,级联清理数据)""" + service = UserService(db) + try: + await service.delete_account(user.id, req.password) + return {"success": True, "message": "账号已注销"} + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + + @router.put("/me/email") async def change_email( req: EmailChange, diff --git a/backend/app/services/user_service.py b/backend/app/services/user_service.py index 5c7db63..a2962fe 100644 --- a/backend/app/services/user_service.py +++ b/backend/app/services/user_service.py @@ -61,6 +61,16 @@ class UserService: user.password_hash = hash_password(new_password) user.updated_at = datetime.utcnow() + async def delete_account(self, user_id: str, password: str): + """注销账号:验证密码后删除用户(FK CASCADE 级联清理相关数据)""" + from sqlalchemy import delete + user = await self.get_by_id(user_id) + if not user: + raise ValueError("用户不存在") + if not verify_password(password, user.password_hash): + raise ValueError("密码错误,无法注销") + await self.db.execute(delete(User).where(User.id == user_id)) + async def change_email(self, user_id: str, new_email: str, password: str): """更换绑定邮箱""" user = await self.get_by_id(user_id) diff --git a/frontend/src/api/friends.ts b/frontend/src/api/friends.ts index 1b85549..ea7c91a 100644 --- a/frontend/src/api/friends.ts +++ b/frontend/src/api/friends.ts @@ -8,9 +8,6 @@ export const friendsApi = { sendRequest: (toUserId: string, message?: string) => api.post('/friends/request', { to_user_id: toUserId, message }), - addDirect: (toUserId: string) => - api.post('/friends/add-direct', { to_user_id: toUserId }), - acceptRequest: (requestId: string) => api.put(`/friends/request/${requestId}/accept`), diff --git a/frontend/src/views/contacts/SearchView.vue b/frontend/src/views/contacts/SearchView.vue index 607adae..e3648d9 100644 --- a/frontend/src/views/contacts/SearchView.vue +++ b/frontend/src/views/contacts/SearchView.vue @@ -13,29 +13,64 @@ {{ user.bio || '这个人很懒,什么都没写' }}
没有找到匹配的用户
注销后账号将永久删除,所有聊天记录、好友、朋友圈、花园数据都会被清除,且不可恢复。
+