153 lines
4.0 KiB
PHP
153 lines
4.0 KiB
PHP
|
|
<?php
|
|||
|
|
namespace app\common\model;
|
|||
|
|
|
|||
|
|
use think\Model;
|
|||
|
|
|
|||
|
|
class FriendNotification extends Model
|
|||
|
|
{
|
|||
|
|
protected $name = 'friend_notifications';
|
|||
|
|
protected $autoWriteTimestamp = 'int';
|
|||
|
|
protected $createTime = 'createtime';
|
|||
|
|
protected $updateTime = 'updatetime';
|
|||
|
|
|
|||
|
|
// 通知类型常量
|
|||
|
|
const TYPE_FRIEND_REQUEST = 1; // 好友申请
|
|||
|
|
const TYPE_REQUEST_RESULT = 2; // 申请结果
|
|||
|
|
|
|||
|
|
protected $append = [
|
|||
|
|
'createtime_text',
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
protected $type = [
|
|||
|
|
'id' => 'integer',
|
|||
|
|
'to_user_id' => 'integer',
|
|||
|
|
'from_user_id' => 'integer',
|
|||
|
|
'type' => 'integer',
|
|||
|
|
'related_id' => 'integer',
|
|||
|
|
'is_read' => 'integer'
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
public function getCreatetimeTextAttr($value, $data)
|
|||
|
|
{
|
|||
|
|
$value = $value ? $value : ($data['createtime'] ?? "");
|
|||
|
|
return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 关联用户信息
|
|||
|
|
public function user()
|
|||
|
|
{
|
|||
|
|
return $this->belongsTo('User', 'user_id', 'id');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function fromUser()
|
|||
|
|
{
|
|||
|
|
return $this->belongsTo('User', 'from_user_id', 'id');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 创建好友申请通知
|
|||
|
|
*/
|
|||
|
|
public static function createFriendRequestNotification($params)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
$message=$params['content'];
|
|||
|
|
$toUserId = $params['to_user_id'];
|
|||
|
|
$fromUserId = $params['from_user_id'];
|
|||
|
|
$content = $message ?
|
|||
|
|
"用户 " . User::get($fromUserId)['nickname'] . " 申请添加您为好友:" . $message :
|
|||
|
|
"用户 " . User::get($fromUserId)['nickname'] . " 申请添加您为好友";
|
|||
|
|
|
|||
|
|
return self::create([
|
|||
|
|
'to_user_id' => $toUserId,
|
|||
|
|
'type' => self::TYPE_FRIEND_REQUEST,
|
|||
|
|
'content' => $content,
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 创建申请结果通知
|
|||
|
|
*/
|
|||
|
|
public static function createRequestResultNotification($params)
|
|||
|
|
{
|
|||
|
|
$result = $params['status'];
|
|||
|
|
$fromUserId = $params['from_user_id'];
|
|||
|
|
$toUserId = $params['to_user_id'];
|
|||
|
|
$resultText = $result == 1 ? '同意' : '拒绝';
|
|||
|
|
$content = "用户 " . User::get($fromUserId)['nickname'] . " 已{$resultText}您的好友申请";
|
|||
|
|
|
|||
|
|
return self::create([
|
|||
|
|
'to_user_id' => $toUserId,
|
|||
|
|
'type' => self::TYPE_REQUEST_RESULT,
|
|||
|
|
'content' => $content,
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 创建好友添加成功通知
|
|||
|
|
*/
|
|||
|
|
public static function createFriendAddedNotification($userId, $friendId)
|
|||
|
|
{
|
|||
|
|
$content = "您与 " . User::get($friendId)['nickname'] . " 已成为好友";
|
|||
|
|
|
|||
|
|
return self::create([
|
|||
|
|
'user_id' => $userId,
|
|||
|
|
'from_user_id' => $friendId,
|
|||
|
|
'type' => self::TYPE_FRIEND_ADDED,
|
|||
|
|
'content' => $content
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取用户未读通知数量
|
|||
|
|
*/
|
|||
|
|
public static function getUnreadCount($userId)
|
|||
|
|
{
|
|||
|
|
return self::where(['to_user_id' => $userId, 'is_read' => 0])->count();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 标记通知为已读
|
|||
|
|
*/
|
|||
|
|
public static function markAsRead($notificationId, $userId = null)
|
|||
|
|
{
|
|||
|
|
$where = ['id' => $notificationId];
|
|||
|
|
if ($userId) {
|
|||
|
|
$where['to_user_id'] = $userId;
|
|||
|
|
}
|
|||
|
|
return self::update(['is_read' => 1], $where);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 批量标记通知为已读
|
|||
|
|
*/
|
|||
|
|
public static function markBatchAsRead($user_id, $ids = [])
|
|||
|
|
{
|
|||
|
|
$where = ['to_user_id' => $user_id];
|
|||
|
|
if (!empty($ids)) {
|
|||
|
|
$where['id'] = ['in', $ids];
|
|||
|
|
}
|
|||
|
|
return self::where($where)->update(['is_read' => 1]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取用户通知列表
|
|||
|
|
*/
|
|||
|
|
public static function getNotificationList($userId)
|
|||
|
|
{
|
|||
|
|
return self::where(['to_user_id' => $userId])
|
|||
|
|
->order('id DESC')
|
|||
|
|
->paginate();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 删除过期通知(保留最近30天的记录)
|
|||
|
|
*/
|
|||
|
|
public static function cleanupExpiredNotifications()
|
|||
|
|
{
|
|||
|
|
$expireTime = time() - 30 * 24 * 3600; // 30天前的时间戳
|
|||
|
|
return self::where('created_at', '<', $expireTime)->delete();
|
|||
|
|
}
|
|||
|
|
}
|