mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
386 lines
12 KiB
Markdown
386 lines
12 KiB
Markdown
# Banner and Advertising System - Complete Documentation
|
||
|
||
## Overview
|
||
The banner and advertising system provides a comprehensive solution for managing advertising spaces across the website. The system features automatic placement recommendations based on image resolution, preset dimensions for optimal display, and automatic sponsor integration.
|
||
|
||
## Key Features
|
||
|
||
### 1. **Preset-Based Banner Placements**
|
||
The system includes 5 predefined banner placements with optimal dimensions:
|
||
|
||
| Placement | Dimensions | Aspect Ratio | Position | Description |
|
||
|-----------|------------|--------------|----------|-------------|
|
||
| `homepage_top` | 1200 × 200 | 6:1 | Top | Main banner at the top of homepage, shown to all visitors |
|
||
| `homepage_middle` | 970 × 250 | 3.88:1 | Middle | Banner in the middle of the page between content |
|
||
| `homepage_sidebar` | 300 × 250 | 1.2:1 | Sidebar | Smaller banner in the right sidebar panel |
|
||
| `homepage_footer` | 1200 × 200 | 6:1 | Footer | Banner at the bottom of the page before footer |
|
||
| `article_inline` | 728 × 90 | 8.09:1 | Article | Banner displayed within article text |
|
||
|
||
### 2. **Automatic Image Resolution Detection**
|
||
When uploading a banner image:
|
||
- The system automatically detects the image resolution (width × height)
|
||
- Calculates the aspect ratio
|
||
- Provides up to 3 recommended placements based on image dimensions
|
||
- Recommends the best matching placement (highlighted as "Nejlepší")
|
||
- Displays resolution info: "Rozlišení: 1200×200 px, Poměr stran: 6.00:1"
|
||
|
||
### 3. **Smart Placement Recommendations**
|
||
The recommendation algorithm:
|
||
1. Compares image aspect ratio with preset aspect ratios
|
||
2. Evaluates width and height differences
|
||
3. Scores each placement (lower score = better match)
|
||
4. Returns top 3 recommendations ranked by quality
|
||
5. Auto-selects the best match if no placement is already chosen
|
||
|
||
### 4. **Live Preview System**
|
||
- Shows banner preview in the admin modal
|
||
- Preview respects the selected placement dimensions
|
||
- Displays where the banner will appear: "Zobrazení v pozici: [Placement Label]"
|
||
- Scaled proportionally to fit admin interface (max 600px width)
|
||
|
||
### 5. **Placement Information Display**
|
||
For each placement, the system shows:
|
||
- **Label**: User-friendly Czech name
|
||
- **Description**: Detailed explanation of where and how it displays
|
||
- **Dimensions**: Exact pixel dimensions (read-only, automatically set)
|
||
- **Aspect Ratio**: Calculated ratio for reference
|
||
- **Position**: Logical position identifier (top, middle, sidebar, footer, article)
|
||
|
||
### 6. **Manual Dimension Removal**
|
||
- Width and height fields are **removed** from manual input
|
||
- Dimensions are **automatically set** based on selected placement preset
|
||
- This ensures consistency and prevents display issues
|
||
- Users can only select from predefined placements
|
||
|
||
### 7. **Automatic Sponsor Integration**
|
||
When a banner is created/updated:
|
||
- The banner data is stored in the `sponsors` table with placement metadata
|
||
- Active banners (`is_active = true`) automatically appear in:
|
||
- **Footer**: Displayed in "Naši partneři" section with inverted logo styling
|
||
- **Sponsors Page**: Listed alongside regular sponsors
|
||
- **Homepage Sponsors Section**: Included in the sponsors grid/slider
|
||
- Provides dual functionality: advertising + partnership visibility
|
||
|
||
### 8. **Enhanced Admin Interface**
|
||
The Banners Admin Page (`/admin/bannery`) includes:
|
||
- **Table View** with columns:
|
||
- Náhled (Preview thumbnail)
|
||
- Název (Name) + URL preview
|
||
- Umístění (Placement label + position badge)
|
||
- Rozměry (Dimensions display)
|
||
- Aktivní (Active status badge)
|
||
- Akce (Edit/Delete actions)
|
||
- **Modal Editor** with:
|
||
- Name input
|
||
- Click-through URL (optional)
|
||
- Image upload with progress indicator
|
||
- Resolution detection alert
|
||
- Placement recommendations panel
|
||
- Placement selector with descriptions
|
||
- Dimension display (read-only)
|
||
- Live preview area
|
||
- Active toggle switch
|
||
|
||
## Technical Implementation
|
||
|
||
### Database Schema
|
||
Banners use the existing `sponsors` table with additional fields:
|
||
```sql
|
||
CREATE TABLE sponsors (
|
||
id INTEGER PRIMARY KEY,
|
||
name TEXT NOT NULL,
|
||
logo_url TEXT,
|
||
website_url TEXT,
|
||
is_active BOOLEAN DEFAULT true,
|
||
tier TEXT DEFAULT 'standard',
|
||
display_order INTEGER DEFAULT 0,
|
||
placement TEXT, -- e.g., 'homepage_top'
|
||
width INTEGER, -- e.g., 1200
|
||
height INTEGER, -- e.g., 200
|
||
created_at TIMESTAMP,
|
||
updated_at TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### Frontend Components
|
||
|
||
#### 1. **BannersAdminPage.tsx**
|
||
Location: `frontend/src/pages/admin/BannersAdminPage.tsx`
|
||
|
||
Key Functions:
|
||
- `getPreset(placement)` - Retrieves preset configuration by placement value
|
||
- `recommendPlacement(width, height)` - Returns top 3 recommended placements
|
||
- `onUpload(file)` - Handles image upload with resolution detection
|
||
- `openCreate()` - Opens modal with default placement preset
|
||
- `openEdit(sponsor)` - Opens modal for editing existing banner
|
||
|
||
State Management:
|
||
- `editing` - Current banner being edited
|
||
- `imageResolution` - Detected image dimensions
|
||
- `recommendedPlacements` - Array of recommended placements
|
||
- `uploadingImage` - Upload progress indicator
|
||
|
||
#### 2. **BannerDisplay.tsx**
|
||
Location: `frontend/src/components/banners/BannerDisplay.tsx`
|
||
|
||
Props:
|
||
```typescript
|
||
interface BannerDisplayProps {
|
||
banners: Banner[];
|
||
placement: 'homepage_top' | 'homepage_middle' | 'homepage_sidebar' | 'homepage_footer' | 'article_inline';
|
||
containerStyle?: React.CSSProperties;
|
||
}
|
||
```
|
||
|
||
Features:
|
||
- Filters active banners for specific placement
|
||
- Applies placement-specific styling
|
||
- Handles responsive layout
|
||
- Provides hover effects
|
||
- Lazy loads images
|
||
|
||
#### 3. **Footer.tsx**
|
||
Location: `frontend/src/components/layout/Footer.tsx`
|
||
|
||
Sponsor Display:
|
||
- Fetches sponsors from `/api/v1/public/sponsors`
|
||
- Filters active sponsors (`is_active !== false`)
|
||
- Displays in responsive grid (2-6 columns)
|
||
- Inverted logos for dark background
|
||
- Links to sponsor websites with tracking
|
||
|
||
### Backend Integration
|
||
|
||
#### API Endpoints
|
||
```
|
||
GET /api/v1/public/sponsors - List all active sponsors/banners
|
||
POST /api/v1/sponsors - Create new banner (admin)
|
||
PUT /api/v1/sponsors/:id - Update banner (admin)
|
||
DELETE /api/v1/sponsors/:id - Delete banner (admin)
|
||
```
|
||
|
||
#### Sponsor Model (Go)
|
||
```go
|
||
type Sponsor struct {
|
||
gorm.Model
|
||
Name string `gorm:"not null" json:"name"`
|
||
LogoURL string `json:"logo_url"`
|
||
WebsiteURL string `json:"website_url"`
|
||
Description string `json:"description"`
|
||
IsActive bool `gorm:"default:true" json:"is_active"`
|
||
Tier string `gorm:"default:'standard'" json:"tier"`
|
||
DisplayOrder int `gorm:"default:0" json:"display_order"`
|
||
Placement string `json:"placement"`
|
||
Width int `json:"width"`
|
||
Height int `json:"height"`
|
||
}
|
||
```
|
||
|
||
### Display Locations
|
||
|
||
#### Homepage
|
||
Banners are displayed in the following locations on the homepage:
|
||
|
||
1. **Top Banner** (`homepage_top`)
|
||
- Full-width section after header
|
||
- Light gray background with borders
|
||
- Centered content
|
||
|
||
2. **Middle Banner** (`homepage_middle`)
|
||
- Between content sections
|
||
- Centered display
|
||
- Standard margin spacing
|
||
|
||
3. **Sidebar Banner** (`homepage_sidebar`)
|
||
- Right sidebar (desktop)
|
||
- Sticky positioning (top: 96px)
|
||
- Stacked on mobile
|
||
- Rounded corners with shadow
|
||
|
||
4. **Footer Banner** (`homepage_footer`)
|
||
- Above footer navigation
|
||
- Full-width with background
|
||
- Centered content
|
||
|
||
#### Article Pages
|
||
5. **Inline Banner** (`article_inline`)
|
||
- Embedded within article content
|
||
- Standard ad format (728×90)
|
||
- Responsive on mobile
|
||
|
||
#### Footer
|
||
All active banners (regardless of placement) also appear as sponsors in:
|
||
- Footer "Naši partneři" section
|
||
- 6-column responsive grid
|
||
- White inverted logos on dark background
|
||
|
||
#### Sponsors Page
|
||
Banners are included in the sponsors page listing at `/sponzori`.
|
||
|
||
## Usage Guide
|
||
|
||
### Adding a New Banner
|
||
|
||
1. **Navigate to Admin Panel**
|
||
- Go to `/admin/bannery`
|
||
- Click "Nový banner" button
|
||
|
||
2. **Upload Image**
|
||
- Click "Nahrát obrázek" button
|
||
- Select your banner image file
|
||
- System automatically detects resolution
|
||
|
||
3. **Review Recommendations**
|
||
- Check the detected resolution alert
|
||
- Review recommended placements (up to 3)
|
||
- Best match is highlighted in green
|
||
|
||
4. **Select Placement**
|
||
- Choose from dropdown or click "Použít" on recommendation
|
||
- View placement description below selector
|
||
- See dimensions display (auto-set, read-only)
|
||
|
||
5. **Preview Banner**
|
||
- Check live preview in modal
|
||
- Verify it matches expected dimensions
|
||
- See placement label below preview
|
||
|
||
6. **Configure Details**
|
||
- Enter banner name (required)
|
||
- Add website URL for click-through (optional)
|
||
- Toggle active status (default: active)
|
||
|
||
7. **Save**
|
||
- Click "Uložit" button
|
||
- Banner appears immediately on site
|
||
- Also added to sponsors in footer
|
||
|
||
### Editing an Existing Banner
|
||
|
||
1. Click edit icon (pencil) in banner table
|
||
2. Modify any fields except dimensions
|
||
3. Upload new image to change resolution/placement
|
||
4. Save changes
|
||
|
||
### Best Practices
|
||
|
||
#### Image Preparation
|
||
- **Use correct dimensions** for target placement
|
||
- **High quality images** (at least 2x for retina displays)
|
||
- **Optimize file size** (recommended: <500KB)
|
||
- **Use PNG or JPG** formats
|
||
- **Test on mobile** - ensure text is readable
|
||
|
||
#### Recommended Image Sizes
|
||
For best quality on retina displays:
|
||
- `homepage_top`: 2400×400 @ 72dpi
|
||
- `homepage_middle`: 1940×500 @ 72dpi
|
||
- `homepage_sidebar`: 600×500 @ 72dpi
|
||
- `homepage_footer`: 2400×400 @ 72dpi
|
||
- `article_inline`: 1456×180 @ 72dpi
|
||
|
||
#### Naming Convention
|
||
Use descriptive names:
|
||
- ❌ Bad: "Banner 1", "IMG_1234"
|
||
- ✅ Good: "Hlavní partner 2025", "Turnaj léto 2025"
|
||
|
||
#### URL Configuration
|
||
- Always use `https://` protocol
|
||
- Test link before saving
|
||
- Use tracking parameters if needed: `?utm_source=banner&utm_medium=homepage`
|
||
|
||
#### Active Status
|
||
- Set to active only when campaign is live
|
||
- Deactivate expired campaigns instead of deleting
|
||
- Keeps historical data and analytics
|
||
|
||
## Troubleshooting
|
||
|
||
### Issue: Banner not displaying
|
||
**Solutions:**
|
||
1. Check `is_active` status is `true`
|
||
2. Verify placement matches homepage style
|
||
3. Clear browser cache
|
||
4. Check image URL is accessible
|
||
|
||
### Issue: Wrong placement recommendations
|
||
**Cause:** Image aspect ratio doesn't match any preset closely
|
||
|
||
**Solutions:**
|
||
1. Resize image to match recommended dimensions
|
||
2. Choose closest preset manually
|
||
3. Accept that banner may not perfectly fit
|
||
|
||
### Issue: Image resolution not detected
|
||
**Cause:** Browser security/CORS issues
|
||
|
||
**Solutions:**
|
||
1. Upload image again
|
||
2. Try different image format
|
||
3. Check image file integrity
|
||
4. Use supported format (JPG/PNG/WebP)
|
||
|
||
### Issue: Banner overlaps content
|
||
**Cause:** Custom styling conflicts
|
||
|
||
**Solutions:**
|
||
1. Use preset placements only
|
||
2. Don't modify width/height manually
|
||
3. Check responsive behavior on mobile
|
||
|
||
### Issue: Sponsor not showing in footer
|
||
**Cause:** Banner not marked as active or API error
|
||
|
||
**Solutions:**
|
||
1. Verify `is_active = true`
|
||
2. Check API endpoint `/api/v1/public/sponsors`
|
||
3. Refresh page to reload sponsors
|
||
4. Check browser console for errors
|
||
|
||
## Future Enhancements
|
||
|
||
Potential improvements:
|
||
- [ ] A/B testing for banner effectiveness
|
||
- [ ] Click-through tracking and analytics
|
||
- [ ] Impression counting
|
||
- [ ] Scheduled banner campaigns (start/end dates)
|
||
- [ ] Banner rotation for same placement
|
||
- [ ] Custom placement creation
|
||
- [ ] Banner templates library
|
||
- [ ] Bulk upload functionality
|
||
- [ ] Performance metrics dashboard
|
||
|
||
## Technical Notes
|
||
|
||
### Performance Considerations
|
||
- Images use `loading="lazy"` for off-screen banners
|
||
- Responsive images with `object-fit: contain`
|
||
- Minimal re-renders with React state management
|
||
- Cached sponsor data in footer
|
||
|
||
### Accessibility
|
||
- All banners have descriptive `alt` text
|
||
- Clickable areas use semantic `<a>` tags
|
||
- Keyboard navigation support
|
||
- ARIA labels where appropriate
|
||
|
||
### Security
|
||
- Image uploads validate file types
|
||
- URLs sanitized before storage
|
||
- External links use `rel="noopener noreferrer"`
|
||
- XSS protection on user inputs
|
||
|
||
## Support
|
||
|
||
For issues or questions about the banner system:
|
||
1. Check this documentation first
|
||
2. Review browser console for errors
|
||
3. Test with different image formats
|
||
4. Contact system administrator
|
||
|
||
---
|
||
|
||
**Last Updated:** 2025-01-12
|
||
**Version:** 1.0
|
||
**Maintained by:** MyClub Development Team
|