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

192 lines
6.6 KiB
Markdown

# 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
### 1. Database Model: `NavLink`
Create `models/nav_link.go`:
```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`:
```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):
```go
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