|
|
||
|---|---|---|
| .. | ||
| app | ||
| config | ||
| database | ||
| resources | ||
| routes | ||
| tests | ||
| composer.json | ||
| module.json | ||
| package.json | ||
| README.md | ||
| SETUP.md | ||
| vite.config.js | ||
Certificate Module
A comprehensive certificate builder system for the Mentor LMS platform that allows admins to create, manage, and activate custom certificate templates for course completion.
Features
- Visual Certificate Builder: Create custom certificate templates with live preview
- Full Customization: Customize colors, fonts, text, and logos
- Template Management: Create, edit, delete, and activate certificate templates
- One Active Template: Only one template can be active at a time for consistency
- Student Downloads: Students can download certificates in PNG or PDF format
- Dynamic Data: Certificates automatically populate with student name, course name, and completion date
Architecture
Backend (Laravel)
Database Schema
- Table:
certificate_templatesid- Primary keyname- Template name for admin referencelogo_path- Path to uploaded logo (nullable)template_data- JSON field containing all customization datais_active- Boolean flag (only one can be true at a time)created_at,updated_at- Timestamps
Models
- CertificateTemplate (
Modules/Certificate/app/Models/CertificateTemplate.php)- Handles template CRUD operations
- Automatically ensures only one template is active
- Casts
template_datato array for easy access
Controllers
-
CertificateTemplateController (
Modules/Certificate/app/Http/Controllers/CertificateTemplateController.php)index()- List all templates for adminstore()- Create new templateupdate()- Update existing templateactivate()- Set a template as activedestroy()- Delete template (including logo file)
-
CertificateController (
Modules/Certificate/app/Http/Controllers/CertificateController.php)show()- Display certificate download page with active template
Routes
Admin routes (prefix: /admin):
GET /certificate-templates- List all templatesPOST /certificate-templates- Create templatePUT /certificate-templates/{id}- Update templateDELETE /certificate-templates/{id}- Delete templatePOST /certificate-templates/{id}/activate- Activate template
Student routes:
GET /certificates/{courseId}- View and download certificate
Frontend (React + TypeScript)
Admin Pages
-
Certificate Index (
resources/js/pages/dashboard/certificate/index.tsx)- Dashboard view showing all certificate templates
- Grid layout with template cards
- Quick preview, edit, activate, and delete actions
- Empty state with call-to-action
-
Certificate Builder Form (
resources/js/pages/dashboard/certificate/partials/certificate-builder-form.tsx)- Comprehensive form for creating/editing templates
- Real-time preview while editing
- Sections:
- Basic Information (name, active status)
- Logo & Branding (upload logo)
- Colors (primary, secondary, background, border)
- Typography (font family selection)
- Certificate Text (title, description, completion text, footer)
-
Certificate Preview (
resources/js/pages/dashboard/certificate/partials/certificate-preview.tsx)- Reusable preview component
- Shows how certificate will look with sample data
- Used in both builder and preview modal
Student Components
- Dynamic Certificate (
resources/js/components/dynamic-certificate.tsx)- Displays certificate using active template
- Download options (PNG/PDF)
- Canvas-based rendering for high-quality downloads
- Automatically populates with student data
Types
- Certificate Types (
resources/js/types/certificate.d.ts)- TypeScript interfaces for type safety
- Includes CertificateTemplate, CertificateTemplateData, and page props
Template Data Structure
The template_data JSON field contains:
{
"primaryColor": "#3730a3",
"secondaryColor": "#4b5563",
"backgroundColor": "#dbeafe",
"borderColor": "#f59e0b",
"titleText": "Certificate of Completion",
"descriptionText": "This certificate is proudly presented to",
"completionText": "for successfully completing the course",
"footerText": "Authorized Certificate",
"fontFamily": "serif"
}
Installation & Setup
1. Run Migration
php artisan migrate
2. Ensure Storage Link
php artisan storage:link
3. File Permissions
Ensure the storage/app/public/certificates/logos/ directory is writable.
4. Frontend Dependencies
All required packages should already be installed:
jspdf- PDF generationdate-fns- Date formatting- Shadcn/UI components
Usage
Admin: Creating a Certificate Template
- Navigate to Admin Dashboard → Certificate Templates
- Click "Create Template"
- Fill in the form:
- Template Name: Give it a descriptive name
- Logo: Upload your institution/course logo (optional)
- Colors: Choose your brand colors using color pickers
- Typography: Select font style (serif, sans-serif, etc.)
- Text Content: Customize all certificate text
- Preview updates in real-time on the right side
- Toggle "Set as Active Template" to make it the active certificate
- Click "Create Template" to save
Admin: Managing Templates
- View All: See all templates in a grid layout
- Preview: Click on the mini-preview to see full-size preview
- Edit: Click "Edit" button to modify template
- Activate: Click "Activate" to set as the active template (deactivates others)
- Delete: Click trash icon to delete template
Student: Downloading Certificate
- Complete a course
- Navigate to the course certificate page
- Choose download format (PNG or PDF)
- Click "Download" button
- Certificate is generated with your name, course name, and completion date
Customization Options
Colors
- Primary Color: Main headings and student name
- Secondary Color: Body text and descriptions
- Background Color: Certificate background
- Border Color: Decorative borders and lines
Typography
- Serif: Classic, formal look
- Sans Serif: Modern, clean look
- Monospace: Technical, code-style look
- Cursive: Elegant, handwritten style
Text Fields
All text fields support custom content including:
- Title (default: "Certificate of Completion")
- Description (default: "This certificate is proudly presented to")
- Completion text (default: "for successfully completing the course")
- Footer (default: "Authorized Certificate")
API Endpoints
Admin Endpoints
List Templates
GET /admin/certificate-templates
Response: { templates: CertificateTemplate[] }
Create Template
POST /admin/certificate-templates
Body: {
name: string,
logo: File (optional),
template_data: object,
is_active: boolean
}
Update Template
PUT /admin/certificate-templates/{id}
Body: Same as create
Activate Template
POST /admin/certificate-templates/{id}/activate
Delete Template
DELETE /admin/certificate-templates/{id}
Student Endpoints
View Certificate
GET /certificates/{courseId}
Response: { courseId, certificateTemplate, student, course, completionDate }
Technical Notes
Image Handling
- Logos are stored in
storage/app/public/certificates/logos/ - Supported formats: JPEG, PNG, JPG, SVG
- Maximum file size: 2MB
- Files are automatically deleted when template is deleted
Active Template Logic
- Only one template can be active at a time
- Activating a template automatically deactivates all others
- Handled in the model's
boot()method using an event listener - If no active template exists, default template data is used
Canvas Rendering
- Certificates use HTML5 Canvas for download generation
- Ensures high-quality, resolution-independent output
- Supports both PNG and PDF formats
- Font rendering uses system fonts for consistency
Future Enhancements
Potential features for future versions:
- Multiple layout templates (portrait, landscape, different designs)
- Signature field support
- QR code for certificate verification
- Email certificate directly to students
- Certificate expiration dates
- Multi-language support for certificate text
- Custom field placeholders (e.g., instructor name, course duration)
- Certificate analytics and download tracking
Troubleshooting
Logo not displaying
- Ensure
php artisan storage:linkhas been run - Check file permissions on storage directory
- Verify logo file was uploaded successfully
Template not saving
- Check browser console for errors
- Verify CSRF token is valid
- Ensure all required fields are filled
Download not working
- Check browser console for errors
- Ensure jsPDF is installed
- Try different download format (PNG vs PDF)
Support
For issues or questions, please contact the development team or create an issue in the project repository.
Structure
┌─────────────┐ ┌──────────────────┐ ┌─────────────┐ │ Admin │────────>│ Template CRUD │────────>│ Database │ │ Dashboard │ │ Controller │ │ (JSON) │ └─────────────┘ └──────────────────┘ └─────────────┘ │ v ┌─────────────┐ ┌──────────────────┐ ┌─────────────┐ │ Student │────────>│ Certificate │────────>│ Active │ │ Download │ │ Controller │ │ Template │ └─────────────┘ └──────────────────┘ └─────────────┘