mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-12 10:16:37 +08:00
压缩历史至 95081aff
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
"use client"
|
||||
|
||||
import { useEffect } from "react"
|
||||
import { UserPayConfigs } from "@/components/common/admin/credit"
|
||||
import { useUser } from "@/contexts/user-context"
|
||||
import { AdminProvider, useAdmin } from "@/contexts/admin-context"
|
||||
|
||||
/* 用户积分配置页面 */
|
||||
export default function UserPayConfigPage() {
|
||||
return (
|
||||
<AdminProvider>
|
||||
<UserPayConfigPageContent />
|
||||
</AdminProvider>
|
||||
)
|
||||
}
|
||||
|
||||
/* 用户积分配置页面内容 */
|
||||
function UserPayConfigPageContent() {
|
||||
const { user } = useUser()
|
||||
const { refetchUserPayConfigs } = useAdmin()
|
||||
|
||||
useEffect(() => {
|
||||
if (user?.is_admin) {
|
||||
refetchUserPayConfigs()
|
||||
}
|
||||
}, [user?.is_admin, refetchUserPayConfigs])
|
||||
|
||||
return <UserPayConfigs />
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
"use client"
|
||||
|
||||
import { AdminUsersProvider } from "@/contexts/admin-users-context"
|
||||
import { useUser } from "@/contexts/user-context"
|
||||
import { LoadingPage } from "@/components/layout/loading"
|
||||
import { ErrorPage } from "@/components/layout/error"
|
||||
|
||||
export default function AdminLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode
|
||||
}) {
|
||||
const { user, loading } = useUser()
|
||||
|
||||
/* 等待用户信息加载完成 */
|
||||
if (loading) {
|
||||
return <LoadingPage text="管理后台" badgeText="管理" />
|
||||
}
|
||||
|
||||
/* 权限检查:只有管理员才能访问 */
|
||||
if (!user?.is_admin) {
|
||||
return (
|
||||
<ErrorPage
|
||||
title="访问被拒绝"
|
||||
message="您没有权限访问此页面"
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<AdminUsersProvider>
|
||||
{children}
|
||||
</AdminUsersProvider>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
"use client"
|
||||
|
||||
import { useEffect } from "react"
|
||||
import { SystemConfigs } from "@/components/common/admin/system"
|
||||
import { useUser } from "@/contexts/user-context"
|
||||
import { AdminProvider, useAdmin } from "@/contexts/admin-context"
|
||||
|
||||
/* 系统配置页面 */
|
||||
export default function SystemConfigPage() {
|
||||
return (
|
||||
<AdminProvider>
|
||||
<SystemConfigPageContent />
|
||||
</AdminProvider>
|
||||
)
|
||||
}
|
||||
|
||||
/* 系统配置页面内容 */
|
||||
function SystemConfigPageContent() {
|
||||
const { user } = useUser()
|
||||
const { refetchSystemConfigs } = useAdmin()
|
||||
|
||||
useEffect(() => {
|
||||
if (user?.is_admin) {
|
||||
refetchSystemConfigs()
|
||||
}
|
||||
}, [user?.is_admin, refetchSystemConfigs])
|
||||
|
||||
return <SystemConfigs />
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
"use client"
|
||||
|
||||
import { TaskManager } from "@/components/common/admin/tasks"
|
||||
|
||||
/* 任务管理页面 */
|
||||
export default function TasksPage() {
|
||||
return <TaskManager />
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
"use client"
|
||||
|
||||
import { UsersManager } from "@/components/common/admin/users"
|
||||
|
||||
/* 用户管理页面 */
|
||||
export default function UsersPage() {
|
||||
return <UsersManager />
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { BalanceMain } from "@/components/common/balance/balance-main"
|
||||
|
||||
export default function BalancePage() {
|
||||
return <BalanceMain />
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { HomeMain } from "@/components/common/home/home-main"
|
||||
|
||||
export default function HomePage() {
|
||||
return <HomeMain />
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
"use client"
|
||||
|
||||
import { motion } from "motion/react"
|
||||
import { usePathname } from "next/navigation"
|
||||
import { useState } from "react"
|
||||
import { AppSidebar } from "@/components/layout/sidebar"
|
||||
import { SiteHeader } from "@/components/layout/header"
|
||||
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"
|
||||
|
||||
import { UserProvider } from "@/contexts/user-context"
|
||||
import { MerchantProvider } from "@/contexts/merchant-context"
|
||||
|
||||
|
||||
export default function MainLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode
|
||||
}) {
|
||||
const pathname = usePathname()
|
||||
const [isFullWidth, setIsFullWidth] = useState(false)
|
||||
|
||||
return (
|
||||
<UserProvider>
|
||||
<MerchantProvider>
|
||||
<SidebarProvider
|
||||
className="h-screen"
|
||||
style={
|
||||
{
|
||||
"--header-height": "60px",
|
||||
} as React.CSSProperties
|
||||
}
|
||||
>
|
||||
<AppSidebar />
|
||||
<SidebarInset className="flex flex-col min-w-0 h-screen">
|
||||
<SiteHeader isFullWidth={isFullWidth} onToggleFullWidth={setIsFullWidth} />
|
||||
<div className="flex flex-1 flex-col bg-background overflow-y-auto overflow-x-hidden min-w-0 hide-scrollbar">
|
||||
<div className={`w-full mx-auto px-4 sm:px-6 md:px-8 lg:px-12 min-w-0 transition-all duration-300 ease-in-out ${!isFullWidth ? "max-w-[1320px]" : "max-w-full"}`}>
|
||||
<motion.div
|
||||
key={pathname}
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: 1 }}
|
||||
transition={{
|
||||
duration: 0.5,
|
||||
ease: "easeOut",
|
||||
}}
|
||||
className="w-full"
|
||||
>
|
||||
{children}
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
</SidebarInset>
|
||||
</SidebarProvider>
|
||||
</MerchantProvider>
|
||||
</UserProvider>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { LeaderboardMain } from "@/components/common/leaderboard/leaderboard-main"
|
||||
|
||||
export default function LeaderboardPage() {
|
||||
return <LeaderboardMain />
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { Suspense } from "react"
|
||||
import { MerchantOnline } from "@/components/common/merchant/merchant-online"
|
||||
|
||||
export default function Page() {
|
||||
return (
|
||||
<Suspense>
|
||||
<MerchantOnline />
|
||||
</Suspense>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { MerchantMain } from "@/components/common/merchant/merchant-main"
|
||||
|
||||
export default function MerchantPage() {
|
||||
return <MerchantMain />
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { AppearanceMain } from "@/components/common/settings/appearance"
|
||||
|
||||
export default function AppearancePage() {
|
||||
return <AppearanceMain />
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { NotificationsMain } from "@/components/common/settings/notifications"
|
||||
|
||||
export default function NotificationsPage() {
|
||||
return <NotificationsMain />
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
import Link from "next/link"
|
||||
import { Card, CardTitle, CardDescription, CardContent } from "@/components/ui/card"
|
||||
import { UserRound, Bell, Shield, Palette } from "lucide-react"
|
||||
|
||||
|
||||
/* 设置项 */
|
||||
const settingsItems = [
|
||||
{
|
||||
title: "个人资料",
|
||||
description: "查看您的账户信息",
|
||||
icon: UserRound,
|
||||
href: "/settings/profile",
|
||||
category: "个人设置",
|
||||
},
|
||||
{
|
||||
title: "通知设置",
|
||||
description: "设置您的通知偏好",
|
||||
icon: Bell,
|
||||
href: "/settings/notifications",
|
||||
category: "账户设置",
|
||||
},
|
||||
{
|
||||
title: "安全设置",
|
||||
description: "管理您的账户安全",
|
||||
icon: Shield,
|
||||
href: "/settings/security",
|
||||
category: "账户设置",
|
||||
},
|
||||
{
|
||||
title: "外观设置",
|
||||
description: "自定义界面主题和显示",
|
||||
icon: Palette,
|
||||
href: "/settings/appearance",
|
||||
category: "个人设置",
|
||||
},
|
||||
]
|
||||
|
||||
export default function SettingsPage() {
|
||||
const groupedSettings = settingsItems.reduce((acc, item) => {
|
||||
if (!acc[item.category]) {
|
||||
acc[item.category] = []
|
||||
}
|
||||
acc[item.category].push(item)
|
||||
return acc
|
||||
}, {} as Record<string, typeof settingsItems>)
|
||||
|
||||
return (
|
||||
<div className="space-y-6 py-6">
|
||||
<div className="font-semibold">设置</div>
|
||||
|
||||
{Object.entries(groupedSettings).map(([category, items]) => (
|
||||
<div key={category} className="space-y-4">
|
||||
<div className="font-medium text-sm text-muted-foreground">{category}</div>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
{items.map((item) => (
|
||||
<Link key={item.href} href={item.href}>
|
||||
<Card className="py-2 border border-dashed shadow-none hover:bg-muted/50 transition-colors cursor-pointer h-full">
|
||||
<CardContent>
|
||||
<div className="flex items-center gap-4">
|
||||
<item.icon className="size-5 text-primary" />
|
||||
<div>
|
||||
<CardTitle className="mb-1 text-sm">{item.title}</CardTitle>
|
||||
<CardDescription className="text-xs">
|
||||
{item.description}
|
||||
</CardDescription>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { ProfileMain } from "@/components/common/settings/profile"
|
||||
|
||||
export default function ProfilePage() {
|
||||
return <ProfileMain />
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { SecurityMain } from "@/components/common/settings/security"
|
||||
|
||||
export default function SecurityPage() {
|
||||
return <SecurityMain />
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { TradeMain } from "@/components/common/trade/trade-main"
|
||||
|
||||
export default function TradePage() {
|
||||
return <TradeMain />
|
||||
}
|
||||
Reference in New Issue
Block a user