Skip to content

Commit b852c80

Browse files
committed
Add ClustrMaps widget using official code
1 parent ae9c856 commit b852c80

2 files changed

Lines changed: 76 additions & 20 deletions

File tree

src/app/layout.tsx

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Geist, Geist_Mono, Noto_Serif, PT_Serif } from "next/font/google";
33
import "./globals.css";
44
import { aboutMe } from "@/data/aboutme";
55
import { customMetadata } from "@/data/title-description";
6+
import { ClustrMapsWidget } from "@/components/clustrmaps-widget";
67
const geistSans = Geist({
78
variable: "--font-geist-sans",
89
subsets: ["latin"],
@@ -45,28 +46,32 @@ export default function RootLayout({
4546
>
4647
<main className="">{children}</main>
4748
<footer className="border-t border-neutral-200 dark:border-neutral-800 bg-[#FFFCF8]">
48-
<div className="flex flex-row mx-auto max-w-7xl px-6 py-12 md:flex md:items-start md:justify-between ">
49-
<div className="mb-4 text-sm text-neutral-600 dark:text-neutral-400">
50-
<p>
51-
© {new Date().getFullYear()} {aboutMe.name}.
52-
</p>
53-
{aboutMe.secretDescription && (
54-
<p className="text-xs text-neutral-600 dark:text-neutral-400 mt-4">
55-
{aboutMe.secretDescription}
49+
<div className="flex flex-col mx-auto max-w-7xl px-6 py-12">
50+
<div className="flex flex-row md:flex md:items-start md:justify-between mb-8">
51+
<div className="mb-4 text-sm text-neutral-600 dark:text-neutral-400">
52+
<p>
53+
© {new Date().getFullYear()} {aboutMe.name}.
5654
</p>
57-
)}
58-
</div>
59-
<div className="mb-4">
60-
<p className="text-sm text-neutral-500 dark:text-neutral-500 justify">
61-
Built with{" "}
62-
<a
63-
href="https://github.com/tovacinni/research-website-template"
64-
className="underline hover:text-neutral-800 dark:hover:text-neutral-300 transition-colors"
65-
>
66-
research-website-template
67-
</a>
68-
</p>
55+
{aboutMe.secretDescription && (
56+
<p className="text-xs text-neutral-600 dark:text-neutral-400 mt-4">
57+
{aboutMe.secretDescription}
58+
</p>
59+
)}
60+
</div>
61+
<div className="mb-4">
62+
<p className="text-sm text-neutral-500 dark:text-neutral-500 justify">
63+
Built with{" "}
64+
<a
65+
href="https://github.com/tovacinni/research-website-template"
66+
className="underline hover:text-neutral-800 dark:hover:text-neutral-300 transition-colors"
67+
>
68+
research-website-template
69+
</a>
70+
</p>
71+
</div>
6972
</div>
73+
{/* ClustrMaps Widget */}
74+
<ClustrMapsWidget />
7075
</div>
7176
</footer>
7277
</body>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"use client";
2+
3+
import { useEffect } from "react";
4+
import Script from "next/script";
5+
6+
export function ClustrMapsWidget() {
7+
// ClustrMaps 站点 ID
8+
const siteId = "wuBlhiVI3f9XcFVumFREQbzFU3WgcWCqwR-bRIOMJOI";
9+
10+
return (
11+
<div className="flex flex-col items-center justify-center mt-8 pt-8 border-t border-neutral-200 dark:border-neutral-800">
12+
<p className="text-xs text-neutral-500 dark:text-neutral-500 mb-2">
13+
访问统计
14+
</p>
15+
{/* 使用 Next.js Script 组件加载 ClustrMaps 官方脚本 */}
16+
<Script
17+
id="clustrmaps"
18+
src={`//clustrmaps.com/map_v2.js?d=${siteId}`}
19+
strategy="afterInteractive"
20+
/>
21+
{/* ClustrMaps 脚本会自动在这里渲染地图 */}
22+
<div id="clustrmaps-widget" style={{ minHeight: "100px" }}></div>
23+
{/* 备用图片链接(如果 JavaScript 失败) */}
24+
<a
25+
href="http://www.clustrmaps.com/map/Pyywill.github.io"
26+
title="Visit tracker for Pyywill.github.io"
27+
target="_blank"
28+
rel="noopener noreferrer"
29+
className="mt-2"
30+
>
31+
<img
32+
src={`//www.clustrmaps.com/map_v2.png?d=${siteId}`}
33+
alt="Visit tracker"
34+
style={{ maxWidth: "100%", height: "auto" }}
35+
loading="lazy"
36+
/>
37+
</a>
38+
<p className="text-xs text-neutral-400 dark:text-neutral-600 mt-2">
39+
<a
40+
href="https://clustrmaps.com"
41+
target="_blank"
42+
rel="noopener noreferrer"
43+
className="hover:text-neutral-600 dark:hover:text-neutral-400 transition-colors"
44+
>
45+
ClustrMaps
46+
</a>
47+
</p>
48+
</div>
49+
);
50+
}
51+

0 commit comments

Comments
 (0)