feat(stats): 新增公开数据页 /stats,入口收敛到页脚
首页底部那张「站点统计」卡片下线,完整数据移到公开只读页 /stats: 今日实时数、概览六格、近 30 天折线与 12 个月柱状、三个占比环、 7×24 时段热力图、提问字数与回答耗时分布。 - 聚合在 internal/db/analytics.go(SUM(CASE WHEN),方言差异收敛在 analyticsDialectFor) - 结果按自然日缓存,跨日重算一次后全站共用;重算失败降级返回上一份快照 - 图表零前端依赖:服务端算坐标的 SVG + CSS grid,禁用 JS 页面仍完整 - 环比取「上月 vs 上上月」:本月未过完,否则每月 1 号会得出 -95% - 入口只在页脚「社区规则」与「找站长」之间;route.Home 不再计算统计 - 补 questions(created_at) 索引;启动后异步预热当天快照 - 测试:analytics 连真库验证软删除不计入、分桶下标、DOW 对齐
This commit is contained in:
@@ -950,4 +950,81 @@ var jaDict = map[string]string{
|
||||
"theme.name.sakura": "さくら",
|
||||
"theme.name.shiroko": "シロコ",
|
||||
"theme.name.new-sakura": "新さくら",
|
||||
|
||||
// サイト統計ページ(/stats):集計値のみ
|
||||
"site.footer.stats": "統計",
|
||||
"stats.title": "サイト統計",
|
||||
"stats.lead": "ここにあるのは集計値だけです。サイト全体にどれだけ質問が届き、どれくらいで回答され、いつ人が来るのか。個々の質問内容・質問者の身元・送信元アドレスは一切表示しません。",
|
||||
"stats.unavailable": "統計データを一時的に取得できません。しばらくしてから再度お試しください。",
|
||||
|
||||
"stats.today.questions": "今日の質問",
|
||||
"stats.today.answers": "今日の回答",
|
||||
"stats.today.tag": "(リアルタイム)",
|
||||
|
||||
"stats.kpi.users": "登録ユーザー",
|
||||
"stats.kpi.questions": "質問の総数",
|
||||
"stats.kpi.answered": "回答済み",
|
||||
"stats.kpi.answerRate": "回答率",
|
||||
"stats.kpi.activeBoxes": "質問を受け取った箱",
|
||||
"stats.kpi.messages": "DM の総数",
|
||||
|
||||
"stats.insight.title": "ひと目でわかる数字",
|
||||
"stats.insight.note": "以下の文はすべて上の数値から直接読み取ったもので、推測は含みません。",
|
||||
"stats.insight.empty": "まだ分析できるほどの質問データがありません。",
|
||||
"stats.insight.daily30": "直近 30 日で %s 件の質問、1 日あたり約 %.1f 件。",
|
||||
"stats.insight.peak": "最も多かった日は %s で %s 件でした。",
|
||||
"stats.insight.busiest": "質問は %s %d 時ごろに集中しています。",
|
||||
"stats.insight.mom": "先月は前月比 %s%%。",
|
||||
"stats.insight.fastReply": "回答済みのうち %s%% が 24 時間以内に回答されています。",
|
||||
"stats.insight.private": "質問の %s%% は非公開が選ばれています。",
|
||||
|
||||
"stats.trend.dailyTitle": "直近 30 日の質問数",
|
||||
"stats.trend.dailyNote": "1 日ごとの質問数です。",
|
||||
"stats.trend.monthlyTitle": "直近 12 か月の質問数",
|
||||
"stats.trend.monthlyNote": "最後の棒は当月で、まだ集計中です。",
|
||||
|
||||
"stats.mix.title": "内訳",
|
||||
"stats.mix.note": "3 つの割合:公開か非公開か、回答済みか、ログイン済みの利用者か。",
|
||||
"stats.mix.public": "公開の質問",
|
||||
"stats.mix.answered": "回答済み",
|
||||
"stats.mix.login": "ログイン利用者の質問",
|
||||
|
||||
"stats.heat.title": "質問が届く時間帯",
|
||||
"stats.heat.note": "直近 %d 日の質問を「曜日 × 時間」で集計。色が濃いほど集中しています。",
|
||||
"stats.heat.less": "少",
|
||||
"stats.heat.more": "多",
|
||||
|
||||
"stats.content.title": "長さと速さ",
|
||||
"stats.content.note": "質問の長さと、回答までの速さ。",
|
||||
"stats.content.lengthTitle": "質問の文字数",
|
||||
"stats.content.replyTitle": "回答までの時間",
|
||||
|
||||
"stats.len.1": "20 文字未満",
|
||||
"stats.len.2": "20–49 文字",
|
||||
"stats.len.3": "50–99 文字",
|
||||
"stats.len.4": "100–199 文字",
|
||||
"stats.len.5": "200–499 文字",
|
||||
"stats.len.6": "500 文字以上",
|
||||
|
||||
"stats.reply.1": "1 時間以内",
|
||||
"stats.reply.2": "1–6 時間",
|
||||
"stats.reply.3": "6–24 時間",
|
||||
"stats.reply.4": "1–3 日",
|
||||
"stats.reply.5": "3–7 日",
|
||||
"stats.reply.6": "7 日以上",
|
||||
|
||||
"stats.wd.1": "月",
|
||||
"stats.wd.2": "火",
|
||||
"stats.wd.3": "水",
|
||||
"stats.wd.4": "木",
|
||||
"stats.wd.5": "金",
|
||||
"stats.wd.6": "土",
|
||||
"stats.wd.7": "日",
|
||||
|
||||
"stats.foot.dataDate": "集計基準日:",
|
||||
"stats.foot.updated": "算出時刻",
|
||||
"stats.foot.prevMonth": "最後の質問:",
|
||||
"stats.foot.prevAnswer": "最後の回答:",
|
||||
"stats.foot.privacy": "数値はすべて集計値です。個々の質問内容・質問者の身元・送信元アドレスは表示しません。",
|
||||
"stats.foot.cacheNote": "累計値とグラフは当日 0 時のスナップショットで、1 日 1 回だけ更新されます。「今日」の 2 項目はリアルタイムです。",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user