3.5 KiB
3.5 KiB
功能管理面板改进:长期开放模式 + 私聊上限下线 + 按钮同行(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 真实编译)