PHP网游中如何设计好友系统?
在设计PHP网游中的好友系统时,你需要考虑几个核心功能和数据库设计,以确保系统高效、易用且可扩展。以下是一个基本的设计指南:
一、需求分析
1. 添加好友:玩家可以搜索其他玩家并发送好友请求。
2. 接受/拒绝好友请求:收到请求的玩家可以选择接受或拒绝。
3. 好友列表:显示当前玩家的好友列表,包括在线状态和简单互动选项(如聊天、邀请组队)。
4. 删除好友:玩家可以从好友列表中移除某个好友。
5. 通知系统:好友请求、接受/拒绝通知等。
二、数据库设计
1. 用户表(users):
`user_id`(主键)
`username`
其他用户相关信息
2. 好友关系表(friends):
`id`(主键)
`sender_id`(发起好友请求的用户ID,外键关联users表)
`receiver_id`(接收好友请求的用户ID,外键关联users表)
`status`(好友请求状态:0=待处理,1=已接受,2=已拒绝)
`created_at`(请求发送时间)
`updated_at`(状态更新时间)
三、功能实现
1. 添加好友
前端:提供一个搜索框,让玩家可以输入用户名搜索其他玩家。显示要求,并提供“添加好友”按钮。
后端:接收到添加好友请求后,在`friends`表中插入一条新记录,`status`设置为0(待处理)。
```php
function addFriend($senderId, $receiverId) {
$sql = \"INSERT INTO friends (sender_id, receiver_id, status, created_at, updated_at) VALUES (?, ?, 0, NOW, NOW)\";
$stmt = $pdo->prepare($sql);
$stmt->execute([$senderId, $receiverId]);
```
2. 接受/拒绝好友请求
前端:在玩家的好友请求列表中显示待处理请求,并提供接受/拒绝按钮。
后端:更新`friends`表中的`status`字段。
```php
function updateFriendRequest($requestId, $status) {
$sql = \"UPDATE friends SET status = ?, updated_at = NOW WHERE id = ?\";
$stmt = $pdo->prepare($sql);
$stmt->execute([$status, $requestId]);
```
3. 好友列表
前端:请求玩家的好友列表,并显示在线状态和互动选项。
后端:查询`friends`表,获取所有状态为1(已接受)的好友记录,并根据需要联表查询`users`表获取更多好友信息。
```php
function getFriendList($userId) {
$sql = \
SELECT u.user_id, u.username, f.status
FROM friends f
JOIN users u ON f.receiver_id = u.user_id
WHERE f.sender_id = ? AND f.status = 1
UNION
SELECT u.user_id, u.username, f.status
FROM friends f
JOIN users u ON f.sender_id = u.user_id
WHERE f.receiver_id = ? AND f.status = 1
\";
$stmt = $pdo->prepare($sql);
$stmt->execute([$userId, $userId]);
return $stmt->fetchAll;
```
4. 删除好友
前端:在好友列表中提供删除按钮。
后端:根据好友关系ID删除`friends`表中的记录(或者更新状态为删除状态,以便后续恢复)。
```php
function deleteFriend($friendId) {
$sql = \"DELETE FROM friends WHERE id = ?\";
$stmt = $pdo->prepare($sql);
$stmt->execute([$friendId]);
```
四、优化和扩展
1. 索引:在`friends`表的`sender_id`、`receiver_id`和`status`字段上添加索引,以提高查询性能。
2. 缓存:对于频繁访问的好友列表,可以考虑使用缓存(如Redis)来减少数据库压力。
3. 通知系统:可以使用WebSocket或轮询机制来实现实时通知。
4. 在线状态:可以通过用户登录/登出时更新数据库或缓存中的在线状态信息。
通过以上步骤,你可以设计一个基本的好友系统。根据游戏的具体需求和玩家规模,你可能还需要进一步优化和扩展系统。