Mirobody
The canonical registry of human health — roughly two thousand standardized indicators, clinical and lifestyle, resolved into one language.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗予算と希望の治療を4ステップで選ぶと、条件に合う歯科医院を最大3件表示するフォームです。 Supabase が未設定でもサンプルデータ(架空の8医院)で動きます。
1〜3は選んだ瞬間に次へ進みます。カテゴリを変えると後続の回答はリセットされます。
| パス | 役割 |
|---|---|
app/diagnosis/page.tsx | 診断ページ(SEO用の title / description 付き) |
components/DiagnosisForm.tsx | ステップフォームと結果表示(クライアントコンポーネント) |
app/api/diagnosis/route.ts | 回答の検証 → 医院取得 → スコアリング → リード保存 |
lib/matching.ts | 条件の一致度で並べるスコアリング |
lib/options.ts | 選択肢と文言のマスタ(予算帯はここで調整) |
lib/types.ts | 型定義 |
lib/sample-clinics.ts | サンプル医院データ |
lib/supabase.ts | サーバー用 Supabase クライアント |
supabase/schema.sql | テーブル定義(clinics / clinic_treatments / diagnosis_leads)と RLS |
supabase/seed.sql | サンプル医院の投入SQL(scripts/generate-seed.ts で生成) |
口コミ評価・掲載料は使いません(医療広告ガイドラインの比較優良広告を避けるため)。
予算内の医院を先に、その中でスコア順に並べます。予算を超える医院は「予算オーバー」と表示します。
npx create-next-app@latest dental-diagnosis --ts --tailwind --app --import-alias "@/*"
cd dental-diagnosis
npm i @supabase/supabase-js
# このフォルダの app/ components/ lib/ supabase/ scripts/ をプロジェクト直下にコピー
npm run dev # http://localhost:3000/diagnosis
Supabase につなぐ場合:
supabase/schema.sql → supabase/seed.sql の順に実行.env.example を .env.local にコピーして URL と service_role キーを設定(Vercel の環境変数にも同じものを登録)service_role キーは API Route(サーバー)でだけ使い、ブラウザには出しません。diagnosis_leads は RLS で匿名アクセスを拒否しています。
tsc の型チェックと next build が通ることを確認済み(Next.js 15 / React 19 / TypeScript 5)医院データの収集、記事生成、メルマガ、PR枠(Stripe)は ROUTINES.md を参照してください。
来院前に「誰が診てくれるか」を選び、写真とお悩みだけで概算を聞ける仕組みです。医院には相談1件ごとに定額で請求します。
患者さんの流れ(/consult):お悩み(歯並びのイラスト)→ 総額の目安 → 先生を選ぶ(最大3院)→ 写真と相談内容(任意)→ 連絡先と同意 → 送信。診断結果・医院ページ・トップから入れます。
医院の流れ:
/for-clinics の「オンライン相談の受付」から申し込む(clinic_partners に pending で保存、運営に通知)doctors に登録(is_published = true)、clinic_partners.status = 'active' と clinic_id を設定/clinic/reply/…、30日有効)から概算とひとことを返信。表現チェックに引っかかる文言は送れない/api/cron/cleanup が1年を過ぎた相談の写真を消す(相談の受付は無料で、医院への請求はしない)| ファイル | 役割 |
|---|---|
supabase/004_consultations.sql | clinic_partners / doctors / consultations / consultation_requests、写真用の非公開バケット |
lib/consult.ts | お悩みの種類、候補の治療、費用の目安の計算 |
lib/consult-data.ts | 相談を受け付けている医院と担当医(未接続時は架空のサンプル) |
lib/consult-mail.ts | 医院への通知・患者さんへのメール、返信トークン |
components/ConsultForm.tsx, app/consult/page.tsx | 相談フォーム |
app/api/consult/* | 受付・写真アップロード先・医院の返信・予約リンク |
app/clinic/reply/[token]/page.tsx | 医院の返信画面(検索除外) |
app/api/cron/cleanup/route.ts | 1年を過ぎた相談写真の削除 |
app/privacy/page.tsx | プライバシーポリシーのひな形(公開前に要確認) |
法令まわりで決めていること(公開前に弁護士の確認を推奨):
セットアップは 004_consultations.sql を 003 の後に実行し、.env に ADMIN_EMAIL を追加します。相談の受付は医院・患者とも無料です(相談1件ごとの課金は療担規則の紹介料にあたるおそれがあるため廃止)。
NEXT_PUBLIC_DEMO_MODE=true を「設定」(非公開ではない値)として登録する。ビルド時に埋め込まれるので、変えたら再デプロイが必要schema.sql → 002 → 003 → 004 → 005_demo.sql を実行し、NEXT_PUBLIC_SUPABASE_URL と SUPABASE_SERVICE_ROLE_KEY(こちらは「秘密」)を登録して再デプロイするmain に push すると本番に自動で公開されます。
本番(NEXT_PUBLIC_DEMO_MODE を外した状態)では、架空のサンプルではなく実在の医院を出します。
lib/real-clinics.ts に、2026-10-26 に各医院の公式サイトの料金ページで確認した医院名・所在地・料金・出典URLを入れています。Supabase につなぐ前はこのファイルを表示し、つないだ後は supabase/007_real_clinics.sql で同じ内容が入りますLIVE_CATEGORIES)。インプラント・自費クリーニングは医院データがそろってから出しますprice_note)NEXT_PUBLIC_CONSULT_ENABLED)。提携医院がいないのに、実在の医院が相談を受け付けているように見えるのを避けるためNEXT_PUBLIC_SITE_LAUNCHED=true にするまで全ページ noindex、robots.txt もクロール禁止です。URL を知っている人だけが見られます一般公開するときの手順:
schema.sql → 002 → 003 → 004 → 005_demo.sql → 006_legal.sql → 007_real_clinics.sql を実行し、Vercel に NEXT_PUBLIC_SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY を登録(医院からの掲載停止の依頼を受けるのに必須)GOOGLE_MAPS_API_KEY・ANTHROPIC_API_KEY・CRON_SECRET・ADMIN_EMAIL・RESEND_API_KEY を登録NEXT_PUBLIC_DEMO_MODE を削除(または false)して再デプロイ → 実在の医院が表示される。この時点ではまだ検索に出ないNEXT_PUBLIC_SITE_LAUNCHED=true にして再デプロイ → 検索エンジンに公開supabase/006_legal.sql を 005 の後に実行してください。
/for-clinics/request(情報修正・掲載停止の依頼)を用意。掲載停止は受付と同時に非公開にし、ADMIN_EMAIL に通知/community:施術ごとに「公式サイトの価格」と「みんなが実際に払った総額」(記録3件以上で表示)を並べ、匿名の体験記録を出します。/community/questions:お手入れ・費用・選び方の質問に、経験者と歯科衛生士・歯科医師が答えます。/admin/community で確認します。/admin/community(ADMIN_KEY で入る):確認待ちの投稿を公開・非公開にし、専門家として回答します。新しい質問は ADMIN_EMAIL に届きます。supabase/008_community.sql を実行し、ADMIN_KEY・EXPERT_NAME・IP_HASH_SALT を設定します。