# Location Interaction System - evaluation_value Based Implementation ## 概要 LocationモデルのDestinationにuse_qr_codeフラグとevaluation_valueフィールドを使用した、拡張されたロケーションインタラクションシステムを実装しました。 ## システム構成 ### 1. Locationモデル拡張 **ファイル**: `rog/models.py` - `evaluation_value` フィールドを使用してインタラクションタイプを決定 - 値の意味: - `"0"` または `null`: 通常ポイント - `"1"`: 写真撮影 + 買い物ポイント - `"2"`: QRコードスキャン + クイズ回答 ### 2. ビジネスロジック **ファイル**: `rog/location_interaction.py` ```python # インタラクションタイプ定数 INTERACTION_TYPE_NORMAL = "0" # 通常ポイント INTERACTION_TYPE_PHOTO = "1" # 写真撮影ポイント INTERACTION_TYPE_QR_QUIZ = "2" # QRコード + クイズポイント # 主要関数 - get_interaction_type(location): ロケーションのインタラクションタイプを判定 - validate_interaction_requirements(location, request_data): 必要なデータの検証 - get_point_calculation(location, interaction_result): ポイント計算 ``` ### 3. チェックインAPI **ファイル**: `rog/location_checkin_view.py` **エンドポイント**: `POST /api/location-checkin/` **リクエスト形式**: ```json { "location_id": 123, "latitude": 35.1234, "longitude": 136.5678, "photo": "base64_encoded_image_data", // evaluation_value="1"の場合必須 "qr_code_data": "{\"quiz_id\": 1, \"correct_answer\": \"答え\"}", // evaluation_value="2"の場合必須 "quiz_answer": "ユーザーの回答" // evaluation_value="2"の場合必須 } ``` **レスポンス形式**: ```json { "success": true, "checkin_id": 456, "points_awarded": 10, "point_type": "photo_shopping", "message": "写真撮影が完了しました。買い物ポイントを獲得!", "location_name": "ロケーション名", "interaction_type": "1", "interaction_result": { "photo_saved": true, "photo_filename": "checkin_123_20250103_143022.jpg" } } ``` ### 4. APIデータ拡張 **ファイル**: `rog/serializers.py` LocationSerializerを拡張して、以下の情報を追加: - `interaction_type`: インタラクションタイプ ("0", "1", "2") - `requires_photo`: 写真撮影が必要かどうか - `requires_qr_code`: QRコードスキャンが必要かどうか - `interaction_instructions`: ユーザー向け指示メッセージ ### 5. テスト用Webインターフェース **ファイル**: `templates/location_checkin_test.html` **アクセス**: `/api/location-checkin-test/` 機能: - ロケーション一覧の表示 - evaluation_valueに基づく要件の表示 - 写真アップロード (evaluation_value="1") - QRデータ・クイズ入力 (evaluation_value="2") - チェックイン実行とテスト ## 使用方法 ### 1. 通常ポイント (evaluation_value="0") ```javascript const data = { location_id: 123, latitude: 35.1234, longitude: 136.5678 }; fetch('/api/location-checkin/', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data) }); ``` ### 2. 写真撮影ポイント (evaluation_value="1") ```javascript const data = { location_id: 123, latitude: 35.1234, longitude: 136.5678, photo: "base64_encoded_image_data" // 写真必須 }; ``` ### 3. QRコード + クイズポイント (evaluation_value="2") ```javascript const data = { location_id: 123, latitude: 35.1234, longitude: 136.5678, qr_code_data: '{"quiz_id": 1, "correct_answer": "岐阜城"}', // QRコードデータ quiz_answer: "岐阜城" // ユーザーの回答 }; ``` ## ポイント計算システム ### 基本ポイント - 通常ポイント: 10ポイント - 写真撮影ポイント: 15ポイント - QRコード + クイズポイント: 20ポイント (正解時) ### ボーナスポイント - クイズ正解ボーナス: +5ポイント - 写真保存成功ボーナス: +2ポイント ## エラーハンドリング ### 検証エラー - 必須フィールド不足 - 距離制限外 - 写真データ不正 - QRコードデータ不正 ### 処理エラー - 写真保存失敗 - データベースエラー - ネットワークエラー ## セキュリティ考慮事項 1. **認証**: `@login_required`デコレータでユーザー認証必須 2. **CSRF**: `@csrf_exempt`だが、トークン検証推奨 3. **距離検証**: Haversine公式による正確な距離計算 4. **データ検証**: 入力データの厳密な検証 ## データベース影響 ### 新規追加なし - 既存の`evaluation_value`フィールドを活用 - `Useractions`テーブルでチェックイン記録 ### 推奨される追加フィールド (今後の拡張) - `Location.checkin_radius`: チェックイン許可範囲 - `Location.use_qr_code`: QRコード使用フラグ - `Location.quiz_data`: クイズデータ ## 今後の拡張予定 1. **写真検証**: AI による撮影内容検証 2. **QRコード生成**: 動的QRコード生成システム 3. **ゲーミフィケーション**: バッジ・称号システム 4. **リアルタイム**: WebSocket による即座反映 5. **統計**: インタラクション統計・分析 ## テスト手順 1. テストページにアクセス: `/api/location-checkin-test/` 2. evaluation_valueが異なるロケーションを選択 3. 各インタラクションタイプでチェックイン実行 4. レスポンスの確認 ## 関連ファイル - `rog/models.py`: Locationモデル定義 - `rog/serializers.py`: LocationSerializer拡張 - `rog/location_interaction.py`: ビジネスロジック - `rog/location_checkin_view.py`: チェックインAPI - `rog/urls.py`: URL設定 - `templates/location_checkin_test.html`: テストインターフェース --- この実装により、evaluation_valueに基づく柔軟なロケーションインタラクションシステムが完成しました。各ロケーションで異なるユーザー体験を提供し、ゲーミフィケーション要素を追加することで、より魅力的なロゲイニング体験を実現します。