Skip to content

Repository files navigation

ONORE ANALYTICS

Next.js + TypeScript 製の、ゲーム「己鯖」用の武将データベースツールです。 戦闘履歴を貼り付けるだけで攻撃側・防衛側の武将のタイプ・兵種名・兵種タイプを共有データベース(PostgreSQL)に登録し、偵察した武将名リストから即座に検索できます。武将名・兵種名はクリックで詳細ページ(戦績・勝率・対戦ログ)に展開できます。

機能

  • 戦闘履歴タブ: タブ区切りの戦闘履歴を貼り付けて「登録する」で両陣営の武将を一括登録(Cmd/Ctrl + Enter でも登録可)。並び替え(新しい順 / 古い順)・国での絞り込み・キーワード検索(一致部分をハイライト表示)に対応。登録に成功すると入力欄は自動でクリアされます
  • 偵察検索タブ: スペース / 改行 / カンマ区切りで武将名を貼り付けてタイプ・兵種名・兵種タイプを即座に表示。登録済 / 未登録の件数サマリーと入力クリアボタンを備え、国へ報告するための「名前[タイプ|兵種名]」形式のテキスト(件数つき)も生成・コピーできます。表の「結果をコピー」は見出し行と国を含む TSV で出力します
  • ホームタブ: 自分の武将(このブラウザに記憶)の成績サマリ、年別の勝敗数と通算勝率の推移、ウォッチリスト(お気に入り武将)を表示
  • 被弾表タブ: 登録済みデータから各武将の行動状況(未行動 / 行動可 / 行動済み / 兵力減)を集計表示。守備敗北から40分未満は兵力減、40分経過後は行動可として扱い、壁戦も勝敗にかかわらず出兵として判定します。武将名での絞り込みと時刻の自動更新にも対応します
  • ランキングタブ: 武将・兵種・武器・品物ごとの PPN / PontaPoint / 勝率 / 抜き数 / 抜き率を表示。武将ランキングでは出兵勝率・守備勝率・撃破効率・守備効率・アシスト数も確認できます。各指標は TOP3 から詳細ランキングへ展開でき、集計期間・名前・最低使用回数で絞り込めます
  • メタ分析タブ: 特性どうしの相性表・環境(採用率)ダッシュボード・装備シナジー
  • 国タブ: 勢力ごとの戦績・所属武将・現在の主力兵種を一覧/詳細表示
  • DB確認タブ: 登録済み武将の一覧 / 名前や国・タイプ・兵種タイプ・兵種名で絞り込み。列ヘッダー(国・武将名・タイプ・兵種タイプ・兵種名・行動時間・更新日時)で並び替え、結果を TSV でコピー可能
  • 兵種図鑑タブ: 兵種マスタ(攻撃・防御・コスト・特殊攻撃など)の閲覧・追加・編集
  • 武器図鑑タブ: 戦闘履歴の武将の持つ武器から使用回数・勝率・主な使用武将を集計表示
  • 品物図鑑タブ: 戦闘履歴の武将の持つ品物から使用回数・勝率・主な使用武将を集計表示
  • 管理Wikiタブ: 管理者向けの運用手順・判断基準を複数ページのMarkdownで作成・編集。「都市の計算式」を初期ページとして用意し、編集 / プレビュー / 分割表示、タイトル検索、未保存変更の警告、同時更新の競合検知、Cmd/Ctrl + S での保存に対応。閲覧を含む全操作を管理者だけに限定
  • 環境設定タブ: 画面テーマ(自動 / ライト / ダーク)と、勢力ごとの表示色(共有DBに保存)を設定。管理者はデータ整理(ずれデータの掃除・国単位の削除)や過去ログ記録モードも利用できます
  • 武将ページ / 兵種ページ: 一覧や戦闘カード内の武将名・兵種名をクリックすると、戦闘数・勝率・対戦ログを表示する詳細ページへ。相互リンクと「戻る」スタックで自然に行き来できます
  • 共有リンク / DB更新: 表示中のタブ・詳細ページは URL に反映され、ヘッダーや詳細ページの「共有 / リンクをコピー」ボタン、再読込でそのまま復元できます。ロゴ(ONORE ANALYTICS)クリックでホームへ戻り、ヘッダーの「更新」ボタンで共有DBを手動再取得できます
  • スマホ / PWA 対応: 狭い画面では表をカード表示に切り替え、ノッチ端末(safe-area)にも対応。Web App Manifest を提供し、ホーム画面へ追加してスタンドアロン起動できます
  • アクセシビリティ: 本文へのスキップリンク、キーボードフォーカスの可視化、エラー通知の読み上げ(assertive)、長い一覧では「先頭へ戻る」ボタンを表示
  • 管理者ログイン: データの登録・編集は管理者のみが行えます(ヘッダーの「ログイン」から /login へ)。未ログインでも ホーム・戦闘履歴・ランキング(指標を含む)・メタ分析・各種図鑑(兵種 / 武器 / 品物)・国 は閲覧できます。武将ページの一言コメント欄はログイン中のみ表示されます

武将DB・戦闘履歴・国カラー設定・管理Wikiはサーバー(Prisma + PostgreSQL)に保存され、複数の端末・ブラウザで共有されます。

ローカルで動かす

データベースに PostgreSQL を使用します。接続先を環境変数 DATABASE_URL で指定してください。

  1. 依存パッケージをインストール

    npm install
  2. プロジェクト直下に .env を作成し、接続文字列を設定(雛形 .env.example をコピーすると簡単です)

    cp .env.example .env
    # .env を開いて DATABASE_URL を実際の接続文字列に書き換える
    DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/DBNAME"
    # 管理者ログイン用のセッション署名鍵(本番では必須・ランダムな長い文字列)
    AUTH_SECRET="(ランダムな長い文字列)"
  3. マイグレーションを適用し、兵種マスタの初期データを投入

    npx prisma migrate deploy   # スキーマをDBへ反映
    npx prisma db seed          # 兵種マスタ(seed-unit-types.tsv)を投入
  4. 管理者ユーザーを作成(ログインできるのは管理者のみ)

    npm run create-admin -- <ユーザー名> <パスワード>
  5. 開発サーバーを起動

    npm run dev

ブラウザで http://localhost:3000 を開いてください。

Prisma の設定は prisma.config.ts に集約しています(.env は同ファイル内の dotenv で読み込まれます)。

Vercel にデプロイ

  1. このリポジトリを GitHub にプッシュ
  2. Vercel の "New Project" でリポジトリを Import
  3. Framework Preset は自動で Next.js が選択されます
  4. 環境変数 DATABASE_URL(本番 PostgreSQL の接続文字列)と AUTH_SECRET(管理者ログイン用のセッション署名鍵。ランダムな長い文字列)、NEXT_PUBLIC_SITE_URL(公開ドメインの URL。https://... 形式)を設定
  5. Vercel の Domains 設定で、公開ドメインを onore-analytics 側に揃える
  6. Deploy(ビルド時に prisma generate && next build が実行されます)

マイグレーションはビルド時には実行しません。 Vercel のビルド環境からの直接DB接続に依存させず、デプロイを安定させるためです(Prisma Postgres の場合、Vercel 側の DATABASE_URL は Accelerate 経由のプール用URLになりがちで、prisma migrate deploy には直接接続URLが必要です)。

スキーマを変更したときは、直接接続できる DATABASE_URL を設定したローカル等から本番DBに対して次を実行してください。

npm run db:migrate   # = prisma migrate deploy
npx prisma db seed   # 初回のみ:兵種マスタを投入
npm run create-admin -- <ユーザー名> <パスワード>   # 初回のみ:管理者ユーザーを作成

戦闘履歴のフォーマット

タブ区切りで以下の構造を想定しています:

【N戦目】<TAB>年月<TAB>時刻<TAB>都市<TAB>勢力名<TAB>武将名<TAB>家名<TAB>タイプ<TAB>兵種名<TAB>兵種<TAB>武将の持つ品物<TAB>武将の持つ武器<TAB>V.S.<TAB>勢力名<TAB>武将名<TAB>家名<TAB>タイプ<TAB>兵種名<TAB>兵種<TAB>武将の持つ品物<TAB>武将の持つ武器<TAB>勝敗<TAB>ターン数
  • タイプ例: 武特 統特 知特 武統 統知 知武 政治家
  • 兵種例: 騎兵 歩兵 弓兵 万能 妖怪

タブが含まれない場合は 2 文字以上の連続空白でもフォールバック分割します。

データ構成と API

データは Next.js の API ルート経由で PostgreSQL に読み書きします(クライアントから直接DBへはアクセスしません)。

  • GET /api/state — 武将DBと戦闘履歴を取得
  • POST /api/state — 解析済みの武将・戦闘履歴を登録(戦闘履歴は重複排除キーで自動重複除外)
  • GET/POST/PUT /api/unit-types — 兵種マスタの取得・追加/更新・一括インポート
  • DELETE /api/unit-types/[name] — 兵種を削除
  • POST /api/warlord-stats — 能力値ランキングの取り込み
  • GET/PUT /api/faction-colors — 国カラー設定の取得・保存(全ユーザー共有)
  • DELETE /api/battle-records/[id] / POST /api/battle-records/bulk-delete — 戦闘履歴の個別・一括削除
  • DELETE /api/battle-records/by-faction/[faction] / DELETE /api/battle-records/cleanup-skewed — 国単位の削除・ずれデータの整理
  • GET/POST /api/wiki-pages / GET/PUT/DELETE /api/wiki-pages/[id] — 管理Wikiの一覧・作成・閲覧・更新・削除(すべて管理者専用)
  • POST /api/auth/login / POST /api/auth/logout / GET /api/auth/me — 管理者のログイン・ログアウト・ログイン状態の確認

データを変更する API(POST /api/statePOST /api/unit-typesDELETE /api/unit-types/[name]POST /api/warlord-stats)は管理者のみが実行できます(未ログインは 401)。通常の閲覧用 GET は公開していますが、管理Wikiは内容自体が管理者向けのため、GET を含む全APIを認証必須にしています。

主なテーブル(prisma/schema.prisma):

  • Warlord — 武将(名前・勢力・タイプ・兵種タイプ・兵種名・行動履歴など)
  • BattleRecord — 戦闘履歴(line が重複排除キー、raw が表示・再解析用の元テキスト)
  • UnitType — 兵種マスタ(攻撃・防御・コスト・特殊攻撃など)
  • WikiPage — 管理者Wiki(タイトル・Markdown本文・作成日時・更新日時)
  • User — 管理者ユーザー(ユーザー名・パスワードハッシュ)。npm run create-admin で作成

技術スタック

  • Next.js 14 (App Router)
  • React 18
  • TypeScript 5
  • Prisma 6 / PostgreSQL
  • react-markdown / remark-gfm(管理Wikiの安全なMarkdownプレビュー)
  • turndown(戦闘ログ HTML の Markdown 変換)
  • dotenv・tsx(Prisma 設定・シード実行用)
  • 認証は Node 標準の node:crypto(scrypt によるパスワードハッシュ・HMAC 署名付きセッション Cookie)で実装(追加ライブラリなし)

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages