Files
pengzhan.dev/views/pages/admin-seo.ejs
T
haopengzhan 8c0b04db0e 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
2026-09-16 23:08:53 -07:00

49 lines
2.4 KiB
Plaintext

<%- 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 &bull; 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' }) %>