feat: 修复菜单路由+角色权限展示+操作审计+WebSSH终端审计

1. 菜单路由修复: /roles /users /logs-audit /terminal-audit 等系统管理子菜单
   通过 useLocation 同步 URL 路径到 Tab 选中状态

2. WebSSH错误提示优化: Go error → 友好中文提示
   i/o timeout → 连接超时(防火墙或网络不通)
   connection refused → 端口未开放/SSH服务未启动
   cannot find session key → 密码或密钥认证失败
   连接提示增加端口号显示

3. 角色权限展示: 31项权限种子数据 (资产管理/云资源/K8s/发布/监控/AIOps/系统管理)
   4个角色权限分配: admin(31) ops(27) developer(16) viewer(3)
   前端角色卡片显示权限名称而非原始code

4. 操作审计修复: 删除/创建/更新服务器均记录审计日志
   批量删除逐条记录审计

5. WebSSH终端审计 (JumpServer模式):
   - 新增 TerminalSession 模型记录会话(用户/服务器/时间/状态)
   - webshell.go 录制终端输出(1MB上限)
   - 终端审计页面: 会话列表+状态筛选+批量删除
   - 操作回放: xterm.js 重放录制的终端输出
   - WS连接增加JWT鉴权+token传递
This commit is contained in:
attacker committed 2026-06-17 08:55:09 +08:00
1 parent 4797059be2
commit bdc7a507c0
17 files changed
+985 -34

No files matched your search

@@ -1,14 +1,16 @@
import { useState, useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import { useConfirm } from '@/components/ui/confirm-dialog';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Badge } from '@/components/ui/badge';
import { CheckCircle, XCircle, Users, Shield, FileCode, Settings } from 'lucide-react';
import { CheckCircle, XCircle, Users, Shield, FileCode, Settings, TerminalSquare } from 'lucide-react';
import { userApi } from '@/services/api';
import type { Role } from '@/types';
import { SystemUserTab } from './SystemUserTab';
import { SystemRolesTab } from './SystemRolesTab';
import { SystemLogsTab } from './SystemLogsTab';
import { SystemSettingsTab } from './SystemSettingsTab';
import { TerminalSessionsTab } from './TerminalSessionsTab';
import { useLdapManagement } from './useLdapManagement';
import type { UserFormData } from './UserFormDialog';
@@ -36,7 +38,24 @@ const emptyForm: UserFormData = {
export function SystemManager() {
const confirm = useConfirm();
const [activeTab, setActiveTab] = useState('users');
const location = useLocation();
// 侧边栏菜单路径映射到 Tab // Logan.Li
const pathToTab: Record<string, string> = {
'/users': 'users',
'/roles': 'roles',
'/logs-audit': 'logs',
'/terminal-audit': 'terminal',
'/settings': 'settings',
};
const [activeTab, setActiveTab] = useState(pathToTab[location.pathname] || 'users');
// URL 变化时同步 Tab(侧边栏菜单点击触发) // Logan.Li
useEffect(() => {
const tab = pathToTab[location.pathname];
if (tab && tab !== activeTab) {
setActiveTab(tab);
}
}, [location.pathname]);
const [searchQuery, setSearchQuery] = useState('');
const [users, setUsers] = useState<any[]>([]);
const [loading, setLoading] = useState(true);
@@ -238,6 +257,10 @@ export function SystemManager() {
<FileCode className="h-4 w-4 mr-2" />
操作审计
</TabsTrigger>
<TabsTrigger value="terminal" className="data-[state=active]:bg-slate-700">
<TerminalSquare className="h-4 w-4 mr-2" />
终端审计
</TabsTrigger>
<TabsTrigger value="settings" className="data-[state=active]:bg-slate-700">
<Settings className="h-4 w-4 mr-2" />
系统设置
@@ -299,6 +322,10 @@ export function SystemManager() {
/>
</TabsContent>
<TabsContent value="terminal" className="mt-4 space-y-4">
<TerminalSessionsTab />
</TabsContent>
<TabsContent value="settings" className="mt-4">
<SystemSettingsTab {...ldap.settingsTabProps} />
</TabsContent>