diff --git a/packages/napcat-webui-backend/src/api/UpdateNapCat.ts b/packages/napcat-webui-backend/src/api/UpdateNapCat.ts index 1fc76720..24f4d192 100644 --- a/packages/napcat-webui-backend/src/api/UpdateNapCat.ts +++ b/packages/napcat-webui-backend/src/api/UpdateNapCat.ts @@ -188,20 +188,10 @@ export const UpdateNapCatHandler: RequestHandler = async (_req, res) => { try { // 获取最新release信息 const latestRelease = await getLatestRelease() as Release; - - // 验证 release 响应 - if (!latestRelease || !latestRelease.tag_name) { - throw new Error('无法获取最新版本信息,请稍后重试'); - } - - if (!latestRelease.assets || !Array.isArray(latestRelease.assets)) { - throw new Error('无法获取下载资源列表,可能是 GitHub API 请求限制,请稍后重试'); - } - const ReleaseName = WebUiDataRuntime.getWorkingEnv() === NapCatCoreWorkingEnv.Framework ? 'NapCat.Framework.zip' : 'NapCat.Shell.zip'; const shellZipAsset = latestRelease.assets.find(asset => asset.name === ReleaseName); if (!shellZipAsset) { - throw new Error(`未找到${ReleaseName}文件,可用的资源: ${latestRelease.assets.map(a => a.name).join(', ')}`); + throw new Error(`未找到${ReleaseName}文件`); } // 创建临时目录 @@ -289,13 +279,12 @@ export const UpdateNapCatHandler: RequestHandler = async (_req, res) => { // 发送成功响应 const message = failedFiles.length > 0 ? `更新完成,重启应用以应用剩余${failedFiles.length}个文件的更新` - : '更新完成,请重启 NapCat 以应用更新'; + : '更新完成'; sendSuccess(res, { status: 'completed', message, newVersion: latestRelease.tag_name, - failedFilesCount: failedFiles.length, - needRestart: true + failedFilesCount: failedFiles.length }); } catch (error) { diff --git a/packages/napcat-webui-frontend/src/components/qq_info_card.tsx b/packages/napcat-webui-frontend/src/components/qq_info_card.tsx index 36b35846..3bb53cd6 100644 --- a/packages/napcat-webui-frontend/src/components/qq_info_card.tsx +++ b/packages/napcat-webui-frontend/src/components/qq_info_card.tsx @@ -1,22 +1,29 @@ import { Card, CardBody } from '@heroui/card'; import { Image } from '@heroui/image'; +import { useLocalStorage } from '@uidotdev/usehooks'; import clsx from 'clsx'; import { BsTencentQq } from 'react-icons/bs'; +import key from '@/const/key'; import { SelfInfo } from '@/types/user'; import PageLoading from './page_loading'; export interface QQInfoCardProps { - data?: SelfInfo - error?: Error - loading?: boolean + data?: SelfInfo; + error?: Error; + loading?: boolean; } const QQInfoCard: React.FC = ({ data, error, loading }) => { + const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); + const hasBackground = !!backgroundImage; return ( @@ -31,28 +38,40 @@ const QQInfoCard: React.FC = ({ data, error, loading }) => { ) : ( - -
- -
+ + {!hasBackground && ( +
+ +
+ )}
-
-
{data?.nick}
-
{data?.uin}
+
+
+ {data?.nick || '未知用户'} +
+
+ {data?.uin || 'Unknown'} +
)} diff --git a/packages/napcat-webui-frontend/src/components/system_info.tsx b/packages/napcat-webui-frontend/src/components/system_info.tsx index a5535b27..9f1e325a 100644 --- a/packages/napcat-webui-frontend/src/components/system_info.tsx +++ b/packages/napcat-webui-frontend/src/components/system_info.tsx @@ -3,15 +3,16 @@ import { Button } from '@heroui/button'; import { Chip } from '@heroui/chip'; import { Spinner } from '@heroui/spinner'; import { Tooltip } from '@heroui/tooltip'; +import { useLocalStorage } from '@uidotdev/usehooks'; import { useRequest } from 'ahooks'; +import clsx from 'clsx'; import { FaCircleInfo, FaInfo, FaQq } from 'react-icons/fa6'; import { IoLogoChrome, IoLogoOctocat } from 'react-icons/io'; import { RiMacFill } from 'react-icons/ri'; import { useState } from 'react'; import toast from 'react-hot-toast'; - - +import key from '@/const/key'; import WebUIManager from '@/controllers/webui_manager'; import useDialog from '@/hooks/use-dialog'; @@ -21,6 +22,7 @@ export interface SystemInfoItemProps { icon?: React.ReactNode; value?: React.ReactNode; endContent?: React.ReactNode; + hasBackground?: boolean; } const SystemInfoItem: React.FC = ({ @@ -28,12 +30,21 @@ const SystemInfoItem: React.FC = ({ value = '--', icon, endContent, + hasBackground = false, }) => { return ( -
- {icon} -
{title}
-
{value}
+
+
{icon}
+
{title}
+
{value}
{endContent}
); @@ -261,7 +272,11 @@ const NewVersionTip = (props: NewVersionTipProps) => { ); }; -const NapCatVersion = () => { +interface NapCatVersionProps { + hasBackground?: boolean; +} + +const NapCatVersion: React.FC = ({ hasBackground = false }) => { const { data: packageData, loading: packageLoading, @@ -274,6 +289,7 @@ const NapCatVersion = () => { } + hasBackground={hasBackground} value={ packageError ? ( @@ -302,18 +318,28 @@ const SystemInfo: React.FC = (props) => { loading: qqVersionLoading, error: qqVersionError, } = useRequest(WebUIManager.getQQVersion); + const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); + const hasBackground = !!backgroundImage; + return ( - - - + + + 系统信息 -
- +
+ } + hasBackground={hasBackground} value={ qqVersionError ? ( @@ -332,11 +358,13 @@ const SystemInfo: React.FC = (props) => { title='WebUI 版本' icon={} value='Next' + hasBackground={hasBackground} /> } value={archInfo} + hasBackground={hasBackground} />
diff --git a/packages/napcat-webui-frontend/src/components/system_status_display.tsx b/packages/napcat-webui-frontend/src/components/system_status_display.tsx index 1f5d86c2..037b1886 100644 --- a/packages/napcat-webui-frontend/src/components/system_status_display.tsx +++ b/packages/napcat-webui-frontend/src/components/system_status_display.tsx @@ -1,18 +1,21 @@ import { Card, CardBody } from '@heroui/card'; import { Image } from '@heroui/image'; +import { useLocalStorage } from '@uidotdev/usehooks'; import clsx from 'clsx'; import { BiSolidMemoryCard } from 'react-icons/bi'; import { GiCpu } from 'react-icons/gi'; import bkg from '@/assets/images/bg/1AD934174C0107F14BAD8776D29C5F90.png'; +import key from '@/const/key'; import UsagePie from './usage_pie'; export interface SystemStatusItemProps { - title: string - value?: string | number - size?: 'md' | 'lg' - unit?: string + title: string; + value?: string | number; + size?: 'md' | 'lg'; + unit?: string; + hasBackground?: boolean; } const SystemStatusItem: React.FC = ({ @@ -20,25 +23,35 @@ const SystemStatusItem: React.FC = ({ value = '-', size = 'md', unit, + hasBackground = false, }) => { return (
-
{title}
-
+
{title}
+
{value} - {unit} + {unit && {unit}}
); }; export interface SystemStatusDisplayProps { - data?: SystemStatus + data?: SystemStatus; } const SystemStatusDisplay: React.FC = ({ data }) => { @@ -53,9 +66,14 @@ const SystemStatusDisplay: React.FC = ({ data }) => { memoryUsage.system = (systemUsage / system) * 100; memoryUsage.qq = (qqUsage / system) * 100; } + const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); + const hasBackground = !!backgroundImage; return ( - +
= ({ data }) => {
-

- +

+ CPU

- - - + + +
-

- +

+ 内存

@@ -98,16 +124,19 @@ const SystemStatusDisplay: React.FC = ({ data }) => { value={data?.memory.total} size='lg' unit='MB' + hasBackground={hasBackground} />

diff --git a/packages/napcat-webui-frontend/src/layouts/default.tsx b/packages/napcat-webui-frontend/src/layouts/default.tsx index f1a65905..21b3cc4b 100644 --- a/packages/napcat-webui-frontend/src/layouts/default.tsx +++ b/packages/napcat-webui-frontend/src/layouts/default.tsx @@ -99,10 +99,8 @@ const Layout: React.FC<{ children: React.ReactNode; }> = ({ children }) => { transition={{ duration: 0.4 }} className={clsx( 'flex-1 overflow-y-auto', - 'bg-white/60 dark:bg-black/40 backdrop-blur-xl', - 'shadow-[0_8px_32px_0_rgba(31,38,135,0.07)]', 'transition-all duration-300 ease-in-out', - openSideBar ? 'm-3 ml-0 rounded-3xl border border-white/40 dark:border-white/10' : 'm-0 rounded-none', + openSideBar ? 'ml-0' : 'ml-0', 'pb-10 md:pb-0' )} > diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/index.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/index.tsx index 3cd0db8e..a95ae617 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/index.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/index.tsx @@ -1,6 +1,9 @@ import { Card, CardBody } from '@heroui/card'; +import { useLocalStorage } from '@uidotdev/usehooks'; import { useRequest } from 'ahooks'; +import clsx from 'clsx'; import { useCallback, useEffect, useState, useRef } from 'react'; +import key from '@/const/key'; import toast from 'react-hot-toast'; @@ -92,6 +95,9 @@ const SystemStatusCard: React.FC = ({ setArchInfo }) => { const DashboardIndexPage: React.FC = () => { const [archInfo, setArchInfo] = useState(); + // @ts-ignore + const [backgroundImage] = useLocalStorage(key.backgroundImage, ''); + const hasBackground = !!backgroundImage; return ( <> @@ -105,7 +111,10 @@ const DashboardIndexPage: React.FC = () => {
- +