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
@@ -1,13 +1,19 @@
<template>
<div class="auto-scaling-demo">
<div class="header">
<div class="title">自动扩缩容</div>
<div class="subtitle">基于CPU内存QPS的智能弹性伸缩</div>
<div class="title">
自动扩缩容
</div>
<div class="subtitle">
基于CPU内存QPS的智能弹性伸缩
</div>
</div>
<!-- 指标选择器 -->
<div class="metric-selector">
<div class="selector-label">扩容指标</div>
<div class="selector-label">
扩容指标
</div>
<div class="selector-buttons">
<button
v-for="metric in metrics"
@@ -27,14 +33,17 @@
<div class="dashboard-header">
<span class="dashboard-title">实时监控</span>
<span class="refresh-indicator">
<span class="live-dot"></span>
<span class="live-dot" />
实时
</span>
</div>
<div class="metrics-grid">
<!-- CPU使用率 -->
<div class="metric-card" :class="{ warning: cpuUsage > 70, danger: cpuUsage > 90 }">
<div
class="metric-card"
:class="{ warning: cpuUsage > 70, danger: cpuUsage > 90 }"
>
<div class="metric-header">
<span class="metric-icon">💻</span>
<span class="metric-name">CPU使用率</span>
@@ -44,7 +53,10 @@
<span class="value-unit">%</span>
</div>
<div class="metric-progress">
<div class="progress-bar" :style="{ width: cpuUsage + '%', background: getUsageColor(cpuUsage) }"></div>
<div
class="progress-bar"
:style="{ width: cpuUsage + '%', background: getUsageColor(cpuUsage) }"
/>
</div>
<div class="metric-threshold">
<span>扩容阈值: 70%</span>
@@ -53,7 +65,10 @@
</div>
<!-- 内存使用率 -->
<div class="metric-card" :class="{ warning: memoryUsage > 75, danger: memoryUsage > 90 }">
<div
class="metric-card"
:class="{ warning: memoryUsage > 75, danger: memoryUsage > 90 }"
>
<div class="metric-header">
<span class="metric-icon">🧠</span>
<span class="metric-name">内存使用率</span>
@@ -63,7 +78,10 @@
<span class="value-unit">%</span>
</div>
<div class="metric-progress">
<div class="progress-bar" :style="{ width: memoryUsage + '%', background: getUsageColor(memoryUsage) }"></div>
<div
class="progress-bar"
:style="{ width: memoryUsage + '%', background: getUsageColor(memoryUsage) }"
/>
</div>
<div class="metric-threshold">
<span>扩容阈值: 75%</span>
@@ -82,7 +100,10 @@
<span class="value-unit">req/s</span>
</div>
<div class="metric-chart">
<svg viewBox="0 0 200 40" class="sparkline">
<svg
viewBox="0 0 200 40"
class="sparkline"
>
<polyline
fill="none"
stroke="var(--vp-c-brand)"
@@ -123,7 +144,10 @@
{{ i }}
</div>
</div>
<div v-if="scaleReason" class="scale-reason">
<div
v-if="scaleReason"
class="scale-reason"
>
<span class="reason-icon">{{ scaleReason.includes('扩容') ? '📈' : '📉' }}</span>
<span class="reason-text">{{ scaleReason }}</span>
</div>
@@ -144,46 +168,70 @@
class="history-item"
:class="{ scaleOut: record.type === '缩容' }"
>
<div class="item-icon">{{ record.type === '扩容' ? '📈' : '📉' }}</div>
<div class="item-icon">
{{ record.type === '扩容' ? '📈' : '📉' }}
</div>
<div class="item-details">
<div class="item-action">
{{ record.type }}: {{ record.from }} {{ record.to }} 实例
</div>
<div class="item-reason">{{ record.reason }}</div>
<div class="item-reason">
{{ record.reason }}
</div>
</div>
<div class="item-time">
{{ record.time }}
</div>
<div class="item-time">{{ record.time }}</div>
</div>
</div>
</div>
<!-- 最佳实践 -->
<div class="best-practices">
<div class="practices-title">自动扩缩容最佳实践</div>
<div class="practices-title">
自动扩缩容最佳实践
</div>
<div class="practices-grid">
<div class="practice-card">
<div class="practice-icon"></div>
<div class="practice-title">冷却时间</div>
<div class="practice-icon">
</div>
<div class="practice-title">
冷却时间
</div>
<div class="practice-desc">
设置适当的冷却时间通常3-5分钟避免扩缩容操作过于频繁导致的震荡
</div>
</div>
<div class="practice-card">
<div class="practice-icon">📊</div>
<div class="practice-title">多指标综合</div>
<div class="practice-icon">
📊
</div>
<div class="practice-title">
多指标综合
</div>
<div class="practice-desc">
不要依赖单一指标结合CPU内存QPS连接数等多维度进行综合判断
</div>
</div>
<div class="practice-card">
<div class="practice-icon">🎯</div>
<div class="practice-title">目标利用率</div>
<div class="practice-icon">
🎯
</div>
<div class="practice-title">
目标利用率
</div>
<div class="practice-desc">
设置合理的资源目标利用率如70%预留足够的缓冲应对突发流量
</div>
</div>
<div class="practice-card">
<div class="practice-icon"></div>
<div class="practice-title">快速扩容</div>
<div class="practice-icon">
</div>
<div class="practice-title">
快速扩容
</div>
<div class="practice-desc">
扩容操作应该比缩容更激进确保系统能快速应对流量增长
</div>
@@ -1,17 +1,30 @@
<template>
<div class="blue-green-deployment-demo">
<div class="header">
<div class="title">蓝绿部署</div>
<div class="subtitle">零停机发布的经典策略两套环境瞬间切换</div>
<div class="title">
蓝绿部署
</div>
<div class="subtitle">
零停机发布的经典策略两套环境瞬间切换
</div>
</div>
<!-- 部署状态控制 -->
<div class="deployment-control">
<div class="status-display">
<div class="status-item" :class="{ active: currentEnv === 'blue' }">
<div class="status-icon">🔵</div>
<div class="status-label">蓝环境</div>
<div class="status-version">v{{ blueVersion }}</div>
<div
class="status-item"
:class="{ active: currentEnv === 'blue' }"
>
<div class="status-icon">
🔵
</div>
<div class="status-label">
蓝环境
</div>
<div class="status-version">
v{{ blueVersion }}
</div>
<div class="status-traffic">
{{ currentEnv === 'blue' ? '100%' : '0%' }} 流量
</div>
@@ -20,28 +33,46 @@
<div class="switch-control">
<button
class="switch-btn"
@click="toggleEnvironment"
:disabled="isSwitching"
:class="{ switching: isSwitching }"
@click="toggleEnvironment"
>
<span v-if="!isSwitching">
{{ currentEnv === 'blue' ? '切换到绿环境 ' : ' 切换到蓝环境' }}
</span>
<span v-else class="switching-text">
<span class="spinner"></span>
<span
v-else
class="switching-text"
>
<span class="spinner" />
切换中...
</span>
</button>
<div class="progress-bar" v-if="isSwitching">
<div class="progress-fill" :style="{ width: switchProgress + '%' }"></div>
<div
v-if="isSwitching"
class="progress-bar"
>
<div
class="progress-fill"
:style="{ width: switchProgress + '%' }"
/>
</div>
</div>
<div class="status-item" :class="{ active: currentEnv === 'green' }">
<div class="status-icon">🟢</div>
<div class="status-label">绿环境</div>
<div class="status-version">v{{ greenVersion }}</div>
<div
class="status-item"
:class="{ active: currentEnv === 'green' }"
>
<div class="status-icon">
🟢
</div>
<div class="status-label">
绿环境
</div>
<div class="status-version">
v{{ greenVersion }}
</div>
<div class="status-traffic">
{{ currentEnv === 'green' ? '100%' : '0%' }} 流量
</div>
@@ -52,24 +83,40 @@
<!-- 架构可视化 -->
<div class="architecture-view">
<div class="layer users">
<div class="layer-title">用户流量</div>
<div class="layer-title">
用户流量
</div>
<div class="users-row">
<div v-for="i in 5" :key="i" class="user-avatar" :class="{ active: isUserActive(i) }">
<div
v-for="i in 5"
:key="i"
class="user-avatar"
:class="{ active: isUserActive(i) }"
>
👤
</div>
</div>
</div>
<div class="arrow-down"></div>
<div class="arrow-down">
</div>
<div class="layer load-balancer">
<div class="lb-box">
<div class="lb-icon"></div>
<div class="lb-icon">
</div>
<div class="lb-info">
<div class="lb-title">负载均衡器</div>
<div class="lb-title">
负载均衡器
</div>
<div class="lb-status">
当前指向:
<span class="env-badge" :class="currentEnv">
<span
class="env-badge"
:class="currentEnv"
>
{{ currentEnv === 'blue' ? '🔵 蓝环境' : '🟢 绿环境' }}
</span>
</div>
@@ -77,12 +124,17 @@
</div>
</div>
<div class="arrow-down"></div>
<div class="arrow-down">
</div>
<div class="layer environments">
<div class="env-row">
<!-- 蓝环境 -->
<div class="env-box" :class="{ active: currentEnv === 'blue', standby: currentEnv === 'green' }">
<div
class="env-box"
:class="{ active: currentEnv === 'blue', standby: currentEnv === 'green' }"
>
<div class="env-header">
<span class="env-icon">🔵</span>
<span class="env-name">蓝环境</span>
@@ -90,10 +142,18 @@
</div>
<div class="env-content">
<div class="server-list">
<div v-for="i in 3" :key="i" class="server-item" :class="{ busy: isServerBusy('blue', i) }">
<div
v-for="i in 3"
:key="i"
class="server-item"
:class="{ busy: isServerBusy('blue', i) }"
>
<span class="server-icon">🖥</span>
<span class="server-name">B{{ i }}</span>
<span class="server-status" :class="getServerStatus('blue', i)">
<span
class="server-status"
:class="getServerStatus('blue', i)"
>
{{ getServerStatus('blue', i) === 'healthy' ? '●' : '○' }}
</span>
</div>
@@ -102,18 +162,27 @@
<div class="env-footer">
<div class="traffic-indicator">
<span class="indicator-label">流量:</span>
<span class="indicator-value" :class="{ active: currentEnv === 'blue' }">
<span
class="indicator-value"
:class="{ active: currentEnv === 'blue' }"
>
{{ currentEnv === 'blue' ? '100%' : '0%' }}
</span>
</div>
<div class="status-badge" :class="currentEnv === 'blue' ? 'active' : 'standby'">
<div
class="status-badge"
:class="currentEnv === 'blue' ? 'active' : 'standby'"
>
{{ currentEnv === 'blue' ? '生产环境' : '待命' }}
</div>
</div>
</div>
<!-- 绿环境 -->
<div class="env-box" :class="{ active: currentEnv === 'green', standby: currentEnv === 'blue' }">
<div
class="env-box"
:class="{ active: currentEnv === 'green', standby: currentEnv === 'blue' }"
>
<div class="env-header">
<span class="env-icon">🟢</span>
<span class="env-name">绿环境</span>
@@ -121,10 +190,18 @@
</div>
<div class="env-content">
<div class="server-list">
<div v-for="i in 3" :key="i" class="server-item" :class="{ busy: isServerBusy('green', i) }">
<div
v-for="i in 3"
:key="i"
class="server-item"
:class="{ busy: isServerBusy('green', i) }"
>
<span class="server-icon">🖥</span>
<span class="server-name">G{{ i }}</span>
<span class="server-status" :class="getServerStatus('green', i)">
<span
class="server-status"
:class="getServerStatus('green', i)"
>
{{ getServerStatus('green', i) === 'healthy' ? '●' : '○' }}
</span>
</div>
@@ -133,11 +210,17 @@
<div class="env-footer">
<div class="traffic-indicator">
<span class="indicator-label">流量:</span>
<span class="indicator-value" :class="{ active: currentEnv === 'green' }">
<span
class="indicator-value"
:class="{ active: currentEnv === 'green' }"
>
{{ currentEnv === 'green' ? '100%' : '0%' }}
</span>
</div>
<div class="status-badge" :class="currentEnv === 'green' ? 'active' : 'standby'">
<div
class="status-badge"
:class="currentEnv === 'green' ? 'active' : 'standby'"
>
{{ currentEnv === 'green' ? '生产环境' : '待命' }}
</div>
</div>
@@ -148,37 +231,81 @@
<!-- 部署流程说明 -->
<div class="deployment-process">
<div class="process-title">蓝绿部署流程</div>
<div class="process-title">
蓝绿部署流程
</div>
<div class="process-steps">
<div class="step" :class="{ active: deploymentStep >= 1 }">
<div class="step-number">1</div>
<div
class="step"
:class="{ active: deploymentStep >= 1 }"
>
<div class="step-number">
1
</div>
<div class="step-content">
<div class="step-title">绿环境部署</div>
<div class="step-desc">在绿环境部署新版本进行冒烟测试</div>
<div class="step-title">
绿环境部署
</div>
<div class="step-desc">
在绿环境部署新版本进行冒烟测试
</div>
</div>
</div>
<div class="step-arrow"></div>
<div class="step" :class="{ active: deploymentStep >= 2 }">
<div class="step-number">2</div>
<div class="step-arrow">
</div>
<div
class="step"
:class="{ active: deploymentStep >= 2 }"
>
<div class="step-number">
2
</div>
<div class="step-content">
<div class="step-title">切换流量</div>
<div class="step-desc">将负载均衡器指向绿环境流量瞬间切换</div>
<div class="step-title">
切换流量
</div>
<div class="step-desc">
将负载均衡器指向绿环境流量瞬间切换
</div>
</div>
</div>
<div class="step-arrow"></div>
<div class="step" :class="{ active: deploymentStep >= 3 }">
<div class="step-number">3</div>
<div class="step-arrow">
</div>
<div
class="step"
:class="{ active: deploymentStep >= 3 }"
>
<div class="step-number">
3
</div>
<div class="step-content">
<div class="step-title">监控观察</div>
<div class="step-desc">观察绿环境运行状态确认无异常</div>
<div class="step-title">
监控观察
</div>
<div class="step-desc">
观察绿环境运行状态确认无异常
</div>
</div>
</div>
<div class="step-arrow"></div>
<div class="step" :class="{ active: deploymentStep >= 4 }">
<div class="step-number">4</div>
<div class="step-arrow">
</div>
<div
class="step"
:class="{ active: deploymentStep >= 4 }"
>
<div class="step-number">
4
</div>
<div class="step-content">
<div class="step-title">蓝环境升级</div>
<div class="step-desc">在蓝环境部署新版本为下次切换做准备</div>
<div class="step-title">
蓝环境升级
</div>
<div class="step-desc">
在蓝环境部署新版本为下次切换做准备
</div>
</div>
</div>
</div>
@@ -186,7 +313,9 @@
<!-- 优缺点分析 -->
<div class="pros-cons-analysis">
<div class="analysis-title">蓝绿部署优缺点</div>
<div class="analysis-title">
蓝绿部署优缺点
</div>
<div class="analysis-grid">
<div class="analysis-card pros">
<div class="card-header">
@@ -1,8 +1,12 @@
<template>
<div class="canary-release-demo">
<div class="header">
<div class="title">金丝雀发布</div>
<div class="subtitle">灰度发布策略小流量先行验证新版本</div>
<div class="title">
金丝雀发布
</div>
<div class="subtitle">
灰度发布策略小流量先行验证新版本
</div>
</div>
<!-- 流量分配控制 -->
@@ -15,24 +19,24 @@
<div class="slider-container">
<div class="version-labels">
<span class="version-label stable">
<span class="dot blue"></span>
<span class="dot blue" />
稳定版 v{{ stableVersion }}
</span>
<span class="percentage stable">{{ 100 - canaryPercentage }}%</span>
</div>
<input
type="range"
v-model.number="canaryPercentage"
type="range"
min="0"
max="100"
step="5"
class="traffic-slider"
/>
>
<div class="version-labels">
<span class="version-label canary">
<span class="dot yellow"></span>
<span class="dot yellow" />
金丝雀 v{{ canaryVersion }}
</span>
<span class="percentage canary">{{ canaryPercentage }}%</span>
@@ -66,7 +70,9 @@
<div class="traffic-pipeline">
<div class="pipeline-stage">
<div class="stage-label">用户请求</div>
<div class="stage-label">
用户请求
</div>
<div class="request-bubbles">
<div
v-for="(req, index) in requestQueue"
@@ -80,12 +86,18 @@
</div>
</div>
<div class="pipeline-arrow"></div>
<div class="pipeline-arrow">
</div>
<div class="pipeline-stage">
<div class="stage-label">负载均衡器</div>
<div class="stage-label">
负载均衡器
</div>
<div class="lb-diagram">
<div class="lb-icon"></div>
<div class="lb-icon">
</div>
<div class="routing-logic">
<div class="logic-line">
<span class="logic-label">Canary:</span>
@@ -95,13 +107,19 @@
</div>
</div>
<div class="pipeline-arrow"></div>
<div class="pipeline-arrow">
</div>
<div class="pipeline-stage">
<div class="stage-label">后端服务</div>
<div class="stage-label">
后端服务
</div>
<div class="backend-pods">
<div class="pod-group stable">
<div class="pod-label">稳定版 v{{ stableVersion }}</div>
<div class="pod-label">
稳定版 v{{ stableVersion }}
</div>
<div class="pods-row">
<div
v-for="i in 3"
@@ -115,7 +133,9 @@
</div>
</div>
<div class="pod-group canary">
<div class="pod-label">金丝雀 v{{ canaryVersion }}</div>
<div class="pod-label">
金丝雀 v{{ canaryVersion }}
</div>
<div class="pods-row">
<div
v-for="i in 2"
@@ -135,7 +155,9 @@
<!-- 金丝雀发布策略 -->
<div class="canary-strategy">
<div class="strategy-title">金丝雀发布最佳实践</div>
<div class="strategy-title">
金丝雀发布最佳实践
</div>
<div class="strategy-grid">
<div class="strategy-card">
@@ -1,8 +1,12 @@
<template>
<div class="health-check-demo">
<div class="header">
<div class="title">健康检查机制</div>
<div class="subtitle">主动探测被动感知与智能阈值</div>
<div class="title">
健康检查机制
</div>
<div class="subtitle">
主动探测被动感知与智能阈值
</div>
</div>
<!-- 模式选择器 -->
@@ -23,9 +27,15 @@
<div class="visualization-area">
<!-- 负载均衡器 -->
<div class="lb-node">
<div class="lb-icon"></div>
<div class="lb-label">负载均衡器</div>
<div class="lb-status">{{ currentModeData.label }}</div>
<div class="lb-icon">
</div>
<div class="lb-label">
负载均衡器
</div>
<div class="lb-status">
{{ currentModeData.label }}
</div>
</div>
<!-- 连接线和健康检查标记 -->
@@ -40,7 +50,12 @@
checking: server.status === 'checking'
}"
>
<div class="health-packet" v-if="server.showPacket">{{ server.packetType }}</div>
<div
v-if="server.showPacket"
class="health-packet"
>
{{ server.packetType }}
</div>
<div class="health-indicator">
<span v-if="server.status === 'healthy'"></span>
<span v-else-if="server.status === 'unhealthy'"></span>
@@ -62,28 +77,55 @@
}"
>
<div class="server-header">
<div class="server-icon">🖥</div>
<div class="server-info">
<div class="server-name">Server {{ index + 1 }}</div>
<div class="server-ip">{{ server.ip }}</div>
<div class="server-icon">
🖥
</div>
<div class="status-badge" :class="server.status">
<div class="server-info">
<div class="server-name">
Server {{ index + 1 }}
</div>
<div class="server-ip">
{{ server.ip }}
</div>
</div>
<div
class="status-badge"
:class="server.status"
>
{{ server.status === 'healthy' ? '健康' : server.status === 'unhealthy' ? '故障' : '检查中' }}
</div>
</div>
<div class="server-metrics">
<div class="metric">
<div class="metric-label">响应时间</div>
<div class="metric-value" :class="{ warning: server.responseTime > 100 }">{{ server.responseTime }}ms</div>
<div class="metric-label">
响应时间
</div>
<div
class="metric-value"
:class="{ warning: server.responseTime > 100 }"
>
{{ server.responseTime }}ms
</div>
</div>
<div class="metric">
<div class="metric-label">失败率</div>
<div class="metric-value" :class="{ danger: server.errorRate > 5 }">{{ server.errorRate }}%</div>
<div class="metric-label">
失败率
</div>
<div
class="metric-value"
:class="{ danger: server.errorRate > 5 }"
>
{{ server.errorRate }}%
</div>
</div>
<div class="metric">
<div class="metric-label">连续成功</div>
<div class="metric-value">{{ server.consecutiveSuccess }}/3</div>
<div class="metric-label">
连续成功
</div>
<div class="metric-value">
{{ server.consecutiveSuccess }}/3
</div>
</div>
</div>
</div>
@@ -98,34 +140,58 @@
<span class="card-title">{{ currentModeData.name }}</span>
</div>
<div class="card-body">
<p class="description">{{ currentModeData.description }}</p>
<p class="description">
{{ currentModeData.description }}
</p>
<div class="config-section">
<div class="section-title">关键配置参数</div>
<div class="section-title">
关键配置参数
</div>
<div class="config-grid">
<div
v-for="param in currentModeData.params"
:key="param.name"
class="config-item"
>
<div class="config-name">{{ param.name }}</div>
<div class="config-value">{{ param.value }}</div>
<div class="config-desc">{{ param.desc }}</div>
<div class="config-name">
{{ param.name }}
</div>
<div class="config-value">
{{ param.value }}
</div>
<div class="config-desc">
{{ param.desc }}
</div>
</div>
</div>
</div>
<div class="pros-cons">
<div class="pros">
<div class="pros-cons-title"> 优点</div>
<div class="pros-cons-title">
优点
</div>
<ul>
<li v-for="pro in currentModeData.pros" :key="pro">{{ pro }}</li>
<li
v-for="pro in currentModeData.pros"
:key="pro"
>
{{ pro }}
</li>
</ul>
</div>
<div class="cons">
<div class="pros-cons-title"> 缺点</div>
<div class="pros-cons-title">
缺点
</div>
<ul>
<li v-for="con in currentModeData.cons" :key="con">{{ con }}</li>
<li
v-for="con in currentModeData.cons"
:key="con"
>
{{ con }}
</li>
</ul>
</div>
</div>
@@ -1,8 +1,12 @@
<template>
<div class="load-balancer-types-demo">
<div class="header">
<div class="title">负载均衡器类型</div>
<div class="subtitle">从四层到七层从硬件到软件的演进</div>
<div class="title">
负载均衡器类型
</div>
<div class="subtitle">
从四层到七层从硬件到软件的演进
</div>
</div>
<!-- 层级选择器 -->
@@ -29,17 +33,28 @@
</div>
<div class="panel-content">
<div class="single-server">
<div class="server-icon">🖥</div>
<div class="server-label">Web Server</div>
<div class="server-load">
<div class="load-bar" :style="{ width: '95%' }"></div>
<div class="server-icon">
🖥
</div>
<div class="server-label">
Web Server
</div>
<div class="server-load">
<div
class="load-bar"
:style="{ width: '95%' }"
/>
</div>
<div class="load-text">
负载: 95% 🔥
</div>
<div class="load-text">负载: 95% 🔥</div>
</div>
</div>
</div>
<div class="comparison-arrow"></div>
<div class="comparison-arrow">
</div>
<div class="comparison-panel highlighted">
<div class="panel-header">
@@ -60,10 +75,17 @@
class="server-node"
:class="{ active: activeServer === index }"
>
<div class="server-icon-small">🖥</div>
<div class="server-id">S{{ index + 1 }}</div>
<div class="server-icon-small">
🖥
</div>
<div class="server-id">
S{{ index + 1 }}
</div>
<div class="server-load-mini">
<div class="load-bar-mini" :style="{ width: server.load + '%' }"></div>
<div
class="load-bar-mini"
:style="{ width: server.load + '%' }"
/>
</div>
</div>
</div>
@@ -79,21 +101,38 @@
</div>
<div class="detail-content">
<div class="detail-section">
<div class="section-title">工作原理</div>
<p class="section-desc">{{ currentLayerData.principle }}</p>
<div class="section-title">
工作原理
</div>
<p class="section-desc">
{{ currentLayerData.principle }}
</p>
</div>
<div class="detail-section">
<div class="section-title">典型产品</div>
<div class="section-title">
典型产品
</div>
<div class="product-tags">
<span v-for="product in currentLayerData.products" :key="product" class="product-tag">
<span
v-for="product in currentLayerData.products"
:key="product"
class="product-tag"
>
{{ product }}
</span>
</div>
</div>
<div class="detail-section">
<div class="section-title">适用场景</div>
<div class="section-title">
适用场景
</div>
<ul class="scenario-list">
<li v-for="scenario in currentLayerData.scenarios" :key="scenario">{{ scenario }}</li>
<li
v-for="scenario in currentLayerData.scenarios"
:key="scenario"
>
{{ scenario }}
</li>
</ul>
</div>
</div>
@@ -101,14 +140,26 @@
<!-- 性能对比 -->
<div class="performance-comparison">
<div class="comparison-title">性能对比一览</div>
<div class="comparison-title">
性能对比一览
</div>
<div class="comparison-table">
<div class="table-header">
<div class="th">类型</div>
<div class="th">处理层</div>
<div class="th">性能</div>
<div class="th">灵活性</div>
<div class="th">成本</div>
<div class="th">
类型
</div>
<div class="th">
处理层
</div>
<div class="th">
性能
</div>
<div class="th">
灵活性
</div>
<div class="th">
成本
</div>
</div>
<div
v-for="row in comparisonData"
@@ -116,19 +167,31 @@
class="table-row"
:class="{ active: currentLayer === row.key }"
>
<div class="td type">{{ row.type }}</div>
<div class="td">{{ row.layer }}</div>
<div class="td type">
{{ row.type }}
</div>
<div class="td">
{{ row.layer }}
</div>
<div class="td">
<div class="rating-bar">
<div class="rating-fill" :style="{ width: row.performance + '%' }"></div>
<div
class="rating-fill"
:style="{ width: row.performance + '%' }"
/>
</div>
</div>
<div class="td">
<div class="rating-bar">
<div class="rating-fill" :style="{ width: row.flexibility + '%' }"></div>
<div
class="rating-fill"
:style="{ width: row.flexibility + '%' }"
/>
</div>
</div>
<div class="td cost">{{ row.cost }}</div>
<div class="td cost">
{{ row.cost }}
</div>
</div>
</div>
</div>
@@ -1,8 +1,12 @@
<template>
<div class="multi-region-demo">
<div class="header">
<div class="title">多区域部署</div>
<div class="subtitle">异地多活架构就近服务与容灾备份</div>
<div class="title">
多区域部署
</div>
<div class="subtitle">
异地多活架构就近服务与容灾备份
</div>
</div>
<!-- 全球地图 -->
@@ -11,11 +15,11 @@
<span class="map-title">全球部署视图</span>
<span class="map-legend">
<span class="legend-item">
<span class="legend-dot active"></span>
<span class="legend-dot active" />
主节点
</span>
<span class="legend-item">
<span class="legend-dot standby"></span>
<span class="legend-dot standby" />
备节点
</span>
</span>
@@ -38,9 +42,15 @@
:style="{ top: region.y + '%', left: region.x + '%' }"
@click="selectedRegion = region.id"
>
<div class="node-icon">{{ region.isPrimary ? '📡' : '📶' }}</div>
<div class="node-label">{{ region.name }}</div>
<div class="node-delay">{{ region.delay }}ms</div>
<div class="node-icon">
{{ region.isPrimary ? '📡' : '📶' }}
</div>
<div class="node-label">
{{ region.name }}
</div>
<div class="node-delay">
{{ region.delay }}ms
</div>
</div>
</div>
@@ -58,9 +68,15 @@
:style="{ top: region.y + '%', left: region.x + '%' }"
@click="selectedRegion = region.id"
>
<div class="node-icon">{{ region.isPrimary ? '📡' : '📶' }}</div>
<div class="node-label">{{ region.name }}</div>
<div class="node-delay">{{ region.delay }}ms</div>
<div class="node-icon">
{{ region.isPrimary ? '📡' : '📶' }}
</div>
<div class="node-label">
{{ region.name }}
</div>
<div class="node-delay">
{{ region.delay }}ms
</div>
</div>
</div>
@@ -78,18 +94,38 @@
:style="{ top: region.y + '%', left: region.x + '%' }"
@click="selectedRegion = region.id"
>
<div class="node-icon">{{ region.isPrimary ? '📡' : '📶' }}</div>
<div class="node-label">{{ region.name }}</div>
<div class="node-delay">{{ region.delay }}ms</div>
<div class="node-icon">
{{ region.isPrimary ? '📡' : '📶' }}
</div>
<div class="node-label">
{{ region.name }}
</div>
<div class="node-delay">
{{ region.delay }}ms
</div>
</div>
</div>
</div>
<!-- 连接线路 -->
<svg class="connection-lines" viewBox="0 0 100 100" preserveAspectRatio="none">
<svg
class="connection-lines"
viewBox="0 0 100 100"
preserveAspectRatio="none"
>
<defs>
<marker id="arrowhead" markerWidth="3" markerHeight="3" refX="2" refY="1.5" orient="auto">
<polygon points="0 0, 3 1.5, 0 3" fill="var(--vp-c-brand)" />
<marker
id="arrowhead"
markerWidth="3"
markerHeight="3"
refX="2"
refY="1.5"
orient="auto"
>
<polygon
points="0 0, 3 1.5, 0 3"
fill="var(--vp-c-brand)"
/>
</marker>
</defs>
<line
@@ -109,42 +145,75 @@
</div>
<!-- 区域详情 -->
<div class="region-details" v-if="selectedRegionData">
<div
v-if="selectedRegionData"
class="region-details"
>
<div class="details-header">
<div class="region-title">
<span class="region-icon">{{ selectedRegionData.isPrimary ? '📡' : '📶' }}</span>
<span class="region-name">{{ selectedRegionData.name }}</span>
<span class="region-badge" :class="{ primary: selectedRegionData.isPrimary, standby: !selectedRegionData.isPrimary }">
<span
class="region-badge"
:class="{ primary: selectedRegionData.isPrimary, standby: !selectedRegionData.isPrimary }"
>
{{ selectedRegionData.isPrimary ? '主节点' : '备节点' }}
</span>
</div>
<button class="close-btn" @click="selectedRegion = null">×</button>
<button
class="close-btn"
@click="selectedRegion = null"
>
×
</button>
</div>
<div class="details-grid">
<div class="detail-item">
<div class="detail-label">延迟</div>
<div class="detail-value">{{ selectedRegionData.delay }}ms</div>
<div class="detail-label">
延迟
</div>
<div class="detail-value">
{{ selectedRegionData.delay }}ms
</div>
</div>
<div class="detail-item">
<div class="detail-label">在线实例</div>
<div class="detail-value">{{ selectedRegionData.instances }}</div>
<div class="detail-label">
在线实例
</div>
<div class="detail-value">
{{ selectedRegionData.instances }}
</div>
</div>
<div class="detail-item">
<div class="detail-label">当前QPS</div>
<div class="detail-value">{{ selectedRegionData.qps }}/s</div>
<div class="detail-label">
当前QPS
</div>
<div class="detail-value">
{{ selectedRegionData.qps }}/s
</div>
</div>
<div class="detail-item">
<div class="detail-label">数据同步延迟</div>
<div class="detail-value">{{ selectedRegionData.syncDelay }}ms</div>
<div class="detail-label">
数据同步延迟
</div>
<div class="detail-value">
{{ selectedRegionData.syncDelay }}ms
</div>
</div>
</div>
<div class="details-actions">
<button class="action-btn primary" v-if="!selectedRegionData.isPrimary">
<button
v-if="!selectedRegionData.isPrimary"
class="action-btn primary"
>
提升为主节点
</button>
<button class="action-btn danger" v-if="selectedRegionData.isPrimary">
<button
v-if="selectedRegionData.isPrimary"
class="action-btn danger"
>
切换流量
</button>
<button class="action-btn">
@@ -155,27 +224,53 @@
<!-- 架构优势 -->
<div class="architecture-benefits">
<div class="benefits-title">多区域部署优势</div>
<div class="benefits-title">
多区域部署优势
</div>
<div class="benefits-grid">
<div class="benefit-card">
<div class="benefit-icon"></div>
<div class="benefit-title">就近服务</div>
<div class="benefit-desc">用户请求自动路由到最近的区域降低网络延迟提升访问速度</div>
<div class="benefit-icon">
</div>
<div class="benefit-title">
就近服务
</div>
<div class="benefit-desc">
用户请求自动路由到最近的区域降低网络延迟提升访问速度
</div>
</div>
<div class="benefit-card">
<div class="benefit-icon">🛡</div>
<div class="benefit-title">容灾备份</div>
<div class="benefit-desc">单区域故障时自动切换流量确保服务高可用数据多副本保存</div>
<div class="benefit-icon">
🛡
</div>
<div class="benefit-title">
容灾备份
</div>
<div class="benefit-desc">
单区域故障时自动切换流量确保服务高可用数据多副本保存
</div>
</div>
<div class="benefit-card">
<div class="benefit-icon">🌍</div>
<div class="benefit-title">全球覆盖</div>
<div class="benefit-desc">支持跨区域部署满足不同地区的合规要求和数据主权法规</div>
<div class="benefit-icon">
🌍
</div>
<div class="benefit-title">
全球覆盖
</div>
<div class="benefit-desc">
支持跨区域部署满足不同地区的合规要求和数据主权法规
</div>
</div>
<div class="benefit-card">
<div class="benefit-icon">📈</div>
<div class="benefit-title">负载均衡</div>
<div class="benefit-desc">跨区域流量调度避免单点过载实现全局资源优化配置</div>
<div class="benefit-icon">
📈
</div>
<div class="benefit-title">
负载均衡
</div>
<div class="benefit-desc">
跨区域流量调度避免单点过载实现全局资源优化配置
</div>
</div>
</div>
</div>
@@ -1,13 +1,19 @@
<template>
<div class="session-persistence-demo">
<div class="header">
<div class="title">会话保持机制</div>
<div class="subtitle">CookieIP哈希与粘性会话的技术对比</div>
<div class="title">
会话保持机制
</div>
<div class="subtitle">
CookieIP哈希与粘性会话的技术对比
</div>
</div>
<!-- 场景选择 -->
<div class="scenario-selector">
<div class="scenario-label">应用场景</div>
<div class="scenario-label">
应用场景
</div>
<div class="scenario-buttons">
<button
v-for="scenario in scenarios"
@@ -48,9 +54,18 @@
:class="{ active: activeUser === user.id }"
@click="activeUser = user.id"
>
<div class="avatar-icon">{{ user.avatar }}</div>
<div class="user-name">{{ user.name }}</div>
<div v-if="hasSessionCookie" class="cookie-badge">🍪</div>
<div class="avatar-icon">
{{ user.avatar }}
</div>
<div class="user-name">
{{ user.name }}
</div>
<div
v-if="hasSessionCookie"
class="cookie-badge"
>
🍪
</div>
</div>
</div>
</div>
@@ -58,8 +73,12 @@
<!-- 请求流程 -->
<div class="request-flow">
<div class="flow-step">
<div class="step-label">请求</div>
<div class="step-arrow"></div>
<div class="step-label">
请求
</div>
<div class="step-arrow">
</div>
</div>
<!-- 负载均衡器 -->
@@ -72,16 +91,29 @@
<div class="mechanism-display">
<span class="display-icon">{{ currentMechanismData.icon }}</span>
<div class="display-info">
<div class="display-name">{{ currentMechanismData.name }}</div>
<div class="display-desc">{{ currentMechanismData.shortDesc }}</div>
<div class="display-name">
{{ currentMechanismData.name }}
</div>
<div class="display-desc">
{{ currentMechanismData.shortDesc }}
</div>
</div>
</div>
</div>
<!-- 会话表 -->
<div v-if="currentMechanism === 'cookie' || currentMechanism === 'sticky'" class="session-table">
<div class="table-title">会话映射表</div>
<div
v-if="currentMechanism === 'cookie' || currentMechanism === 'sticky'"
class="session-table"
>
<div class="table-title">
会话映射表
</div>
<div class="table-rows">
<div v-for="mapping in sessionMappings" :key="mapping.session" class="table-row">
<div
v-for="mapping in sessionMappings"
:key="mapping.session"
class="table-row"
>
<span class="session-id">{{ mapping.session }}</span>
<span class="mapping-arrow"></span>
<span class="server-name">{{ mapping.server }}</span>
@@ -89,8 +121,13 @@
</div>
</div>
<!-- IP哈希环 -->
<div v-if="currentMechanism === 'iphash'" class="hash-ring">
<div class="ring-title">IP哈希环</div>
<div
v-if="currentMechanism === 'iphash'"
class="hash-ring"
>
<div class="ring-title">
IP哈希环
</div>
<div class="ring-visual">
<div
v-for="(server, index) in hashRingServers"
@@ -109,7 +146,9 @@
</div>
<div class="flow-step">
<div class="step-arrow"></div>
<div class="step-arrow">
</div>
</div>
<!-- 后端服务器 -->
@@ -120,15 +159,27 @@
class="backend-server"
:class="{ target: isTargetServer(server.id) }"
>
<div class="server-icon">🖥</div>
<div class="server-info">
<div class="server-name">{{ server.name }}</div>
<div class="server-ip">{{ server.ip }}</div>
<div class="server-icon">
🖥
</div>
<div class="server-status" :class="server.status">
<div class="server-info">
<div class="server-name">
{{ server.name }}
</div>
<div class="server-ip">
{{ server.ip }}
</div>
</div>
<div
class="server-status"
:class="server.status"
>
{{ server.status === 'healthy' ? '✓' : '✗' }}
</div>
<div v-if="isTargetServer(server.id)" class="selected-indicator">
<div
v-if="isTargetServer(server.id)"
class="selected-indicator"
>
选中
</div>
</div>
@@ -136,9 +187,14 @@
</div>
<!-- 响应流程 -->
<div class="response-flow" v-if="currentMechanism === 'cookie'">
<div
v-if="currentMechanism === 'cookie'"
class="response-flow"
>
<div class="flow-step">
<div class="step-arrow"></div>
<div class="step-arrow">
</div>
</div>
<div class="set-cookie-box">
<div class="cookie-header">
@@ -154,7 +210,9 @@
<!-- 机制对比表 -->
<div class="mechanism-comparison">
<div class="comparison-title">三种会话保持机制对比</div>
<div class="comparison-title">
三种会话保持机制对比
</div>
<div class="comparison-grid">
<div class="comparison-card">
<div class="card-header">
@@ -1,13 +1,19 @@
<template>
<div class="weighted-routing-demo">
<div class="header">
<div class="title">加权路由策略</div>
<div class="subtitle">按性能成本地理位置智能分配流量</div>
<div class="title">
加权路由策略
</div>
<div class="subtitle">
按性能成本地理位置智能分配流量
</div>
</div>
<!-- 策略选择器 -->
<div class="strategy-selector">
<div class="strategy-label">加权策略</div>
<div class="strategy-label">
加权策略
</div>
<div class="strategy-buttons">
<button
v-for="strategy in strategies"
@@ -26,16 +32,20 @@
<div class="visualization">
<!-- 流量进入 -->
<div class="traffic-incoming">
<div class="traffic-label">总流量</div>
<div class="traffic-value">{{ totalTraffic }} req/s</div>
<div class="traffic-label">
总流量
</div>
<div class="traffic-value">
{{ totalTraffic }} req/s
</div>
<div class="traffic-slider">
<input
type="range"
v-model.number="totalTraffic"
type="range"
min="100"
max="10000"
step="100"
/>
>
<div class="slider-labels">
<span>100</span>
<span>5000</span>
@@ -46,7 +56,9 @@
<!-- 权重分配可视化 -->
<div class="weight-allocation">
<div class="allocation-title">权重分配</div>
<div class="allocation-title">
权重分配
</div>
<div class="allocation-bars">
<div
v-for="(server, index) in weightedServers"
@@ -54,10 +66,16 @@
class="allocation-item"
>
<div class="server-info">
<div class="server-icon">🖥</div>
<div class="server-icon">
🖥
</div>
<div class="server-details">
<div class="server-name">{{ server.name }}</div>
<div class="server-specs">{{ server.specs }}</div>
<div class="server-name">
{{ server.name }}
</div>
<div class="server-specs">
{{ server.specs }}
</div>
</div>
</div>
<div class="weight-bar-container">
@@ -76,13 +94,13 @@
</div>
<div class="weight-control">
<input
type="range"
v-model.number="server.weight"
type="range"
min="1"
max="10"
step="1"
class="weight-slider"
/>
>
<span class="weight-label">权重: {{ server.weight }}</span>
</div>
</div>
@@ -91,7 +109,9 @@
<!-- 实时流量动画 -->
<div class="traffic-animation">
<div class="animation-title">实时流量</div>
<div class="animation-title">
实时流量
</div>
<div class="traffic-flows">
<div
v-for="(flow, index) in trafficFlows"
@@ -99,7 +119,10 @@
class="flow-item"
:style="{ animationDelay: flow.delay + 's' }"
>
<div class="flow-packet" :style="{ background: flow.color }"></div>
<div
class="flow-packet"
:style="{ background: flow.color }"
/>
</div>
</div>
<div class="server-indicators">
@@ -117,7 +140,9 @@
<!-- 策略详情对比 -->
<div class="strategy-comparison">
<div class="comparison-title">加权策略对比</div>
<div class="comparison-title">
加权策略对比
</div>
<div class="comparison-grid">
<div
v-for="strategy in strategies"
@@ -130,11 +155,20 @@
<span class="card-name">{{ strategy.name }}</span>
</div>
<div class="card-body">
<p class="card-desc">{{ strategy.description }}</p>
<p class="card-desc">
{{ strategy.description }}
</p>
<div class="use-cases">
<div class="use-case-title">适用场景</div>
<div class="use-case-title">
适用场景
</div>
<ul>
<li v-for="useCase in strategy.useCases" :key="useCase">{{ useCase }}</li>
<li
v-for="useCase in strategy.useCases"
:key="useCase"
>
{{ useCase }}
</li>
</ul>
</div>
</div>