Files
chatroom/app/Models/DevChangelog.php
lkddi 5f30220609 feat: 任命/撤销通知系统 + 用户名片UI优化
- 任命/撤销事件增加 type 字段区分类型
- 任命:全屏礼花 + 紫色弹窗 + 紫色系统消息
- 撤销:灰色弹窗 + 灰色系统消息,无礼花
- 消息分发:操作者/被操作者显示在私聊面板,其他人显示在公屏
- 系统消息加随机鼓励语(各5条轮换)
- ChatStateService 修复 Redis key 前缀扫描问题(getAllActiveRoomIds)
- 用户名片折叠优化:管理员视野、职务履历均可折叠
- 管理操作 + 职务操作合并为「🔧 管理操作」折叠区
- 悄悄话改为「🎁 送礼物」按钮,礼物面板内联展开
2026-02-28 23:44:38 +08:00

113 lines
2.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能:开发日志 Model
* 对应 dev_changelogs 表,管理版本更新记录
* 支持草稿/已发布状态Markdown 内容渲染
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class DevChangelog extends Model
{
/**
* 允许批量赋值的字段
*/
protected $fillable = [
'version',
'title',
'type',
'content',
'is_published',
'notify_chat',
'published_at',
];
/**
* 字段类型自动转换
*/
protected $casts = [
'is_published' => 'boolean',
'notify_chat' => 'boolean',
'published_at' => 'datetime',
];
/**
* 类型标签配置(中文名 + Tailwind 颜色类)
*/
public const TYPE_CONFIG = [
'feature' => ['label' => '🆕 新功能', 'color' => 'emerald'],
'fix' => ['label' => '🐛 修复', 'color' => 'rose'],
'improve' => ['label' => '⚡ 优化', 'color' => 'blue'],
'other' => ['label' => '📌 其他', 'color' => 'slate'],
];
// ═══════════════ 查询作用域 ═══════════════
/**
* 只查询已发布的日志
*/
public function scopePublished(Builder $query): Builder
{
return $query->where('is_published', true)->orderByDesc('published_at');
}
/**
* 懒加载:查询比指定 ID 更旧的已发布日志(游标分页)
*
* @param int $afterId 已加载的最后一条 ID
*/
public function scopeAfter(Builder $query, int $afterId): Builder
{
return $query->where('id', '<', $afterId);
}
// ═══════════════ 访问器 ═══════════════
/**
* 获取类型对应的中文标签
*/
public function getTypeLabelAttribute(): string
{
return self::TYPE_CONFIG[$this->type]['label'] ?? '📌 其他';
}
/**
* 获取类型对应的 Tailwind 颜色名
*/
public function getTypeColorAttribute(): string
{
return self::TYPE_CONFIG[$this->type]['color'] ?? 'slate';
}
/**
* 将 Markdown 内容渲染为 HTML使用 Laravel 内置 Str::markdown
*/
public function getContentHtmlAttribute(): string
{
return Str::markdown($this->content, [
'html_input' => 'strip', // 去掉原始 HTML防止 XSS
'allow_unsafe_links' => false,
]);
}
/**
* 获取内容纯文本摘要(用于列表预览,截取前 150 字)
*/
public function getSummaryAttribute(): string
{
// 去掉 Markdown 标记后截取纯文本
$plain = strip_tags(Str::markdown($this->content));
return Str::limit($plain, 150);
}
}