feat: add user notification center

This commit is contained in:
hajimi
2026-08-03 21:44:30 +08:00
parent 17720e86e2
commit 9df5f5f620
17 changed files with 1401 additions and 5 deletions
@@ -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;
}
}