完全使用TRAE和AI 开发一款完整的应用----第一周
完全使用TRAE和AI 开发一款完整的应用----第一周引言从零到一AI 辅助开发的实战周记在过去的一周里我给自己下了一个近乎“疯狂”的任务完全抛弃传统的手写代码方式仅依赖 TRAEAI 编程助手和对话式生成模型从零开发一款具备完整前后端、数据库和部署能力的 Web 应用。这篇文章将记录第一周的完整实战过程包括架构设计、核心代码生成、调试技巧以及遇到的坑。这不是一篇“AI 生成代码”的简单展示而是一次关于“人机协作开发流程”的深度探索。我会把每天的决策、Prompt 设计、以及最终落地的代码块都毫无保留地呈现出来。### 第一周目标搭建一个“团队任务看板”应用我选择的项目是一个轻量级的团队任务看板Kanban Board功能包括- 用户注册/登录JWT 认证- 任务列To-do / In-progress / Done拖拽管理- 任务详情、截止日期、优先级- 实时更新WebSocket 模拟技术栈定为Vue 3 Vite Node.js (Express) SQLite Socket.io。全部代码由 AI 生成我只负责描述需求、审查逻辑和修复 bug。### 第一天的核心工作用 Prompt 生成项目骨架第一天我彻底放弃了npm init和手写配置文件。我打开 TRAE 的对话窗口输入了第一个命令请帮我生成一个基于 Vue 3 Vite 的前端项目骨架包含路由、状态管理Pinia、以及一个简单的登录页面。要求1. 使用组合式API 2. 样式使用 Tailwind CSS 3. 将代码输出为可运行的完整文件结构。TRAE 在 30 秒内返回了完整的文件树和代码。这是生成的main.js和App.vue的精简版我做了适当注释javascript// src/main.jsimport { createApp } from vueimport { createPinia } from piniaimport App from ./App.vueimport router from ./routerimport ./assets/tailwind.cssconst app createApp(App)app.use(createPinia()) // 启用 Pinia 状态管理app.use(router) // 启用 Vue Routerapp.mount(#app)// 注意这里完全由 AI 生成我未修改一行配置html!-- src/App.vue --template div classmin-h-screen bg-gray-100 !-- 使用路由视图来控制页面切换 -- router-view / /div/templatescript setup// 使用 setup 语法糖无需手动导出组件/scriptstyle/* 全局样式Tailwind 会将此文件自动注入 *//style实战心得第一天最大的收获是——给 AI 的描述越具体生成的质量越高。如果我只说“生成一个前端项目”出来的可能是 React 或 Angular 混搭但当我指定了“Vue 3 Vite Pinia Tailwind”它就精准地生成了现代项目结构。### 第二天后端 API 与数据库的 AI 生成第二天重点放在了后端。我这样描述需求给 TRAE生成一个 Express 服务器使用 SQLite 数据库提供用户注册、登录、任务 CRUD 接口。要求1. 使用 JWT 进行身份验证 2. 使用 better-sqlite3 库 3. 将路由逻辑分离到单独文件 4. 每个接口要有错误处理。TRAE 生成了server.js和一个routes/tasks.js。下面是server.js的精华部分完全由 AI 生成我添加了中文注释javascript// server.jsconst express require(express);const sqlite3 require(better-sqlite3);const jwt require(jsonwebtoken);const cors require(cors);const app express();const db new sqlite3(app.db);// 初始化数据库表AI 自动创建db.exec( CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, password TEXT ); CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, status TEXT DEFAULT todo, user_id INTEGER ););app.use(cors());app.use(express.json());// 登录接口验证用户名和密码返回 JWTapp.post(/api/login, (req, res) { const { username, password } req.body; const user db.prepare(SELECT * FROM users WHERE username ?).get(username); if (!user || user.password ! password) { return res.status(401).json({ error: Invalid credentials }); } const token jwt.sign({ id: user.id }, secret_key); res.json({ token });});// 中间件验证 JWT 的 token 是否有效const authMiddleware (req, res, next) { const token req.headers.authorization?.split( )[1]; if (!token) return res.status(403).json({ error: No token provided }); try { const decoded jwt.verify(token, secret_key); req.userId decoded.id; next(); } catch (e) { res.status(401).json({ error: Invalid token }); }};// 获取当前用户的任务列表受保护路由app.get(/api/tasks, authMiddleware, (req, res) { const tasks db.prepare(SELECT * FROM tasks WHERE user_id ?).all(req.userId); res.json(tasks);});app.listen(3000, () { console.log(API server running on port 3000);});实战中的坑AI 生成的密码是明文的这在生产环境是致命的。我用一个 Prompt 让它修复“请改用 bcrypt 对密码进行哈希处理”。TRAE 自动引入了bcryptjs并修改了注册逻辑。这提醒我AI 生成的代码只能作为初稿安全审查必须由人类完成。### 第三天前后端联调与 WebSocket 实时更新到了第三天我遇到了最棘手的问题——实时更新。我让 TRAE 生成 Socket.io 服务端和客户端代码但它返回了两套不匹配的代码。我花了大量时间调试最终我换了一种 Prompt 策略请重新生成 Socket.io 集成方案要求服务端在 Express 上监听 3000 端口客户端使用 socket.io-client。当任务状态发生变化时服务端广播 taskUpdated 事件客户端接收后更新本地状态。请提供完整的代码片段并确保事件命名一致。这次生成的代码终于可以运行。以下是服务端的关键修改AI 生成我加了注释javascript// server.js 中添加 socket.io 部分const http require(http);const socketIo require(socket.io);const server http.createServer(app);const io socketIo(server, { cors: { origin: * } });// 监听客户端连接io.on(connection, (socket) { console.log(A user connected:, socket.id); // 监听任务拖拽事件并广播给所有客户端 socket.on(taskDragged, (taskData) { // 更新数据库中的状态 db.prepare(UPDATE tasks SET status ? WHERE id ?).run(taskData.newStatus, taskData.id); // 广播给所有连接的客户端 io.emit(taskUpdated, taskData); });});// 注意将原本的 app.listen 改为 server.listenserver.listen(3000, () { console.log(Server running with WebSocket support);});而在 Vue 前端TRAE 生成了一段组合式 API 的代码来接收更新javascript// src/composables/useSocket.jsimport { io } from socket.io-client;import { onMounted, onUnmounted } from vue;import { useTaskStore } from ../stores/taskStore;export function useSocket() { const store useTaskStore(); let socket null; onMounted(() { socket io(http://localhost:3000); // 监听服务端推送的任务更新 socket.on(taskUpdated, (taskData) { store.updateTask(taskData); // 调用 Pinia store 中的方法 }); }); onUnmounted(() { socket?.disconnect(); }); return { socket };}实战心得AI 在处理跨端通信时经常犯“事件名不一致”或“端口不匹配”的错误。我的解决方案是让 AI 生成一份“通信协议文档”我再作为审查者去核对两边代码。这类似于真实开发中的 API 契约测试。### 第四天拖拽功能的实现——AI 的“极限挑战”拖拽是 Kanban 的核心也是我预想中 AI 最难生成的部分。我用了vuedraggable库。我给出的 Prompt 是请使用 vuedraggable 库实现三列看板todo, in-progress, done每个任务卡片可以拖拽到其他列。拖拽结束后调用后端 API 更新状态并触发 WebSocket 广播。请生成完整的 KanbanBoard.vue 组件。TRAE 返回的代码几乎完美但有一个问题它没有处理“拖拽后列表顺序变化”的副作用。我通过一个 Prompt 修复了它请在拖拽事件中加入 change 监听器当列表顺序变化时将新顺序保存到本地状态并同步到后端。最终生成的组件核心部分如下节选html!-- src/components/KanbanBoard.vue --template div classflex gap-4 p-4 div v-forcolumn in columns :keycolumn.id classflex-1 bg-gray-200 rounded-lg p-3 h2 classfont-bold mb-2{{ column.title }}/h2 !-- draggable 组件实现拖拽 -- draggable :listcolumn.tasks grouptasks changeonDragChange(column.id, $event) item-keyid template #item{ element } div classbg-white p-2 mb-2 rounded shadow {{ element.title }} /div /template /draggable /div /div/templatescript setupimport draggable from vuedraggable;import { ref } from vue;import { useSocket } from ../composables/useSocket;const columns ref([ { id: todo, title: 待办, tasks: [] }, { id: in-progress, title: 进行中, tasks: [] }, { id: done, title: 已完成, tasks: [] },]);const { socket } useSocket();// 拖拽变更后的处理函数function onDragChange(columnId, event) { if (event.added) { const task event.added.element; // 发送 WebSocket 事件通知服务端更新数据库 socket.emit(taskDragged, { id: task.id, newStatus: columnId, }); }}/script重要提示这里我特意将useSocket的调用放在了KanbanBoard.vue中但实际开发中要避免在多个组件中重复建立 socket 连接。我后来用 Pinia 将 socket 实例全局化了。### 第五至六天测试、样式美化与部署准备接下来的两天我让 TRAE 帮我1. 生成了Jest单元测试文件针对 API 路由。2. 用 Tailwind 优化了 UI 布局增加了响应式设计。3. 生成了Dockerfile和docker-compose.yml用于容器化部署。其中 Dockerfile 的内容完全由 AI 生成我仅修改了 Node 版本dockerfile# DockerfileFROM node:18-alpineWORKDIR /app# 先复制 package.json 以利用 Docker 缓存COPY package*.json ./RUN npm install# 复制全部源码COPY . .EXPOSE 3000CMD [node, server.js]### 第七天总结与反思——AI 开发的真实体验经过 7 天的高强度使用我的结论是优点-效率提升 5 倍以上以前我写一个 CRUD 接口需要 40 分钟现在 AI 30 秒生成我只需修改逻辑 bug。-减少“重复劳动”模板代码、配置文件、基础组件生成AI 几乎完美。-加速学习AI 生成的代码风格很现代我从中学会了Vue 3的很多新特性。缺点与风险-安全漏洞AI 默认生成的代码没有考虑 SQL 注入、XSS 攻击、密码加密等问题必须人工审查。-逻辑边界错误在复杂业务逻辑如拖拽顺序、事务处理中AI 经常“想当然”需要反复调试。-依赖版本更新AI 的知识库可能滞后生成的老版本 API 可能导致兼容性问题。**我的工作流进化**1. 先用自然语言描述需求越具体越好。2. 让 AI 生成代码框架。3. 我作为“代码审查者”重点检查安全性和边界条件。4. 遇到 bug把报错信息直接粘贴给 AI让它自己修复。5. 每生成一个模块立刻用测试用例验证。### 下周计划第一周完成了 MVP 版本下周我将重点- 用 AI 重构数据库为 PostgreSQL 并添加 ORMPrisma。- 让 AI 生成完整的 CI/CD 流水线GitHub Actions。- 使用 AI 生成端到端测试Cypress。如果你也在尝试用 AI 开发完整应用欢迎在评论区分享你的经验和踩坑记录。我会在第二周的更新中继续输出实战细节。最后一句AI 不是万能但不会用 AI 的开发者将被会用 AI 的开发者取代。