🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度
如果你是一名前端开发者,最近是否经常被这样的问题困扰:面对一个不算复杂的中后台增删改查需求,从设计数据库表、写后端接口、再到前端页面联调,明明每个环节都驾轻就熟,但整个流程走下来,依然要耗费数周甚至一个月的时间?大量的重复性劳动、不同技术栈间的上下文切换、以及确保代码质量的审查工作,构成了开发效率的隐形天花板。
更令人焦虑的是,当 AI 编程工具如雨后春笋般涌现,我们兴奋地尝试,却常常失望地发现:生成的代码要么是“玩具级”的片段,无法直接集成到现有工程;要么前后端逻辑纠缠,缺乏架构约束;要么需要反复进行“需求描述-生成-调试”的多轮对话,效率提升并不明显。我们不禁要问:AI 编码的承诺,距离真正的“生产级提效”到底还有多远?
本文要分享的,正是一套能直接将答案落地的实战方案。它并非空谈概念,而是融合了Codex的代码生成能力与Spec Coding的规范驱动思想,形成了一套名为“Rules + Spec + Skills”的三位一体全栈 AI Coding 架构。核心目标非常明确:将传统需要一个月工期的全栈功能开发,压缩到半小时级别的原型产出。这不是魔法,而是通过一套可复制、可扩展的工程化方法,将 AI 从“聪明的代码补全工具”升级为“受控的自动化研发伙伴”。
接下来,我将彻底拆解这套方法。你会看到如何从零搭建环境,如何定义前后端分离的规范(Spec),如何配置 AI 的技能(Skills)与规则(Rules),并最终通过一个完整的“用户管理模块”案例,见证 AI 如何根据一份清晰的“规格说明书”,自动生成可直接运行、符合团队架构约束的前后端代码。对于渴望突破效率瓶颈、尤其是希望从前端迈向全栈的开发者而言,这是一条值得深入探索的路径。
1. 核心问题:为什么单纯的 AI 提示词无法写出生产级代码?
在深入方案之前,我们必须先认清现状与核心矛盾。当前大多数开发者使用 AI 编程(如 ChatGPT、Cursor、Codeium)的方式,可以概括为“对话式编程”:开发者用自然语言描述需求,AI 返回代码片段。这种方式在解决独立、简单的算法题或编写工具函数时效果显著,但一旦涉及完整的全栈功能,立刻暴露出三大致命伤:
1. 需求理解偏差与上下文丢失:AI 没有项目全局视图。你让它“生成一个用户列表页面”,它不知道你的后端 API 路径是什么、返回的数据结构如何、团队约定的组件库是 Ant Design 还是 Element Plus。结果就是生成一个“通用”页面,你需要花费大量时间手动修改接口地址、字段映射和样式,这本质上只是把“写代码”的时间转移到了“改代码”上。
2. 代码质量不可控与架构腐蚀:AI 倾向于在一个文件里堆砌所有逻辑,容易产生“面条式代码”。例如,它可能把 API 请求、状态管理、表单验证和表格渲染全部写在一个 Vue 组件或 React 函数里,完全无视团队推崇的“关注点分离”和分层架构。长期如此,项目将迅速变得难以维护。
3. 前后端耦合与联调成本:最典型的场景是,AI 生成了前端页面,但后端接口需要你另起一个对话重新描述生成,两者之间的数据契约(请求参数、响应格式)极易出现不一致。联调阶段发现字段名对不上、分页参数不匹配等问题,又需要来回修正,效率大打折扣。
这些问题的根源在于,我们默认 AI 具备“全栈架构师”的思维,但实际上它只是一个强大的“模式匹配与生成器”。Spec Coding 的核心思想,就是通过提供一份机器可读的、结构化的“规格说明书”(Specification),来约束和引导 AI 的生成过程,使其输出符合特定工程规范和质量要求的代码。而 Codex 或类似的大模型,则是执行这份“说明书”的引擎。
2. 概念基石:理解 Rules、Spec、Skills 三位一体架构
来自淘宝闪购团队的实践为我们指明了方向。他们提出的“Rules + Spec + Skills”架构,精准地划分了 AI 编码中的责任边界。我们可以这样理解:
Rules(规则):这是项目的“宪法”。它定义了最高层级的约束,与具体业务功能无关,但贯穿所有代码生成过程。例如:
- 技术栈规则:前端必须使用 Vue 3 + Composition API + TypeScript;后端必须使用 Spring Boot 2.7+;数据库使用 MySQL。
- 代码风格规则:必须遵循 ESLint (Airbnb) 和 Prettier 配置;接口命名必须为 RESTful 风格。
- 架构约束规则:前后端必须完全分离,通过 API 交互;前端必须使用 Pinia 进行状态管理;后端 Controller、Service、Mapper 必须分层。
- 安全规则:所有 API 必须进行鉴权;用户输入必须经过验证和转义。 Rules 通常以配置文件、项目根目录的约定或 AI 系统提示词(System Prompt)的组成部分存在。
Spec(规格):这是当前开发任务的“蓝图”或“合同”。它描述了一个具体功能模块的完整需求,是连接产品需求与代码的桥梁。一份好的 Spec 应该是结构化的 JSON 或 YAML 文件,包含:
- 模块名称与描述:如“用户管理模块”。
- 数据模型(Data Model):定义数据库表字段、类型、约束、关联关系。
- API 接口定义:每个接口的路径、方法、请求参数结构、响应数据结构、可能的错误码。
- 前端页面描述:页面类型(列表页、表单页、详情页)、需要的组件(搜索框、表格、分页、弹窗表单)、交互逻辑(查询、新增、编辑、删除)。
- 业务规则:如“状态为‘禁用’的用户不能登录”。 Spec 是 AI 生成代码的直接依据,也是前后端开发者的共同契约。
Skills(技能):这是 AI 的“工具包”或“最佳实践模板”。它封装了针对特定技术栈或常见场景的、经过验证的代码模式。例如:
- “生成 Spring Boot CRUD Controller”技能:输入一个实体类名和 Spec,能输出符合项目规范、包含基础增删改查接口的 Controller 代码。
- “生成 Vue 3 Table Page with Search”技能:输入 API 路径和字段配置,能输出一个包含查询表单、数据表格和分页的完整 Vue 组件。
- “生成数据库 Migration 脚本”技能:根据 Spec 中的数据模型,生成创建或修改表的 SQL 文件。 Skills 将重复的编码模式固化下来,确保 AI 每次生成的代码不仅正确,而且符合团队的最佳实践。
三者的关系:Rules划定边界,Spec提供目标,Skills提供实现模板。AI 在Rules的约束下,运用相关的Skills,去实现Spec描述的功能。这才是实现“可控的、高质量的全栈代码生成”的关键。
3. 环境准备:搭建你的 AI 全栈开发工作台
理论需要实践来验证。我们首先搭建一个最小化的实验环境。为了聚焦于方法论,我们选择当前最易用、最贴近此理念的工具组合:Cursor + 自定义配置。你也可以使用任何支持类似功能的 IDE 插件或平台。
核心工具栈:
- 代码编辑器/IDE:Cursor (内置基于 GPT-4 的 AI 助手,支持项目级上下文和自定义指令)。
- 版本管理:Git。
- 前端框架:Vue 3 + TypeScript + Vite + Element Plus (示例用,可替换为你的技术栈)。
- 后端框架:Spring Boot 2.7 + MyBatis-Plus + MySQL (示例用,可替换)。
- API 调试:Apifox 或 Postman (用于测试生成的 API)。
环境搭建步骤:
- 安装 Cursor:从官网下载并安装 Cursor。它本质上是一个深度集成 AI 的 VS Code 分支。
- 创建项目目录:
mkdir ai-fullstack-demo cd ai-fullstack-demo - 初始化前后端项目(或使用现有项目):
- 前端:
npm create vue@latest选择 TypeScript, Pinia, Router 等。 - 后端:使用 Spring Initializr 生成一个包含 Web, MyBatis-Plus, MySQL Driver 的项目。 将生成的前端和后端代码分别放入
frontend和backend目录。
- 前端:
- 配置 Cursor 项目级规则(.cursorrules):在项目根目录创建
.cursorrules文件。这是 Cursor 特有的功能,用于定义项目级的 AI 行为约束,完美对应我们的Rules。
这个文件是控制 AI 行为的核心,它确保了 AI 在项目内的任何对话都遵循统一的工程规范。# .cursorrules - 全栈项目 AI 编码规则 ## 项目概述 这是一个基于 Vue 3 (前端) 和 Spring Boot (后端) 的全栈演示项目。AI 助手在生成代码时必须严格遵守以下规则。 ## 前端规则 (Frontend Rules) 1. **技术栈**:必须使用 Vue 3 + Composition API + `<script setup>` 语法 + TypeScript。 2. **UI 库**:必须使用 Element Plus 组件库。按需导入组件。 3. **状态管理**:必须使用 Pinia。每个模块对应一个 store。 4. **HTTP 客户端**:必须使用 Axios,且已配置基础实例 (`src/utils/request.ts`)。 5. **API 交互**:所有数据请求必须通过 `src/api/` 目录下的模块化 API 文件发起。 6. **代码风格**:必须遵循项目已有的 ESLint 和 Prettier 配置。 7. **组件规范**:页面组件放在 `src/views/`,通用组件放在 `src/components/`。组件必须使用 `defineComponent` 或 `<script setup>`。 ## 后端规则 (Backend Rules) 1. **技术栈**:必须使用 Spring Boot 2.7.x, Java 17。 2. **架构分层**:必须遵循 Controller -> Service -> Mapper 分层结构。 - Controller: 处理 HTTP 请求/响应,调用 Service。 - Service: 实现业务逻辑,调用 Mapper。 - Mapper: 使用 MyBatis-Plus 进行数据库操作。 3. **实体类**:必须使用 Lombok `@Data` 注解,并对应数据库表。 4. **API 规范**:必须使用 RESTful 风格。统一返回格式为 `Result<T>`。 5. **数据库**:使用 MySQL, 表名和字段名使用下划线命名。 6. **包结构**:代码必须放在 `com.example.demo.module.[模块名]` 下对应的 `controller`, `service`, `mapper`, `entity` 包中。 ## 通用规则 (General Rules) 1. 生成代码前,必须先理解整个项目的上下文和现有代码结构。 2. 每次生成一个完整的、可运行的特性,优先保证前后端契约一致。 3. 如果涉及修改现有文件,必须说明修改原因和位置。 4. 对于复杂逻辑,优先生成清晰、可读的代码,而不是最简短的代码。
至此,你的“AI 全栈工作台”就准备好了。接下来,我们将进入最关键的环节:如何编写一份机器能懂的“需求说明书”(Spec)。
4. 实战核心:如何编写一份机器可读的 Spec(规格说明书)
Spec 是连接需求与代码的桥梁。它的质量直接决定 AI 生成代码的可用性。我们以开发一个“用户管理”模块为例,编写一份结构化的 Spec。
创建一个名为specs/user-management.spec.yaml的文件(YAML 格式更易读):
# specs/user-management.spec.yaml module: user_management description: 系统用户管理功能,支持用户的增删改查及状态控制。 version: 1.0 # 1. 数据模型 (Data Model) data_model: table_name: sys_user fields: - name: id type: bigint primary_key: true auto_increment: true comment: 主键ID - name: username type: varchar(50) nullable: false unique: true comment: 用户名 - name: nickname type: varchar(100) nullable: true comment: 用户昵称 - name: email type: varchar(100) nullable: true comment: 邮箱 - name: status type: tinyint default: 1 comment: "状态:0-禁用,1-启用" - name: create_time type: datetime default: CURRENT_TIMESTAMP comment: 创建时间 - name: update_time type: datetime default: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment: 更新时间 # 2. API 接口定义 (API Specifications) apis: # 用户分页列表查询 - name: getUserList method: GET path: /api/users description: 查询用户列表(支持分页和条件查询) request: query_params: - name: pageNum type: integer required: false default: 1 description: 页码 - name: pageSize type: integer required: false default: 10 description: 每页条数 - name: username type: string required: false description: 用户名(模糊查询) - name: status type: integer required: false description: 状态 response: success: code: 200 data: total: integer list: - id: long username: string nickname: string email: string status: integer createTime: string # ISO 8601 message: "success" business_rules: - 默认按创建时间倒序排列。 # 新增用户 - name: createUser method: POST path: /api/users description: 创建新用户 request: body: type: object properties: username: type: string required: true minLength: 3 maxLength: 50 nickname: type: string required: false email: type: string format: email required: false status: type: integer enum: [0, 1] default: 1 response: success: code: 200 data: null message: "创建成功" error: - code: 400 message: "用户名已存在" # 更新用户 - name: updateUser method: PUT path: /api/users/{id} description: 更新用户信息 request: path_params: - name: id type: long required: true body: type: object properties: nickname: type: string email: type: string format: email status: type: integer enum: [0, 1] response: success: code: 200 data: null message: "更新成功" # 删除用户 - name: deleteUser method: DELETE path: /api/users/{id} description: 删除用户(逻辑删除或物理删除) request: path_params: - name: id type: long required: true response: success: code: 200 data: null message: "删除成功" # 3. 前端页面描述 (Frontend UI Spec) frontend_ui: page_title: "用户管理" page_type: "CRUD_LIST_AND_FORM" layout: "BasicLayout" # 假设项目有基础布局 components: - type: "SearchForm" fields: - field: "username" label: "用户名" component: "ElInput" placeholder: "请输入用户名" - field: "status" label: "状态" component: "ElSelect" options: - { label: "全部", value: null } - { label: "启用", value: 1 } - { label: "禁用", value: 0 } actions: - type: "query" text: "查询" - type: "reset" text: "重置" - type: "DataTable" columns: - prop: "id" label: "ID" width: 80 - prop: "username" label: "用户名" - prop: "nickname" label: "昵称" - prop: "email" label: "邮箱" - prop: "status" label: "状态" formatter: "statusFormatter" # 需要将后端 0/1 转为“禁用/启用”显示 - prop: "createTime" label: "创建时间" row_actions: - type: "edit" text: "编辑" api: "updateUser" - type: "delete" text: "删除" api: "deleteUser" confirm: true - type: "Pagination" align: "right" - type: "ModalForm" title_add: "新增用户" title_edit: "编辑用户" form_items: - field: "username" label: "用户名" component: "ElInput" rules: [{ required: true, message: '请输入用户名', trigger: 'blur' }] - field: "nickname" label: "昵称" component: "ElInput" - field: "email" label: "邮箱" component: "ElInput" rules: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }] - field: "status" label: "状态" component: "ElRadioGroup" options: - { label: "启用", value: 1 } - { label: "禁用", value: 0 }这份 Spec 清晰地定义了数据模型、API 契约和前端界面。它不包含任何具体的实现代码,但包含了生成代码所需的全部信息。接下来,我们将利用这份 Spec 和 Cursor,驱动 AI 生成前后端代码。
5. 驱动生成:基于 Spec 与 Rules 的全栈代码生成实战
现在,我们进入最激动人心的环节:让 AI 根据 Spec 和 Rules 自动生成代码。打开 Cursor,确保它已加载我们项目的上下文(即打开了项目根目录)。
第一步:生成后端代码
在 Cursor 的 Chat 界面,我们可以直接引用 Spec 文件。输入提示词:
请根据项目根目录下
specs/user-management.spec.yaml文件中的定义,遵循.cursorrules中的后端规则,为user_management模块生成完整的 Spring Boot 后端代码。包括 Entity、Mapper、Service、Controller 层。请将代码生成到backend/src/main/java/com/example/demo/module/user目录下相应的包中。Cursor 会读取 Spec 和 Rules,然后开始生成。它可能会先询问或确认一些细节,但最终会输出类似以下的代码结构建议和内容:
entity/User.javamapper/UserMapper.javaservice/UserService.java和impl/UserServiceImpl.javacontroller/UserController.java
以下是它可能生成的
UserController.java的核心部分:// 文件路径: backend/src/main/java/com/example/demo/module/user/controller/UserController.java package com.example.demo.module.user.controller; import com.example.demo.common.model.Result; import com.example.demo.module.user.entity.User; import com.example.demo.module.user.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @RestController @RequestMapping("/api/users") @RequiredArgsConstructor public class UserController { private final UserService userService; @GetMapping public Result<Page<User>> getPage(@RequestParam(required = false, defaultValue = "1") Integer pageNum, @RequestParam(required = false, defaultValue = "10") Integer pageSize, @RequestParam(required = false) String username, @RequestParam(required = false) Integer status) { Page<User> page = new Page<>(pageNum, pageSize); return Result.success(userService.pageByCondition(page, username, status)); } @PostMapping public Result<Void> create(@RequestBody User user) { // 这里应补充用户名唯一性校验 userService.save(user); return Result.success(); } @PutMapping("/{id}") public Result<Void> update(@PathVariable Long id, @RequestBody User user) { user.setId(id); userService.updateById(user); return Result.success(); } @DeleteMapping("/{id}") public Result<Void> delete(@PathVariable Long id) { userService.removeById(id); return Result.success(); } }AI 同时会生成对应的 Service 实现,其中包含根据用户名和状态进行条件查询的逻辑。关键点在于:AI 生成的代码直接遵循了 RESTful 规范、统一返回格式
Result、以及 MyBatis-Plus 的使用方式,这都得益于.cursorrules的约束。
第二步:生成前端代码
切换到前端项目目录 (
frontend),在 Cursor 中打开。输入提示词:
请根据项目根目录下
specs/user-management.spec.yaml文件中的frontend_ui部分,遵循.cursorrules中的前端规则,生成用户管理页面。需要创建:1) API 文件 (src/api/user.ts),2) Pinia Store (src/stores/user.ts),3) 页面组件 (src/views/user/Index.vue)。请使用 Element Plus 组件。AI 将开始生成。以下是一个生成的
src/views/user/Index.vue的简化示例:<!-- 文件路径: frontend/src/views/user/Index.vue --> <template> <div class="user-management"> <el-card> <!-- 搜索表单 --> <el-form :model="searchForm" inline> <el-form-item label="用户名"> <el-input v-model="searchForm.username" placeholder="请输入用户名" clearable /> </el-form-item> <el-form-item label="状态"> <el-select v-model="searchForm.status" placeholder="请选择" clearable> <el-option label="全部" :value="undefined" /> <el-option label="启用" :value="1" /> <el-option label="禁用" :value="0" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSearch">查询</el-button> <el-button @click="handleReset">重置</el-button> <el-button type="success" @click="handleAdd">新增用户</el-button> </el-form-item> </el-form> <!-- 数据表格 --> <el-table :data="tableData" border style="width: 100%"> <el-table-column prop="id" label="ID" width="80" /> <el-table-column prop="username" label="用户名" /> <el-table-column prop="nickname" label="昵称" /> <el-table-column prop="email" label="邮箱" /> <el-table-column prop="status" label="状态"> <template #default="{ row }"> <el-tag :type="row.status === 1 ? 'success' : 'danger'"> {{ row.status === 1 ? '启用' : '禁用' }} </el-tag> </template> </el-table-column> <el-table-column prop="createTime" label="创建时间" /> <el-table-column label="操作" width="180"> <template #default="{ row }"> <el-button size="small" @click="handleEdit(row)">编辑</el-button> <el-button size="small" type="danger" @click="handleDelete(row)">删除</el-button> </template> </el-table-column> </el-table> <!-- 分页 --> <div class="pagination-wrapper"> <el-pagination v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize" :total="pagination.total" @current-change="handlePageChange" @size-change="handleSizeChange" layout="total, sizes, prev, pager, next, jumper" /> </div> </el-card> <!-- 新增/编辑弹窗 --> <UserFormDialog v-model="dialogVisible" :form-data="currentRow" :mode="dialogMode" @success="handleDialogSuccess" /> </div> </template> <script setup lang="ts"> import { ref, reactive, onMounted } from 'vue'; import { ElMessage, ElMessageBox } from 'element-plus'; import { useUserStore } from '@/stores/user'; import UserFormDialog from './components/UserFormDialog.vue'; const userStore = useUserStore(); const searchForm = reactive({ username: '', status: undefined as number | undefined, }); const tableData = ref([]); const pagination = reactive({ pageNum: 1, pageSize: 10, total: 0, }); const dialogVisible = ref(false); const dialogMode = ref<'add' | 'edit'>('add'); const currentRow = ref(); const loadTableData = async () => { const params = { ...searchForm, pageNum: pagination.pageNum, pageSize: pagination.pageSize, }; const res = await userStore.getUserList(params); if (res.code === 200) { tableData.value = res.data.list; pagination.total = res.data.total; } }; const handleSearch = () => { pagination.pageNum = 1; loadTableData(); }; const handleReset = () => { Object.assign(searchForm, { username: '', status: undefined }); handleSearch(); }; const handleAdd = () => { currentRow.value = {}; dialogMode.value = 'add'; dialogVisible.value = true; }; const handleEdit = (row) => { currentRow.value = { ...row }; dialogMode.value = 'edit'; dialogVisible.value = true; }; const handleDelete = async (row) => { try { await ElMessageBox.confirm('确认删除该用户?', '提示', { type: 'warning' }); await userStore.deleteUser(row.id); ElMessage.success('删除成功'); loadTableData(); } catch (err) { // 用户取消 } }; const handleDialogSuccess = () => { dialogVisible.value = false; loadTableData(); }; const handlePageChange = (val) => { pagination.pageNum = val; loadTableData(); }; const handleSizeChange = (val) => { pagination.pageSize = val; pagination.pageNum = 1; loadTableData(); }; onMounted(() => { loadTableData(); }); </script>同时,AI 会生成对应的
src/api/user.ts(封装 Axios 请求) 和src/stores/user.ts(Pinia Store,调用 API)。你会发现,生成的代码直接使用了项目约定的 API 路径 (/api/users)、Element Plus 组件、Pinia 状态管理,并且组件结构清晰,完全遵循了我们在 Rules 和 Spec 中的约定。
第三步:生成数据库迁移脚本(可选)你可以继续让 AI 根据 Spec 中的data_model生成 SQL 文件。
请根据
specs/user-management.spec.yaml中的data_model定义,生成创建sys_user表的 SQL 语句。
AI 会输出:
-- 文件路径: backend/src/main/resources/db/migration/V20240320001__create_sys_user_table.sql CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `username` varchar(50) NOT NULL COMMENT '用户名', `nickname` varchar(100) DEFAULT NULL COMMENT '用户昵称', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `status` tinyint DEFAULT '1' COMMENT '状态:0-禁用,1-启用', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表';至此,一个具备完整增删改查功能的用户管理模块的前后端代码骨架,在几分钟内就生成了。剩下的工作主要是:1) 运行后端,创建数据库表;2) 运行前端,配置代理;3) 进行必要的微调和测试。一个月工期的核心编码部分,已被压缩到一次清晰的 Spec 编写和几次 AI 对话中。
6. 效果验证与微调:从生成到运行
生成代码后,必须进行验证和必要的微调,这是“人机协作”中“人”的价值所在。
后端启动与 API 测试:
- 运行 Spring Boot 应用。
- 使用 Apifox 或 Postman,按照 Spec 中的 API 定义,测试
GET /api/users、POST /api/users等接口。 - 常见微调点:AI 可能遗漏某些业务规则校验(如用户名唯一性)。你需要在 Service 层手动补充。这正是我们强调的:AI 负责生成“框架正确”的代码,开发者负责补充“业务正确”的逻辑。
前端启动与联调:
- 运行
npm run dev启动前端开发服务器。 - 访问用户管理页面,测试查询、新增、编辑、删除功能。
- 常见微调点:日期格式化、状态枚举值的显示、表单验证规则的细化。这些调整通常很小,且集中在视图层。
- 运行
代码审查与优化:
- 虽然 AI 遵循了 Rules,但仍需进行人工 Code Review。重点检查:
- 生成的 SQL 是否有性能问题?(如缺少索引)
- 前端组件的事件处理、状态管理是否合理?
- 错误处理是否完备?
- 将审查中发现的可复用的优化点,反过来补充到
Rules或创建新的Skill中,让 AI 下次生成得更好。例如,可以将“所有删除操作需二次确认”作为一个前端 Skill 固化下来。
- 虽然 AI 遵循了 Rules,但仍需进行人工 Code Review。重点检查:
7. 常见问题与排查思路
在实践这套流程时,你可能会遇到以下典型问题:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| AI 生成的代码不符合项目技术栈(如用了 React 而不是 Vue)。 | .cursorrules文件未生效或规则描述不清晰。 | 检查 Cursor 是否已正确加载项目根目录。在 Chat 中询问 AI:“请总结你理解的当前项目的前端技术栈。” | 确保.cursorrules文件在根目录,且规则描述具体、无歧义。在对话开始时再次强调规则。 |
| 前后端 API 接口路径或字段名对不上。 | Spec 文件中前后端 API 定义不一致,或 AI 在生成时理解有偏差。 | 对比specs/*.spec.yaml中的apis定义与生成的 Controller 和前端 API 文件。 | 修正 Spec 文件,确保定义唯一、准确。生成后,进行快速的契约对比,这是必须的人工检查环节。 |
| 生成的代码无法编译或运行,报依赖错误。 | AI 可能使用了项目中未安装的库或错误版本。 | 查看错误信息,检查pom.xml或package.json。 | 在.cursorrules中明确指定核心依赖的版本。或者在生成代码后,手动安装缺失的依赖。 |
| 代码风格与项目现有代码不一致。 | .cursorrules中的代码风格规则不够具体,或 AI 未完全遵守。 | 使用项目的 ESLint/Prettier 进行检查。 | 在 Rules 中引用具体的配置文件(如.eslintrc.js),或要求 AI 在生成后运行格式化命令。 |
| 复杂业务逻辑生成不完整或错误。 | Spec 对复杂逻辑的描述不够精确,AI 无法理解。 | 审查生成的 Service 层代码。 | 将复杂业务逻辑拆解为更小的、可描述的步骤,或者先在 Spec 中描述清楚,再让 AI 生成。对于核心业务逻辑,始终保留人工编写和审查的权利。 |
| AI 生成了过时或废弃的 API 用法。 | AI 的训练数据可能包含旧版本框架的代码。 | 查阅当前使用框架的官方最新文档进行对比。 | 在.cursorrules中明确指出框架版本,并给出关键 API 的正确用法示例。例如:“必须使用 Vue 3 的<script setup>语法,而非 Options API。” |
8. 最佳实践与工程化建议
要将此模式规模化、团队化,需要一些工程化实践:
- Spec 模板化与版本管理:为不同类型的模块(如纯管理后台 CRUD、带工作流的表单、复杂报表页)创建 Spec 模板。将 Spec 文件纳入 Git 管理,与代码同步变更。
- Skills 库建设:将常用的、高质量的代码模式沉淀为“技能卡片”。例如,“生成带复杂查询条件的 Service 方法”、“生成前端表单验证规则”、“生成统一异常处理”。在团队内共享这些 Skills 的描述,作为高级提示词使用。
- Rules 的持续演进:
Rules不是一成不变的。随着项目技术栈升级、架构调整、新的最佳实践出现,需要及时更新.cursorrules文件。可以将其视为项目的“AI 编码规范手册”。 - 人机职责明确:AI 负责“生成”,开发者负责“设计”和“审查”。最理想的流程是:开发者编写 Spec -> AI 生成代码骨架 -> 开发者审查、补充业务逻辑、运行测试 -> 代码入库。开发者应聚焦于需求分析、架构设计、Spec 编写和最终质量把关。
- 从“前端全栈”到“全栈 AI 辅助”:本文以前端开发者视角切入,但此方法同样适用于后端开发者快速生成前端页面,或全栈工程师整体提效。关键在于编写一份清晰、无歧义的跨栈 Spec。
- 安全与合规底线:切勿让 AI 生成涉及敏感信息处理、核心加密算法、复杂权限校验等安全关键代码。这些部分必须由开发者亲自编写和审计。
9. 总结:拥抱以“设计”为核心的新研发范式
通过“Rules + Spec + Skills”这套方法论,我们并非简单地用 AI 替代程序员,而是进行了一场深刻的职责再分配。AI 接管了那些模式固定、重复性高、容易出错的“翻译”工作——将结构化的需求(Spec)翻译成符合规范(Rules)和最佳实践(Skills)的代码。而开发者,则被解放出来,更专注于更高价值的工作:需求分析、架构设计、规范制定(Rules/Spec/Skills)、以及最终的代码审查与质量把关。
“压缩一月工期至半小时”并非夸张,它指的是将原本耗费在机械性编码、反复调试、前后端对齐上的大量时间,压缩到编写一份精确的 Spec 和进行几次高效的 AI 对话上。真正的挑战和核心能力,从“编码实现”转向了“精准定义”和“工程化设计”。
对于前端开发者而言,这无疑是迈向全栈、提升自身价值和影响力的绝佳机会。你不再需要痛苦地学习 Spring Boot 的所有注解,或记忆 MyBatis-Plus 的每个方法,你只需要知道如何设计一个清晰的数据模型和 API 契约(Spec),并懂得如何用工程规则(Rules)去约束 AI,就能驱动整个全栈应用的构建。
建议你立即动手,从一个熟悉的简单模块开始,尝试编写你的第一份*.spec.yaml文件,配置你的.cursorrules,体验这种“设计驱动开发”的全新流程。当你看到符合预期的代码被自动生成出来时,你会真切感受到,软件开发的未来,已然到来。
🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度