vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue代码生成器之纯HTML

Vue代码生成器之纯HTML实现过程

作者:zzywxc787

这篇文章主要介绍了Vue代码生成器之纯HTML实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

我将设计一个纯HTML页面,可以生成Vue组件代码、HTML页面和JSON数据。

这个系统将包含三个主要功能区域,并具有直观的用户界面。

设计思路

1.使用Bootstrap进行快速美观的界面搭建

2.实现三个独立的功能区域

3.添加实时预览功能

实现代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue代码生成器</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="external nofollow"  rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.14/vue.min.js"></script>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #f8f9fa;
            padding-top: 20px;
        }
        .header {
            background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
            color: white;
            border-radius: 10px;
            padding: 20px;
            margin-bottom: 30px;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
        }
        .generator-card {
            background: white;
            border-radius: 10px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);
            padding: 20px;
            margin-bottom: 25px;
            transition: transform 0.3s;
        }
        .generator-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
        }
        .nav-tabs .nav-link.active {
            font-weight: 600;
            border-bottom: 3px solid #0d6efd;
        }
        .preview-area {
            background-color: #f8f9fa;
            border: 1px solid #e9ecef;
            border-radius: 5px;
            padding: 15px;
            min-height: 200px;
            max-height: 300px;
            overflow-y: auto;
        }
        .code-area {
            font-family: 'Courier New', monospace;
            background-color: #272822;
            color: #f8f8f2;
            border-radius: 5px;
            padding: 15px;
            min-height: 200px;
            max-height: 300px;
            overflow-y: auto;
            font-size: 14px;
        }
        .btn-generate {
            background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 5px;
            font-weight: 600;
            transition: all 0.3s;
        }
        .btn-generate:hover {
            transform: scale(1.05);
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
        }
        .saved-items {
            background-color: white;
            border-radius: 10px;
            padding: 20px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);
            margin-top: 30px;
        }
        .feature-icon {
            font-size: 2rem;
            margin-bottom: 15px;
            color: #6a11cb;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header text-center">
            <h1 class="display-4">Vue代码生成器</h1>
            <p class="lead">快速生成Vue组件、HTML页面和JSON数据 - 纯HTML实现</p>
        </div>

        <div class="row">
            <div class="col-md-4">
                <div class="generator-card text-center">
                    <div class="feature-icon">⚡</div>
                    <h3>Vue组件生成器</h3>
                    <p>通过简单表单生成Vue单文件组件</p>
                    <button class="btn btn-generate" data-bs-toggle="modal" data-bs-target="#vueModal">开始生成</button>
                </div>
            </div>
            <div class="col-md-4">
                <div class="generator-card text-center">
                    <div class="feature-icon">🛠️</div>
                    <h3>HTML页面生成器</h3>
                    <p>创建响应式HTML页面模板</p>
                    <button class="btn btn-generate" data-bs-toggle="modal" data-bs-target="#htmlModal">开始生成</button>
                </div>
            </div>
            <div class="col-md-4">
                <div class="generator-card text-center">
                    <div class="feature-icon">📊</div>
                    <h3>JSON数据生成器</h3>
                    <p>生成模拟API返回的JSON数据</p>
                    <button class="btn btn-generate" data-bs-toggle="modal" data-bs-target="#jsonModal">开始生成</button>
                </div>
            </div>
        </div>

        <div class="saved-items">
            <h3>已保存的项目</h3>
            <div id="savedItemsList" class="mt-3">
                <p class="text-muted">暂无保存的项目</p>
            </div>
        </div>
    </div>

    <!-- Vue组件生成器模态框 -->
    <div class="modal fade" id="vueModal" tabindex="-1" aria-labelledby="vueModalLabel" aria-hidden="true">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="vueModalLabel">Vue组件生成器</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <div class="mb-3">
                        <label class="form-label">组件名称</label>
                        <input type="text" class="form-control" id="vueComponentName" placeholder="例如: MyComponent">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">数据属性 (每行一个,格式: 名称:默认值)</label>
                        <textarea class="form-control" id="vueDataProps" rows="3" placeholder="message: 'Hello Vue!'
count: 0"></textarea>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">方法 (每行一个方法名)</label>
                        <textarea class="form-control" id="vueMethods" rows="2" placeholder="increment
reset"></textarea>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">模板内容</label>
                        <textarea class="form-control" id="vueTemplate" rows="4" placeholder="<div>
  <h1>{{ message }}</h1>
  <button @click='increment'>点击次数: {{ count }}</button>
</div>"></textarea>
                    </div>
                    <div class="d-grid">
                        <button class="btn btn-primary" onclick="generateVueComponent()">生成Vue组件</button>
                    </div>
                    <div class="mt-4">
                        <h5>生成结果:</h5>
                        <div class="code-area" id="vueOutput">
                            <!-- Vue代码将在这里显示 -->
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- HTML页面生成器模态框 -->
    <div class="modal fade" id="htmlModal" tabindex="-1" aria-labelledby="htmlModalLabel" aria-hidden="true">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="htmlModalLabel">HTML页面生成器</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <div class="mb-3">
                        <label class="form-label">页面标题</label>
                        <input type="text" class="form-control" id="htmlTitle" placeholder="例如: 我的网页">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">主要内容</label>
                        <textarea class="form-control" id="htmlContent" rows="4" placeholder="输入HTML内容..."></textarea>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">CSS样式</label>
                        <textarea class="form-control" id="htmlCss" rows="3" placeholder="输入CSS样式..."></textarea>
                    </div>
                    <div class="d-grid">
                        <button class="btn btn-primary" onclick="generateHtmlPage()">生成HTML页面</button>
                    </div>
                    <div class="mt-4">
                        <h5>生成结果:</h5>
                        <div class="code-area" id="htmlOutput">
                            <!-- HTML代码将在这里显示 -->
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- JSON生成器模态框 -->
    <div class="modal fade" id="jsonModal" tabindex="-1" aria-labelledby="jsonModalLabel" aria-hidden="true">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="jsonModalLabel">JSON数据生成器</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <div class="mb-3">
                        <label class="form-label">JSON结构 (每行一个属性,格式: 名称:类型:示例值)</label>
                        <textarea class="form-control" id="jsonStructure" rows="4" placeholder="name:string:John Doe
age:number:30
isActive:boolean:true
hobbies:array:['reading', 'traveling']"></textarea>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">项目数量</label>
                        <input type="number" class="form-control" id="jsonCount" value="3" min="1" max="10">
                    </div>
                    <div class="d-grid">
                        <button class="btn btn-primary" onclick="generateJsonData()">生成JSON数据</button>
                    </div>
                    <div class="mt-4">
                        <h5>生成结果:</h5>
                        <div class="code-area" id="jsonOutput">
                            <!-- JSON代码将在这里显示 -->
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
    <script>
        // 初始化示例
        document.addEventListener('DOMContentLoaded', function() {
            loadSavedItems();
        });

        // 生成Vue组件
        function generateVueComponent() {
            const name = document.getElementById('vueComponentName').value || 'MyComponent';
            const dataProps = document.getElementById('vueDataProps').value;
            const methods = document.getElementById('vueMethods').value;
            const template = document.getElementById('vueTemplate').value;
            
            let dataContent = '';
            if (dataProps) {
                const props = dataProps.split('\n').filter(line => line.trim());
                dataContent = 'data() {\n    return {\n';
                props.forEach(prop => {
                    const [key, value] = prop.split(':').map(item => item.trim());
                    dataContent += `      ${key}: ${value || 'null'},\n`;
                });
                dataContent += '    };\n  },';
            }
            
            let methodsContent = '';
            if (methods) {
                const methodList = methods.split('\n').filter(line => line.trim());
                methodsContent = 'methods: {\n';
                methodList.forEach(method => {
                    methodsContent += `    ${method}() {\n      // 方法实现\n    },\n`;
                });
                methodsContent += '  },';
            }
            
            const vueCode = `<template>
  ${template || '<div>\n    \n  </div>'}
</template>

<script>
export default {
  name: '${name}',
  ${dataContent}
  ${methodsContent}
};
<\/script>

<style scoped>
/* 添加组件样式 */
</style>`;
            
            document.getElementById('vueOutput').textContent = vueCode;
            saveItem('Vue组件: ' + name, vueCode);
        }

        // 生成HTML页面
        function generateHtmlPage() {
            const title = document.getElementById('htmlTitle').value || '生成的页面';
            const content = document.getElementById('htmlContent').value || '<p>这是生成的内容</p>';
            const css = document.getElementById('htmlCss').value || 'body { font-family: Arial, sans-serif; }';
            
            const htmlCode = `<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>${title}</title>
  <style>
    ${css}
  </style>
</head>
<body>
  ${content}
</body>
</html>`;
            
            document.getElementById('htmlOutput').textContent = htmlCode;
            saveItem('HTML页面: ' + title, htmlCode);
        }

        // 生成JSON数据
        function generateJsonData() {
            const structure = document.getElementById('jsonStructure').value;
            const count = parseInt(document.getElementById('jsonCount').value) || 3;
            
            if (!structure) {
                document.getElementById('jsonOutput').textContent = '请先定义JSON结构';
                return;
            }
            
            const lines = structure.split('\n').filter(line => line.trim());
            const items = [];
            
            for (let i = 0; i < count; i++) {
                const item = {};
                lines.forEach(line => {
                    const [key, type, example] = line.split(':').map(part => part.trim());
                    
                    if (type === 'number') {
                        item[key] = example ? parseInt(example) + i : i;
                    } else if (type === 'boolean') {
                        item[key] = example ? example.toLowerCase() === 'true' : Boolean(i % 2);
                    } else if (type === 'array') {
                        try {
                            item[key] = JSON.parse(example || '[]');
                        } catch {
                            item[key] = [];
                        }
                    } else if (type === 'object') {
                        try {
                            item[key] = JSON.parse(example || '{}');
                        } catch {
                            item[key] = {};
                        }
                    } else {
                        item[key] = example ? example.replace('${i}', i + 1) : `值${i+1}`;
                    }
                });
                items.push(item);
            }
            
            const jsonCode = JSON.stringify(items, null, 2);
            document.getElementById('jsonOutput').textContent = jsonCode;
            saveItem('JSON数据', jsonCode);
        }

        // 保存项目到localStorage
        function saveItem(name, content) {
            let items = JSON.parse(localStorage.getItem('generatedItems') || '[]');
            items.push({
                id: Date.now(),
                name: name,
                content: content,
                type: name.split(':')[0],
                date: new Date().toLocaleString()
            });
            localStorage.setItem('generatedItems', JSON.stringify(items));
            loadSavedItems();
        }

        // 加载已保存的项目
        function loadSavedItems() {
            const items = JSON.parse(localStorage.getItem('generatedItems') || '[]');
            const container = document.getElementById('savedItemsList');
            
            if (items.length === 0) {
                container.innerHTML = '<p class="text-muted">暂无保存的项目</p>';
                return;
            }
            
            container.innerHTML = '';
            items.forEach(item => {
                const div = document.createElement('div');
                div.className = 'card mb-2';
                div.innerHTML = `
                    <div class="card-body">
                        <h5 class="card-title">${item.name}</h5>
                        <p class="card-text"><small class="text-muted">${item.date} | ${item.type}</small></p>
                        <button class="btn btn-sm btn-outline-primary" onclick="viewItem(${item.id})">查看</button>
                        <button class="btn btn-sm btn-outline-danger" onclick="deleteItem(${item.id})">删除</button>
                    </div>
                `;
                container.appendChild(div);
            });
        }

        // 查看项目
        function viewItem(id) {
            const items = JSON.parse(localStorage.getItem('generatedItems') || '[]');
            const item = items.find(i => i.id === id);
            if (item) {
                alert(item.content);
            }
        }

        // 删除项目
        function deleteItem(id) {
            let items = JSON.parse(localStorage.getItem('generatedItems') || '[]');
            items = items.filter(i => i.id !== id);
            localStorage.setItem('generatedItems', JSON.stringify(items));
            loadSavedItems();
        }
    </script>
</body>
</html>

功能说明

这个纯HTML页面实现了以下功能:

Vue组件生成器

HTML页面生成器

JSON数据生成器

数据持久化

使用说明

这个系统完全基于纯HTML/CSS/JavaScript实现,无需任何后端支持,可以直接在浏览器中运行。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文