RGJ
(Richard - Communiteq)
1
所以我的伴侣是一位教师(教授古希腊语和古典拉丁语),多年来一直在她的课堂上使用 Discourse。她主要用它来分发作业并随后与学生讨论。然而,所有作业目前仍是在课堂上以纸质形式提交的。
直到最近——由于疫情恐慌导致学校关闭,她正转向 100% 的在线教学,包括作业提交。因此,所有学生目前都是通过电子邮件将作业发送给她。这种方式非常不理想,因为她需要处理大量的行政工作(我可以告诉您,她并不擅长这类事情
)。
我们讨论了几种方案,她说:“为什么不能创建一个主题,让参与者只能看到我的帖子(即主题发起者发布的帖子)以及他们自己的帖子呢?这样我就可以发布一个作业作为主题,每个学生可以在其下方提交答案,但无法看到其他人的答案。等所有人都提交完作业、进入讨论阶段时,我希望能够按一个按钮,让‘面纱’消失,使该主题中的所有帖子对所有人可见,这样大家就能互相查看并讨论彼此的作品了。”
太棒了!(这就是我爱她的原因。)
我打算为此开发一个插件,可能会利用已有的“solved”插件来实现类似“魔法开关”的功能(即一旦主题被标记为已解决,所有内容立即可见)。但在开始之前,我想先听听大家的意见,获取一些反馈,也许还能得到一些让功能更完善的建议。
关于如何高效实现这一功能,任何提示和指导都非常欢迎——因为获取主题的方式有很多,如果单个学生找到绕过限制的方法,整个机制就会失效。
所有与主题相关的内容是否都通过 TopicView 传递?我能否利用 username_filters?或者构建一个类似机制?还是说使用 guardian 是更好的方式?
期待听到大家的想法!
18 个赞
sam
(Sam Saffron)
2
这很大程度上取决于此处所需的安全保障级别,但鉴于我假设学生们相当精明,仅靠 CSS 的解决方案是行不通的。
既然 CSS 方案行不通,而这些孩子很可能会耍小聪明,找出各种漏洞来作弊。
可能会出现后门 [quote] 扩展以及各种其他捣乱行为。仅仅修补“可以查看帖子”的功能可能还不够。
一种非常安全的做法是通过私信(PM)进行:学生通过私信提交内容,完成后,只需“点击”即可将所有私信移至主题帖中。干净、简单、安全。
18 个赞
Falco
(Falco)
3
解决方案是上传文件还是作曲家文本?
如果是上传,结合新的 安全媒体上传 功能,并配合一个插件来修改临时 URL 的生成方式,使其仅为用户下载生成“有效”的链接(仅对工作人员有效),这可能是一个可行的方案,且改动较小。当话题被解决/标记/关闭后,临时 URL 会恢复到正常状态,这样所有人即可查看所有内容。
此外,能够看到用户提交内容却无法查看提交的具体内容,这一点也很酷。
8 个赞
RGJ
(Richard - Communiteq)
4
感谢你们两人的反馈和建议!
问题是她有 6 个不同的班级,每个班级可能同时运行 2 到 3 个作业,所以她大约有 15 个不同的作业需要管理。所以我想这不会那么容易。
不,仅靠 CSS 肯定行不通。另一方面,即使这个问题偶尔被破解一两次,只要我不需要每天修补漏洞,那就不是大问题。
这真是一个很棒的想法。但她们主要是在编辑器中提交文本,而且她也不想强制所有内容都必须以上传形式提交。
2 个赞
我将编辑标题,因为这就是该请求的核心内容。
我的直觉是,这更像是一个“剧透”插件,而非其他功能。这些剧透内容仅对主题发布者可见,由其决定是否揭晓。
4 个赞
sam
(Sam Saffron)
6
Spoiler 会稍微有点棘手,因为那样你还需要保护 /raw 路由。
也许可以这样:
7 个赞
pfaffman
(Jay Pfaffman)
7
人们每年多次询问这个问题,而答案始终是“你无法拥有特定主题的权限。”如果你能解决这个问题,我认为将会引起极大的关注。
6 个赞
RGJ
(Richard - Communiteq)
8
嗯,这有点棘手。我一直在对 TopicView 和 PostGuardian 进行一些修改,目前已经实现了 80% 的功能,而且没有花费太多精力,包括 /raw 接口以及对编辑引用帖子编号的一些技巧。但目前我仍然能看到一些本不该看到的帖子,途径包括:
因此还需要进一步修补。目前我能想到的就这些。欢迎提出其他可能访问到帖子的途径。
4 个赞
这仍然是答案。说实话,我认为就连提出这个问题本身就表明提问者并没有真正想清楚他们想要实现什么。
不过,我不介意增强版的隐藏模式,我觉得这很有道理。
4 个赞
RGJ
(Richard - Communiteq)
12
我还需要完成一些细节,但我现在有一个可用的插件,地址是 GitHub - communiteq/discourse-private-replies · GitHub
安装并启用该插件后,话题所有者(以及工作人员)将在每个话题底部看到一个额外的按钮,名为 私密回复。
该按钮可用于切换话题的“私密回复”模式。
启用私密回复模式后:
- 话题所有者仍可查看所有帖子
- 其他所有用户仅能看到由话题所有者、工作人员以及他们自己发布的帖子
此类话题可通过话题顶部的横幅来识别:

当话题所有者决定将帖子公开时,可使用话题底部同一个按钮(此时显示为“公开回复”)来禁用私密回复模式。横幅将消失,所有帖子将对所有人可见(当然会遵守分类安全设置)。
该插件禁用了以下获取帖子内容的方式:
- 话题查看(即常规浏览帖子方式)
- 用户个人资料 - 活动记录
- 搜索
- 原始内容(
/raw/topic_id/post_id)
免责声明 1:
该插件不会完全隐藏谁在话题中发帖。话题列表中的用户头像保持不变,话题也会显示在用户个人资料 - 摘要中。不过,这两者都不会揭示帖子的具体内容。
免责声明 2:
我不确定是否还有其他我可能忽略的获取帖子内容的方式。(例如,我还需要测试摘要是否会泄露内容)。我的配偶将在未来几周内进行测试,我相信她的学生们一定能发现一些巧妙的漏洞。一旦发现,我会尽快修复。欢迎提供任何提示和建议!
本周晚些时候,我会发布一个插件分类帖子,并完善 README.md 文件。在此期间,非常期待大家的反馈!
9 个赞
这会对性能产生什么影响?许多第三方插件会引发 N+1、N 平方、N 立方甚至 N 的 N 次方级别的查询问题……希望这里能避免这种情况。
另外,如果能按主题单独开关该功能,并且只对启用的主题产生性能开销,而其他主题完全不受影响,那就更好了,而不是需要一直承担全局性能代价。
7 个赞
RGJ
(Richard - Communiteq)
14
我已尽最大努力保持代码的高效性,即尽可能采用惰性求值,并尽快退出任何过滤器。
确实还有一些小的优化空间,例如缓存员工用户 ID 和受保护话题的 ID,但我认为对于第一个版本来说,我已经做得相当不错了。如果有人持不同意见,欢迎随时对我的代码提出批评。
9 个赞