diff --git a/README.md b/README.md index e215bc4..a34fcf6 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,23 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +## 功能布局 -## Getting Started +### 首页 -First, run the development server: +- 页头 + - LOGO + - 菜单 + - 登录/注册 +- 正文 + - 优势介绍 + - 数据展示 + - 产品推荐 + - 客户案例 + - 合作伙伴 + - 新闻动态 +- 页脚 + - 关于我们 + - 网站地图 + - 备案/版权信息 -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` +### 后台 -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +### 授权 diff --git a/eslint.config.mjs b/eslint.config.mjs index c85fb67..76ed475 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -11,6 +11,12 @@ const compat = new FlatCompat({ const eslintConfig = [ ...compat.extends("next/core-web-vitals", "next/typescript"), + { + rules: { + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-unused-vars': 'off', + }, + }, ]; export default eslintConfig; diff --git a/package.json b/package.json index e79d1fe..3948839 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev -H 0.0.0.0 --turbopack", "build": "next build", "start": "next start", "lint": "next lint" @@ -14,6 +14,8 @@ "next": "15.2.1" }, "devDependencies": { + "@next/eslint-plugin-next": "^15.2.1", + "eslint-plugin-react-hooks": "^5.2.0", "typescript": "^5", "@types/node": "^20", "@types/react": "^19", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa42570..d914b3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,9 @@ importers: '@eslint/eslintrc': specifier: ^3 version: 3.3.0 + '@next/eslint-plugin-next': + specifier: ^15.2.1 + version: 15.2.1 '@tailwindcss/postcss': specifier: ^4 version: 4.0.9 @@ -39,6 +42,9 @@ importers: eslint-config-next: specifier: 15.2.1 version: 15.2.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.21.0(jiti@2.4.2)) tailwindcss: specifier: ^4 version: 4.0.9 @@ -135,67 +141,79 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -237,24 +255,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@15.2.1': resolution: {integrity: sha512-3v0pF/adKZkBWfUffmB/ROa+QcNTrnmYG4/SS+r52HPwAK479XcWoES2I+7F7lcbqc7mTeVXrIvb4h6rR/iDKg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@15.2.1': resolution: {integrity: sha512-RbsVq2iB6KFJRZ2cHrU67jLVLKeuOIhnQB05ygu5fCNgg8oTewxweJE8XlLV+Ii6Y6u4EHwETdUiRNXIAfpBww==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@15.2.1': resolution: {integrity: sha512-QHsMLAyAIu6/fWjHmkN/F78EFPKmhQlyX5C8pRIS2RwVA7z+t9cTb0IaYWC3EHLOTjsU7MNQW+n2xGXr11QPpg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@15.2.1': resolution: {integrity: sha512-Gk42XZXo1cE89i3hPLa/9KZ8OuupTjkDmhLaMKFohjf9brOeZVEa3BQy1J9s9TWUqPhgAEbwv6B2+ciGfe54Vw==} @@ -334,24 +356,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.0.9': resolution: {integrity: sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.0.9': resolution: {integrity: sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.0.9': resolution: {integrity: sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-win32-arm64-msvc@4.0.9': resolution: {integrity: sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==} @@ -1128,24 +1154,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.29.1: resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.29.1: resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.29.1: resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.29.1: resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} diff --git a/public/banner.webp b/public/banner.webp new file mode 100644 index 0000000..f92bf16 Binary files /dev/null and b/public/banner.webp differ diff --git a/public/check.svg b/public/check.svg new file mode 100644 index 0000000..60a549e --- /dev/null +++ b/public/check.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/earth.webp b/public/earth.webp new file mode 100644 index 0000000..acec4fa Binary files /dev/null and b/public/earth.webp differ diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/map.webp b/public/map.webp new file mode 100644 index 0000000..f0da4bd Binary files /dev/null and b/public/map.webp differ diff --git a/public/next.svg b/public/next.svg index 5174b28..854705f 100644 --- a/public/next.svg +++ b/public/next.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/public/s1-1.webp b/public/s1-1.webp new file mode 100644 index 0000000..667f9ca Binary files /dev/null and b/public/s1-1.webp differ diff --git a/public/s1-2.webp b/public/s1-2.webp new file mode 100644 index 0000000..a7efa3b Binary files /dev/null and b/public/s1-2.webp differ diff --git a/public/s1-3.webp b/public/s1-3.webp new file mode 100644 index 0000000..8a80ebd Binary files /dev/null and b/public/s1-3.webp differ diff --git a/public/s1-4.webp b/public/s1-4.webp new file mode 100644 index 0000000..d507b38 Binary files /dev/null and b/public/s1-4.webp differ diff --git a/public/s1-check.svg b/public/s1-check.svg new file mode 100644 index 0000000..1987cf5 --- /dev/null +++ b/public/s1-check.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/s2-1-1.webp b/public/s2-1-1.webp new file mode 100644 index 0000000..54abb5a Binary files /dev/null and b/public/s2-1-1.webp differ diff --git a/public/s2-1-2.webp b/public/s2-1-2.webp new file mode 100644 index 0000000..9285353 Binary files /dev/null and b/public/s2-1-2.webp differ diff --git a/public/s2-1-3.webp b/public/s2-1-3.webp new file mode 100644 index 0000000..1e8c105 Binary files /dev/null and b/public/s2-1-3.webp differ diff --git a/public/s2-1-main.webp b/public/s2-1-main.webp new file mode 100644 index 0000000..5f68dd4 Binary files /dev/null and b/public/s2-1-main.webp differ diff --git a/public/s2-2-1.webp b/public/s2-2-1.webp new file mode 100644 index 0000000..9a40ac6 Binary files /dev/null and b/public/s2-2-1.webp differ diff --git a/public/s2-2-2.webp b/public/s2-2-2.webp new file mode 100644 index 0000000..6d919a5 Binary files /dev/null and b/public/s2-2-2.webp differ diff --git a/public/s2-2-3.webp b/public/s2-2-3.webp new file mode 100644 index 0000000..827093b Binary files /dev/null and b/public/s2-2-3.webp differ diff --git a/public/s2-2-main.webp b/public/s2-2-main.webp new file mode 100644 index 0000000..069c566 Binary files /dev/null and b/public/s2-2-main.webp differ diff --git a/public/s3-main.webp b/public/s3-main.webp new file mode 100644 index 0000000..e28b201 Binary files /dev/null and b/public/s3-main.webp differ diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/(admin)/dashboard/page.tsx b/src/app/(admin)/dashboard/page.tsx new file mode 100644 index 0000000..ef31020 --- /dev/null +++ b/src/app/(admin)/dashboard/page.tsx @@ -0,0 +1,243 @@ +import {ReactNode} from 'react' + +export type DashboardPageProps = { + +} + +export default function DashboardPage(props: DashboardPageProps) { + return ( +
+ + {/* 左侧主要内容区域 */} +
+ + {/* 页面标题 */} +
+
+
+ + + +
+
+

IP资源监控中心

+

实时监控IP资源使用情况和系统性能指标

+
+
+
+ + {/* 数据卡片网格 */} +
+
+
+
+ + + +
+
+

活跃IP数

+

8,721

+

↑12% 较上月

+
+
+
+ +
+
+
+ + + +
+
+

IP可用率

+

99.9%

+

符合SLA标准

+
+
+
+ +
+
+
+ + + +
+
+

平均响应时间

+

47ms

+

优于行业标准

+
+
+
+
+ + {/* 监控指标区域 */} +
+
+

带宽使用趋势

+
+ 带宽使用量图表 +
+
+
+

当前带宽

+

1.2 Gbps

+
+
+

峰值带宽

+

2.5 Gbps

+
+
+

平均带宽

+

800 Mbps

+
+
+
+ +
+

IP地理分布

+
+ 地理分布热力图 +
+
+
+

亚太地区

+

45%

+
+
+

欧美地区

+

35%

+
+
+

其他地区

+

20%

+
+
+
+
+ + {/* 告警信息 */} +
+
+

系统告警

+ 查看全部 +
+
+
+
+ + + +
+
+

带宽使用率超过阈值

+

5分钟前

+
+
+
+
+ + + +
+
+

IP资源池使用率达到80%

+

20分钟前

+
+
+
+
+
+ + {/* 右侧边栏 */} +
+ {/* 用户信息卡片 */} +
+
+
+
+ A +
+
+
+
+

管理员

+

admin@example.com

+
+
+
+
+
+

在线时长

+

4.5h

+
+
+

处理工单

+

12

+
+
+
+
+ + {/* 快捷操作 */} +
+

快捷操作

+
+ + + + +
+
+ + {/* 系统公告 */} +
+
+

系统公告

+ 全部 +
+
+
+
+
+

系统将于本周日凌晨2点进行例行维护升级

+

2024-01-20 10:00

+
+
+
+
+
+

IP资源管理系统V2.0版本更新说明

+

2024-01-18 15:30

+
+
+
+
+
+
+ ) +} diff --git a/src/app/(admin)/layout.tsx b/src/app/(admin)/layout.tsx new file mode 100644 index 0000000..0a6f874 --- /dev/null +++ b/src/app/(admin)/layout.tsx @@ -0,0 +1,198 @@ +import Link from 'next/link' +import {ReactNode} from 'react' + +export type AdminLayoutProps = { + children: ReactNode +} + +export default function AdminLayout(props: AdminLayoutProps) { + return ( +
+ + {/* 左侧导航栏 */} + + + {/* 右侧主内容区 */} +
+ + {/* 顶部导航栏 */} +
+ + {/* 面包屑导航 */} +
+ 首页 + + + + 当前页面 +
+ + {/* 右侧工具栏 */} +
+ {/* 搜索框 */} +
+
+ + + + +
+
+ + {/* 全屏切换 */} + + + {/* 通知 */} + + + {/* 用户菜单 */} +
+ +
+
+
+ + {/* 主内容区域 */} +
+ {props.children} +
+
+
+ ) +} diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx new file mode 100644 index 0000000..1517295 --- /dev/null +++ b/src/app/(auth)/login/page.tsx @@ -0,0 +1,102 @@ +import {ReactNode} from 'react' + +export type LoginPageProps = {} + +export default function LoginPage(props: LoginPageProps) { + return ( + +
+ {/* 左侧背景图 */} +
+ 登录背景 +
+
+

+ 欢迎回来 +

+
+
+
+ + {/* 右侧登录表单 */} +
+
+
+

+ 登录您的账户 +

+

+ 或者{' '} + + 开始14天免费试用 + +

+
+ +
+
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ + +
+ + +
+
+
+
+ ) +} diff --git a/src/app/(home)/footer.tsx b/src/app/(home)/footer.tsx new file mode 100644 index 0000000..596c9dc --- /dev/null +++ b/src/app/(home)/footer.tsx @@ -0,0 +1,106 @@ +import Wrap from '@/components/wrap' + +export type FooterProps = {} + +export default function Footer(props: FooterProps) { + return ( + + ) +} diff --git a/src/app/(home)/header.tsx b/src/app/(home)/header.tsx new file mode 100644 index 0000000..4b224a8 --- /dev/null +++ b/src/app/(home)/header.tsx @@ -0,0 +1,101 @@ +'use client' +import {ReactNode, useEffect, useState} from 'react' +import Link from 'next/link' +import Wrap from '@/components/wrap' + +export type HeaderProps = {} + +export default function Header(props: HeaderProps) { + const [isScrolled, setIsScrolled] = useState(window.scrollY > 0) + + const handleScroll = () => { + setIsScrolled(window.scrollY > 0) + } + + useEffect(() => { + window.addEventListener('scroll', handleScroll) + return () => { + window.removeEventListener('scroll', handleScroll) + } + }, []) + + return ( +
+ + {/* 菜单 */} +
+ {/* logo */} + + {`logo`} + + + {/* 菜单 */} + +
+ {/* 登录 */} +
+ + 登录 + + + 注册 + +
+
+
+ ) +} + +type NavItemTopProps = { + children: ReactNode +} + +function NavItemTop(props: NavItemTopProps) { + return ( +
  • + {props.children} +
  • + ) +} + +function SvgDown() { + return ( + + + + ) +} diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx new file mode 100644 index 0000000..2e5b35a --- /dev/null +++ b/src/app/(home)/page.tsx @@ -0,0 +1,240 @@ +import {ReactNode} from 'react' +import Link from 'next/link' +import Header from '@/app/(home)/header' +import Wrap from '@/components/wrap' +import Image from 'next/image' +import Footer from './footer' + +export default function Home() { + return ( +
    + {/* 页头 */} +
    + + {/* 正文 */} +
    + + {/* banner */} +
    + +

    安全,稳定,快速,合规的代理服务器

    +

    遍布全国的代理服务器节点为用户提供智能可靠的IP代理服务

    + +
    +

    + {`checkbox`} + 全国200+城市节点 +

    +

    + {`checkbox`} + 300+城市级精准定位 +

    +

    + {`checkbox`} + 低延迟&高并发提取 +

    +
    + + +
    +
    + + {/* 数据展示 */} +
    + +

    覆盖全国的IP资源及超大的带宽线路

    +
      +
    • +

      全国城市线路数量

      +

      350+

      +
    • +
    • +

      每日更新IP数量

      +

      1,350,129

      +
    • +
    • +

      用户量

      +

      26,578

      +
    • +
    • +

      IP可用率

      +

      99%

      +
    • +
    + {`map`} +
    +
    + + {/* 优势 1 */} +
    + +

    HTTP安全合规的代理IP资源池

    +
      +
    • + {`s1-1`} +

      短期动态IP池

      +
      +

      + {`check`} + IP时效3-30分钟(可定制) +

      +

      + {`check`} + 支持高并发提取 +

      +
      +
    • +
    • + {`s1-1`} +

      长期静态IP池

      +
      +

      + {`check`} + IP覆盖全国各地 +

      +

      + {`check`} + 平均响应时长:0.03s +

      +
      +
    • +
    • + {`s1-1`} +

      固定IP池

      +
      +

      + {`check`} + 稳定长输不掉线 +

      +

      + {`check`} + 全国热门静态IP线路 +

      +
      +
    • +
    • + {`s1-1`} +

      企业级定制池

      +
      +

      + {`check`} + 可视化监控设计 +

      +

      + {`check`} + 技术团队现场支持 +

      +
      +
    • +
    +
    +
    + + {/* 优势 2 */} +
    + +

    HTTP 产品优势

    + +
    +
      +
    • + {`s2-1-1`} +
      +

      安全合规

      +

      国内三大运营商支持

      +
      +
    • +
    • + {`s2-1-1`} +
      +

      稳定链接

      +

      IP纯净度高达99.9%

      +
      +
    • +
    • + {`s2-1-1`} +
      +

      超匿名性

      +

      稳定传输,保护隐私安全

      +
      +
    • +
    + {`s2-1-main`} +
    + +
    + {`s2-1-main`} +
      +
    • + {`s2-1-1`} +
      +

      API接口文档

      +

      与第三方软件轻松集成

      +
      +
    • +
    • + {`s2-1-1`} +
      +

      多种编程语言代码

      +

      C语言、GO语言、Python...

      +
      +
    • +
    • + {`s2-1-1`} +
      +

      双重认证方式

      +

      API提取+账密认证

      +
      +
    • +
    +
    +
    +
    + + {/* 行业资讯 */} +
    + + +

    行业资讯

    + +
    + + +
    + tumb +
    +

    + 我是标题 + 2025-03-04 +

    +

    + 我是内容我是内容我是内容我是内容我是内容我是容我是内容我是内容内容我是内容我是内容我是内我是内容我是内容我是内容我是内容我是内容... +

    + +
    +
    + + +
    + + +
    +
    +
    + + {/* 页脚 */} +
    + ) +} diff --git a/src/app/SourceHanSansSC-VF.otf.woff2 b/src/app/SourceHanSansSC-VF.otf.woff2 new file mode 100644 index 0000000..b1d8881 Binary files /dev/null and b/src/app/SourceHanSansSC-VF.otf.woff2 differ diff --git a/src/app/globals.css b/src/app/globals.css index a2dc41e..1501140 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,26 +1,5 @@ @import "tailwindcss"; -:root { - --background: #ffffff; - --foreground: #171717; -} - -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + color: hsl(0, 0%, 20%); } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f7fa87e..facb3ca 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,34 +1,25 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import {ReactNode} from 'react' +import {Metadata} from 'next' +import './globals.css' +import localFont from 'next/font/local' -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); +const font = localFont({src: './SourceHanSansSC-VF.otf.woff2'}) export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + title: 'Create Next App', + description: 'Generated by create next app', +} export default function RootLayout({ children, }: Readonly<{ - children: React.ReactNode; + children: ReactNode; }>) { return ( - - + + {children} - ); + ) } diff --git a/src/app/page.tsx b/src/app/page.tsx deleted file mode 100644 index 3eee014..0000000 --- a/src/app/page.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import Image from "next/image"; - -export default function Home() { - return ( -
    -
    - Next.js logo -
      -
    1. - Get started by editing{" "} - - src/app/page.tsx - - . -
    2. -
    3. Save and see your changes instantly.
    4. -
    - -
    - - Vercel logomark - Deploy now - - - Read our docs - -
    -
    - -
    - ); -} diff --git a/src/components/wrap.tsx b/src/components/wrap.tsx new file mode 100644 index 0000000..d4452ba --- /dev/null +++ b/src/components/wrap.tsx @@ -0,0 +1,14 @@ +import {ReactNode} from 'react' + +export type WrapProps = { + children: ReactNode + className?: string +} + +export default function Wrap(props: WrapProps) { + return ( +
    + {props.children} +
    + ) +}