管理员仪表盘报告参考指南

:bookmark: 本指南旨在说明管理员仪表板报告的功能、其显示的数据、对应的数据浏览器 SQL 查询,以及每个报告的 Ruby 代码位置。

:person_raising_hand: 所需用户权限:Staff(工作人员)

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

这些报告包含站点上所有用户的数据(包括 Staff 的活动,如访问管理页面)。报告中对用户设定的唯一条件是他们是“真实”用户,这用于将 system 用户排除在报告之外。

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

:gem: 大多数报告的 Ruby 模型位于:discourse/app/models/concerns/reports/。一些报告还引用了:discourse/app/models/report.rb

:bulb: dashboard-sql 主题包含了所有可用于生成与管理员仪表板报告相同的报告的相应 SQL 查询。这些查询可用于 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

综合 API 请求 (Consolidated API Requests)

按日期划分的 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 (Deprecated))

已登录用户、匿名用户、已知爬虫和其他的页面浏览量。此报告已弃用,现在委托给 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 代码:https://github.com/discourse/discourse-ai/blob/main/lib/sentiment/entry_point.rb

SQL 查询:Dashboard Report - Overall Sentiment

页面浏览量 (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 代码:https://github.com/discourse/discourse-ai/blob/main/lib/sentiment/entry_point.rb

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)

已登录浏览器、匿名浏览器、爬虫和其他流量的页面浏览量。这是主要的流量报告,取代了遗留的综合页面浏览量报告。

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)

由系统自动发送的私信数量。

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)

在此期间提高信任级别的用户数量。

信任级别增长报告从 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)

按 Staff 对其标记的响应比率(从不同意到同意)排序的用户列表。

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

18 个赞

我在 /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 个赞