diff --git a/.env b/.env
index 0f15930..415afbc 100644
--- a/.env
+++ b/.env
@@ -1 +1,3 @@
-VITE_API_BASE_URL=http://192.168.0.15:8080
\ No newline at end of file
+VITE_API_BASE_URL=http://192.168.0.15:8080
+VITE_CLIENT_ID=web
+VITE_CLIENT_SECRET=web
\ No newline at end of file
diff --git a/bun.lock b/bun.lock
index 0d8c165..e6aeef8 100644
--- a/bun.lock
+++ b/bun.lock
@@ -7,6 +7,7 @@
"dependencies": {
"@fontsource-variable/geist": "^5.2.9",
"@tailwindcss/vite": "^4.3.0",
+ "@tanstack/react-table": "^8.21.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^1.17.0",
@@ -342,6 +343,10 @@
"@tailwindcss/vite": ["@tailwindcss/vite@4.3.0", "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.3.0.tgz", { "dependencies": { "@tailwindcss/node": "4.3.0", "@tailwindcss/oxide": "4.3.0", "tailwindcss": "4.3.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw=="],
+ "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "https://registry.npmmirror.com/@tanstack/react-table/-/react-table-8.21.3.tgz", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="],
+
+ "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "https://registry.npmmirror.com/@tanstack/table-core/-/table-core-8.21.3.tgz", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="],
+
"@ts-morph/common": ["@ts-morph/common@0.27.0", "https://registry.npmmirror.com/@ts-morph/common/-/common-0.27.0.tgz", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="],
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="],
diff --git a/package.json b/package.json
index c523bea..b4da69b 100644
--- a/package.json
+++ b/package.json
@@ -1,37 +1,38 @@
{
- "name": "juip-web",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite --host",
- "build": "tsc -b && vite build",
- "lint": "biome check --write"
- },
- "dependencies": {
- "@fontsource-variable/geist": "^5.2.9",
- "@tailwindcss/vite": "^4.3.0",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "lucide-react": "^1.17.0",
- "radix-ui": "^1.5.0",
- "react": "^19.2.6",
- "react-dom": "^19.2.6",
- "react-router-dom": "^7.17.0",
- "shadcn": "^4.11.0",
- "tailwind-merge": "^3.6.0",
- "tailwindcss": "^4.3.0",
- "tw-animate-css": "^1.4.0"
- },
- "devDependencies": {
- "@biomejs/biome": "2.4.16",
- "@types/node": "^25.9.2",
- "@types/react": "^19.2.14",
- "@types/react-dom": "^19.2.3",
- "@vitejs/plugin-react": "^6.0.1",
- "globals": "^17.6.0",
- "typescript": "~6.0.2",
- "vite": "^8.0.12"
- },
- "packageManager": "bun@1.3.2"
+ "name": "juip-web",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite --host",
+ "build": "tsc -b && vite build",
+ "lint": "biome check --write"
+ },
+ "dependencies": {
+ "@fontsource-variable/geist": "^5.2.9",
+ "@tailwindcss/vite": "^4.3.0",
+ "@tanstack/react-table": "^8.21.3",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "lucide-react": "^1.17.0",
+ "radix-ui": "^1.5.0",
+ "react": "^19.2.6",
+ "react-dom": "^19.2.6",
+ "react-router-dom": "^7.17.0",
+ "shadcn": "^4.11.0",
+ "tailwind-merge": "^3.6.0",
+ "tailwindcss": "^4.3.0",
+ "tw-animate-css": "^1.4.0"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "2.4.16",
+ "@types/node": "^25.9.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "globals": "^17.6.0",
+ "typescript": "~6.0.2",
+ "vite": "^8.0.12"
+ },
+ "packageManager": "bun@1.3.2"
}
diff --git a/public/favicon.svg b/public/favicon.svg
index 6893eb1..8a5c70d 100644
--- a/public/favicon.svg
+++ b/public/favicon.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
diff --git a/public/icons.svg b/public/icons.svg
deleted file mode 100644
index e952219..0000000
--- a/public/icons.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
diff --git a/src/admin/assets/b10.webp b/src/admin/assets/b10.webp
new file mode 100644
index 0000000..529b7d8
Binary files /dev/null and b/src/admin/assets/b10.webp differ
diff --git a/src/admin/assets/b11.webp b/src/admin/assets/b11.webp
new file mode 100644
index 0000000..cc7bd20
Binary files /dev/null and b/src/admin/assets/b11.webp differ
diff --git a/src/admin/assets/b12.webp b/src/admin/assets/b12.webp
new file mode 100644
index 0000000..4e0151c
Binary files /dev/null and b/src/admin/assets/b12.webp differ
diff --git a/src/admin/assets/b3.webp b/src/admin/assets/b3.webp
new file mode 100644
index 0000000..e40c110
Binary files /dev/null and b/src/admin/assets/b3.webp differ
diff --git a/src/admin/assets/b4.webp b/src/admin/assets/b4.webp
new file mode 100644
index 0000000..9d776b6
Binary files /dev/null and b/src/admin/assets/b4.webp differ
diff --git a/src/admin/assets/b5.webp b/src/admin/assets/b5.webp
new file mode 100644
index 0000000..6d62048
Binary files /dev/null and b/src/admin/assets/b5.webp differ
diff --git a/src/admin/assets/b6.webp b/src/admin/assets/b6.webp
new file mode 100644
index 0000000..68677d0
Binary files /dev/null and b/src/admin/assets/b6.webp differ
diff --git a/src/admin/assets/b7.webp b/src/admin/assets/b7.webp
new file mode 100644
index 0000000..c619d22
Binary files /dev/null and b/src/admin/assets/b7.webp differ
diff --git a/src/admin/assets/b8.webp b/src/admin/assets/b8.webp
new file mode 100644
index 0000000..5ee9571
Binary files /dev/null and b/src/admin/assets/b8.webp differ
diff --git a/src/admin/assets/b9.webp b/src/admin/assets/b9.webp
new file mode 100644
index 0000000..f70d363
Binary files /dev/null and b/src/admin/assets/b9.webp differ
diff --git a/src/admin/assets/banner.webp b/src/admin/assets/banner.webp
new file mode 100644
index 0000000..5dc8c25
Binary files /dev/null and b/src/admin/assets/banner.webp differ
diff --git a/src/admin/assets/banner2.webp b/src/admin/assets/banner2.webp
new file mode 100644
index 0000000..638c8fe
Binary files /dev/null and b/src/admin/assets/banner2.webp differ
diff --git a/src/admin/channels/page.tsx b/src/admin/channels/page.tsx
new file mode 100644
index 0000000..bfb0580
--- /dev/null
+++ b/src/admin/channels/page.tsx
@@ -0,0 +1,5 @@
+import Page from "@/components/page"
+
+export default function ChannelsPage() {
+ return IP管理
+}
diff --git a/src/admin/clients.tsx b/src/admin/clients.tsx
index 93620b5..9541ab4 100644
--- a/src/admin/clients.tsx
+++ b/src/admin/clients.tsx
@@ -1,9 +1,19 @@
import {
- IdCard,
- MessageCircleMoreIcon,
+ Archive,
+ CalendarClock,
+ CircleDollarSignIcon,
+ ClipboardClock,
+ ClipboardList,
+ Clock1,
+ FolderCode,
+ LayoutDashboard,
PanelLeftCloseIcon,
PanelLeftOpenIcon,
- UserRound,
+ ReceiptJapaneseYenIcon,
+ Router,
+ ShoppingBag,
+ TicketPercent,
+ UserCheck,
} from "lucide-react"
import { type ReactNode, useState } from "react"
import { Link } from "react-router-dom"
@@ -16,19 +26,20 @@ import {
} from "@/components/ui/tooltip"
import { cn } from "@/lib/utils"
import logoAvatar from "./assets/logo-avatar.svg"
+import { useLayout } from "./layout-context"
-export function Shell(props: { children: ReactNode; navbar: boolean }) {
- const { navbar } = props
+export function Shell(props: { children: ReactNode }) {
+ const { navbar } = useLayout()
return (
{props.children}
@@ -36,49 +47,45 @@ export function Shell(props: { children: ReactNode; navbar: boolean }) {
)
}
-export function Mask(props: {
- navbar: boolean
- setNavbar: (v: boolean) => void
-}) {
- const { navbar, setNavbar } = props
+export function Content(props: { children: ReactNode }) {
+ const { navbar } = useLayout()
+ return (
+
+ {props.children}
+
+ )
+}
+export function Mask() {
+ const { navbar, setNavbar } = useLayout()
return (