This commit is contained in:
parent
8d33f2bae3
commit
c2a26cac79
@ -8,6 +8,15 @@ const nextConfig: NextConfig = {
|
|||||||
env: {
|
env: {
|
||||||
APP_VERSION: process.env.npm_package_version,
|
APP_VERSION: process.env.npm_package_version,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
images: {
|
||||||
|
remotePatterns: [
|
||||||
|
{
|
||||||
|
protocol: "https",
|
||||||
|
hostname: "*",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
11
frontend/src/app/post/page.tsx
Normal file
11
frontend/src/app/post/page.tsx
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import PostOverallTitle from "@/lib/post/framework/ui/PostOverallTitle";
|
||||||
|
import PostPreviewCardList from "@/lib/post/framework/ui/PostPreviewCardList";
|
||||||
|
|
||||||
|
export default function PostOverallPage() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<PostOverallTitle />
|
||||||
|
<PostPreviewCardList />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
7
frontend/src/lib/label/domain/labelEntity.ts
Normal file
7
frontend/src/lib/label/domain/labelEntity.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
export default class LabelEntity {
|
||||||
|
constructor(
|
||||||
|
public readonly id: number,
|
||||||
|
public readonly name: string,
|
||||||
|
public readonly color: string,
|
||||||
|
) {}
|
||||||
|
}
|
16
frontend/src/lib/label/framework/ui/CompactLabel.tsx
Normal file
16
frontend/src/lib/label/framework/ui/CompactLabel.tsx
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import LabelEntity from "@/lib/label/domain/labelEntity";
|
||||||
|
|
||||||
|
export default function CompactLabel({ labels }: { labels: LabelEntity[] }) {
|
||||||
|
function generateTitle(labels: LabelEntity[]): string {
|
||||||
|
return labels.map((e) => e.name).join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="flex cursor-default flex-row items-center gap-x-1 rounded-full bg-gray-300 px-2 py-0.5"
|
||||||
|
title={generateTitle(labels)}
|
||||||
|
>
|
||||||
|
<span className="text-xs text-gray-800">{`${labels.length}+`}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
13
frontend/src/lib/label/framework/ui/Label.tsx
Normal file
13
frontend/src/lib/label/framework/ui/Label.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import LabelEntity from "@/lib/label/domain/labelEntity";
|
||||||
|
|
||||||
|
export default function Label({ label }: { label: LabelEntity }) {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="flex cursor-default flex-row items-center gap-x-1 rounded-full px-2 py-0.5"
|
||||||
|
style={{ backgroundColor: label.color }}
|
||||||
|
>
|
||||||
|
<div className="size-2 rounded-full bg-black opacity-25"></div>
|
||||||
|
<span className="text-xs text-gray-800">{label.name}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
13
frontend/src/lib/post/domain/postEntity.ts
Normal file
13
frontend/src/lib/post/domain/postEntity.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import LabelEntity from "@/lib/label/domain/labelEntity";
|
||||||
|
|
||||||
|
export default class PostEntity {
|
||||||
|
constructor(
|
||||||
|
public id: number,
|
||||||
|
public title: string,
|
||||||
|
public content: string,
|
||||||
|
public description: string,
|
||||||
|
public previewImageUrl: string,
|
||||||
|
public labels: LabelEntity[],
|
||||||
|
public publishedTime: Date,
|
||||||
|
) {}
|
||||||
|
}
|
7
frontend/src/lib/post/framework/ui/PostOverallTitle.tsx
Normal file
7
frontend/src/lib/post/framework/ui/PostOverallTitle.tsx
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
export default function PostOverallTitle() {
|
||||||
|
return (
|
||||||
|
<div className="mx-auto max-w-screen-xl">
|
||||||
|
<h1 className="py-9 text-center text-3xl font-bold text-gray-800 md:py-20 md:text-5xl">文章</h1>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
23
frontend/src/lib/post/framework/ui/PostPreviewCard.tsx
Normal file
23
frontend/src/lib/post/framework/ui/PostPreviewCard.tsx
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Image from "next/image";
|
||||||
|
|
||||||
|
import CompactLabel from "@/lib/label/framework/ui/CompactLabel";
|
||||||
|
import Label from "@/lib/label/framework/ui/Label";
|
||||||
|
|
||||||
|
import PostEntity from "../../domain/postEntity";
|
||||||
|
|
||||||
|
export default function PostPreviewCard({ post }: { post: PostEntity }) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col items-start gap-y-4">
|
||||||
|
<Image alt="Preview Image" src={post.previewImageUrl} width={480} height={270} className="rounded-2xl" />
|
||||||
|
<div className="flex flex-col items-start gap-y-1.5">
|
||||||
|
<div className="flex flex-row gap-x-2">
|
||||||
|
{post.labels.length > 0 && <Label label={post.labels[0]} />}
|
||||||
|
{post.labels.length > 1 && <CompactLabel labels={post.labels.slice(1)} />}
|
||||||
|
</div>
|
||||||
|
<h2 className="text-base font-bold text-gray-800 md:text-lg">{post.title}</h2>
|
||||||
|
<p className="line-clamp-3 text-sm text-gray-800">{post.description}</p>
|
||||||
|
<span className="cursor-pointer text-sm text-gray-400">查看更多 →</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
73
frontend/src/lib/post/framework/ui/PostPreviewCardList.tsx
Normal file
73
frontend/src/lib/post/framework/ui/PostPreviewCardList.tsx
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import PostEntity from "../../domain/postEntity";
|
||||||
|
import PostPreviewCard from "./PostPreviewCard";
|
||||||
|
|
||||||
|
export default function PostPreviewCardList() {
|
||||||
|
return (
|
||||||
|
<div className="mx-auto grid max-w-screen-xl grid-cols-1 gap-x-5 gap-y-6 px-6 pb-6 md:grid-cols-3 md:pb-10">
|
||||||
|
{postList.map((post) => (
|
||||||
|
<PostPreviewCard key={post.id} post={post} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const postList: PostEntity[] = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
title: "SquidLIVE | 自己的網站自己寫 | 深夜開發台",
|
||||||
|
content: "SquidLIVE 是一個自己的網站自己寫的深夜開發台,這裡會分享一些技術文章、開發心得、以及一些生活感想。",
|
||||||
|
description:
|
||||||
|
"Git Repository: https://git.squidspirit.com/squid/blog 如果喜歡的話就按個大大的喜歡,順便分享出去;如果不喜歡的話也別吝嗇按個不喜歡,也要告訴我原因喔!如有任何問題歡迎在下方留言或寄 E-mail 至:squid@squidspirit.com",
|
||||||
|
previewImageUrl: "https://www.alleycat.org/wp-content/uploads/2019/03/FELV-cat.jpg",
|
||||||
|
labels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "Software Engineering",
|
||||||
|
color: "#D9D9D9",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: "Algorithm",
|
||||||
|
color: "#D9D9D9",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: "Frontend",
|
||||||
|
color: "#D9D9D9",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
publishedTime: new Date(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
title: "SquidLIVE | 自己的網站自己寫 | 深夜開發台",
|
||||||
|
content: "SquidLIVE 是一個自己的網站自己寫的深夜開發台,這裡會分享一些技術文章、開發心得、以及一些生活感想。",
|
||||||
|
description:
|
||||||
|
"Git Repository: https://git.squidspirit.com/squid/blog 如果喜歡的話就按個大大的喜歡,順便分享出去;如果不喜歡的話也別吝嗇按個不喜歡,也要告訴我原因喔!如有任何問題歡迎在下方留言或寄 E-mail 至:squid@squidspirit.com",
|
||||||
|
previewImageUrl: "https://www.alleycat.org/wp-content/uploads/2019/03/FELV-cat.jpg",
|
||||||
|
labels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "Software Engineering",
|
||||||
|
color: "#D9D9D9",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
publishedTime: new Date(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
title: "SquidLIVE | 自己的網站自己寫 | 深夜開發台",
|
||||||
|
content: "SquidLIVE 是一個自己的網站自己寫的深夜開發台,這裡會分享一些技術文章、開發心得、以及一些生活感想。",
|
||||||
|
description:
|
||||||
|
"Git Repository: https://git.squidspirit.com/squid/blog 如果喜歡的話就按個大大的喜歡,順便分享出去;如果不喜歡的話也別吝嗇按個不喜歡,也要告訴我原因喔!如有任何問題歡迎在下方留言或寄 E-mail 至:squid@squidspirit.com",
|
||||||
|
previewImageUrl: "https://www.alleycat.org/wp-content/uploads/2019/03/FELV-cat.jpg",
|
||||||
|
labels: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "Software Engineering",
|
||||||
|
color: "#D9D9D9",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
publishedTime: new Date(),
|
||||||
|
},
|
||||||
|
];
|
Loading…
x
Reference in New Issue
Block a user