feat: initial release of pengzhan.dev personal editorial blog platform
- Editorial web platform built with Node.js, Express, EJS, and Vanilla CSS - Markdown content engine with YAML frontmatter, bilingual variants, and hot-reload watcher - Unified SQLite with FTS5 search indexing, query logging, and schema filters - Centered editorial post layout with margin-docked left TOC and mobile bottom sheet - WordPress-grade comment system with moderation dashboard and bulk operations under /guanli - Complete SEO suite (JSON-LD structured data, RSS/Atom feeds, XML sitemap, robots.txt) - CI/CD workflows for linting, security audits (Gitleaks), automated tests, and Docker releases
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
<%- include('../partials/head', { pageType: 'admin' }) %>
|
||||
|
||||
<div class="container" style="padding-top: 1.5rem; max-width: 1080px;">
|
||||
<%- include('../partials/admin-header', { activeAdminTab: 'seo', stats }) %>
|
||||
|
||||
<div style="display: flex; flex-direction: column; gap: 1.5rem;">
|
||||
<% report.forEach(item => { %>
|
||||
<div style="padding: 1.5rem; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md);">
|
||||
<div style="display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 0.75rem;">
|
||||
<h3 style="font-size: 1.25rem; margin: 0;">
|
||||
<a href="/<%= item.slug %>" target="_blank">
|
||||
<%= item.title %>
|
||||
</a>
|
||||
</h3>
|
||||
<span style="font-family: var(--font-sans); font-size: 0.85rem; color: var(--color-text-muted);">
|
||||
<%= item.wordCount %> words • Title: <%= item.titleLength %> chars
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1rem;">
|
||||
<span class="pill <%= item.titleOk ? 'pill-optimal' : 'pill-warning' %>">
|
||||
Title Length: <%= item.titleOk ? 'Optimal' : (item.titleLength < 20 ? 'Too short' : 'Too long') %>
|
||||
</span>
|
||||
<span class="pill <%= item.hasExcerpt ? 'pill-optimal' : 'pill-danger' %>">
|
||||
Meta Excerpt: <%= item.hasExcerpt ? 'Present' : 'Missing or too short' %>
|
||||
</span>
|
||||
<span class="pill pill-neutral">Internal Links: <%= item.internalLinks %></span>
|
||||
<span class="pill pill-neutral">External Links: <%= item.externalLinks %></span>
|
||||
<span class="pill <%= item.imagesMissingAlt === 0 ? 'pill-optimal' : 'pill-danger' %>">
|
||||
Images: <%= item.totalImages %> (<%= item.imagesMissingAlt %> missing alt)
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<% if (item.headingIssues.length > 0) { %>
|
||||
<div style="background: #fef2f2; border-left: 3px solid #ef4444; padding: 0.6rem 0.85rem; font-size: 0.85rem; color: #991b1b; margin-top: 0.5rem;">
|
||||
<strong>Heading Warning:</strong>
|
||||
<ul style="margin: 0.25rem 0 0 1.25rem;">
|
||||
<% item.headingIssues.forEach(iss => { %>
|
||||
<li><%= iss %></li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
</div>
|
||||
<% } %>
|
||||
</div>
|
||||
<% }) %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%- include('../partials/foot', { pageType: 'admin' }) %>
|
||||
Reference in New Issue
Block a user