基于设计稿生成「执行纪律台」总控仪表盘页面,极简专业风格与细腻交互

By admin, 28 May, 2026
推理
The user wants me to generate a UI page based on a detailed JSON design specification. Let me analyze this carefully:

1. **Product Type**: This is a personal trading cockpit/dashboard called "执行纪律台" (Execution Discipline Platform)
2. **Layout**: Side navigation + main content area
3. **Features**: Market summary, action list, step navigation, step content
4. **Style**: Clean, professional, data-focused dashboard

Let me first get the design system recommendation, then get assets for the logo.

Let me think about the aesthetic direction:
- **Purpose**: A personal trading discipline tool that helps traders follow rules
- **Tone**: Professional, trustworthy, clean, focused - something like a sophisticated financial dashboard
- **Aesthetic**: I'll go with a refined, editorial/financial aesthetic - clean lines, strong typography, subtle sophistication. Think Bloomberg terminal meets modern design. High contrast, precise, confident.

Let me call the design system and assets tools.Now I have the design system and assets. Let me analyze:

The design system suggests a minimalism approach with dark mode. However, the user's JSON design tokens specify a light theme:
- background: #F6F6F6 (light gray)
- surface: #FFFFFF
- text: #111827
- border: #E5E7EB

But the design system suggests dark mode. Let me think about this...

The user's tokens clearly specify a light theme. But the design system suggests dark mode for a trading cockpit. Let me go with what the user specified since they gave explicit tokens, but I can add some sophistication.

Actually, wait - the user said "根据设计稿生成UI页面" - generate UI based on the design draft. The design draft has explicit tokens. I should respect those. But I can make it more visually interesting within those constraints.

Let me go with the light theme from the design tokens but make it more sophisticated and visually distinctive. Let me choose a more unique font than Inter - the design system recommended Inter but I should pick something more distinctive per the instructions.

For this financial trading discipline tool, I'll use:
- A strong, distinctive heading font: "DM Serif Display" or "Playfair Display" for titles (editorial feel)
- A clean body font: "DM Sans" or "JetBrains Mono" for data
- Actually, let me think about what feels right for a Chinese trading cockpit...

Since the primary language is Chinese, I should pick fonts that work well with Chinese. But Google Fonts has limited Chinese options. Let me use:
- For the overall feel: "Noto Sans SC" for Chinese body text
- For numbers/data: "JetBrains Mono"
- For headings: a distinctive serif

Actually, let me reconsider. The design instructions say to avoid common fonts. Let me go with:
- "DM Sans" for body (clean, modern, less common than Inter)
- "DM Serif Display" for headings (editorial, distinctive)
- Numbers in "JetBrains Mono" monospace for data

But for Chinese text, these won't help much. Let me use what works:
- "Noto Serif SC" for Chinese headings (elegant)
- "Noto Sans SC" for Chinese body
- For numbers, "JetBrains Mono"

Actually, the design system recommended Inter, but I should avoid it. Let me go with something distinctive yet appropriate for a financial dashboard:

- Headings: "DM Serif Display" - editorial, refined
- Body: "DM Sans" - clean, geometric
- Monospace for data: "JetBrains Mono" or "Fira Code"

For the Chinese text rendering, Noto Sans SC would be the safest bet.

Let me now build this. The JSON structure is quite detailed. Let me create the full HTML.

Key design decisions:
1. Light theme (respecting user tokens)
2. Clean, minimal but sophisticated
3. Subtle textures/patterns for depth
4. Editorial typography
5. Subtle animations
6. Professional trading cockpit feel

Layout:
- Left sidebar: 240px, white, with logo and nav items
- Main content: Header, Page header, Content grid (2 columns), Step navigation, Step content

Let me build this carefully.

For the step content section, the JSON shows multiple StepContent blocks. I think only the active one (Step 01) should be visible, and Steps 02-06 would be hidden or shown based on which step is active. The JSON shows two StepContent blocks. Let me include them all but only show the first one, or perhaps show them in a logical way.

Actually looking at the JSON more carefully, the step navigation has 6 steps (01-06) but only two StepContent blocks are defined. I'll create all 6 step contents with placeholder text, but show only Step 01 as active by default.

Let me also add some nice touches:
- A subtle grain texture on the background
- Smooth transitions
- Hover effects on nav items
- A nice empty state illustration
- Step indicator dots or progress

Now let me create the HTML. I need to be very careful with the JSON escaping.

Let me structure the complete HTML:

```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>执行纪律台</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;1,400&family=Noto+Sans+SC:wght@300;400;500;600;700&family=Noto+Serif+SC:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
/* Custom styles */
</style>
</head>
<body>
...
</body>
</html>
```

Let me now build the complete page. I need to make it responsive - the breakpoint should be "none" since this is a desktop dashboard.

Actually wait - looking at the design, this seems like a desktop application. The layout has a 240px sidebar and a 2-column grid. This is clearly desktop. But could it also be a tablet view? Let me mark it as "none" for desktop.

Let me finalize the design:

Colors (from tokens):
- text: #111827
- muted: #6B7280
- border: #E5E7EB
- surface: #FFFFFF
- background: #F6F6F6
- success: #10B981
- danger: #EF4444

I'll add some subtle accent colors and slight variations.

Let me be careful about the structure:

1. Sidebar (240px):
- Logo section with title "执行纪律台" and subtitle
- Nav items: 总控 (active), 持仓, 基金, 筛选, 通知, 回测, 策略, 设置

2. Main area:
- Header with date and buttons
- Page header "今日总控"
- 2-column grid: Market Summary Card + Action List
- Step navigation tabs
- Step content (Step 01 active)

Let me build this now. I need to be meticulous.

For the step content visibility, I'll use JavaScript to handle tab switching, but by default show Step 01.

Actually, let me keep it simpler - I'll show the step navigation and the content for step 01 (which is already in the JSON). The other step contents can be represented by just showing the step 02 content as well but maybe collapsed.

Looking at the JSON again, there are two StepContent blocks. I'll show Step 01 content fully and hide Step 02-06 by default, with JavaScript to switch between them.

Let me now write the complete HTML. This will be quite long.

Let me also add some nice texture and sophisticated touches:
- A subtle grid pattern on the background
- Refined shadows
- Clean borders
- Smooth hover transitions
- Number animations maybe

For the logo, I'll use a placeholder - maybe a simple SVG icon or text-based logo since we don't have a specific logo asset. Actually I got some business dashboard images but none seem right for a logo. Let me use a simple text-based logo with an icon.

Let me now write the complete code. I'll also need to handle the step switching with some JavaScript.

For the step content areas, I'll create all 6 but only show the active one.

Let me also think about the responsive behavior. This is primarily a desktop app, but I should ensure it works at different sizes. For "none" breakpoint (desktop), the sidebar stays visible.

Actually, for mobile (if needed), the sidebar could collapse. But since the breakpoint is "none", I'll focus on desktop.

Let me also add some subtle animations:
- Page load fade-in
- Nav item hover effects
- Card hover micro-interactions
- Button hover states

OK let me write the full HTML now. I want to make it really polished.

For the background, I'll use a subtle dot pattern or grain texture from transparenttextures.com.

Let me use: https://www.transparenttextures.com/patterns/subtle-dots.png or similar.

Actually, let me use a very subtle pattern. The design tokens specify #F6F6F6 background. Let me add a subtle noise/grain.

Let me finalize fonts:
- Headings: "DM Serif Display" for English, "Noto Serif SC" for Chinese - actually this gets complicated. Let me use "DM Sans" as the primary font with "Noto Sans SC" for Chinese support, and "JetBrains Mono" for numbers.

Actually, let me simplify. I'll use:
- Body/UI: "DM Sans", "Noto Sans SC", sans-serif
- Headings: weight 600 on DM Sans
- Numbers/monospace: "JetBrains Mono"

This keeps it clean and sophisticated without being too flashy.

Now let me code this up. I need to be very thorough.

One thing - the JSON has `"backgroundColor": "bg-green-100"` and `"backgroundColor": "bg-gray-100"` for tags, which are Tailwind classes. I need to handle these properly.

Also, I need to ensure all the tokens are properly mapped. Let me map:

- {colors.text} → #111827 → tailwind: text-gray-900
- {colors.muted} → #6B7280 → tailwind: text-gray-500
- {colors.border} → #E5E7EB → tailwind: border-gray-200
- {colors.surface} → #FFFFFF → tailwind: bg-white
- {colors.background} → #F6F6F6 → tailwind: bg-gray-50 (close enough)
- {colors.success} → #10B981 → tailwind: text-emerald-500
- {colors.danger} → #EF4444 → tailwind: text-red-500

- {typography.title.fontSize} → 16px
- {typography.body.fontSize} → 14px
- {typography.caption.fontSize} → 12px

- {rounded.sm} → 4px
- {rounded.md} → 8px

- {spacing.sm} → 8px
- {spacing.md} → 12px
- {spacing.lg} → 16px

Now let me build this out completely.

I'll use a combination of Tailwind utility classes and custom CSS. The custom CSS will handle:
- Font family definitions
- Subtle background patterns
- Custom animations
- Some refined styling that's hard with pure Tailwind

Let me write the complete HTML now. This is going to be a substantial piece of code.

For the step content switching, I'll add JavaScript to handle tab clicks.

Let me think about the 6 steps:
1. 01 持仓 - active (green border-bottom)
2. 02 新仓
3. 03 盘中
4. 04 环境
5. 05 数据
6. 06 复盘

And the step contents:
- Step 01: 持仓优先 - with empty state
- Step 02: 新仓执行池 - with description
- Steps 03-06: placeholder content

OK, I think I have a good plan. Let me write the complete code now.

For the responsive design, I should consider that on smaller screens the sidebar might need to collapse. But since breakpoint is "none" (desktop), I'll keep the sidebar visible and the 2-column grid.

Let me code everything now. I'll focus on making it look polished and professional.

One more thing - the market summary card has:
- Title: 市场总闸
- Status: 观察期
- Change: -0.41% (red)
- Description text
- 4 data items in a grid
- 3 tags

The action list has 4 items with buttons.

Let me now write the full HTML. I want this to be exceptional.

I'll add a subtle background texture using CSS rather than an external image for reliability.

Here's my plan for the background: a subtle grid pattern using CSS background-image with repeating linear gradients. This looks sophisticated and loads instantly.

Now coding...

Actually I realize I should also handle the step content visibility. The JSON shows two StepContent blocks but the navigation shows 6 steps. I'll create content for all 6 steps and use JS to toggle.

Wait, let me re-read the JSON carefully. It has the StepNavigation with 6 items, then two StepContent blocks. The first StepContent is step 01 "持仓优先" and the second is step 02 "新仓执行池". I need to create placeholder content for steps 03-06 as well.

Let me create all 6 step contents. Steps 03-06 will have simple placeholder content since they're not in the original JSON.

Now, let me also make the nav items interactive. When clicking a nav item, the left border should change to green.

OK, I'm going to write this now. Let me be very precise about the HTML structure and styling.

For the logo, I'll create a simple but elegant text-based logo since we don't have a specific image. Maybe with a small geometric icon.

Let me finalize and write the code:

Sidebar structure:
- Logo area (with icon + title + subtitle)
- Nav items (8 items)

Main area:
- Header bar (date + buttons)
- Page title section
- 2-column grid:
- Left: Market Summary Card
- Right: Action List
- Step navigation tabs (horizontal)
- Step content area

I think I should use flexbox for the overall layout, with the sidebar fixed width and the main content flexing.

Let me code it now. This will be a long HTML file.

One more consideration: the "处理持仓" button in the header has variant "outline" and the "看执行池" button has variant "solid" with black background. In the action list, button 04 has variant "solid" with success/green background.

For the empty state in Step 01, I'll create a nice dashed border box.

I think I have everything I need. Let me write the complete HTML now.

For the step content, I need to make it dynamic - clicking on different step tabs should show different content. I'll use JavaScript for this.

Let me also add some nice CSS custom properties for the design tokens and use them consistently.

Now here's my complete code plan:

```
HTML Structure:
- body (flex, h-screen, bg-gray-50/pattern)
- Sidebar (240px, bg-white, border-r)
- Logo section
- Nav items
- Main (flex-1, overflow-y-auto)
- Header
- PageHeader
- ContentGrid (2 columns)
- MarketSummaryCard
- ActionList
- StepNavigation
- StepContent (multiple, only one visible)
```

Let me write this now. I'll be thorough and make it look great.

For the fonts, I'll use:
- Google Fonts: DM Sans, Noto Sans SC, JetBrains Mono, DM Serif Display

Actually, to keep it cleaner, let me use:
- "DM Sans" + "Noto Sans SC" for UI
- "JetBrains Mono" for numbers/data
- "Noto Serif SC" for some heading accents

Let me write it all out now.
角色
assistant
content

```json
{
"summary": "基于设计稿生成了「执行纪律台」总控仪表盘页面。采用极简专业风格,左侧240px导航栏+主内容区布局,包含市场总闸卡片、行动清单、六步导航和持仓优先内容区。配色严格遵循设计Token(#F6F6F6背景、#111827主文字、#10B981成功色),加入微妙的CSS网格纹理背景和细腻交互动效。",
"widget": {
"type": "full-html",
"html": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>执行纪律台 · 总控</title>\n <script src=\"https://cdn.tailwindcss.com\"></script>\n <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.c…\">\n <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40…\" rel=\"stylesheet\">\n <style>\n :root {\n --color-text: #111827;\n --color-muted: #6B7280;\n --color-border: #E5E7EB;\n --color-surface: #FFFFFF;\n --color-background: #F6F6F6;\n --color-success: #10B981;\n --color-danger: #EF4444;\n --color-accent: #059669;\n --radius-sm: 4px;\n --radius-md: 8px;\n --spacing-sm: 8px;\n --spacing-md: 12px;\n --spacing-lg: 16px;\n --font-heading: 'DM Serif Display', 'Noto Serif SC', serif;\n --font-body: 'DM Sans', 'Noto Sans SC', sans-serif;\n --font-mono: 'JetBrains Mono', monospace;\n }\n\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n body {\n font-family: var(--font-body);\n background-color: var(--color-background);\n color: var(--color-text);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n /* Subtle dot-grid background texture */\n .bg-texture {\n background-color: #F6F6F6;\n background-image: radial-gradient(circle, #E5E7EB 0.5px, transparent 0.5px);\n background-size: 20px 20px;\n }\n\n /* Sidebar hover effect */\n .nav-item {\n position: relative;\n transition: all 220ms cubic-bezier(0.4, 0, 0.2, 1);\n cursor: pointer;\n border-left: 3px solid transparent;\n font-size: 14px;\n font-weight: 400;\n color: var(--color-muted);\n padding: 10px 16px;\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 1px 8px;\n border-radius: 0 6px 6px 0;\n }\n .nav-item:hover {\n background-color: #F3F4F6;\n color: var(--color-text);\n }\n .nav-item.active {\n border-left-color: var(--color-success);\n color: var(--color-text);\n font-weight: 500;\n background-color: #F0FDF6;\n }\n .nav-item .nav-icon {\n width: 18px;\n text-align: center;\n font-size: 13px;\n opacity: 0.7;\n }\n .nav-item.active .nav-icon {\n opacity: 1;\n color: var(--color-success);\n }\n\n /* Step tabs */\n .step-tab {\n position: relative;\n padding: 10px 18px;\n font-size: 13px;\n font-weight: 400;\n color: var(--color-muted);\n cursor: pointer;\n transition: all 200ms ease-out;\n border-bottom: 2px solid transparent;\n white-space: nowrap;\n letter-spacing: 0.01em;\n }\n .step-tab:hover {\n color: var(--color-text);\n border-bottom-color: #D1D5DB;\n }\n .step-tab.active {\n color: var(--color-success);\n border-bottom-color: var(--color-success);\n font-weight: 500;\n }\n\n /* Card subtle lift */\n .card {\n background: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n transition: box-shadow 250ms ease-out, border-color 250ms ease-out;\n }\n .card:hover {\n border-color: #D1D5DB;\n box-shadow: 0 2px 12px rgba(0,0,0,0.04), 0 0 0 1px rgba(0,0,0,0.02);\n }\n\n /* Button variants */\n .btn-outline {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 7px 16px;\n font-size: 13px;\n font-weight: 500;\n font-family: var(--font-body);\n color: var(--color-text);\n background: transparent;\n border: 1px solid var(--color-border);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease-out;\n letter-spacing: 0.01em;\n }\n .btn-outline:hover {\n background: #F9FAFB;\n border-color: #D1D5DB;\n }\n .btn-outline:active {\n background: #F3F4F6;\n }\n\n .btn-solid-dark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 7px 18px;\n font-size: 13px;\n font-weight: 500;\n font-family: var(--font-body);\n color: #FFFFFF;\n background: #111827;\n border: 1px solid #111827;\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease-out;\n letter-spacing: 0.01em;\n }\n .btn-solid-dark:hover {\n background: #1F2937;\n border-color: #1F2937;\n }\n .btn-solid-dark:active {\n background: #000000;\n }\n\n .btn-solid-success {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 7px 18px;\n font-size: 13px;\n font-weight: 500;\n font-family: var(--font-body);\n color: #FFFFFF;\n background: var(--color-success);\n border: 1px solid var(--color-success);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease-out;\n letter-spacing: 0.01em;\n }\n .btn-solid-success:hover {\n background: #059669;\n border-color: #059669;\n }\n .btn-solid-success:active {\n background: #047857;\n }\n\n /* Tag styles */\n .tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n font-size: 11px;\n font-weight: 500;\n border-radius: 20px;\n letter-spacing: 0.02em;\n }\n .tag-green {\n background: #ECFDF5;\n color: #059669;\n }\n .tag-gray {\n background: #F3F4F6;\n color: #6B7280;\n }\n\n /* Data item */\n .data-item-label {\n font-size: 11px;\n color: var(--color-muted);\n letter-spacing: 0.03em;\n text-transform: uppercase;\n margin-bottom: 3px;\n }\n .data-item-value {\n font-size: 15px;\n font-weight: 500;\n color: var(--color-text);\n font-family: var(--font-mono);\n }\n\n /* Empty state */\n .empty-state {\n border: 1.5px dashed #D1D5DB;\n border-radius: var(--radius-md);\n padding: 32px 24px;\n text-align: center;\n transition: border-color 250ms ease-out;\n }\n .empty-state:hover {\n border-color: #9CA3AF;\n }\n\n /* Fade-in animation */\n @keyframes fadeInUp {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .animate-in {\n animation: fadeInUp 400ms ease-out both;\n }\n .delay-1 { animation-delay: 60ms; }\n .delay-2 { animation-delay: 120ms; }\n .delay-3 { animation-delay: 180ms; }\n .delay-4 { animation-delay: 240ms; }\n .delay-5 { animation-delay: 300ms; }\n\n /* Scrollbar */\n ::-webkit-scrollbar { width: 5px; }\n ::-webkit-scrollbar-track { background: transparent; }\n ::-webkit-scrollbar-thumb { background: #D1D5DB; border-radius: 20px; }\n ::-webkit-scrollbar-thumb:hover { background: #9CA3AF; }\n\n /* Number pulse */\n @keyframes numberPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.75; }\n }\n .number-live {\n animation: numberPulse 2s ease-in-out infinite;\n }\n\n /* Step content transition */\n .step-panel {\n display: none;\n animation: fadeInUp 350ms ease-out both;\n }\n .step-panel.active {\n display: block;\n }\n\n /* Logo mark */\n .logo-mark {\n width: 34px;\n height: 34px;\n background: #111827;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #FFFFFF;\n font-size: 15px;\n font-weight: 700;\n font-family: var(--font-mono);\n flex-shrink: 0;\n }\n\n @media (max-width: 1024px) {\n .content-grid {\n grid-template-columns: 1fr !important;\n }\n }\n </style>\n</head>\n<body class=\"bg-texture flex h-screen overflow-hidden\">\n\n <!-- ===== SIDEBAR ===== -->\n <aside class=\"w-[240px] flex-shrink-0 bg-white border-r border-gray-200 flex flex-col h-full z-10\">\n <!-- Logo -->\n <div class=\"px-4 pt-5 pb-4 border-b border-gray-100\">\n <div class=\"flex items-center gap-3\">\n <div class=\"logo-mark\">纪</div>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-[15px] font-semibold text-gray-900 tracking-tight leading-tight\">执行纪律台</span>\n <span class=\"text-[11px] text-gray-400 tracking-wide leading-tight mt-0.5\">Personal trading cockpit</span>\n </div>\n </div>\n </div>\n\n <!-- Nav Items -->\n <nav class=\"flex-1 flex flex-col py-2 overflow-y-auto\">\n <div class=\"nav-item active\" data-nav=\"总控\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-gauge-high\"></i></span>\n <span>总控</span>\n </div>\n <div class=\"nav-item\" data-nav=\"持仓\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-briefcase\"></i></span>\n <span>持仓</span>\n </div>\n <div class=\"nav-item\" data-nav=\"基金\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-building-columns\"></i></span>\n <span>基金</span>\n </div>\n <div class=\"nav-item\" data-nav=\"筛选\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-filter\"></i></span>\n <span>筛选</span>\n </div>\n <div class=\"nav-item\" data-nav=\"通知\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-bell\"></i></span>\n <span>通知</span>\n <span class=\"ml-auto w-[18px] h-[18px] bg-red-500 text-white text-[10px] font-semibold rounded-full flex items-center justify-center\">3</span>\n </div>\n <div class=\"nav-item\" data-nav=\"回测\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-clock-rotate-left\"></i></span>\n <span>回测</span>\n </div>\n <div class=\"nav-item\" data-nav=\"策略\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-chess-board\"></i></span>\n <span>策略</span>\n </div>\n <div class=\"nav-item\" data-nav=\"设置\">\n <span class=\"nav-icon\"><i class=\"fa-solid fa-sliders\"></i></span>\n <span>设置</span>\n </div>\n </nav>\n\n <!-- Sidebar Footer -->\n <div class=\"px-4 py-3 border-t border-gray-100\">\n <div class=\"flex items-center gap-2.5 text-xs text-gray-400\">\n <div class=\"w-[7px] h-[7px] rounded-full bg-emerald-500 shadow-[0_0_6px_rgba(16,185,129,0.5)]\"></div>\n <span>系统运行中</span>\n </div>\n </div>\n </aside>\n\n <!-- ===== MAIN ===== -->\n <main class=\"flex-1 flex flex-col overflow-y-auto h-full\">\n\n <!-- Header -->\n <header class=\"flex items-center justify-between px-5 py-3.5 bg-white border-b border-gray-200 flex-shrink-0 animate-in delay-1\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa-regular fa-calendar text-gray-400 text-sm\"></i>\n <span class=\"text-sm text-gray-500 font-medium\">总控</span>\n <span class=\"text-sm text-gray-300\">·</span>\n <span class=\"text-sm text-gray-900 font-medium font-mono\" style=\"font-family: var(--font-mono);\">2026-05-28</span>\n </div>\n <div class=\"flex items-center gap-2\">\n <button class=\"btn-outline\">\n <i class=\"fa-solid fa-list-check text-xs\"></i>\n 处理持仓\n </button>\n <button class=\"btn-solid-dark\">\n <i class=\"fa-solid fa-magnifying-glass-chart text-xs\"></i>\n 看执行池\n </button>\n </div>\n </header>\n\n <!-- Page Header -->\n <div class=\"px-5 pt-5 pb-2 flex-shrink-0 animate-in delay-2\">\n <h1 class=\"text-[22px] font-semibold text-gray-900 tracking-tight\" style=\"font-family: var(--font-heading); letter-spacing: -0.01em;\">今日总控</h1>\n <p class=\"text-sm text-gray-500 mt-1 leading-relaxed max-w-2xl\">这个页面只回答一件事:今天哪些动作被允许,哪些动作要先等数据或环境确认。</p>\n </div>\n\n <!-- Content Grid: Market Summary + Action List -->\n <div class=\"content-grid grid grid-cols-2 gap-4 px-5 py-3 flex-shrink-0\">\n\n <!-- Market Summary Card -->\n <div class=\"card p-5 animate-in delay-3\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest\">市场总闸</span>\n <span class=\"tag tag-gray text-[10px]\">\n <i class=\"fa-solid fa-eye text-[9px]\"></i> 观察期\n </span>\n </div>\n\n <div class=\"flex items-baseline gap-3 mt-1\">\n <span class=\"text-[40px] font-semibold text-red-500 tracking-tight number-live\" style=\"font-family: var(--font-mono);\">-0.41%</span>\n <span class=\"text-xs text-gray-400\">日内</span>\n </div>\n\n <p class=\"text-[13px] text-gray-500 mt-3 leading-relaxed\">总闸已可读,仍需按白线/黄线、RR、仓位和盘中确认逐只筛选。</p>\n\n <!-- Data Grid 4-col -->\n <div class=\"grid grid-cols-4 gap-3 mt-4 pt-3 border-t border-gray-100\">\n <div>\n <div class=\"data-item-label\">开放持仓</div>\n <div class=\"data-item-value\">0</div>\n </div>\n <div>\n <div class=\"data-item-label\">执行票</div>\n <div class=\"data-item-value text-gray-900\">4</div>\n </div>\n <div>\n <div class=\"data-item-label\">观察票</div>\n <div class=\"data-item-value text-gray-900\">5</div>\n </div>\n <div>\n <div class=\"data-item-label\">口径阻断</div>\n <div class=\"data-item-value\">0</div>\n </div>\n </div>\n\n <!-- Tags -->\n <div class=\"flex items-center gap-2 mt-4 flex-wrap\">\n <span class=\"tag tag-green\">\n <i class=\"fa-solid fa-circle-check text-[9px]\"></i> 0 个阻断\n </span>\n <span class=\"tag tag-gray\">\n <i class=\"fa-regular fa-clock text-[9px]\"></i> 盘中 未录入\n </span>\n <span class=\"tag tag-gray\">\n <i class=\"fa-solid fa-camera text-[9px]\"></i> 快照 2026-05-28 01:52:17\n </span>\n </div>\n </div>\n\n <!-- Action List Card -->\n <div class=\"card p-5 flex flex-col animate-in delay-4\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest mb-3\">今日行动清单</span>\n\n <div class=\"flex-1 flex flex-col gap-0\">\n <!-- Action 01 -->\n <div class=\"flex items-center justify-between py-3 border-b border-gray-100 transition-colors hover:bg-gray-50/60 -mx-2 px-2 rounded-md\">\n <div class=\"flex items-center gap-3\">\n <span class=\"w-6 h-6 rounded-full bg-gray-900 text-white text-[11px] font-semibold flex items-center justify-center flex-shrink-0\" style=\"font-family: var(--font-mono);\">01</span>\n <span class=\"text-sm font-medium text-gray-900\">先处理持仓</span>\n </div>\n <button class=\"btn-outline text-xs py-1.5 px-3\">处理</button>\n </div>\n\n <!-- Action 02 -->\n <div class=\"flex items-center justify-between py-3 border-b border-gray-100 transition-colors hover:bg-gray-50/60 -mx-2 px-2 rounded-md\">\n <div class=\"flex items-center gap-3\">\n <span class=\"w-6 h-6 rounded-full bg-gray-200 text-gray-600 text-[11px] font-semibold flex items-center justify-center flex-shrink-0\" style=\"font-family: var(--font-mono);\">02</span>\n <span class=\"text-sm font-medium text-gray-900\">再看新仓</span>\n </div>\n <button class=\"btn-outline text-xs py-1.5 px-3\">查看</button>\n </div>\n\n <!-- Action 03 -->\n <div class=\"flex items-center justify-between py-3 border-b border-gray-100 transition-colors hover:bg-gray-50/60 -mx-2 px-2 rounded-md\">\n <div class=\"flex items-center gap-3\">\n <span class=\"w-6 h-6 rounded-full bg-gray-200 text-gray-600 text-[11px] font-semibold flex items-center justify-center flex-shrink-0\" style=\"font-family: var(--font-mono);\">03</span>\n <span class=\"text-sm font-medium text-gray-900\">盘中只做确认</span>\n </div>\n <button class=\"btn-outline text-xs py-1.5 px-3\">分析</button>\n </div>\n\n <!-- Action 04 -->\n <div class=\"flex items-center justify-between py-3 transition-colors hover:bg-gray-50/60 -mx-2 px-2 rounded-md\">\n <div class=\"flex items-center gap-3\">\n <span class=\"w-6 h-6 rounded-full bg-emerald-100 text-emerald-700 text-[11px] font-semibold flex items-center justify-center flex-shrink-0\" style=\"font-family: var(--font-mono);\">04</span>\n <span class=\"text-sm font-medium text-gray-900\">最后核对口径</span>\n </div>\n <button class=\"btn-solid-success text-xs py-1.5 px-3\">\n <i class=\"fa-solid fa-check text-[10px]\"></i> 通过\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Step Navigation -->\n <div class=\"flex items-center gap-0 px-5 pt-5 pb-0 border-b border-gray-200 flex-shrink-0 overflow-x-auto animate-in delay-5\">\n <div class=\"step-tab active\" data-step=\"1\">\n <span class=\"text-[10px] text-gray-400 mr-1\">01</span> 持仓\n </div>\n <div class=\"step-tab\" data-step=\"2\">\n <span class=\"text-[10px] text-gray-400 mr-1\">02</span> 新仓\n </div>\n <div class=\"step-tab\" data-step=\"3\">\n <span class=\"text-[10px] text-gray-400 mr-1\">03</span> 盘中\n </div>\n <div class=\"step-tab\" data-step=\"4\">\n <span class=\"text-[10px] text-gray-400 mr-1\">04</span> 环境\n </div>\n <div class=\"step-tab\" data-step=\"5\">\n <span class=\"text-[10px] text-gray-400 mr-1\">05</span> 数据\n </div>\n <div class=\"step-tab\" data-step=\"6\">\n <span class=\"text-[10px] text-gray-400 mr-1\">06</span> 复盘\n </div>\n </div>\n\n <!-- Step Content Panels -->\n <div class=\"px-5 py-5 flex-1\">\n\n <!-- Step 01: 持仓优先 -->\n <div class=\"step-panel active\" id=\"step-content-1\">\n <div class=\"mb-4\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest\">Step 01</span>\n <h2 class=\"text-[17px] font-semibold text-gray-900 mt-1\">持仓优先</h2>\n <p class=\"text-[13px] text-gray-500 mt-1.5 leading-relaxed\">已买入资产先处理,今天买入的受 T+1 约束,不能用盘中通知倒逼卖出。</p>\n </div>\n\n <div class=\"empty-state\">\n <div class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gray-100 flex items-center justify-center\">\n <i class=\"fa-solid fa-inbox text-gray-400 text-xl\"></i>\n </div>\n <p class=\"text-sm font-semibold text-gray-900 mb-1\">当前没有已登记持仓</p>\n <p class=\"text-[13px] text-gray-500 leading-relaxed max-w-md mx-auto\">如果今天有新成交,先在持仓页登记,后续通知才能按成本、止损和目标提醒。</p>\n <button class=\"btn-solid-success mt-5\">\n <i class=\"fa-solid fa-arrow-right text-xs\"></i> 进入持仓页\n </button>\n </div>\n </div>\n\n <!-- Step 02: 新仓执行池 -->\n <div class=\"step-panel\" id=\"step-content-2\">\n <div class=\"mb-4\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest\">Step 02</span>\n <h2 class=\"text-[17px] font-semibold text-gray-900 mt-1\">新仓执行池</h2>\n <p class=\"text-[13px] text-gray-500 mt-1.5 leading-relaxed\">这里只展示可讨论对象;真正买入仍要过环境、白黄线、RR、仓位和实时确认。</p>\n </div>\n\n <div class=\"empty-state\">\n <div class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gray-100 flex items-center justify-center\">\n <i class=\"fa-solid fa-folder-open text-gray-400 text-xl\"></i>\n </div>\n <p class=\"text-sm font-semibold text-gray-900 mb-1\">执行池暂无标的</p>\n <p class=\"text-[13px] text-gray-500 leading-relaxed max-w-md mx-auto\">通过筛选和回测确认后,候选标的会出现在这里供盘中讨论。</p>\n <button class=\"btn-outline mt-5\">\n <i class=\"fa-solid fa-plus text-xs\"></i> 添加候选\n </button>\n </div>\n </div>\n\n <!-- Step 03: 盘中确认 -->\n <div class=\"step-panel\" id=\"step-content-3\">\n <div class=\"mb-4\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest\">Step 03</span>\n <h2 class=\"text-[17px] font-semibold text-gray-900 mt-1\">盘中只做确认</h2>\n <p class=\"text-[13px] text-gray-500 mt-1.5 leading-relaxed\">盘中动作仅限于确认已有计划,不做新决策。所有买入须在开盘前完成计划。</p>\n </div>\n <div class=\"empty-state\">\n <div class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gray-100 flex items-center justify-center\">\n <i class=\"fa-solid fa-clock text-gray-400 text-xl\"></i>\n </div>\n <p class=\"text-sm font-semibold text-gray-900 mb-1\">等待盘中数据</p>\n <p class=\"text-[13px] text-gray-500 leading-relaxed max-w-md mx-auto\">开盘后将自动拉取实时数据,届时可对执行池标的做最终确认。</p>\n </div>\n </div>\n\n <!-- Step 04: 环境 -->\n <div class=\"step-panel\" id=\"step-content-4\">\n <div class=\"mb-4\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest\">Step 04</span>\n <h2 class=\"text-[17px] font-semibold text-gray-900 mt-1\">环境校验</h2>\n <p class=\"text-[13px] text-gray-500 mt-1.5 leading-relaxed\">大盘环境决定仓位上限。环境不达标时,即使标的优秀也要降仓或暂停。</p>\n </div>\n <div class=\"empty-state\">\n <div class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gray-100 flex items-center justify-center\">\n <i class=\"fa-solid fa-cloud-sun text-gray-400 text-xl\"></i>\n </div>\n <p class=\"text-sm font-semibold text-gray-900 mb-1\">环境数据待更新</p>\n <p class=\"text-[13px] text-gray-500 leading-relaxed max-w-md mx-auto\">市场总闸状态将在此处展开详细的环境指标,包括指数、波动率和情绪数据。</p>\n </div>\n </div>\n\n <!-- Step 05: 数据 -->\n <div class=\"step-panel\" id=\"step-content-5\">\n <div class=\"mb-4\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest\">Step 05</span>\n <h2 class=\"text-[17px] font-semibold text-gray-900 mt-1\">数据核对</h2>\n <p class=\"text-[13px] text-gray-500 mt-1.5 leading-relaxed\">逐只核对白线/黄线、RR 比率和仓位公式,所有数字必须落在纪律区间内。</p>\n </div>\n <div class=\"empty-state\">\n <div class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gray-100 flex items-center justify-center\">\n <i class=\"fa-solid fa-table-cells text-gray-400 text-xl\"></i>\n </div>\n <p class=\"text-sm font-semibold text-gray-900 mb-1\">暂无核对数据</p>\n <p class=\"text-[13px] text-gray-500 leading-relaxed max-w-md mx-auto\">完成持仓登记后,每只标的的止损、目标和 RR 数据将自动汇总至此。</p>\n </div>\n </div>\n\n <!-- Step 06: 复盘 -->\n <div class=\"step-panel\" id=\"step-content-6\">\n <div class=\"mb-4\">\n <span class=\"text-[11px] font-medium text-gray-400 uppercase tracking-widest\">Step 06</span>\n <h2 class=\"text-[17px] font-semibold text-gray-900 mt-1\">盘后复盘</h2>\n <p class=\"text-[13px] text-gray-500 mt-1.5 leading-relaxed\">收盘后逐笔核对执行质量,记录偏差原因,为下一交易日优化纪律清单。</p>\n </div>\n <div class=\"empty-state\">\n <div class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gray-100 flex items-center justify-center\">\n <i class=\"fa-solid fa-clipboard-check text-gray-400 text-xl\"></i>\n </div>\n <p class=\"text-sm font-semibold text-gray-900 mb-1\">等待收盘</p>\n <p class=\"text-[13px] text-gray-500 leading-relaxed max-w-md mx-auto\">收盘后将自动生成当日执行报告,对比计划与实际操作的偏差。</p>\n </div>\n </div>\n\n </div>\n\n </main>\n\n <script>\n (function() {\n // Step tab switching\n const stepTabs = document.querySelectorAll('.step-tab');\n const stepPanels = document.querySelectorAll('.step-panel');\n\n stepTabs.forEach(tab => {\n tab.addEventListener('click', function() {\n const step = this.getAttribute('data-step');\n\n // Update tabs\n stepTabs.forEach(t => t.classList.remove('active'));\n this.classList.add('active');\n\n // Update panels\n stepPanels.forEach(p => p.classList.remove('active'));\n const target = document.getElementById('step-content-' + step);\n if (target) {\n target.classList.add('active');\n // Re-trigger animation\n target.style.animation = 'none';\n target.offsetHeight;\n target.style.animation = '';\n }\n });\n });\n\n // Nav item switching\n const navItems = document.querySelectorAll('.nav-item');\n navItems.forEach(item => {\n item.addEventListener('click', function() {\n navItems.forEach(n => n.classList.remove('active'));

total_tokens
28052
summary
基于设计稿生成了「执行纪律台」总控仪表盘页面。采用极简专业风格,左侧240px导航栏+主内容区布局,包含市场总闸卡片、行动清单、六步导航和持仓优先内容区。配色严格遵循设计Token(#F6F6F6背景、#111827主文字、#10B981成功色),加入微妙的CSS网格纹理背景和细腻交互动效。
uiParsing
关闭