feat(admin): Implement operational monitoring MVP and login optimization

Summary:
- Add SimpleLog table for activity tracking (admin_schema)
- Implement ActivityService with fire-and-forget pattern
- Add stats API endpoints (overview/live-feed/user-overview/cleanup)
- Complete activity logging for 7 modules (SYSTEM/AIA/PKB/ASL/DC/RVW/IIT)
- Update Admin Dashboard with DAU/DAT metrics and live feed
- Fix user module permission display logic
- Fix login redirect to /ai-qa instead of homepage
- Replace top navigation LOGO with brand image
- Fix PKB workspace layout CSS conflict (rename to .pa-chat-container)

New files:
- backend/src/common/services/activity.service.ts
- backend/src/modules/admin/controllers/statsController.ts
- backend/src/modules/admin/routes/statsRoutes.ts
- frontend-v2/src/modules/admin/api/statsApi.ts
- docs/03-.../04-operational-monitoring-mvp-plan.md
- docs/03-.../04-operational-monitoring-mvp-implementation.md

Tested: All features verified locally
This commit is contained in:
2026-01-25 22:16:16 +08:00
parent 303dd78c54
commit 01a17f1e6f
36 changed files with 2962 additions and 95 deletions

View File

@@ -397,7 +397,7 @@ export const ChatArea: React.FC<ChatAreaProps> = ({
return (
<section className="chat-area">
{/* 聊天历史 */}
<div className="chat-container" ref={chatContainerRef}>
<div className="pa-chat-container" ref={chatContainerRef}>
{/* 加载历史消息时显示加载状态 */}
{isLoadingHistory && (
<div className="loading-history">

View File

@@ -411,8 +411,8 @@
overflow: hidden;
}
/* 聊天容器 */
.chat-container {
/* 聊天容器 - 使用 pa- 前缀避免与共享组件 ChatContainer 冲突 */
.pa-chat-container {
flex: 1;
min-height: 0; /* 关键:允许 flex 子元素收缩 */
overflow-y: auto;
@@ -1838,7 +1838,7 @@
/* ============================================ */
/* 滚动条美化 - 始终可见 */
/* ============================================ */
.chat-container,
.pa-chat-container,
.panel-body,
.conversations-list,
.document-scroll-area {
@@ -1846,14 +1846,14 @@
scrollbar-color: #94A3B8 #F1F5F9;
}
.chat-container::-webkit-scrollbar,
.pa-chat-container::-webkit-scrollbar,
.panel-body::-webkit-scrollbar,
.conversations-list::-webkit-scrollbar,
.document-scroll-area::-webkit-scrollbar {
width: 8px;
}
.chat-container::-webkit-scrollbar-track,
.pa-chat-container::-webkit-scrollbar-track,
.panel-body::-webkit-scrollbar-track,
.conversations-list::-webkit-scrollbar-track,
.document-scroll-area::-webkit-scrollbar-track {
@@ -1861,7 +1861,7 @@
border-radius: 4px;
}
.chat-container::-webkit-scrollbar-thumb,
.pa-chat-container::-webkit-scrollbar-thumb,
.panel-body::-webkit-scrollbar-thumb,
.conversations-list::-webkit-scrollbar-thumb,
.document-scroll-area::-webkit-scrollbar-thumb {
@@ -1870,7 +1870,7 @@
border: 2px solid #F1F5F9;
}
.chat-container::-webkit-scrollbar-thumb:hover,
.pa-chat-container::-webkit-scrollbar-thumb:hover,
.panel-body::-webkit-scrollbar-thumb:hover,
.conversations-list::-webkit-scrollbar-thumb:hover,
.document-scroll-area::-webkit-scrollbar-thumb:hover {