Skip to content

onion3108/study-manager

Repository files navigation

Study Manager

高校3年生向けの学習管理アプリです。GitHub Pagesで公開したWebサイトを、Supabase DB / Storageで同期し、画像・PDFのAI処理はPC上のローカルworkerが実行します。

Webサイトからlocalhost、Ollama、PaddleOCRへ直接アクセスしません。

構成

GitHub Pages Web
  -> Supabase DB / Supabase Storage
  -> local PC worker
  -> Supabase DB
  -> GitHub Pages Web

主なファイル:

  • index.html: GitHub Pagesで開く入口
  • styles.css: 画面スタイル
  • data.js: 初期データ
  • app.js: 表示、操作、Supabase同期、AI job作成
  • supabase-config.js: Web側のSupabase URL / anon key設定
  • supabase/schema.sql: DBテーブル、RLS、Storage bucket/policy
  • worker/run_worker.py: Supabaseのpending jobを処理するworker
  • worker/paddle_ocr_worker.py: PaddleOCR
  • worker/ollama_worker.py: Ollama連携
  • worker/requirements.txt: worker依存関係

GitHub Pagesで公開する方法

  1. GitHubでstudy-managerリポジトリを作成します。
  2. このプロジェクトをpushします。
  3. GitHubのSettingsを開きます。
  4. Pagesを開きます。
  5. SourceDeploy from a branchにします。
  6. Branchmain、folderを/rootにします。
  7. Saveを押します。
  8. 数分後に https://onion3108.github.io/study-manager/ のようなURLへアクセスします。

CSS/JSは相対パスで読み込むため、リポジトリ名付きURLでも動きます。

GitHubへpushする方法

git add index.html styles.css app.js data.js supabase-config.js README.md .gitignore env.example worker supabase
git commit -m "Add Supabase sync and AI worker pipeline"
git branch -M main
git remote add origin https://github.com/onion3108/study-manager.git
git push -u origin main

すでにremoteがある場合はgit remote add origin ...は不要です。

Supabase設定

  1. Supabaseで新しいProjectを作成します。
  2. SQL Editorsupabase/schema.sqlを実行します。
  3. Authentication > URL ConfigurationでSite URLにGitHub PagesのURLを設定します。
  4. Authentication > Providers > Emailを有効にします。
  5. Project Settings > APIからURLとanon keyを確認します。
  6. supabase-config.jsに設定します。
window.STUDY_MANAGER_SUPABASE = {
  url: "https://YOUR_PROJECT.supabase.co",
  anonKey: "YOUR_SUPABASE_ANON_KEY",
  storageBucket: "study-files",
};

anon keyはWebに置いてよい公開用キーです。service role keyは絶対にWebへ置かないでください。

GitHub Pagesでログインする方法

Supabase側で以下を設定してください。

Authentication
-> Providers
-> Email を有効化

Authentication
-> URL Configuration
-> Site URL
-> https://onion3108.github.io/study-manager/

Web側にはPublishable keyまたはLegacy anon keyだけを設定します。service role keyやsecret keyはWeb側に置かず、PC worker用の.envだけに保存してください。

ログイン手順:

  1. GitHub PagesのStudy Managerを開きます。
  2. 設定またはAI取り込みセンターを開きます。
  3. Supabaseログインカードにメールアドレスを入力します。
  4. ログインメール送信を押します。
  5. Supabaseから届いたメールリンクを開きます。
  6. Study Managerに戻ると、ログイン中のメールアドレスと同期状態が表示されます。

未ログイン時はTodoや設定はlocalStorageへ一時保存できますが、PC/スマホ同期、画像/PDFアップロード、ai_jobs作成、AI結果取得にはログインが必要です。

同期対象

正本データはSupabaseに保存します。localStorageは一時キャッシュです。

  • Todo
  • カレンダー予定
  • 今日の予定
  • 時間割
  • 重要イベント
  • AI処理タスク
  • AI生成結果
  • アップロード画像/PDF
  • OCR結果とOCRレイアウト構造
  • 生成問題、解答、要約、重要語句
  • 理解度データ
  • 円グラフ用の学習状況データ
  • 教科ごとの進捗
  • 学習ログ
  • 設定、通知設定、Ollamaモデル名
  • 献立などアプリ内の保存データ

宿題と一週間予定

ホームには「今日の宿題」「未回収の宿題」「一週間の予定」「今週の宿題達成度」が表示されます。Todoは普通のやること、宿題は学校の課題・提出物・毎日の学習計画として別に管理します。

宿題ページでは、教科、タイトル、詳細メモ、期限、取り組む予定日を登録できます。登録した宿題は一週間カレンダーに表示され、チェックすると完了になります。期限を過ぎた未完了宿題は未回収としてホームと達成度カードに表示されます。遅れて完了した宿題はcompletedLateとして記録されます。

宿題データは既存のapp_settings.app_state同期に含まれるため、Supabaseログイン中はPCとスマホで同じ状態を共有できます。supabase/schema.sqlには将来の正規テーブル運用向けにhomeworksweekly_plansstudy_metricsも追加しています。

円グラフ入力

24時間画面の編集モーダルでは、テンプレート、+/- 10分、15/30/45/60分のクイック入力、理解度スライダー、プレビュー円グラフを使えます。保存するとlocalStorageへ保存され、Supabaseログイン中はapp_settings.app_stateへ同期されます。

WebサイトでAI依頼を作る方法

  1. GitHub PagesのWebサイトでSupabaseへログインします。
  2. 授業カードを開きます。
  3. 板書写真、ノート写真、プリント画像、PDFをアップロードします。
  4. ファイルはSupabase Storageのstudy-files bucketへ保存されます。
  5. ai_jobsstatus='pending'の行が作成されます。
  6. AI取り込みセンターでpending/processing/completed/failedとデバッグ情報を確認できます。

GitHub Pages側はAIを実行せず、依頼をSupabaseに書き込むだけです。

workerでPaddleOCR + Ollama処理する方法

PC側で実行します。

python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r worker/requirements.txt
copy env.example .env

.envを編集します。

OLLAMA_URL=http://localhost:11434/api/generate
OLLAMA_MODEL=elyza:jp8b
OCR_USE_GPU=auto
OCR_LANG=japan
SUPABASE_URL=https://YOUR_PROJECT.supabase.co
SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY
SUPABASE_SERVICE_ROLE_KEY=YOUR_SUPABASE_SERVICE_ROLE_KEY
SUPABASE_STORAGE_BUCKET=study-files

service role keyはローカルworkerだけで使います。.env.gitignoreで除外されています。

OCRはOCR_USE_GPUで切り替えできます。falseならCPU固定、trueならGPUを試行、autoならCUDA/Paddle GPUの可否を見て自動判定します。GPU初期化に失敗してもworkerはCPU OCRへフォールバックし、起動ログとai_jobs.error_messageで確認できます。

1回だけ処理:

python worker/run_worker.py --once

常駐処理:

python worker/run_worker.py --interval 20 --limit 3

workerの流れ:

  1. ai_jobsからpendingを取得
  2. processingへ更新
  3. Supabase Storageから画像/PDFをダウンロード
  4. PaddleOCRでレイアウト付きOCR
  5. ai_jobs.ocr_textai_jobs.ocr_layoutを更新
  6. OCR済みテキストだけをOllamaへ渡す
  7. 要約、重要語句、問題、解答、理解度データを作成
  8. ai_resultsへ保存
  9. ai_jobs.statuscompletedへ更新
  10. 失敗時はfailederror_messageを保存

Ollamaの起動確認

ollama list
Invoke-RestMethod -Uri http://localhost:11434/api/generate -Method Post -ContentType "application/json" -Body '{"model":"elyza:jp8b","prompt":"ping","stream":false}'

新しいモデルはworkerが勝手に入れません。.envOLLAMA_MODELには、すでにollama listに表示されるモデル名を指定してください。

PaddleOCRのインストール

pip install -r worker/requirements.txt

初回実行時はPaddleOCRのモデル取得に時間がかかる場合があります。PDF処理にはpypdfium2を使います。

resultsの表示

workerが完了すると、WebサイトのAI取り込みセンターと授業詳細パネルに以下が表示されます。

  • AI処理状態
  • error_message
  • OCRプレビュー
  • 要約
  • 重要語句
  • 生成問題
  • 解答
  • 使用モデル
  • worker処理時刻

手動で反映したい場合はAI取り込みセンターのSupabase再読み込みを押してください。Realtimeが有効な場合は自動反映されます。

よくあるエラー

SupabaseにログインしてからAI依頼を作成してください : Webでログインしていません。AI取り込みセンターからログインメールを送ってください。

supabase-config.jsにURLとanon keyを設定してください : supabase-config.jsが空です。SupabaseのURLとanon keyを設定してpushしてください。

permission deniedまたはStorage upload error : supabase/schema.sqlを実行し、Storage bucketとpolicyが作成されているか確認してください。

SUPABASE_SERVICE_ROLE_KEY is not set : PC側の.envにservice role keyがありません。Web側には絶対に置かないでください。

Ollama API error : Ollamaが起動しているか、.envOLLAMA_MODELollama listにあるモデルか確認してください。

PaddleOCR import error : 仮想環境を有効化し、pip install -r worker/requirements.txtを再実行してください。

動作確認

  1. PCでTodo追加し、スマホで同じアカウントにログインして表示を確認します。
  2. スマホでTodo追加し、PCで表示を確認します。
  3. PCでカレンダー予定や設定を変更し、スマホに反映されるか確認します。
  4. localStorageを消して再読み込みし、Supabaseから復元されるか確認します。
  5. Webから画像/PDFをアップロードします。
  6. Supabase Storageにファイルが保存されたか確認します。
  7. ai_jobspendingが作成されたか確認します。
  8. python worker/run_worker.py --onceを実行します。
  9. pending -> processing -> completedへ変わるか確認します。
  10. ai_jobs.ocr_textai_jobs.ocr_layoutが保存されたか確認します。
  11. ai_resultsに要約、問題、解答、重要語句が保存されたか確認します。
  12. WebサイトにOCR結果、問題、要約、解答が表示されるか確認します。
  13. エラー時はfailederror_messageが表示されるか確認します。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors