- 每日签到与成长任务ID daily_quest版本 2.2.0插件制作者 cxk123售价 30 积分3716 行 / 227.1 KBHook / 路由 / 后台页每天签到累积连续天数,漏签可以消耗补签券补回来;每天还有一组会自动轮换的任务,收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。app/plugins/daily_quest/plugin.php插件预览5 张开发日志已有 5 条
此项目接受所有登录用户协助维护和提交更新。
主楼点赞与点评1idc投币1个19小时前
版本 1.0.0 更新:
首次上架:每日签到与成长任务 1.0.0【它解决什么】市场 406 条在售条目里,签到类 5 款(daily_checkin / checkin_captcha / nb_checkin /
streak_reward / daily_fortune)都没有「补签、跨插件任务、写入期风控、账目对账」这四件事;
「成就 / 成长 / 里程碑」0 命中。本款的差异化不在签到本身,而在任务体系。一、连续签到 + 补签券
· 日桶 UNIQUE(user_id,day_key) 做并发仲裁:同一天重复签到不重复发奖(积分一分不多发)
· 漏签可以用「补签券」补回来:只补最近 7 天里缺失的那一天(可配),券有上限、由任务与连续产出
· 补签另写一行(kind=1、不发当日积分、不改写任何历史行),券的进出全部写进台账二、任务总线(Hook 驱动、零轮询)
· 当日任务池按站点种子轮换;发帖 / 回帖 / 收获积分 / 回答被采纳 / 报名活动 / 现场签到都会
自动推进进度,够数就能领奖励 —— 不需要任何人去点「刷新」
· 幂等键保证同一个事件反复投递只算一次;一条事件命中多个任务也只用一条语句
· 消费已有的 qa_bounty.after_accept;event_rsvp 的报名 / 签到事件是新增契约,
对方升级前页面上会写明需要哪个版本(本插件不去读对方的数据表)三、双轨奖励 + 台账对账
· 积分一律走核心积分接口;里程碑徽记按历史最长连续天数一次性点亮,同档永不重发
· 逐笔台账,后台能直接看到「Σ台账 = 应发合计」的守恒等式与漂移人数
· 默认一分不发:装了插件不会静默改变任何人的积分,要发奖就在后台打开积分轨逐项配置四、写入期风控(只标注,不处置)
· 同秒重复提交 / 自问自答 / 内容无效 / 每天刚过零点就签到 —— 全部只记进面板
· 插件没有任何自动扣分与封禁;IP 与 UA 只存不可逆哈希,可一键清空五、每日重置不依赖逐用户定时任务
· 进度按天天然清零 + 用户自己那次请求内的懒更新 + 唯一的站点级任务(与用户数无关)入口:首页侧栏「每日签到」、顶栏「签到」、?a=daily_quest(签到面板)、
?a=daily_quest_board(连续榜与里程碑徽记);列表页作者名旁会给今天已签到的作者一个「签」标记。插件质量报告
插件:
daily_questHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 sidebar.feature_links 首页/侧栏快捷功能 否 5 - - - - top.bar.actions 顶部栏插件入口,同一请求只执行一次(展示位置:版块导航与搜索框前后) 否 5 - - - - topic.index_data.loaded 首页/版块/用户主题列表查询后 否 5 - - - 读 plugin_daily_quest_days topic.title_suffix 首页/版块主题列表逐条标题 是 5 - - - - reply.after_save 回帖保存后 否 3 - - - 写 plugin_daily_quest_risk, plugin_daily_quest_stats;读 plugin_daily_quest_events, plugin_daily_quest_roll topic.after_save 主题保存后 否 3 - - - 写 plugin_daily_quest_risk, plugin_daily_quest_stats;读 plugin_daily_quest_events, plugin_daily_quest_roll user.points_changed 用户积分变动后 否 3 - - - 写 plugin_daily_quest_risk, plugin_daily_quest_stats;读 plugin_daily_quest_events, plugin_daily_quest_roll diy_layout.components 非系统hook 否 1 - - - - event_rsvp.after_checkin 非系统hook 否 1 - - - 写 plugin_daily_quest_risk, plugin_daily_quest_stats;读 plugin_daily_quest_events, plugin_daily_quest_roll event_rsvp.after_signup 非系统hook 否 1 - - - 写 plugin_daily_quest_risk, plugin_daily_quest_stats;读 plugin_daily_quest_events, plugin_daily_quest_roll qa_bounty.after_accept 非系统hook 否 1 - - app_topics 写 plugin_daily_quest_risk, plugin_daily_quest_stats;读 plugin_daily_quest_events, plugin_daily_quest_roll 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_daily_quest_days字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_daily_quest_progress字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_daily_quest_stats字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_daily_quest_ledger字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_daily_quest_badges字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_daily_quest_risk字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_daily_quest_events字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_daily_quest_roll字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 厉害!
版本 1.0.1 更新:
daily_quest 1.0.1- 新增给「页面组件 DIY」的原生只读组件「今日任务」(daily_quest:today):今日任务进度(已完成 / 总数 + 逐条进度条 + 领取状态)+ 我的连续天数 + 最近里程碑,声明成本 6 条。
- 未登录时降级为登录提示(不是空白也不是报错);站点上一条签到数据都没有时零查询返回空块。
- 按人渲染:显式声明 per_user —— 这个块渲染当前登录用户的私人进度,不进跨请求组件级缓存(避免甲的数字被乙命中)。
- 渲染回调不写库(连续数断链只在 PHP 里判定,不使用 stats_touch),拿不到数据不抛异常。
- 未装 / 未启用 layout_diy 时行为、查询数、页面字节逐字节不变(套件有 A/B 对照)。
版本 2.0.0 更新:
2.0.0:四项新能力 + 五条缺陷修复。【新能力①积分兑券】攒下的积分可以主动换成补签券(后台设每张价格,默认 0 = 关闭;还要打开积分轨才生效)。
扣分走核心 user_points_change(),先判余额再扣、扣不动就把券退回去;台账两笔单位分开(points/spend 支出 +
coupon/coupon_buy 收入),券守恒仍然成立。原来券只能等连续满 N 天或任务奖励,想补签却没券时毫无办法。【新能力②断链保护】站长设一个阈值(默认 0 = 关闭)后,用户下次打开面板时,若「昨天漏签 + 前天有签到
(补了确实接得上链)+ 有券 + 历史最长连续达标」四条同时成立,自动用 1 张补签券补回昨天,并在面板上
明说用了哪张券。补了接不上链的情况一张券都不花。【新能力③签到月历回看】?a=daily_quest&month=YYYY-MM 整月网格(周对齐 + 四态)+ 本月签到/补签/积分/
最长连续小结 + 上下月翻页;网格里的补签按钮带回跳月份。默认视图一个字都没变(连查询数都没变)。【新能力④后台人工台账】赠券 / 扣券 / 积分调整,理由必填,事后可追;券走写入期 CAS 守上下限,
积分走核心。后台把「自动发放(进守恒等式)/ 人工调整 / 支出」三列分开显示 —— 这两个情况原来在代码里
留了口子却没有入口。另加「按用户重算派生状态」与「刷新站点标记」两支运营动作。【修的缺陷】
- 积分轨关闭时(默认就是关的),任务与里程碑把「配置里的奖励值」当成「实际入账」写进了应发合计,
而发放那一步一分没发、台账也没记 —— 用户点一次领取,后台对账面板就显示漂移。现在两个字段只记
实际入账,历史行用升级时间戳按台账口径精确换算。- 券类奖励把「券的数量」写进了积分的字段(一个字段两种单位)→ 券发得越多积分账越不平。现在券不再
占用积分字段,凭据是台账里的 coupon_in(ref=quest:<day>:<key>)。
- 超过 90 天的连续天数被窗口截断:补签一次或后台校准一次,连续从 150 掉到 90(补签行的 streak_after
还被 makeup_window+1 天的窗口算错)。现在单用户路径按有界全量(10 年)走链,批量校准另加
「链走到窗口下缘就不许降级」的守卫。- 补签写路径不维护站点标记:站点在「还没有任何签到行」时补签成功,面板却永远停在「还没有人签到过」
的空视图(1.0.1 给组件修过同类问题,面板路径漏了)。现在补签写路径补上标记,后台也能一键重探。
- 补签券上限是在读出来的缓存值上判定的(读-判-写),并发下可以超上限;而且先改内存值再整行写回,
刚加的券会被覆盖掉。现在加券/减券各是一条写入期 CAS(rowCount 是唯一仲裁者)。
【跨插件契约口径修正】event_rsvp 已经发到 12.0.0,而它的 manifest 与源码里至今没有
event_rsvp.after_signup / after_checkin 这两个投递点(新事件是 after_publish / after_review)。
1.0.1 写的「需要 11.1.0+」是一句做不到的版本承诺(升上去提示也不会消失)。2.0.0 改成如实写
「至今(核对到 12.0.0)没有投递这个事件」;三态与 data 属性形状不变,对方真的加了投递点后只需改一行。版本 2.1.0 更新:
2.1.0:新增签到月报导出;修掉一条真并发下会丢券的缺陷;升级路径实测(老库覆盖文件即自愈)。【新能力⑤签到月报导出】?a=daily_quest_export&month=YYYY-MM 下载自己的签到记录 CSV:
逐日一行(日期 / 类型 / 积分 / 截至该日的连续天数 / 本行消耗补签券 / 记录时间)+ 末行合计
(签到天数 / 补签次数 / 本月积分 / 本月最长连续)。只导自己的数据(不接受任何 uid 参数),
一条查询、表头与行同源生成、单元格做公式注入中和;UTF-8 BOM + text/csv + attachment + nosniff,
Excel 打开中文不乱码;非法月份回落到当月,未登录走登录提示页而不是 500 或空文件。
入口在签到月历的翻页那一行。【修的缺陷·真并发】
- 券余额被整行 upsert 覆盖:签到 / 补签路径的整行覆盖写会把并发中刚由 CAS 加上去的券写回旧值,
于是台账(+1)与派生缓存(0)对不上、券对账漂移。现在整行 upsert 不写 coupons 这一列,
该列由写入期 CAS 独占(唯一例外是后台人工重算与游标批量校准这两个显式运维动作)。- 「先读余额、再扣分」之间可以透支成负数:核心的 user_points_change() 不做余额保护,
多 worker 下多个兑券请求能同时读到「余额够」。现在这一段放进「同一用户同一秒」的租约
(复用里程碑判定那把 _stats.lease_at),抢不到就明确回「上一个操作还在处理中,请稍后再试」。
副作用写在 README 边界里:同一秒里里程碑判定与兑券会互相让路,徽记只会迟到不会漏发。- 券的两条 CAS 加了有界重试(撞到争用 ≠ 已达上限),并发下不会把「只是撞了争用」误报成「已达上限」。
【升级路径实测】本插件不加表、不加列:1.0.1 老库直接覆盖 2.1.0 文件即可。
实测两段:A 只覆盖文件(不重装、不 disable/enable、不同步)→ 第一发请求就 200、跑的是新代码、
结构标记与升级来源当场写上(后台显示「结构标记 2.1.0(升级自 1.0.1)」)、
119 天历史日桶 + 台账 + 徽记 + 进度行一行不丢、连续 118 仍是 118;
B 再走市场在线更新那一步(换文件 + 同步)→ 核心重新登记为 2.1.0、新路由可用。
1.0.1 时代写下的老口径数据(积分轨关闭时领取积分类任务记下的 reward=7、券类奖励把券数写进积分字段)
升级后对账漂移 0 人。【真并发套件】私有副本用 4 个 worker 起站,套件里同时发 4 个请求:兑券处处不超上限、账实一致、
余额不为负;断链保护只补出一行、只扣一张券;「补了接不上链」4 个并发请求之后零写入、券一张没花。
另做预算复核:首页贡献仍是 +1、当天角标路径不变(人数翻倍 1 → 1)、live=0 时首页 0 条。版本 2.2.0 更新:
2.2.0 · 任务来源的版块可见性- 修复(越权):签到面板的「来源」条与今日达成流此前只做匿名遮蔽、不做版块可见性判定 ⇒ 「仅指定用户组可见」版块里的主题标题会出现在任务页。现在两处按核心同一口径过滤。
- 注意:被过滤时只丢掉来源条本身、不抹整行 —— 抹掉整行会让今日达成流退回"真名兜底",反而泄露匿名身份(这是一个反向陷阱,已在实现里注明)。
- 口径:无受限版块时 SQL 文本逐字节不变;页面语句数增量 0。