Compare commits

..

3 Commits
v0.1 ... main

Author SHA1 Message Date
mei
36ef5db441 refactor(api-docs): 重构 API 文档组件并优化构建 ID 生成逻辑
- 移除了公告功能,替换为固定公告内容
- 更新了站点信息,包括友情链接和邮箱地址
- 优化了图片总数和接口文档的展示方式
- 重新实现了构建 ID 生成逻辑,使用项目文件哈希值代替时间戳
2025-02-07 11:10:18 +08:00
mei
c6818e848c update 2024-11-07 12:37:00 +08:00
mei
43202f7307 update 2024-11-03 16:42:45 +08:00
4 changed files with 60 additions and 47 deletions

View File

@ -20,27 +20,20 @@ import { ExternalLink, GitCommit } from "lucide-react";
export default function ApiDocsComponent() {
const [activePage, setActivePage] = useState("home");
const [imageCount, setImageCount] = useState<number | null>(null);
const [announcements, setAnnouncements] = useState<
Array<{ date: string; content: string }>
>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchData = async () => {
setLoading(true);
try {
const [imageCountResponse, announcementsResponse] = await Promise.all([
fetch("/?api=total-pic"),
fetch("/?api=announcements"),
const [imageCountResponse] = await Promise.all([
fetch("/?api=total-pic")
]);
const imageCountData = await imageCountResponse.json();
const announcementsData = await announcementsResponse.json();
setImageCount(imageCountData.count);
setAnnouncements(announcementsData.announcements);
} catch (error) {
console.error("Failed to fetch data:", error);
setImageCount(null);
setAnnouncements([]);
} finally {
setLoading(false);
}
@ -119,7 +112,7 @@ export default function ApiDocsComponent() {
];
const friendlyLinks = [
{ name: "mei的网络日志", url: "https://mmeiblog.cn" }
{ name: "mei的网络日志", url: "https://mei.lv" }
];
const HomePage = () => (
@ -144,16 +137,6 @@ export default function ApiDocsComponent() {
<p className="mt-4 text-gray-600">
</p>
<p className="mt-4 text-gray-600">
API有什么不完善的地方或者说你有什么更好的想{" "}
<a
href="mailto:i@mmeiblog.cn"
className="text-blue-600 hover:underline"
>
i@mmeiblog.cn
</a>
</p>
</CardContent>
</Card>
@ -162,26 +145,17 @@ export default function ApiDocsComponent() {
<CardTitle className="text-2xl font-bold"></CardTitle>
</CardHeader>
<CardContent className="p-6">
{loading ? (
<Skeleton className="h-20 w-full" />
) : announcements.length > 0 ? (
announcements.map((announcement, index) => (
<div
key={index}
className="mb-4 last:mb-0 bg-gray-50 p-4 rounded-lg"
<div
className="mb-4 last:mb-0 bg-gray-50 p-4 rounded-lg"
>
<Badge
variant="outline"
className="bg-teal-100 text-teal-800 mb-2"
>
<Badge
variant="outline"
className="bg-teal-100 text-teal-800 mb-2"
>
{announcement.date}
</Badge>
<p className="text-gray-700">{announcement.content}</p>
</div>
))
) : (
<p className="text-gray-500 italic"></p>
)}
2024-10-03
</Badge>
<p className="text-gray-700">API已由无数据库的屎山代码重构为使用 Mysql </p>
</div>
</CardContent>
</Card>
@ -224,7 +198,7 @@ export default function ApiDocsComponent() {
</CardHeader>
<CardContent className="p-6">
<p className="text-gray-700">
API
API !
</p>
<p className="mt-4 text-gray-600">
:{" "}
@ -283,7 +257,7 @@ export default function ApiDocsComponent() {
<TableCell>{endpoint.id}</TableCell>
<TableCell>{endpoint.device}</TableCell>
<TableCell>{endpoint.method}</TableCell>
<TableCell>{endpoint.url}</TableCell>
<TableCell><a href = {endpoint.url}>{endpoint.url}</a></TableCell>
<TableCell>{endpoint.description}</TableCell>
</TableRow>
))}
@ -374,14 +348,11 @@ export default function ApiDocsComponent() {
<div className="container mx-auto px-6 py-4">
<div className="flex justify-between items-center">
<p className="text-gray-600">
&copy; 2024 Cat API. All rights reserved.
&copy; 2024 mei. All rights reserved.
</p>
<div className="flex items-center text-gray-500">
<GitCommit className="w-5 h-5 mr-2" />
<span className="text-sm">
{process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA?.slice(0, 7) ||
"dev"}
</span>
<span className="text-sm">{process.env.NEXT_PUBLIC_BUILD_ID || 'dev'}</span>
</div>
</div>
</div>

View File

@ -1,4 +1,6 @@
/** @type {import('next').NextConfig} */
const nextConfig = {};
const nextConfig = {
output: 'export'
};
export default nextConfig;

View File

@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"scripts": {
"prebuild": "node scripts/generate-build-id.js",
"dev": "next dev",
"build": "next build",
"start": "next start",

View File

@ -0,0 +1,39 @@
import fs from 'fs';
import path from 'path';
import crypto from 'crypto';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const generateProjectHash = () => {
const hash = crypto.createHash('sha256');
const walk = (dir) => {
const files = fs.readdirSync(dir);
files.forEach(file => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
walk(filePath);
} else {
hash.update(fs.readFileSync(filePath));
}
});
};
walk(path.join(__dirname, '..'));
return hash.digest('hex').substring(0, 7); // 使用前10个字符作为短哈希
};
const generateBuildId = () => {
const projectHash = generateProjectHash();
const envFilePath = path.join(__dirname, '..', '.env.local');
if (fs.existsSync(envFilePath)) {
fs.unlinkSync(envFilePath);
}
fs.writeFileSync(envFilePath, `NEXT_PUBLIC_BUILD_ID=${projectHash}`);
console.log(`Build ID generated: ${projectHash}`);
};
generateBuildId();