From cd885f5fcd2f5423cc1126eb22cf8bf0b1b7af45 Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 7 Jun 2026 01:17:46 -0500 Subject: [PATCH] 's' --- app/[locale]/digital/about/AboutContent.tsx | 129 + app/[locale]/digital/about/page.tsx | 20 + .../digital/app/AppDownloadContent.tsx | 70 + app/[locale]/digital/app/page.tsx | 21 + .../[lessonIndex]/LessonMarkdown.tsx | 194 + .../[lessonIndex]/lesson-markdown.module.css | 349 ++ .../[moduleIndex]/[lessonIndex]/page.tsx | 237 + app/[locale]/digital/course/page.tsx | 31 + app/[locale]/digital/day/[id]/page.tsx | 127 + app/[locale]/digital/ebook/EbookClient.tsx | 222 + app/[locale]/digital/ebook/ebook.module.css | 493 ++ app/[locale]/digital/ebook/page.tsx | 17 + app/[locale]/digital/jobs/JobsContent.tsx | 291 + app/[locale]/digital/jobs/page.tsx | 21 + app/[locale]/digital/join/page.tsx | 557 ++ app/[locale]/digital/join/paid/page.tsx | 39 + app/[locale]/digital/layout.tsx | 44 + app/[locale]/digital/page.tsx | 29 + .../digital/privacy/PrivacyContent.tsx | 182 + app/[locale]/digital/privacy/page.tsx | 21 + app/[locale]/layout.tsx | 4 +- app/[locale]/page.tsx | 6 +- app/api/digital/auth/login/route.ts | 45 + app/api/digital/auth/logout/route.ts | 8 + app/api/digital/auth/me/route.ts | 51 + app/api/digital/auth/register/route.ts | 62 + app/api/digital/auth/sync-session/route.ts | 22 + app/api/digital/join/route.ts | 130 + app/api/digital/pay/confirm/route.ts | 169 + app/api/digital/pay/route.ts | 465 ++ app/api/digital/pay/status/route.ts | 84 + app/api/digital/upload-media/route.ts | 49 + app/api/digital/vip/check/route.ts | 93 + app/components/CityModal.tsx | 2 +- app/components/RouteAwareNavbar.tsx | 15 + app/components/SiteMenu.tsx | 2 +- app/digital/DigitalProviders.tsx | 17 + app/digital/components/AuthModal.tsx | 183 + app/digital/components/Community.tsx | 130 + app/digital/components/DayContent.tsx | 12 + app/digital/components/Features.tsx | 46 + app/digital/components/Footer.tsx | 104 + app/digital/components/Header.tsx | 199 + app/digital/components/Hero.tsx | 52 + .../components/PayStatusPollProvider.tsx | 13 + app/digital/components/ResourceNavigation.tsx | 274 + app/digital/components/Resources.tsx | 175 + app/digital/components/Roadmap.tsx | 112 + app/digital/components/ShopCard.tsx | 47 + app/digital/components/SocialPlatformIcon.tsx | 48 + app/digital/components/ThemeToggle.tsx | 47 + app/digital/components/Tools.tsx | 72 + app/digital/components/UserAvatar.tsx | 75 + .../components/course/AudienceSection.tsx | 27 + .../components/course/BenefitsSection.tsx | 31 + app/digital/components/course/CTASection.tsx | 130 + app/digital/components/course/CourseHero.tsx | 169 + .../components/course/CurriculumSection.tsx | 162 + app/digital/components/course/FAQSection.tsx | 43 + .../components/course/InstructorsSection.tsx | 37 + app/digital/components/course/Section.tsx | 17 + app/digital/components/course/VideoPlayer.tsx | 362 ++ app/digital/components/course/index.ts | 9 + app/digital/context/LocaleContext.tsx | 103 + app/digital/context/ThemeContext.tsx | 65 + app/digital/data/days.ts | 993 ++++ app/digital/data/ebook.md | 4901 +++++++++++++++++ app/digital/data/tools.json | 219 + app/digital/i18n/navigation.ts | 9 + app/digital/lib/auth-cookie.ts | 34 + app/digital/lib/course-payment.ts | 19 + app/digital/lib/ebook.ts | 43 + app/digital/lib/env.ts | 17 + app/digital/lib/learning.ts | 141 + app/digital/lib/locale-link.tsx | 25 + app/digital/lib/minio/client.ts | 67 + app/digital/lib/minio/config.ts | 2 + app/digital/lib/minio/index.ts | 13 + app/digital/lib/payEnv.ts | 49 + app/digital/lib/payment/client.ts | 57 + app/digital/lib/payment/config.ts | 2 + app/digital/lib/payment/index.ts | 4 + app/digital/lib/payment/types.ts | 21 + app/digital/lib/payment/usePayStatusPoll.ts | 179 + app/digital/lib/payment/xorpayStatus.ts | 49 + app/digital/lib/payment/zpayStatus.ts | 45 + app/digital/lib/pocketbase/auth.ts | 112 + app/digital/lib/pocketbase/config.ts | 2 + app/digital/lib/pocketbase/constants.ts | 5 + app/digital/lib/pocketbase/index.ts | 12 + app/digital/lib/theme-data.ts | 130 + app/digital/lib/useAuthAndVip.ts | 68 + app/digital/lib/useCrossSiteUrls.ts | 5 + app/globals.css | 480 ++ config/digital/course.ts | 209 + config/digital/domain.config.ts | 48 + config/digital/index.ts | 18 + config/digital/lessons.ts | 112 + config/digital/services.config.ts | 156 + config/digital/site.config.ts | 193 + config/footer.config.ts | 2 +- .../themes/digital-nomad/data/books.json | 19 + .../themes/digital-nomad/data/pan.json | 52 + .../themes/digital-nomad/data/products.json | 19 + .../themes/digital-nomad/data/tools.json | 219 + .../themes/digital-nomad/messages/en.json | 212 + .../themes/digital-nomad/messages/zh.json | 212 + next.config.ts | 2 +- package.json | 13 +- pnpm-lock.yaml | 1636 +++++- 110 files changed, 17876 insertions(+), 11 deletions(-) create mode 100644 app/[locale]/digital/about/AboutContent.tsx create mode 100644 app/[locale]/digital/about/page.tsx create mode 100644 app/[locale]/digital/app/AppDownloadContent.tsx create mode 100644 app/[locale]/digital/app/page.tsx create mode 100644 app/[locale]/digital/course/[moduleIndex]/[lessonIndex]/LessonMarkdown.tsx create mode 100644 app/[locale]/digital/course/[moduleIndex]/[lessonIndex]/lesson-markdown.module.css create mode 100644 app/[locale]/digital/course/[moduleIndex]/[lessonIndex]/page.tsx create mode 100644 app/[locale]/digital/course/page.tsx create mode 100644 app/[locale]/digital/day/[id]/page.tsx create mode 100644 app/[locale]/digital/ebook/EbookClient.tsx create mode 100644 app/[locale]/digital/ebook/ebook.module.css create mode 100644 app/[locale]/digital/ebook/page.tsx create mode 100644 app/[locale]/digital/jobs/JobsContent.tsx create mode 100644 app/[locale]/digital/jobs/page.tsx create mode 100644 app/[locale]/digital/join/page.tsx create mode 100644 app/[locale]/digital/join/paid/page.tsx create mode 100644 app/[locale]/digital/layout.tsx create mode 100644 app/[locale]/digital/page.tsx create mode 100644 app/[locale]/digital/privacy/PrivacyContent.tsx create mode 100644 app/[locale]/digital/privacy/page.tsx create mode 100644 app/api/digital/auth/login/route.ts create mode 100644 app/api/digital/auth/logout/route.ts create mode 100644 app/api/digital/auth/me/route.ts create mode 100644 app/api/digital/auth/register/route.ts create mode 100644 app/api/digital/auth/sync-session/route.ts create mode 100644 app/api/digital/join/route.ts create mode 100644 app/api/digital/pay/confirm/route.ts create mode 100644 app/api/digital/pay/route.ts create mode 100644 app/api/digital/pay/status/route.ts create mode 100644 app/api/digital/upload-media/route.ts create mode 100644 app/api/digital/vip/check/route.ts create mode 100644 app/components/RouteAwareNavbar.tsx create mode 100644 app/digital/DigitalProviders.tsx create mode 100644 app/digital/components/AuthModal.tsx create mode 100644 app/digital/components/Community.tsx create mode 100644 app/digital/components/DayContent.tsx create mode 100644 app/digital/components/Features.tsx create mode 100644 app/digital/components/Footer.tsx create mode 100644 app/digital/components/Header.tsx create mode 100644 app/digital/components/Hero.tsx create mode 100644 app/digital/components/PayStatusPollProvider.tsx create mode 100644 app/digital/components/ResourceNavigation.tsx create mode 100644 app/digital/components/Resources.tsx create mode 100644 app/digital/components/Roadmap.tsx create mode 100644 app/digital/components/ShopCard.tsx create mode 100644 app/digital/components/SocialPlatformIcon.tsx create mode 100644 app/digital/components/ThemeToggle.tsx create mode 100644 app/digital/components/Tools.tsx create mode 100644 app/digital/components/UserAvatar.tsx create mode 100644 app/digital/components/course/AudienceSection.tsx create mode 100644 app/digital/components/course/BenefitsSection.tsx create mode 100644 app/digital/components/course/CTASection.tsx create mode 100644 app/digital/components/course/CourseHero.tsx create mode 100644 app/digital/components/course/CurriculumSection.tsx create mode 100644 app/digital/components/course/FAQSection.tsx create mode 100644 app/digital/components/course/InstructorsSection.tsx create mode 100644 app/digital/components/course/Section.tsx create mode 100644 app/digital/components/course/VideoPlayer.tsx create mode 100644 app/digital/components/course/index.ts create mode 100644 app/digital/context/LocaleContext.tsx create mode 100644 app/digital/context/ThemeContext.tsx create mode 100644 app/digital/data/days.ts create mode 100644 app/digital/data/ebook.md create mode 100644 app/digital/data/tools.json create mode 100644 app/digital/i18n/navigation.ts create mode 100644 app/digital/lib/auth-cookie.ts create mode 100644 app/digital/lib/course-payment.ts create mode 100644 app/digital/lib/ebook.ts create mode 100644 app/digital/lib/env.ts create mode 100644 app/digital/lib/learning.ts create mode 100644 app/digital/lib/locale-link.tsx create mode 100644 app/digital/lib/minio/client.ts create mode 100644 app/digital/lib/minio/config.ts create mode 100644 app/digital/lib/minio/index.ts create mode 100644 app/digital/lib/payEnv.ts create mode 100644 app/digital/lib/payment/client.ts create mode 100644 app/digital/lib/payment/config.ts create mode 100644 app/digital/lib/payment/index.ts create mode 100644 app/digital/lib/payment/types.ts create mode 100644 app/digital/lib/payment/usePayStatusPoll.ts create mode 100644 app/digital/lib/payment/xorpayStatus.ts create mode 100644 app/digital/lib/payment/zpayStatus.ts create mode 100644 app/digital/lib/pocketbase/auth.ts create mode 100644 app/digital/lib/pocketbase/config.ts create mode 100644 app/digital/lib/pocketbase/constants.ts create mode 100644 app/digital/lib/pocketbase/index.ts create mode 100644 app/digital/lib/theme-data.ts create mode 100644 app/digital/lib/useAuthAndVip.ts create mode 100644 app/digital/lib/useCrossSiteUrls.ts create mode 100644 config/digital/course.ts create mode 100644 config/digital/domain.config.ts create mode 100644 config/digital/index.ts create mode 100644 config/digital/lessons.ts create mode 100644 config/digital/services.config.ts create mode 100644 config/digital/site.config.ts create mode 100644 content/digital/themes/digital-nomad/data/books.json create mode 100644 content/digital/themes/digital-nomad/data/pan.json create mode 100644 content/digital/themes/digital-nomad/data/products.json create mode 100644 content/digital/themes/digital-nomad/data/tools.json create mode 100644 content/digital/themes/digital-nomad/messages/en.json create mode 100644 content/digital/themes/digital-nomad/messages/zh.json diff --git a/app/[locale]/digital/about/AboutContent.tsx b/app/[locale]/digital/about/AboutContent.tsx new file mode 100644 index 0000000..a99084a --- /dev/null +++ b/app/[locale]/digital/about/AboutContent.tsx @@ -0,0 +1,129 @@ +"use client"; + +import { useEffect } from "react"; +import { useTranslation } from "@/app/digital/i18n/navigation"; +import { getThemeConfig } from "@/config/digital"; +import SocialPlatformIcon from "../../../digital/components/SocialPlatformIcon"; + +export default function AboutContent() { + const { t } = useTranslation("about"); + + useEffect(() => { + window.history.scrollRestoration = "manual"; + window.scrollTo(0, 0); + return () => { + window.history.scrollRestoration = "auto"; + }; + }, []); + const config = getThemeConfig(); + const linktreeUrl = config.linktreeUrl; + const socialLinks = config.socialLinks ?? []; + const teamMembers = config.teamMembers ?? []; + + return ( +
+
+
+
+

+ {t("title")} +

+

+ {t("subtitle")} +

+
+ + {/* 团队成员 */} + {teamMembers.length > 0 && ( +
+

+ {t("teamTitle")} +

+

+ {t("teamDesc")} +

+
+ {teamMembers.map((member) => { + const content = ( +
+
+ {member.avatar ?? "👤"} +
+

+ {member.name} +

+

+ {member.role} +

+
+ ); + if (member.link) { + return ( + + {content} + + ); + } + return
{content}
; + })} +
+
+ )} + + {/* 社交平台 Linktree */} + {(linktreeUrl || socialLinks.length > 0) && ( +
+

+ {t("linktreeTitle")} +

+

+ {t("linktreeDesc")} +

+ {(["domestic", "overseas"] as const).map((group) => { + const items = socialLinks.filter((l) => l.group === group); + if (items.length === 0) return null; + return ( +
+

+ {group === "domestic" ? t("groupDomestic") : t("groupOverseas")} +

+ +
+ ); + })} +
+ )} +
+
+
+ ); +} diff --git a/app/[locale]/digital/about/page.tsx b/app/[locale]/digital/about/page.tsx new file mode 100644 index 0000000..c19d53d --- /dev/null +++ b/app/[locale]/digital/about/page.tsx @@ -0,0 +1,20 @@ +import type { Metadata } from "next"; +import Header from "../../../digital/components/Header"; +import Footer from "../../../digital/components/Footer"; +import AboutContent from "./AboutContent"; +export const metadata: Metadata = { + title: "关于我们 | About Us", + description: "认识数字游民指南背后的团队,关注我们的社交平台。", +}; + +export default function AboutPage() { + return ( + <> +
+
+ +
+