From 4d12682cdf91ff5ca25552d702690dfede1da17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=93=E9=BC=A0?= <71394853+hamster1963@users.noreply.github.com> Date: Sun, 22 Dec 2024 23:17:20 +0800 Subject: [PATCH] User Role (#69) * fix: window.DisableAnimatedMan as boolean * chore: auto-fix linting and formatting issues * feat: user role * feat: use user agent_secret * feat: hide setting when user role is not admin * feat: new waf api * chore: auto-fix linting and formatting issues * fix: admin settings page * feat: online-user setting * fix: pagination --------- Co-authored-by: hamster1963 --- bun.lockb | Bin 196047 -> 197035 bytes package.json | 2 +- src/api/online-user.ts | 5 + src/components/install-commands.tsx | 18 +- src/components/settings-tab.tsx | 30 ++- src/components/ui/pagination.tsx | 97 +++++++++ src/components/user.tsx | 37 ++++ src/hooks/useAuth.tsx | 1 + src/main.tsx | 5 + src/routes/online-user.tsx | 305 ++++++++++++++++++++++++++++ src/routes/settings.tsx | 17 +- src/routes/user.tsx | 7 + src/routes/waf.tsx | 176 ++++++++++++++-- src/types/api.ts | 32 ++- src/types/settings.ts | 7 + 15 files changed, 703 insertions(+), 36 deletions(-) create mode 100644 src/api/online-user.ts create mode 100644 src/components/ui/pagination.tsx create mode 100644 src/routes/online-user.tsx diff --git a/bun.lockb b/bun.lockb index 36fa3f4604e8aed98908fbed033d42485a231c63..edf28749140e82bf0b70e500300e0e144e26ce5b 100755 GIT binary patch delta 17597 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 delta 17094 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 WY|4Gnp{ae5R2 => { + return fetcher(FetcherMethod.POST, "/api/v1/online-user/batch-block", ip) +} diff --git a/src/components/install-commands.tsx b/src/components/install-commands.tsx index 425692e..6a92efd 100644 --- a/src/components/install-commands.tsx +++ b/src/components/install-commands.tsx @@ -5,9 +5,10 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" +import { useAuth } from "@/hooks/useAuth" import useSettings from "@/hooks/useSetting" import { copyToClipboard } from "@/lib/utils" -import { ModelSettingResponse } from "@/types" +import { ModelProfile, ModelSettingResponse } from "@/types" import i18next from "i18next" import { Check, Clipboard } from "lucide-react" import { forwardRef, useState } from "react" @@ -23,14 +24,17 @@ enum OSTypes { export const InstallCommandsMenu = forwardRef((props, ref) => { const [copy, setCopy] = useState(false) const { data: settings } = useSettings() + const { profile } = useAuth() + const { t } = useTranslation() const switchState = async (type: number) => { if (!copy) { try { setCopy(true) + if (!profile) throw new Error("Profile is not found.") if (!settings) throw new Error("Settings is not found.") - await copyToClipboard(generateCommand(type, settings) || "") + await copyToClipboard(generateCommand(type, settings, profile) || "") } catch (e: Error | any) { console.error(e) toast(t("Error"), { @@ -85,9 +89,19 @@ export const InstallCommandsMenu = forwardRef((p const generateCommand = ( type: number, { agent_secret_key, install_host, tls }: ModelSettingResponse, + { agent_secret, role }: ModelProfile, ) => { if (!install_host) throw new Error(i18next.t("Results.InstallHostRequired")) + // 如果 agent_secret 为空且 role 为 0 ,则使用 agent_secret_key,否则如果 agent_secret 为空则报错 + if (!agent_secret && role === 0) { + agent_secret = agent_secret_key + } else if (!agent_secret) { + throw new Error(i18next.t("Results.AgentSecretRequired")) + } + + agent_secret_key = agent_secret + const env = `NZ_SERVER=${install_host} NZ_TLS=${tls || false} NZ_CLIENT_SECRET=${agent_secret_key}` const env_win = `$env:NZ_SERVER=\"${install_host}\";$env:NZ_TLS=\"${tls || false}\";$env:NZ_CLIENT_SECRET=\"${agent_secret_key}\";` diff --git a/src/components/settings-tab.tsx b/src/components/settings-tab.tsx index 5c5380e..80eeaf0 100644 --- a/src/components/settings-tab.tsx +++ b/src/components/settings-tab.tsx @@ -1,20 +1,30 @@ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs" +import { useAuth } from "@/hooks/useAuth" import { useTranslation } from "react-i18next" -import { Link, useLocation } from "react-router-dom" +import { Link } from "react-router-dom" export const SettingsTab = ({ className }: { className?: string }) => { const { t } = useTranslation() - const location = useLocation() + const { profile } = useAuth() + + const isAdmin = profile?.role === 0 return ( - - - - {t("Settings")} - - - {t("User")} - + + + {isAdmin && ( + <> + + {t("Settings")} + + + {t("User")} + + + {t("OnlineUser")} + + + )} {t("WAF")} diff --git a/src/components/ui/pagination.tsx b/src/components/ui/pagination.tsx new file mode 100644 index 0000000..7d0f32d --- /dev/null +++ b/src/components/ui/pagination.tsx @@ -0,0 +1,97 @@ +import { ButtonProps, buttonVariants } from "@/components/ui/button" +import { cn } from "@/lib/utils" +import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react" +import * as React from "react" + +const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => ( +