日本語でSQLを学習するためのWebアプリケーションです。ブラウザ内でSQL実行、クイズ、ゲーム機能を提供し、OpenAI統合によるSQL学習支援を行います。
- SQL学習システム: ブラウザ内でのリアルタイムSQL実行(AlaSQL使用)
- 階層的問題構成: ジャンル → サブジャンル → レベルの3階層での問題管理
- 2種類の問題タイプ:
- 実行問題(従来のSQL作成・実行)
- 分析問題(コード分析・理論学習)
- AI学習支援: OpenAI APIを活用したSQL解説とヒント機能
- AI問題生成: 管理者向けのAI自動問題生成機能
- 進捗追跡: ユーザーの学習進捗をデータベースで永続化
- クイズシステム: ランダム問題出題機能
- ランダム出題ページ:
/sql/randomにアクセスすると、ランダムに1問が出題されます(リフレッシュで別問を表示)。実装方針はtmp/sql-random-plan.mdを参照してください。
- ランダム出題ページ:
- じゃんけんゲーム: 認証が必要なゲーム機能
- 安全なJavaScriptプレイグラウンド: セキュア実行環境付きコードエディタ
- 完全な認証システム: ユーザー登録、ログイン、セッション管理
- 管理者ダッシュボード: ユーザー管理、統計表示、新規ユーザー作成
- データベース永続化: SQLiteによる安全なデータ保存
- プロフィール管理: ユーザー情報とプログレス表示
- Stripe連携: 安全な決済処理
- プラン管理: ベーシック・プロ・エンタープライズプラン
- サブスクリプション状況確認: リアルタイム契約状況表示
- レスポンシブデザイン: TailwindCSSによるモダンなUI
- 紫/インディゴ/ピンクのブランドカラー: 統一されたデザインシステム
- アクセシビリティ対応: ユーザビリティを重視した設計
- フレームワーク: Nuxt 3 (Vue 3)
- 言語: TypeScript
- スタイリング: TailwindCSS
- 状態管理: Composables (useSqlQuiz, useAuth, useUserProgress)
- サーバー: Nuxt 3 Server API
- データベース: SQLite (本番環境対応)
- 認証: bcrypt + HttpOnly Cookie セッション
- 決済: Stripe API
- SQL実行エンジン: AlaSQL(ブラウザ内)
- AI統合: OpenAI API (GPT-4/GPT-5対応)
- セキュリティ: 隔離されたJavaScript実行環境
- テストフレームワーク: Vitest + Playwright
- 型チェック: TypeScript
- コード品質: ESLint
- パッケージ管理: npm
- 対応環境: Serverless, Traditional Server
- データベース拡張性: MySQL/PostgreSQL対応可能
- 環境管理: .env configuration
このプロジェクトはVercelなどのサーバーレス環境でも動作するように設計されています。サーバーレス環境ではプロセスが短命でファイルシステムが永続化されないため、ローカルのSQLiteファイルに依存する運用は避けるかフォールバックを用意してください。
- 推奨パターン: 認証情報やユーザープログレスの永続化にはTurso(libSQL)などサーバーレス対応のクラウドデータベースを利用します。
- NuxtのサーバーAPIやサーバーサイド処理はサーバーレス関数(Vercel Functions)で動作するように実装されています。
- 環境変数はVercelのダッシュボードまたは
vercel envコマンドで設定してください。
例: Vercelにデプロイする際に必須となる環境変数
OPENAI_API_KEY
STRIPE_SECRET_KEY
TURSO_DATABASE_URL
TURSO_AUTH_TOKEN
DATABASE_TYPE=turso
npm install.envファイルを作成し、以下を設定:
# OpenAI API(AI機能用)
OPENAI_API_KEY=your_openai_api_key_here
# Stripe決済(サブスクリプション機能用)
STRIPE_SECRET_KEY=your_stripe_secret_key
STRIPE_PUBLISHABLE_KEY=your_stripe_publishable_key
STRIPE_WEBHOOK_SECRET=your_stripe_webhook_secret
# データベース設定(オプション)
DATABASE_TYPE=sqlite # sqlite | mysql | postgresqlnpm run devサーバーは http://localhost:3000 で起動します。
./
├── DOCS/ # 📚 プロジェクト文書(詳細ドキュメント)
│ ├── README.md # ドキュメント一覧
│ ├── DATABASE_ABSTRACTION.md # データベース設計
│ ├── SECURITY_IMPLEMENTATION.md # セキュリティ実装
│ └── ... # 他の技術文書
├── data/ # 📊 静的データファイル
│ ├── sqlQuestions.json # SQL問題データ
│ ├── sqlDatabases.json # データベーススキーマ
│ ├── randomQuestions.json # ランダムクイズ問題
│ ├── sqlExplanation/ # SQL概念の解説データ
│ └── users.db # ユーザーデータ(開発環境)
├── pages/ # 🌐 ページコンポーネント
│ ├── sql/[[id]].vue # 動的SQL問題ページ
│ ├── admin.vue # 管理者ダッシュボード
│ ├── playground.vue # JavaScriptプレイグラウンド
│ ├── subscription.vue # サブスクリプション管理
│ ├── profile.vue # ユーザープロフィール
│ ├── login.vue & register.vue # 認証ページ
│ ├── quiz.vue # クイズページ
│ └── janken.vue # じゃんけんゲーム
├── server/ # ⚙️ サーバーサイドAPI
│ ├── api/ # REST API エンドポイント
│ │ ├── admin/ # 管理者専用API
│ │ ├── stripe/ # Stripe決済API
│ │ ├── user/ # ユーザー関連API
│ │ ├── openai.post.ts # AI統合API
│ │ └── ... # その他のAPI
│ └── utils/ # サーバーユーティリティ
│ ├── database-factory.ts # データベース抽象化
│ └── auth.ts # 認証ヘルパー
├── composables/ # 🔧 状態管理とロジック
│ ├── useAuth.ts # 認証管理
│ ├── useSqlQuiz.ts # SQL問題管理
│ ├── useUserProgress.ts # 進捗追跡
│ ├── useAI.ts # AI機能
│ ├── useSecureJavaScriptExecution.ts # セキュア実行
│ └── ... # その他のコンポーザブル
├── components/ # 🧩 再利用可能コンポーネント
│ ├── Sql*.vue # SQL学習関連
│ ├── Secure*.vue # セキュリティ関連
│ └── ... # その他のコンポーネント
├── test/ # 🧪 テストファイル
│ ├── e2e/ # Playwrightテスト
│ └── unit/ # Vitestユニットテスト
└── plugins/
└── alasql.ts # AlaSQL初期化
- 問題とデータベースは
/data/フォルダのJSONファイルで管理 - ジャンル → サブジャンル → レベルの3階層で自動ソート
- 新しい問題はJSONに追加するだけで自動的にUIに反映
- SQLiteデータベースによるユーザー情報の永続化
- bcrypt による安全なパスワードハッシュ化
- HttpOnly Cookie によるセッション管理
- ユーザー進捗の自動同期
- AlaSQL使用でサーバー不要のSQL学習環境
sqlDatabases.jsonのテーブル定義を自動で初期化- リアルタイムでのSQL実行結果表示
- OpenAI API による適応的な学習ヒント
- 問題タイプ別の専門的なAI応答
- 自動問題生成機能
- 隔離されたJavaScript実行環境
- レート制限付きのコード実行
- DOM操作やネットワークアクセスの無効化
- Vuexやpiniaの代わりにcomposablesで状態管理
useAuth(),useSqlQuiz(),useUserProgress()でロジック分離- ファイルベースルーティングとの親和性が高い
data/sqlQuestions.jsonに問題を追加answerフィールドに正解SQLを設定- 必要に応じて
data/sqlDatabases.jsonにテーブル定義を追加
data/sqlQuestions.jsonに"type": "analysis"で問題を追加analysisCodeフィールドに分析対象SQLを設定- PERFORMANCE、TRANSACTION、DEADLOCKジャンルで専門的AI対応
/server/api/openai.post.tsでプロンプト制御- SQL教育に特化したプロンプトインジェクション保護
- システムプロンプトでSQL学習に限定
- 管理者ダッシュボードでユーザー管理
- AI問題生成機能でコンテンツ拡充
- ユーザー統計とプログレス監視
- カスタムTailwindクラス:
.btn-gradient,.btn-sql-question assets/main.cssでグラデーションユーティリティ定義- 紫/インディゴ/ピンクのブランドカラー統一
npm run test # Vitest実行
npm run test:ui # テストUI表示
npm run test:coverage # カバレッジ付き実行npm run test:e2e # Playwright実行
npm run test:e2e:ui # テストUI表示
npm run test:e2e:debug # デバッグモード// ブラウザコンソールでAlaSQL状態確認
window.alasql.databases
// SQL実行エラーは赤枠で表示
// AI応答は紫枠で表示npm run buildnpm run preview- 環境変数:
OPENAI_API_KEY、Stripe関連キーを設定 - データベース: 本番環境では
/tmp/users.dbを使用 - スケーリング:
DATABASE_TYPE環境変数でMySQL/PostgreSQL切り替え可能
プロジェクトの詳細なドキュメントは DOCS/ ディレクトリにまとめられています:
- DOCS/README.md - ドキュメント一覧とガイド
- アーキテクチャ・設計: データベース抽象化、セキュリティ実装
- UI・UX: 画面遷移図と各ページの詳細
- 開発・メンテナンス: リファクタリング推奨箇所
- テスト: テスト開発ガイドとPlaywrightテストケース
開発者向けの詳細な技術情報は AGENTS.md を参照してください。
- 管理者権限でログイン
/adminにアクセス- ユーザー管理、統計確認、AI問題生成
/subscriptionでプラン選択- Stripe決済でプラン契約
- 高度な機能へのアクセス解除
/playgroundでセキュアなJavaScript実行- 隔離環境でコード学習
- レート制限付きの安全な実行