小学生〜中学生と保護者を対象とした学習サポート Web アプリです。
クイズ・ストーリーモード・実績/コレクションなどの要素を通じて、学習を継続しやすくすることを目的としています。
保護者は学習履歴や正答率を確認でき、声かけのきっかけづくりにも役立ちます。
本アプリは以下の2つで構成されます。
- フロントエンド(React):ユーザー向け UI を提供する SPA
- バックエンド(Django + Django REST Framework):REST API、認証、学習データ管理
ローカル開発時は Django と React を別々のサーバーとして起動し、将来的に単一サーバーまたはクラウド構成を採用します。
- SPA(React Router による画面遷移)
- 主な画面
- クイズ選択(教科・単元)
- クイズ出題・回答
- ストーリーモード
- 実績・コレクション
- 保護者向けダッシュボード(進捗・統計)
- Django API と HTTP 経由で通信
- 本番環境では静的ファイルとしてホスティング
- REST API の提供
- 認証機能(子ども / 保護者)
- 学習データ(問題・回答履歴・実績)の管理
- Django Admin による管理 UI
- Django ORM による PostgreSQL 操作
主なテーブル想定:
users/profiles_childsubjects(教科)units(単元)questionsanswers(解答履歴)rewards/user_rewardsstories/story_steps
- TypeScript / JavaScript
- React
- Vite(ビルドツール)
- React Router
- 状態管理:React Hooks(必要に応じて Zustand / Redux)
- UI:Tailwind CSS または MUI / Chakra UI
- テスト:Jest + React Testing Library
- Python
- Django
- Django REST Framework (DRF)
- PostgreSQL
- 認証:Django セッション認証(将来的に JWT も検討)
- GitHub(ソース管理)
- GitHub Actions(CI/CD)
- Docker / docker-compose(任意)
- VS Code(推奨開発環境)
cd frontend
npm install
npm run devcd backend
pip install -r requirements.txt
python manage.py runserver- React: http://localhost:5173
- Django API: http://localhost:8000/api/
開発時は CORS 設定で React 側オリジンを許可します。
- Nginx(静的ファイル配信 & リバースプロキシ)
- Django(Gunicorn)
- PostgreSQL(ローカルまたは外部 DB)
- フロント:S3 + CloudFront
- API:ECS Fargate / Elastic Beanstalk / EC2
- DB:RDS (PostgreSQL)
- 監視:CloudWatch, Sentry
-
プロトタイプ
- Django + React の基本動作
- クイズ機能・ログイン機能の実装
-
MVP
- 単一サーバー構成でデプロイ
- 子ども/保護者の一連の学習導線を構築
-
拡張フェーズ
- ストーリーモード強化
- 実績・コレクション要素追加
- アクセス増加に応じてクラウド化
- 画面一覧・画面遷移の整理
- API エンドポイント設計
- DB スキーマ設計
(後で選択)
.
├── README.md # プロジェクト概要(今回作ったもの)
├── .gitignore
├── package.json # ルート共通ツール用(任意)
├── docker-compose.yml # 開発用コンテナ定義(任意)
├── frontend/ # React フロントエンド
│ ├── package.json
│ ├── vite.config.ts # Vite 設定(Vite 利用の場合)
│ ├── tsconfig.json
│ ├── public/
│ │ └── index.html
│ └── src/
│ ├── main.tsx # エントリーポイント
│ ├── App.tsx
│ ├── routes/ # ルーティング定義
│ │ └── index.tsx
│ ├── pages/ # 画面コンポーネント
│ │ ├── HomePage.tsx
│ │ ├── QuizSelectPage.tsx
│ │ ├── QuizPlayPage.tsx
│ │ ├── StoryModePage.tsx
│ │ ├── CollectionPage.tsx
│ │ └── ParentDashboardPage.tsx
│ ├── components/ # 再利用コンポーネント
│ │ ├── layout/
│ │ │ ├── Header.tsx
│ │ │ └── Footer.tsx
│ │ ├── quiz/
│ │ │ ├── QuestionCard.tsx
│ │ │ └── ChoiceButton.tsx
│ │ ├── common/
│ │ │ ├── Button.tsx
│ │ │ └── LoadingSpinner.tsx
│ │ └── charts/
│ │ └── ProgressChart.tsx
│ ├── features/ # 機能単位のロジック
│ │ ├── auth/
│ │ │ ├── hooks.ts
│ │ │ └── api.ts
│ │ ├── quiz/
│ │ │ ├── hooks.ts
│ │ │ └── api.ts
│ │ └── progress/
│ │ ├── hooks.ts
│ │ └── api.ts
│ ├── api/ # API クライアント層
│ │ ├── client.ts # axios/fetch の共通設定
│ │ └── endpoints.ts # エンドポイント定義
│ ├── styles/ # グローバルスタイル
│ │ └── index.css
│ └── assets/ # 画像・アイコンなど
│ └── logo.svg
│
└── backend/ # Django バックエンド
├── manage.py
├── requirements.txt
├── pyproject.toml # poetry など使う場合(任意)
├── config/ # Django プロジェクト設定
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── asgi.py
│ └── wsgi.py
├── apps/ # Django アプリケーション群
│ ├── accounts/ # 認証・ユーザー関連
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ └── tests.py
│ ├── quiz/ # 問題・単元・回答
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ └── tests.py
│ ├── progress/ # 学習履歴・統計
│ │ ├── __init__.py
│ │ ├── models.py
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ └── tests.py
│ └── story/ # ストーリーモード
│ ├── __init__.py
│ ├── models.py
│ ├── views.py
│ ├── serializers.py
│ ├── urls.py
│ └── tests.py
├── api/ # API ルート定義
│ ├── __init__.py
│ ├── urls.py # /api/... をまとめる
│ └── schema.py # API スキーマ(任意)
└── scripts/ # メンテ・データ投入用スクリプト
└── load_sample_data.py