Skip to content

Commit 77fb02d

Browse files
yyyCodeclaude
andcommitted
feat(frontend): 首页新增 Bug 案例整屏入口模块(网站历程下方)
- 第 4 屏展示最新一篇 BUG_CASE 文章的封面 + 摘要(复用精选卡布局, 右栏用正文色放宽摘要行距,以文字描述补足单篇留白) - 无数据时占位提示,提供查看全部入口跳 /bugs - 样式与既有 home-screen 全屏滚动吸附一致 Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent 301ec51 commit 77fb02d

2 files changed

Lines changed: 139 additions & 1 deletion

File tree

‎vue/src/assets/blog.css‎

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,89 @@ html.homepage-scroll-snap {
638638
}
639639
}
640640

641+
/* ===== 第 4 屏:Bug 案例入口(整屏,展示最新一篇 Bug 复盘) ===== */
642+
.home-screen-bugs {
643+
background: var(--bg);
644+
display: flex;
645+
align-items: center;
646+
padding: 48px 24px;
647+
}
648+
649+
.home-bugs {
650+
width: 100%;
651+
max-width: 980px;
652+
margin: 0 auto;
653+
}
654+
655+
.home-bugs-head {
656+
text-align: center;
657+
margin-bottom: 28px;
658+
}
659+
660+
.home-bugs-title {
661+
margin: 0;
662+
font-size: clamp(24px, 3.5vw, 34px);
663+
font-weight: 700;
664+
letter-spacing: 0.06em;
665+
color: var(--text);
666+
}
667+
668+
.home-bugs-sub {
669+
margin: 10px 0 0;
670+
font-size: 15px;
671+
line-height: 1.7;
672+
color: var(--muted);
673+
}
674+
675+
/* 最新 Bug 卡片:复用精选卡布局,左图右文,右栏承载更多描述文字 */
676+
.home-bugs-card {
677+
cursor: pointer;
678+
}
679+
680+
.home-bugs-card .home-featured-grid {
681+
grid-template-columns: 5fr 6fr;
682+
}
683+
684+
@media (max-width: 900px) {
685+
.home-bugs-card .home-featured-grid {
686+
grid-template-columns: 1fr;
687+
}
688+
}
689+
690+
.home-bugs-card .home-featured-cover {
691+
aspect-ratio: 16 / 10;
692+
}
693+
694+
.home-bugs-card .home-featured-title {
695+
font-size: 24px;
696+
}
697+
698+
/* 摘要作为主要描述文字,用正文色并放宽行距,弥补单篇内容的留白 */
699+
.home-bugs-card .home-featured-excerpt {
700+
font-size: 16px;
701+
line-height: 1.85;
702+
color: var(--text);
703+
}
704+
705+
.home-bugs-more {
706+
display: inline-flex;
707+
margin-top: 24px;
708+
font-size: 14px;
709+
font-weight: 600;
710+
color: var(--accent);
711+
text-decoration: none;
712+
}
713+
714+
.home-bugs-more:hover {
715+
text-decoration: underline;
716+
}
717+
718+
@media (max-width: 680px) {
719+
.home-screen-bugs {
720+
padding: 40px 20px;
721+
}
722+
}
723+
641724

642725
.home-featured {
643726
padding: 18px;

‎vue/src/views/HomeView.vue‎

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,55 @@
9090
</div>
9191
</div>
9292
</section>
93+
94+
<!-- 第 4 屏:Bug 案例入口 -->
95+
<section class="home-screen home-screen-bugs">
96+
<div class="home-bugs">
97+
<div class="home-bugs-head">
98+
<h2 class="home-bugs-title">Bug 案例</h2>
99+
<p class="home-bugs-sub">开发路上踩过的坑 —— 问题现象、根因定位、解法与复盘</p>
100+
</div>
101+
102+
<div v-if="latestBug" class="card home-bugs-card" @click="go(latestBug.id)">
103+
<div class="home-featured">
104+
<div class="home-featured-grid">
105+
<div class="home-featured-cover">
106+
<img
107+
v-if="latestBug.coverMediaKey"
108+
:src="coverUrl(latestBug.coverMediaKey)"
109+
alt="cover"
110+
/>
111+
</div>
112+
<div class="home-featured-body">
113+
<div class="home-featured-badge">最新 Bug 复盘</div>
114+
<div class="home-featured-title">{{ latestBug.title }}</div>
115+
<div class="home-featured-excerpt home-bugs-excerpt">{{ latestBug.summary || '' }}</div>
116+
<div class="home-featured-meta">
117+
<span>{{ formatDate(latestBug.publishedAt) }}</span>
118+
<span>·</span>
119+
<span>{{ latestBug.authorNickname || '作者' }}</span>
120+
</div>
121+
<div class="home-featured-link">阅读完整复盘 →</div>
122+
</div>
123+
</div>
124+
</div>
125+
</div>
126+
127+
<div v-else class="card">
128+
<div class="card-body" style="padding: 22px; color: var(--muted)">暂无 Bug 案例,敬请期待</div>
129+
</div>
130+
131+
<router-link class="home-bugs-more" to="/bugs">查看全部 Bug 案例 →</router-link>
132+
</div>
133+
</section>
93134
</div>
94135
</template>
95136

96137
<script setup>
97138
import { computed, inject, onMounted, onUnmounted, ref } from 'vue'
98139
import { useRouter } from 'vue-router'
99140
100-
import { fetchArticles, fetchArticleDetail, coverUrl } from '../api/article'
141+
import { fetchArticles, fetchArticleDetail, fetchArticlesByType, coverUrl } from '../api/article'
101142
102143
const router = useRouter()
103144
const siteConfig = inject('siteConfig')
@@ -142,6 +183,19 @@ const loading = ref(true)
142183
const featuredArticle = ref({})
143184
const latestArticles = ref([])
144185
186+
// ---- 第 4 屏:Bug 案例(只取最新一篇) ----
187+
const latestBug = ref(null)
188+
189+
async function loadLatestBug() {
190+
try {
191+
const resp = await fetchArticlesByType('BUG_CASE', { page: 0, size: 1 })
192+
const items = resp?.items || []
193+
latestBug.value = items[0] || null
194+
} catch {
195+
latestBug.value = null
196+
}
197+
}
198+
145199
onMounted(async () => {
146200
enableHomepageSnap()
147201
loading.value = true
@@ -160,6 +214,7 @@ onMounted(async () => {
160214
} finally {
161215
loading.value = false
162216
}
217+
loadLatestBug()
163218
})
164219
165220
onUnmounted(() => {

0 commit comments

Comments
 (0)