Browsers cached the pre-fix 404 responses for /static/js/markdown.js and
/static/css/markdown.css (responses carry Cache-Control max-age=14400),
so users kept seeing broken pages after redeploy. A versioned query
string forces clients to refetch the assets; bump ?v= whenever the
static files change.
The merged markdown-rendering change served /static from a disk directory,
but the live deployment only replaced the binary and templates, so
/static/js/markdown.js and /static/css/markdown.css 404'd and every
article/comment rendered empty (BlogMD was undefined and threw).
- main.go: serve /static from an embedded FS (go:embed) — deployments
now only need to replace the executable; no static dir to copy.
- install_linux.sh: drop the static directory copy (no longer needed).
- article.html / comment_list.html: if BlogMD is unavailable, fall back
to plain (HTML-escaped) text for the article body, comment bodies and
the comment preview, so content is never blank.
- README: document the static/ directory.
Verified locally: /static/* serve 200 even with the disk directory
removed; normal render path (25 checks) and the fallback path both pass.
- Add shared BlogMD renderer (static/js/markdown.js): marked + DOMPurify
+ highlight.js pipeline with GFM support, heading id slugger with
CJK-aware anchors, syntax highlighting, per-block copy button and
language badge, lazy images with lightbox, external links opened
safely in new tabs, tables wrapped for small screens.
- Add .md-body typography styles (static/css/markdown.css) so articles,
comments and editor previews render with proper headings, tables,
lists, blockquotes and code blocks (previously the prose classes had
no effect because the Tailwind typography plugin is not loaded).
- Fix marked options that were set after parsing and removed from
marked v4+ (mangle/headerIds no-ops).
- Pin CDN versions (marked 15.0.12, dompurify 3.4.13, highlight.js
11.12.0) instead of floating 'latest' URLs.
- Wire EasyMDE preview/side-by-side to BlogMD in admin and user
article editors; use BlogMD for comment bodies on the article page,
admin comment list and comment preview.
- Serve /static in main.go and deploy it in install_linux.sh.
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>
Features:
- Tag system with multi-language support (Chinese/English)
- Auto-create tags when associating with articles
- Tag filtering on homepage with visual indicators
- Full-text search across title, summary, and content
- Tag cloud sidebar showing article counts
- Search page with results display
Technical Implementation:
- Database models: Tag, ArticleTag (many-to-many)
- Tag count caching for performance
- Automatic tag slug generation
- Responsive design with mobile support
- I18n support for all new UI elements
Bug Fix:
- Fixed SQL column ambiguity error in tag filtering
- Added table prefix to ORDER BY clause in publishedArticleOrder
Routes:
- GET /search - Search results page
- GET /?tag=<slug> - Filter articles by tag
- GET /api/articles?tag=<slug> - API with tag filter support
Templates:
- Added tag input field to article create/edit form
- Added search box to homepage header
- Added tag cloud sidebar on homepage and search page
- Created new search results page template
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add blog icon to homepage welcome title
- Newspaper/blog icon (48px, blue)
- Centered with flex layout
- Add lightning icon to homepage subtitle
- Lightning bolt icon (24px, gray)
- Represents speed and modern tech
- Add home icon to navigation home link
- House icon with clean design
- Consistent styling with other nav elements
- Add login icon to navigation login link
- Login/sign-in icon
- Only shown when user is not logged in
- Use Heroicons SVG for consistency
- Responsive and accessible design
- Smooth hover transitions
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add custom publish time field to article create/edit forms
- Support datetime-local input for manual time setting
- Auto-set on first publish if left blank
- Works for both admin and user article forms
- Display last updated time on article detail page
- Show both published time and last updated time
- Auto-maintained by GORM on each update
- Format: YYYY-MM-DD HH:MM
- Add i18n support for new fields
- article_published_at: Published Time / 发布时间
- article_published_at_hint: Leave blank to auto-set on publish / 留空则在发布时自动设置
- article_last_updated: Last Updated / 最后更新
- Update handlers and templates
- handlers/article.go: Add parsePublishedAt/formatPublishedAt functions
- handlers/home.go: Add formatUpdateTime function
- handlers/my_articles.go: Support custom publish time in user articles
- templates: Add datetime-local inputs and time display
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add Favicon field to SiteSetting model with FaviconIsURL() helper
- Implement favicon upload and management in site settings page
- Support both external URL and local file upload for favicon
- Add favicon display in page header with automatic URL detection
- Add i18n translations for favicon settings (EN/ZH)
- Update middleware and helpers to pass favicon data to templates
- Include migration script for existing databases
Users can now customize their site's favicon from /admin/settings/site
by either providing an external URL or uploading a local image file
(recommended formats: .ico, .png, .svg, 16x16 or 32x32 pixels).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add single-column layout for homepage articles
- Implement smart image positioning based on aspect ratio:
* Landscape images (ratio > 1.2) displayed on top
* Portrait/square images (ratio ≤ 1.2) displayed on left side
- Add infinite scroll with lazy loading
- Create new API endpoint /api/articles for pagination
- Add loading indicator and 'no more articles' message
- Optimize performance with image lazy loading and scroll throttling
- Add responsive layout for mobile devices
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Remove restriction that prevented setting display_name to empty
- Users can now clear display name to fall back to username display
- Trim whitespace from display_name input
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Show display name (or username as fallback) next to avatar
- Improve UI readability and user experience
- Avatar and name together act as dropdown trigger
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add AdminRequired middleware to all /admin routes for proper authorization
- Restrict admin panel, comments, users, settings to admin role only
- Create separate /my/articles routes for regular users to manage their own articles
- Add MyArticlesPage handler for users to view/edit/delete their own content
- Update navigation menus with role-based visibility
- Admin dropdown shows only 'Admin Panel' link, other features in dashboard
- Regular users see 'My Articles' link in profile dropdown
- Add i18n translations for 'my_articles' and 'comment_manage' keys
- Fix permission boundary issues where author role could access admin settings
Security improvements:
- Platform settings now require admin role
- Comment moderation requires admin role
- User management requires admin role
- Regular users can only manage their own articles
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>