Files
go_blog/.claude/plans/nav_links_management.md
T
kevinandClaude Fable 5 d9bb91af00 feat: add navigation links management and user registration
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>
2026-06-22 21:01:38 +08:00

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 *Zh and *En fields
  • 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 action form 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 /admin group 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

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 []NavLink field 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 link
  • action=toggle - enable/disable link
  • action=delete - remove link
  • action=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" when OpenNew is 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

  1. Create database model (models/nav_link.go)
  2. Update database migration (models/db.go)
  3. Update config cache (models/config_cache.go)
  4. Add i18n translations (i18n/i18n.go)
  5. Create backend handlers (handlers/settings.go)
  6. Create admin template (templates/admin/settings_navlinks.html)
  7. Update frontend header (templates/layouts/base.html)
  8. Add routes (main.go)
  9. 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 Sort field
  • 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" with target="_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