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 で指定してください。
-
依存パッケージをインストール
npm install
-
プロジェクト直下に
.envを作成し、接続文字列を設定(雛形.env.exampleをコピーすると簡単です)cp .env.example .env # .env を開いて DATABASE_URL を実際の接続文字列に書き換える DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/DBNAME" # 管理者ログイン用のセッション署名鍵(本番では必須・ランダムな長い文字列) AUTH_SECRET="(ランダムな長い文字列)"
-
マイグレーションを適用し、兵種マスタの初期データを投入
npx prisma migrate deploy # スキーマをDBへ反映 npx prisma db seed # 兵種マスタ(seed-unit-types.tsv)を投入
-
管理者ユーザーを作成(ログインできるのは管理者のみ)
npm run create-admin -- <ユーザー名> <パスワード>
-
開発サーバーを起動
npm run dev
ブラウザで http://localhost:3000 を開いてください。
Prisma の設定は
prisma.config.tsに集約しています(.envは同ファイル内のdotenvで読み込まれます)。
- このリポジトリを GitHub にプッシュ
- Vercel の "New Project" でリポジトリを Import
- Framework Preset は自動で Next.js が選択されます
- 環境変数
DATABASE_URL(本番 PostgreSQL の接続文字列)とAUTH_SECRET(管理者ログイン用のセッション署名鍵。ランダムな長い文字列)、NEXT_PUBLIC_SITE_URL(公開ドメインの URL。https://...形式)を設定 - Vercel の Domains 設定で、公開ドメインを
onore-analytics側に揃える - 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 文字以上の連続空白でもフォールバック分割します。
データは 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/state、POST /api/unit-types、DELETE /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)で実装(追加ライブラリなし)