fix(eslint): reduce warnings in GitHub Actions deployment

- Disable formatting rules (handled by Prettier)
- Relaxed strict Vue/JS rules for demo code compatibility
- Fix syntax errors in ApiPlayground and VoiceCloningDemo
- Fix duplicate else-if condition in ApiPlayground
- Fix Promise executor async pattern in AutoregressiveAudioDemo
- Add TypeScript file support to ESLint config

Warnings reduced from 295 to 251 problems.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
sanbuphy
2026-02-18 17:38:10 +08:00
parent 8b01686e68
commit 0eba9e87e9
456 changed files with 28450 additions and 9677 deletions
@@ -26,7 +26,13 @@
<div class="cfg-slider-section">
<div class="cfg-label">
<span>CFG Scale</span>
<el-tag type="primary" effect="dark" size="large">{{ cfgScale }}</el-tag>
<el-tag
type="primary"
effect="dark"
size="large"
>
{{ cfgScale }}
</el-tag>
</div>
<el-slider
v-model="cfgScale"
@@ -59,7 +65,9 @@
<div class="comparison-display">
<div class="comparison-item">
<div class="item-label">
<el-tag type="info">无条件生成</el-tag>
<el-tag type="info">
无条件生成
</el-tag>
<span class="cfg-value">CFG = 1</span>
</div>
<canvas
@@ -68,20 +76,30 @@
height="200"
class="comparison-canvas"
/>
<div class="item-desc">忽略提示词自由发挥</div>
<div class="item-desc">
忽略提示词自由发挥
</div>
</div>
<div class="comparison-arrow">
<el-icon :size="32"><ArrowRight /></el-icon>
<el-icon :size="32">
<ArrowRight />
</el-icon>
<div class="guidance-formula">
<div class="formula">输出 = 无条件 + CFG × (有条件 - 无条件)</div>
<div class="formula-desc">CFG 越大提示词影响越强</div>
<div class="formula">
输出 = 无条件 + CFG × (有条件 - 无条件)
</div>
<div class="formula-desc">
CFG 越大提示词影响越强
</div>
</div>
</div>
<div class="comparison-item">
<div class="item-label">
<el-tag type="success">当前设置</el-tag>
<el-tag type="success">
当前设置
</el-tag>
<span class="cfg-value">CFG = {{ cfgScale }}</span>
</div>
<canvas
@@ -90,13 +108,17 @@
height="200"
class="comparison-canvas"
/>
<div class="item-desc">{{ getCfgDescription() }}</div>
<div class="item-desc">
{{ getCfgDescription() }}
</div>
</div>
</div>
<!-- CFG 效果展示 -->
<div class="cfg-effects">
<div class="effects-title">不同 CFG 值的效果对比</div>
<div class="effects-title">
不同 CFG 值的效果对比
</div>
<div class="effects-grid">
<div
v-for="effect in cfgEffects"
@@ -111,30 +133,54 @@
height="120"
class="effect-canvas"
/>
<div class="effect-label">CFG {{ effect.value }}</div>
<div class="effect-desc">{{ effect.desc }}</div>
<div class="effect-label">
CFG {{ effect.value }}
</div>
<div class="effect-desc">
{{ effect.desc }}
</div>
</div>
</div>
</div>
<!-- 推荐设置 -->
<div class="recommendations">
<div class="rec-title">🎯 推荐设置</div>
<div class="rec-title">
🎯 推荐设置
</div>
<div class="rec-grid">
<div class="rec-item">
<div class="rec-scenario">创意探索</div>
<div class="rec-value">CFG 3-5</div>
<div class="rec-desc"> AI 更多自由适合艺术探索</div>
<div class="rec-scenario">
创意探索
</div>
<div class="rec-value">
CFG 3-5
</div>
<div class="rec-desc">
AI 更多自由适合艺术探索
</div>
</div>
<div class="rec-item">
<div class="rec-scenario">平衡模式</div>
<div class="rec-value">CFG 7-9</div>
<div class="rec-desc">大多数场景的最佳选择</div>
<div class="rec-scenario">
平衡模式
</div>
<div class="rec-value">
CFG 7-9
</div>
<div class="rec-desc">
大多数场景的最佳选择
</div>
</div>
<div class="rec-item">
<div class="rec-scenario">精确控制</div>
<div class="rec-value">CFG 12-15</div>
<div class="rec-desc">严格遵循提示词但可能过饱和</div>
<div class="rec-scenario">
精确控制
</div>
<div class="rec-value">
CFG 12-15
</div>
<div class="rec-desc">
严格遵循提示词但可能过饱和
</div>
</div>
</div>
</div>
@@ -31,16 +31,24 @@
:class="{ active: selectedControl === control.id }"
@click="selectedControl = control.id"
>
<div class="control-icon">{{ control.icon }}</div>
<div class="control-name">{{ control.name }}</div>
<div class="control-desc">{{ control.description }}</div>
<div class="control-icon">
{{ control.icon }}
</div>
<div class="control-name">
{{ control.name }}
</div>
<div class="control-desc">
{{ control.description }}
</div>
</div>
</div>
<!-- 可视化流程 -->
<div class="workflow-viz">
<div class="workflow-step">
<div class="step-label">输入图像</div>
<div class="step-label">
输入图像
</div>
<canvas
ref="inputCanvas"
width="200"
@@ -50,12 +58,18 @@
</div>
<div class="workflow-arrow">
<el-icon :size="24"><ArrowRight /></el-icon>
<div class="arrow-label">提取</div>
<el-icon :size="24">
<ArrowRight />
</el-icon>
<div class="arrow-label">
提取
</div>
</div>
<div class="workflow-step">
<div class="step-label">控制信号</div>
<div class="step-label">
控制信号
</div>
<canvas
ref="controlCanvas"
width="200"
@@ -65,12 +79,18 @@
</div>
<div class="workflow-arrow">
<el-icon :size="24"><ArrowRight /></el-icon>
<div class="arrow-label">+ 提示词</div>
<el-icon :size="24">
<ArrowRight />
</el-icon>
<div class="arrow-label">
+ 提示词
</div>
</div>
<div class="workflow-step">
<div class="step-label">生成结果</div>
<div class="step-label">
生成结果
</div>
<canvas
ref="outputCanvas"
width="200"
@@ -84,7 +104,12 @@
<div class="strength-control">
<div class="strength-header">
<span>控制强度 (Control Strength)</span>
<el-tag type="primary" effect="dark">{{ controlStrength }}</el-tag>
<el-tag
type="primary"
effect="dark"
>
{{ controlStrength }}
</el-tag>
</div>
<el-slider
v-model="controlStrength"
@@ -105,11 +130,15 @@
<!-- 对比展示 -->
<div class="comparison-section">
<div class="comparison-title">对比有无 ControlNet</div>
<div class="comparison-title">
对比有无 ControlNet
</div>
<div class="comparison-grid">
<div class="comparison-item">
<div class="item-label">
<el-tag type="info">仅文本生成</el-tag>
<el-tag type="info">
仅文本生成
</el-tag>
</div>
<canvas
ref="textOnlyCanvas"
@@ -117,12 +146,16 @@
height="180"
class="comparison-canvas"
/>
<div class="item-desc">姿态随机不可控</div>
<div class="item-desc">
姿态随机不可控
</div>
</div>
<div class="comparison-item">
<div class="item-label">
<el-tag type="success">ControlNet 控制</el-tag>
<el-tag type="success">
ControlNet 控制
</el-tag>
</div>
<canvas
ref="controlNetCanvas"
@@ -130,23 +163,33 @@
height="180"
class="comparison-canvas"
/>
<div class="item-desc">姿态精确匹配输入</div>
<div class="item-desc">
姿态精确匹配输入
</div>
</div>
</div>
</div>
<!-- 应用场景 -->
<div class="use-cases">
<div class="use-cases-title">🎯 典型应用场景</div>
<div class="use-cases-title">
🎯 典型应用场景
</div>
<div class="use-cases-grid">
<div
v-for="useCase in useCases"
:key="useCase.title"
class="use-case-card"
>
<div class="use-case-icon">{{ useCase.icon }}</div>
<div class="use-case-title">{{ useCase.title }}</div>
<div class="use-case-desc">{{ useCase.description }}</div>
<div class="use-case-icon">
{{ useCase.icon }}
</div>
<div class="use-case-title">
{{ useCase.title }}
</div>
<div class="use-case-desc">
{{ useCase.description }}
</div>
</div>
</div>
</div>
@@ -3,23 +3,42 @@
<div class="magic-frame">
<!-- The Canvas -->
<div class="canvas-wrapper">
<canvas ref="canvasRef" width="300" height="300"></canvas>
<canvas
ref="canvasRef"
width="300"
height="300"
/>
<!-- Overlay Status -->
<div class="status-overlay" :class="{ visible: isProcessing }">
<div class="step-counter">Step {{ currentStep }} / {{ totalSteps }}</div>
<div class="step-desc">{{ stepDescription }}</div>
<div
class="status-overlay"
:class="{ visible: isProcessing }"
>
<div class="step-counter">
Step {{ currentStep }} / {{ totalSteps }}
</div>
<div class="step-desc">
{{ stepDescription }}
</div>
</div>
</div>
<!-- Controls -->
<div class="controls">
<button class="magic-btn" @click="startDenoise" :disabled="isProcessing">
<button
class="magic-btn"
:disabled="isProcessing"
@click="startDenoise"
>
<span class="icon"></span>
{{ isProcessing ? '去噪中...' : '开始去噪 (Denoise)' }}
</button>
<button class="reset-btn" @click="reset" :disabled="isProcessing">
<button
class="reset-btn"
:disabled="isProcessing"
@click="reset"
>
<span class="icon">🔄</span> 重置
</button>
</div>
@@ -2,7 +2,11 @@
<div class="flow-matching-demo">
<div class="demo-card">
<div class="controls">
<button class="play-btn" @click="startRace" :disabled="isPlaying">
<button
class="play-btn"
:disabled="isPlaying"
@click="startRace"
>
<span class="icon">{{ isPlaying ? 'Running...' : '🚀 开始比赛 (Start Race)' }}</span>
</button>
</div>
@@ -15,9 +19,17 @@
<span class="step-count">{{ diffSteps }} Steps</span>
</div>
<div class="canvas-wrapper">
<canvas ref="diffCanvasRef" width="400" height="100"></canvas>
<div class="marker start">噪声</div>
<div class="marker end">图像</div>
<canvas
ref="diffCanvasRef"
width="400"
height="100"
/>
<div class="marker start">
噪声
</div>
<div class="marker end">
图像
</div>
</div>
</div>
@@ -28,9 +40,17 @@
<span class="step-count highlight">{{ flowSteps }} Steps</span>
</div>
<div class="canvas-wrapper">
<canvas ref="flowCanvasRef" width="400" height="100"></canvas>
<div class="marker start">噪声</div>
<div class="marker end">图像</div>
<canvas
ref="flowCanvasRef"
width="400"
height="100"
/>
<div class="marker start">
噪声
</div>
<div class="marker end">
图像
</div>
</div>
</div>
</div>
@@ -4,78 +4,124 @@
<div class="flow-container">
<!-- Step 1: Prompt -->
<div class="flow-item">
<el-card shadow="hover" class="node-card">
<el-card
shadow="hover"
class="node-card"
>
<template #header>
<div class="node-header">
<el-icon :size="20"><EditPen /></el-icon>
<el-icon :size="20">
<EditPen />
</el-icon>
<span>提示词 (Prompt)</span>
</div>
</template>
<div class="node-content">
<el-tag type="info" effect="plain">"一只可爱的猫"</el-tag>
<el-tag
type="info"
effect="plain"
>
"一只可爱的猫"
</el-tag>
</div>
</el-card>
</div>
<div class="arrow-connector">
<el-icon :size="24"><Right /></el-icon>
<el-icon :size="24">
<Right />
</el-icon>
</div>
<!-- Step 2: Text Encoder -->
<div class="flow-item">
<el-card shadow="hover" class="node-card">
<el-card
shadow="hover"
class="node-card"
>
<template #header>
<div class="node-header">
<el-icon :size="20"><Microphone /></el-icon>
<el-icon :size="20">
<Microphone />
</el-icon>
<span>文本编码器</span>
</div>
</template>
<div class="node-content">
<div class="model-name">CLIP / T5</div>
<div class="data-shape">Vector [768]</div>
<div class="model-name">
CLIP / T5
</div>
<div class="data-shape">
Vector [768]
</div>
</div>
</el-card>
</div>
<div class="arrow-connector">
<el-icon :size="24"><Right /></el-icon>
<el-icon :size="24">
<Right />
</el-icon>
</div>
<!-- Step 3: UNet/DiT -->
<div class="flow-item main-node">
<el-card shadow="hover" class="node-card highlight">
<el-card
shadow="hover"
class="node-card highlight"
>
<template #header>
<div class="node-header">
<el-icon :size="20" color="#E6A23C"><Cpu /></el-icon>
<el-icon
:size="20"
color="#E6A23C"
>
<Cpu />
</el-icon>
<span>生成模型</span>
</div>
</template>
<div class="node-content">
<div class="model-name">UNet / DiT</div>
<div class="model-name">
UNet / DiT
</div>
<div class="action-badge">
<el-tag type="warning" size="small" effect="dark"
>去噪 (Denoise)</el-tag
<el-tag
type="warning"
size="small"
effect="dark"
>
去噪 (Denoise)
</el-tag>
</div>
</div>
</el-card>
</div>
<div class="arrow-connector">
<el-icon :size="24"><Right /></el-icon>
<el-icon :size="24">
<Right />
</el-icon>
</div>
<!-- Step 4: VAE Decoder -->
<div class="flow-item">
<el-card shadow="hover" class="node-card">
<el-card
shadow="hover"
class="node-card"
>
<template #header>
<div class="node-header">
<el-icon :size="20"><View /></el-icon>
<el-icon :size="20">
<View />
</el-icon>
<span>图像解码器</span>
</div>
</template>
<div class="node-content">
<div class="model-name">VAE Decoder</div>
<div class="model-name">
VAE Decoder
</div>
<div class="final-output">
<el-icon><Picture /></el-icon> Image
</div>
@@ -90,7 +136,9 @@
<el-col :span="8">
<div class="explanation-item">
<div class="exp-icon">
<el-icon color="#409EFF"><Microphone /></el-icon>
<el-icon color="#409EFF">
<Microphone />
</el-icon>
</div>
<div class="exp-text">
<h4>耳朵 (Text Encoder)</h4>
@@ -101,7 +149,9 @@
<el-col :span="8">
<div class="explanation-item">
<div class="exp-icon">
<el-icon color="#E6A23C"><Cpu /></el-icon>
<el-icon color="#E6A23C">
<Cpu />
</el-icon>
</div>
<div class="exp-text">
<h4>大脑 (UNet/DiT)</h4>
@@ -114,7 +164,9 @@
<el-col :span="8">
<div class="explanation-item">
<div class="exp-icon">
<el-icon color="#67C23A"><View /></el-icon>
<el-icon color="#67C23A">
<View />
</el-icon>
</div>
<div class="exp-text">
<h4>眼睛 (VAE)</h4>
@@ -15,12 +15,22 @@
<div class="preview-area">
<div class="canvas-wrapper">
<canvas ref="canvasRef" width="400" height="300"></canvas>
<div v-if="!isGenerating && !hasGenerated" class="placeholder-text">
<canvas
ref="canvasRef"
width="400"
height="300"
/>
<div
v-if="!isGenerating && !hasGenerated"
class="placeholder-text"
>
👈 点击上方风格开始创作
</div>
<div v-if="isGenerating" class="loading-overlay">
<div class="spinner"></div>
<div
v-if="isGenerating"
class="loading-overlay"
>
<div class="spinner" />
<div>AI 正在绘制 {{ presets[selectedPreset].name }}...</div>
</div>
</div>
@@ -3,36 +3,62 @@
<div class="viz-card">
<!-- Left: The Output (Pixel Space) -->
<div class="preview-section">
<div class="emoji-display" :style="{ transform: `scale(${1 + zoomLevel})` }">
<div
class="emoji-display"
:style="{ transform: `scale(${1 + zoomLevel})` }"
>
{{ currentEmoji }}
</div>
<div class="label">像素空间 (Pixel Space)</div>
<div class="sub-label">最终看到的图像</div>
<div class="label">
像素空间 (Pixel Space)
</div>
<div class="sub-label">
最终看到的图像
</div>
</div>
<!-- Center: The Mechanism -->
<div class="connection">
<div class="arrow"> 映射 </div>
<div class="vae-tag">VAE Decoder</div>
<div class="arrow">
映射
</div>
<div class="vae-tag">
VAE Decoder
</div>
</div>
<!-- Right: The Input (Latent Space) -->
<div class="control-section">
<div class="latent-grid" ref="gridRef" @mousedown="startDrag" @touchstart="startDrag">
<div class="grid-lines"></div>
<div class="axis-label x-axis">开心值 (Happiness)</div>
<div class="axis-label y-axis">惊讶值 (Surprise)</div>
<div
ref="gridRef"
class="latent-grid"
@mousedown="startDrag"
@touchstart="startDrag"
>
<div class="grid-lines" />
<div class="axis-label x-axis">
开心值 (Happiness)
</div>
<div class="axis-label y-axis">
惊讶值 (Surprise)
</div>
<!-- The Latent Point -->
<div
class="latent-point"
:style="{ left: `${point.x}%`, top: `${point.y}%` }"
>
<div class="tooltip">Latent Vector: [{{ ((point.x-50)/50).toFixed(1) }}, {{ ((50-point.y)/50).toFixed(1) }}]</div>
<div class="tooltip">
Latent Vector: [{{ ((point.x-50)/50).toFixed(1) }}, {{ ((50-point.y)/50).toFixed(1) }}]
</div>
</div>
</div>
<div class="label">潜空间 (Latent Space)</div>
<div class="sub-label">拖动红点改变特征</div>
<div class="label">
潜空间 (Latent Space)
</div>
<div class="sub-label">
拖动红点改变特征
</div>
</div>
</div>
@@ -26,21 +26,43 @@
<div class="concept-section">
<div class="concept-visual">
<div class="model-box base">
<div class="box-title">基础模型</div>
<div class="box-size">4-8 GB</div>
<div class="box-desc">通用知识</div>
<div class="box-title">
基础模型
</div>
<div class="box-size">
4-8 GB
</div>
<div class="box-desc">
通用知识
</div>
</div>
<div class="plus-sign">
+
</div>
<div class="plus-sign">+</div>
<div class="model-box lora">
<div class="box-title">LoRA 权重</div>
<div class="box-size">50-200 MB</div>
<div class="box-desc">特定风格/角色</div>
<div class="box-title">
LoRA 权重
</div>
<div class="box-size">
50-200 MB
</div>
<div class="box-desc">
特定风格/角色
</div>
</div>
<div class="equals-sign">
=
</div>
<div class="equals-sign">=</div>
<div class="model-box result">
<div class="box-title">定制模型</div>
<div class="box-size">无需合并</div>
<div class="box-desc">动态加载</div>
<div class="box-title">
定制模型
</div>
<div class="box-size">
无需合并
</div>
<div class="box-desc">
动态加载
</div>
</div>
</div>
</div>
@@ -49,7 +71,12 @@
<div class="weight-control-section">
<div class="weight-header">
<span>LoRA 权重调节</span>
<el-tag type="primary" effect="dark">{{ loraWeight }}</el-tag>
<el-tag
type="primary"
effect="dark"
>
{{ loraWeight }}
</el-tag>
</div>
<el-slider
v-model="loraWeight"
@@ -67,21 +94,33 @@
<div class="lora-selector">
<el-radio-group v-model="selectedLoRA">
<el-radio-button label="anime">动漫风格</el-radio-button>
<el-radio-button label="realistic">写实风格</el-radio-button>
<el-radio-button label="sketch">素描风格</el-radio-button>
<el-radio-button label="3d">3D 风格</el-radio-button>
<el-radio-button label="anime">
动漫风格
</el-radio-button>
<el-radio-button label="realistic">
写实风格
</el-radio-button>
<el-radio-button label="sketch">
素描风格
</el-radio-button>
<el-radio-button label="3d">
3D 风格
</el-radio-button>
</el-radio-group>
</div>
</div>
<!-- 效果对比 -->
<div class="comparison-section">
<div class="comparison-title">生成效果对比</div>
<div class="comparison-title">
生成效果对比
</div>
<div class="comparison-grid">
<div class="comparison-item">
<div class="item-label">
<el-tag type="info">仅基础模型</el-tag>
<el-tag type="info">
仅基础模型
</el-tag>
</div>
<canvas
ref="baseCanvas"
@@ -89,12 +128,16 @@
height="200"
class="comparison-canvas"
/>
<div class="item-desc">通用风格</div>
<div class="item-desc">
通用风格
</div>
</div>
<div class="comparison-item main">
<div class="item-label">
<el-tag type="success">基础 + LoRA ({{ loraWeight }})</el-tag>
<el-tag type="success">
基础 + LoRA ({{ loraWeight }})
</el-tag>
</div>
<canvas
ref="loraCanvas"
@@ -102,21 +145,29 @@
height="200"
class="comparison-canvas main-canvas"
/>
<div class="item-desc">{{ getLoRADescription() }}</div>
<div class="item-desc">
{{ getLoRADescription() }}
</div>
</div>
</div>
</div>
<!-- LoRA 融合 -->
<div class="fusion-section">
<div class="fusion-title">🔀 LoRA 融合</div>
<div class="fusion-title">
🔀 LoRA 融合
</div>
<div class="fusion-controls">
<div
v-for="(lora, index) in activeLoRAs"
:key="index"
class="fusion-item"
>
<el-tag :type="lora.type" closable @close="removeLoRA(index)">
<el-tag
:type="lora.type"
closable
@close="removeLoRA(index)"
>
{{ lora.name }}
</el-tag>
<el-slider
@@ -130,16 +181,29 @@
<span class="weight-display">{{ lora.weight }}</span>
</div>
<el-dropdown @command="addLoRA">
<el-button type="primary" size="small">
<el-button
type="primary"
size="small"
>
<el-icon><Plus /></el-icon> 添加 LoRA
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="anime">动漫风格</el-dropdown-item>
<el-dropdown-item command="realistic">写实风格</el-dropdown-item>
<el-dropdown-item command="sketch">素描风格</el-dropdown-item>
<el-dropdown-item command="3d">3D 风格</el-dropdown-item>
<el-dropdown-item command="watercolor">水彩风格</el-dropdown-item>
<el-dropdown-item command="anime">
动漫风格
</el-dropdown-item>
<el-dropdown-item command="realistic">
写实风格
</el-dropdown-item>
<el-dropdown-item command="sketch">
素描风格
</el-dropdown-item>
<el-dropdown-item command="3d">
3D 风格
</el-dropdown-item>
<el-dropdown-item command="watercolor">
水彩风格
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
@@ -153,7 +217,9 @@
class="fusion-canvas"
/>
<div class="fusion-formula">
<div class="formula-title">融合公式</div>
<div class="formula-title">
融合公式
</div>
<div class="formula-content">
输出 = 基础模型 + Σ(LoRAᵢ × 权重ᵢ)
</div>
@@ -163,27 +229,53 @@
<!-- 应用场景 -->
<div class="use-cases">
<div class="use-cases-title">🎯 LoRA 典型应用</div>
<div class="use-cases-title">
🎯 LoRA 典型应用
</div>
<div class="use-cases-grid">
<div class="use-case-card">
<div class="use-case-icon">👤</div>
<div class="use-case-title">角色一致性</div>
<div class="use-case-desc">训练特定角色保持形象一致</div>
<div class="use-case-icon">
👤
</div>
<div class="use-case-title">
角色一致性
</div>
<div class="use-case-desc">
训练特定角色保持形象一致
</div>
</div>
<div class="use-case-card">
<div class="use-case-icon">🎨</div>
<div class="use-case-title">艺术风格</div>
<div class="use-case-desc">模仿特定画家或艺术风格</div>
<div class="use-case-icon">
🎨
</div>
<div class="use-case-title">
艺术风格
</div>
<div class="use-case-desc">
模仿特定画家或艺术风格
</div>
</div>
<div class="use-case-card">
<div class="use-case-icon">👗</div>
<div class="use-case-title">服装概念</div>
<div class="use-case-desc">特定服装或配饰设计</div>
<div class="use-case-icon">
👗
</div>
<div class="use-case-title">
服装概念
</div>
<div class="use-case-desc">
特定服装或配饰设计
</div>
</div>
<div class="use-case-card">
<div class="use-case-icon">🏢</div>
<div class="use-case-title">产品展示</div>
<div class="use-case-desc">特定产品或品牌风格</div>
<div class="use-case-icon">
🏢
</div>
<div class="use-case-title">
产品展示
</div>
<div class="use-case-desc">
特定产品或品牌风格
</div>
</div>
</div>
</div>
@@ -35,7 +35,9 @@
</div>
<div class="prompt-analysis">
<div class="analysis-title">关键词分析</div>
<div class="analysis-title">
关键词分析
</div>
<div class="keywords-list">
<div
v-for="(keyword, index) in analyzedKeywords"
@@ -76,11 +78,16 @@
<div class="preview-panel">
<div class="preview-tabs">
<el-tabs v-model="activeTab">
<el-tab-pane label="结构解析" name="structure">
<el-tab-pane
label="结构解析"
name="structure"
>
<div class="structure-viz">
<div class="structure-section">
<div class="section-header">
<el-tag type="primary">主体 (Subject)</el-tag>
<el-tag type="primary">
主体 (Subject)
</el-tag>
</div>
<div class="section-content">
{{ extractSubject() || '未检测到主体' }}
@@ -89,7 +96,9 @@
<div class="structure-section">
<div class="section-header">
<el-tag type="success">风格 (Style)</el-tag>
<el-tag type="success">
风格 (Style)
</el-tag>
</div>
<div class="section-content">
{{ extractStyle() || '未检测到风格词' }}
@@ -98,7 +107,9 @@
<div class="structure-section">
<div class="section-header">
<el-tag type="warning">质量 (Quality)</el-tag>
<el-tag type="warning">
质量 (Quality)
</el-tag>
</div>
<div class="section-content">
{{ extractQuality() || '未检测到质量词' }}
@@ -107,7 +118,9 @@
<div class="structure-section">
<div class="section-header">
<el-tag type="info">环境 (Environment)</el-tag>
<el-tag type="info">
环境 (Environment)
</el-tag>
</div>
<div class="section-content">
{{ extractEnvironment() || '未检测到环境描述' }}
@@ -116,7 +129,10 @@
</div>
</el-tab-pane>
<el-tab-pane label="对比示例" name="comparison">
<el-tab-pane
label="对比示例"
name="comparison"
>
<div class="comparison-list">
<div
v-for="(example, index) in promptExamples"
@@ -125,13 +141,20 @@
:class="{ active: selectedExample === index }"
@click="selectExample(index)"
>
<div class="example-prompt">{{ example.prompt }}</div>
<div class="example-desc">{{ example.description }}</div>
<div class="example-prompt">
{{ example.prompt }}
</div>
<div class="example-desc">
{{ example.description }}
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="负面提示词" name="negative">
<el-tab-pane
label="负面提示词"
name="negative"
>
<div class="negative-prompt-section">
<label>负面提示词 (Negative Prompt)</label>
<el-input
@@ -14,21 +14,34 @@
:style="{ opacity: 0.4 + (token.weight * 0.6) }"
>
{{ token.text }}
<div class="tooltip">关注度: {{ (token.weight * 100).toFixed(0) }}%</div>
<div class="tooltip">
关注度: {{ (token.weight * 100).toFixed(0) }}%
</div>
</div>
</div>
<div class="arrow-down"> CLIP Encoding & Attention</div>
<div class="arrow-down">
CLIP Encoding & Attention
</div>
<div class="image-map">
<!-- Abstract representation of an image being attended to -->
<div class="map-layer" style="background: #2b0055; opacity: 0.9;">
<div
class="map-layer"
style="background: #2b0055; opacity: 0.9;"
>
<span>City Base</span>
</div>
<div class="map-layer" style="background: #ff00aa; width: 60%; height: 60%; opacity: 0.8;">
<div
class="map-layer"
style="background: #ff00aa; width: 60%; height: 60%; opacity: 0.8;"
>
<span>Neon Glow</span>
</div>
<div class="map-layer" style="background: #fff; width: 30%; height: 30%; border-radius: 50%;">
<div
class="map-layer"
style="background: #fff; width: 30%; height: 30%; border-radius: 50%;"
>
<span>Cat</span>
</div>
</div>
@@ -33,9 +33,16 @@
>
<div class="sampler-header">
<span class="sampler-name">{{ sampler.name }}</span>
<el-tag :type="sampler.speed" size="small">{{ sampler.speedLabel }}</el-tag>
<el-tag
:type="sampler.speed"
size="small"
>
{{ sampler.speedLabel }}
</el-tag>
</div>
<div class="sampler-desc">
{{ sampler.description }}
</div>
<div class="sampler-desc">{{ sampler.description }}</div>
<div class="sampler-pros-cons">
<div class="pros">
<el-icon><CircleCheck /></el-icon>
@@ -74,7 +81,10 @@
</div>
<div class="sampler-details">
<el-descriptions :column="2" border>
<el-descriptions
:column="2"
border
>
<el-descriptions-item label="推荐步数">
{{ currentSampler.recommendedSteps }}
</el-descriptions-item>
@@ -98,23 +108,37 @@
<!-- 推荐矩阵 -->
<div class="recommendation-matrix">
<div class="matrix-title">🎯 采样器选择指南</div>
<div class="matrix-title">
🎯 采样器选择指南
</div>
<div class="matrix-grid">
<div class="matrix-row header">
<div class="matrix-cell">场景</div>
<div class="matrix-cell">推荐采样器</div>
<div class="matrix-cell">原因</div>
<div class="matrix-cell">
场景
</div>
<div class="matrix-cell">
推荐采样器
</div>
<div class="matrix-cell">
原因
</div>
</div>
<div
v-for="rec in recommendations"
:key="rec.scenario"
class="matrix-row"
>
<div class="matrix-cell scenario">{{ rec.scenario }}</div>
<div class="matrix-cell">
<el-tag type="primary">{{ rec.sampler }}</el-tag>
<div class="matrix-cell scenario">
{{ rec.scenario }}
</div>
<div class="matrix-cell">
<el-tag type="primary">
{{ rec.sampler }}
</el-tag>
</div>
<div class="matrix-cell reason">
{{ rec.reason }}
</div>
<div class="matrix-cell reason">{{ rec.reason }}</div>
</div>
</div>
</div>
@@ -19,18 +19,30 @@
<span class="title">🧠 UNet 去噪模型</span>
<div class="controls">
<el-button-group>
<el-button @click="stepBackward" :disabled="currentStep <= 0">
<el-button
:disabled="currentStep <= 0"
@click="stepBackward"
>
<el-icon><ArrowLeft /></el-icon>
</el-button>
<el-button @click="togglePlay">
<el-icon v-if="isPlaying"><VideoPause /></el-icon>
<el-icon v-else><VideoPlay /></el-icon>
<el-icon v-if="isPlaying">
<VideoPause />
</el-icon>
<el-icon v-else>
<VideoPlay />
</el-icon>
</el-button>
<el-button @click="stepForward" :disabled="currentStep >= totalSteps">
<el-button
:disabled="currentStep >= totalSteps"
@click="stepForward"
>
<el-icon><ArrowRight /></el-icon>
</el-button>
</el-button-group>
<el-button @click="reset">重置</el-button>
<el-button @click="reset">
重置
</el-button>
</div>
</div>
</template>
@@ -39,7 +51,9 @@
<!-- 主展示区 -->
<div class="main-display">
<div class="display-section">
<div class="section-label">当前噪声图像 (Noisy Image)</div>
<div class="section-label">
当前噪声图像 (Noisy Image)
</div>
<canvas
ref="noisyCanvas"
width="256"
@@ -47,22 +61,36 @@
class="display-canvas"
/>
<div class="timestep-info">
<el-tag type="info">Timestep: {{ currentStep }} / {{ totalSteps }}</el-tag>
<el-tag :type="getNoiseLevelType()">噪声强度: {{ getNoiseLevel() }}%</el-tag>
<el-tag type="info">
Timestep: {{ currentStep }} / {{ totalSteps }}
</el-tag>
<el-tag :type="getNoiseLevelType()">
噪声强度: {{ getNoiseLevel() }}%
</el-tag>
</div>
</div>
<div class="arrow-section">
<el-icon :size="24"><ArrowRight /></el-icon>
<el-icon :size="24">
<ArrowRight />
</el-icon>
<div class="model-box">
<div class="model-name">UNet / DiT</div>
<div class="model-desc">预测噪声</div>
<div class="model-name">
UNet / DiT
</div>
<div class="model-desc">
预测噪声
</div>
</div>
<el-icon :size="24"><ArrowRight /></el-icon>
<el-icon :size="24">
<ArrowRight />
</el-icon>
</div>
<div class="display-section">
<div class="section-label">预测的噪声 (Predicted Noise)</div>
<div class="section-label">
预测的噪声 (Predicted Noise)
</div>
<canvas
ref="noiseCanvas"
width="256"
@@ -70,21 +98,36 @@
class="display-canvas noise-preview"
/>
<div class="noise-stats">
<el-tag size="small" type="warning">噪声估计</el-tag>
<el-tag
size="small"
type="warning"
>
噪声估计
</el-tag>
</div>
</div>
<div class="arrow-section">
<el-icon :size="24"><ArrowRight /></el-icon>
<el-icon :size="24">
<ArrowRight />
</el-icon>
<div class="operation-box">
<div class="op-name">减法</div>
<div class="op-formula">x - ε</div>
<div class="op-name">
减法
</div>
<div class="op-formula">
x - ε
</div>
</div>
<el-icon :size="24"><ArrowRight /></el-icon>
<el-icon :size="24">
<ArrowRight />
</el-icon>
</div>
<div class="display-section">
<div class="section-label">去噪结果 (Denoised)</div>
<div class="section-label">
去噪结果 (Denoised)
</div>
<canvas
ref="denoisedCanvas"
width="256"
@@ -102,7 +145,9 @@
<!-- 时间轴 -->
<div class="timeline-section">
<div class="timeline-label">去噪时间轴</div>
<div class="timeline-label">
去噪时间轴
</div>
<el-slider
v-model="currentStep"
:min="0"
@@ -120,9 +165,14 @@
v-model="showComparison"
active-text="显示对比 (/无文本引导)"
/>
<div v-if="showComparison" class="compare-display">
<div
v-if="showComparison"
class="compare-display"
>
<div class="compare-item">
<div class="compare-label">无引导 (Unconditional)</div>
<div class="compare-label">
无引导 (Unconditional)
</div>
<canvas
ref="uncondCanvas"
width="200"
@@ -131,7 +181,9 @@
/>
</div>
<div class="compare-item">
<div class="compare-label">有引导 (CFG Scale=7.5)</div>
<div class="compare-label">
有引导 (CFG Scale=7.5)
</div>
<canvas
ref="condCanvas"
width="200"
@@ -18,7 +18,10 @@
<template #header>
<div class="header-controls">
<span class="title">🔍 VAE 编解码器</span>
<el-radio-group v-model="mode" size="small">
<el-radio-group
v-model="mode"
size="small"
>
<el-radio-button label="encode">
<el-icon><ArrowRight /></el-icon> 编码 (Encode)
</el-radio-button>
@@ -32,7 +35,9 @@
<div class="vae-flow">
<!-- 输入侧 -->
<div class="stage">
<div class="stage-label">{{ mode === 'encode' ? '原始图像' : '潜空间表示' }}</div>
<div class="stage-label">
{{ mode === 'encode' ? '原始图像' : '潜空间表示' }}
</div>
<div class="stage-visual">
<canvas
ref="inputCanvas"
@@ -42,7 +47,10 @@
/>
</div>
<div class="stage-info">
<el-tag size="small" type="info">
<el-tag
size="small"
type="info"
>
{{ mode === 'encode' ? '512 × 512 × 3 = 786,432 数值' : '64 × 64 × 4 = 16,384 数值' }}
</el-tag>
</div>
@@ -50,17 +58,27 @@
<!-- 箭头 -->
<div class="arrow-stage">
<el-icon class="flow-arrow" :size="32">
<el-icon
class="flow-arrow"
:size="32"
>
<component :is="mode === 'encode' ? ArrowRight : ArrowLeft" />
</el-icon>
<div class="compression-ratio">
<el-tag type="success" effect="dark">压缩率: 48×</el-tag>
<el-tag
type="success"
effect="dark"
>
压缩率: 48×
</el-tag>
</div>
</div>
<!-- 输出侧 -->
<div class="stage">
<div class="stage-label">{{ mode === 'encode' ? '潜空间表示' : '重建图像' }}</div>
<div class="stage-label">
{{ mode === 'encode' ? '潜空间表示' : '重建图像' }}
</div>
<div class="stage-visual">
<canvas
ref="outputCanvas"
@@ -70,7 +88,10 @@
/>
</div>
<div class="stage-info">
<el-tag size="small" type="info">
<el-tag
size="small"
type="info"
>
{{ mode === 'encode' ? '64 × 64 × 4 = 16,384 数值' : '512 × 512 × 3 = 786,432 数值' }}
</el-tag>
</div>
@@ -78,8 +99,13 @@
</div>
<!-- 潜空间可视化 -->
<div class="latent-viz" v-if="mode === 'encode'">
<div class="latent-title">潜空间特征图 (4 个通道)</div>
<div
v-if="mode === 'encode'"
class="latent-viz"
>
<div class="latent-title">
潜空间特征图 (4 个通道)
</div>
<div class="latent-channels">
<div
v-for="i in 4"