Files
tamabox/outputs/feature-mode-2026-09-01.md
T
tamakyi e3e59e7c69 chore: baseline snapshot before moderation-strictness feature
Repo .git was damaged (refs/ missing, index truncated, object store near-empty).
Repaired via git init (rebuilt refs), stale index preserved as .git/index.corrupt-20260910.bak,
then full worktree committed as a rollback baseline.
2026-09-10 10:56:27 +08:00

3.5 KiB
Raw Blame History

功能管理面板改进:长期开放模式 + 私聊上限下线 + 按钮同行(2026-09-01)

需求与方案

# 需求 方案
1 缺少「长期开放」开关:设了时间/数量后服务到期即关,想要一直开放的服务没有直接入口 每个功能面板新增「收集模式」三选一(radio):长期开放 / 定时收集 / 循环定时;选「长期开放」保存后即不限时间,保持开放直到手动关闭(仍可叠加收集上限)
2 私聊设置收集上限没有意义 私聊面板隐藏「收集上限」与「重置计数」;后端保存私聊时强制 quota_limit=0;启动期幂等清零历史残留的私聊上限/计数(normalizeChatQuota)
3 「保存该功能设置」应与「重置计数」同一行 两按钮合并到同一 flex 行;重置按钮通过 HTML5 form 属性指向独立的 reset 表单(HTML 不允许表单嵌套),CSRF 各自保留

改动明细

1. 收集模式三选一(templates/user/feature-control-form.html + route/user/features.go)

  • 模式取值:always(长期开放)/ window(定时收集,一次性开放/关闭窗口)/ recurring(循环定时,每周循环)。
  • 渲染时从已保存配置推断模式(inferFeatureMode):有循环定时 → recurring;有一性次时间 → window;否则 → always。
  • 模式互斥:保存时只保留所选模式的字段,其余清空。这顺带修掉一个旧语义坑—— 此前「一次性窗口 AND 循环定时」叠加,一次性关闭时间过后功能永久结束(硬边界), 用户想恢复一直开放必须手动清空时间字段;现在切换到「长期开放」保存一次即可。
  • JS 按所选模式显隐「定时收集」/「循环定时」字段区(未选模式的字段仍提交,由后端按模式清理)。
  • 未携带 mode 的旧表单提交按字段推断兜底,保持兼容;Evaluate 判定逻辑零改动。

2. 私聊收集上限下线

  • UI:{{ if ne .Key "chat" }} 条件隐藏配额输入、已收集行、重置按钮。
  • 后端:FeaturesUpdate 对 feature=chat 强制 quota = 0(防历史残留上限导致私聊"莫名关闭")。
  • 数据:新增 internal/db/feature_control.go::normalizeChatQuota,启动时把 feature='chat' 且 quota_limit>0 或 quota_count>0 的行幂等清零(db.go 调用,失败仅告警)。
  • 文案:四语言字典更新 admin.featureHint.chat(去掉"达到上限后停止新建会话")。

3. 按钮同行

  • .feat-actions 行内先「重置计数」(default 样式,仅非私聊面板)后「保存」(primary)。
  • 重置按钮 form="feat-reset-{key}" 指向表单外的独立 reset 表单,功能与原来完全一致。

其他改动

  • i18n 四语言(zh-CN/zh-TW/en/ja)新增 admin.featureMode、admin.featureModeAlways/Window/Recurring、admin.featureModeHint。
  • templates/render_test.go:mock 结构体补 Mode 字段(question=always、chat=always、vote=recurring)。
  • templates/user/profile.html:新增 .feat-modes / .feat-field-label / .is-hidden 样式。

验证

  • gofmt -l -e 全部改动文件 ✅
  • 全模块 overlay go build / go vet ✅(webp 屏蔽包用 dev/webpstub 桩 + -overlay 类型检查)
  • 全部可运行测试通过(含 templates 面板渲染回归、internal/i18n)✅
  • 待办:Linux 环境最终 go build ./...(webp CGO 真实编译)