尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 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 を設定します。