feat: update docs and components, fix DLQ demo bug
This commit is contained in:
@@ -0,0 +1,471 @@
|
||||
<template>
|
||||
<div class="syntax-comparison-demo">
|
||||
<div class="demo-header">
|
||||
<h4>Hello World 语法对比</h4>
|
||||
<p class="subtitle">同样的功能,不同的实现方式</p>
|
||||
</div>
|
||||
|
||||
<div class="language-selector">
|
||||
<button
|
||||
v-for="lang in languages"
|
||||
:key="lang.name"
|
||||
class="lang-btn"
|
||||
:class="{ active: selectedLang === lang.name }"
|
||||
@click="selectedLang = lang.name"
|
||||
>
|
||||
<span class="lang-icon">{{ lang.icon }}</span>
|
||||
<span class="lang-name">{{ lang.name }}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<transition name="fade" mode="out-in">
|
||||
<div :key="selectedLang" class="code-display">
|
||||
<div class="code-header">
|
||||
<div class="window-controls">
|
||||
<span class="control red"></span>
|
||||
<span class="control yellow"></span>
|
||||
<span class="control green"></span>
|
||||
</div>
|
||||
<div class="filename">{{ getFileName(selectedLang) }}</div>
|
||||
</div>
|
||||
|
||||
<pre class="code-content"><code>{{ getCode(selectedLang) }}</code></pre>
|
||||
|
||||
<div class="code-stats">
|
||||
<div class="stat-item">
|
||||
<span class="stat-label">代码行数:</span>
|
||||
<span class="stat-value">{{ getLineCount(selectedLang) }} 行</span>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<span class="stat-label">字符数:</span>
|
||||
<span class="stat-value">{{ getCharCount(selectedLang) }} 字符</span>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<span class="stat-label">复杂度:</span>
|
||||
<span class="stat-value">{{ getComplexity(selectedLang) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
|
||||
<div class="analysis-panel">
|
||||
<h5>💡 语法分析</h5>
|
||||
<div class="analysis-content">
|
||||
<p>{{ getAnalysis(selectedLang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="complexity-chart">
|
||||
<h5>代码复杂度对比</h5>
|
||||
<div class="chart-bars">
|
||||
<div
|
||||
v-for="lang in languages"
|
||||
:key="lang.name"
|
||||
class="chart-bar-wrapper"
|
||||
>
|
||||
<div class="chart-label">{{ lang.name }}</div>
|
||||
<div class="chart-bar">
|
||||
<div
|
||||
class="chart-fill"
|
||||
:style="{ width: getComplexityWidth(lang.name) + '%' }"
|
||||
></div>
|
||||
</div>
|
||||
<div class="chart-value">{{ getLineCount(lang.name) }} 行</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const selectedLang = ref('Python')
|
||||
|
||||
const languages = [
|
||||
{ name: 'Python', icon: '🐍' },
|
||||
{ name: 'Ruby', icon: '💎' },
|
||||
{ name: 'Go', icon: '🐹' },
|
||||
{ name: 'Node.js', icon: '💚' },
|
||||
{ name: 'Java', icon: '☕' },
|
||||
{ name: 'C#', icon: '💜' },
|
||||
{ name: 'Rust', icon: '🦀' },
|
||||
{ name: 'C++', icon: '⚡' }
|
||||
]
|
||||
|
||||
const codes = {
|
||||
Python: {
|
||||
code: `print("Hello, World!")`,
|
||||
filename: 'hello.py',
|
||||
complexity: '极简'
|
||||
},
|
||||
Ruby: {
|
||||
code: `puts "Hello, World!"`,
|
||||
filename: 'hello.rb',
|
||||
complexity: '极简'
|
||||
},
|
||||
Go: {
|
||||
code: `package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello, World!")
|
||||
}`,
|
||||
filename: 'hello.go',
|
||||
complexity: '简洁'
|
||||
},
|
||||
'Node.js': {
|
||||
code: `console.log("Hello, World!");`,
|
||||
filename: 'hello.js',
|
||||
complexity: '极简'
|
||||
},
|
||||
Java: {
|
||||
code: `public class HelloWorld {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello, World!");
|
||||
}
|
||||
}`,
|
||||
filename: 'HelloWorld.java',
|
||||
complexity: '冗长'
|
||||
},
|
||||
"C#": {
|
||||
code: `using System;
|
||||
|
||||
class Program {
|
||||
static void Main() {
|
||||
Console.WriteLine("Hello, World!");
|
||||
}
|
||||
}`,
|
||||
filename: 'Program.cs',
|
||||
complexity: '冗长'
|
||||
},
|
||||
Rust: {
|
||||
code: `fn main() {
|
||||
println!("Hello, World!");
|
||||
}`,
|
||||
filename: 'main.rs',
|
||||
complexity: '简洁'
|
||||
},
|
||||
'C++': {
|
||||
code: `#include <iostream>
|
||||
|
||||
int main() {
|
||||
std::cout << "Hello, World!" << std::endl;
|
||||
return 0;
|
||||
}`,
|
||||
filename: 'hello.cpp',
|
||||
complexity: '中等'
|
||||
}
|
||||
}
|
||||
|
||||
const analyses = {
|
||||
Python: 'Python 的语法极其简洁,只有一行代码。这也是为什么它被称为"伪代码语言"——读起来就像英语一样自然。没有任何样板代码,直接表达意图。',
|
||||
Ruby: 'Ruby 受 Perl 影响,语法非常优雅。puts 是 "put string" 的缩写,字符串不需要括号(虽然可以加)。Ruby 哲学是"程序员快乐至上"。',
|
||||
Go: 'Go 的语法虽然比 Python 冗长,但非常清晰。package main、import、func main() 都是必要的显式声明,这让代码更容易理解和维护。',
|
||||
'Node.js': 'Node.js 使用 JavaScript,语法简单直接。console.log() 是浏览器和 Node.js 通用的输出方式。前端开发者零学习成本。',
|
||||
Java: 'Java 是典型的"仪式感"语言。class、public static void main、String[] args 都是必须的样板代码。虽然冗长,但结构清晰,适合大型项目。',
|
||||
'C#': 'C# 和 Java 非常相似,同样需要 class 和 Main 方法。using System 类似 Java 的 import,但更现代一些。.NET Core 后跨平台能力大幅提升。',
|
||||
Rust: 'Rust 的 fn main() 和 println! 宏看起来简洁,但 println! 后面的 ! 表示这是一个宏(不是函数)。Rust 的简洁来自于零成本抽象的设计哲学。',
|
||||
'C++': 'C++ 需要 #include 头文件,std::cout 使用流操作符 <<,return 0 表示程序成功退出。虽然比 C 语言简洁(printf),但依然保留了很多底层细节。'
|
||||
}
|
||||
|
||||
const getCode = (lang) => {
|
||||
return codes[lang].code
|
||||
}
|
||||
|
||||
const getFileName = (lang) => {
|
||||
return codes[lang].filename
|
||||
}
|
||||
|
||||
const getLineCount = (lang) => {
|
||||
return codes[lang].code.split('\n').length
|
||||
}
|
||||
|
||||
const getCharCount = (lang) => {
|
||||
return codes[lang].code.replace(/\s/g, '').length
|
||||
}
|
||||
|
||||
const getComplexity = (lang) => {
|
||||
return codes[lang].complexity
|
||||
}
|
||||
|
||||
const getAnalysis = (lang) => {
|
||||
return analyses[lang]
|
||||
}
|
||||
|
||||
const getComplexityWidth = (lang) => {
|
||||
const max = 10 // Java is the longest
|
||||
const lines = getLineCount(lang)
|
||||
return (lines / max) * 100
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.syntax-comparison-demo {
|
||||
background: var(--vp-c-bg);
|
||||
border-radius: 12px;
|
||||
padding: 2rem;
|
||||
margin: 2rem 0;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
}
|
||||
|
||||
.demo-header {
|
||||
text-align: center;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.demo-header h4 {
|
||||
margin: 0 0 0.5rem 0;
|
||||
color: var(--vp-c-brand);
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
margin: 0;
|
||||
color: var(--vp-c-text-2);
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.language-selector {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.75rem;
|
||||
margin-bottom: 2rem;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.lang-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.75rem 1.25rem;
|
||||
border: 2px solid var(--vp-c-divider);
|
||||
border-radius: 8px;
|
||||
background: var(--vp-c-bg);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
font-weight: 600;
|
||||
color: var(--vp-c-text-1);
|
||||
}
|
||||
|
||||
.lang-btn:hover {
|
||||
border-color: var(--vp-c-brand);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
|
||||
}
|
||||
|
||||
.lang-btn.active {
|
||||
border-color: var(--vp-c-brand);
|
||||
background: var(--vp-c-brand);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.lang-icon {
|
||||
font-size: 1.5rem;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.lang-name {
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.code-display {
|
||||
background: #1e1e1e;
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 2rem;
|
||||
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.code-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0.8rem 1rem;
|
||||
background: #2d2d2d;
|
||||
border-bottom: 1px solid #3e3e3e;
|
||||
}
|
||||
|
||||
.window-controls {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.control {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.control.red {
|
||||
background: #ff5f56;
|
||||
}
|
||||
|
||||
.control.yellow {
|
||||
background: #ffbd2e;
|
||||
}
|
||||
|
||||
.control.green {
|
||||
background: #27c93f;
|
||||
}
|
||||
|
||||
.filename {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
color: #858585;
|
||||
font-size: 0.85rem;
|
||||
font-family: var(--vp-font-family-mono);
|
||||
}
|
||||
|
||||
.code-content {
|
||||
margin: 0;
|
||||
padding: 1.5rem;
|
||||
background: #1e1e1e;
|
||||
color: #d4d4d4;
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.6;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.code-content code {
|
||||
color: #d4d4d4;
|
||||
}
|
||||
|
||||
.code-stats {
|
||||
display: flex;
|
||||
gap: 2rem;
|
||||
padding: 1rem 1.5rem;
|
||||
background: #2d2d2d;
|
||||
border-top: 1px solid #3e3e3e;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.stat-item {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
color: #858585;
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
color: #4ec9b0;
|
||||
font-weight: 600;
|
||||
font-family: var(--vp-font-family-mono);
|
||||
}
|
||||
|
||||
.analysis-panel {
|
||||
background: var(--vp-c-bg-soft);
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
border-left: 4px solid var(--vp-c-brand);
|
||||
}
|
||||
|
||||
.analysis-panel h5 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
color: var(--vp-c-brand);
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.analysis-content p {
|
||||
margin: 0;
|
||||
color: var(--vp-c-text-2);
|
||||
line-height: 1.7;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.complexity-chart {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
.complexity-chart h5 {
|
||||
margin-bottom: 1.5rem;
|
||||
color: var(--vp-c-text-1);
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.chart-bars {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.chart-bar-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.chart-label {
|
||||
min-width: 80px;
|
||||
font-weight: 600;
|
||||
color: var(--vp-c-text-1);
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.chart-bar {
|
||||
flex: 1;
|
||||
height: 30px;
|
||||
background: var(--vp-c-bg-soft);
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.chart-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, var(--vp-c-brand), #8b5cf6);
|
||||
transition: width 0.5s ease;
|
||||
}
|
||||
|
||||
.chart-value {
|
||||
min-width: 60px;
|
||||
text-align: right;
|
||||
font-weight: 600;
|
||||
color: var(--vp-c-text-2);
|
||||
font-size: 0.85rem;
|
||||
font-family: var(--vp-font-family-mono);
|
||||
}
|
||||
|
||||
.fade-enter-active,
|
||||
.fade-leave-active {
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.fade-enter-from,
|
||||
.fade-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.language-selector {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.lang-btn {
|
||||
padding: 0.5rem 1rem;
|
||||
}
|
||||
|
||||
.code-stats {
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.chart-bar-wrapper {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.chart-label {
|
||||
min-width: 60px;
|
||||
}
|
||||
|
||||
.chart-value {
|
||||
min-width: 50px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user