diff --git a/package.json b/package.json index b89de23..eb8af66 100644 --- a/package.json +++ b/package.json @@ -9,22 +9,27 @@ "lint": "next lint" }, "dependencies": { - "@hookform/resolvers": "^4.1.3", + "next": "15.2.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + + "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-label": "^2.1.2", "@radix-ui/react-radio-group": "^1.2.3", "@radix-ui/react-select": "^2.1.6", "@radix-ui/react-slot": "^1.1.2", + "lucide-react": "^0.479.0", + "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "lucide-react": "^0.479.0", - "motion": "^12.5.0", - "next": "15.2.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-hook-form": "^7.54.2", "tailwind-merge": "^3.0.2", + + "react-hook-form": "^7.54.2", + "@hookform/resolvers": "^4.1.3", + "zod": "^3.24.2", + "tailwindcss-animate": "^1.0.7", - "zod": "^3.24.2" + "motion": "^12.5.0" }, "devDependencies": { "@eslint/eslintrc": "^3", @@ -40,4 +45,4 @@ "typescript": "^5" }, "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b" -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffe2657..51337c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@hookform/resolvers': specifier: ^4.1.3 version: 4.1.3(react-hook-form@7.54.2(react@19.0.0)) + '@radix-ui/react-checkbox': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-label': specifier: ^2.1.2 version: 2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -384,6 +387,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-checkbox@1.1.4': + resolution: {integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collection@1.1.2': resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} peerDependencies: @@ -2321,6 +2337,22 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-checkbox@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) diff --git a/public/login/bg.webp b/public/login/bg.webp new file mode 100644 index 0000000..246a35e Binary files /dev/null and b/public/login/bg.webp differ diff --git a/src/app/(admin)/dashboard/page.tsx b/src/app/(admin)/dashboard/page.tsx deleted file mode 100644 index ef31020..0000000 --- a/src/app/(admin)/dashboard/page.tsx +++ /dev/null @@ -1,243 +0,0 @@ -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 deleted file mode 100644 index 0a6f874..0000000 --- a/src/app/(admin)/layout.tsx +++ /dev/null @@ -1,198 +0,0 @@ -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 index 1517295..125f02b 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -1,102 +1,101 @@ -import {ReactNode} from 'react' +'use client' +import { ReactNode, useState } from 'react' +import Image from 'next/image' +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Button } from "@/components/ui/button" +import { Checkbox } from "@/components/ui/checkbox" export type LoginPageProps = {} export default function LoginPage(props: LoginPageProps) { - return ( - -
- {/* 左侧背景图 */} -
- 登录背景 -
-
-

- 欢迎回来 -

-
-
-
+ const [countdown, setCountdown] = useState(0); - {/* 右侧登录表单 */} -
+ const handleSendCode = () => { + // 这里实现发送验证码的逻辑 + setCountdown(60); + const timer = setInterval(() => { + setCountdown((prev) => { + if (prev <= 1) { + clearInterval(timer); + return 0; + } + return prev - 1; + }); + }, 1000); + }; + + return ( + +
+ + {/* 登录表单 */} +
-

- 登录您的账户 +

+ 登录/注册

-

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

-
- - + +
-
- - +
+ +
+ + +
-
- -
- +
+ + +

+ 登录即表示您同意《用户协议》《隐私政策》 +

+
-
+
) } diff --git a/src/app/(root)/@footer/page.tsx b/src/app/(root)/@footer/page.tsx index 1c43ed3..60088c4 100644 --- a/src/app/(root)/@footer/page.tsx +++ b/src/app/(root)/@footer/page.tsx @@ -9,17 +9,17 @@ export default function Footer(props: FooterProps) {
logo - 关注我们查看更多资讯 + 关注我们查看更多资讯

商务合作

-

大客户经理:张经理

-

电话/微信:18751847847

-

QQ号:800180559

+

大客户经理:张经理

+

电话/微信:18751847847

+

QQ号:800180559

服务保障

- - + +
-

+

声明:啊啊HTTP仅提供代理IP服务;严禁用户使用啊啊HTTP从事任何违法犯罪行为,产生的相关责任用户自负,对此啊啊HTTP不承担任何法律责任。 自律公约

-

+

南京啊啊啊啊科技有限公司 版权所有网站地图 地址:啊啊啊啊啊啊啊啊啊大街57号楚翘城7幢404-405室

-

+

电信业务经营许可证:B1-11111111 苏ICP备111111111号-1 苏公网安备11111111111111号 @@ -109,7 +109,7 @@ function SiteNavList(props: {

{props.title}

    {props.items.map((item, index) => ( diff --git a/src/app/(root)/@header/page.tsx b/src/app/(root)/@header/page.tsx index 27fa6f0..adc757c 100644 --- a/src/app/(root)/@header/page.tsx +++ b/src/app/(root)/@header/page.tsx @@ -7,7 +7,7 @@ import SolutionMenu from './_client/solution' import ProductMenu from './_client/product' import HelpMenu from './_client/help' import Wrap from '@/components/wrap' -import logo from '@/assets/logo.png' +import logo from '@/assets/logo.webp' export type HeaderProps = {} @@ -114,18 +114,22 @@ export default function Header(props: HeaderProps) {
{/* 登录 */}
- 登录 - - + 注册 - +
diff --git a/src/app/(root)/layout.tsx b/src/app/(root)/layout.tsx index 82c28d2..dc7c424 100644 --- a/src/app/(root)/layout.tsx +++ b/src/app/(root)/layout.tsx @@ -8,7 +8,7 @@ export type RootLayoutProps = { export default function RootLayout(props: RootLayoutProps) { return ( -
+
{/* 页头 */}
diff --git a/src/app/(root)/page.tsx b/src/app/(root)/page.tsx index 4382406..3c527ef 100644 --- a/src/app/(root)/page.tsx +++ b/src/app/(root)/page.tsx @@ -9,28 +9,28 @@ export default function Home() { {/* banner */}
-

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

+

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

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

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

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

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

@@ -129,7 +129,7 @@ export default function Home() { tumb

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

@@ -161,7 +161,7 @@ function Section(props: { return (

-

{props.title}

+

{props.title}

{props.children}
@@ -183,7 +183,7 @@ function Sec3Item(props: { `max-md:items-center`, ].join(' ')}> {`s1-1`} -

{props.title}

+

{props.title}

{props.terms.map((item, index) => { return ( @@ -207,7 +207,7 @@ function Sec4Item(props: {
  • {`s2-1-1`}
    -

    {props.title}

    +

    {props.title}

    {props.description}

  • diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d1ab2d5..8a018e5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,8 +3,6 @@ import {Metadata} from 'next' import './globals.css' import localFont from 'next/font/local' -const font = localFont({src: './SourceHanSansSC-VF.otf.woff2'}) - export const metadata: Metadata = { title: 'Create Next App', description: 'Generated by create next app', @@ -17,7 +15,7 @@ export default function RootLayout({ }>) { return ( - + {children} diff --git a/src/assets/logo.png b/src/assets/logo.png deleted file mode 100644 index be7c2c6..0000000 Binary files a/src/assets/logo.png and /dev/null differ diff --git a/src/assets/logo.webp b/src/assets/logo.webp new file mode 100644 index 0000000..1a946ee Binary files /dev/null and b/src/assets/logo.webp differ diff --git a/src/components/bread-crumb.tsx b/src/components/bread-crumb.tsx index fb6fada..a691592 100644 --- a/src/components/bread-crumb.tsx +++ b/src/components/bread-crumb.tsx @@ -49,7 +49,7 @@ export default function BreadCrumb({ ) : ( {item.label} diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index a2df8dc..278bdfc 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -5,7 +5,12 @@ import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "inline-flex items-center justify-center gap-2 " + + "whitespace-nowrap rounded-md text-sm transition-all " + + "disabled:pointer-events-none disabled:opacity-50 " + + "[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 " + + "outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] " + + "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { diff --git a/src/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..fa0e4b5 --- /dev/null +++ b/src/components/ui/checkbox.tsx @@ -0,0 +1,32 @@ +"use client" + +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { CheckIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Checkbox({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + + ) +} + +export { Checkbox } diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index 03295ca..4e6a529 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -8,7 +8,7 @@ function Input({ className, type, ...props }: React.ComponentProps<"input">) { type={type} data-slot="input" className={cn( - "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", + "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", className diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index fb5fbc3..b8c7e71 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -13,7 +13,7 @@ function Label({ ) diff --git a/src/utils/index.ts b/src/utils/index.ts deleted file mode 100644 index 8b13789..0000000 --- a/src/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -