邮件的正文是文本,附件是资产:一把裁决放在附件里,附件的数据安全等级必须对标装备本体。附件与正文分离存储的设计,让正文的高频读写不牵连附件的低频高价值读写,安全的颗粒度由此细分。
---发送邮件:正文入库,附件独立登记
function Mail.sendWithAttach(toId, title, memo, items)
local mailId = Mail.insertBody(toId, title, memo)
if items and #items > 0 then
for _, it in ipairs(items) do
AttachRepo.deposit(mailId, it)
end
end
return mailId
end
---附件托管:物品转托管对象
function AttachRepo.deposit(mailId, item)
attachRepo[#attachRepo + 1] = {
mailId = mailId, item = item.id, n = item.n,
bind = item.bind, state = "holding",
}
end
正文表存标题与内容,附件表独立登记物品的完整快照(ID、数量、绑定、强化等级)。附件在托管期间脱离流通体系,任何人无法通过常规手段取走,领取时从托管仓转出进背包。
function AttachRepo.claim(attachId, actor)
local rec = attachRepo[attachId]
if rec.state ~= "holding" then return false, "附件已领取" end
if not actor:HasBagBlank() then return false, "背包已满" end
rec.state = "claimed"
giveitem(actor, rec.item, rec.n, rec.bind, "邮件附件")
QF_LogAttach(attachId, actor:GetUserId(), rec.item)
return true
end
领取的状态机三态:holding、claimed、expired。过期未领的附件延长 7 天并推送提醒,二次过期按价值走补偿邮件。附件的对账每日跑:holding 状态的每一件都必须能在托管仓里找到实物,账实不符即冻结邮件系统排查。
托管仓的存量与领取流水的差额日报,领取失败的重试次数与原因分类统计。
附件的物品快照曾经只存物品 ID 不存强化等级,+7 武器的附件领取后变成白板,快照字段的补全让历史受损的 37 件装备逐一修复。领取的并发曾经出现双人同领一附件,状态机的原子更新(先占位再发货)堵住了口子。
附件托管的存储独立于邮件正文表,正文可以清理归档而附件必须保留到领取或过期。领取接口的幂等标记防止重复点击的双发。附件的价值分级:高价值附件的领取要求二次确认弹窗,弹窗的文案显示物品全名与数量。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 玩家客户端闪退,开发者却毫不知情——这是没有崩溃上报的常态。Lua 层的错误自动收集:每个报错打包成事件…
实战应用:用在哪里 玩家举报外挂与骗子,客服处理的难点不是判断而是取证:说了什么、什么时间、有没有交易记录。举报取证链把玩家…
实战应用:用在哪里 老玩家的邮箱里躺着上千封邮件,列表控件如果真的创建一千个条目,滚动直接掉到个位数帧率。列表虚拟化只创建可…
实战应用:用在哪里 天赋树给满级玩家继续投入的理由:攻击系、防御系、通用系三条支线各 20 层,加点消耗天赋点,洗点返还点数…
实战应用:用在哪里 一把攻击上限 28 的修罗挂进拍卖行,起拍 800 万,两个行会的土豪从晚上八点掐到十一点。三小时的拉锯…
实战应用:用在哪里 邮件的正文是文本,附件是资产:一把裁决放在附件里,附件的数据安全等级必须对标装备本体。附件与正文分离存储…