This commit is contained in:
hailin 2025-03-25 10:43:28 +08:00
parent ea5db27394
commit 5bd546069c
2 changed files with 70 additions and 59 deletions

View File

@ -16,6 +16,8 @@ import { Header, NavBack, TimeP } from "@/components/header";
import { baseTitle, baseURL, keywordsRoot } from "@/lib/metadata"; import { baseTitle, baseURL, keywordsRoot } from "@/lib/metadata";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { DetailPageHeader } from '@/components/header'
export const runtime = "nodejs"; export const runtime = "nodejs";
type Props = { type Props = {
@ -89,7 +91,7 @@ const BlogArticleWrapper = async ({ params }: { params: { slug: string, locale:
<div className="relative mt-0 flex flex-col items-start space-y-8 lg:mt-2 lg:flex-row lg:space-y-0 "> <div className="relative mt-0 flex flex-col items-start space-y-8 lg:mt-2 lg:flex-row lg:space-y-0 ">
<div className="mx-auto pt-[3rem] lg:pt-[0] "> <div className="mx-auto pt-[3rem] lg:pt-[0] ">
<div className="flex items-start space-x-[0.2rem] text-left text-[0.8rem] lg:text-[1rem] mb-8 text-[#808080] leading-[1.4rem] lg:leading-[4rem]"> {/* <div className="flex items-start space-x-[0.2rem] text-left text-[0.8rem] lg:text-[1rem] mb-8 text-[#808080] leading-[1.4rem] lg:leading-[4rem]">
<Link <Link
href="/" href="/"
@ -103,7 +105,6 @@ const BlogArticleWrapper = async ({ params }: { params: { slug: string, locale:
</div> </div>
<div className="flex items-start font-bold space-x-[2rem] text-[0.8rem] lg:text-[1.125rem] text-[#1A1A1A] leading-[1.5rem] lg:leading-[3rem] mb-[2rem]"> <div className="flex items-start font-bold space-x-[2rem] text-[0.8rem] lg:text-[1.125rem] text-[#1A1A1A] leading-[1.5rem] lg:leading-[3rem] mb-[2rem]">
{/* <h4 className="border rounded-full bg-[#E5E5E5] px-[1.8rem]">All Blogs </h4> */}
{ {
frontmatter.tags && frontmatter.tags?.length > 0 && frontmatter.tags?.map((item, index) => { frontmatter.tags && frontmatter.tags?.length > 0 && frontmatter.tags?.map((item, index) => {
return <h4 className="border rounded-full bg-[#E5E5E5] px-[1.8rem]">{item}</h4> return <h4 className="border rounded-full bg-[#E5E5E5] px-[1.8rem]">{item}</h4>
@ -112,13 +113,15 @@ const BlogArticleWrapper = async ({ params }: { params: { slug: string, locale:
</div> </div>
<TimeP date={frontmatter.date} /> <TimeP date={frontmatter.date} />
<h2 className="text-left text-[1rem] leading-[1.625rem] mb-[1rem] font-bold tracking-tight text-[#1A1A1A] sm:text-[1rem] lg:text-[1.5rem] lg:leading-[7.625rem]"> <h2 className="text-left text-[1rem] leading-[1.625rem] mb-[1rem] font-bold tracking-tight text-[#1A1A1A] sm:text-[1rem] lg:text-[1.5rem] lg:leading-[7.625rem]">
{frontmatter.title} {frontmatter.title}
</h2> </h2> */}
<DetailPageHeader/>
<figure <figure
className="w-full min-h-[146px] lg:min-h-[246px]" className="w-full min-h-[146px] lg:min-h-[246px]"
// style={{ width: '100%', minHeight: "246px" }}
> >
<img src={ <img src={
( (

View File

@ -37,6 +37,8 @@ import { useTranslation } from 'react-i18next'
import { message } from 'antd' import { message } from 'antd'
import { LogoAI } from '@/components/chat' import { LogoAI } from '@/components/chat'
import { useState } from "react";
export function Header() { export function Header() {
@ -103,70 +105,76 @@ export function Header() {
} }
export function DetailPageHeader() {
const router = useRouter();
const { t } = useTranslation();
const [userData, setUserData] = useLocalStorage( export function DetailPageHeader({ data }: { data: any }) {
'UserData', const [loading, setLoading] = useState(false);
{ const [statusText, setStatusText] = useState(data?.statusText || "加载中...");
auth_token: "",
id: 1, // 模拟调用 API
login_ip: "", const handleClick = async (source: "icon" | "info") => {
login_time: 0, setLoading(true);
role: "", setStatusText(source === "icon" ? "正在处理图标操作..." : "正在处理信息操作...");
user_name: "", try {
version: "" // 模拟 API 请求
} as UserData const res = await fetch("/api/stub", {
) method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ source })
});
// 假装等待响应
await new Promise((resolve) => setTimeout(resolve, 1000));
setStatusText(`操作成功:来自${source === "icon" ? "图标" : "信息区域"}`);
} catch (err) {
setStatusText("操作失败");
} finally {
setLoading(false);
}
};
const soonFunc = () => {
message.info(t("soon"))
}
//w-11/12 sm:w-5/6 md:w-3/4 lg:w-2/3 xl:w-3/5 2xl:w-1/2
return ( return (
<header className="sticky top-0 z-50 flex shrink-0 items-center justify-between bg-background px-4 py-[1.5rem] w-[80%] mx-auto"> <div className="w-[80%] mx-auto border rounded-xl p-6 shadow-md bg-white space-y-6">
{/* 上方内容区域 */}
<div className="flex items-start space-x-6">
{/* 左侧图标区域 - 可点击 */}
<button
className="flex items-center justify-center w-32 h-32 border rounded-md text-xl font-bold hover:bg-gray-100 transition"
onClick={() => handleClick("icon")}
disabled={loading}
>
{data?.icon || "Deploy"}
</button>
<a href="/"> {/* 右侧信息区域 - 可点击 */}
<LogoAI className="flex text-center ml-0" /> <div
</a> className="text-sm leading-7 space-y-1 cursor-pointer hover:bg-gray-50 p-2 rounded transition"
onClick={() => handleClick("info")}
<div className="flex items-center justify-between "> >
<div className="flex items-center "> <p><strong></strong>{data?.name || "未命名组件"}</p>
{(!!userData && !!userData.user_name) ? ( <p><strong></strong>{data?.category || "未知"}</p>
<div className='flex text-[#1A1A1A]'> <p><strong></strong>{data?.updated_at || "未提供"}</p>
<UserMenu user={userData} /> <p><strong></strong>{data?.company || "未知公司"}</p>
</div>
) : (
<div className='flex gap-4 grid-cols-2 text-[#1A1A1A]'>
<Button variant="ghost" className='text-base bg-[#f4f4f5] hover:bg-[#e5e7eb]'>
<Link href="/#subscribe-target"
>
{t('subscribe.subscribe')}
</Link>
</Button>
<LoginButton
variant="ghost"
// variant="link"
showGithubIcon={true}
text={t('login')}
className="-ml-2 text-base bg-[#f4f4f5] hover:bg-[#e5e7eb]"
/>
</div>
)}
</div> </div>
</div> </div>
</header> {/* 底部进度条或状态条 */}
) <div className="w-full bg-gray-200 rounded-full h-6 overflow-hidden">
<div
className="bg-blue-500 h-full text-white text-center text-sm flex items-center justify-center transition-all duration-300"
style={{ width: data?.progress || "60%" }}
>
{loading ? "操作中..." : statusText}
</div>
</div>
</div>
);
} }
// export function Header() { // export function Header() {
// const router = useRouter(); // const router = useRouter();