From 74113b3e6e4f676bfa47ddefe7b8e6732b7a0c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=89=E9=91=AB=E5=8D=87?= Date: Fri, 12 Jun 2026 21:20:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=99=BA=E8=83=BD=E4=BD=93=E4=B8=8E?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增共享 formatDateTime 工具(YYYY-MM-DD HH:mm) - agent-card 卡片/列表视图在发布者下方显示创建时间 - skill 设置页 metaNodes 显示创建时间 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../components/workspace/agents/agent-card.tsx | 15 +++++++++++++++ .../workspace/settings/skill-settings-page.tsx | 9 +++++++++ frontend-web/src/core/utils/datetime.ts | 15 +++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/frontend-web/src/components/workspace/agents/agent-card.tsx b/frontend-web/src/components/workspace/agents/agent-card.tsx index 21c710f4..cfd7e8c2 100644 --- a/frontend-web/src/components/workspace/agents/agent-card.tsx +++ b/frontend-web/src/components/workspace/agents/agent-card.tsx @@ -2,6 +2,7 @@ import { BotIcon, + ClockIcon, CopyIcon, EyeOffIcon, GlobeIcon, @@ -78,6 +79,7 @@ import type { Agent, AgentQuestion, UpdateAgentRequest } from "@/core/agents"; import { getStoredAuth } from "@/core/auth"; import { useI18n } from "@/core/i18n/hooks"; import { useSkills } from "@/core/skills/hooks"; +import { formatDateTime } from "@/core/utils/datetime"; import { desensitize } from "@/lib/desensitize"; import { cn } from "@/lib/utils"; @@ -605,6 +607,17 @@ export function AgentCard({ agent, layout = "card", onPublisherClick }: AgentCar ) : null; + const createdAtText = formatDateTime(agent.created_at); + const createdAtNode = createdAtText ? ( +
+ + 创建时间:{createdAtText} +
+ ) : null; + // 技能英文名 → 中文名映射,用于把智能体的技能徽章显示为中文(agent.skills 只存英文名)。 const skillNameZhMap = useMemo(() => { const map = new Map(); @@ -820,6 +833,7 @@ export function AgentCard({ agent, layout = "card", onPublisherClick }: AgentCar )} {publisherNode &&
{publisherNode}
} + {createdAtNode &&
{createdAtNode}
} {(agent.tags?.length ?? 0) > 0 && ( @@ -866,6 +880,7 @@ export function AgentCard({ agent, layout = "card", onPublisherClick }: AgentCar

)} {publisherNode &&
{publisherNode}
} + {createdAtNode &&
{createdAtNode}
}
{showActionRow && actionButtons} diff --git a/frontend-web/src/components/workspace/settings/skill-settings-page.tsx b/frontend-web/src/components/workspace/settings/skill-settings-page.tsx index 916c83ca..9c16d7e9 100644 --- a/frontend-web/src/components/workspace/settings/skill-settings-page.tsx +++ b/frontend-web/src/components/workspace/settings/skill-settings-page.tsx @@ -86,6 +86,7 @@ import { } from "@/core/skills/hooks"; import { usePublishSquares, useViewMode } from "@/core/system-settings/hooks"; import type { Skill } from "@/core/skills/type"; +import { formatDateTime } from "@/core/utils/datetime"; import { env } from "@/env"; import { desensitize } from "@/lib/desensitize"; import { cn } from "@/lib/utils"; @@ -848,6 +849,14 @@ export function SkillRow({ : t.settings.skills.useCountInlineZero}
)} + {formatDateTime(skill.created_at) && ( +
+ + + 创建时间:{formatDateTime(skill.created_at)} + +
+ )} {(skill.tags?.length ?? 0) > 0 && ( )} diff --git a/frontend-web/src/core/utils/datetime.ts b/frontend-web/src/core/utils/datetime.ts index 3ec7203d..fea6af99 100644 --- a/frontend-web/src/core/utils/datetime.ts +++ b/frontend-web/src/core/utils/datetime.ts @@ -25,3 +25,18 @@ export function formatTimeAgo(date: Date | string | number, locale?: Locale) { locale: getDateFnsLocale(effectiveLocale), }); } + +/** + * Format a created/updated timestamp as `YYYY-MM-DD HH:mm`. + * Returns an empty string for missing or unparseable values. + */ +export function formatDateTime(value?: Date | string | number | null): string { + if (value === null || value === undefined || value === "") return ""; + const date = value instanceof Date ? value : new Date(value); + if (Number.isNaN(date.getTime())) return ""; + const pad = (n: number) => String(n).padStart(2, "0"); + return ( + `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` + + `${pad(date.getHours())}:${pad(date.getMinutes())}` + ); +}