v0.1.4-p4

main
mula.liu 2026-04-02 13:00:15 +08:00
parent 12ce92c6d9
commit 5058599de4
4 changed files with 31 additions and 4 deletions

View File

@ -10,6 +10,7 @@ from services.platform_service import (
build_platform_overview,
create_or_update_system_setting,
delete_system_setting,
get_bot_activity_stats,
get_platform_settings,
list_system_settings,
list_activity_events,
@ -67,6 +68,11 @@ def get_platform_usage(
return list_usage(session, bot_id=bot_id, limit=limit, offset=offset)
@router.get("/api/platform/activity-stats")
def get_platform_activity_stats(session: Session = Depends(get_session)):
return {"items": get_bot_activity_stats(session)}
@router.get("/api/platform/events")
def get_platform_events(bot_id: Optional[str] = None, limit: int = 100, session: Session = Depends(get_session)):
return {"items": list_activity_events(session, bot_id=bot_id, limit=limit)}

View File

@ -1,4 +1,5 @@
from services.platform_activity_service import (
get_bot_activity_stats,
list_activity_events,
prune_expired_activity_events,
record_activity_event,

View File

@ -37,7 +37,7 @@ export function PlatformAdminDashboardPage({ compactMode }: PlatformAdminDashboa
<PlatformBotActivityAnalyticsSection
isZh={dashboard.isZh}
activityStats={dashboard.activityStats}
loading={dashboard.loading}
loading={dashboard.activityLoading}
/>
</div>
</div>

View File

@ -12,6 +12,7 @@ import {
writeCachedPlatformPageSize,
} from '../../../utils/platformPageSize';
import type {
BotActivityStatsItem,
PlatformBotResourceSnapshot,
PlatformOverviewResponse,
PlatformSettings,
@ -52,6 +53,8 @@ export function usePlatformDashboard({ compactMode }: UsePlatformDashboardOption
const [resourceError, setResourceError] = useState('');
const [usageData, setUsageData] = useState<PlatformUsageResponse | null>(null);
const [usageLoading, setUsageLoading] = useState(false);
const [activityStatsData, setActivityStatsData] = useState<BotActivityStatsItem[] | null>(null);
const [activityLoading, setActivityLoading] = useState(false);
const [usagePage, setUsagePage] = useState(1);
const [usagePageSize, setUsagePageSize] = useState(() => readCachedPlatformPageSize(10));
const [pageSizeReady, setPageSizeReady] = useState(true);
@ -131,6 +134,18 @@ export function usePlatformDashboard({ compactMode }: UsePlatformDashboardOption
}
}, [isZh, notify, usagePageSize]);
const loadActivityStats = useCallback(async () => {
setActivityLoading(true);
try {
const res = await axios.get<{ items: BotActivityStatsItem[] }>(`${APP_ENDPOINTS.apiBase}/platform/activity-stats`);
setActivityStatsData(Array.isArray(res.data?.items) ? res.data.items : []);
} catch (error: any) {
notify(error?.response?.data?.detail || (isZh ? '读取 Bot 活跃度统计失败。' : 'Failed to load bot activity analytics.'), { tone: 'error' });
} finally {
setActivityLoading(false);
}
}, [isZh, notify]);
const loadSelectedBotUsageSummary = useCallback(async (botId: string) => {
if (!botId) {
setSelectedBotUsageSummary(null);
@ -174,6 +189,10 @@ export function usePlatformDashboard({ compactMode }: UsePlatformDashboardOption
void loadUsage(1);
}, [loadUsage, pageSizeReady, usagePageSize]);
useEffect(() => {
void loadActivityStats();
}, [loadActivityStats]);
useEffect(() => {
setBotListPage(1);
}, [search, botListPageSize]);
@ -254,7 +273,7 @@ export function usePlatformDashboard({ compactMode }: UsePlatformDashboardOption
const overviewBots = overview?.summary.bots;
const overviewImages = overview?.summary.images;
const overviewResources = overview?.summary.resources;
const activityStats = overview?.activity_stats;
const activityStats = activityStatsData || overview?.activity_stats;
const usageSummary = usageData?.summary || overview?.usage.summary;
const usageAnalytics = usageData?.analytics || overview?.usage.analytics || null;
@ -283,10 +302,10 @@ export function usePlatformDashboard({ compactMode }: UsePlatformDashboardOption
const usageAnalyticsTicks = useMemo(() => buildPlatformUsageAnalyticsTicks(usageAnalyticsMax), [usageAnalyticsMax]);
const refreshAll = useCallback(async () => {
const jobs: Promise<unknown>[] = [loadOverview(), loadBots(), loadUsage(usagePage)];
const jobs: Promise<unknown>[] = [loadOverview(), loadBots(), loadUsage(usagePage), loadActivityStats()];
if (selectedBotId) jobs.push(loadSelectedBotUsageSummary(selectedBotId));
await Promise.allSettled(jobs);
}, [loadBots, loadOverview, loadSelectedBotUsageSummary, loadUsage, selectedBotId, usagePage]);
}, [loadActivityStats, loadBots, loadOverview, loadSelectedBotUsageSummary, loadUsage, selectedBotId, usagePage]);
const toggleBot = useCallback(async (bot: BotState) => {
setOperatingBotId(bot.id);
@ -496,6 +515,7 @@ export function usePlatformDashboard({ compactMode }: UsePlatformDashboardOption
toggleBot,
usageAnalytics,
activityStats,
activityLoading,
usageAnalyticsMax,
usageAnalyticsSeries,
usageAnalyticsTicks,