refactor(milestone): 调整里程碑数据结构与展示逻辑

1. 将milestone的images数组改为单个可选image字段
2. 移除多余的图片计数标签样式与逻辑
3. 更新revalidate接口默认缓存策略为全量标签
4. 调整eslint配置与next缓存配置适配开发环境
This commit is contained in:
刘宇阳
2026-07-09 16:32:33 +08:00
parent 0ada4278d4
commit 38ac6675d9
6 changed files with 26 additions and 39 deletions

View File

@@ -13,12 +13,16 @@ export default defineConfig([
},
{
files: ['**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
plugins: { js },
extends: ['js/recommended'],
languageOptions: { globals: globals.browser },
},
{
files: ['next.config.mjs', '*.config.{js,mjs,cjs}'],
languageOptions: { globals: globals.node },
},
{
files: ['**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
languageOptions: { globals: globals.browser },
plugins: { js },
extends: ['js/recommended'],
},
{
plugins: {

View File

@@ -1,4 +1,6 @@
/** @type {import('next').NextConfig} */
const isDev = process.env.NODE_ENV === 'development';
const nextConfig = {
// 关闭严格模式
reactStrictMode: false,
@@ -7,16 +9,17 @@ const nextConfig = {
cacheLife: {
config: {
// 客户端缓存时间每300秒后缓存失效重新请求服务端
stale: 300,
// 开发环境极短缓存,生产环境正常缓存
stale: isDev ? 1 : 300,
// 服务端缓存时间每3600秒后缓存失效获取最新数据如果没有过期情况下直接返回缓存的数据
revalidate: 3600,
revalidate: isDev ? 1 : 3600,
// 兜底删除24小时后缓存强制清除
expire: 86400,
expire: isDev ? 1 : 86400,
},
blog: {
stale: 300,
revalidate: 3600,
expire: 86400,
stale: isDev ? 1 : 300,
revalidate: isDev ? 1 : 3600,
expire: isDev ? 1 : 86400,
},
},
// React Compiler自动 memo减少 useMemo/useCallback 样板代码

View File

@@ -15,8 +15,8 @@ export async function POST(req: NextRequest) {
return NextResponse.json({ message: 'Invalid secret' }, { status: 401 });
}
// 默认缓存标签
let tags: string[] = [CACHE_TAGS.articles, CACHE_TAGS.config];
// 默认清空全部缓存标签
let tags: string[] = Object.values(CACHE_TAGS);
try {
// 解析请求体

View File

@@ -273,18 +273,13 @@ export default function MilestonePageClient({ list }: MilestonePageClientProps)
}}
>
<div className="card-image-wrap">
{item.event.images?.length ? (
<>
<img
className="card-image"
src={item.event.images[0]}
alt={item.event.title}
loading="lazy"
/>
{item.event.images.length > 1 ? (
<div className="card-image-count">+{item.event.images.length - 1}</div>
) : null}
</>
{item.event.image ? (
<img
className="card-image"
src={item.event.image}
alt={item.event.title}
loading="lazy"
/>
) : (
<div className="card-image" />
)}

View File

@@ -320,21 +320,6 @@
transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.milestone-page .card-image-count {
position: absolute;
right: 10px;
top: 10px;
z-index: 2;
border: 1px solid rgba(255, 255, 255, 0.22);
border-radius: 999px;
padding: 2px 8px;
background: rgba(6, 6, 15, 0.55);
color: rgba(255, 255, 255, 0.86);
font-size: 11px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.milestone-page .glass-card:hover .card-image {
transform: scale(1.06);
}

View File

@@ -3,6 +3,6 @@ export interface Milestone {
eventDate: number;
title: string;
description: string;
images: string[];
image?: string;
tags: string[];
}