From aa2ce853b822c984286f300e9d1e83ae20676d97 Mon Sep 17 00:00:00 2001 From: Eamon-meng <17516219072@163.com> Date: Thu, 4 Dec 2025 15:52:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9A=82=E5=AD=98=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E9=83=A8=E5=88=86=E7=BB=93=E6=9E=84=20&=20=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E8=8E=B7=E5=8F=96=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?IP=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/actions/ip.ts | 21 +---- src/app/(home)/help/layout.tsx | 24 ++++++ .../(home)/help}/sidebar.tsx | 0 .../help/tutorials/quick-start/page.tsx | 69 ++--------------- src/app/admin/(dashboard)/_client/charts.tsx | 12 +-- src/app/admin/whitelist/page.tsx | 2 +- src/components/composites/extract/index.tsx | 7 +- .../composites/payment/payment-modal.tsx | 2 +- .../composites/purchase/long/center.tsx | 18 +++-- .../composites/quickStart/index.tsx | 18 ----- .../quickStart/tutorial-content.tsx | 20 ----- .../quickStart/tutorial-sidebar.tsx | 65 ---------------- src/components/docs/quick-start.mdx | 11 +++ src/components/docs/quickStart.mdx | 76 ------------------- 14 files changed, 63 insertions(+), 282 deletions(-) create mode 100644 src/app/(home)/help/layout.tsx rename src/{components/composites => app/(home)/help}/sidebar.tsx (100%) delete mode 100644 src/components/composites/quickStart/index.tsx delete mode 100644 src/components/composites/quickStart/tutorial-content.tsx delete mode 100644 src/components/composites/quickStart/tutorial-sidebar.tsx create mode 100644 src/components/docs/quick-start.mdx delete mode 100644 src/components/docs/quickStart.mdx diff --git a/src/actions/ip.ts b/src/actions/ip.ts index 62a60a5..3746fdc 100644 --- a/src/actions/ip.ts +++ b/src/actions/ip.ts @@ -3,30 +3,15 @@ import {headers} from 'next/headers' export async function getClientIp(): Promise<{ip?: string, error?: string}> { + const header = await headers() try { - // 1. 从headers获取 - const headersList = await headers() - - // 尝试常见header - const forwardedFor = headersList.get('x-forwarded-for') + const forwardedFor = header.get('x-forwarded-for') if (forwardedFor) { const ip = forwardedFor.split(',')[0].trim() if (ip) return {ip} } - - const realIp = headersList.get('x-real-ip') + const realIp = header.get('x-real-ip') if (realIp) return {ip: realIp} - - // 回退到ipify - const response = await fetch('https://api.ipify.org?format=json', { - cache: 'no-store', - }) - - if (response.ok) { - const data = await response.json() - return {ip: data.ip} - } - return {error: '无法获取IP'} } catch (error) { diff --git a/src/app/(home)/help/layout.tsx b/src/app/(home)/help/layout.tsx new file mode 100644 index 0000000..b07d5eb --- /dev/null +++ b/src/app/(home)/help/layout.tsx @@ -0,0 +1,24 @@ +import BreadCrumb from '@/components/bread-crumb' +import Wrap from '@/components/wrap' +import {ReactNode} from 'react' +import Sidebar from './sidebar' + +export default function HelpLayout(props: { + children: ReactNode +}) { + return ( +
+ + +
+ +
+ {props.children} +
+
+
+
+ ) +} diff --git a/src/components/composites/sidebar.tsx b/src/app/(home)/help/sidebar.tsx similarity index 100% rename from src/components/composites/sidebar.tsx rename to src/app/(home)/help/sidebar.tsx diff --git a/src/app/(home)/help/tutorials/quick-start/page.tsx b/src/app/(home)/help/tutorials/quick-start/page.tsx index 435c49b..76483b6 100644 --- a/src/app/(home)/help/tutorials/quick-start/page.tsx +++ b/src/app/(home)/help/tutorials/quick-start/page.tsx @@ -1,68 +1,11 @@ 'use client' -import {useEffect, useState} from 'react' -import {useRouter, usePathname, useSearchParams} from 'next/navigation' -import BreadCrumb from '@/components/bread-crumb' -import Wrap from '@/components/wrap' -import QuickStart from '@/components/composites/quickStart' -import Sidebar, {MENU} from '@/components/composites/sidebar' - -export type CollectPageProps = {} - -export default function CollectPage(props: CollectPageProps) { - const router = useRouter() - const pathname = usePathname() - const searchParams = useSearchParams() - - // 初始根据 url ?doc=xxx 设置选中项,回退到默认 'browser-proxy' - const initialDoc = searchParams?.get('doc') ?? 'browser-proxy' - const [selected, setSelected] = useState(initialDoc) - const [collapsed, setCollapsed] = useState(false) - - // 当 selected 改变时同步更新 URL - useEffect(() => { - const url = `${pathname}?doc=${selected}` - router.replace(url) - }, [selected, pathname, router]) - - const selectedLabel = (() => { - for (const sec of MENU) { - const found = sec.items.find(i => i.key === selected) - if (found) return found.label - } - return selected - })() +import QuickStart from '@/components/docs/quick-start.mdx' +import Markdown from '@/components/markdown' +export default function CollectPage() { return ( -
- - - {/* 两列布局:左侧侧边栏,右侧内容 */} -
- setCollapsed(v => !v)} - selected={selected} - onSelect={key => setSelected(key)} - /> -
- {selected === 'browser-proxy' && } - {selected !== 'browser-proxy' && ( -
-

- {selected === 'code-download' ? '代码下载' : '占位页面'} -

-

- 这里渲染对应文档内容(演示占位)。你可以替换为其它 MDX/组件,或把更多页面配置进 Sidebar 数据中。 -

-
- )} -
-
-
-
+ + + ) } diff --git a/src/app/admin/(dashboard)/_client/charts.tsx b/src/app/admin/(dashboard)/_client/charts.tsx index fb83ee5..024cbb4 100644 --- a/src/app/admin/(dashboard)/_client/charts.tsx +++ b/src/app/admin/(dashboard)/_client/charts.tsx @@ -15,7 +15,7 @@ import {useState} from 'react' import {statisticsResourceUsage} from '@/actions/dashboard' import {ExtraResp} from '@/lib/api' import {toast} from 'sonner' -import {addDays, format} from 'date-fns' +import {addDays, compareAsc, format, subDays} from 'date-fns' import {Label} from '@/components/ui/label' import {ChartConfig, ChartContainer} from '@/components/ui/chart' import {CartesianGrid, XAxis, YAxis, Tooltip, Area, AreaChart, Legend} from 'recharts' @@ -41,17 +41,12 @@ export default function Charts({initialData}: ChartsProps) { }) const handler = form.handleSubmit( async (value) => { - // 获取当前日期 const today = new Date() - // 计算7天前的日期 - const sevenDaysAgo = new Date() - sevenDaysAgo.setDate(today.getDate() - 3) + const sevenDaysAgo = subDays(today, 7) const res = { resource_no: value.resource_no ?? '', create_after: value.create_after ?? sevenDaysAgo, create_before: value.create_before ?? today, - // create_after: value.create_after ? format(value.create_after, 'yyyy-MM-dd') : format(sevenDaysAgo, 'yyyy-MM-dd'), - // create_before: value.create_before ? format(value.create_before, 'yyyy-MM-dd') : format(today, 'yyyy-MM-dd'), } const resp = await statisticsResourceUsage(res) @@ -69,8 +64,7 @@ export default function Charts({initialData}: ChartsProps) { date: item.date, count: item.count, })) - formattedData.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()) - + formattedData.sort((a, b) => compareAsc(a.date, b.date)) setSubmittedData(formattedData) }, ) diff --git a/src/app/admin/whitelist/page.tsx b/src/app/admin/whitelist/page.tsx index a5ef28b..48b9278 100644 --- a/src/app/admin/whitelist/page.tsx +++ b/src/app/admin/whitelist/page.tsx @@ -333,7 +333,7 @@ export default function WhitelistPage(props: WhitelistPageProps) { className="shrink-0" theme="outline" > - {wait ? : '获取当前IP'} + {wait ? : '使用当前IP'} )} diff --git a/src/components/composites/extract/index.tsx b/src/components/composites/extract/index.tsx index 8e3a4d4..6b6e952 100644 --- a/src/components/composites/extract/index.tsx +++ b/src/components/composites/extract/index.tsx @@ -8,7 +8,7 @@ import {Select, SelectContent, SelectItem, SelectSeparator, SelectTrigger, Selec import {Button} from '@/components/ui/button' import {useForm, useFormContext} from 'react-hook-form' import {Alert, AlertTitle} from '@/components/ui/alert' -import {Box, CircleAlert, CopyIcon, ExternalLinkIcon, Loader, Plus, Timer} from 'lucide-react' +import {ArrowRight, Box, CircleAlert, CopyIcon, ExternalLinkIcon, LinkIcon, Loader, Plus, Timer} from 'lucide-react' import {memo, ReactNode, useEffect, useRef, useState} from 'react' import {useStatus} from '@/lib/states' import {allResource} from '@/actions/resource' @@ -77,9 +77,10 @@ export default function Extract(props: ExtractProps) { 提取IP前需要将本机IP添加到白名单后才可使用 - 去添加 → + 去添加 + diff --git a/src/components/composites/payment/payment-modal.tsx b/src/components/composites/payment/payment-modal.tsx index ec978cb..1ded350 100644 --- a/src/components/composites/payment/payment-modal.tsx +++ b/src/components/composites/payment/payment-modal.tsx @@ -54,7 +54,7 @@ export function PaymentModal(props: PaymentModalProps) { return () => { eventSource.close() } - }, [props.inner_no, props.method, props.onConfirm]) + }, [props]) return ( () @@ -85,18 +86,19 @@ export default function Center() { - -
- {value} -
- +