Discourse 调查

:discourse2: 摘要 Discourse Surveys 插件允许您使用简单的 Markdown 语法直接在您的 Discourse 论坛帖子中创建调查。
:hammer_and_wrench: 仓库链接 https://github.com/discourse/discourse-surveys
:open_book: 安装指南 如何在 Discourse 中安装插件

Discourse Surveys 插件允许您使用简单的 Markdown 语法直接在您的 Discourse 论坛帖子中创建调查。该插件目前支持多种问题类型,例如单选按钮、复选框、下拉菜单、数字输入、文本区域、星级评分以及赞成/反对评分。

功能

  • 7 种不同的字段类型:单选按钮、复选框、下拉菜单、文本区域、数字选择、星级评分和赞成/反对
  • 必填/可选字段:将字段标记为必填以确保完成
  • Emoji 支持:在调查选项中使用 emoji
  • HTML 支持:问题和选项中的富文本格式
  • 用户身份验证:对匿名用户自动提示登录
  • 响应跟踪:防止同一用户重复提交
  • 权限感知:尊重主题和类别的权限
  • 移动响应式:在所有设备上无缝工作

用法

基本调查结构

所有调查都必须用 [survey] 标签包裹:


[survey name="my-survey" title="客户反馈调查"]

<!-- 调查字段放在这里 -->

[/survey]

调查属性

  • name: 调查的唯一标识符(默认为“survey”)
  • title: 显示在调查顶部的可选标题
  • public: 设置可见性(未来功能)
  • status: 调查状态(未来功能)

字段类型

1. 单选按钮(单选)


[radio question="你最喜欢的颜色是什么?"]

- 红色

- 蓝色

- 绿色

- 黄色

[/radio]

2. 复选框(多选)


[checkbox question="您使用哪些功能?(选择所有适用的)"]

- 电子邮件通知

- 移动应用

- 桌面通知

- API 访问

[/checkbox]

3. 下拉选择


[dropdown question="您的年龄段是?"]

- 18 岁以下

- 18-24

- 25-34

- 35-44

- 45-54

- 55 岁以上

[/dropdown]

4. 文本区域(长篇文本)


[textarea question="请提供详细反馈:" required="false"]

[/textarea]

5. 数字选择


[number question="请从 1-10 为此功能评分:" min="1" max="10"]

[/number]

6. 星级评分


[star question="您对整体体验的评价如何?"]

[/star]

7. 赞成/反对


[thumbs question="您会推荐给其他人吗?"]

[/thumbs]

字段属性

所有字段类型都支持以下属性:

  • question: 问题文本(必需)
  • required: 字段是否必须填写(true/false,默认为 true
  • min: 数字字段的最小值
  • max: 数字字段的最大值

完整示例

基本调查 Markdown

这是一个包含所有可用字段的基本调查 Markdown 示例:

[survey name="awesome-survey-thumbs" title="超棒的调查"]

[radio question="选择任意一个选项:"]
- 猫
- 狗
[/radio]

[checkbox question="选择多个选项:"]
- 红色
- 蓝色
- 绿色
[/checkbox]

[dropdown question="性别:"]
- 男
- 女
[/dropdown]

[number question="请从 1 到 10 为此调查评分:"]
[/number]

[textarea question="您对 xyz 的反馈是什么?" required="false"]
[/textarea]

[star question="您对整体体验的评价如何?"]
[/star]

[thumbs question="您对我们的服务满意吗?"]
[/thumbs]

[/survey]

调查渲染

下面是上述 Markdown 在 Discourse 中渲染的示例:

高级用法

在选项中使用 Emoji


[radio question="选择您最喜欢的动物:"]

- 🐈 猫

- 🐶 狗

- 🐦 鸟

- 🐠 鱼

[/radio]

问题中的 HTML 格式化


[radio question="您更喜欢哪个 <strong>编程语言</strong>?"]

- JavaScript

- Python

- Ruby

- Go

[/radio]

混合必填和可选字段


[survey name="mixed-survey"]

[radio question="您的角色是什么?" required="true"]

- 开发者

- 设计师

- 经理

- 其他

[/radio]

[textarea question="还有其他想法吗?" required="false"]

[/textarea]

[/survey]

调查结果

目前,此插件没有用于直接查看调查结果的后端用户界面。相反,您可以依赖 Data Explorer 查询来获取和分析调查回复。这是一个示例查询:

-- [params]
-- text :survey_name = survey

SELECT
  s.id,
  s.name,
  s.post_id,
  sf.question,
  COALESCE(sr.value, sfo.html) AS value,
  sr.user_id,
  sr.created_at AS responded_at
FROM
  surveys s
  JOIN survey_fields sf ON sf.survey_id = s.id
  JOIN survey_responses sr ON sr.survey_field_id = sf.id
  LEFT JOIN survey_field_options sfo ON sfo.id = sr.survey_field_option_id
WHERE
  s.name = :survey_name
ORDER BY
  s.id DESC

权限和安全

  • 需要登录:匿名用户必须先登录才能提交回复
  • 每位用户仅限一次回复:每位用户只能对每个调查提交一次回复
  • 主题权限:用户必须具有查看主题的权限才能查看调查
  • 发帖权限:用户必须在主题中拥有发帖权限才能提交回复
  • 已存档主题:已存档主题中的调查不能接受新的回复
  • 已删除帖子:已删除帖子中的调查将不再可访问

限制

  • 每个帖子只允许一个调查
  • 收到回复后无法修改调查结构
  • 单个调查中所有调查字段的问题必须是唯一的
  • 调查字段的问题不能为空

技术细节

数据库架构

该插件创建四个主要的数据库表:

  • surveys: 主要调查记录
  • survey_fields: 调查中的单个字段
  • survey_field_options: 选择类字段的选项
  • survey_responses: 用户对调查字段的回复

样式

该插件包含适应您主题的响应式 CSS。可以通过定位以下 CSS 类添加自定义样式:

  • .survey - 主调查容器
  • .survey-field - 单个字段包装器
  • .field-[type] - 特定字段类型的容器
  • .submit-response - 提交按钮
32 个赞

因此,用户无法看到结果(除非他们有权使用查询),而这完全是为了管理员/后台工作人员?

3 个赞

是的,没错。

7 个赞

这感觉不太实用 :cry:

3 个赞

需要提供发布调查结果的选项。否则,最好使用多个投票。

3 个赞

你好

下面的 Markdown 示例在新主题中呈现。我的 Discourse 已更新到最新版本。

可能是什么问题?

此致

@ppcole

上面是您在创建调查时,在编辑器预览中显示的内容。一旦您创建了主题,它就会按预期正常呈现。

谢谢 Arpit。它奏效了。期待增强功能

1 个赞

请问你们是否在处理这件事,但优先级不高?

如果能继续开发这个就太好了 - 它有巨大的潜力。

我发现上面的 SQL 确实可以提取结果,但格式不易处理;基本上需要在电子表格层面进行大量转换才能进行有用的分析。

不过,在一些生成式人工智能的帮助下,我能够生成一个非常出色的 Data Explorer 查询。由于 Data Explorer 的一些限制,它无法足够动态地适应各种调查;基本上,您需要为每个调查定制一个查询。

幸运的是,生成式人工智能可以使这一过程变得相当简单。以下是一个在大多数生成式人工智能服务中都可能有效的示例提示(如果您没有激活 AI 插件),只需插入您的调查 markdown 即可开始:

生成式人工智能提示,用于为特定调查生成定制化 SQL 查询

我有一个以 markdown 格式定义的调查,我需要一个 SQL 查询来使用 Data Explorer 插件从 Discourse 数据库中提取调查结果。该调查包含各种类型的问题,如单选按钮、下拉菜单、星级、复选框、文本区域、拇指和数字。我希望查询的输出是每个用户占一行,每个问题占一列。对于复选框问题,多个响应应合并为单个字符串。

这是调查 markdown:

在此处粘贴您的调查 markdown

这是用于获取调查结果的原始查询:

-- [params]
-- text :survey_name = survey

SELECT s.id, s.name, s.post_id, sf.question, COALESCE(sr.value, sfo.html) AS value, sr.user_id, sr.created_at as responded_at
FROM surveys s
JOIN survey_fields sf ON sf.survey_id = s.id
JOIN survey_responses sr ON sr.survey_field_id = sf.id
LEFT JOIN survey_field_options sfo ON sfo.id = sr.survey_field_option_id
WHERE s.name = :survey_name
ORDER BY s.id DESC

请生成一个 SQL 查询,该查询:

  • 硬编码调查名称。
  • 使用条件聚合进行数据透视,每个问题作为一列。
  • 对复选框问题使用 STRING_AGG 来处理多个响应。
  • 确保按 user_id 分组并按 user_id 排序。
  • 格式化以便阅读,并包含解释逻辑的注释。

Data Explorer 插件的附加指南:

  • 查询应与 Discourse Data Explorer 插件兼容,这意味着它不应以分号结尾。
  • 使用 user_id 等列名来利用 Data Explorer 中的自动链接功能。
  • 避免使用动态 SQL,因为该插件不支持它。
  • 确保查询高效且针对性能进行了优化,因为它可能在大型数据集上运行。
8 个赞

这是一个很棒的小插件,功能异常丰富。感谢您制作它。

@nathank,您关于快速构建结果查询的指南做得非常棒。

4 个赞

我在我的自托管网站上安装了它来试用,确实很不错!

我知道这与讨论的宗旨相悖,但如果能够创建无需登录即可匿名完成的调查,那将非常有帮助。或者至少能够匿名化结果,使其不与特定用户关联。

当然,是的,能够像查看投票一样查看结果,而无需诉诸数据浏览器,那将是极好的。

5 个赞

是的,我也遇到了同样的问题。希望有解决方案。

3 个赞