Content Management - utourismboard/explore-uganda-application-documentation GitHub Wiki
The Content Management System (CMS) for Explore Uganda App provides administrators with tools to manage all content types including attractions, events, services, and investment opportunities.
graph TD
A[Admin Dashboard] --> B[Content Types]
B --> C[Attractions]
B --> D[Events]
B --> E[Services]
B --> F[Investment Opportunities]
B --> G[News & Updates]
graph LR
A[Admin Login] --> B[Verify Credentials]
B --> C[Access Dashboard]
C --> D[Content Management]
D --> E[Manage Content]
Role | Permissions |
---|---|
Super Admin | Full access to all features |
Content Manager | Create, edit, delete content |
Moderator | Review and approve content |
Editor | Edit existing content |
-
More Tab
- Access Admin Panel
- Content Dashboard
- Analytics Overview
- User Management
-
Quick Actions
- Add New Content
- Review Pending
- Recent Updates
- Content Calendar
// Example Dashboard Structure
class AdminDashboard {
final List<ContentType> contentTypes = [
ContentType(
name: 'Attractions',
icon: Icons.place,
addRoute: '/admin/attractions/add',
listRoute: '/admin/attractions',
),
ContentType(
name: 'Events',
icon: Icons.event,
addRoute: '/admin/events/add',
listRoute: '/admin/events',
),
// More content types...
];
}
graph TD
A[Create Attraction] --> B[Basic Info]
B --> C[Location Details]
C --> D[Media Upload]
D --> E[Additional Info]
E --> F[Preview]
F --> G[Publish]
// Attraction Model
class Attraction {
final String id;
final String name;
final String description;
final LatLng location;
final List<String> images;
final Map<String, dynamic> details;
final String category;
final bool isActive;
final DateTime createdAt;
final DateTime updatedAt;
// Validation
bool validate() {
return name.isNotEmpty &&
description.isNotEmpty &&
images.isNotEmpty &&
location != null;
}
}
-
Images
- Minimum resolution: 1920x1080
- Format: JPG, PNG
- Max size: 5MB
- Required: 3-10 images
-
Videos
- Format: MP4
- Max duration: 3 minutes
- Max size: 100MB
- Optional
graph TD
A[Create Event] --> B[Event Details]
B --> C[Schedule]
C --> D[Ticket Info]
D --> E[Media]
E --> F[Preview]
F --> G[Publish]
// Event Model
class Event {
final String id;
final String title;
final String description;
final DateTime startDate;
final DateTime endDate;
final LatLng venue;
final List<TicketType> tickets;
final List<String> images;
final EventCategory category;
// Scheduling validation
bool validateSchedule() {
return startDate.isAfter(DateTime.now()) &&
endDate.isAfter(startDate);
}
}
-
Service Types
- Accommodation
- Transportation
- Tour Guides
- Restaurants
- Activities
-
Required Information
// Service Model class Service { final String id; final String name; final ServiceType type; final String description; final List<String> amenities; final PriceRange priceRange; final BusinessHours hours; final ContactInfo contact; // Availability management Future<bool> checkAvailability(DateTime date) async { // Check booking calendar return await BookingSystem.isAvailable(id, date); } }
graph TD
A[New Investment] --> B[Project Details]
B --> C[Financial Info]
C --> D[Documentation]
D --> E[Contact Info]
E --> F[Review]
F --> G[Publish]
// Investment Model
class Investment {
final String id;
final String title;
final String description;
final double amount;
final List<String> documents;
final List<String> images;
final InvestmentType type;
final ROIDetails roi;
// ROI calculation
double calculateROI() {
return roi.calculateAnnualReturn();
}
}
graph LR
A[Content Submitted] --> B[Auto Review]
B --> C[Manual Review]
C --> D[Approve/Reject]
D --> E[Publish/Feedback]
-
Content Review
- Inappropriate content detection
- Duplicate checking
- Quality assessment
- Compliance verification
-
Action Tools
- Approve/Reject
- Edit/Update
- Flag for review
- Send feedback
// Media Manager
class MediaManager {
final Storage _storage = Storage();
Future<String> uploadImage(File file, String path) async {
// Validate file
if (!_isValidImage(file)) {
throw InvalidFileException();
}
// Optimize image
final optimized = await ImageOptimizer.optimize(file);
// Upload
return await _storage.upload(optimized, path);
}
}
-
Upload
- Drag and drop support
- Bulk upload
- Progress tracking
- Auto-optimization
-
Management
- Organize by folders
- Search functionality
- Batch operations
- Usage tracking
-
Meta Information
- Title optimization
- Description management
- Keyword integration
- URL structure
-
Content Optimization
- Keyword analysis
- Content scoring
- Readability check
- Mobile optimization
graph TD
A[Analytics] --> B[Views]
A --> C[Engagement]
A --> D[Conversions]
A --> E[User Feedback]
-
Standard Reports
- Content performance
- User engagement
- Conversion rates
- Traffic analysis
-
Custom Reports
- Date range selection
- Custom metrics
- Export options
- Scheduled reports