feat(rdp): 新增 RDP 远程桌面/SMB/账单同步能力 + 清理编译产物

主要变更:
- RDP 远程桌面:新增 backend/pkg/rdp(RDP 引擎 + credssp/display/rle/trace)、
  backend/controller/rdp*(连接/凭证/文件/会话/实时)、frontend RDP 组件与 API
- Windows SMB 文件传输:backend/pkg/winsmb
- 云账单同步:backend/pkg/billingsync + billing_sync/aliyun_billing,前端账单详情
- Agent CLI Kubernetes 工具:kubernetes_action/get、pod_execute/logs
- 服务器导入助手:server_import_helpers、ImportCredentialSettings
- 国际化与组件重构(cloud/deploy/monitor/server/system 等多模块)
- 清理编译产物二进制:移除 backend/server、backend/agent/bin/aiops-agent-*
- .gitignore:新增 backend/agent/ 与 .cache/(避免 334MB go-build 缓存误入库)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
LoganandClaude committed 2026-07-04 01:50:36 +08:00
1 parent 777d9e4e71
commit 76ec9387f0
202 files changed
+16555 -2543

No files matched your search

@@ -99,7 +99,9 @@ export function ApprovalCategoryPage({ category, title, description, fields, tem
const resp = (await approvalApi.getTemplates({ type: templateCode })) as JsonData;
const list = resp?.list ?? resp?.data?.list ?? [];
if (list.length > 0) setTemplateId(list[0].id);
} catch {}
} catch {
// 模板缺失时保留空状态,由创建流程提示用户。// Logan.Li
}
}, [templateCode]);
useEffect(() => { fetchProcesses(); }, [fetchProcesses]);
@@ -15,6 +15,7 @@ import { approvalWorkflowApi, userApi } from '@/api';
import { useConfirm } from '@/components/ui/confirm-dialog';
import { PageShell } from '@/components/layout/PageShell';
import { PageEmpty } from '@/components/layout/PageEmpty';
import type { JsonData } from '@/types/common';
/* ------------------------------------------------------------------ */
/* Types */
@@ -482,9 +483,9 @@ export default function ApprovalWorkflowPage() {
try {
setLoading(true);
setError(null);
const res: any = await approvalWorkflowApi.list();
const data = Array.isArray(res?.list) ? res.list : (Array.isArray(res) ? res : []);
const normalized = data.map((w: any) => ({ ...w, steps: w.steps || [] }));
const res: JsonData | JsonData[] = await approvalWorkflowApi.list();
const data = Array.isArray(res) ? res : (Array.isArray(res.list) ? res.list : []);
const normalized = data.map((w) => ({ ...w, steps: w.steps || [] }));
setItems(normalized);
} catch {
setError(t('approval.msg.fetchFailed'));
@@ -495,10 +496,10 @@ export default function ApprovalWorkflowPage() {
const fetchUsers = useCallback(async () => {
try {
const res: any = await userApi.getUsers();
const data = Array.isArray(res?.list) ? res.list : (Array.isArray(res) ? res : []);
const res: JsonData | JsonData[] = await userApi.getUsers();
const data = Array.isArray(res) ? res : (Array.isArray(res.list) ? res.list : []);
// Normalize: extract role code from roles array
const normalized = data.map((u: any) => {
const normalized = data.map((u) => {
let role = u.role ?? '';
if (!role && Array.isArray(u.roles) && u.roles.length > 0) {
const first = u.roles[0];