TRAE AI 编程工具包含 Chat、Builder 及 Builder with MCP 三种智能体。三者区别与适用场景,通过 Vue 3 + Node.js + MySQL 全栈项目实战,演示如何利用 MCP 连接真实数据库、生成后端 API 及优化前端交互。涵盖项目初始化、架构升级、API 集成、数据库优化及生产部署全流程,提供高效使用指令法则与技术栈配置示例。

TRAE 三大智能体: @Chat 智能体:就像你团队里一位全能的技术专家。你给他具体的指令,他帮你解决具体的问题。 @Builder 智能体:就像一位项目总监或产品经理。你告诉他一个想法或目标,他会制定计划、分配资源,交付一个完整的项目原型。 @Builder with MCP:就像一位拥有超级权限的 CTO。他不仅能做项目总监的工作,还能直接调用公司的各种基础设施(数据库、云服务、内部工具),交付一个真正可用的生产系统。
如何选择: 要修改或理解现有代码?→ @Chat 智能体 要创建新的页面或项目,但不需要/还没准备好连接真实数据库?→ @Builder 智能体 要创建连接了真实数据库、API 的全栈应用,或集成外部服务?→ @Builder with MCP 智能体
最佳实践是组合使用:用 @Builder with MCP 搭建坚实的全栈基础,用 @Builder 快速探索新功能原型,用 @Chat 进行日常的代码维护和优化。三者协同,将能最大化地提升你的开发效率。
三大智能体核心区别对比表
| 特性维度 | @Chat 智能体 | @Builder 智能体 | @Builder with MCP 智能体 |
|---|---|---|---|
| 核心角色 | 代码级助手 | 项目级构建者 | 系统级架构师 |
| 工作粒度 | 文件/代码块 (函数、组件、样式) | 功能/页面/项目 (完整功能模块、项目骨架) | 全栈应用/数据流 (前端 + 后端 + 数据库 + 服务) |
| 交互模式 | 对话驱动 (你问它答,你指令它执行) | 目标驱动 (你描述'做什么',它决定'怎么做') | 资源驱动 (你描述目标,它调度外部资源来实现) |
| 核心输入 | 代码片段、错误信息、自然语言指令 | 自然语言需求描述、设计稿、产品原型图 | 自然语言需求描述、数据库 Schema、API 文档、外部工具配置 |
| 核心输出 | 代码片段、修改建议、解释、修复方案 | 结构化、可运行的项目文件和代码 | 连接了真实数据源和服务、具备完整数据流的生产就绪项目 |
| 数据能力 | 操作前端模拟数据 (Mock) | 操作前端模拟数据 (Mock) | 连接并操作真实数据库 (MySQL/PostgreSQL 等)、调用外部 API |
| 决策权 | 低 (等待你的每一步指令) | 中 (自主进行技术选型、项目结构设计) | 高 (自主进行系统架构、数据库设计、服务集成) |
要修改或理解现有代码? → @Chat 智能体
典型场景: 日常编码与调试: '帮我写一个 Vue 3 的 Composable 来管理用户登录状态。' '这个 JavaScript 函数为什么一直返回 undefined?' 代码解释与学习: '解释一下这段 Pinia Store 的代码是如何工作的?' 'Vue Router 的导航守卫有哪些使用场景?' 代码重构与优化: '帮我优化这个组件,让它支持虚拟滚动。' '将这个 Options API 的组件改成 Composition API。' 单文件修改: '在
UserProfile.vue组件里,为表单添加一个邮箱格式验证。'
何时使用: 当需要修改、理解或优化现有代码时,首先想到 @Chat。
要创建新的页面或项目,但不需要/还没准备好连接真实数据库? → @Builder 智能体
典型场景: 项目冷启动: '创建一个 React + TypeScript + Ant Design 的管理后台,包含用户管理和权限设置。' 功能模块生成: '在我的 Vue 项目中,为一个电商产品生成完整的商品详情页,包括图片画廊、规格选择、购买区域。' 从设计到代码: (上传一张 Figma 设计稿) '请参考这个设计稿,搭建出对应的 Vue 页面组件。' 技术栈探索: '使用 SvelteKit 为我构建一个个人博客网站,并集成 MDX 支持。'
何时使用: 当需要从零开始创建一个新的项目、页面或复杂功能模块时,使用 @Builder。
要创建连接了真实数据库、API 的全栈应用,或集成外部服务? → @Builder with MCP 智能体
典型场景: 全栈应用开发: '构建一个任务管理系统,前端用 Vue,后端用 Node.js(Express),数据库用 MySQL,并实现任务的 CRUD、用户认证和实时通知。' 数据库设计与集成: '为我的博客系统设计数据库 Schema,创建
posts、users、comments表,并建立关联,然后提供相应的 RESTful API。' 外部服务集成: '在我的项目中集成 GitHub API,实现一个可以显示我的仓库列表和最新提交的功能。' 遗留系统现代化: '连接到我现有的 MySQL 数据库,为其生成一个 GraphQL API 层,并创建一个 React 前端来管理数据。' 生产环境部署准备: '为刚才创建的全栈应用生成 Docker 配置文件和 CI/CD 流水线脚本。'
何时使用: 当项目需要连接真实的数据源、集成外部服务、或构建具备完整前后端数据流的全栈应用时,必须使用 @Builder with MCP。
协同使用三大智能体: 阶段一:项目初始化 (使用 @Builder with MCP) 指令: '构建一个用户管理中心,前端 Vue 3 + Element Plus,后端 Express,MySQL 数据库。需要
users表(id, name, email, role),实现用户的增删改查 (CRUD) 和分页查询 API。' 结果: @Builder with MCP 会创建完整的项目结构、数据库表、后端 API 和前端页面,数据完全打通。 阶段二:功能增强 (使用 @Chat 智能体) 指令: (打开生成的前端页面)'为这个用户表格添加一个'导出为 CSV'的功能按钮。' 指令: '在后端的用户创建 API 里,添加对邮箱格式的验证逻辑。' 结果: @Chat 会在现有代码基础上进行微调和增强。 阶段三:新增模块 (使用 @Builder 智能体) 指令: '现在需要增加一个'操作日志'模块,记录用户的关键操作。请先在前端创建一个日志查看页面,用表格展示,数据暂时用 Mock。' 结果: @Builder 会快速生成一个带有模拟数据的日志页面组件,让你先预览 UI 效果。 阶段四:数据持久化 (使用 @Builder with MCP) 指令: '现在请将'操作日志'模块落地。在数据库中创建logs表,创建对应的后端 API,并将前端页面连接到真实 API。' 结果: @Builder with MCP 将刚才的 Mock 模块升级为全栈功能。
要创建连接了真实数据库、API 的全栈应用,或集成外部服务? → @Builder with MCP 智能体
MCP (Model Context Protocol) 核心价值:让 @Builder 能够连接和操作外部工具与数据源,如数据库、API、GitHub 等。将我们的'企业任务管理系统'升级为连接真实 MySQL 数据库的全栈应用。
@Builder with MCP 的核心能力可以概括为:通过标准化协议,将 AI 的规划与构建能力,与真实世界的数据、工具和服务相连接,实现从'虚拟代码生成'到'物理系统构建'的跨越。
这是 MCP 最根本的能力,它允许智能体突破沙箱,与外部环境交互。 数据库操作:直接连接并操作 MySQL、PostgreSQL、MongoDB 等数据库。它能执行:
CREATE TABLE等 DDL 语句来设计 Schema。INSERT/UPDATE/DELETE等 DML 语句来管理数据。执行复杂查询和事务,确保数据一致性。 API 集成:调用外部 RESTful API、GraphQL 端点。例如,集成 GitHub API 获取仓库信息,调用云服务商(AWS S3、Twilio)的 API。 服务器管理:通过 SSH 连接服务器,执行命令、部署应用、查看日志。 版本控制:与 Git 交互,完成提交代码、创建分支、解决冲突等操作。
它不再只关心前端,而是具备系统架构师的思维。 前后端分离架构:自动规划并生成前端(Vue/React)和后端(Node.js/Express,Python/FastAPI)项目结构。 数据流设计:设计从数据库 -> 后端 API -> 前端状态管理(Pinia/Redux)-> 视图组件的完整数据流。 API 设计与实现:自动创建符合 REST 规范的 API 端点,并生成对应的 Swagger/OpenAPI 文档。 环境配置:区分开发、测试、生产环境,配置数据库连接、环境变量等。
与只能使用模拟数据的其他智能体相比,它能处理真实数据的全生命周期。 数据库迁移:生成并执行数据库迁移脚本,优雅地管理 Schema 变更。 种子数据:创建初始数据和测试数据,确保应用启动时即有可用数据。 数据关联与查询:处理复杂的多表关联查询,优化 N+1 查询问题。 数据备份与恢复:规划并执行数据备份策略。
它的输出目标直接是生产环境。 容器化:生成
Dockerfile和docker-compose.yml文件,实现应用容器化。 CI/CD 流水线:创建 GitHub Actions、GitLab CI 等配置文件,实现自动化测试和部署。 监控与日志:集成应用性能监控和结构化日志记录。 依赖与安全:管理项目依赖,识别并处理安全漏洞。
要驾驭这个强大的工具,必须遵循以下法则,其核心思维是从 '程序员' 转变为 '系统架构师与产品经理'。
使用 @Builder with MCP 的成功与否,90% 取决于你的指令质量和规划能力。 从'如何实现'到'要实现什么':你不再需要思考 for 循环怎么写,而是思考业务流程和数据模型是什么。 从'程序员'到'架构师':你的核心价值在于定义系统边界、模块划分和技术选型。 从'编码执行者'到'需求审查员':@Builder with MCP 生成代码后,你需要审查其架构合理性、代码质量和安全性,这比亲手编写每一行代码要求更高。
遵循这些黄金法则,你将能真正释放 @Builder with MCP 的潜力,从一个复杂的代码编写工作中解放出来,专注于更具价值的系统设计和产品创新。
在发出第一条指令前,必须清晰地构想出最终系统的完整蓝图。 低效指令:'帮我做个任务管理系统。'
黄金指令: '构建一个全栈任务管理系统:前端:Vue 3 + Composition API + Element Plus,需要仪表盘、任务列表和用户管理页面。后端:Node.js + Express,提供 RESTful API。数据库:MySQL,需要
users、tasks、teams表,并描述清楚字段和关联关系。核心功能:用户认证、任务 CRUD、任务分配、状态流转。部署:提供 Docker 化 配置。'
**有效的原因:**清晰的蓝图让 @Builder with MCP 能一次性进行正确的技术选型和架构设计,避免后期推倒重来。
在开发具体功能前,先定义好前后端、内外系统之间的'契约'。
黄金指令: '在开始编码前,请先:设计数据库 Schema,给出完整的建表 SQL。基于 Schema,定义出所有后端 API 端点的路径、方法、请求体和响应体格式。根据 API 定义,创建前端的 API Service 层接口文件。'
为什么有效? 这强制你提前思考数据模型和系统交互,确保了前后端并行开发的可行性,MCP 能据此生成高度一致的代码。
不要水平地一次做完所有功能(如先做完全部后端,再做全部前端)。而应按功能模块垂直拆分,逐个完成。
黄金指令: '我们分阶段构建: 阶段一:用户系统后端:创建
users表,实现注册、登录、获取用户列表 API。前端:创建用户登录页面和用户管理页面。 阶段二:任务核心后端:创建tasks表,实现任务的 CRUD API。前端:创建任务列表和任务创建/编辑页面。 阶段三:关联与高级功能建立任务与用户的关联,实现任务分配功能。'
为什么有效? 每个阶段都能产生一个可测试、可演示的成果,快速验证想法,降低复杂项目的风险。
从一开始就严格区分不同环境的配置。
黄金指令: '请为项目配置多环境:
development:使用本地 MySQL,日志级别为 debug。production:使用环境变量读取数据库连接字符串,日志级别为 warn。创建.env.example文件,并确保敏感信息不被提交到代码库。'
为什么有效? MCP 能帮你建立最佳实践,避免'在本地是好的,一上线就崩了'的经典问题,输出生产就绪的代码。
明确指示 @Builder with MCP 去调用具体的 MCP 工具来完成特定任务。
黄金指令: '请使用 MCP 服务器管理工具,通过 SSH 登录到服务器
192.168.1.100,部署刚才构建的后端应用。' '请使用 MCP 的 Git 工具,将当前项目的代码提交到一个新的 Git 仓库,并创建初始提交。'
为什么有效? 这直接利用了 MCP 的核心价值,将自动化从代码生成扩展到整个软件开发生命周期。


添加 MySQL






这是一个专注于 Vue.js 项目的 TRAE @Builder with MCP 智能体实战教程。本教程将通过一个清晰的流程,展示如何利用 @Builder with MCP 将我们的'企业任务管理系统'升级为连接真实 MySQL 数据库的全栈应用。
**项目目标:构建一个'企业任务管理系统'的 Vue + MySQL 项目实战教程,**让 @Builder 能够连接和操作外部工具与数据源,如数据库、API、GitHub 等。此示例项目我是先走第三、四章流程先创建纯前端项目,再来补充后端代码的,实际使用,可先直接从这一步开始,看个人需要随机组合协作。
目标: 将纯前端的 Vue 应用升级为包含 Node.js 后端和 MySQL 数据库的全栈应用。
指令(启动 @Builder with MCP 智能体): '请使用 MCP 能力,为现有的'企业任务管理系统'Vue 项目创建完整的后端架构:
**后端要求:**使用 Node.js + Express 框架连接 MySQL 数据库,创建以下表:
users(id, name, email, position, avatar)tasks(id, title, description, status, priority, assignee_id, due_date, created_at)task_status(id, name, color)提供完整的 RESTful API:GET /api/tasks - 获取任务列表(支持筛选、分页)POST /api/tasks - 创建新任务 PUT /api/tasks/:id - 更新任务 DELETE /api/tasks/:id - 删除任务 GET /api/users - 获取用户列表**数据库配置:**数据库名:task_management 使用 Sequelize ORM 包含数据迁移和种子数据
请同时更新前端 Vue 项目,将所有 Pinia store 改为调用真实 API。'
@Builder with MCP 的行动: 通过 MCP 连接 MySQL:创建数据库连接配置 执行 SQL 脚本 创建数据库和表结构
生成数据库模型:
// backend/models/Task.js
module.exports = (sequelize, DataTypes) => {
const Task = sequelize.define('Task', {
id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
title: { type: DataTypes.STRING, allowNull: false },
description: { type: DataTypes.TEXT, allowNull: true },
status: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 1, // 默认为待处理 references: { model: 'task_status', key: 'id' } },
priority: { type: DataTypes.ENUM('low', 'medium', 'high', 'urgent'), allowNull: false, defaultValue: 'medium' },
assignee_id: { type: DataTypes.INTEGER, allowNull: true, references: { model: 'users', key: 'id' } },
due_date: { type: DataTypes.DATE, allowNull: true },
created_at: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW }
}, { tableName: 'tasks', timestamps: false });
return Task;
};
生成后端项目结构:










目标: 将前端的数据源从模拟数据切换到真实 API。
指令(启动 @Builder with MCP 智能体): '现在请更新前端 Vue 项目:创建
src/services/api.js封装所有 API 调用 改造taskStore和teamStore,移除模拟数据,改为调用后端 API 添加加载状态和错误处理 在main.js中配置 axios 基础 URL'
@Builder with MCP 的行动:
改造 Pinia Store:
// src/stores/taskStore.js
import { defineStore } from 'pinia'
import { taskApi } from '@/services/api'
export const useTaskStore = defineStore('task', {
state: () => ({
tasks: [],
loading: false,
error: null,
filter: { status: '', priority: '', assignee: '' },
pagination: { currentPage: 1, pageSize: 10, total: 0 }
}),
getters: {
filteredTasks: (state) => {
return state.tasks.filter(task => {
let match = true
if (state.filter.status && task.status !== state.filter.status) { match = false }
if (state.filter.priority && task.priority !== state.filter.priority) { match = false }
if (state.filter.assignee && (!task.assignee || task.assignee.id !== parseInt(state.filter.assignee))) { match = false }
return match
})
},
taskStats: (state) => {
const statusMap = { 1: 'pending', 2: 'in_progress', 3: 'completed' }
const stats = { pending: 0, inProgress: 0, completed: 0, total: state.tasks.length }
state.tasks.forEach(task => {
const frontEndStatus = statusMap[task.status] || 'pending'
if (frontEndStatus === 'pending') { stats.pending++ }
else if (frontEndStatus === 'in_progress') { stats.inProgress++ }
else if (frontEndStatus === 'completed') { stats.completed++ }
})
return stats
}
},
actions: {
setFilter(filter) {
this.filter = { ...this.filter, ...filter }
this.fetchTasks()
},
setPagination(currentPage, pageSize) {
this.pagination.currentPage = currentPage
this.pagination.pageSize = pageSize
this.fetchTasks()
},
async fetchTasks() {
this.loading = true
this.error = null
try {
const params = { ...this.filter, page: this.pagination.currentPage, pageSize: this.pagination.pageSize }
const response = await taskApi.getTasks(params)
this.tasks = response.tasks || response
this.pagination.total = response.total || this.tasks.length
} catch (error) {
this.error = error.message
console.error('获取任务列表失败:', error)
} finally {
this.loading = false
}
},
async fetchTaskById(id) {
this.loading = true
this.error = null
try {
return await taskApi.getTaskById(id)
} catch (error) {
this.error = error.message
console.error('获取任务详情失败:', error)
throw error
} finally {
this.loading = false
}
},
async addTask(taskData) {
this.loading = true
this.error = null
try {
const newTask = await taskApi.createTask(taskData)
this.tasks.unshift(newTask)
this.pagination.total++
return newTask
} catch (error) {
this.error = error.message
console.error('创建任务失败:', error)
throw error
} finally {
this.loading = false
}
},
async updateTask(id, updates) {
this.loading = true
this.error = null
try {
const updatedTask = await taskApi.updateTask(id, updates)
const index = this.tasks.findIndex(task => task.id === id)
if (index !== -1) { this.tasks[index] = { ...this.tasks[index], ...updatedTask } }
return updatedTask
} catch (error) {
this.error = error.message
console.error('更新任务失败:', error)
throw error
} finally {
this.loading = false
}
},
async deleteTask(id) {
this.loading = true
this.error = null
try {
await taskApi.deleteTask(id)
const index = this.tasks.findIndex(task => task.id === id)
if (index !== -1) { this.tasks.splice(index, 1); this.pagination.total-- }
return true
} catch (error) {
this.error = error.message
console.error('删除任务失败:', error)
throw error
} finally {
this.loading = false
}
},
async fetchTaskStats() {
try {
return await taskApi.getTaskStats()
} catch (error) {
console.error('获取任务统计失败:', error)
return this.taskStats
}
}
}
})
创建 API 服务层:
// src/services/api.js
import axios from 'axios';
const api = axios.create({
timeout: 10000,
headers: { 'Content-Type': 'application/json' }
});
api.interceptors.request.use(config => config, error => Promise.reject(error));
api.interceptors.response.use(
response => response.data,
error => {
console.error('API Error:', error);
let errorMessage = '请求失败';
if (error.response) {
switch (error.response.status) {
case 401: errorMessage = '未授权,请重新登录'; break;
case 403: errorMessage = '拒绝访问'; break;
case 404: errorMessage = '请求的资源不存在'; break;
case 500: errorMessage = '服务器错误'; break;
default: errorMessage = error.response.data?.message || '请求失败';
}
} else if (error.request) {
errorMessage = '网络错误,请检查您的网络连接';
}
return Promise.reject(new Error(errorMessage));
}
);
export const taskApi = {
getTasks: (params = {}) => api.get('/api/tasks', { params }),
getTaskById: (id) => api.get(`/api/tasks/${id}`),
createTask: (taskData) => api.post('/api/tasks', taskData),
updateTask: (id, taskData) => api.put(`/api/tasks/${id}`, taskData),
deleteTask: (id) => api.delete(`/api/tasks/${id}`),
getTaskStats: () => api.get('/api/tasks/stats')
};
export const userApi = {
getUsers: () => api.get('/api/users'),
getUserById: (id) => api.get(`/api/users/${id}`)
};
export default api;


目标: 实现复杂的数据库查询和业务逻辑。
指令(启动 @Builder with MCP 智能体): '请为任务系统添加以下高级功能:任务统计 API:
GET /api/dashboard/stats- 返回总任务数、各状态任务数、逾期任务数任务评论功能:创建comments表,支持对任务添加评论文件附件:创建attachments表,支持任务文件上传数据库事务:确保相关操作的数据一致性'
@Builder with MCP 的行动: 创建 API:


目标: 优化数据库性能和添加监控功能。
指令(启动 @Builder with MCP 智能体): '请为系统添加数据库优化措施:为常用查询字段添加数据库索引 实现数据库查询性能监控 添加数据备份机制 实现数据库连接池配置'
@Builder with MCP 的行动:
配置数据库连接池:
// backend/config/config.js
{
"development": {
"username": "root",
"password": "password",
"database": "task_management",
"host": "127.0.0.1",
"dialect": "mysql",
"define": { "timestamps": true },
"pool": { "max": 10, "min": 0, "acquire": 30000, "idle": 10000 },
"logging": true
},
"test": {
"username": "root",
"password": "password",
"database": "task_management_test",
"host": "127.0.0.1",
"dialect": "mysql",
"pool": { "max": 10, "min": 0, "acquire": 30000, "idle": 10000 },
"logging": false
},
"production": {
"username": "root",
"password": "password",
"database": "task_management",
"host": "127.0.0.1",
"dialect": "mysql",
"pool": { "max": 20, "min": 2, "acquire": 60000, "idle": 20000 },
"logging": false
}
}
通过 MCP 执行索引优化:
-- backend\migrations\20230101000005-add-indexes.js
-- 为表的常用查询字段添加索引
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.addIndex('tasks', ['status'], { name: 'idx_tasks_status' });
await queryInterface.addIndex('tasks', ['priority'], { name: 'idx_tasks_priority' });
await queryInterface.addIndex('tasks', ['assignee_id'], { name: 'idx_tasks_assignee_id' });
await queryInterface.addIndex('tasks', ['due_date'], { name: 'idx_tasks_due_date' });
await queryInterface.addIndex('tasks', ['created_at'], { name: 'idx_tasks_created_at' });
await queryInterface.addIndex('comments', ['task_id'], { name: 'idx_comments_task_id' });
await queryInterface.addIndex('comments', ['user_id'], { name: 'idx_comments_user_id' });
await queryInterface.addIndex('comments', ['created_at'], { name: 'idx_comments_created_at' });
await queryInterface.addIndex('attachments', ['task_id'], { name: 'idx_attachments_task_id' });
await queryInterface.addIndex('attachments', ['user_id'], { name: 'idx_attachments_user_id' });
await queryInterface.addIndex('users', ['email'], { name: 'idx_users_email', unique: true });
await queryInterface.addIndex('users', ['name'], { name: 'idx_users_name' });
},
down: async (queryInterface) => {
await queryInterface.removeIndex('tasks', 'idx_tasks_status');
await queryInterface.removeIndex('tasks', 'idx_tasks_priority');
await queryInterface.removeIndex('tasks', 'idx_tasks_assignee_id');
await queryInterface.removeIndex('tasks', 'idx_tasks_due_date');
await queryInterface.removeIndex('tasks', 'idx_tasks_created_at');
await queryInterface.removeIndex('comments', 'idx_comments_task_id');
await queryInterface.removeIndex('comments', 'idx_comments_user_id');
await queryInterface.removeIndex('comments', 'idx_comments_created_at');
await queryInterface.removeIndex('attachments', 'idx_attachments_task_id');
await queryInterface.removeIndex('attachments', 'idx_attachments_user_id');
await queryInterface.removeIndex('users', 'idx_users_email');
await queryInterface.removeIndex('users', 'idx_users_name');
}
};


目标: 准备生产环境的数据和部署配置。
指令(启动 @Builder with MCP 智能体): '请准备生产环境部署:创建数据库迁移脚本 生成生产环境的数据种子 创建 Docker 配置文件 设置环境变量配置'
@Builder with MCP 的行动:
创建 Docker 配置:
# backend/Dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN mkdir -p logs backups
ENV NODE_ENV=production
ENV PORT=3000
EXPOSE 3000
CMD ["npm", "start"]
创建数据库迁移:
// backend\migrations\20230101000006-production-migration.js
module.exports = {
up: async (queryInterface, Sequelize) => {
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.createTable('task_statuses', {
id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER },
name: { type: Sequelize.STRING, allowNull: false, unique: true },
created_at: { allowNull: false, type: Sequelize.DATE },
updated_at: { allowNull: false, type: Sequelize.DATE }
}, { transaction });
await queryInterface.createTable('users', {
id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER },
name: { type: Sequelize.STRING, allowNull: false },
email: { type: Sequelize.STRING, allowNull: false, unique: true },
role: { type: Sequelize.STRING, allowNull: false, defaultValue: 'user' },
created_at: { allowNull: false, type: Sequelize.DATE },
updated_at: { allowNull: false, type: Sequelize.DATE }
}, { transaction });
await queryInterface.createTable('tasks', {
id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER },
title: { type: Sequelize.STRING, allowNull: false },
description: { type: Sequelize.TEXT },
status: { type: Sequelize.INTEGER, allowNull: false, references: { model: 'task_statuses', key: 'id' } },
priority: { type: Sequelize.ENUM('low', 'medium', 'high', 'urgent'), allowNull: false, defaultValue: 'medium' },
assignee_id: { type: Sequelize.INTEGER, references: { model: 'users', key: 'id' } },
due_date: { type: Sequelize.DATE },
created_at: { allowNull: false, type: Sequelize.DATE },
updated_at: { allowNull: false, type: Sequelize.DATE }
}, { transaction });
await queryInterface.createTable('comments', {
id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER },
content: { type: Sequelize.TEXT, allowNull: false },
task_id: { type: Sequelize.INTEGER, allowNull: false, references: { model: 'tasks', key: 'id', onDelete: 'CASCADE' } },
user_id: { type: Sequelize.INTEGER, allowNull: false, references: { model: 'users', key: 'id' } },
created_at: { allowNull: false, type: Sequelize.DATE }
}, { transaction });
await queryInterface.createTable('attachments', {
id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER },
filename: { type: Sequelize.STRING, allowNull: false },
filepath: { type: Sequelize.STRING, allowNull: false },
filesize: { type: Sequelize.INTEGER, allowNull: false },
filetype: { type: Sequelize.STRING, allowNull: false },
task_id: { type: Sequelize.INTEGER, allowNull: false, references: { model: 'tasks', key: 'id', onDelete: 'CASCADE' } },
user_id: { type: Sequelize.INTEGER, allowNull: false, references: { model: 'users', key: 'id' } },
created_at: { allowNull: false, type: Sequelize.DATE }
}, { transaction });
await queryInterface.addIndex('tasks', ['status'], { name: 'idx_tasks_status', transaction });
await queryInterface.addIndex('tasks', ['priority'], { name: 'idx_tasks_priority', transaction });
await queryInterface.addIndex('tasks', ['assignee_id'], { name: 'idx_tasks_assignee_id', transaction });
await queryInterface.addIndex('tasks', ['due_date'], { name: 'idx_tasks_due_date', transaction });
await queryInterface.addIndex('tasks', ['created_at'], { name: 'idx_tasks_created_at', transaction });
await queryInterface.addIndex('comments', ['task_id'], { name: 'idx_comments_task_id', transaction });
await queryInterface.addIndex('comments', ['user_id'], { name: 'idx_comments_user_id', transaction });
await queryInterface.addIndex('comments', ['created_at'], { name: 'idx_comments_created_at', transaction });
await queryInterface.addIndex('attachments', ['task_id'], { name: 'idx_attachments_task_id', transaction });
await queryInterface.addIndex('attachments', ['user_id'], { name: 'idx_attachments_user_id', transaction });
await queryInterface.addIndex('users', ['email'], { name: 'idx_users_email', unique: true, transaction });
await queryInterface.addIndex('users', ['name'], { name: 'idx_users_name', transaction });
await transaction.commit();
} catch (error) {
await transaction.rollback();
throw error;
}
},
down: async (queryInterface) => {
await queryInterface.dropTable('attachments');
await queryInterface.dropTable('comments');
await queryInterface.dropTable('tasks');
await queryInterface.dropTable('users');
await queryInterface.dropTable('task_statuses');
}
};

















整个前后端分离环境架构已部署好,后面就是优化细节了!
TRAE @Builder 智能体:从想法到成品的项目构建引擎 @Builder 智能体,特别是其 SOLO 模式,核心价值在于处理更宏观、更复杂的项目初始化与构建任务。它能将你的自然语言描述或一张设计图,直接转化成一个可运行的项目骨架。如果说 @Chat 智能体是一个强大的编程伙伴,那么 @Builder 智能体就是一位能够自主完成整个项目搭建的'项目总监'。

| 特性 | @Builder 智能体 (SOLO 模式) | @Chat 智能体 |
|---|---|---|
| 任务粒度 | 项目级/功能级:创建整个应用、完整页面 | 文件/代码块级:修改函数、解释代码、修复错误 |
| 交互模式 | 目标驱动:你提供'做什么',它决定'怎么做'并执行。 | 指令驱动:你一步步下达'怎么做'的指令。 |
| 输出结果 | 完整的、结构化的项目文件、配置和可运行的代码库。 | 代码片段、建议、解释,需要你手动整合。 |
| 最佳场景 | 项目冷启动、原型开发、从设计稿到代码 | 日常编码、调试、迭代优化、学习代码 |
简单比喻:我想盖房子。找 @Builder:我给它一张房屋设计图,它直接给我打好地基、搭好框架、建好毛坯房。找 @Chat:我告诉它'这里砌一堵墙'、'那里装一扇窗',它给我砖头和窗户,我来砌。
@Builder 智能体彻底改变了项目启动的方式。我们的核心技能不再是编写每一行代码,而是精准地定义问题、描述需求和验收成果。通过将重复性的搭建工作交给 @Builder,我们可以将宝贵的时间投入到更具创造性的架构设计和业务逻辑实现中。 目标清晰,描述具体:不佳:'做个好看的网站。'优秀:'创建一个单页作品集,包含关于我、项目展示(网格布局)、博客文章列表(时间线布局)和联系方式,使用 Tailwind CSS 框架。' 分步构建,由粗到精:对于极其复杂的项目,不要试图一蹴而就。先用 @Builder 搭建'毛坯房'(项目骨架和基础功能),再用 @Chat 进行'精装修'(样式优化、复杂逻辑)。第一阶段:'先用 @Builder 搭建一个只包含路由和空白页面的基础框架。'第二阶段:'现在,请专门为'项目展示'页面生成详细的卡片网格 UI 和模拟数据。' 善用视觉输入:一张设计图抵得上千言万语。@Builder 的多模态能力能极大提升还原度。 理解其局限性:@Builder 生成的通常是'毛坯房'(高质量的原型),复杂的业务逻辑、API 对接和极致的性能优化,仍需我们借助 @Chat 智能体或手动编码来完成。 技术栈声明前置:在给 @Builder 的初始指令中,必须明确 Vue 3, Composition API,
<script setup>,状态管理库和 UI 组件库,这是生成高质量、符合你习惯代码的关键。 数据管理要明确:明确要求 @Builder 使用 Pinia 来管理模拟数据,这能保证项目结构清晰,数据流可控。 善用'组合智能体'工作流:这是最高效的工作流。@Builder 负责'从 0 到 1'的创造:快速搭建项目骨架和页面原型。@Chat 负责'从 1 到 N'的优化:在此基础上进行功能迭代、代码优化和问题修复。
这是一个专注于 Vue.js 项目的 TRAE @Builder 智能体实战教程。本教程将通过一个清晰的流程,展示如何利用 @Builder 从零开始,快速构建一个完整的 Vue 应用。
项目目标:构建一个'企业任务管理系统'的 Vue 前端原型,包含仪表盘、任务列表和团队页面。
指令(启动 @Builder 智能体): '请使用 SOLO 模式,为我创建一个 Vue 3 企业任务管理系统的前端项目。 核心要求: 技术栈: Vue 3 +
<script setup>+ Vite + Vue Router + Pinia + Element Plus。 页面结构: 仪表盘 (/dashboard): 展示统计卡片和近期任务概览。 任务列表 (/tasks): 以表格形式展示所有任务,支持筛选和分页。 团队 (/team): 展示团队成员列表。 布局: 使用经典的左侧导航栏 + 右侧主内容区的布局。 数据: 使用 Pinia 管理应用状态,并为每个页面生成模拟数据。 样式: 整体风格要求专业、简洁,符合企业管理系统的气质。'
@Builder 智能体的行动与输出: 项目规划: 分析需求,生成一个详细的项目结构图。 初始化项目: 创建
package.json,并安装指定的所有依赖(Vue, Vite, Vue Router, Pinia, Element Plus)。 生成核心文件:src/main.js:初始化 Vue 应用,并集成 Router, Pinia 和 Element Plus。src/App.vue:作为应用根组件,包含主要的布局结构。src/layouts/DefaultLayout.vue:实现要求的左侧导航 + 右侧内容的布局。导航菜单包含'仪表盘'、'任务'、'团队'的链接。src/router/index.js:配置好三个页面的路由。src/stores/app.js:创建一个 Pinia Store,用于管理全局状态(例如用户信息、侧边栏折叠状态)。
此时,@Builder 已经交付了一个可运行的项目骨架。可以立即执行
npm run dev看到一个带有导航布局的基础应用。











系统初步设计已完成,打开系统网址:http://127.0.0.1:5173/



现在,让 @Builder 为每个页面填充具体内容。
指令(启动 @Builder 智能体): '很好,基础骨架已经完成。现在请为三个主要页面生成具体的 UI 内容和模拟数据:**仪表盘页面 (
/dashboard):**顶部放置三个统计卡片:总任务数、进行中任务数、已完成任务数。下方展示一个'近期任务'列表,显示任务名、负责人和截止日期。**任务列表页面 (/tasks):**使用 ElTable 展示任务,列包括:ID、任务名称、状态、优先级、负责人、截止日期。顶部提供筛选栏,可以根据任务状态进行筛选。实现分页功能。**团队页面 (/team):**使用卡片网格展示团队成员,每个卡片包含成员头像、姓名、职位和邮箱。数据层: 请在 Pinia 中创建一个taskStore和一个teamStore来集中管理这些模拟数据。'
@Builder 智能体的行动与输出: 创建 Store:
src/stores/taskStore.js:定义tasks状态,并生成模拟的任务数据数组。包含fetchTasks,updateTask等动作。src/stores/teamStore.js:定义members状态,并生成模拟的团队成员数据。 生成页面组件:src/views/DashboardView.vue:从taskStore中获取数据。使用 ElRow 和 ElCol 布局三个 ElCard 统计卡片。使用 ElTable 展示近期任务列表。src/views/TasksView.vue:从taskStore中获取任务列表。使用 ElTable 并绑定 Store 中的数据,配置好分页。使用 ElSelect 作为状态筛选器。src/views/TeamView.vue:从teamStore中获取成员列表。使用 ElRow 和 ElCol 循环生成多个 ElCard 来展示成员信息。
此时,再次预览应用,会发现它已经是一个功能完整、数据充盈的原型了,具备了企业管理系统的核心外观。







**1. 预览与发现问题:**发现'仪表盘'的统计卡片样式比较普通,希望更突出。
**2. 切换至 @Chat 智能体进行精细调整:**打开 src/views/DashboardView.vue 文件
指令(启动 @Chat 智能体):'请优化这个仪表盘页面中三个统计卡片的样式。让它们背景色采用渐变色,数字字体更大更粗,并添加一个对应的图标(例如:总任务数用
el-icon-document)。'
@Chat 智能体会直接修改该文件中的模板和样式代码,实现要求。





**3. 使用 @Builder 添加新功能:**现在,需要一个'任务详情'页面。
指令(启动 @Builder 智能体): '请在现有项目中增加一个'任务详情'页面。路由为
/task/:id。当在任务列表点击某个任务名时,应能跳转到该详情页。详情页需要展示该任务的所有信息,并提供一个'编辑'按钮(功能待实现)。请同时更新路由和任务列表的链接。'
@Builder 智能体的行动与输出: 创建
src/views/TaskDetailView.vue组件。更新src/router/index.js,添加动态路由。修改TasksView.vue中的任务名列,将其变为一个指向详情页的RouterLink。







TRAE 中的 Chat 智能体是整个 IDE 的智能中枢,它超越了简单的聊天机器人,是一个能理解整个项目上下文、并执行具体操作的编程伙伴。

自然语言编程:用日常语言描述项目代码设计的需求,智能体会生成相应的代码。 代码解释与调试:选中不理解的代码或报错,让它解释或提供修复方案。 项目上下文感知:它能基于整个项目的代码库进行回答和操作,理解项目架构和风格。 自动化重构:提出代码优化建议,并直接帮忙完成重构。 文件与资源操作:根据问题指令创建新文件、安装依赖、甚至启动开发服务器。
将 TRAE 的 Chat 智能体当作一个能力超群、不知疲倦的编程伙伴。核心任务是从'写代码'转变为'提需求、做审查和定方向'。通过清晰的指令和迭代式的对话,将能极大地提升开发效率,将精力集中在架构设计和业务逻辑等更有创造性的工作上。 上下文是关键:提供充足背景:在提问前,确保智能体已经加载了指定项目(TRAE 通常会自动完成)。在复杂问题上,可以在问题中说'参考一下
utils/api.js文件里的格式'。精准描述:与其说'这里出错了',不如说'这个函数在用户登录时抛出了类型错误,请看LoginForm.js第 25 行附近的handleSubmit函数'。迭代式精炼:从静态数据到动态交互,从基础功能到高级功能,一步步地向智能体提出需求。不要试图在一个指令中完成所有事情。将智能体视为一个实习生,先让它搭出框架,然后再一步步提出修改要求,使其不断完善。示例流程:'创建一个按钮' -> '给按钮加一个加载状态' -> '点击按钮时调用这个 API'。善用指令与快捷方式:TRAE 通常支持一些快捷指令,如/test(为这段代码生成测试)、/explain(详细解释)、/fix(尝试自动修复)。留意官方文档中的特定指令。明确技术栈:在指令中开头就声明'使用 Vue 3 + Composition API + <script setup>',让智能体生成最符合个人习惯的代码。善用组件库:直接要求智能体使用Element Plus、Ant Design Vue等知名组件库来重构 UI,能极大提升开发效率和界面美观度。让智能体调试:遇到任何错误或警告,直接将错误信息复制给智能体,并说明上下文,它不仅能修复,还能解释报错原因。结合 SOLO 模式进行飞跃:对于更宏大的任务,直接使用 SOLO 模式。可以上传一张设计图或提供一个产品链接,然后说'参考这张设计图,在我的项目中搭建一个类似的主页 UI。'SOLO 模式的 Builder 智能体会尝试自动分析并生成整个页面的代码框架,再通过 Chat 智能体进行微调。
这是一个 Vue.js 项目的 TRAE Chat 智能体实战使用教程。在 @Builder 智能体搭建的'企业任务管理系统'基础上,使用 @Chat 智能体 进行深度优化和功能增强。 当前状态: @Builder 已生成基础系统,包含仪表盘、任务列表、团队页面和基础布局。
目标: 为任务列表添加编辑、状态快速更改和高级筛选功能。
1. 实现行内编辑功能
指令(启动 @Chat 智能体): '在
Tasks.vue的任务表格中,我希望可以点击'任务名称'直接进行编辑。请实现:当点击任务名称时,变为输入框,编辑完成后按回车或失去焦点保存到 store。'
@Chat 智能体的行动:在
taskStore中添加updateTaskaction 修改表格列,为任务名称添加el-input和编辑状态控制 实现编辑逻辑和保存功能




2. 添加快速状态更改按钮
指令(启动 @Chat 智能体): '在任务表格的操作列中,添加'开始'、'完成'、'重新打开'的快速操作按钮。根据任务状态显示不同的按钮,点击后直接更新任务状态。'
@Chat 智能体的行动:在
taskStore中添加changeTaskStatusaction 在操作列中添加条件渲染的按钮 实现状态转换逻辑





目标: 在仪表盘添加图表,直观展示任务数据。
添加任务状态分布饼图
指令(启动 @Chat 智能体): '在仪表盘页面的统计卡片下方,添加一个 ECharts 饼图,展示任务状态分布(待处理、进行中、已完成)。请安装 ECharts 依赖并集成到 Vue 中。'
@Chat 智能体的行动:安装
echarts和vue-echarts依赖 在DashboardView.vue中集成饼图组件 从 store 中计算状态分布数据










1. 实现任务拖拽排序
指令(启动 @Chat 智能体): '在任务列表页面,我希望可以通过拖拽来调整任务的显示顺序。请使用 Sortable.js 实现表格行的拖拽排序功能。'
@Chat 智能体的行动:安装
sortablejs依赖 在表格挂载后初始化 Sortable.js 实现拖拽结束后的数据更新逻辑





2. 添加数据导出功能
指令(启动 @Chat 智能体): '在任务列表页面顶部添加一个'导出 Excel'按钮,点击后可以将当前筛选的任务数据导出为 CSV 格式文件。'
@Chat 智能体的行动:实现 CSV 格式转换函数 创建 Blob 对象并触发下载 添加导出按钮和点击事件















微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online