Files
test-repo/docs/.vitepress/theme/components/appendix/monolith-to-microservices/ArchEvolutionDemo.vue
T
sanbuphy ef70b1d8e1 feat: add comprehensive backend topics and fix build issues
## 新增内容

### 附录文档扩展
- 扩展前端项目架构文档 (frontend-project-architecture.md)
- 扩展后端项目架构文档 (backend-project-architecture.md)
- 扩展数据治理文档 (data-governance.md)
- 扩展数据可视化文档 (data-visualization.md)
- 扩展分布式系统文档 (distributed-systems.md)
- 扩展高可用文档 (high-availability.md)
- 扩展单体到微服务文档 (monolith-to-microservices.md)
- 扩展系统设计方法论文档 (system-design-methodology.md)
- 扩展 Docker 容器文档 (docker-containers.md)
- 扩展 Kubernetes 文档 (kubernetes.md)
- 扩展 Linux 基础文档 (linux-basics.md)
- 扩展神经网络文档 (neural-networks.md)

### 新增交互式组件
- 数据治理组件: DataQualityDemo, DataGovernanceFrameworkDemo, DataLineageDemo
- 数据可视化组件: ChartTypeSelectorDemo, DashboardLayoutDemo
- 分布式系统组件: CAPTheoremDemo, ConsistencyModelsDemo, DistributedChallengesDemo
- 高可用组件: AvailabilityCalculatorDemo, FailoverStrategyDemo
- 系统设计组件: SystemDesignStepsDemo, CapacityEstimationDemo
- Docker 容器组件: DockerArchitectureDemo, DockerLifecycleDemo
- Kubernetes 组件: K8sArchitectureDemo, K8sWorkloadsDemo
- Linux 基础组件: LinuxFileSystemDemo, LinuxCommandDemo, LinuxPermissionsDemo
- 神经网络组件: NeuronDemo, NetworkLayersDemo, NetworkArchitectureDemo
- 单体到微服务组件: ArchEvolutionDemo
- 项目架构组件: ProjectArchitectureComparisonDemo
- 附录导航组件: AppendixFlowMap

### 英文版重构
- 将 en-us 目录重命名为 en
- 更新相关配置和组件中的语言代码

## Bug 修复
- 修复 index.js 中重复的组件导入语句导致的 build 失败
- 恢复被注释的 InvertedIndexDemo 和 SearchRelevanceDemo 导入
- 修复 HomeFeatures.vue 中 en-us 与 config.mjs 中 en 不一致导致的语言切换问题

## 其他改进
- 添加构建脚本 (scripts/build.mjs)
- 更新依赖版本
2026-02-26 04:35:28 +08:00

159 lines
5.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!--
ArchEvolutionDemo.vue
架构演进演示展示从单体到微服务的演进过程
-->
<template>
<div class="arch-evolution-demo">
<div class="header">
<div class="title">架构演进路径</div>
<div class="subtitle">点击查看每个阶段的架构特点</div>
</div>
<div class="stages">
<div
v-for="(stage, i) in stages"
:key="stage.key"
:class="['stage-card', { active: activeStage === stage.key }]"
@click="activeStage = stage.key"
>
<div class="stage-num">{{ i + 1 }}</div>
<div class="stage-name">{{ stage.name }}</div>
</div>
</div>
<div v-if="current" class="stage-detail">
<div class="detail-name">{{ current.name }}</div>
<div class="detail-desc">{{ current.desc }}</div>
<div class="arch-visual">
<div
v-for="(box, i) in current.boxes"
:key="i"
:class="['arch-box', box.type]"
>
{{ box.label }}
</div>
</div>
<div class="detail-row">
<span class="label">适用规模</span>{{ current.scale }}
</div>
<div class="detail-row">
<span class="label">核心挑战</span>{{ current.challenge }}
</div>
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
const activeStage = ref('monolith')
const stages = [
{
key: 'monolith',
name: '单体架构',
desc: '所有功能打包在一个应用中,共享一个数据库。简单直接,适合早期快速迭代。',
scale: '团队 < 10 人,日活 < 10 万',
challenge: '代码耦合严重,一个模块的 Bug 可能拖垮整个系统',
boxes: [
{ label: '用户模块', type: 'module' },
{ label: '订单模块', type: 'module' },
{ label: '支付模块', type: 'module' },
{ label: '商品模块', type: 'module' },
{ label: '单体应用(一个进程)', type: 'container' },
{ label: 'MySQL', type: 'db' }
]
},
{
key: 'modular',
name: '模块化单体',
desc: '在单体内部按业务域划分模块,模块间通过接口通信。是微服务的前置步骤。',
scale: '团队 10-30 人',
challenge: '模块边界容易被打破,需要纪律性',
boxes: [
{ label: '用户域', type: 'domain' },
{ label: '订单域', type: 'domain' },
{ label: '支付域', type: 'domain' },
{ label: '内部 API 边界', type: 'boundary' },
{ label: 'MySQL', type: 'db' }
]
},
{
key: 'soa',
name: '服务化(SOA',
desc: '按业务能力拆分为独立服务,通过 ESB 或 API 网关通信。每个服务可以独立部署。',
scale: '团队 30-100 人',
challenge: '服务间调用链变长,需要服务治理',
boxes: [
{ label: '用户服务', type: 'service' },
{ label: '订单服务', type: 'service' },
{ label: '支付服务', type: 'service' },
{ label: 'API 网关', type: 'gateway' },
{ label: '各自数据库', type: 'db' }
]
},
{
key: 'microservices',
name: '微服务架构',
desc: '更细粒度的服务拆分,每个服务独立开发、部署、扩缩容。配合容器化和 K8s。',
scale: '团队 100+ 人,日活百万+',
challenge: '分布式复杂性、数据一致性、运维成本',
boxes: [
{ label: '用户服务', type: 'service' },
{ label: '认证服务', type: 'service' },
{ label: '订单服务', type: 'service' },
{ label: '库存服务', type: 'service' },
{ label: '支付服务', type: 'service' },
{ label: '通知服务', type: 'service' },
{ label: 'API Gateway + Service Mesh', type: 'gateway' },
{ label: '独立数据库 x N', type: 'db' }
]
}
]
const current = computed(() => stages.find(s => s.key === activeStage.value))
</script>
<style scoped>
.arch-evolution-demo {
border: 1px solid var(--vp-c-divider); background: var(--vp-c-bg-soft);
border-radius: 12px; padding: 1.5rem; margin: 1.5rem 0;
}
.header { margin-bottom: 1rem; }
.title { font-weight: 700; font-size: 1.1rem; }
.subtitle { color: var(--vp-c-text-2); font-size: 0.9rem; }
.stages { display: flex; gap: 0.5rem; margin-bottom: 1rem; flex-wrap: wrap; }
.stage-card {
display: flex; align-items: center; gap: 0.4rem;
padding: 0.4rem 0.75rem; border-radius: 6px; cursor: pointer;
font-size: 0.85rem; background: var(--vp-c-bg); border: 1px solid var(--vp-c-divider);
transition: all 0.2s;
}
.stage-card:hover { border-color: var(--vp-c-brand); }
.stage-card.active { border-color: var(--vp-c-brand); background: rgba(var(--vp-c-brand-rgb), 0.05); font-weight: 600; }
.stage-num {
width: 20px; height: 20px; border-radius: 50%; background: var(--vp-c-brand);
color: white; font-size: 0.7rem; font-weight: 700;
display: flex; align-items: center; justify-content: center;
}
.stage-detail { background: var(--vp-c-bg); border-radius: 8px; padding: 1rem; border: 1px solid var(--vp-c-divider); }
.detail-name { font-weight: 700; font-size: 0.95rem; }
.detail-desc { color: var(--vp-c-text-2); font-size: 0.82rem; margin-bottom: 0.75rem; }
.arch-visual { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-bottom: 0.75rem; }
.arch-box {
padding: 0.35rem 0.6rem; border-radius: 4px; font-size: 0.72rem; font-weight: 600;
border: 1px dashed var(--vp-c-divider);
}
.arch-box.module { background: rgba(var(--vp-c-brand-rgb), 0.06); }
.arch-box.domain { background: rgba(99,102,241,0.06); }
.arch-box.service { background: rgba(34,197,94,0.06); }
.arch-box.gateway { background: rgba(245,158,11,0.06); width: 100%; text-align: center; }
.arch-box.container { background: rgba(239,68,68,0.06); width: 100%; text-align: center; }
.arch-box.boundary { background: rgba(156,163,175,0.06); width: 100%; text-align: center; }
.arch-box.db { background: rgba(139,92,246,0.06); }
.detail-row { font-size: 0.82rem; margin-bottom: 0.25rem; }
.label { font-weight: 600; color: var(--vp-c-text-2); }
</style>