管理仪表板报告参考指南

:bookmark: 本参考指南旨在说明管理仪表板报告的功能、它们显示的数据、相应的 Data Explorer SQL 查询,以及如何在 Ruby 代码中找到每个报告的位置。

:person_raising_hand: 所需用户级别:Staff(员工)

Discourse 包含多个内置的管理仪表板报告,可用于探索社区统计数据。要访问这些报告,请访问您网站的 discourse.example.com/admin/dashboard/reports(或点击仪表板顶部的 Reports 链接)。请注意,只有 Staff 用户才能访问这些报告。

这些报告包含网站上所有用户的数据(包括访问管理页面等员工活动)。报告中对用户的唯一限制是必须是“真实”用户,用于排除 system 用户。

插件也可以通过 add_report(name, &block) 向仪表板添加报告。

:gem: 大多数报告的 Ruby 模型位于:discourse/app/models/concerns/reports/。部分报告还参考:discourse/app/models/report.rb

:bulb: dashboard-sql 主题包含所有相应的 SQL 查询,可用于生成与 Admin Dashboard 报告完全相同的报告。这些查询可在 Data Explorer 插件中使用,也可用于 通过 Discourse API 运行 Data Explorer 查询

:wrench: 若要隐藏仪表板中的特定报告,请使用 dashboard_hidden_reports 站点设置。

Accepted solutions(已接受的解决方案)

显示每日标记为解决方案的帖子数量。

Ruby 代码:discourse-solved/plugin.rb at main · discourse/discourse-solved · GitHub

SQL 查询:Dashboard Report - Accepted Solutions

Admin Logins(管理员登录)

管理员登录时间及地点列表。

Ruby 代码:discourse/app/models/concerns/reports/staff_logins.rb

SQL 查询:Dashboard Report - Admin Logins

Anonymous(匿名用户)

未登录账户的访客产生的新页面浏览量。

Ruby 代码:discourse/app/models/concerns/reports/consolidated_page_views.rb

SQL 查询:Dashboard Report - Anonymous

Bookmarks(书签)

新书签标记的主题和帖子数量。

Ruby 代码:discourse/app/models/concerns/reports/bookmarks.rb

SQL 查询:Dashboard Report - Bookmarks

Consolidated API Requests(综合 API 请求)

按日期统计的 API 使用情况,同时跟踪常规 API 请求和用户 API 请求。

Ruby 代码:discourse/app/models/concerns/reports/consolidated_api_requests.rb at main · discourse/discourse · GitHub

SQL 查询:Dashboard Report - Consolidated API Requests

Consolidated Pageviews(综合页面浏览量)

已登录用户、匿名用户和爬虫的页面浏览量。这是一份旧报告,已被 Site Traffic 报告取代。

Ruby 代码:discourse/app/models/concerns/reports/consolidated_page_views.rb

SQL 查询:Dashboard Report - Consolidated Pageviews

Consolidated Pageviews with Browser Detection(已弃用)(带浏览器检测的综合页面浏览量)

已登录用户、匿名用户、已知爬虫及其他用户的页面浏览量。此报告已弃用,现委托给 Site Traffic 报告处理。

Ruby 代码:discourse/app/models/concerns/reports/consolidated_page_views_browser_detection.rb

SQL 查询:Dashboard Report - Consolidated Pageviews with Browser Detection

DAU/MAU(日活/月活)

过去一天登录的成员数除以过去一个月登录的成员数,返回一个百分比,反映社区的“粘性”。目标应 >20%。

Ruby 代码:discourse/app/models/concerns/reports/dau_by_mau.rb

SQL 查询:Dashboard Report - DAU/MAU

Daily Engaged Users(每日活跃用户)

过去一天内点赞或发帖的用户数量。

Ruby 代码:discourse/app/models/concerns/reports/daily_engaged_users.rb

SQL 查询:Dashboard Report - Daily Engaged Users

Emails Sent(已发送邮件)

新发送的邮件数量。

Ruby 代码:discourse/app/models/concerns/reports/emails.rb

SQL 查询:Dashboard Report - Emails Sent

Flags(举报)

新举报数量。

Ruby 代码:discourse/app/models/concerns/reports/flags.rb

SQL 查询:Dashboard Report - Flags

Flags Status(举报状态)

举报状态列表,包括举报类型、发帖人、举报人及解决时间。

Ruby 代码:discourse/app/models/concerns/reports/flags_status.rb

SQL 查询:Dashboard Report - Flags Status

Likes(点赞)

新点赞数量。

Ruby 代码:discourse/app/models/concerns/reports/likes.rb

SQL 查询:Dashboard Report - Likes

Logged In(已登录)

来自已登录用户的新页面浏览量。

Ruby 代码:discourse/app/controllers/admin/reports_controller.rb#L5

SQL 查询:Dashboard Report - Logged In

Moderator Activity(版主活动)

版主活动列表,包括审核的举报、阅读时间、创建的主题、创建的帖子、创建的私信以及修订记录。

SQL 查询:Dashboard Report - Moderator Activity

Moderator Warning(版主警告)

版主通过私信发送的警告数量。

Ruby 代码:discourse/app/models/concerns/reports/moderator_warning_private_messages.rb

SQL 查询:Dashboard Report - Moderator Warnings

New Contributors(新贡献者)

在此期间发布第一篇帖子的用户数量。

Ruby 代码:discourse/app/models/concerns/reports/new_contributors.rb

SQL 查询:Dashboard Report - New Contributors

Notify Moderators(通知版主)

版主因举报而收到私信通知的次数。

Ruby 代码:discourse/app/models/concerns/reports/notify_moderators_private_messages.rb

SQL 查询:Dashboard Report - Notify Moderators

Notify User(通知用户)

用户因举报而收到私信通知的次数。

Ruby 代码:discourse/app/models/concerns/reports/notify_user_private_messages.rb

SQL 查询:Dashboard Report - Notify User

Overall Sentiment(整体情感)

在指定时间段内,通过“Sentiment”AI 分类为正面或负面的帖子数量。

Ruby 代码:discourse-ai/lib/sentiment/entry_point.rb at main · discourse/discourse-ai · GitHub

SQL 查询:Dashboard Report - Overall Sentiment

Pageviews(页面浏览量)

所有访客的新页面浏览量。与 Consolidated Pageviews 的总数相同。

Discourse 使用以下查询来确定总页面浏览量:

SQL 查询:Dashboard Report - Consolidated Pageviews

Post Edits(帖子编辑)

新帖子编辑数量。

Ruby 代码:discourse/app/models/concerns/reports/post_edits.rb

SQL 查询:Dashboard Report - Post Edits

Posts(帖子)

选定时间段内创建的新帖子。

Ruby 代码:discourse/app/models/concerns/reports/posts.rb

SQL 查询:Dashboard Report - Posts

Post Emotion(帖子情感)

由 AI 分类为以下情感之一的帖子数量:悲伤、惊讶、恐惧、愤怒、快乐、厌恶 - 按发帖人信任等级分组,统计指定时间段内的数据。

Ruby 代码:discourse-ai/lib/sentiment/entry_point.rb at main · discourse/discourse-ai · GitHub

SQL 查询:Dashboard Report - Post Emotion

Reactions(反应)

最近发生的反应列表。

Ruby 代码:discourse-reactions/plugin.rb at main · discourse/discourse-reactions · GitHub

SQL 查询:Dashboard Report - Reactions

Signups(注册)

本期间的新账户注册数量。

Ruby 代码:discourse/app/models/concerns/reports/signups.rb

SQL 查询:Dashboard Report - Signups

Site Traffic(网站流量)

已登录浏览器、匿名浏览器、爬虫及其他流量的页面浏览量。这是主要的流量报告,取代了旧的 Consolidated Pageviews 报告。

Ruby 代码:discourse/app/models/concerns/reports/site_traffic.rb

SQL 查询:Dashboard Report - Site Traffic

Suspicious Logins(可疑登录)

与以往登录行为显著不同的新登录详情。

Ruby 代码:discourse/app/models/concerns/reports/suspicious_logins.rb

SQL 查询:Dashboard Report - Suspicious Logins

System(系统)

由 System 自动发送的私信数量。

Ruby 代码:discourse/app/models/concerns/reports/system_private_messages.rb

SQL 查询:Dashboard Report - System

Time to first response(首次响应时间)

新主题首次响应的平均时间(小时)。

Ruby 代码:discourse/app/models/concerns/reports/time_to_first_response.rb + discourse/discourse/blob/main/app/models/topic.rb#L1799-L1844

SQL 查询:Dashboard Report - Time to First Response

Top Ignored / Muted Users(被忽略/屏蔽最多的用户)

被许多其他用户屏蔽和/或忽略的用户。

Ruby 代码:discourse/app/models/concerns/reports/top_ignored_users.rb

SQL 查询:Dashboard Report - Top Ignored / Muted Users

Top Referred Topics(被引用最多的主题)

从外部来源获得最多点击的主题。

Ruby 代码:discourse/app/models/concerns/reports/top_referred_topics.rb

SQL 查询:Dashboard Report - Top Referred Topics

Top Referrers(顶级引流用户)

按他们分享链接的点击数排列的用户列表。

Ruby 代码:discourse/app/models/concerns/reports/top_referrers.rb

SQL 查询:Dashboard Report - Top Referrers

Top Traffic Sources(顶级流量来源)

链接到本站最多的外部来源。

Ruby 代码:discourse/app/models/concerns/reports/top_traffic_sources.rb

SQL 查询:Dashboard Report - Top Traffic Sources

Top Uploads(顶级上传)

按扩展名、文件大小和作者列出的所有上传文件。

Ruby 代码:discourse/app/models/concerns/reports/top_uploads.rb

SQL 查询:Dashboard Report - Top Uploads

Top Users by likes received(按收到的点赞数排名的顶级用户)

收到点赞最多的前 10 名用户。

Ruby 代码:discourse/app/models/concerns/reports/top_users_by_likes_received.rb

SQL 查询:Dashboard Report - Top Users by Likes Received

Top Users by likes received from a user with a lower trust level(按来自低信任等级用户的点赞数排名的顶级用户)

信任等级较高的用户中,被信任等级较低的用户点赞的前 10 名用户。

Ruby 代码:discourse/app/models/concerns/reports/top_users_by_likes_received_from_inferior_trust_level.rb

SQL 查询:Dashboard Report - Top Users by Likes Received from a User with a Lower Trust Level

Top Users by likes received from a variety of people(按来自各类用户的点赞数排名的顶级用户)

收到来自广泛人群点赞的前 10 名用户。

Ruby 代码:discourse/app/models/concerns/reports/top_users_by_likes_received_from_a_variety_of_people.rb

SQL 查询:Dashboard Report - Top Users by Likes Received From a Variety of People

Topics(主题)

本期间创建的新主题。

Ruby 代码:discourse/app/models/concerns/reports/topics.rb

SQL 查询:Dashboard Report - Topics

Topics with no response(无响应的主题)

创建后未收到响应的新主题数量。

Ruby 代码:discourse/app/models/concerns/reports/topics_with_no_response.rb

SQL 查询:Dashboard Report - Topics with No Response

Topic View Stats(主题浏览统计)

浏览量最高的前 100 个主题,包含匿名用户和已登录用户的细分数据,可按类别筛选。

Ruby 代码:discourse/app/models/concerns/reports/topic_view_stats.rb

SQL 查询:Dashboard Report - Topic View Stats

Trending Search Terms(热门搜索词)

最受欢迎的搜索词及其点击率。

Ruby 代码:discourse/app/models/concerns/reports/trending_search.rb

SQL 查询:Dashboard Report - Trending Search Terms

Trust Level growth(信任等级增长)

本期间提升信任等级的用户数量。

Trust Level Growth 报告从 Discourse 数据库中的 user_histories 表提取数据。具体来说,该报告统计 user_histories.action 记录中用户信任等级提升的次数。

Ruby 代码:discourse/app/models/concerns/reports/trust_level_growth.rb

SQL 查询:Dashboard Report - Trust Level Growth

Unaccepted policies(未接受的政策)

此仪表板报告识别出某些用户尚未接受政策的主题。

Ruby 代码:discourse-policy/plugin.rb at main · discourse/discourse-policy · GitHub

SQL 查询:Dashboard Report - Unaccepted Policies

User Flagging Ratio(用户举报比率)

按员工对其举报的响应比率(不同意与同意之比)排序的用户列表。

Ruby 代码:discourse/app/models/concerns/reports/user_flagging_ratio.rb

SQL 查询:Dashboard Report - User Flagging Ratio

User notes(用户备注)

最近的用户备注列表。

Ruby 代码:discourse-user-notes/plugin.rb at main · discourse/discourse-user-notes · GitHub

SQL 查询:Dashboard Report - User Notes

User Profile Views(用户个人资料浏览)

用户个人资料的新增浏览次数总数。

Ruby 代码:discourse/app/models/concerns/reports/profile_views.rb

SQL 查询:Dashboard Report - User Profile Views

User Visits(用户访问)

选定时间段(今天、昨天、过去 7 天等)内论坛中已登录用户的总访问次数。

每当唯一的已登录用户访问网站时,即计为一次用户访问,每天最多计一次。例如,如果用户在一周内每天都访问网站,Discourse 将计为 7 次用户访问。

Ruby 代码:discourse/app/models/concerns/reports/visits.rb

SQL 查询:Dashboard Report - User Visits

User Visits (mobile)(用户访问(移动端))

使用移动设备访问的独立已登录用户数量。

Ruby 代码:discourse/app/models/concerns/reports/mobile_visits.rb

SQL 查询:Dashboard Report - User Visits

User-to-User (excluding replies)(用户间交流(不含回复))

新发起的私信数量。

Ruby 代码:discourse/app/models/concerns/reports/user_to_user_private_messages.rb

SQL 查询:Dashboard Report - User-to-User

User-to-User (with replies)(用户间交流(含回复))

所有新私信和回复的数量。

Ruby 代码:discourse/app/models/concerns/reports/user_to_user_private_messages_with_replies.rb

SQL 查询:Dashboard Report - User-to-User

Users per Trust Level(按信任等级划分的用户)

按信任等级分组的用户数量。

Ruby 代码:discourse/app/models/concerns/reports/users_by_trust_level.rb

SQL 查询:Dashboard Report - Users Per Trust Level

Users per Type(按类型划分的用户)

按管理员、版主、暂停、禁言分组的用户数量。

Ruby 代码:discourse/app/models/concerns/reports/users_by_type.rb

SQL 查询:Dashboard Report - Users Per Type

Web Crawler Pageviews(网络爬虫页面浏览量)

随时间变化的网络爬虫总页面浏览量。

Ruby 代码:discourse/app/models/report.rb

SQL 查询:Dashboard Report - Web Crawler Pageviews

Web Crawler User Agents(网络爬虫用户代理)

按页面浏览量排序的网络爬虫用户代理列表。

Ruby 代码:discourse/app/models/concerns/reports/web_crawlers.rb

SQL 查询:Dashboard Report - Web Crawler User Agents

17 个赞

我在 /admin 上看不到此链接。是我没看懂吗?这似乎应该更容易找到。我想我以前知道这些报告在这里,但找了却找不到。

虽然我只花了几分钟就找到了,但也许可以添加类似以下的内容:

3 个赞

是的,在网站首次创建时,通过私信告知员工可能会更好。:thinking:

1 个赞

:crying_cat_face:

抱歉。我确实认为以前在哪里见过。

你就是无法让人们阅读东西……但我可以阅读源代码来找出如何在插件中做到这一点?

但也许将上面的内容更新为

我想这可能才是真正让我困惑的地方。(但没有,我没有借口。)

我已将主题设为 wiki,请随意编辑! :+1:

2 个赞

这与 UI 不符(UI 使用的是 20%),应该以哪个为准?

2 个赞

抓得好。最近已更新至 20%。我将在 OP 中进行更改。:slight_smile: :+1:

2 个赞

你好 @SaraDev 这个报告的输出可以用 SQL 查询获得吗?可以分享一下吗?
谢谢

1 个赞

是的,您可以使用以下 SQL 报告来获取热门流量来源:

-- [params]
-- date :start_date = 01/05/2023
-- date :end_date = 03/06/2023

WITH count_links AS (

SELECT COUNT(*) AS clicks,
       ind.name AS domain
FROM incoming_links il
  INNER JOIN posts p ON p.deleted_at ISNULL AND p.id = il.post_id
  INNER JOIN topics t ON t.deleted_at ISNULL AND t.id = p.topic_id
  INNER JOIN incoming_referers ir ON ir.id = il.incoming_referer_id
  INNER JOIN incoming_domains ind ON ind.id = ir.incoming_domain_id
WHERE t.archetype = 'regular'
  AND il.created_at::date BETWEEN :start_date AND :end_date
GROUP BY ind.name
ORDER BY clicks DESC
),

count_topics AS (

SELECT COUNT(DISTINCT p.topic_id) AS topics,
       ind.name AS domain
FROM incoming_links il
INNER JOIN posts p ON p.deleted_at ISNULL AND p.id = il.post_id
INNER JOIN topics t ON t.deleted_at ISNULL AND t.id = p.topic_id
INNER JOIN incoming_referers ir ON ir.id = il.incoming_referer_id
INNER JOIN incoming_domains ind ON ind.id = ir.incoming_domain_id
WHERE t.archetype = 'regular'
  AND il.created_at > (CURRENT_TIMESTAMP - INTERVAL '30 DAYS')
GROUP BY ind.name
)

SELECT cl.domain,
       cl.clicks AS "Clicks",
       ct.topics AS "Topics"
FROM count_links cl
JOIN count_topics ct ON cl.domain = ct.domain
LIMIT 10

在此查询中,请注意日期参数接受的格式为 日/月/年

1 个赞

您好 @SaraDev,感谢您分享此查询。
关于此报表以及 incoming_links 表,有一个更普遍的问题——它是否只代表帖子页面的流量,而不是论坛所有页面的流量?

背景:我正在寻找分析论坛整体流量趋势,并希望从热门流量来源报表中获得按来源划分的整体流量。
但是,虽然上个月的整体流量约为 272K(用户和匿名用户),但同一时间范围内的流量来源报表中的总点击次数仅为 59K。
此外,我看到您使用了与 topics 和 posts 表的内连接,这意味着如果点击没有附加 post_id,您就不会计算它。

您能否确认我的结论,并或许解释一下 incoming_links 表背后的逻辑?

您好 @SaraDev 我运行了这个查询,结果与“常规”选项卡中的“帖子”报告不完全匹配。
例如,11月30日:
查询 = 112 篇帖子
报告 = 120 篇帖子
您能检查一下这个差距吗?
谢谢

1 个赞

Just an FYI @Yotam_Hagay - even though Sara’s the OP, the guide is the responsibility of everyone :slight_smile: :discourse: There’s no need for an @mention on each post. :slight_smile:

2 个赞

感谢 @JammyDodger 的澄清。

还有其他人我可以标记或求助以获得答案吗?

1 个赞

此查询结果与“首次响应时间”报告略有不同:
例如,在 11 月 8 日:
查询:93 小时
报告:116 小时
有人能给些建议吗?

1 个赞

我认为其中一些可能需要一些时间来研究。我正在自己研究一下,看看是否能找出问题所在(尽管我的 SQL 技能和 Ruby 技能之间差距很大 :slight_smile:)。

但请继续提供您的发现,因为能够巩固所有这些信息将非常有帮助。 :+1:

2 个赞

对于帖子,我认为库存报告也计算了主题帖子以及来自系统用户的帖子,但只针对 post_type 为 1 的帖子(即,不是低语、小型操作帖子或版主操作)。

我认为 SQL 会更像这样:

--[params]
-- date :start_date
-- date :end_date

SELECT 
    p.created_at::date AS "Day",
    COUNT(p.id) AS "Count"
FROM posts p
INNER JOIN topics t ON t.id = p.topic_id AND t.deleted_at ISNULL
WHERE p.created_at::date BETWEEN :start_date AND :end_date
    AND p.deleted_at ISNULL
    AND t.archetype = 'regular'
    AND p.post_type = 1
GROUP BY p.created_at::date
ORDER BY 1

您能否在您的网站上运行它,看看是否匹配?

2 个赞

谢谢 Jammy,我会查看!
我目前正在进行首次响应时间分析,如果您能帮我看看这个,我将不胜感激。

1 个赞

在查看 SQL 版本时,我认为它缺少 AND p.user_id <> t.user_id 来排除 OP 的回复。如果我添加它,它将给出 OP 和其他人首次回复之间准确的时间:

--[params]
-- date :date_start
-- date :date_end

WITH first_reply AS (
    SELECT
        p.topic_id,
        MIN(post_number) post_number,
        t.created_at
    FROM posts p
    INNER JOIN topics t ON (p.topic_id = t.id)
    WHERE p.deleted_at IS NULL
        AND p.user_id <> t.user_id
        AND p.post_number != 1
        AND p.post_type = 1
        AND p.user_id > 0
        AND t.user_id > 0
        AND t.deleted_at IS NULL
        AND t.archetype = 'regular'
        AND t.created_at::date BETWEEN :date_start AND :date_end
    GROUP BY p.topic_id, t.created_at
    ORDER BY 2 DESC
)

SELECT
    p.topic_id,
    fr.created_at::date dt_topic_created,
    (p.created_at - fr.created_at) response_time
FROM posts p
INNER JOIN first_reply fr
    ON fr.topic_id = p.topic_id
    AND fr.post_number = p.post_number
    AND p.created_at > fr.created_at
ORDER BY response_time

我还认为股票报告是以小数而不是 SQL 中的小时和分钟显示的。我将再次尝试使其匹配。:+1:


只是一个小更新,包含 AVG,使其更类似于股票报告的输出:

--[params]
-- date :date_start
-- date :date_end

WITH first_reply AS (
    SELECT
        p.topic_id,
        MIN(post_number) post_number,
        t.created_at
    FROM posts p
    INNER JOIN topics t ON p.topic_id = t.id
    WHERE p.deleted_at IS NULL
        AND p.user_id <> t.user_id
        AND p.post_type = 1
        AND p.user_id > 0
        AND t.user_id > 0
        AND t.deleted_at IS NULL
        AND t.archetype = 'regular'
        AND t.created_at::date BETWEEN :date_start AND :date_end
    GROUP BY p.topic_id, t.created_at
)

SELECT
    fr.created_at::date dt_topic_created,
    AVG(p.created_at - fr.created_at) response_time
FROM posts p
INNER JOIN first_reply fr
    ON fr.topic_id = p.topic_id
    AND fr.post_number = p.post_number
    AND p.created_at > fr.created_at
GROUP BY fr.created_at::date
ORDER BY response_time

这似乎与股票报告相符,只要考虑到一个是以小数显示的,而另一个是以 HH:MM 显示的。我相信有一种方法可以将 SQL 的 response_time 转换为小数,但 HH:MM 似乎是一种更直观的显示方式。(我认为其中还包含一些可能不必要的额外条件,但也可能是一种防止异常情况的安全措施,所以我最终将这些部分保留原样,直到我可以确定一件事或另一件事 :slight_smile:

你能运行这个并看看它如何匹配吗?

4 个赞

是的,现在与股票报告中显示的数字相加了,谢谢!
只是有一个评论 -
我发现下面的 AVG 函数在时间 > 24 小时时会返回缺失的结果(我猜缺少了一个 # 天部分)。

AVG(p.created_at - fr.created_at)::time response_time

1 个赞

是的,强制转换为 time 是个糟糕的选择。:slight_smile: 如果删除 ::time,它将恢复为更准确(但更难看)的版本。

我也会编辑上面的内容。:+1:

2 个赞