mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-12-20 21:50:10 +08:00
Add cache cleaning feature to backend and frontend
Co-authored-by: sj817 <74231782+sj817@users.noreply.github.com>
This commit is contained in:
parent
94676998cc
commit
94bc4f8301
@ -197,4 +197,12 @@ export default class WebUIManager {
|
|||||||
)
|
)
|
||||||
return data.data
|
return data.data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清理缓存
|
||||||
|
public static async cleanCache() {
|
||||||
|
const { data } = await serverRequest.post<
|
||||||
|
ServerResponse<{ result: boolean; message: string }>
|
||||||
|
>('/base/CleanCache')
|
||||||
|
return data.data
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +1,22 @@
|
|||||||
|
import { Button } from '@heroui/button'
|
||||||
import { Input } from '@heroui/input'
|
import { Input } from '@heroui/input'
|
||||||
import { Switch } from '@heroui/switch'
|
import { Switch } from '@heroui/switch'
|
||||||
import { useRequest } from 'ahooks'
|
import { useRequest } from 'ahooks'
|
||||||
import { useEffect } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import { Controller, useForm } from 'react-hook-form'
|
import { Controller, useForm } from 'react-hook-form'
|
||||||
import toast from 'react-hot-toast'
|
import toast from 'react-hot-toast'
|
||||||
|
import { MdDeleteSweep } from 'react-icons/md'
|
||||||
|
|
||||||
import SaveButtons from '@/components/button/save_buttons'
|
import SaveButtons from '@/components/button/save_buttons'
|
||||||
import PageLoading from '@/components/page_loading'
|
import PageLoading from '@/components/page_loading'
|
||||||
|
|
||||||
|
import useDialog from '@/hooks/use-dialog'
|
||||||
|
|
||||||
import WebUIManager from '@/controllers/webui_manager'
|
import WebUIManager from '@/controllers/webui_manager'
|
||||||
|
|
||||||
const ServerConfigCard = () => {
|
const ServerConfigCard = () => {
|
||||||
|
const dialog = useDialog()
|
||||||
|
const [isCleaningCache, setIsCleaningCache] = useState(false)
|
||||||
const {
|
const {
|
||||||
data: configData,
|
data: configData,
|
||||||
loading: configLoading,
|
loading: configLoading,
|
||||||
@ -69,6 +75,42 @@ const ServerConfigCard = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleCleanCache = () => {
|
||||||
|
dialog.confirm({
|
||||||
|
title: '清理缓存',
|
||||||
|
content: (
|
||||||
|
<div className="space-y-2">
|
||||||
|
<p>确定要清理缓存吗?此操作将清理以下内容:</p>
|
||||||
|
<ul className="list-disc list-inside text-sm text-default-600">
|
||||||
|
<li>临时文件夹中的所有文件</li>
|
||||||
|
<li>图片缓存 (Pic)</li>
|
||||||
|
<li>语音缓存 (Ptt)</li>
|
||||||
|
<li>视频缓存 (Video)</li>
|
||||||
|
<li>文件缓存 (File)</li>
|
||||||
|
<li>日志文件 (log)</li>
|
||||||
|
</ul>
|
||||||
|
<p className="text-warning text-sm">此操作不可撤销,请谨慎操作。</p>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
onConfirm: async () => {
|
||||||
|
setIsCleaningCache(true)
|
||||||
|
try {
|
||||||
|
const result = await WebUIManager.cleanCache()
|
||||||
|
if (result.result) {
|
||||||
|
toast.success(result.message || '缓存清理成功')
|
||||||
|
} else {
|
||||||
|
toast.error(result.message || '缓存清理失败')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
const msg = (error as Error).message
|
||||||
|
toast.error(`清理缓存失败: ${msg}`)
|
||||||
|
} finally {
|
||||||
|
setIsCleaningCache(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
reset()
|
reset()
|
||||||
}, [configData])
|
}, [configData])
|
||||||
@ -131,6 +173,30 @@ const ServerConfigCard = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-col gap-2">
|
||||||
|
<div className="flex-shrink-0 w-full">维护操作</div>
|
||||||
|
<div className="flex flex-col gap-2 p-4 rounded-lg bg-default-50">
|
||||||
|
<div className="flex items-start justify-between gap-2">
|
||||||
|
<div className="flex-1">
|
||||||
|
<div className="font-medium">清理缓存</div>
|
||||||
|
<div className="text-sm text-default-500">
|
||||||
|
清理临时文件、图片、语音、视频、文件缓存和日志文件
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
color="danger"
|
||||||
|
variant="flat"
|
||||||
|
startContent={<MdDeleteSweep size={20} />}
|
||||||
|
onPress={handleCleanCache}
|
||||||
|
isLoading={isCleaningCache}
|
||||||
|
isDisabled={!!configError}
|
||||||
|
>
|
||||||
|
清理缓存
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
<div className="flex-shrink-0 w-full">安全配置</div>
|
<div className="flex-shrink-0 w-full">安全配置</div>
|
||||||
<Controller
|
<Controller
|
||||||
|
|||||||
@ -217,6 +217,15 @@ export class NapCatOneBot11Adapter {
|
|||||||
//this.context.logger.log(`OneBot11 配置更改:${JSON.stringify(prev)} -> ${JSON.stringify(newConfig)}`);
|
//this.context.logger.log(`OneBot11 配置更改:${JSON.stringify(prev)} -> ${JSON.stringify(newConfig)}`);
|
||||||
await this.reloadNetwork(prev, newConfig);
|
await this.reloadNetwork(prev, newConfig);
|
||||||
});
|
});
|
||||||
|
WebUiDataRuntime.setCleanCacheCall(async () => {
|
||||||
|
try {
|
||||||
|
await this.actions.get('clean_cache')?.handle({});
|
||||||
|
return { result: true, message: '缓存清理成功' };
|
||||||
|
} catch (error) {
|
||||||
|
this.context.logger.logError('清理缓存失败:', error);
|
||||||
|
return { result: false, message: `清理缓存失败: ${(error as Error).message}` };
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -24,3 +24,8 @@ export const SetThemeConfigHandler: RequestHandler = async (req, res) => {
|
|||||||
await WebUiConfig.UpdateTheme(theme);
|
await WebUiConfig.UpdateTheme(theme);
|
||||||
sendSuccess(res, { message: '更新成功' });
|
sendSuccess(res, { message: '更新成功' });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const CleanCacheHandler: RequestHandler = async (_, res) => {
|
||||||
|
const result = await WebUiDataRuntime.requestCleanCache();
|
||||||
|
sendSuccess(res, result);
|
||||||
|
};
|
||||||
|
|||||||
@ -27,6 +27,9 @@ const LoginRuntime: LoginRuntimeType = {
|
|||||||
onQuickLoginRequested: async () => {
|
onQuickLoginRequested: async () => {
|
||||||
return { result: false, message: '' };
|
return { result: false, message: '' };
|
||||||
},
|
},
|
||||||
|
onCleanCacheRequested: async () => {
|
||||||
|
return { result: false, message: '' };
|
||||||
|
},
|
||||||
QQLoginList: [],
|
QQLoginList: [],
|
||||||
NewQQLoginList: [],
|
NewQQLoginList: [],
|
||||||
},
|
},
|
||||||
@ -130,6 +133,14 @@ export const WebUiDataRuntime = {
|
|||||||
return LoginRuntime.NapCatHelper.onOB11ConfigChanged(ob11);
|
return LoginRuntime.NapCatHelper.onOB11ConfigChanged(ob11);
|
||||||
} as LoginRuntimeType['NapCatHelper']['onOB11ConfigChanged'],
|
} as LoginRuntimeType['NapCatHelper']['onOB11ConfigChanged'],
|
||||||
|
|
||||||
|
setCleanCacheCall(func: LoginRuntimeType['NapCatHelper']['onCleanCacheRequested']): void {
|
||||||
|
LoginRuntime.NapCatHelper.onCleanCacheRequested = func;
|
||||||
|
},
|
||||||
|
|
||||||
|
requestCleanCache: function () {
|
||||||
|
return LoginRuntime.NapCatHelper.onCleanCacheRequested();
|
||||||
|
} as LoginRuntimeType['NapCatHelper']['onCleanCacheRequested'],
|
||||||
|
|
||||||
getPackageJson() {
|
getPackageJson() {
|
||||||
return LoginRuntime.packageJson;
|
return LoginRuntime.packageJson;
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { Router } from 'express';
|
import { Router } from 'express';
|
||||||
import { GetThemeConfigHandler, PackageInfoHandler, QQVersionHandler, SetThemeConfigHandler } from '../api/BaseInfo';
|
import { CleanCacheHandler, GetThemeConfigHandler, PackageInfoHandler, QQVersionHandler, SetThemeConfigHandler } from '../api/BaseInfo';
|
||||||
import { StatusRealTimeHandler } from '@webapi/api/Status';
|
import { StatusRealTimeHandler } from '@webapi/api/Status';
|
||||||
import { GetProxyHandler } from '../api/Proxy';
|
import { GetProxyHandler } from '../api/Proxy';
|
||||||
|
|
||||||
@ -11,5 +11,6 @@ router.get('/GetSysStatusRealTime', StatusRealTimeHandler);
|
|||||||
router.get('/proxy', GetProxyHandler);
|
router.get('/proxy', GetProxyHandler);
|
||||||
router.get('/Theme', GetThemeConfigHandler);
|
router.get('/Theme', GetThemeConfigHandler);
|
||||||
router.post('/SetTheme', SetThemeConfigHandler);
|
router.post('/SetTheme', SetThemeConfigHandler);
|
||||||
|
router.post('/CleanCache', CleanCacheHandler);
|
||||||
|
|
||||||
export { router as BaseRouter };
|
export { router as BaseRouter };
|
||||||
|
|||||||
1
src/webui/src/types/data.d.ts
vendored
1
src/webui/src/types/data.d.ts
vendored
@ -15,6 +15,7 @@ interface LoginRuntimeType {
|
|||||||
NapCatHelper: {
|
NapCatHelper: {
|
||||||
onQuickLoginRequested: (uin: string) => Promise<{ result: boolean; message: string }>;
|
onQuickLoginRequested: (uin: string) => Promise<{ result: boolean; message: string }>;
|
||||||
onOB11ConfigChanged: (ob11: OneBotConfig) => Promise<void>;
|
onOB11ConfigChanged: (ob11: OneBotConfig) => Promise<void>;
|
||||||
|
onCleanCacheRequested: () => Promise<{ result: boolean; message: string }>;
|
||||||
QQLoginList: string[];
|
QQLoginList: string[];
|
||||||
NewQQLoginList: LoginListItem[];
|
NewQQLoginList: LoginListItem[];
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user