# Admin Panel — Stories + Info Sections ## 1. Stories (Hikayeler) Anasayfadaki kayan hikaye/tanıtım kartları. Instagram stories benzeri yapı. ### API Endpoints | Method | Endpoint | Auth | Açıklama | |--------|----------|------|----------| | `GET` | `/v1/stories` | public | Aktif hikayeler (order_index sıralı) | | `GET` | `/admin/stories` | sanctum | Tüm hikayeler | | `POST` | `/admin/stories` | sanctum | Yeni hikaye oluştur | | `GET` | `/admin/stories/{id}` | sanctum | Hikaye detayı | | `PUT` | `/admin/stories/{id}` | sanctum | Hikaye güncelle | | `DELETE` | `/admin/stories/{id}` | sanctum | Hikaye sil | ### Response Formatı ```json { "data": [ { "id": 1, "title": "25 Yılı Aşkın Deneyim", "badge": "Tanıtım", "content": "1998'den bu yana 15.000+ denizci yetiştirdik...", "image": "/storage/stories/hakkimizda.jpg", "cta_text": "Hakkımızda", "cta_url": "/kurumsal/hakkimizda", "order_index": 0, "is_active": true, "created_at": "...", "updated_at": "..." } ] } ``` ### Veri Modeli | Alan | Tip | Açıklama | |------|-----|----------| | `title` | string (zorunlu) | Hikaye başlığı | | `badge` | string (nullable) | Üst etiket: "Tanıtım", "Yeni Dönem", vb. | | `content` | text (zorunlu) | Hikaye içeriği | | `image` | string (nullable) | Görsel path (storage/stories/) | | `cta_text` | string (nullable) | Buton metni: "Hakkımızda", "Detaylı Bilgi" | | `cta_url` | string (nullable) | Buton linki: "/kurumsal/hakkimizda" | | `order_index` | integer | Sıralama (0'dan başlar) | | `is_active` | boolean | Aktif/pasif | ### Admin Panel Form ``` ┌─────────────────────────────────────────────────┐ │ Hikaye Düzenle │ ├─────────────────────────────────────────────────┤ │ Başlık: [25 Yılı Aşkın Deneyim ] │ │ Etiket: [Tanıtım ] │ │ İçerik: ┌─────────────────────────────────┐ │ │ │ 1998'den bu yana 15.000+... │ │ │ └─────────────────────────────────┘ │ │ Görsel: [📷 Dosya Seç] hakkimizda.jpg │ │ Buton: [Hakkımızda ] [/kurumsal/hak..] │ │ Sıralama: [0] │ │ Aktif: [✅ Toggle] │ │ [Kaydet] │ └─────────────────────────────────────────────────┘ ``` #### Form Alanları: | Alan | Bileşen | Açıklama | |------|---------|----------| | title | TextInput | Zorunlu, max 255 | | badge | TextInput | İsteğe bağlı, max 100 | | content | Textarea | Zorunlu | | image | FileUpload | storage/public/stories, preview göster | | cta_text | TextInput | İsteğe bağlı, max 100 | | cta_url | TextInput (url) | İsteğe bağlı, max 255 | | order_index | NumberInput | Varsayılan 0 | | is_active | Toggle | Varsayılan true | #### Tablo Sütunları: | Sütun | Açıklama | |-------|----------| | Görsel | Küçük thumbnail | | Başlık | title | | Etiket | badge (badge bileşeni) | | Buton | cta_text (varsa göster) | | Sıralama | order_index | | Aktif | is_active (toggle/icon) | --- ## 2. Info Sections (Tanıtım Bölümleri) Anasayfadaki 2 adet metin+görsel tanıtım bölümü. Settings tablosunda `info_sections` grubu altında saklanır. ### API Erişimi Mevcut settings endpoint'inden gelir: ``` GET /api/v1/settings GET /api/v1/settings/info_sections ``` ### Response (settings/info_sections): ```json { "info_section_1_badge": "Neden Boğaziçi Denizcilik?", "info_section_1_title": "Uluslararası Standartlarda Eğitim", "info_section_1_body": "Uzun açıklama metni...", "info_section_1_quote": "Denizcilik eğitiminde kalite...", "info_section_1_quote_author": "Kpt. Murat Aydın, Kurucu", "info_section_1_image": "/storage/uploads/info-1.jpg", "info_section_2_badge": "Simülatör Destekli Eğitim", "info_section_2_title": "Teoriden Pratiğe", "info_section_2_body": "Uzun açıklama metni...", "info_section_2_image": "/storage/uploads/info-2.jpg" } ``` ### Alanlar **Bölüm 1 (6 alan):** | Key | Type | Label | |-----|------|-------| | `info_section_1_badge` | text | Bölüm 1 — Etiket | | `info_section_1_title` | text | Bölüm 1 — Başlık | | `info_section_1_body` | textarea | Bölüm 1 — İçerik | | `info_section_1_quote` | text | Bölüm 1 — Alıntı | | `info_section_1_quote_author` | text | Bölüm 1 — Alıntı Yazarı | | `info_section_1_image` | image | Bölüm 1 — Görsel | **Bölüm 2 (4 alan):** | Key | Type | Label | |-----|------|-------| | `info_section_2_badge` | text | Bölüm 2 — Etiket | | `info_section_2_title` | text | Bölüm 2 — Başlık | | `info_section_2_body` | textarea | Bölüm 2 — İçerik | | `info_section_2_image` | image | Bölüm 2 — Görsel | ### Admin Panel — Ayarlar Sayfası Mevcut Settings sayfasına yeni bir **"Tanıtım Bölümleri"** sekmesi ekle: ``` /admin/settings ├── ... (mevcut sekmeler) └── Tanıtım Bölümleri → info_sections ├── Bölüm 1 │ ├── Etiket: [Neden Boğaziçi Denizcilik?] │ ├── Başlık: [Uluslararası Standartlarda...] │ ├── İçerik: [textarea — uzun metin] │ ├── Alıntı: [Denizcilik eğitiminde kalite...] │ ├── Alıntı Yazarı: [Kpt. Murat Aydın, Kurucu] │ └── Görsel: [📷 FileUpload] └── Bölüm 2 ├── Etiket: [Simülatör Destekli Eğitim] ├── Başlık: [Teoriden Pratiğe] ├── İçerik: [textarea — uzun metin] └── Görsel: [📷 FileUpload] ``` Kaydet: `PUT /admin/settings` ile dot notation: ```json { "settings": { "info_sections.info_section_1_badge": "Neden Boğaziçi Denizcilik?", "info_sections.info_section_1_title": "Uluslararası Standartlarda Eğitim", "info_sections.info_section_1_body": "...", "info_sections.info_section_1_image": "/storage/uploads/info-1.jpg" } } ``` --- ## Frontend Kullanım Özeti ### Stories ```tsx // Anasayfa const { data: stories } = await fetch('/api/v1/stories'); {stories.map(story => ( ))} ``` ### Info Sections ```tsx // Settings'ten al const settings = await fetch('/api/v1/settings'); const info1 = { badge: settings.info_sections?.info_section_1_badge, title: settings.info_sections?.info_section_1_title, body: settings.info_sections?.info_section_1_body, quote: settings.info_sections?.info_section_1_quote, quoteAuthor: settings.info_sections?.info_section_1_quote_author, image: settings.info_sections?.info_section_1_image, }; // Bölüm 1 — görsel solda, metin sağda // Bölüm 2 — görsel sağda, metin solda (reverse) ```