--- import BaseLayout from '../../layouts/BaseLayout.astro'; import DiscoveryBrief from '../../components/seo/DiscoveryBrief.astro'; import PageViewTracker from '../../components/seo/PageViewTracker.astro'; import SharePanel from '../../components/seo/SharePanel.astro'; import TerminalWindow from '../../components/ui/TerminalWindow.astro'; import CommandPrompt from '../../components/ui/CommandPrompt.astro'; import StatsList from '../../components/StatsList.astro'; import TechStackList from '../../components/TechStackList.astro'; import { api, DEFAULT_SITE_SETTINGS } from '../../lib/api/client'; import { getI18n } from '../../lib/i18n'; import { buildDiscoveryHighlights, buildFaqJsonLd, buildPageFaqs, compactJsonLd } from '../../lib/seo'; export const prerender = false; let siteSettings = DEFAULT_SITE_SETTINGS; let systemStats = []; let techStack = []; const { locale, t } = getI18n(Astro); const isEnglish = locale.startsWith('en'); try { const [settings, posts, tags, friendLinks] = await Promise.all([ api.getSiteSettings(), api.getPosts(), api.getTags(), api.getFriendLinks(), ]); siteSettings = settings; techStack = siteSettings.techStack.map(name => ({ name })); systemStats = [ { label: t('common.posts'), value: String(posts.length) }, { label: t('common.tags'), value: String(tags.length) }, { label: t('common.friends'), value: String(friendLinks.filter(friend => friend.status === 'approved').length) }, ]; } catch (error) { console.error('Failed to load about data:', error); techStack = siteSettings.techStack.map(name => ({ name })); systemStats = [ { label: t('common.posts'), value: '0' }, { label: t('common.tags'), value: '0' }, { label: t('common.friends'), value: '0' }, ]; } const ownerInitial = siteSettings.ownerName.charAt(0) || 'T'; const siteBaseUrl = (siteSettings.siteUrl || new URL(Astro.request.url).origin).replace(/\/$/, ''); const aboutCanonicalUrl = new URL('/about', siteBaseUrl).toString(); const sharePanelCopy = isEnglish ? { badge: 'profile source', title: 'Share the profile page', description: 'Use this page as the canonical identity and capability profile so social sharing and AI search can cite one stable source.', } : { badge: '个人介绍', title: '分享个人介绍', description: '把这页作为个人介绍页分享,方便快速了解作者信息、技术栈和联系方式。', }; const aboutHighlights = buildDiscoveryHighlights([ siteSettings.ownerTitle, siteSettings.ownerBio, siteSettings.techStack.slice(0, 4).join(' / '), ]); const aboutFaqs = buildPageFaqs({ locale, pageTitle: t('about.pageTitle'), summary: siteSettings.ownerBio || siteSettings.siteDescription, primaryLabel: t('about.pageTitle'), primaryUrl: aboutCanonicalUrl, relatedLinks: [ { label: t('nav.articles'), url: `${siteBaseUrl}/articles` }, { label: t('nav.timeline'), url: `${siteBaseUrl}/timeline` }, { label: t('nav.ask'), url: `${siteBaseUrl}/ask` }, ], signals: aboutHighlights, }); const aboutFaqJsonLd = buildFaqJsonLd(aboutFaqs); const aboutJsonLd = [ { '@context': 'https://schema.org', '@type': 'AboutPage', name: `${siteSettings.ownerName} / ${siteSettings.siteName}`, description: siteSettings.siteDescription, url: aboutCanonicalUrl, inLanguage: locale, }, { '@context': 'https://schema.org', '@type': 'ProfilePage', name: siteSettings.ownerName, url: aboutCanonicalUrl, mainEntity: { '@type': 'Person', name: siteSettings.ownerName, jobTitle: siteSettings.ownerTitle, description: siteSettings.ownerBio, image: siteSettings.ownerAvatarUrl || undefined, sameAs: [ siteSettings.social.github, siteSettings.social.twitter, ].filter(Boolean), }, }, { '@context': 'https://schema.org', '@type': 'BreadcrumbList', itemListElement: [ { '@type': 'ListItem', position: 1, name: siteSettings.siteName, item: siteBaseUrl, }, { '@type': 'ListItem', position: 2, name: t('about.pageTitle'), item: aboutCanonicalUrl, }, ], }, aboutFaqJsonLd, ]; ---
identity profile

{t('about.title')}

{t('about.intro')}

{t('about.techStackCount', { count: techStack.length })}
{siteSettings.ownerAvatarUrl ? ( {siteSettings.ownerName} ) : (
{ownerInitial}
)}

{siteSettings.ownerName}

{siteSettings.ownerTitle}

{siteSettings.ownerBio}

{siteSettings.social.github && ( {t('about.contact')} GitHub )} {siteSettings.social.twitter && ( {t('about.contact')} Twitter )} {siteSettings.social.email && ( {t('about.contact')} {t('comments.email')} )} {t('about.contact')} {t('about.website')}