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
@@ -7,10 +7,16 @@
class="step"
:class="{ active: currentStep >= index, completed: currentStep > index }"
>
<div class="step-num">{{ index + 1 }}</div>
<div class="step-num">
{{ index + 1 }}
</div>
<div class="step-content">
<div class="step-title">{{ step.title }}</div>
<div class="step-desc">{{ step.desc }}</div>
<div class="step-title">
{{ step.title }}
</div>
<div class="step-desc">
{{ step.desc }}
</div>
</div>
</div>
</div>
@@ -18,18 +24,26 @@
<div class="action-panel">
<button
class="action-btn"
@click="nextStep"
:disabled="currentStep >= steps.length"
@click="nextStep"
>
{{ currentStep >= steps.length ? '已完成' : '下一步' }}
</button>
<button class="action-btn outline" @click="reset">
<button
class="action-btn outline"
@click="reset"
>
重置
</button>
</div>
<div v-if="currentStep > 0" class="code-preview">
<div class="code-title">{{ steps[currentStep - 1].codeTitle }}</div>
<div
v-if="currentStep > 0"
class="code-preview"
>
<div class="code-title">
{{ steps[currentStep - 1].codeTitle }}
</div>
<pre><code>{{ steps[currentStep - 1].code }}</code></pre>
</div>
</div>
@@ -2,7 +2,9 @@
<div class="aws-vs-aliyun-demo">
<div class="demo-header">
<h4>AWS vs 阿里云 核心差异</h4>
<p class="demo-desc">点击切换查看不同维度的对比</p>
<p class="demo-desc">
点击切换查看不同维度的对比
</p>
</div>
<div class="comparison-tabs">
@@ -18,13 +20,23 @@
</div>
<div class="comparison-content">
<transition name="fade" mode="out-in">
<div :key="activeTab" class="tab-content">
<transition
name="fade"
mode="out-in"
>
<div
:key="activeTab"
class="tab-content"
>
<div class="vs-cards">
<div class="vs-card aws-card">
<div class="card-header">
<div class="logo">AWS</div>
<div class="subtitle">Amazon Web Services</div>
<div class="logo">
AWS
</div>
<div class="subtitle">
Amazon Web Services
</div>
</div>
<div class="card-body">
<div
@@ -39,13 +51,19 @@
</div>
<div class="vs-divider">
<div class="vs-text">VS</div>
<div class="vs-text">
VS
</div>
</div>
<div class="vs-card aliyun-card">
<div class="card-header">
<div class="logo aliyun-logo">阿里云</div>
<div class="subtitle">Alibaba Cloud</div>
<div class="logo aliyun-logo">
阿里云
</div>
<div class="subtitle">
Alibaba Cloud
</div>
</div>
<div class="card-body">
<div
@@ -61,8 +79,12 @@
</div>
<div class="verdict-box">
<div class="verdict-title">💡 选型建议</div>
<div class="verdict-text">{{ currentComparison.verdict }}</div>
<div class="verdict-title">
💡 选型建议
</div>
<div class="verdict-text">
{{ currentComparison.verdict }}
</div>
</div>
</div>
</transition>
@@ -8,18 +8,31 @@
:class="{ active: selectedEvent === index }"
@click="selectedEvent = index"
>
<div class="timeline-dot"></div>
<div class="timeline-dot" />
<div class="timeline-content">
<div class="timeline-year">{{ event.year }}</div>
<div class="timeline-title">{{ event.title }}</div>
<div class="timeline-year">
{{ event.year }}
</div>
<div class="timeline-title">
{{ event.title }}
</div>
</div>
</div>
</div>
<div v-if="selectedEventData" class="event-detail">
<div class="detail-year">{{ selectedEventData.year }}</div>
<div class="detail-title">{{ selectedEventData.title }}</div>
<div class="detail-desc">{{ selectedEventData.description }}</div>
<div
v-if="selectedEventData"
class="event-detail"
>
<div class="detail-year">
{{ selectedEventData.year }}
</div>
<div class="detail-title">
{{ selectedEventData.title }}
</div>
<div class="detail-desc">
{{ selectedEventData.description }}
</div>
<div class="detail-impact">
<span class="impact-label">影响:</span>
<span class="impact-text">{{ selectedEventData.impact }}</span>
@@ -2,7 +2,9 @@
<div class="cloud-services-map-demo">
<div class="demo-header">
<h4>云计算服务版图全景图</h4>
<p class="demo-desc">点击各个板块查看 AWS 与阿里云的对应服务</p>
<p class="demo-desc">
点击各个板块查看 AWS 与阿里云的对应服务
</p>
</div>
<div class="map-container">
@@ -12,8 +14,12 @@
:class="{ active: activeLayer === 'compute' }"
@click="setActiveLayer('compute')"
>
<div class="layer-icon"></div>
<div class="layer-title">计算服务</div>
<div class="layer-icon">
</div>
<div class="layer-title">
计算服务
</div>
<div class="layer-services">
<span class="service-tag">EC2/ECS</span>
<span class="service-tag">Lambda/函数计算</span>
@@ -26,8 +32,12 @@
:class="{ active: activeLayer === 'storage' }"
@click="setActiveLayer('storage')"
>
<div class="layer-icon">💾</div>
<div class="layer-title">存储服务</div>
<div class="layer-icon">
💾
</div>
<div class="layer-title">
存储服务
</div>
<div class="layer-services">
<span class="service-tag">S3/OSS</span>
<span class="service-tag">EBS/云盘</span>
@@ -40,8 +50,12 @@
:class="{ active: activeLayer === 'network' }"
@click="setActiveLayer('network')"
>
<div class="layer-icon">🌐</div>
<div class="layer-title">网络服务</div>
<div class="layer-icon">
🌐
</div>
<div class="layer-title">
网络服务
</div>
<div class="layer-services">
<span class="service-tag">VPC/专有网络</span>
<span class="service-tag">ELB/SLB</span>
@@ -54,8 +68,12 @@
:class="{ active: activeLayer === 'security' }"
@click="setActiveLayer('security')"
>
<div class="layer-icon">🔒</div>
<div class="layer-title">安全服务</div>
<div class="layer-icon">
🔒
</div>
<div class="layer-title">
安全服务
</div>
<div class="layer-services">
<span class="service-tag">IAM/RAM</span>
<span class="service-tag">KMS/密钥管理</span>
@@ -68,8 +86,12 @@
:class="{ active: activeLayer === 'database' }"
@click="setActiveLayer('database')"
>
<div class="layer-icon">🗄</div>
<div class="layer-title">数据库服务</div>
<div class="layer-icon">
🗄
</div>
<div class="layer-title">
数据库服务
</div>
<div class="layer-services">
<span class="service-tag">RDS/PolarDB</span>
<span class="service-tag">DynamoDB/Tablestore</span>
@@ -82,8 +104,12 @@
:class="{ active: activeLayer === 'middleware' }"
@click="setActiveLayer('middleware')"
>
<div class="layer-icon">🔧</div>
<div class="layer-title">中间件服务</div>
<div class="layer-icon">
🔧
</div>
<div class="layer-title">
中间件服务
</div>
<div class="layer-services">
<span class="service-tag">MQ/RocketMQ</span>
<span class="service-tag">ElastiCache/Redis</span>
@@ -92,26 +118,46 @@
</div>
<!-- 详情面板 -->
<div v-if="activeLayer" class="detail-panel">
<div
v-if="activeLayer"
class="detail-panel"
>
<div class="detail-header">
<h5>{{ layerDetails[activeLayer].title }}</h5>
<button class="close-btn" @click="activeLayer = null">×</button>
<button
class="close-btn"
@click="activeLayer = null"
>
×
</button>
</div>
<div class="detail-content">
<div class="comparison-table">
<div class="table-header">
<div class="col aws">AWS</div>
<div class="col aliyun">阿里云</div>
<div class="col desc">功能描述</div>
<div class="col aws">
AWS
</div>
<div class="col aliyun">
阿里云
</div>
<div class="col desc">
功能描述
</div>
</div>
<div
v-for="(item, index) in layerDetails[activeLayer].services"
:key="index"
class="table-row"
>
<div class="col aws">{{ item.aws }}</div>
<div class="col aliyun">{{ item.aliyun }}</div>
<div class="col desc">{{ item.desc }}</div>
<div class="col aws">
{{ item.aws }}
</div>
<div class="col aliyun">
{{ item.aliyun }}
</div>
<div class="col desc">
{{ item.desc }}
</div>
</div>
</div>
</div>
@@ -8,15 +8,28 @@
:class="{ active: selectedService === service.id }"
@click="selectService(service.id)"
>
<div class="service-icon">{{ service.icon }}</div>
<div class="service-name">{{ service.name }}</div>
<div class="service-examples">{{ service.examples }}</div>
<div class="service-icon">
{{ service.icon }}
</div>
<div class="service-name">
{{ service.name }}
</div>
<div class="service-examples">
{{ service.examples }}
</div>
</div>
</div>
<div v-if="selectedServiceData" class="service-detail">
<div class="detail-title">{{ selectedServiceData.name }}</div>
<div class="detail-desc">{{ selectedServiceData.description }}</div>
<div
v-if="selectedServiceData"
class="service-detail"
>
<div class="detail-title">
{{ selectedServiceData.name }}
</div>
<div class="detail-desc">
{{ selectedServiceData.description }}
</div>
<div class="detail-compare">
<div class="compare-item">
<span class="label">AWS:</span>
@@ -43,7 +43,9 @@
</div>
<div class="result-panel">
<div class="result-title">配置结果</div>
<div class="result-title">
配置结果
</div>
<div class="result-grid">
<div class="result-item">
<span class="label">配置</span>
@@ -2,7 +2,9 @@
<div class="compute-services-demo">
<div class="demo-header">
<h4>计算服务选型指南</h4>
<p class="demo-desc">拖动滑块调整场景参数获取最佳计算方案</p>
<p class="demo-desc">
拖动滑块调整场景参数获取最佳计算方案
</p>
</div>
<div class="scenario-sliders">
@@ -13,7 +15,7 @@
type="range"
min="0"
max="100"
/>
>
<div class="slider-labels">
<span>波动大</span>
<span>非常稳定</span>
@@ -27,7 +29,7 @@
type="range"
min="0"
max="100"
/>
>
<div class="slider-labels">
<span>很低</span>
<span>接近100%</span>
@@ -41,7 +43,7 @@
type="range"
min="0"
max="100"
/>
>
<div class="slider-labels">
<span>几分钟</span>
<span>持续运行</span>
@@ -55,7 +57,7 @@
type="range"
min="0"
max="100"
/>
>
<div class="slider-labels">
<span>平稳</span>
<span>大起大落</span>
@@ -76,18 +78,28 @@
class="solution-card"
:class="{ 'top-pick': index === 0 }"
>
<div class="solution-rank" :class="{ 'rank-1': index === 0 }">
<div
class="solution-rank"
:class="{ 'rank-1': index === 0 }"
>
{{ index === 0 ? '👑' : index + 1 }}
</div>
<div class="solution-content">
<div class="solution-name">{{ solution.name }}</div>
<div class="solution-name">
{{ solution.name }}
</div>
<div class="solution-services">
<span class="service-tag aws">{{ solution.aws }}</span>
<span class="vs-mini">vs</span>
<span class="service-tag aliyun">{{ solution.aliyun }}</span>
</div>
<div class="solution-reason">{{ solution.reason }}</div>
<div class="solution-savings" v-if="solution.savings">
<div class="solution-reason">
{{ solution.reason }}
</div>
<div
v-if="solution.savings"
class="solution-savings"
>
💰 预计节省: {{ solution.savings }}
</div>
</div>
@@ -2,7 +2,9 @@
<div class="database-services-demo">
<div class="demo-header">
<h4>数据库选型助手</h4>
<p class="demo-desc">根据您的业务特点推荐最适合的数据库方案</p>
<p class="demo-desc">
根据您的业务特点推荐最适合的数据库方案
</p>
</div>
<div class="db-selection">
@@ -19,7 +21,10 @@
</button>
</div>
<div v-if="selectedCategory" class="db-comparison">
<div
v-if="selectedCategory"
class="db-comparison"
>
<div class="comparison-header">
<span class="aws-badge">AWS</span>
<span class="vs-text">对比</span>
@@ -29,29 +34,45 @@
<div class="db-cards">
<div class="db-card">
<div class="db-header aws">
<div class="db-name">{{ currentCategory.aws }}</div>
<div class="db-name">
{{ currentCategory.aws }}
</div>
</div>
<div class="db-body">
<div class="feature-list">
<div v-for="(feat, i) in currentCategory.awsFeatures" :key="i" class="feature">
<div
v-for="(feat, i) in currentCategory.awsFeatures"
:key="i"
class="feature"
>
{{ feat }}
</div>
</div>
<div class="price-tag">{{ currentCategory.awsPrice }}</div>
<div class="price-tag">
{{ currentCategory.awsPrice }}
</div>
</div>
</div>
<div class="db-card">
<div class="db-header aliyun">
<div class="db-name">{{ currentCategory.aliyun }}</div>
<div class="db-name">
{{ currentCategory.aliyun }}
</div>
</div>
<div class="db-body">
<div class="feature-list">
<div v-for="(feat, i) in currentCategory.aliyunFeatures" :key="i" class="feature">
<div
v-for="(feat, i) in currentCategory.aliyunFeatures"
:key="i"
class="feature"
>
{{ feat }}
</div>
</div>
<div class="price-tag aliyun">{{ currentCategory.aliyunPrice }}</div>
<div class="price-tag aliyun">
{{ currentCategory.aliyunPrice }}
</div>
</div>
</div>
</div>
@@ -8,35 +8,61 @@
:class="{ active: currentStep === index, completed: currentStep > index }"
@click="currentStep = index"
>
<div class="step-number">{{ index + 1 }}</div>
<div class="step-number">
{{ index + 1 }}
</div>
<div class="step-info">
<div class="step-name">{{ step.name }}</div>
<div class="step-time">{{ step.time }}</div>
<div class="step-name">
{{ step.name }}
</div>
<div class="step-time">
{{ step.time }}
</div>
</div>
</div>
</div>
<div v-if="currentStepData" class="step-detail">
<div
v-if="currentStepData"
class="step-detail"
>
<div class="detail-header">
<span class="detail-step">步骤 {{ currentStep + 1 }}</span>
<span class="detail-name">{{ currentStepData.name }}</span>
</div>
<div class="detail-content">
<div class="detail-desc">{{ currentStepData.description }}</div>
<div class="detail-desc">
{{ currentStepData.description }}
</div>
<div class="detail-tasks">
<div class="tasks-title">具体操作</div>
<div class="tasks-title">
具体操作
</div>
<ul>
<li v-for="(task, i) in currentStepData.tasks" :key="i">{{ task }}</li>
<li
v-for="(task, i) in currentStepData.tasks"
:key="i"
>
{{ task }}
</li>
</ul>
</div>
</div>
</div>
<div class="workflow-actions">
<button class="action-btn" @click="prevStep" :disabled="currentStep === 0">
<button
class="action-btn"
:disabled="currentStep === 0"
@click="prevStep"
>
上一步
</button>
<button class="action-btn primary" @click="nextStep" :disabled="currentStep >= steps.length - 1">
<button
class="action-btn primary"
:disabled="currentStep >= steps.length - 1"
@click="nextStep"
>
{{ currentStep >= steps.length - 1 ? '完成' : '下一步' }}
</button>
</div>
@@ -2,66 +2,120 @@
<div class="k8s-services-demo">
<div class="demo-header">
<h4>Kubernetes 服务生态全景</h4>
<p class="demo-desc">探索 AWS 和阿里云上的 K8s 服务及配套生态</p>
<p class="demo-desc">
探索 AWS 和阿里云上的 K8s 服务及配套生态
</p>
</div>
<div class="k8s-architecture">
<div class="arch-layer control-plane">
<div class="layer-title">控制平面</div>
<div class="layer-title">
控制平面
</div>
<div class="layer-content">
<div class="service-box">
<div class="service-name">EKS / ACK</div>
<div class="service-desc">托管 Kubernetes 控制平面</div>
<div class="service-name">
EKS / ACK
</div>
<div class="service-desc">
托管 Kubernetes 控制平面
</div>
</div>
</div>
</div>
<div class="arch-layer worker-nodes">
<div class="layer-title">工作节点</div>
<div class="layer-title">
工作节点
</div>
<div class="layer-content">
<div class="node-types">
<div class="node-box">
<div class="node-icon">💻</div>
<div class="node-name">EC2/ECS</div>
<div class="node-desc">标准计算节点</div>
<div class="node-icon">
💻
</div>
<div class="node-name">
EC2/ECS
</div>
<div class="node-desc">
标准计算节点
</div>
</div>
<div class="node-box">
<div class="node-icon"></div>
<div class="node-name">Fargate/ECI</div>
<div class="node-desc">Serverless 节点</div>
<div class="node-icon">
</div>
<div class="node-name">
Fargate/ECI
</div>
<div class="node-desc">
Serverless 节点
</div>
</div>
<div class="node-box">
<div class="node-icon">🎯</div>
<div class="node-name">Spot/抢占式</div>
<div class="node-desc">低成本竞价节点</div>
<div class="node-icon">
🎯
</div>
<div class="node-name">
Spot/抢占式
</div>
<div class="node-desc">
低成本竞价节点
</div>
</div>
</div>
</div>
</div>
<div class="arch-layer addons">
<div class="layer-title">插件生态</div>
<div class="layer-title">
插件生态
</div>
<div class="layer-content">
<div class="addon-grid">
<div class="addon-card">
<div class="addon-name">Ingress/Nginx</div>
<div class="addon-aws">AWS Load Balancer</div>
<div class="addon-aliyun">ALB Ingress</div>
<div class="addon-name">
Ingress/Nginx
</div>
<div class="addon-aws">
AWS Load Balancer
</div>
<div class="addon-aliyun">
ALB Ingress
</div>
</div>
<div class="addon-card">
<div class="addon-name">Storage</div>
<div class="addon-aws">EBS/EFS CSI</div>
<div class="addon-aliyun">云盘/NAS CSI</div>
<div class="addon-name">
Storage
</div>
<div class="addon-aws">
EBS/EFS CSI
</div>
<div class="addon-aliyun">
云盘/NAS CSI
</div>
</div>
<div class="addon-card">
<div class="addon-name">Monitoring</div>
<div class="addon-aws">CloudWatch/AMP</div>
<div class="addon-aliyun">ARMS/Prometheus</div>
<div class="addon-name">
Monitoring
</div>
<div class="addon-aws">
CloudWatch/AMP
</div>
<div class="addon-aliyun">
ARMS/Prometheus
</div>
</div>
<div class="addon-card">
<div class="addon-name">Service Mesh</div>
<div class="addon-aws">App Mesh</div>
<div class="addon-aliyun">Service Mesh ASM</div>
<div class="addon-name">
Service Mesh
</div>
<div class="addon-aws">
App Mesh
</div>
<div class="addon-aliyun">
Service Mesh ASM
</div>
</div>
</div>
</div>
@@ -2,12 +2,16 @@
<div class="network-services-demo">
<div class="demo-header">
<h4>网络架构可视化配置</h4>
<p class="demo-desc">拖拽组件构建您的云上网络架构</p>
<p class="demo-desc">
拖拽组件构建您的云上网络架构
</p>
</div>
<div class="network-builder">
<div class="components-panel">
<div class="panel-title">可用组件</div>
<div class="panel-title">
可用组件
</div>
<div class="component-list">
<div
v-for="component in networkComponents"
@@ -28,10 +32,19 @@
@drop="onDrop"
@dragover.prevent
>
<div v-if="canvasItems.length === 0" class="empty-state">
<div class="empty-icon">🏗</div>
<div class="empty-text">拖拽左侧组件到此处</div>
<div class="empty-subtext">开始构建您的网络架构</div>
<div
v-if="canvasItems.length === 0"
class="empty-state"
>
<div class="empty-icon">
🏗
</div>
<div class="empty-text">
拖拽左侧组件到此处
</div>
<div class="empty-subtext">
开始构建您的网络架构
</div>
</div>
<div
@@ -42,25 +55,46 @@
:style="itemStyle(index)"
@click="selectItem(item)"
>
<div class="item-icon">{{ item.icon }}</div>
<div class="item-name">{{ item.name }}</div>
<button class="remove-btn" @click.stop="removeItem(index)">×</button>
<div class="item-icon">
{{ item.icon }}
</div>
<div class="item-name">
{{ item.name }}
</div>
<button
class="remove-btn"
@click.stop="removeItem(index)"
>
×
</button>
</div>
</div>
</div>
</div>
<div v-if="selectedItem" class="config-panel">
<div
v-if="selectedItem"
class="config-panel"
>
<div class="config-header">
<span class="config-icon">{{ selectedItem.icon }}</span>
<span class="config-title">{{ selectedItem.name }} 配置</span>
<button class="close-config" @click="selectedItem = null">×</button>
<button
class="close-config"
@click="selectedItem = null"
>
×
</button>
</div>
<div class="config-content">
<div class="config-section">
<div class="section-title">AWS 配置</div>
<div class="service-name">{{ selectedItem.awsService }}</div>
<div class="section-title">
AWS 配置
</div>
<div class="service-name">
{{ selectedItem.awsService }}
</div>
<div class="config-options">
<div
v-for="(option, idx) in selectedItem.awsOptions"
@@ -73,11 +107,15 @@
</div>
</div>
<div class="config-divider"></div>
<div class="config-divider" />
<div class="config-section">
<div class="section-title aliyun-title">阿里云配置</div>
<div class="service-name aliyun-service">{{ selectedItem.aliyunService }}</div>
<div class="section-title aliyun-title">
阿里云配置
</div>
<div class="service-name aliyun-service">
{{ selectedItem.aliyunService }}
</div>
<div class="config-options">
<div
v-for="(option, idx) in selectedItem.aliyunOptions"
@@ -4,38 +4,70 @@
<div class="config-row">
<span class="label">实例规格</span>
<select v-model="config.spec">
<option value="small">1核2G (入门)</option>
<option value="medium">24G (标准)</option>
<option value="large">4核8G (高性能)</option>
<option value="small">
12G (入门)
</option>
<option value="medium">
2核4G (标准)
</option>
<option value="large">
4核8G (高性能)
</option>
</select>
</div>
<div class="config-row">
<span class="label">运行时长</span>
<input type="range" v-model.number="config.hours" min="1" max="24" />
<input
v-model.number="config.hours"
type="range"
min="1"
max="24"
>
<span class="value">{{ config.hours }} 小时/</span>
</div>
<div class="config-row">
<span class="label">运行天数</span>
<input type="range" v-model.number="config.days" min="1" max="31" />
<input
v-model.number="config.days"
type="range"
min="1"
max="31"
>
<span class="value">{{ config.days }} /</span>
</div>
</div>
<div class="result-section">
<div class="result-header">月度成本对比</div>
<div class="result-header">
月度成本对比
</div>
<div class="result-cards">
<div class="result-card">
<div class="model">按需付费</div>
<div class="price">${{ costs.ondemand }}/</div>
<div class="model">
按需付费
</div>
<div class="price">
${{ costs.ondemand }}/
</div>
</div>
<div class="result-card recommended">
<div class="model">预留实例</div>
<div class="price">${{ costs.reserved }}/</div>
<div class="saving"> {{ savings }}%</div>
<div class="model">
预留实例
</div>
<div class="price">
${{ costs.reserved }}/
</div>
<div class="saving">
{{ savings }}%
</div>
</div>
<div class="result-card">
<div class="model">抢占式</div>
<div class="price">${{ costs.spot }}/</div>
<div class="model">
抢占式
</div>
<div class="price">
${{ costs.spot }}/
</div>
</div>
</div>
</div>
@@ -2,7 +2,9 @@
<div class="pricing-model-demo">
<div class="demo-header">
<h4>云服务器计费模式计算器</h4>
<p class="demo-desc">输入您的使用场景对比不同计费模式的成本</p>
<p class="demo-desc">
输入您的使用场景对比不同计费模式的成本
</p>
</div>
<div class="calculator-inputs">
@@ -12,14 +14,23 @@
<div class="input-group">
<label>实例规格</label>
<select v-model="config.instanceType">
<option v-for="type in instanceTypes" :key="type.value" :value="type.value">
<option
v-for="type in instanceTypes"
:key="type.value"
:value="type.value"
>
{{ type.label }}
</option>
</select>
</div>
<div class="input-group">
<label>数量 ()</label>
<input v-model.number="config.quantity" type="number" min="1" max="100" />
<input
v-model.number="config.quantity"
type="number"
min="1"
max="100"
>
</div>
</div>
</div>
@@ -29,12 +40,22 @@
<div class="input-grid">
<div class="input-group">
<label>每日运行时长 (小时)</label>
<input v-model.number="config.dailyHours" type="range" min="1" max="24" />
<input
v-model.number="config.dailyHours"
type="range"
min="1"
max="24"
>
<span class="range-value">{{ config.dailyHours }} 小时</span>
</div>
<div class="input-group">
<label>每月运行天数</label>
<input v-model.number="config.monthlyDays" type="range" min="1" max="31" />
<input
v-model.number="config.monthlyDays"
type="range"
min="1"
max="31"
>
<span class="range-value">{{ config.monthlyDays }} </span>
</div>
</div>
@@ -43,9 +64,17 @@
<div class="input-section">
<h5>计费偏好</h5>
<div class="billing-options">
<label v-for="option in billingOptions" :key="option.value" class="option-card"
:class="{ active: config.billingType === option.value }">
<input type="radio" v-model="config.billingType" :value="option.value" />
<label
v-for="option in billingOptions"
:key="option.value"
class="option-card"
:class="{ active: config.billingType === option.value }"
>
<input
v-model="config.billingType"
type="radio"
:value="option.value"
>
<span class="option-icon">{{ option.icon }}</span>
<span class="option-name">{{ option.label }}</span>
<span class="option-desc">{{ option.desc }}</span>
@@ -57,18 +86,35 @@
<div class="cost-comparison">
<h5>成本对比分析</h5>
<div class="comparison-chart">
<div v-for="model in costComparison" :key="model.type" class="chart-bar"
:class="{ recommended: model.recommended }">
<div class="bar-label">{{ model.label }}</div>
<div
v-for="model in costComparison"
:key="model.type"
class="chart-bar"
:class="{ recommended: model.recommended }"
>
<div class="bar-label">
{{ model.label }}
</div>
<div class="bar-visual">
<div class="bar-fill" :style="{ height: model.percentage + '%' }"
:class="model.type"></div>
<div
class="bar-fill"
:style="{ height: model.percentage + '%' }"
:class="model.type"
/>
</div>
<div class="bar-value">
<span class="amount">{{ model.cost }}</span>
<span v-if="model.savings" class="savings"> {{ model.savings }}</span>
<span
v-if="model.savings"
class="savings"
> {{ model.savings }}</span>
</div>
<div
v-if="model.recommended"
class="recommend-badge"
>
推荐
</div>
<div v-if="model.recommended" class="recommend-badge">推荐</div>
</div>
</div>
</div>
@@ -79,7 +125,11 @@
<span class="rec-title">优化建议</span>
</div>
<div class="rec-content">
<div v-for="(tip, index) in optimizationTips" :key="index" class="tip-item">
<div
v-for="(tip, index) in optimizationTips"
:key="index"
class="tip-item"
>
<span class="tip-num">{{ index + 1 }}</span>
<span class="tip-text">{{ tip }}</span>
</div>
@@ -2,31 +2,52 @@
<div class="provider-comparison">
<div class="compare-table">
<div class="table-header">
<div class="col feature">对比项</div>
<div class="col provider">AWS</div>
<div class="col provider">阿里云</div>
<div class="col provider">腾讯云</div>
<div class="col feature">
对比项
</div>
<div class="col provider">
AWS
</div>
<div class="col provider">
阿里云
</div>
<div class="col provider">
腾讯云
</div>
</div>
<div
v-for="row in compareData"
:key="row.feature"
class="table-row"
>
<div class="col feature">{{ row.feature }}</div>
<div class="col provider" :class="{ highlight: row.awsHighlight }">
<div class="col feature">
{{ row.feature }}
</div>
<div
class="col provider"
:class="{ highlight: row.awsHighlight }"
>
{{ row.aws }}
</div>
<div class="col provider" :class="{ highlight: row.aliyunHighlight }">
<div
class="col provider"
:class="{ highlight: row.aliyunHighlight }"
>
{{ row.aliyun }}
</div>
<div class="col provider" :class="{ highlight: row.tencentHighlight }">
<div
class="col provider"
:class="{ highlight: row.tencentHighlight }"
>
{{ row.tencent }}
</div>
</div>
</div>
<div class="selection-guide">
<div class="guide-title">💡 选择建议</div>
<div class="guide-title">
💡 选择建议
</div>
<div class="guide-items">
<div class="guide-item">
<span class="scenario">出海业务</span>
@@ -16,9 +16,15 @@
<div class="latency-table">
<div class="table-header">
<div class="col region">云厂商地域</div>
<div class="col latency">延迟</div>
<div class="col rating">推荐度</div>
<div class="col region">
云厂商地域
</div>
<div class="col latency">
延迟
</div>
<div class="col rating">
推荐度
</div>
</div>
<div
v-for="item in latencyData"
@@ -26,14 +32,21 @@
class="table-row"
:class="{ best: item.rating === '⭐⭐⭐' }"
>
<div class="col region">{{ item.region }}</div>
<div class="col region">
{{ item.region }}
</div>
<div class="col latency">
<div class="latency-bar">
<div class="bar-fill" :style="{ width: item.percent + '%' }"></div>
<div
class="bar-fill"
:style="{ width: item.percent + '%' }"
/>
<span class="latency-value">{{ item.latency }}ms</span>
</div>
</div>
<div class="col rating">{{ item.rating }}</div>
<div class="col rating">
{{ item.rating }}
</div>
</div>
</div>
@@ -2,11 +2,15 @@
<div class="security-services-demo">
<div class="demo-header">
<h4>安全服务架构配置器</h4>
<p class="demo-desc">选择您的业务场景一键生成安全防护方案</p>
<p class="demo-desc">
选择您的业务场景一键生成安全防护方案
</p>
</div>
<div class="scenario-selector">
<div class="selector-title">选择业务场景</div>
<div class="selector-title">
选择业务场景
</div>
<div class="scenario-cards">
<button
v-for="scenario in scenarios"
@@ -21,7 +25,10 @@
</div>
</div>
<div v-if="selectedScenarioData" class="security-architecture">
<div
v-if="selectedScenarioData"
class="security-architecture"
>
<div class="architecture-header">
<span class="header-icon">🏗</span>
<span class="header-title">推荐安全架构</span>
@@ -39,18 +46,28 @@
<span class="service-name">{{ selectedScenarioData.edge.aws }}</span>
</div>
<div class="service-features">
<div v-for="(feat, idx) in selectedScenarioData.edge.awsFeatures" :key="idx" class="feature">
<div
v-for="(feat, idx) in selectedScenarioData.edge.awsFeatures"
:key="idx"
class="feature"
>
{{ feat }}
</div>
</div>
</div>
<div class="vs-mini">VS</div>
<div class="vs-mini">
VS
</div>
<div class="service-card">
<div class="service-header aliyun">
<span class="service-name">{{ selectedScenarioData.edge.aliyun }}</span>
</div>
<div class="service-features">
<div v-for="(feat, idx) in selectedScenarioData.edge.aliyunFeatures" :key="idx" class="feature">
<div
v-for="(feat, idx) in selectedScenarioData.edge.aliyunFeatures"
:key="idx"
class="feature"
>
{{ feat }}
</div>
</div>
@@ -69,18 +86,28 @@
<span class="service-name">{{ selectedScenarioData.app.aws }}</span>
</div>
<div class="service-features">
<div v-for="(feat, idx) in selectedScenarioData.app.awsFeatures" :key="idx" class="feature">
<div
v-for="(feat, idx) in selectedScenarioData.app.awsFeatures"
:key="idx"
class="feature"
>
{{ feat }}
</div>
</div>
</div>
<div class="vs-mini">VS</div>
<div class="vs-mini">
VS
</div>
<div class="service-card">
<div class="service-header aliyun">
<span class="service-name">{{ selectedScenarioData.app.aliyun }}</span>
</div>
<div class="service-features">
<div v-for="(feat, idx) in selectedScenarioData.app.aliyunFeatures" :key="idx" class="feature">
<div
v-for="(feat, idx) in selectedScenarioData.app.aliyunFeatures"
:key="idx"
class="feature"
>
{{ feat }}
</div>
</div>
@@ -99,18 +126,28 @@
<span class="service-name">{{ selectedScenarioData.data.aws }}</span>
</div>
<div class="service-features">
<div v-for="(feat, idx) in selectedScenarioData.data.awsFeatures" :key="idx" class="feature">
<div
v-for="(feat, idx) in selectedScenarioData.data.awsFeatures"
:key="idx"
class="feature"
>
{{ feat }}
</div>
</div>
</div>
<div class="vs-mini">VS</div>
<div class="vs-mini">
VS
</div>
<div class="service-card">
<div class="service-header aliyun">
<span class="service-name">{{ selectedScenarioData.data.aliyun }}</span>
</div>
<div class="service-features">
<div v-for="(feat, idx) in selectedScenarioData.data.aliyunFeatures" :key="idx" class="feature">
<div
v-for="(feat, idx) in selectedScenarioData.data.aliyunFeatures"
:key="idx"
class="feature"
>
{{ feat }}
</div>
</div>
@@ -120,9 +157,15 @@
</div>
<div class="security-recommendations">
<div class="rec-title">💡 安全建议</div>
<div class="rec-title">
💡 安全建议
</div>
<div class="rec-list">
<div v-for="(rec, idx) in selectedScenarioData.recommendations" :key="idx" class="rec-item">
<div
v-for="(rec, idx) in selectedScenarioData.recommendations"
:key="idx"
class="rec-item"
>
<span class="rec-num">{{ idx + 1 }}</span>
<span class="rec-text">{{ rec }}</span>
</div>
@@ -2,17 +2,29 @@
<div class="service-selection-demo">
<div class="demo-header">
<h4>云服务选型决策树</h4>
<p class="demo-desc">回答几个简单问题获取最适合您的云服务方案</p>
<p class="demo-desc">
回答几个简单问题获取最适合您的云服务方案
</p>
</div>
<div v-if="!result" class="decision-flow">
<div
v-if="!result"
class="decision-flow"
>
<div class="progress-bar">
<div class="progress-fill" :style="{ width: progress + '%' }"></div>
<div
class="progress-fill"
:style="{ width: progress + '%' }"
/>
</div>
<div class="question-card">
<div class="question-number">问题 {{ currentStep + 1 }}/{{ questions.length }}</div>
<h5 class="question-text">{{ currentQuestion.text }}</h5>
<div class="question-number">
问题 {{ currentStep + 1 }}/{{ questions.length }}
</div>
<h5 class="question-text">
{{ currentQuestion.text }}
</h5>
<div class="options-list">
<button
@@ -29,7 +41,10 @@
</div>
</div>
<div v-else class="result-panel">
<div
v-else
class="result-panel"
>
<div class="result-header">
<span class="result-icon">🎯</span>
<h5>推荐方案</h5>
@@ -37,32 +52,51 @@
<div class="recommendation-cards">
<div class="rec-card primary">
<div class="rec-badge">最佳匹配</div>
<div class="rec-icon">{{ result.primary.icon }}</div>
<div class="rec-title">{{ result.primary.name }}</div>
<div class="rec-badge">
最佳匹配
</div>
<div class="rec-icon">
{{ result.primary.icon }}
</div>
<div class="rec-title">
{{ result.primary.name }}
</div>
<div class="rec-services">
<span class="service aws">{{ result.primary.aws }}</span>
<span class="vs">vs</span>
<span class="service aliyun">{{ result.primary.aliyun }}</span>
</div>
<div class="rec-reason">{{ result.primary.reason }}</div>
<div class="rec-reason">
{{ result.primary.reason }}
</div>
</div>
<div class="rec-card secondary">
<div class="rec-badge alt">备选</div>
<div class="rec-icon">{{ result.secondary.icon }}</div>
<div class="rec-title">{{ result.secondary.name }}</div>
<div class="rec-badge alt">
备选
</div>
<div class="rec-icon">
{{ result.secondary.icon }}
</div>
<div class="rec-title">
{{ result.secondary.name }}
</div>
<div class="rec-services">
<span class="service aws">{{ result.secondary.aws }}</span>
<span class="vs">vs</span>
<span class="service aliyun">{{ result.secondary.aliyun }}</span>
</div>
<div class="rec-reason">{{ result.secondary.reason }}</div>
<div class="rec-reason">
{{ result.secondary.reason }}
</div>
</div>
</div>
<div class="result-actions">
<button class="restart-btn" @click="restart">
<button
class="restart-btn"
@click="restart"
>
<span></span> 重新测试
</button>
</div>
@@ -2,11 +2,15 @@
<div class="storage-services-demo">
<div class="demo-header">
<h4>存储服务选型助手</h4>
<p class="demo-desc">根据您的使用场景推荐最适合的存储方案</p>
<p class="demo-desc">
根据您的使用场景推荐最适合的存储方案
</p>
</div>
<div class="scenario-selector">
<div class="selector-title">选择您的主要使用场景</div>
<div class="selector-title">
选择您的主要使用场景
</div>
<div class="scenario-grid">
<button
v-for="scenario in scenarios"
@@ -15,14 +19,23 @@
:class="{ active: selectedScenario === scenario.id }"
@click="selectScenario(scenario.id)"
>
<div class="scenario-icon">{{ scenario.icon }}</div>
<div class="scenario-name">{{ scenario.name }}</div>
<div class="scenario-desc">{{ scenario.shortDesc }}</div>
<div class="scenario-icon">
{{ scenario.icon }}
</div>
<div class="scenario-name">
{{ scenario.name }}
</div>
<div class="scenario-desc">
{{ scenario.shortDesc }}
</div>
</button>
</div>
</div>
<div v-if="selectedScenario" class="recommendation-result">
<div
v-if="selectedScenario"
class="recommendation-result"
>
<div class="result-header">
<span class="result-icon">🎯</span>
<span class="result-title">推荐方案</span>
@@ -31,55 +44,91 @@
<div class="storage-comparison">
<div class="provider-card aws">
<div class="provider-header">
<div class="provider-logo">AWS</div>
<div class="provider-service">{{ currentScenario.awsService }}</div>
<div class="provider-logo">
AWS
</div>
<div class="provider-service">
{{ currentScenario.awsService }}
</div>
</div>
<div class="provider-features">
<div v-for="(feature, idx) in currentScenario.awsFeatures" :key="idx" class="feature-item">
<div
v-for="(feature, idx) in currentScenario.awsFeatures"
:key="idx"
class="feature-item"
>
<span class="check"></span>
<span>{{ feature }}</span>
</div>
</div>
<div class="provider-pricing">
<div class="price-label">定价模式</div>
<div class="price-value">{{ currentScenario.awsPricing }}</div>
<div class="price-label">
定价模式
</div>
<div class="price-value">
{{ currentScenario.awsPricing }}
</div>
</div>
</div>
<div class="vs-divider">
<div class="vs-line"></div>
<div class="vs-badge">VS</div>
<div class="vs-line"></div>
<div class="vs-line" />
<div class="vs-badge">
VS
</div>
<div class="vs-line" />
</div>
<div class="provider-card aliyun">
<div class="provider-header">
<div class="provider-logo aliyun-logo">阿里云</div>
<div class="provider-service">{{ currentScenario.aliyunService }}</div>
<div class="provider-logo aliyun-logo">
阿里云
</div>
<div class="provider-service">
{{ currentScenario.aliyunService }}
</div>
</div>
<div class="provider-features">
<div v-for="(feature, idx) in currentScenario.aliyunFeatures" :key="idx" class="feature-item">
<div
v-for="(feature, idx) in currentScenario.aliyunFeatures"
:key="idx"
class="feature-item"
>
<span class="check aliyun-check"></span>
<span>{{ feature }}</span>
</div>
</div>
<div class="provider-pricing">
<div class="price-label">定价模式</div>
<div class="price-value">{{ currentScenario.aliyunPricing }}</div>
<div class="price-label">
定价模式
</div>
<div class="price-value">
{{ currentScenario.aliyunPricing }}
</div>
</div>
</div>
</div>
<div class="decision-guide">
<div class="guide-title">🤔 如何选择</div>
<div class="guide-title">
🤔 如何选择
</div>
<div class="guide-content">
<div class="guide-item">
<div class="guide-condition">选择 AWS 如果</div>
<div class="guide-reason">{{ currentScenario.chooseAwsWhen }}</div>
<div class="guide-condition">
选择 AWS 如果
</div>
<div class="guide-reason">
{{ currentScenario.chooseAwsWhen }}
</div>
</div>
<div class="guide-item">
<div class="guide-condition">选择阿里云如果</div>
<div class="guide-reason">{{ currentScenario.chooseAliyunWhen }}</div>
<div class="guide-condition">
选择阿里云如果
</div>
<div class="guide-reason">
{{ currentScenario.chooseAliyunWhen }}
</div>
</div>
</div>
</div>
@@ -8,13 +8,22 @@
:class="{ active: selectedType === type.id }"
@click="selectedType = type.id"
>
<div class="type-icon">{{ type.icon }}</div>
<div class="type-name">{{ type.name }}</div>
<div class="type-example">{{ type.example }}</div>
<div class="type-icon">
{{ type.icon }}
</div>
<div class="type-name">
{{ type.name }}
</div>
<div class="type-example">
{{ type.example }}
</div>
</div>
</div>
<div v-if="selectedTypeData" class="type-detail">
<div
v-if="selectedTypeData"
class="type-detail"
>
<div class="detail-row">
<span class="label">特点</span>
<span class="value">{{ selectedTypeData.features }}</span>