Features: - Custom navigation links management in admin settings - Multi-language support for navigation links (Chinese/English) - Control link behavior (open in new window) - Sort order and enable/disable toggle for nav links - User registration system with validation - Admin can enable/disable user registration - Registration form with username, display name, email, password - Link to registration from login page Navigation Links: - Admin interface to add/edit/delete custom nav links - Support for both internal and external URLs - Display links in header navigation bar - Respects language preference User Registration: - Username validation (3-32 characters, alphanumeric + underscore/dash) - Password validation (minimum 6 characters) - Password confirmation matching - Optional display name and email fields - Can be toggled on/off by admin in site settings Templates: - Added navigation links settings page - Added user registration page - Updated login page with registration link - Updated base layout to render custom nav links Documentation: - NAV_LINKS_FEATURE.md - Navigation links feature documentation - REGISTRATION_FEATURE.md - User registration documentation - IMPLEMENTATION_SUMMARY.md - Overall implementation summary Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6.6 KiB
6.6 KiB
Navigation Links Management - Implementation Plan
Overview
Add a navigation links management feature that allows admins to configure custom links in the header navigation, with support for controlling whether links open in new windows.
Requirements Analysis
Based on exploration:
- User wants to add additional URLs next to "Home" in the header navigation
- Backend admin interface to manage these URLs
- Control over whether links open in new windows (target="_blank")
- The site uses a multi-language system (zh/en)
Current Architecture Patterns
Database Models
- Models are in
/models/directory - Settings tables follow singleton pattern (ID=1) like
SiteSetting,CommentConfig - Support for multi-language via
*Zhand*Enfields - Use GORM with auto-migration in
models/db.go - Config cache system exists (
models/config_cache.go,models.LoadConfigCache(),models.RefreshConfigCache())
Handlers
- Settings handlers in
handlers/settings.go - Pattern:
{Feature}SettingsPage()for GET,{Feature}SettingsSave()for POST - Uses
DefaultData(c)helper for common template data - Multi-action POST pattern with
actionform field (see upload/download settings) - Session-based user ID tracking via
userIDFromSession()
Templates
- Admin templates in
templates/admin/ - Settings pages follow consistent UI pattern (tabs, success messages)
- Header navigation in
templates/layouts/base.html(lines 24-89) - Current navigation shows: Logo/Title, Home link, Login/User dropdown
Routing
- Admin routes under
/admingroup with auth + admin middleware - Settings routes:
/admin/settings/site,/admin/settings/upload, etc.
i18n
- Translation keys in
i18n/i18n.go - Follows pattern:
"feature_field_lang"or"feature_action" - Both EN and ZH translations required
Proposed Implementation
1. Database Model: NavLink
Create models/nav_link.go:
type NavLink struct {
ID uint `gorm:"primarykey"`
TitleZh string `gorm:"size:100;not null"` // Link text (Chinese)
TitleEn string `gorm:"size:100;not null"` // Link text (English)
URL string `gorm:"size:512;not null"` // Target URL
OpenNew bool `gorm:"default:false"` // Open in new window
Enabled bool `gorm:"default:true"` // Show/hide link
Sort int `gorm:"default:0;index"` // Display order
CreatedAt time.Time
UpdatedAt time.Time
UpdatedBy uint `gorm:"index"`
}
// Helper methods
func (n *NavLink) Title(lang string) string {
// Return title for language with fallback
}
2. Database Migration
Add to models/db.go AutoMigrate():
- Add
&NavLink{}to the migration list
3. Config Cache Integration
Update models/config_cache.go:
- Add
NavLinks []NavLinkfield to cache struct - Load nav links in
LoadConfigCache() - Make available to all handlers via middleware
4. Backend Handler
Add to handlers/settings.go:
// NavLinksSettingsPage - render nav links management page
func NavLinksSettingsPage(db *gorm.DB) gin.HandlerFunc
// NavLinksSettingsSave - handle actions: add, toggle, delete, reorder
func NavLinksSettingsSave(db *gorm.DB) gin.HandlerFunc
// Helper functions:
// - addNavLink()
// - toggleNavLink()
// - deleteNavLink()
// - reorderNavLink()
Actions via POST form field:
action=add- create new linkaction=toggle- enable/disable linkaction=delete- remove linkaction=edit- update link details
5. Admin Template
Create templates/admin/settings_navlinks.html:
- Settings page with tab navigation matching existing pattern
- Form to add new links (Title ZH/EN, URL, Open in new window checkbox)
- List of existing links with:
- Enable/disable toggle
- Edit inline or modal
- Delete button
- Sort order controls (up/down arrows or drag)
- Success message display
- Consistent styling with other settings pages
6. Frontend Template Updates
Update templates/layouts/base.html:
- Modify navigation section (around line 36-42) to render nav links
- Loop through cached nav links after "Home" link
- Apply language-specific titles
- Add
target="_blank"whenOpenNewis true - Maintain consistent styling with existing nav items
7. Routing
Add to main.go settings group (around line 110-121):
settings.GET("/navlinks", handlers.NavLinksSettingsPage(db))
settings.POST("/navlinks", handlers.NavLinksSettingsSave(db))
8. i18n Translations
Add to i18n/i18n.go for both EN and ZH:
"settings_navlinks_title": "Navigation Links"
"settings_navlinks_desc": "Manage custom links in the header navigation"
"navlinks_add": "Add Link"
"navlinks_title_zh": "Link Text (Chinese)"
"navlinks_title_en": "Link Text (English)"
"navlinks_url": "URL"
"navlinks_open_new": "Open in new window"
"navlinks_enabled": "Enabled"
"navlinks_edit": "Edit"
"navlinks_delete": "Delete"
"navlinks_confirm_delete": "Are you sure you want to delete this link?"
"navlinks_no_links": "No navigation links configured yet."
Implementation Order
- Create database model (
models/nav_link.go) - Update database migration (
models/db.go) - Update config cache (
models/config_cache.go) - Add i18n translations (
i18n/i18n.go) - Create backend handlers (
handlers/settings.go) - Create admin template (
templates/admin/settings_navlinks.html) - Update frontend header (
templates/layouts/base.html) - Add routes (
main.go) - Test the feature
Design Decisions
Why not singleton table?
- Multiple nav links needed (vs single config)
- Better suited for a regular table with multiple rows
- Easier to add/remove/reorder individual links
Sort order implementation
- Use integer
Sortfield - Lower numbers appear first
- Admin can adjust via up/down buttons or explicit number input
Cache integration
- Nav links loaded into cache at startup and on refresh
- Avoids DB query on every page load
- Consistent with existing upload/comment config pattern
Open in new window
- Boolean field
OpenNew - Renders as
target="_blank" rel="noopener noreferrer"when true - Security: always include
rel="noopener noreferrer"withtarget="_blank"
Testing Checklist
- Create new nav link via admin
- Nav link appears in header navigation
- Correct language displayed based on user preference
- "Open in new window" works correctly
- Enable/disable toggle works
- Delete link works
- Sort order affects display order
- Links render correctly for logged-in and anonymous users
- Multiple links display properly
- External and internal URLs both work
- Mobile responsive layout maintained