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

48 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 功能管理面板改进:长期开放模式 + 私聊上限下线 + 按钮同行(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 真实编译)