跳到正文

用户反馈 ​

登录用户可以在右上角账户菜单里打开「反馈」,把遇到的问题或者想要的改进写下来;管理员在后台「用户反馈」页面读到全部内容。

反馈是数据库里的行,不是转发到某个邮箱的邮件——「大家说过什么、后来怎么处理的」需要事后还能查,而只落到某一个人收件箱里的反馈,下一任管理员就再也看不到了。

用户怎么提交 ​

面板里有四项:

字段取值
反馈类型Bug 提交 或 建议
优先级低、中、高,这是提交人自己的判断
标题1–120 字
内容1–8000 字,输入框特意留得比较大

提交后,面板下方会列出这个账号提交过的全部反馈。点开其中一条,就进入这条反馈的会话:反馈原文、管理员的回复、以及自己继续补充的输入框。这也是它不用邮件表单的原因:提交人能看见自己那条到了、后来怎么样了,就不会因为「好像没发出去」再发四遍。

有新回复时,右上角头像和账户菜单里的「反馈」会带一个小红点;点开那条反馈就算已读,红点随之消失。

每个账号 24 小时内最多提交 10 条。上限的检查和写入在同一个事务里,先锁住提交人那一行——两个并发请求不会都看见最后一个名额。

管理员怎么处理 ​

后台「用户反馈」页面按时间倒序列出全部反馈,可以按状态、类型、优先级筛选,也可以搜索标题、正文和提交人。点开一条会在右侧打开整条会话:反馈原文、双方全部往来,以及回复输入框。

回复和提交一样是 Markdown。两边的内容都用对话界面那套渲染器绘制——它构建节点而不是拼 HTML 字符串,只放行 http(s) 和 mailto,图片一律渲染成链接。这一条在后台比在用户端更要紧:这里渲染的是陌生人写的内容,而「图片渲染成链接」意味着一条「反馈」没法把每个看它的管理员变成别人统计里的一次访问。

  • 用户最后说话的会话,卡片上带红色「待回复」,顶部「等你回复」统计的就是这些。点开即算已读,标记随之清除。
  • 状态只有两个:待处理 和 已处理,可以来回切换。回复不会自动改状态——回答了和处理完了是两回事;用户在一条已处理的反馈下继续追问,它会重新标记为「待回复」,但状态留给你决定。
  • 管理员能改的只有状态和自己写的回复——反馈正文是别人写下的原话,任何时候都不会被编辑。
  • 会话里混进垃圾内容时,把鼠标放到那一条上可以单独删除它;整条反馈都是垃圾才用底部的「删除」。删除都不会通知提交人。

一条会话最多 50 条回复(双方合计)。这个页面需要 feedback 权限,在用户详情的管理员权能里勾选。超级管理员默认拥有全部权限。

删号之后 ​

反馈和回复都跟着作者的账户级联删除。删掉一个管理员账户,会把他写过的回复一起带走——这是同一条规则一致地应用,而不是给管理员另立一套;提交人自己的原话属于一个还在的账户,会留下来。

防刷 ​

默认只有每账号每天 10 条这一道限制。真的被刷过的站点,可以在「安全 → 人机验证场景」里打开「提交反馈时人机验证」——需要先填好 Turnstile 的 Site Key 和 Secret Key。

打开后,提交反馈和用户回复都要过验证,每次一遍。两处都不设例外是有原因的:每账户每天只能提交 10 条,但一条会话能写 50 条回复——回复才是更便宜的那道门,只挡住贵的那道等于挡了错的一半。

验证窗口和兑换码那里同一种:Cloudflare 的小组件是固定宽度的盒子,塞进可以拖窄到 320px 的面板里会挤在一起,所以它自己占一层。通过后写好的内容自动发出;关掉窗口不会丢掉已经写的内容。

验证在写入之前进行,所以没通过的提交不占当天的名额,没通过的回复也不会落进会话里。

回复署名 ​

「设置 → 用户反馈 → 回复署管理员的名字」默认开启:用户看到的是「管理员 · 某某」。关掉之后只署「管理员」,而且名字根本不会发到用户浏览器里——是服务端在返回之前去掉的,不是页面选择不画。后台始终显示是谁回的。

管理员在后台的回复不走这道验证:那已经在登录态、feedback 权能和后台路由后面,再加一次只是让处理反馈的人每回都点一遍格子。

终端 ​

控制台里有同一套能力,可通过网页终端或 SSH 使用:

feedback list [--status open|resolved] [--kind bug|idea] [--priority low|medium|high] [--q 关键字]
feedback show <id>
feedback reply <id> --text "回复内容"
feedback reply delete <id> <reply-id> --yes
feedback resolve <id>
feedback reopen <id>
feedback delete <id> --yes
feedback send --title "标题" --body "内容" [--kind idea] [--priority high]

feedback show 会把整条会话按时间顺序打印出来,正文按 Markdown 原文显示——终端不是浏览器,而原文也正是你会粘回 issue 里的东西;每条回复前面带它自己的 id,feedback reply delete 要用的就是它。

除 feedback send 外都需要 feedback 权限。feedback send 是以你自己的账号提交,和面板走同一个接口、同样的上限和校验,没有办法以别人的身份提交。

提交反馈的人在自己的终端里也能跟进,和反馈面板一样,每个账号都能用:

feedback mine                       # 自己提交过的反馈,以及今天还能提交几条
feedback thread <id>                # 查看一条反馈和全部回复,读过即标为已读
feedback answer <id> --body "内容"   # 在自己的反馈下追加回复
feedback unread                     # 有未读回复的反馈数

名字和管理员那一组不同是有意的:管理员在自己的反馈下回复,说话的身份是提交者,不是处理者,接口会分开记录。

Obsidian Arc · 自托管 AI 工作空间