feat: add user notification center
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
namespace app\adminapi\lists\notice;
|
||||
|
||||
use app\adminapi\lists\BaseAdminDataLists;
|
||||
use app\common\enum\notice\UserNoticeEnum;
|
||||
use app\common\model\notice\NoticeRecord;
|
||||
use app\common\model\user\User;
|
||||
use app\common\service\notice\UserNoticeService;
|
||||
|
||||
/**
|
||||
* 用户站内消息记录列表。
|
||||
*/
|
||||
class UserNoticeLists extends BaseAdminDataLists
|
||||
{
|
||||
public function lists(): array
|
||||
{
|
||||
$lists = $this->buildQuery()
|
||||
->field('notice.id,notice.user_id,notice.title,notice.content,notice.scene_id,notice.read,notice.extra,notice.create_time,user.nickname AS user_nickname,user.account AS user_account')
|
||||
->order('notice.id desc')
|
||||
->limit($this->limitOffset, $this->limitLength)
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
$sourceUserIds = [];
|
||||
foreach ($lists as $item) {
|
||||
$extra = UserNoticeService::decodeExtra($item['extra'] ?? '');
|
||||
if (!empty($extra['source_user_id'])) {
|
||||
$sourceUserIds[] = (int) $extra['source_user_id'];
|
||||
}
|
||||
}
|
||||
$sourceUsers = [];
|
||||
$sourceUserIds = array_values(array_unique(array_filter($sourceUserIds)));
|
||||
if (!empty($sourceUserIds)) {
|
||||
$sourceUsers = User::whereIn('id', $sourceUserIds)->column('nickname', 'id');
|
||||
}
|
||||
|
||||
foreach ($lists as &$item) {
|
||||
$extra = UserNoticeService::decodeExtra($item['extra'] ?? '');
|
||||
$meta = UserNoticeEnum::getMeta((int) $item['scene_id']);
|
||||
$sourceUserId = (int) ($extra['source_user_id'] ?? 0);
|
||||
$item['type_desc'] = $meta['type_desc'];
|
||||
$item['source_user_id'] = $sourceUserId;
|
||||
$item['source_nickname'] = $sourceUsers[$sourceUserId] ?? '';
|
||||
$item['target_url'] = UserNoticeService::sanitizeTargetUrl((string) ($extra['target_url'] ?? ''));
|
||||
$item['create_time'] = is_numeric($item['create_time'])
|
||||
? date('Y-m-d H:i:s', (int) $item['create_time'])
|
||||
: $item['create_time'];
|
||||
}
|
||||
unset($item);
|
||||
|
||||
return $lists;
|
||||
}
|
||||
|
||||
public function count(): int
|
||||
{
|
||||
return $this->buildQuery()->count();
|
||||
}
|
||||
|
||||
private function buildQuery()
|
||||
{
|
||||
$query = NoticeRecord::alias('notice')
|
||||
->leftJoin('user user', 'user.id = notice.user_id')
|
||||
->whereIn('notice.scene_id', UserNoticeEnum::getSceneIds());
|
||||
|
||||
$sceneId = (int) ($this->params['scene_id'] ?? 0);
|
||||
if (in_array($sceneId, UserNoticeEnum::getSceneIds(), true)) {
|
||||
$query->where('notice.scene_id', $sceneId);
|
||||
}
|
||||
if (array_key_exists('read', $this->params) && $this->params['read'] !== '') {
|
||||
$query->where('notice.read', (int) $this->params['read']);
|
||||
}
|
||||
$keyword = trim((string) ($this->params['keyword'] ?? ''));
|
||||
if ($keyword !== '') {
|
||||
$query->where(function ($query) use ($keyword) {
|
||||
$query->whereLike('notice.title', '%' . $keyword . '%')
|
||||
->whereOr('notice.content', 'like', '%' . $keyword . '%')
|
||||
->whereOr('user.nickname', 'like', '%' . $keyword . '%')
|
||||
->whereOr('user.account', 'like', '%' . $keyword . '%');
|
||||
});
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user