feat: 添加 GitHub 统计数据展示功能

新增 GitHub 统计卡片和徽章组件,在项目卡片、详情页和侧边栏中展示 GitHub stars、forks 等统计数据

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-30 14:14:02 +08:00
co-authored by Claude
parent 443dc8370e
commit cae5686d2d
12 changed files with 1766 additions and 41 deletions
+40 -8
View File
@@ -1,5 +1,8 @@
import Link from 'next/link'
import Image from 'next/image'
import { getTranslations } from 'next-intl/server'
import { GitHubStatsCompact } from './GitHubBadges'
import { getGitHubBadgesFromLinks } from '@/lib/github/badges'
interface ProjectCardProps {
project: {
@@ -15,6 +18,12 @@ interface ProjectCardProps {
nameEn?: string | null
slug: string
}>
links?: Array<{
id: string
type: string
url: string
title?: string | null
}>
}
locale: string
featured?: boolean
@@ -37,6 +46,9 @@ export async function ProjectCard({ project, locale, featured = false }: Project
const displayName = locale === 'en' && project.nameEn ? project.nameEn : project.name
const displayDescription = locale === 'en' && project.descriptionEn ? project.descriptionEn : project.description
// Generate GitHub badge URLs
const badges = project.links ? getGitHubBadgesFromLinks(project.links as any) : { stars: null, forks: null }
// Helper to get display name for tag based on locale
const getTagName = (tag: { name: string; nameEn?: string | null }) => {
return locale === 'en' && tag.nameEn ? tag.nameEn : tag.name
@@ -73,14 +85,34 @@ export async function ProjectCard({ project, locale, featured = false }: Project
))}
</div>
{/* View Details Link */}
<Link
href={`/${locale}/projects/${project.slug}`}
className="inline-flex items-center font-display font-bold text-sm uppercase hover:text-secondary dark:hover:text-primary group"
>
{t('viewDetails')}{' '}
<span className="ml-1 transform group-hover:translate-x-1 transition-transform"></span>
</Link>
{/* Footer with View Details and Stars */}
<div className="flex items-center justify-between mt-auto">
{/* View Details Link */}
<Link
href={`/${locale}/projects/${project.slug}`}
className="inline-flex items-center font-display font-bold text-sm uppercase hover:text-secondary dark:hover:text-primary group"
>
{t('viewDetails')}{' '}
<span className="ml-1 transform group-hover:translate-x-1 transition-transform"></span>
</Link>
{/* GitHub Stars Badge */}
{badges.stars && (
<div className="flex items-center gap-1 text-sm text-gray-600 dark:text-gray-400">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 16 16">
<path d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z"/>
</svg>
<Image
src={badges.stars}
alt="Stars"
width={70}
height={20}
unoptimized
className="rounded"
/>
</div>
)}
</div>
</div>
</article>
)