Files
nl-blogs/client/src/pages/Columns.vue
2026-01-16 17:03:34 +08:00

71 lines
2.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<section class="page-section block animate-slide-down">
<div class="max-w-6xl mx-auto pt-32 px-6 pb-20">
<div class="mb-16 text-center">
<h2 class="font-serif text-5xl italic text-white mb-6">专栏</h2>
<p class="text-art-muted max-w-lg mx-auto mb-8">系列文章集合系统性地学习</p>
</div>
<!-- Loading state -->
<div v-if="loading" class="flex justify-center items-center h-64">
<div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-art-accent"></div>
</div>
<!-- Columns Grid -->
<div v-else class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div
v-for="column in columns"
:key="column.id"
class="group relative overflow-hidden rounded-xl border border-white/5 bg-white/5 aspect-[16/9] cursor-pointer"
@click="router.push(`/columns/${column.id}`)"
>
<!-- Cover Image -->
<div
v-if="column.cover"
class="absolute inset-0 bg-cover bg-center transition-transform duration-700 group-hover:scale-105"
:style="{ backgroundImage: `url(${column.cover})` }"
>
<div class="absolute inset-0 bg-black/60 group-hover:bg-black/50 transition-colors duration-500"></div>
</div>
<div v-else class="absolute inset-0 bg-gradient-to-br from-white/5 to-white/10 group-hover:from-white/10 group-hover:to-white/20 transition-colors"></div>
<!-- Content -->
<div class="absolute inset-0 p-8 flex flex-col justify-end">
<h3 class="text-3xl font-serif text-white mb-3 group-hover:text-art-accent transition-colors">{{ column.name }}</h3>
<p class="text-art-muted leading-relaxed line-clamp-2">{{ column.description || '暂无描述' }}</p>
<div class="mt-4 opacity-0 group-hover:opacity-100 transition-opacity duration-300 transform translate-y-2 group-hover:translate-y-0">
<span class="text-xs font-bold tracking-widest uppercase text-white border-b border-art-accent pb-1">查看详情</span>
</div>
</div>
</div>
</div>
<div v-if="!loading && columns.length === 0" class="text-center py-20 text-art-muted">
暂无专栏
</div>
</div>
</section>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { fetchColumns, Column } from '../services/api'
const router = useRouter()
const columns = ref<Column[]>([])
const loading = ref(true)
onMounted(async () => {
try {
const data = await fetchColumns()
// Filter active columns
columns.value = data.filter(c => c.isActive === 1)
} catch (error) {
console.error('Failed to fetch columns:', error)
} finally {
loading.value = false
}
})
</script>