|
|
11dcb03924
|
功能:婚姻系统第1-3步(枚举/迁移/Seeder)
Step 1 - 枚举扩展:
- 新增 IntimacySource 枚举(7种亲密度来源)
- CurrencySource 追加7个婚姻相关来源
Step 2 - 数据库迁移(6张表):
- marriage_configs(约30条可配置参数)
- marriage_intimacy_logs(亲密度变更日志)
- wedding_tiers(5档婚礼配置)
- wedding_ceremonies(婚礼仪式记录)
- wedding_envelope_claims(红包领取记录)
- marriages 表改良(新增全部业务字段)
- users.frozen_jjb(定时婚礼金币冻结)
- shop_items.type 枚举添加 ring 类型
Step 3 - Seeder:
- 28条婚姻参数默认配置
- 5个婚礼档位
- 3种戒指道具(银/金/钻)
|
2026-03-01 14:56:47 +08:00 |
|
|
|
73badefcc5
|
文档:用户名禁词管理标记为已完成
|
2026-03-01 14:17:20 +08:00 |
|
|
|
477bba3003
|
修复:批量添加禁用词 UTF-8 编码错误
- 新增 sanitizeUtf8() 私有方法:
去除 BOM、零宽字符、非法 UTF-8 字节、控制字符
防止从聊天/文档复制时混入隐藏字符导致 json_encode 失败
- batchStore() 先净化 words 和 reason 输入
- preg_split 加 /u 修饰符(完整 Unicode 支持)
- 响应加 JSON_UNESCAPED_UNICODE 防中文被转义
|
2026-03-01 14:10:13 +08:00 |
|
|
|
f114c6b168
|
修复:新增独立迁移将 reserved_until 改为 nullable
上次 add_type_reason 迁移已在生产跑过(无 change),
导致 permanent 类型插入 NULL 时报 1048 错误。
新建专用迁移用 DB::statement ALTER TABLE 直接生效,
绕过 doctrine/dbal ->change() 的潜在兼容问题。
|
2026-03-01 14:07:42 +08:00 |
|
|
|
211075b77c
|
修复:reserved_until 列允许 NULL(permanent 禁用词无到期时间)
- 迁移文件补充 ->nullable()->change() 使 reserved_until 兼容 permanent 类型
- Tinker 直接执行 ALTER TABLE 修复已运行的迁移(无需回滚)
|
2026-03-01 14:06:35 +08:00 |
|
|
|
632a4240c4
|
功能:禁用词管理支持批量添加
- 新增 ForbiddenUsernameController::batchStore()
支持换行、逗号、中文逗号、空格多种分隔格式
自动去重、跳过已存在词语、忽略超长词
返回成功数/跳过数详细提示
- 新增路由 POST /admin/forbidden-usernames/batch
- View 新增卡片加「单个/批量」两 Tab 切换
批量 Tab 使用 textarea 多行输入
|
2026-03-01 14:04:28 +08:00 |
|
|
|
fc495ccceb
|
功能:禁用用户名管理(永久禁词列表)
数据库:
- 新增迁移 username_blacklist 表加 type/reason 列
type: temp(改名30天保留)| permanent(管理员永久禁用)
reason: 禁用原因备注(最长100字符)
核心逻辑:
- UsernameBlacklist::isBlocked() 同时拦截两种类型
也包含 isReserved() 兼容旧调用
增加 scopePermanent()/scopeTemp() 查询作用域
- AuthController 注册时加 isBlocked() 拦截
禁词/保留期内均不可注册
- ShopService::useRenameCard() 已有 isReserved() 调用
因已改用 isBlocked() 别名,无需修改
后台:
- ForbiddenUsernameController:index/store/update/destroy
- 路由:/admin/forbidden-usernames(chat.site_owner 中间件)
- 视图:admin/forbidden-usernames/index.blade.php
新增表单、关键词搜索、分页、行内编辑原因、删除
- 侧边栏加「🚫 禁用用户名」入口(仅站长可见)
|
2026-03-01 14:00:38 +08:00 |
|
|
|
312b92a81d
|
文档/调整:好友面板完成,更新 DEVELOPMENT.md
- DEVELOPMENT.md:好友系统 [ ] → [x],补充功能细节
- toolbar.blade.php:好友按钮移至「呼叫」后(用户调整位置)
|
2026-03-01 13:51:27 +08:00 |
|
|
|
8120058948
|
重构:好友面板独立为 friend-panel.blade.php
- 新建 resources/views/chat/partials/friend-panel.blade.php
包含完整的 style / HTML / JS
结构完全干净,无嵌套错误
- toolbar.blade.php:
恢复至干净基础版本(回滚损坏内容)
添加「好友」按钮(openFriendPanel)
通过 @include('chat.partials.friend-panel') 引入面板
- FriendController::index() 返回 sub_time 和 pending 列表
|
2026-03-01 13:47:51 +08:00 |
|
|
|
4ced484419
|
功能:好友列表面板
后端(FriendController::index):
- 返回 sub_time 添加时间
- 新增 pending 列表(对方加了我但我未回加)
包含用户信息 + added_at(对方添加我的时间)
前端(toolbar.blade.php):
- 工具栏顶部加「好友」按钮(openFriendPanel)
- 好友弹窗面板(#friend-panel):
① 搜索栏:输入用户名 Enter/按钮添加好友
② 「我关注的好友」列表:头像/用户名/互相徽章/
添加时间/删除按钮
③ 「对方已加我,待我回加」列表:头像/用户名/
对方添加时间/➕回加按钮
④ 面板顶部提示区(成功/失败消息)
- 所有添加/删除调用与双击用户卡片完全相同的接口
(/friend/{username}/add、/friend/{username}/remove)
|
2026-03-01 13:38:30 +08:00 |
|
|
|
48b31e7cff
|
修复:管理员进房烟花无声问题(AudioContext suspended)
根本原因:管理员进房特效在 800ms 后自动触发,
此时用户尚未与新页面交互,浏览器的 AudioContext
处于 suspended 状态,之前代码同步调用 resume()
但未 await 其 Promise,导致音频节点创建后无法出声。
修复方式:
- play() 和 ding() 均改为先检查 ctx.state
- 若为 suspended,用 ctx.resume().then(...) 链式执行
- resolver 成功后真正创建音频节点并播放
- 若浏览器拒绝 resume(无用户手势),catch 静默处理
此修复使所有自动触发的音效(进房烟花、任命公告等)
在 AudioContext 未激活时也能正确播放。
|
2026-03-01 13:32:00 +08:00 |
|
|
|
58b63fa8d3
|
功能:大卡片/小卡片弹出时播放叮咚通知音
effect-sounds.js:
- 新增 ding() 函数:A5(880Hz) + E5(659Hz) 两音叮咚
每音含基音×2.76铃铛泛音,快冲击+铃铛式衰减
自动检查 chat_sound_muted 禁音标志
- 导出 ding 至返回对象,底部暴露 window.chatSound = {ding}
toast-notification.blade.php:
- chatToast.show() 中 appendChild 后调用 window.chatSound.ding()
scripts.blade.php:
- chatBanner.show() 开头调用 window.chatSound.ding()
|
2026-03-01 13:28:19 +08:00 |
|
|
|
dac7750fe1
|
功能:特效音效三项优化 + 禁音开关
音效改进(effect-sounds.js):
1. 雷电 - 三层合成更贴近真实:
①放电啪声(带通噪声 ~50ms)
②低频轰鸣(120→38Hz 扫频,快冲击 2s 衰减)
③极低频滚动余韵(55→22Hz,缓慢堆积 3.6s 长衰减)
2. 下雨 - 音量 0.40→0.15,时长与视觉效果统一(8000ms)
3. 下雪 - 移除风声,只保留五声音阶铃音(C/E/G/C)
铃音加第二泛音(×2.76倍频)模拟真实铃铛共鸣感
8次随机铃声分布在 10 秒内
禁音开关:
- input-bar.blade.php:悄悄话旁新增「🔇 禁音」复选框
- scripts.blade.php:toggleSoundMute() 函数,
localStorage chat_sound_muted 持久化,
DOMContentLoaded 恢复复选框状态
- effect-sounds.js:play() 先检查 chat_sound_muted 标志
|
2026-03-01 13:19:24 +08:00 |
|
|
|
1d7aa636a0
|
功能:4种全屏特效增加 Web Audio API 实时合成音效
新建 public/js/effects/effect-sounds.js:
- 雷电:低频白噪声爆裂 + 雷鸣渐衰(10次,与视觉同步)
- 烟花:发射滑音(200→700Hz)+ 带通噪声爆炸(9轮)
- 下雨:双层带通白噪声(1200Hz+3500Hz)持续淡入淡出
- 下雪:4000Hz+高频风声 + 五声音阶轻柔铃音(5次随机)
- 所有音效纯 Web Audio API 合成,无外部音频文件
- 旧 AudioContext 若被 suspended 自动 resume
effect-manager.js:
- play() 调用 EffectSounds.play(type) 同步触发音效
- _cleanup() 调用 EffectSounds.stop() 兜底停止
frame.blade.php:effect-sounds.js 在 effect-manager 前引入
|
2026-03-01 13:07:36 +08:00 |
|
|
|
2947f0f741
|
功能:用户列表增加在线状态列,支持点击排序
- UserManagerController 注入 ChatStateService,从 Redis 聚合
所有活跃房间在线用户名(跨房间去重)
- 排序白名单加入 'online',在线排序用 orderByRaw CASE WHEN 虚拟列
desc = 在线用户优先显示,asc = 离线用户优先
- 视图表头加「在线 ↕」可排序列(绿色高亮箭头)
- 每行显示绿色实心点+「在线」/灰点+「离线」小徽章
- my-duty-logs 分页已有 paginate(30)+withQueryString+links(),无需改动
|
2026-03-01 12:54:34 +08:00 |
|
|
|
0dff79dd51
|
修复:6列统计卡片改用 inline style,规避 Tailwind 未编译 grid-cols-6
|
2026-03-01 12:26:23 +08:00 |
|
|
|
769632dea8
|
优化:履职记录统计卡片改为固定6列一行,紧凑尺寸
|
2026-03-01 12:24:15 +08:00 |
|
|
|
855f169516
|
功能:后台「我的履职记录」页面
- 侧边栏「我的履职记录」链接,位于「任命管理」上方
- 路由:GET /admin/my-duty-logs → appointments.my-duty-logs
- 控制器:AppointmentController::myDutyLogs()
支持按操作类型、日期范围筛选,分页,withQueryString()
- 视图:admin/appointments/my-duty-logs.blade.php
顶部 6 格汇总统计(奖励/踢出/禁言/警告/任命/撤职)
每张卡片可点击快速按类型筛选
表格显示:操作时间、类型 Badge、操作对象、所属部门·职务、金币金额、备注
|
2026-03-01 12:22:13 +08:00 |
|
|
|
f4de31f92b
|
优化:奖励消息发送者显示「部门·职务」
$positionName 由单一职务名改为「部门名 · 职务名」格式,
例如:「生产部 · 系长」,无部门时退化为仅显示职务名,
超管保持「超级管理员」不变。
公告文案、私信、Toast 通知均同步更新。
|
2026-03-01 12:17:16 +08:00 |
|
|
|
3d7b86f06d
|
功能:奖励发放聊天室公告 + 右下角 Toast 通知卡片
后端(AdminCommandController::reward):
- 新增聊天室公开公告消息(系统公告,所有在场用户可见)
- 接收者私信附带 toast_notification 字段触发前端小卡片
- 公告文案:「🪙 [职务人] 向 [目标] 发放了 [N] 枚奖励金币!」
前端:
- 新建 chat/partials/toast-notification.blade.php:
全局右下角 Toast 组件,window.chatToast.show() API
支持 title/message/icon/color/duration/action 配置
多条 Toast 从右下角向上堆叠,独立计时、独立关闭
- chat:message 事件监听中检测 toast_notification 字段,
自动弹出右下角通知卡片(仅接收方可见)
- showFriendToast 迁移至 window.chatToast.show(),
删除 80 行旧实现,代码量净减
- frame.blade.php 引入新 partial
DEVELOPMENT.md:
- 新增 §7.9 chatToast 完整文档(API、使用场景、迁移说明)
- 原 chatBanner 章节编号改为 §7.10
|
2026-03-01 12:15:18 +08:00 |
|
|
|
2ae3d83349
|
优化:确认发放按钮圆角 6px→20px,视觉更圆润
|
2026-03-01 12:08:05 +08:00 |
|
|
|
9da0d83914
|
优化:确认发放按钮风格改为与全局弹窗一致
- 输入框+按钮回到同一行(align-items:stretch)
- 按钮完全复刻 global-dialog 确认按钮样式:
padding:9px, border-radius:6px, font-size:13px, font-weight:bold
- 背景色 #f59e0b(与弹窗标题栏橙色对应)
- :style 仅控制 opacity,background 两分支都明确写入
|
2026-03-01 12:07:12 +08:00 |
|
|
|
5180526821
|
优化:确认发放按钮改为全宽独立一行,风格同弹窗按钮
输入框独占一行,按钮在输入框下方全宽显示:
- 宽度 100%,高度 48px,字号 16px,字间距 2px
- 琥珀橙色 #f59e0b,与弹窗头部色调呼应
- 禁用时 opacity:0.45,启用时 box-shadow 投影
- 符合截图中弹窗确定按钮的视觉风格
|
2026-03-01 12:04:05 +08:00 |
|
|
|
0d693eef5f
|
优化:输入框与确认按钮等高(align-items:stretch)
flex 容器改为 align-items:stretch,按钮去掉固定 height
改为 align-self:stretch,自动撑满与输入框相同高度,
视觉上两者完全对齐。
|
2026-03-01 12:01:53 +08:00 |
|
|
|
4207528043
|
修复:确认发放按钮背景色始终通过 :style 注入
将 background 从 static style 移入 :style 绑定,
两种状态(启用/禁用)均显式包含 background,
彻底避免 Alpine :style 动态绑定覆盖静态 style background 的问题。
按钮颜色:橙红渐变 #ea580c→#dc2626
- 启用:opacity:1 + box-shadow 投影
- 禁用:opacity:0.4 + no-shadow(未输入金额时)
|
2026-03-01 12:00:03 +08:00 |
|
|
|
96c472bfb9
|
修复:弹窗额度4列布局+确认按钮背景色
1. 4列布局:x-show 与 display:grid 分离到两层 div,
避免 Alpine x-show 显示时把 display:grid 覆盖为 block
2. 确认按钮::style 改为始终返回 opacity 值而非空字符串,
避免 Alpine :style 绑定空值时清除静态 style 的 background,
按钮现为橙红渐变(#ea580c→#dc2626)+红色投影,
禁用状态 opacity:0.45 降亮+cursor:not-allowed
|
2026-03-01 11:58:08 +08:00 |
|
|
|
4ba5a88fc2
|
优化:奖励弹窗加宽+4列额度+最近10条记录+确认按钮醒目
- 弹窗宽度 320→520px(max-width:95vw 自适应)
- 额度四格改为一行4列(单次上限/单日上限/今日已发/剩余额度)
- 确认按钮改为橙红渐变+投影,视觉更突出
- 输入框下方显示最近10条发放记录(目标/金额/时间)
- 发放成功后实时在历史列表头部插入新纪录
- rewardQuota 接口统一返回 recent_rewards(最近10条)
|
2026-03-01 11:55:29 +08:00 |
|
|
|
21cabb08c9
|
功能:奖励金币改为独立弹窗(展示额度信息)
- 点击「送金币」按钮打开独立弹窗,不再内联在用户名片中
- 弹窗展示 4 格额度信息:单次上限、单日上限、今日已发、剩余额度
- 新增 GET /command/reward-quota 接口(rewardQuota 方法)
返回当前操作人实时额度,超管返回全部不限
- 发放成功后页面内实时更新今日已发/剩余额度,无需刷新
- 移除原内联奖励面板,action 改为调用全局 openRewardModal()
|
2026-03-01 11:50:12 +08:00 |
|
|
|
3d30d7e811
|
功能:id=1 超管无需职务即可发放奖励金币
前端(frame.blade.php):
- Auth::id()===1 时 myMaxReward=-1(不限),送金币按钮始终显示
后端(AdminCommandController::reward):
- isSuperAdmin=true 时跳过职务检查和①②③④限额校验
- 全局接收次数⑤对超管同样生效(防止刷奖励)
- 履职记录 user_position_id 允许 null(超管无职务时)
- 发放备注改用 positionName 变量(超管显示「超级管理员」)
顺带修复:②操作人单日累计统计之前误查 target_user_id,
已改为正确的 user_id(操作人自己今日已发总额)
|
2026-03-01 11:43:51 +08:00 |
|
|
|
cc1278ffcb
|
修复:openUserCard 剥除消息中的装饰括号避免 404
问题:部分自动动作/系统消息用「【username】」格式显示用户名,
双击时把「【」前缀一并传给 openUserCard,导致:
GET /user/【lkddi → 404
修复:在 openUserCard 入口统一用正则清洗 【】[]
等装饰字符,再传给 fetchUser 查询。
|
2026-03-01 11:42:13 +08:00 |
|
|
|
8dcf23d7e4
|
修复:单次上限三态逻辑(null=不限/-1=不限/0=禁止/正整数=有上限)
frame.blade.php:
- max_reward=null → myMaxReward=-1(不限,有权限)
- max_reward=0 → myMaxReward=0(禁止发放)
- max_reward=N → myMaxReward=N(有具体上限)
user-actions.blade.php:
- 按钮显示条件:myMaxReward !== 0(-1 和正整数都显示)
- 面板上限文字:-1 显示「不限」,正整数显示具体数值
- sendReward 校验:0=禁止阻断,-1=不限跳过上限校验,N=有上限
- 输入框 :max:-1 时上限 999999(实际不限),N 时上限 N
|
2026-03-01 11:39:28 +08:00 |
|
|
|
57f515e2eb
|
修复:去掉多余的 @section 导致的 section 嵌套报错
将 inlinePatch script 块迁移回 @section('content') 内部,
彻底移除 @push/@endpush/@section('scripts') 等无效指令。
根本原因:admin layout 无 @yield('scripts'),在 @endsection 后
再开 @push 或 @section 会触发 'Cannot end a section' 异常。
|
2026-03-01 11:30:23 +08:00 |
|
|
|
89d93c92ed
|
功能:职务列表内联编辑 + 全局奖励配置自动保存
职务列表三列内联编辑(失焦/回车自动保存,无需打开编辑弹窗):
- 人数上限:PATCH max_persons
- 单次上限:PATCH max_reward
- 单日上限:PATCH daily_reward_limit
保存成功显示短暂绿色 ✓,失败显示红色错误提示
全局奖励接收次数配置改为 AJAX 自动保存,失焦/回车触发,
无需保存按钮(原表单已移除)
新增接口:
- PATCH /admin/positions/{position}/patch(quickPatch)
- POST /admin/positions/reward-config(saveRewardConfig,兼容 JSON + 重定向)
|
2026-03-01 11:28:15 +08:00 |
|
|
|
baaa7087b0
|
功能:全局奖励接收次数上限(职务管理页配置)
新增全局 sysparam 配置 reward_recipient_daily_max:
- 控制每位用户单日内从所有职务持有者处累计接收奖励的最高次数
- 0 = 不限制
后端变更:
- PositionController::saveRewardConfig() 保存配置
- POST admin/positions/reward-config 路由
- AdminCommandController::reward() 新增第④层校验:
全局次数上限(优先级低于职务级别的 recipient_daily_limit)
视图变更:
- 职务管理页顶部加橙色配置卡片(行内表单,即改即存)
- 显示当前全局配置值
|
2026-03-01 11:22:02 +08:00 |
|
|
|
a145c6fc0a
|
修复+改进:职务奖励次数上限和后台列表展示
修复:
- recipient_daily_limit 统计逻辑修正:移除 user_id 过滤,
改为统计今日所有职务持有者对同一接收者的累计发放次数
(上限含义:该用户今日最多从所有职务人员处收到 N 次奖励)
改进:
- 后台职务列表新增「单日上限」列显示 daily_reward_limit
- 「奖励上限」列改名为「单次上限」更准确
- 两列均支持 null(不限)/ 0(禁止)/ 数值 三种状态区分显示
|
2026-03-01 11:16:22 +08:00 |
|
|
|
41d4acdd72
|
修复:职务编辑表单中 0 值被 || '' 误转为空字符串
openEdit() 中三个奖励字段从 OR 运算符改为显式 null 检查:
- max_reward: pos.max_reward !== null ...
- daily_reward_limit 同上
- recipient_daily_limit 同上
- max_persons 改用 JS ?? 空值合并运算符
根本原因:0 在 JS 中是 falsy,pos.max_reward || '' 会将 0 变成 '',
提交到后端后 nullable 规则将空字符串解析为 null 覆盖掉用户的 0 设置。
|
2026-03-01 11:11:57 +08:00 |
|
|
|
ff57afe388
|
功能:职务奖励金币发放系统
数据库:
- positions 新增 daily_reward_limit(单日累计上限)
- positions 新增 recipient_daily_limit(同一接收者每日次数上限)
后端:
- CurrencySource::POSITION_REWARD 新枚举值
- AdminCommandController::reward() 三层限额校验
① 单次上限 ② 单日累计上限 ③ 同一接收者每日次数
写履职记录(PositionAuthorityLog)+ UserCurrencyService
聊天室悄悄话通知接收者
- POST /command/reward 路由注册
前端(user-actions.blade.php):
- 名片按钮行 2+1 布局(加好友/送礼物/送金币)
- 送金币仅在 myMaxReward>0 时显示(职务持有者)
- 内联奖励金币面板:金额输入 + 确认发放 + 说明文字
- sendReward() 前端校验 + API 调用 + chatDialog 反馈
后台(positions/index):
- 编辑表单新增两个奖励限额字段
- PositionController 验证规则同步更新
|
2026-03-01 11:09:29 +08:00 |
|
|
|
476499832f
|
功能:勤务台榜单新增管理操作次数 + 奖励金币次数统计
DutyHallController:
- 新增 position_authority_logs 关联查询
- 统计管理操作次数(warn/kick/mute/banip/other,排除人事任免)
- 统计奖励金币次数及累计金额(action_type=reward)
- 时间范围统一过滤(日/周/月/总)
- 合并两表数据到榜单 Collection
duty-hall/index.blade.php:
- 表格扩展为 6 列:名次、成员、在线时长、登录次数、管理操作、奖励金币
- 奖励金币栏 hover 显示次数+总金额 tooltip
- 移动端显示紧凑卡片(管理/奖励只在 >0 时显示)
- 底部图例说明各列含义
|
2026-03-01 10:51:48 +08:00 |
|
|
|
5a7d1565e5
|
修复:channels.php 移除 int 类型提示,改用强转比较防兼容性问题
int $id 类型提示在某些 PHP 版本下对字符串参数可能失败,
统一改为 (int) 强转比较,与 App.Models.User.{id} 写法一致。
|
2026-03-01 01:54:19 +08:00 |
|
|
|
7bae5e56ff
|
修复:私有频道改用数字 ID,解决中文用户名导致 Pusher 频道名非法
错误原因:Pusher 频道名只允许 [a-zA-Z0-9_\-=@,.],
中文用户名(如「超级舞魅」)用于 private-user.{username} 导致
PusherException: Invalid channel name。
修复方案(改用数字 ID):
- FriendAdded/FriendRemoved 构造加 toUserId 参数
- broadcastOn() 改为 PrivateChannel('user.' . $toUserId)
- FriendController 传入 $target->id / $targetUser->id
- channels.php 鉴权改为 'user.{id}',核对 $user->id 数字相等
- frame.blade.php chatContext 加 userId
- scripts.blade.php Echo.private 改用 userId 订阅
|
2026-03-01 01:41:04 +08:00 |
|
|
|
a44a9ce242
|
修复:回加好友成功后大卡片自动关闭
quickFriendAction 是 async 函数,await 完成后
检查按钮文字是否为 '✅',1.5 秒后调用 close() 关闭 banner。
|
2026-03-01 01:33:41 +08:00 |
|
|
|
f951ec428d
|
重构:聊天室所有 alert() 改为 window.chatDialog.alert()
scripts.blade.php 全部 21 处原生 alert() 替换:
- 成功类 → chatDialog.alert(..., '提示', '#16a34a')
- 失败/错误类 → chatDialog.alert(..., '操作失败', '#cc4444')
- 网络异常类 → chatDialog.alert(..., '网络异常', '#cc4444')
- 连接断开/踢出 → chatDialog.alert(..., '连接警告', '#b45309')
- 一般提示 → chatDialog.alert(..., '提示', '#336699')
DEVELOPMENT.md 新增 §7.9 window.chatBanner 使用文档
|
2026-03-01 01:32:20 +08:00 |
|
|
|
5c53b8cf2f
|
功能:window.chatBanner 全局大卡片公共组件
前端:
- window.chatBanner.show(options) 全局 API,完全自定义:
icon/title/name/body/sub/gradient/titleColor/autoClose/buttons
- window.chatBanner.close(id) 关闭指定 banner
- showFriendBanner / showAppointmentBanner 均改用 chatBanner 实现
- setupBannerNotification() 监听私有+房间频道的 BannerNotification 事件
后端:
- BannerNotification 事件(ShouldBroadcastNow),支持 user/room 双目标
- BannerBroadcastController(仅超级管理员路由,三层中间件保护)
- 内容字段 strip_tags 净化防 XSS,按钮 action 白名单校验
安全:
- window.chatBanner.show() 被人控制台调用只影响自己,无法推给他人
- HTTP 入口 POST /admin/banner/broadcast 仅超管可访问
|
2026-03-01 01:28:23 +08:00 |
|
|
|
0f0691d037
|
修复:FriendAdded/FriendRemoved 改为 ShouldBroadcastNow
ShouldBroadcast 走队列(异步),不保证及时广播;
ShouldBroadcastNow 不走队列,与 MessageSent 一致,立即推送到 Reverb。
这是大卡弹窗收不到的真实原因。
|
2026-03-01 01:21:33 +08:00 |
|
|
|
7985a9b0d7
|
修复:FriendAdded/FriendRemoved 加 broadcastAs() 修复私有频道事件名不匹配
前端 .listen('.FriendAdded') 匹配的是短名 FriendAdded,
但默认广播名是 App\Events\FriendAdded(全类名),导致监听器永远不触发。
加 broadcastAs() 返回短名后两端匹配,弹窗可正常弹出。
|
2026-03-01 01:13:50 +08:00 |
|
|
|
779179af01
|
功能:好友添加通知改为居中大卡弹窗(同任命公告风格)
FriendAdded:
- 互相好友 → 绿色渐变大卡 + '你们现在互为好友 🎊',5秒自动消失
- 单向添加 → 蓝绿渐变大卡 + [➕ 回加好友] + [稍后再说] 按钮,手动关闭
FriendRemoved:保留右下角 Toast 通知
效果复用 appoint-pop 弹出动画关键帧
|
2026-03-01 01:09:37 +08:00 |
|
|
|
d60a225368
|
修复:好友悄悄话链接 href 出现字面 \'#\' 导致404问题
PHP 双引号字符串里单引号不需要反斜杠转义,
\'#\' 会原样输出 \'#\' 而非 '#',导致 href 跳转到错误 URL。
改为直接写 '#' 即可。
|
2026-03-01 01:05:47 +08:00 |
|
|
|
212f7a0096
|
功能:好友悄悄话内嵌快捷操作链接
后端:
- notifyOnlineUser 生成带内联 <a> 标签的内容
- added 未互相 → 嵌入 '➕ 回加好友' 链接
- removed 互相 → 嵌入 '🗑️ 同步移除' 链接
- 链接调用全局 quickFriendAction(act, username, el)
前端:
- 新增 window.quickFriendAction() 全局函数
- 防重复点击(dataset.done 标记)
- 成功后更新链接文字 '✅ 已回加' / '✅ 已移除',不刷新页面
|
2026-03-01 01:03:10 +08:00 |
|
|
|
cc16f89bbe
|
修复:好友悄悄话文案根据互相状态精确区分
- notifyOnlineUser 加 $mutual 参数
- added + mutual=false → '但你还没有添加对方为好友'
- added + mutual=true → '你们现在互为好友 🎉'
- removed + mutual=true → '你的好友列表中仍保留对方'
- removed + mutual=false → '已将你从他的好友列表移除'
- 删除操作悄悄话改为灰色 (#6b7280),语义更准确
|
2026-03-01 00:59:10 +08:00 |
|
|
|
3c2038e8fe
|
优化:好友通知弹窗根据互相状态显示不同内容
FriendAdded 事件:
- 新增 hasAddedBack 字段(B 是否已回加 A)
- Toast:已互相好友 → '你们现在互为好友 🎉'
- Toast:未回加 → '但你还没有添加对方为好友' + [➕ 回加] 一键操作按钮
FriendRemoved 事件:
- 新增 hadAddedBack 字段(之前是否互相好友)
- Toast:之前互相好友 → 提示 + [🗑️ 同步移除] 一键操作按钮
- Toast:单向好友 → 简单通知,无操作按钮
Toast 改进:
- 右上角 × 关闭按钮
- 快捷操作按钮支持 fetch 直接请求
- 完成后显示结果并自动关闭,延时改为 8 秒
|
2026-03-01 00:54:10 +08:00 |
|