1. 系统概述与架构设计

1.1 系统功能需求

简易留言板系统需要实现以下核心功能:

  • 用户提交留言(包含姓名和内容)
  • 留言列表展示(按时间倒序排列)
  • 留言时间戳显示
  • 简单的响应式界面设计

1.2 技术架构选择

graph TD
    A[前端] -->|HTTP请求| B[后端API]
    B -->|数据操作| C[数据库]
    A -->|渲染| D[用户界面]
    C -->|存储| E[留言数据]
    
    subgraph 技术栈
    A --> HTML/CSS/JavaScript
    B --> Node.js/Express
    C --> SQLite
    end

1.3 AI IDE工具选择

  • Visual Studio Code + GitHub Copilot:主流选择,智能代码补全
  • Cursor:专为AI设计的IDE,支持自然语言编程
  • Replit:在线IDE,内置AI助手Ghostwriter
  • Tabnine:企业级代码助手

本指南以Cursor为例,因其强大的自然语言编程能力特别适合快速原型开发。

2. 环境搭建与项目初始化

2.1 使用AI IDE创建项目

在Cursor中执行以下Prompt:

创建一个名为message-board的新项目,使用Node.js和Express框架,初始化package.json,并安装以下依赖:
- express: Web框架
- sqlite3: 数据库驱动
- cors: 跨域支持
- body-parser: 请求体解析

AI生成的package.json:

{
  "name": "message-board",
  "version": "1.0.0",
  "description": "Simple message board system",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  },
  "dependencies": {
    "express": "^4.18.2",
    "sqlite3": "^5.1.6",
    "cors": "^2.8.5",
    "body-parser": "^1.20.2"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}

2.2 项目结构设计

message-board/
├── public/          # 静态资源
│   ├── index.html   # 前端页面
│   ├── style.css    # 样式文件
│   └── script.js    # 前端逻辑
├── database/        # 数据库文件
│   └── messages.db
├── app.js           # 后端入口
└── package.json

使用Cursor创建目录结构:

创建上述项目目录结构,并在public目录下创建index.html、style.css和script.js文件

3. 数据库设计与实现

3.1 数据库表设计

使用AI设计数据库表:

设计SQLite数据库表结构,用于存储留言信息,包含以下字段:
- id: 主键,自增
- name: 留言者姓名
- content: 留言内容
- timestamp: 留言时间戳

AI生成的SQL创建语句:

CREATE TABLE IF NOT EXISTS messages (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    content TEXT NOT NULL,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

3.2 数据库初始化代码

在app.js中添加数据库初始化代码:

const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./database/messages.db', (err) => {
    if (err) {
        console.error(err.message);
    }
    console.log('Connected to the messages database.');
});

// 创建表
db.run(`CREATE TABLE IF NOT EXISTS messages (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    content TEXT NOT NULL,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)`, (err) => {
    if (err) {
        console.error(err.message);
    }
});

4. 后端API开发

4.1 Express服务器配置

使用AI生成Express服务器基础代码:

创建Express服务器,监听3000端口,配置CORS和body-parser中间件

生成的代码:

const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;

// 中间件配置
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static('public'));

// 启动服务器
app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}`) ;
});

4.2 API端点实现

4.2.1 获取所有留言

Prompt:

创建GET /api/messages端点,返回所有留言,按时间戳倒序排列

生成的代码:

// 获取所有留言
app.get('/api/messages', (req, res) => {
    const sql = "SELECT * FROM messages ORDER BY timestamp DESC";
    db.all(sql, [], (err, rows) => {
        if (err) {
            res.status(500).json({ error: err.message });
            return;
        }
        res.json(rows);
    });
});
4.2.2 添加新留言

Prompt:

创建POST /api/messages端点,接收name和content参数,将新留言插入数据库

生成的代码:

// 添加新留言
app.post('/api/messages', (req, res) => {
    const { name, content } = req.body;
    if (!name || !content) {
        return res.status(400).json({ error: "Name and content are required" });
    }
    
    const sql = "INSERT INTO messages (name, content) VALUES (?, ?)";
    db.run(sql, [name, content], function(err) {
        if (err) {
            res.status(500).json({ error: err.message });
            return;
        }
        res.json({ 
            id: this.lastID,
            name,
            content,
            timestamp: new Date().toISOString()
        });
    });
});

5. 前端界面开发

5.1 HTML结构设计

使用AI生成基础HTML结构:

创建留言板HTML页面,包含:
1. 页面标题
2. 留言提交表单(姓名和内容输入框)
3. 留言列表展示区域
4. 引入CSS和JavaScript文件

生成的index.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>简易留言板</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <h1>简易留言板</h1>
        
        <div class="message-form">
            <h2>发表留言</h2>
            <form id="messageForm">
                <div class="form-group">
                    <label for="name">姓名:</label>
                    <input type="text" id="name" required>
                </div>
                <div class="form-group">
                    <label for="content">留言内容:</label>
                    <textarea id="content" rows="4" required></textarea>
                </div>
                <button type="submit">提交留言</button>
            </form>
        </div>
        
        <div class="message-list">
            <h2>留言列表</h2>
            <div id="messages"></div>
        </div>
    </div>
    
    <script src="script.js"></script>
</body>
</html>

5.2 CSS样式设计

Prompt:

创建响应式CSS样式,包含:
1. 容器居中,最大宽度800px
2. 表单和留言列表卡片样式
3. 输入框和按钮样式
4. 留言项样式(姓名、内容、时间)
5. 响应式设计(移动端适配)

生成的style.css:

* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    font-family: 'Arial', sans-serif;
}

body {
    background-color: #f5f5f5;
    color: #333;
    line-height: 1.6;
}

.container {
    max-width: 800px;
    margin: 30px auto;
    padding: 20px;
}

h1, h2 {
    color: #2c3e50;
    margin-bottom: 20px;
    text-align: center;
}

.message-form, .message-list {
    background: white;
    padding: 25px;
    border-radius: 8px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
    margin-bottom: 30px;
}

.form-group {
    margin-bottom: 15px;
}

label {
    display: block;
    margin-bottom: 5px;
    font-weight: bold;
}

input[type="text"], textarea {
    width: 100%;
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 4px;
    font-size: 16px;
}

textarea {
    resize: vertical;
}

button {
    background-color: #3498db;
    color: white;
    border: none;
    padding: 12px 20px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 16px;
    transition: background-color 0.3s;
}

button:hover {
    background-color: #2980b9;
}

.message-item {
    border-bottom: 1px solid #eee;
    padding: 15px 0;
}

.message-item:last-child {
    border-bottom: none;
}

.message-header {
    display: flex;
    justify-content: space-between;
    margin-bottom: 8px;
}

.message-name {
    font-weight: bold;
    color: #2c3e50;
}

.message-time {
    color: #7f8c8d;
    font-size: 0.9em;
}

.message-content {
    color: #34495e;
    line-height: 1.5;
}

/* 响应式设计 */
@media (max-width: 600px) {
    .container {
        padding: 15px;
    }
    
    .message-form, .message-list {
        padding: 15px;
    }
    
    .message-header {
        flex-direction: column;
    }
    
    .message-time {
        margin-top: 5px;
    }
}

5.3 JavaScript交互逻辑

Prompt:

创建JavaScript代码实现:
1. 页面加载时获取所有留言并显示
2. 表单提交处理,发送POST请求添加新留言
3. 动态渲染留言列表
4. 表单验证和错误处理
5. 成功提交后清空表单并刷新留言列表

生成的script.js:

document.addEventListener('DOMContentLoaded', () => {
    // DOM元素
    const messageForm = document.getElementById('messageForm');
    const nameInput = document.getElementById('name');
    const contentInput = document.getElementById('content');
    const messagesContainer = document.getElementById('messages');
    
    // 加载所有留言
    loadMessages();
    
    // 表单提交事件
    messageForm.addEventListener('submit', async (e) => {
        e.preventDefault();
        
        const name = nameInput.value.trim();
        const content = contentInput.value.trim();
        
        // 简单验证
        if (!name || !content) {
            alert('请填写姓名和留言内容');
            return;
        }
        
        try {
            // 发送POST请求
            const response = await fetch('/api/messages', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ name, content })
            });
            
            if (!response.ok) {
                throw new Error('留言提交失败');
            }
            
            // 清空表单
            nameInput.value = '';
            contentInput.value = '';
            
            // 重新加载留言
            loadMessages();
        } catch (error) {
            console.error('Error:', error);
            alert('提交留言时出错,请重试');
        }
    });
    
    // 加载留言函数
    async function loadMessages() {
        try {
            const response = await fetch('/api/messages');
            
            if (!response.ok) {
                throw new Error('获取留言失败');
            }
            
            const messages = await response.json();
            renderMessages(messages);
        } catch (error) {
            console.error('Error:', error);
            messagesContainer.innerHTML = '<p>加载留言失败,请刷新页面重试</p>';
        }
    }
    
    // 渲染留言列表
    function renderMessages(messages) {
        if (messages.length === 0) {
            messagesContainer.innerHTML = '<p>暂无留言,快来发表第一条留言吧!</p>';
            return;
        }
        
        messagesContainer.innerHTML = messages.map(message => `
            <div class="message-item">
                <div class="message-header">
                    <span class="message-name">${escapeHtml(message.name)}</span>
                    <span class="message-time">${formatDate(message.timestamp)}</span>
                </div>
                <div class="message-content">${escapeHtml(message.content)}</div>
            </div>
        `).join('');
    }
    
    // HTML转义函数,防止XSS攻击
    function escapeHtml(text) {
        const map = {
            '&': '&amp;',
            '<': '&lt;',
            '>': '&gt;',
            '"': '&quot;',
            "'": '&#039;'
        };
        return text.replace(/[&<>"']/g, m => map[m]);
    }
    
    // 格式化日期时间
    function formatDate(timestamp) {
        const date = new Date(timestamp);
        return date.toLocaleString('zh-CN', {
            year: 'numeric',
            month: '2-digit',
            day: '2-digit',
            hour: '2-digit',
            minute: '2-digit'
        });
    }
});

6. 系统流程与架构图

6.1 系统数据流程图

sequenceDiagram
    participant User as 用户
    participant Frontend as 前端
    participant Backend as 后端
    participant DB as 数据库
    
    User->>Frontend: 访问留言板页面
    Frontend->>Backend: GET /api/messages
    Backend->>DB: 查询所有留言
    DB-->>Backend: 返回留言数据
    Backend-->>Frontend: 返回JSON数据
    Frontend->>User: 显示留言列表
    
    User->>Frontend: 填写并提交留言
    Frontend->>Backend: POST /api/messages
    Backend->>DB: 插入新留言
    DB-->>Backend: 返回操作结果
    Backend-->>Frontend: 返回成功响应
    Frontend->>Frontend: 刷新留言列表
    Frontend->>User: 显示更新后的留言

6.2 系统架构图

graph TB
    subgraph 前端
        A[HTML/CSS/JS] --> B[用户界面]
        B --> C[表单提交]
        B --> D[留言展示]
    end
    
    subgraph 后端
        E[Express服务器] --> F[路由处理]
        F --> G[API端点]
        G --> H[数据库操作]
    end
    
    subgraph 数据库
        I[SQLite] --> J[留言表]
    end
    
    C -->|HTTP请求| G
    G -->|查询/插入| H
    H -->|数据操作| J
    J -->|返回数据| H
    H -->|JSON响应| G
    G -->|数据| D

6.3 数据库ER图

graph TB
    subgraph 前端
        A[HTML/CSS/JS] --> B[用户界面]
        B --> C[表单提交]
        B --> D[留言展示]
    end
    
    subgraph 后端
        E[Express服务器] --> F[路由处理]
        F --> G[API端点]
        G --> H[数据库操作]
    end
    
    subgraph 数据库
        I[SQLite] --> J[留言表]
    end
    
    C -->|HTTP请求| G
    G -->|查询/插入| H
    H -->|数据操作| J
    J -->|返回数据| H
    H -->|JSON响应| G
    G -->|数据| D

7. 测试与部署

7.1 本地测试

  1. 启动服务器:
npm install
npm start
  1. 访问 http://localhost:3000

  2. 测试功能:

    • 提交新留言
    • 查看留言列表
    • 验证时间戳显示
    • 测试响应式设计(调整浏览器窗口大小)

7.2 使用AI进行测试

Prompt示例:

为留言板系统创建测试用例,包含:
1. 测试GET /api/messages端点
2. 测试POST /api/messages端点(正常和异常情况)
3. 测试前端表单提交功能
4. 测试前端留言列表渲染

AI生成的测试代码示例(使用Jest):

const request = require('supertest');
const app = require('./app');

describe('Message Board API', () => {
    // 测试获取所有留言
    test('GET /api/messages should return all messages', async () => {
        const response = await request(app).get('/api/messages');
        expect(response.statusCode).toBe(200);
        expect(Array.isArray(response.body)).toBeTruthy();
    });

    // 测试添加新留言
    test('POST /api/messages should add a new message', async () => {
        const newMessage = {
            name: '测试用户',
            content: '这是一条测试留言'
        };
        
        const response = await request(app)
            .post('/api/messages')
            .send(newMessage);
            
        expect(response.statusCode).toBe(200);
        expect(response.body.name).toBe(newMessage.name);
        expect(response.body.content).toBe(newMessage.content);
        expect(response.body).toHaveProperty('id');
        expect(response.body).toHaveProperty('timestamp');
    });

    // 测试缺少必填字段
    test('POST /api/messages should return error for missing fields', async () => {
        const response = await request(app)
            .post('/api/messages')
            .send({ name: '测试用户' }); // 缺少content字段
            
        expect(response.statusCode).toBe(400);
        expect(response.body.error).toContain('required');
    });
});

7.3 部署到云平台

使用AI生成部署指南:

创建将留言板系统部署到Heroku的步骤指南,包含:
1. 创建Heroku账户
2. 安装Heroku CLI
3. 初始化Git仓库
4. 创建Heroku应用
5. 部署代码
6. 配置环境变量

AI生成的部署步骤:

# 部署到Heroku指南

## 1. 准备工作
- 注册Heroku账户:https://signup.heroku.com
- 安装Heroku CLI:https://devcenter.heroku.com/articles/heroku-cli

## 2. 初始化项目

bash
git init
git add .
git commit -m “Initial commit”


## 3. 创建Heroku应用

bash
heroku login
heroku create


## 4. 创建Procfile
在项目根目录创建`Procfile`文件,内容:

web: node app.js


## 5. 部署代码

bash
git add .
git commit -m “Ready for deployment”
git push heroku main


## 6. 打开应用

bash
heroku open


## 7. 查看日志(可选)

bash
heroku logs --tail


8. 性能优化与扩展

8.1 使用AI优化性能

Prompt:

为留言板系统提供性能优化建议,包含:
1. 数据库查询优化
2. 前端渲染优化
3. API响应优化
4. 缓存策略

AI生成的优化建议:

# 留言板系统性能优化建议

## 1. 数据库优化
- 为timestamp字段添加索引:`CREATE INDEX idx_timestamp ON messages(timestamp);`
- 使用连接池管理数据库连接
- 限制单次查询返回的记录数(分页)

## 2. 前端优化
- 实现留言分页加载,避免一次性加载过多数据
- 使用虚拟滚动技术处理大量留言
- 压缩CSS和JavaScript文件
- 使用CDN加速静态资源加载

## 3. API优化
- 实现API响应缓存
- 添加压缩中间件(如compression)
- 使用HTTP/2协议
- 实现GraphQL减少数据传输量

## 4. 缓存策略
- 使用Redis缓存热门留言
- 实现浏览器缓存(Cache-Control头)
- 使用Service Worker实现离线缓存
 

8.2 功能扩展示例

使用AI添加分页功能:

为留言板系统添加分页功能,包含:
1. 修改GET /api/messages端点,支持page和limit参数
2. 前端添加分页控件
3. 实现分页逻辑

AI生成的分页实现:

后端修改(app.js):

// 获取分页留言
app.get('/api/messages', (req, res) => {
    const page = parseInt(req.query.page) || 1;
    const limit = parseInt(req.query.limit) || 10;
    const offset = (page - 1) * limit;
    
    const sql = "SELECT * FROM messages ORDER BY timestamp DESC LIMIT ? OFFSET ?";
    db.all(sql, [limit, offset], (err, rows) => {
        if (err) {
            res.status(500).json({ error: err.message });
            return;
        }
        
        // 获取总记录数
        db.get("SELECT COUNT(*) as total FROM messages", (err, row) => {
            if (err) {
                res.status(500).json({ error: err.message });
                return;
            }
            
            res.json({
                data: rows,
                pagination: {
                    total: row.total,
                    page,
                    limit,
                    totalPages: Math.ceil(row.total / limit)
                }
            });
        });
    });
});

前端修改(script.js):

// 添加分页相关变量
let currentPage = 1;
const messagesPerPage = 5;

// 修改loadMessages函数支持分页
async function loadMessages(page = 1) {
    try {
        const response = await fetch(`/api/messages?page=${page}&limit=${messagesPerPage}`);
        
        if (!response.ok) {
            throw new Error('获取留言失败');
        }
        
        const result = await response.json();
        renderMessages(result.data);
        renderPagination(result.pagination);
    } catch (error) {
        console.error('Error:', error);
        messagesContainer.innerHTML = '<p>加载留言失败,请刷新页面重试</p>';
    }
}

// 渲染分页控件
function renderPagination(pagination) {
    const { total, page, limit, totalPages } = pagination;
    
    if (totalPages <= 1) {
        document.getElementById('pagination').innerHTML = '';
        return;
    }
    
    let paginationHTML = '<div class="pagination">';
    
    // 上一页按钮
    if (page > 1) {
        paginationHTML += `<button onclick="changePage(${page - 1})">上一页</button>`;
    }
    
    // 页码按钮
    for (let i = 1; i <= totalPages; i++) {
        if (i === page) {
            paginationHTML += `<button class="active">${i}</button>`;
        } else {
            paginationHTML += `<button onclick="changePage(${i})">${i}</button>`;
        }
    }
    
    // 下一页按钮
    if (page < totalPages) {
        paginationHTML += `<button onclick="changePage(${page + 1})">下一页</button>`;
    }
    
    paginationHTML += '</div>';
    document.getElementById('pagination').innerHTML = paginationHTML;
}

// 切换页面
function changePage(page) {
    currentPage = page;
    loadMessages(page);
}

// 在HTML中添加分页容器
// 在message-list div中添加:<div id="pagination"></div>

9. 安全增强

9.1 使用AI识别安全风险

Prompt:

分析留言板系统的潜在安全风险,并提供解决方案,包含:
1. SQL注入防护
2. XSS攻击防护
3. CSRF攻击防护
4. 输入验证与过滤

AI生成的安全增强方案:

# 留言板系统安全增强方案

## 1. SQL注入防护
- 使用参数化查询(已实现)
- 避免直接拼接SQL语句
- 限制数据库用户权限

## 2. XSS攻击防护
- 对用户输入进行HTML转义(已实现escapeHtml函数)
- 使用CSP(内容安全策略)
- 设置HTTP头:X-XSS-Protection: 1; mode=block

## 3. CSRF攻击防护
- 实现CSRF令牌验证
- 使用SameSite cookie属性
- 验证Referer/Origin头

## 4. 输入验证与过滤
- 前端和后端双重验证
- 限制输入长度
- 过滤特殊字符

9.2 实现CSRF防护

使用AI生成CSRF防护代码:

为Express应用添加CSRF防护,包含:
1. 安装csurf包
2. 配置CSRF中间件
3. 生成CSRF令牌并传递给前端
4. 前端在请求中包含CSRF令牌

AI生成的CSRF防护实现:

后端修改(app.js):

const csrf = require('csurf');
const cookieParser = require('cookie-parser');

// 添加cookie解析中间件
app.use(cookieParser());

// 配置CSRF保护
const csrfProtection = csrf({ cookie: true });

// 提供CSRF令牌的端点
app.get('/api/csrf-token', csrfProtection, (req, res) => {
    res.json({ csrfToken: req.csrfToken() });
});

// 修改POST端点添加CSRF保护
app.post('/api/messages', csrfProtection, (req, res) => {
    // 原有代码...
});

前端修改(script.js):

// 在页面加载时获取CSRF令牌
let csrfToken;

async function getCsrfToken() {
    try {
        const response = await fetch('/api/csrf-token');
        const data = await response.json();
        csrfToken = data.csrfToken;
    } catch (error) {
        console.error('获取CSRF令牌失败:', error);
    }
}

// 在DOMContentLoaded事件中调用
document.addEventListener('DOMContentLoaded', () => {
    getCsrfToken();
    // 其他代码...
});

// 修改POST请求添加CSRF令牌
const response = await fetch('/api/messages', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRF-Token': csrfToken
    },
    body: JSON.stringify({ name, content })
});

10. 总结与展望

10.1 项目总结

通过AI IDE(Cursor)的辅助,我们快速构建了一个功能完整的简易留言板系统,包括:

  • 完整的前后端实现
  • 数据库设计与操作
  • 响应式用户界面
  • 基本的安全防护
  • 分页功能扩展
  • 测试与部署指南

10.2 AI开发优势

  1. 效率提升:传统开发需要数天的工作,AI辅助下可在数小时内完成
  2. 代码质量:AI生成的代码遵循最佳实践,减少常见错误
  3. 学习曲线:自然语言编程降低技术门槛
  4. 一致性:保持代码风格和架构的一致性

10.3 未来扩展方向

mindmap
  root((留言板系统))
    功能扩展
      用户认证系统
      留言回复功能
      文件上传
      实时通知
    技术升级
      前端框架(React/Vue)
      数据库升级(PostgreSQL)
      微服务架构
      容器化部署
    智能增强
      AI内容审核
      智能推荐
      情感分析
      自动分类

10.4 AI开发最佳实践

  1. 明确需求:使用清晰、具体的Prompt描述需求
  2. 迭代开发:分步骤实现,逐步完善功能
  3. 代码审查:AI生成代码仍需人工审查和测试
  4. 安全优先:始终将安全性作为核心考虑因素
  5. 持续学习:随着AI工具发展,不断学习新技巧和方法

通过本指南,我们展示了如何利用AI IDE快速构建一个完整的Web应用。随着AI技术的不断发展,软件开发的方式正在发生革命性变化,掌握AI辅助开发技能将成为未来开发者的核心竞争力。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐