본문으로 건너뛰기

대시보드

로그인 시 처음 보는 화면이며, 솔직히 하루 종일 열어둘 페이지입니다. 랜딩 페이지(/, Components/Pages/Index.razor)는 로그인한 사용자의 cBot 실행, 백테스트, 리소스 및(관리자용) 노드 클러스터 전반의 라이브 모바일 우선 명령 센터입니다. 자체 새로고침하며, 핸드폰에서 멋지게 보이고, F5를 누를 필요가 전혀 없습니다.

표시 내용​

手机上按优先级从上到下排列(每个区块在移动设备上为全宽堆叠项,在平板电脑/桌面上为响应형 그리드):

  1. 헤더 — 제목, 라이브 인디케이터(실제 펄싱 점; prefers-reduced-motion에서는 정적), 마지막 업데이트 시간, KPI와 차트를驱动하는 기간 토글(1H · 24H · 7D · 30D).
  2. Hero KPI — 각각 큰 숫자 + 인라인 SVG 스파클라인이 있는 4개의 읽기 쉬운 카드, (의미 있는 곳) 전 기간 대비 델타:
    • 지금 활성 — 시작/실행 중인 실행 + 백테스트.
    • 성공률 — 기간 내 완료 ÷ (완료 + 실패); 퍼센트 포인트 단위 델타.
    • 완료 — 이 기간의 완료된 실행/백테스트; 전 기간 대비 델타.
    • 실패 — 이 기간의 실패; (적을수록 좋으므로 감소하면 녹색 표시).
  3. 활동 차트 — 시간 버킷별 시작 / 완료 / 실패의 ApexCharts 영역 타임라인.
  4. 인스턴스 상태 링 — 실행 / 백테스트 / 대기 / 완료 / 실패의 도넛 차트,中心に合計.
  5. 백테스트 — 3개 타일 스냅샷(실행 중 / 완료 / 실패), 클릭으로 /backtest로 이동.
  6. 카피 트레이딩 — 라이브 상태 점, 대상 수, 실행 중인 프로필에 Live 배지가 있는 카피 트레이딩 프로필; 클릭으로 /copy-trading로 이동.
  7. AI 에이전트 — 실행 상태(아키타입 · 상태) 및 마지막 행동 시간이 있는 개인 중심 거래 에이전트; 클릭으로 /agent-studio로 이동.
  8. 라이브 활동 피드 — 가장 최근 20개 이벤트(최신순), 상태 색상 점 및 상대적 타임스탬프.
  9. 클러스터 상태(관리자만) — 활성 대 전체 노드 및 용량 사용 게이지.
  10. 리소스 타일 — cBots, 거래 계정, cTrader ID, MCP 키(해당 페이지로 클릭).

대시보드 사용자 지정​

위의 모든 블록은 사용자가 제어하는 위젯입니다. 헤더 오른쪽 상단의 Customize를 눌러 표시/숨기기 및上下 화살표로 재정렬할 수 있는 대화상자를 엽니다. 기본값으로 재설정하면 카탈로그 순서가 복원됩니다. 선택 사항은 사용자별로 서버에 지속되므로 브라우저와 기기를 가리지 않고 유지됩니다 — 이 탭에만 있는 것이 아닙니다.

  • 기능 게이트 및 관리자 전용 위젯(카피 트레이딩, AI 에이전트, 클러스터 상태)은 배포/역할에서 사용할 수 있는 경우에만 대화상자에 나타납니다.
  • 위젯 카탈로그는 Core/Dashboard/DashboardWidgets.cs의 단일 진실 공급자입니다; 프레젠테이션(레이블 + 아이콘 + 가용성)은 Components/Dashboard/DashboardWidgetMeta.cs에 있습니다.

라이브 상태 유지 방법​

페이지는 10초마다 GET /api/dashboard/overview?period=<1h|24h|7d|30d>를 폴링하고 위젯을 제자리에 다시 렌더링합니다 — 수동 새로고침 불필요. 일시적 가져오기 실패는 무시되고 다음 틱에서 재시도됩니다; 루프는 삭제 시 깨끗하게 중지됩니다. 첫 번째 로드는 스켈레톤을 표시합니다; 지속적 실패는 재시도 버튼과 함께 오류 카드를 표시합니다; 데이터가 없는 사용자는 0 KPI와 빈 상태 카피를 봅니다.

백엔드​

  • Endpoints/DashboardEndpoints.cs가 /overview를 매핑합니다(이전 스칼라 /stats도 유지). 사용자별이며 ICurrentUser를 통해 관리자 게이트 적용; 클록은 TimeProvider에서 가져옵니다. GET/PUT /api/dashboard/layout도 매핑합니다 — 사용자 위젯 레이아웃, 페이지 시작 시 로드 및 사용자 지정 대화상자에서 저장.
  • 레이아웃 지속은 UserDashboard aggregate(Core/Dashboard/UserDashboard.cs)입니다: 사용자당 하나의 보드(UserId 고유), 정렬된 위젯 설정 목록(표시 여부 + 순서)을 jsonb 컬럼으로 저장합니다. 정렬된 목록은 Apply / Reset을 통해서만 변경되며, 각 키를 DashboardWidgets 카탈로그에 대해 검증하고 컬렉션을 완전하고 중복 제거된 상태로 유지합니다. 알 수 없는 키는 DomainException → 400과 함께 거부됩니다.
  • Endpoints/DashboardQuery.cs가 복합 DashboardOverview 읽기 모델을 빌드합니다: 전체 시간 상태 스냅샷(그룹화된 카운트), 한 번 구체화된 창 기반 인스턴스 세트, 리소스/노드 카운트. 인스턴스 상태 및 터미널 타임스탬프는 TPH 하위 유형에 있습니다(컬럼 아님). 따라서 행은 공유 InstanceEndpoints.GetStartedAt/GetStoppedAt 헬퍼를 통해 메모리에서 읽습니다. 이벤트 시간 = stopped ?? started ?? created.
  • Endpoints/DashboardModels.cs가 DTO, 기간→(창, 버킷 수) 계획 및 DashboardMath를 보유합니다 — 순수 결정론적 버킷팅 + KPI/델타 수학(I/O 없음, now가 전달됨).

KPI 델타는 현재 창을 바로 전 창과 비교합니다(쿼리가 이를 위해 이중 창을 가져옴). 라이브 계정 P&L 피드는 없습니다 — 플랫폼은 백테스트 및 prop-firm 추적에만 equity를 가지므로 대시보드는 의도적으로 운영적입니다(활동, 처리량, 성공률), 중개 잔고 티커가 아닙니다.

디자인 및 토큰​

모든 색상은 디자인 토큰(var(--app-success|-warning|-error|-info|-primary|-text*))에서 가져오므로 화이트레이블 팔레트가 자동으로 흐릅니다 — 차트를含む 차트의 시리즈 색상은 런타임에 window.appReadTokens를 통해 확인된 토큰에서 읽습니다( SVG는 CSS 변수를 직접 사용할 수 없음). 대시보드에 하드 코딩된 16진수 없음. ../ui-guidelines.md 참조.

"Powered by cMind" 링크​

대시보드에 이 문서 사이트를 가리키는 작고 세련된 "Powered by cMind" 링크가 표시됩니다. 기본적으로 표시됩니다 — 저는 이 프로젝트에 자부심을持ち이고 다른 트레이더가 찾는 데 도움이 됩니다 — 그러나完全に您的决定입니다. 완전한 화이트레이블 인스턴스를 실행하는 리셀러는 App:Branding:ShowSiteLink를 false로 전환하면 사라집니다. 화이트레이블 브랜딩 참조.

테스트​

  • 단위 스타일 (tests/IntegrationTests/DashboardMathTests.cs) — 버킷팅, 성공률, 전 기간 델타, 기간 파싱, 빈/경계(이벤트 at now, 0으로 나누기 가드).
  • 단위 (tests/UnitTests/Dashboard/UserDashboardTests.cs) — UserDashboard aggregate: 기본 시드, 순서/표시 적용, 생략된 항목 추가, 중복塌缩, 알 수 없는 키 거부, 재설정.
  • 통합 (tests/IntegrationTests/DashboardQueryTests.cs, DashboardLayoutTests.cs) — 실제 Postgres에 대한 읽기 모델(상태/KPI/활동/리소스, 관리자 노드 상태, 빈 사용자 경로), 새로운 백테스트/카피 프로필/에이전트 섹션, 레이아웃 라운드 트립(사용자 지정 레이아웃 저장 → 다시 로드 → 순서 + 표시 지속).
  • E2E (tests/E2ETests/DashboardTests.cs, DashboardCustomizeTests.cs) — 데스크톱 + 모바일: KPI 카드, 차트, 링 및 피드 렌더링; 기간 토글이 활성 기간을 전환하고 다시 로드; KPI가 /run으로 드릴스루; 위젯 숨기기가 다시 로드 후 지속, 재설정이 다시 가져옴, 사용자 지정 대화상자가 가로 오버플로 없이 전화에서 작동. /는 PageSmokeTests, MobileLayoutTests(쉘 + 오버플로 없음) 및 MobileJourneyTests에도 있습니다.