lkddi
|
b6188ce2c3
|
UI优化:求婚弹窗戒指改为居中展示,双按钮等宽参照名片风格
- 「选择求婚戒指」→「赠送的求婚戒」
- 移除选择网格,改为居中展示第一枚戒指(粉色卡片)
- 底部双按钮与好友名片操作栏完全统一:
padding:7px 10px; border-radius:5px; font-size:12px;
flex:1 等宽,gap:6px
|
2026-03-01 17:28:28 +08:00 |
|
lkddi
|
be2d02cb8f
|
UI:求婚弹窗底部改为「取消」+「确认求婚」横排双按钮
参照用户名片操作栏按钮风格:
取消:灰色边框底,hover 加深
确认求婚:粉玫瑰渐变,禁用态灰色
两按钮等宽 flex:1 横排排列
|
2026-03-01 17:24:29 +08:00 |
|
lkddi
|
050aec1db4
|
优化:婚礼费用提示内嵌弹窗,移除多余的二次确认弹窗
在求婚弹窗底部(戒指列表与按钮之间)内嵌费用提示面板:
✅ 金币充足:绿色背景,显示最低费用和当前余额
⚠️ 金币不足:红色背景提示,说明可先求婚再准备金币
移除 doPropose() 里的 chatDialog.confirm 二次确认,
点击'确认求婚'按钮直接发送,流程更顺畅。
|
2026-03-01 17:22:57 +08:00 |
|
lkddi
|
c53cd7784a
|
UI重设计:求婚弹窗全面升级为浪漫高端风格
- 背景:深紫玫瑰色磨砂遮罩(backdrop-filter blur)
- 封面区:深玫瑰→粉红渐变,大 💍 图标投影,
对象名用磨砂胶囊标签显示
- 弹窗入场动画:opacity+scale 过渡
- 戒指卡片:选中态渐变背景+粉色阴影+右上角✓勾
未选中态浅灰底,悬停有过渡
- 无戒指:粉色虚线框+💔图标+直接跳商店按钮
- 确认按钮:三段深玫瑰渐变+红粉阴影,禁用态灰色
|
2026-03-01 17:21:48 +08:00 |
|
lkddi
|
9ccc0b379d
|
优化:求婚前提示最低婚礼费用并检查金币余额
点击「送出求婚」前弹出确认弹窗:
💍 确认向【XXX】发出求婚吗?
📋 婚礼费用说明:
• 婚礼最低费用:🪙 5,888 金币
• 您当前金币:🪙 XXX 金币
⚠️ 戒指一旦送出即消耗,对方拒绝则戒指遗失。
金币不足时:直接拦截并弹 alert 说明,不发出请求
金币充足时:需确认后才发出求婚请求
同时在 chatContext 注入 userJjb 和 minWeddingCost
|
2026-03-01 17:19:27 +08:00 |
|
lkddi
|
9c4598ab66
|
修复:所有婚姻弹窗无法显示的 bug
根因:外层容器 style='display:none' 写死,
Alpine x-show 把内层改为 flex,但外层 CSS 始终覆盖,
导致求婚弹窗、收婚弹窗、结婚成功弹窗、婚礼设置弹窗、
婚礼红包弹窗一律无法显示。
修复方案:将 show 状态的 x-show 移到外层容器,
内层固定显示(position:fixed + flex),去掉冲突的 display:none。
同时补充 x-cloak 防止页面加载时闪烁。
|
2026-03-01 17:17:14 +08:00 |
|
lkddi
|
d703309a34
|
修复:当前用户未设性别时求婚按钮静默消失的问题
根因:lkddi 的 sex=0(未设置),mySex 为空字符串,
导致 && mySex 判断为 false,求婚按钮被隐藏无任何提示。
修复:
1. 将 lkddi.sex 更新为 1(男)
2. 新增「未设置性别」提示块:
- 当前用户未设性别 + 对方有性别 + 对方未婚 时显示
- 灰色虚线样式,hover 提示「请到个人资料页设置性别后即可求婚」
- 不再静默隐藏,避免用户困惑
|
2026-03-01 17:12:23 +08:00 |
|
lkddi
|
bf001a6cf6
|
优化:商店周卡/道具/戒指/钓鱼卡购买前弹确认窗口,购买成功后 Toast 提示
- 点击购买按钮 → 弹出 chatDialog.confirm 确认窗口
「确认花费 🪙 X 金币购买【XXX】吗?」
- 确认后才调用 buyItem;取消则不执行
- 购买成功后:showShopToast「✅ XXX 购买成功!」
- 商店保持打开(不再 close)让用户看到分组标题徽章更新
|
2026-03-01 16:58:29 +08:00 |
|
lkddi
|
c72309aa16
|
优化:周卡分组标题显示当前已激活的特效名称
购买了全屏特效(周卡)后,商店「📅 周卡」分组标题旁
显示绿色徽章「✅ 已激活:XXX」,与自动钓鱼卡的剩余时间
徽章风格统一。
|
2026-03-01 16:55:12 +08:00 |
|
lkddi
|
fc4c0c543e
|
优化:自动钓鱼卡剩余时间徽章移至分组标题旁
商品图标上去掉紫色时间徽章(避免每张卡都显示同值造成误解);
改为在「🎣 自动钓鱼卡」分组标题后方统一显示「⏳ 剩余 X 小时」紫色标签,
仅持有有效卡时出现。
|
2026-03-01 16:52:59 +08:00 |
|
lkddi
|
303c5e2a60
|
功能:自动钓鱼卡持续循环钓鱼
有自动钓鱼卡时:
- 点一次「钓鱼」自动循环:抛竿→收竿→冷却→抛竿...
- 冷却期间按钮显示倒计时「⏳ 冷却 Xs」
- 屏幕右下角显示「🛑 停止自动钓鱼」悬浮按钮
- 点击停止或卡到期后自动退出循环
- 出错时也自动停止循环
|
2026-03-01 16:26:15 +08:00 |
|
lkddi
|
bd1e247fcf
|
优化:浮漂下沉动画延长至 1.5s,视觉更自然
|
2026-03-01 16:22:42 +08:00 |
|
lkddi
|
63679a622f
|
功能:随机浮漂钓鱼防挂机 + 商店自动钓鱼卡
核心变更:
1. FishingController 重写
- cast(): 生成随机浮漂坐标(x/y%) + 一次性 token
- reel(): 必须携带 token 才能收竿(防脚本绕过)
- 检测自动钓鱼卡剩余时间并返回给前端
2. 前端钓鱼逻辑重写
- 抛竿后显示随机位置 🪝 浮漂动画(全屏飘动)
- 鱼上钩时浮漂「下沉」动画,8秒内点击浮漂才能收竿
- 超时未点击:鱼跑了,token 也失效
- 持有自动钓鱼卡:自动点击,紫色提示剩余时间
3. 商店新增「🎣 自动钓鱼卡」分组
- 3档:2h(800金)/8h(2500金)/24h(6000金)
- 图标徽章显示剩余有效时间(紫色)
- 购买后即时激活,无需手动操作
4. 数据库
- shop_items.type 加 auto_fishing 枚举
- shop_items.duration_minutes 新字段(分钟精度)
- Seeder 写入 3 张卡数据
防挂机原理:按钮 → 浮漂随机位置,脚本无法固定坐标点击
|
2026-03-01 16:19:45 +08:00 |
|
lkddi
|
9139108744
|
修复:求婚按钮异性判断,mySex 存入 Alpine data 避免 x-show 内 window 访问失效
|
2026-03-01 15:56:12 +08:00 |
|
lkddi
|
5cf87391b6
|
优化:商店分组排序调整,改名卡(道具)移至戒指后面
|
2026-03-01 15:52:26 +08:00 |
|
lkddi
|
f9312475d0
|
优化:商店浮窗宽度 520→800px,网格 2列→4列
|
2026-03-01 15:49:38 +08:00 |
|
lkddi
|
3132f013b7
|
修复:无戒指时点确定改为打开商店浮窗而非新标签页
|
2026-03-01 15:47:01 +08:00 |
|
lkddi
|
4a9730c38d
|
功能:浮窗商店同步加「💍 求婚戒指」分组
toolbar.blade.php renderShop 补充:
- ring 类型分组(存入背包,求婚时消耗)
- 图标持有数量红色徽章
- 卡片下方亲密度/魅力加成标注
- 购买按钮走现有 buyItem 流程(后端 buyRing 处理)
|
2026-03-01 15:45:13 +08:00 |
|
lkddi
|
29e43507ac
|
功能:商店完善戒指板块
迁移:
- 2026_03_01_153959:shop_items 增加 intimacy_bonus/charm_bonus 字段
Seeder(RingItemsSeeder):
- 银质戒指 500金 亲密+10 魅力+30
- 黄金戒指 2000金 亲密+30 魅力+80
- 红宝石戒指 8000金 亲密+80 魅力+200
- 钻石戒指 30000金 亲密+200 魅力+500
- 传说神戒 100000金 亲密+500 魅力+1000
ShopService:
- buyItem() 分支加 ring 类型
- buyRing():扣金币 + 写入 active UserPurchase(背包持有)
ShopController::items():
- 返回 intimacy_bonus/charm_bonus
- 统计 ring_counts(各戒指持有数量)
shop-panel.blade.php:
- 新增「💍 求婚戒指」分组(排在最后)
- 图标右上角红色数字徽章(持有时)
- 卡片下方显示亲密度/魅力加成
- 购买按钮与现有逻辑复用
|
2026-03-01 15:42:25 +08:00 |
|
lkddi
|
1f33013216
|
优化:求婚前先检查戒指库存,无戒指则引导购买
openProposeModal() 改为 async:
1. 先调 /marriage/rings 检查背包
2. 无戒指 → 弹确认框 → 同意则新窗口打开 /shop
3. 有戒指 → 直接传入弹窗(openWithRings),避免二次请求
marriageProposeModal 新增 openWithRings(username, rings)
方法,接收预加载列表,无 loading 状态直接展示。
|
2026-03-01 15:38:52 +08:00 |
|
lkddi
|
e20f94fe17
|
修复:求婚限制异性(前端隐藏按钮 + 后端拦截校验)
前端(user-actions.blade.php):
- 求婚按钮增加三重条件:对方未婚 + 双方性别均已填写 + 性别不同
后端(MarriageService::propose):
- 增加异性校验:两方性别必须为「男/女」且不同
- 报错:只有男女双方才能互相求婚
frame.blade.php:
- chatContext 注入 userSex(当前用户性别)供前端判断
|
2026-03-01 15:34:36 +08:00 |
|
lkddi
|
877fd1935f
|
功能:婚姻系统第12步(前端交互)
chat.js:
- 监听婚姻全局广播(MarriageAccepted/Divorced/WeddingCelebration)
- initMarriagePrivateChannel() 监听私人频道
(求婚/拒绝/过期/离婚申请/红包领取)
frame.blade.php:
- chatContext.marriage 注入所有婚姻 API URL
- 引入 marriage-modals.blade.php 弹窗组件
marriage-modals.blade.php(新建):
- 求婚弹窗(选戒指→求婚)
- 收到求婚弹窗(接受/拒绝)
- 结婚成功公告弹窗(可跳转婚礼设置)
- 婚礼设置弹窗(档位/支付方式/立即OR定时)
- 婚礼红包领取弹窗
- 所有 WebSocket 事件处理
user-actions.blade.php:
- 名片加「💍 求婚」按钮(对方未婚时)
- 名片加「💑 已婚状态」标签(对方已婚时)
- fetchUser 同步拉取对方婚姻状态
MarriageController:
- targetStatus 返回增加 status/partner_name/marriage_id
- myRings 返回增加 status/intimacy_bonus/charm_bonus
|
2026-03-01 15:31:07 +08:00 |
|
lkddi
|
312b92a81d
|
文档/调整:好友面板完成,更新 DEVELOPMENT.md
- DEVELOPMENT.md:好友系统 [ ] → [x],补充功能细节
- toolbar.blade.php:好友按钮移至「呼叫」后(用户调整位置)
|
2026-03-01 13:51:27 +08:00 |
|
lkddi
|
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 |
|
lkddi
|
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 |
|
lkddi
|
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 |
|
lkddi
|
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 |
|
lkddi
|
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 |
|
lkddi
|
2ae3d83349
|
优化:确认发放按钮圆角 6px→20px,视觉更圆润
|
2026-03-01 12:08:05 +08:00 |
|
lkddi
|
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 |
|
lkddi
|
5180526821
|
优化:确认发放按钮改为全宽独立一行,风格同弹窗按钮
输入框独占一行,按钮在输入框下方全宽显示:
- 宽度 100%,高度 48px,字号 16px,字间距 2px
- 琥珀橙色 #f59e0b,与弹窗头部色调呼应
- 禁用时 opacity:0.45,启用时 box-shadow 投影
- 符合截图中弹窗确定按钮的视觉风格
|
2026-03-01 12:04:05 +08:00 |
|
lkddi
|
0d693eef5f
|
优化:输入框与确认按钮等高(align-items:stretch)
flex 容器改为 align-items:stretch,按钮去掉固定 height
改为 align-self:stretch,自动撑满与输入框相同高度,
视觉上两者完全对齐。
|
2026-03-01 12:01:53 +08:00 |
|
lkddi
|
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 |
|
lkddi
|
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 |
|
lkddi
|
4ba5a88fc2
|
优化:奖励弹窗加宽+4列额度+最近10条记录+确认按钮醒目
- 弹窗宽度 320→520px(max-width:95vw 自适应)
- 额度四格改为一行4列(单次上限/单日上限/今日已发/剩余额度)
- 确认按钮改为橙红渐变+投影,视觉更突出
- 输入框下方显示最近10条发放记录(目标/金额/时间)
- 发放成功后实时在历史列表头部插入新纪录
- rewardQuota 接口统一返回 recent_rewards(最近10条)
|
2026-03-01 11:55:29 +08:00 |
|
lkddi
|
21cabb08c9
|
功能:奖励金币改为独立弹窗(展示额度信息)
- 点击「送金币」按钮打开独立弹窗,不再内联在用户名片中
- 弹窗展示 4 格额度信息:单次上限、单日上限、今日已发、剩余额度
- 新增 GET /command/reward-quota 接口(rewardQuota 方法)
返回当前操作人实时额度,超管返回全部不限
- 发放成功后页面内实时更新今日已发/剩余额度,无需刷新
- 移除原内联奖励面板,action 改为调用全局 openRewardModal()
|
2026-03-01 11:50:12 +08:00 |
|
lkddi
|
cc1278ffcb
|
修复:openUserCard 剥除消息中的装饰括号避免 404
问题:部分自动动作/系统消息用「【username】」格式显示用户名,
双击时把「【」前缀一并传给 openUserCard,导致:
GET /user/【lkddi → 404
修复:在 openUserCard 入口统一用正则清洗 【】[]
等装饰字符,再传给 fetchUser 查询。
|
2026-03-01 11:42:13 +08:00 |
|
lkddi
|
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 |
|
lkddi
|
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 |
|
lkddi
|
5a7d1565e5
|
修复:channels.php 移除 int 类型提示,改用强转比较防兼容性问题
int $id 类型提示在某些 PHP 版本下对字符串参数可能失败,
统一改为 (int) 强转比较,与 App.Models.User.{id} 写法一致。
|
2026-03-01 01:54:19 +08:00 |
|
lkddi
|
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 |
|
lkddi
|
a44a9ce242
|
修复:回加好友成功后大卡片自动关闭
quickFriendAction 是 async 函数,await 完成后
检查按钮文字是否为 '✅',1.5 秒后调用 close() 关闭 banner。
|
2026-03-01 01:33:41 +08:00 |
|
lkddi
|
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 |
|
lkddi
|
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 |
|
lkddi
|
779179af01
|
功能:好友添加通知改为居中大卡弹窗(同任命公告风格)
FriendAdded:
- 互相好友 → 绿色渐变大卡 + '你们现在互为好友 🎊',5秒自动消失
- 单向添加 → 蓝绿渐变大卡 + [➕ 回加好友] + [稍后再说] 按钮,手动关闭
FriendRemoved:保留右下角 Toast 通知
效果复用 appoint-pop 弹出动画关键帧
|
2026-03-01 01:09:37 +08:00 |
|
lkddi
|
212f7a0096
|
功能:好友悄悄话内嵌快捷操作链接
后端:
- notifyOnlineUser 生成带内联 <a> 标签的内容
- added 未互相 → 嵌入 '➕ 回加好友' 链接
- removed 互相 → 嵌入 '🗑️ 同步移除' 链接
- 链接调用全局 quickFriendAction(act, username, el)
前端:
- 新增 window.quickFriendAction() 全局函数
- 防重复点击(dataset.done 标记)
- 成功后更新链接文字 '✅ 已回加' / '✅ 已移除',不刷新页面
|
2026-03-01 01:03:10 +08:00 |
|
lkddi
|
3c2038e8fe
|
优化:好友通知弹窗根据互相状态显示不同内容
FriendAdded 事件:
- 新增 hasAddedBack 字段(B 是否已回加 A)
- Toast:已互相好友 → '你们现在互为好友 🎉'
- Toast:未回加 → '但你还没有添加对方为好友' + [➕ 回加] 一键操作按钮
FriendRemoved 事件:
- 新增 hadAddedBack 字段(之前是否互相好友)
- Toast:之前互相好友 → 提示 + [🗑️ 同步移除] 一键操作按钮
- Toast:单向好友 → 简单通知,无操作按钮
Toast 改进:
- 右上角 × 关闭按钮
- 快捷操作按钮支持 fetch 直接请求
- 完成后显示结果并自动关闭,延时改为 8 秒
|
2026-03-01 00:54:10 +08:00 |
|
lkddi
|
700ab9def4
|
feat: 好友系统全实现
后端:
- FriendController:add/remove/status/index 四个接口
- FriendAdded / FriendRemoved 广播事件(私有频道)
- channels.php 注册 user.{username} 私有频道鉴权
- routes/web.php 注册好友路由
- ChatController::init() 修复 DutyLog 在 return 后执行的 bug
- ChatController::notifyFriendsOnline() 上线时悄悄话通知好友
前端:
- user-actions:写私信 → 加好友/删好友按钮(动态状态)
- toggleFriend() 方法 + fetchUser 后加载好友状态
- scripts:监听私有频道 FriendAdded/FriendRemoved
- showFriendToast() 右下角浮窗通知(5秒自动消失)
- global-dialog 加 fdSlideIn 动画
|
2026-03-01 00:48:51 +08:00 |
|
lkddi
|
7ec0904c5c
|
重构:全局自定义弹窗系统 window.chatDialog
- 新增 chat/partials/global-dialog.blade.php(全局弹窗 HTML + JS)
- 提供 chatDialog.alert() 和 chatDialog.confirm() 两个异步 API
- Alpine.js userCardComponent 的 $alert/$confirm 代理到全局 API
- toolbar 离开按钮统一改用 chatDialog.confirm(),移除独立 leave-confirm-modal
- 支持动态标题颜色、淡入动画,兼容 Chrome/Edge/Firefox
|
2026-03-01 00:34:11 +08:00 |
|
lkddi
|
e2ae4b34b3
|
修复:Chrome 离开按钮 confirm 弹窗闪烁 → 自定义 HTML 弹窗
- 移除原生 confirm(),改为自定义 #leave-confirm-modal 弹窗
- 红色渐变标题栏,取消/确定离开两个按钮
- 点击遮罩可关闭,不触发任何浏览器原生对话框机制
|
2026-03-01 00:29:00 +08:00 |
|