feat(cms): 案例/文章列表与详情改读 publishTime
配合后端拆出独立的 publish_time 列(见 ADR 0016)。 - 案例列表/详情、文章列表/详情统一取 publishTime,不再回退 createTime (createTime 是系统记录时间,运营没设过,展示它等于显示错误值) - 案例详情页标签由「项目时间」更正为「发布时间」,并补 dayjs 格式化 (原先直出 2026-09-23 19:06:37 完整时间戳) - server/utils/case.ts 废弃 projectTime,改为输出 publishTime - CaseItem 类型同步 仅改 template-07:其余 9 套模板的 CaseDetail 仍读已废弃的 projectTime, 因 CaseItem 带索引签名不会报编译错误,只会在换模板时静默显示创建时间。 该技术债已记入 docs/adr/0016 的「后果」一节,换模板前须先补这 9 套。
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
<span v-if="caseItem.clientName" class="px-3 py-1 bg-blue-50 text-blue-600 rounded-full">
|
<span v-if="caseItem.clientName" class="px-3 py-1 bg-blue-50 text-blue-600 rounded-full">
|
||||||
{{ caseItem.clientName }}
|
{{ caseItem.clientName }}
|
||||||
</span>
|
</span>
|
||||||
<span v-if="caseItem.projectTime">项目时间:{{ caseItem.projectTime }}</span>
|
<span v-if="caseItem.publishTime">发布时间:{{ formatDate(caseItem.publishTime) }}</span>
|
||||||
<span v-if="caseItem.categoryName">行业:{{ caseItem.categoryName }}</span>
|
<span v-if="caseItem.categoryName">行业:{{ caseItem.categoryName }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import dayjs from 'dayjs'
|
||||||
import type { CaseItem } from '~/types'
|
import type { CaseItem } from '~/types'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,4 +54,9 @@ const { fileUrl } = useFileUrl()
|
|||||||
const { data: caseItem } = await useFetch<CaseItem | null>(`/api/case/detail?id=${id}`, {
|
const { data: caseItem } = await useFetch<CaseItem | null>(`/api/case/detail?id=${id}`, {
|
||||||
key: `case-${id}`
|
key: `case-${id}`
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function formatDate(date?: string) {
|
||||||
|
if (!date) return ''
|
||||||
|
return dayjs(date).format('YYYY-MM-DD')
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<NuxtLink :to="`/case/${item.id}`" class="block py-4 group">
|
<NuxtLink :to="`/case/${item.id}`" class="block py-4 group">
|
||||||
<div class="flex items-baseline gap-4">
|
<div class="flex items-baseline gap-4">
|
||||||
<span class="shrink-0 text-xs text-gray-400 tabular-nums">
|
<span class="shrink-0 text-xs text-gray-400 tabular-nums">
|
||||||
{{ formatDate(item.projectTime || item.createTime) }}
|
{{ formatDate(item.publishTime) }}
|
||||||
</span>
|
</span>
|
||||||
<h2 class="flex-1 min-w-0 text-base text-gray-900 truncate group-hover:text-blue-600 transition-colors">
|
<h2 class="flex-1 min-w-0 text-base text-gray-900 truncate group-hover:text-blue-600 transition-colors">
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<span v-if="article.categoryName" class="px-3 py-1 bg-blue-50 text-blue-600 rounded-full">
|
<span v-if="article.categoryName" class="px-3 py-1 bg-blue-50 text-blue-600 rounded-full">
|
||||||
{{ article.categoryName }}
|
{{ article.categoryName }}
|
||||||
</span>
|
</span>
|
||||||
<span>发布时间:{{ formatDate(article.publishTime || article.createTime) }}</span>
|
<span v-if="article.publishTime">发布时间:{{ formatDate(article.publishTime) }}</span>
|
||||||
<span v-if="article.author">作者:{{ article.author }}</span>
|
<span v-if="article.author">作者:{{ article.author }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
class="flex items-baseline gap-4 py-4 group"
|
class="flex items-baseline gap-4 py-4 group"
|
||||||
>
|
>
|
||||||
<span class="shrink-0 text-xs text-gray-400 tabular-nums">
|
<span class="shrink-0 text-xs text-gray-400 tabular-nums">
|
||||||
{{ formatDate(item.publishTime || item.createTime) }}
|
{{ formatDate(item.publishTime) }}
|
||||||
</span>
|
</span>
|
||||||
<span class="flex-1 min-w-0 text-base text-gray-900 truncate group-hover:text-blue-600 transition-colors">
|
<span class="flex-1 min-w-0 text-base text-gray-900 truncate group-hover:text-blue-600 transition-colors">
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
|
|||||||
+3
-1
@@ -417,7 +417,8 @@ export interface CaseItem {
|
|||||||
categoryId?: number
|
categoryId?: number
|
||||||
categoryName?: string
|
categoryName?: string
|
||||||
clientName?: string
|
clientName?: string
|
||||||
projectTime?: string
|
/** 发布时间:运营可见的对外时间,列表与详情展示、排序的锚点 */
|
||||||
|
publishTime?: string
|
||||||
tags?: string[]
|
tags?: string[]
|
||||||
sortNumber?: number
|
sortNumber?: number
|
||||||
status?: number
|
status?: number
|
||||||
@@ -425,6 +426,7 @@ export interface CaseItem {
|
|||||||
top?: number
|
top?: number
|
||||||
/** 推荐标识:1=推荐(当前上游 cms-case 表暂无此字段,预留以便后续版本自动生效) */
|
/** 推荐标识:1=推荐(当前上游 cms-case 表暂无此字段,预留以便后续版本自动生效) */
|
||||||
recommend?: number
|
recommend?: number
|
||||||
|
/** 创建时间:系统记录时间,官网不展示 */
|
||||||
createTime?: string
|
createTime?: string
|
||||||
updateTime?: string
|
updateTime?: string
|
||||||
[key: string]: unknown
|
[key: string]: unknown
|
||||||
|
|||||||
@@ -26,9 +26,10 @@ export function normalizeCaseItem(raw: any): CaseItem {
|
|||||||
categoryName: raw.categoryName ?? '',
|
categoryName: raw.categoryName ?? '',
|
||||||
// 客户(后端字段名 customer)→ 前端 clientName
|
// 客户(后端字段名 customer)→ 前端 clientName
|
||||||
clientName: raw.customer ?? raw.clientName ?? '',
|
clientName: raw.customer ?? raw.clientName ?? '',
|
||||||
// 行业 / 项目时间(后端无 projectTime 字段,回退到创建时间)
|
|
||||||
industry: raw.industry ?? '',
|
industry: raw.industry ?? '',
|
||||||
projectTime: raw.projectTime ?? raw.createTime ?? '',
|
// 发布时间:运营可见的对外时间,官网展示与排序的锚点(后端 cms_case.publish_time)。
|
||||||
|
// 不再回退 createTime——那是系统记录时间,运营没设过,展示它等于显示错误值。
|
||||||
|
publishTime: raw.publishTime ?? '',
|
||||||
// 关联产品(后端 productUsed)作为标签兜底
|
// 关联产品(后端 productUsed)作为标签兜底
|
||||||
tags: raw.productUsed ? [raw.productUsed] : (raw.tags ?? []),
|
tags: raw.productUsed ? [raw.productUsed] : (raw.tags ?? []),
|
||||||
// 排序 / 状态 / 浏览量
|
// 排序 / 状态 / 浏览量
|
||||||
|
|||||||
Reference in New Issue
Block a user