Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
36ef5db441 | |||
c6818e848c | |||
43202f7307 |
@ -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"
|
||||
>
|
||||
<Badge
|
||||
variant="outline"
|
||||
className="bg-teal-100 text-teal-800 mb-2"
|
||||
>
|
||||
{announcement.date}
|
||||
2024-10-03
|
||||
</Badge>
|
||||
<p className="text-gray-700">{announcement.content}</p>
|
||||
<p className="text-gray-700">目前API已由无数据库的屎山代码重构为使用 Mysql 的高性能代码</p>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<p className="text-gray-500 italic">暂无公告</p>
|
||||
)}
|
||||
</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">
|
||||
© 2024 Cat API. All rights reserved.
|
||||
© 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>
|
||||
|
@ -1,4 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {};
|
||||
const nextConfig = {
|
||||
output: 'export'
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
|
@ -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",
|
||||
|
39
scripts/generate-build-id.js
Normal file
39
scripts/generate-build-id.js
Normal 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();
|
Loading…
Reference in New Issue
Block a user