使用AI编程软件(AI Coding)从0到1实现Java前后端全栈项目
一、引言
在传统开发模式中,从零开始搭建一个Java前后端分离项目往往需要数天甚至数周的时间,开发者需要编写大量的样板代码、处理各种配置细节。随着AI编程工具的爆发式增长(如GitHub Copilot、Cursor、通义灵码、CodeGeeX等),我们迎来了全新的“对话式编程”时代。本文将以AI Coding(以Cursor + 通义灵码为示例)为核心,完整记录如何从0到1实现一个Spring Boot + Vue3的前后端项目——图书管理系统。整个过程中,AI承担了代码生成、调试、优化等大量工作,我们只需要“说人话”并配合少量手动调整即可。相信读完本文,你会对AI辅助开发的能力边界和实用技巧有更深刻的认识。
二、项目简介与技术栈
项目名称:BookManager(图书管理系统)
功能模块:
图书列表展示(分页查询)
新增图书(书名、作者、价格、库存)
编辑图书信息
删除图书(逻辑删除)
技术栈:
后端:Spring Boot 2.7.x、MyBatis-Plus、MySQL 8.0、Lombok
前端:Vue3、Vite、Element Plus、Axios
数据库:MySQL
AI工具:Cursor(内置GPT-4)+ 通义灵码(IntelliJ IDEA插件)
开发环境:IntelliJ IDEA 2023.3、VS Code、Navicat
三、AI编程工具选择
本次实践使用两款AI工具协同工作:
| 工具 | 用途 | 优点 |
|---|---|---|
| Cursor | 前端代码生成、项目初始化、对话式代码编写 | 理解上下文强,支持跨文件编辑 |
| 通义灵码(IDEA插件) | 后端Java代码补全、单元测试、SQL生成 | 与IDE深度集成,适合Spring Boot |
当然,你也可以仅使用其中一种(如GitHub Copilot),原理相通。
四、项目开发过程(从0到1)
4.1 需求分析与AI辅助
操作:打开Cursor,新建一个对话,输入:
我要开发一个图书管理系统,包含图书列表分页展示、新增图书、编辑图书、删除图书功能。请帮我设计技术方案,使用Spring Boot + Vue3 + MySQL。
AI输出(节选):
text
推荐方案: 后端:Spring Boot + MyBatis-Plus,提供RESTful API 数据库:book表(id, name, author, price, stock, deleted) 前端:Vue3 + Element Plus + Axios 开发步骤:...
在这个阶段,AI帮我们完成了技术选型、数据模型设计思路,节省了30分钟的文档查阅时间。
4.2 数据库设计与AI生成SQL
直接让AI生成建表语句(通义灵码对话):
我的提问:
根据图书管理系统的需求,设计MySQL数据库表,字段包括主键、书名、作者、价格、库存、逻辑删除标记、创建时间、更新时间。
AI生成的SQL:
sql
CREATE TABLE `book` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(100) NOT NULL COMMENT '书名', `author` varchar(50) DEFAULT NULL COMMENT '作者', `price` decimal(10,2) DEFAULT NULL COMMENT '价格', `stock` int(11) DEFAULT 0 COMMENT '库存数量', `deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图书表';
执行后成功创建表。AI还贴心地给出了索引优化建议,如对name字段添加普通索引。
4.3 后端Spring Boot项目搭建(AI生成基础代码)
4.3.1 初始化项目
在IDEA中新建Spring Boot项目,添加依赖:Spring Web、MyBatis-Plus、MySQL Driver、Lombok。
使用通义灵码:在IDEA右侧打开通义灵码窗口,输入:
帮我生成MyBatis-Plus的配置类,并配置数据源(application.yml格式)。
AI输出:
yaml
# application.yml spring: datasource: url: jdbc:mysql://localhost:3306/book_db?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted # 逻辑删除字段 logic-delete-value: 1 logic-not-delete-value: 0
直接复制到项目中,无需手写。
4.3.2 实体类、Mapper、Service、Controller一键生成
利用通义灵码的“代码生成”功能,先创建实体类Book.java。对话式输入:
根据book表生成对应的Java实体类,使用Lombok注解,并配置MyBatis-Plus的表名、主键策略。
AI生成:
java
import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("book") public class Book { @TableId(type = IdType.AUTO) private Long id; private String name; private String author; private BigDecimal price; private Integer stock; @TableLogic private Integer deleted; private LocalDateTime createTime; private LocalDateTime updateTime; }接下来生成Mapper接口(继承BaseMapper):
生成BookMapper接口,继承MyBatis-Plus的BaseMapper。
AI输出极简代码:
java
@Mapper public interface BookMapper extends BaseMapper<Book> { }然后生成Service层:
生成BookService接口和实现类,提供分页查询、新增、修改、删除方法。
AI生成的Service实现类(部分):
java
@Service public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService { @Override public Page<Book> pageQuery(int pageNum, int pageSize) { Page<Book> page = new Page<>(pageNum, pageSize); LambdaQueryWrapper<Book> wrapper = new LambdaQueryWrapper<>(); wrapper.orderByDesc(Book::getCreateTime); return this.page(page, wrapper); } // 其他增删改方法直接调用父类save, updateById, removeById即可 }最后生成Controller:
生成BookController,包含分页查询、新增、修改、删除的REST接口,使用Restful风格。
AI输出完整Controller代码,带@RestController、@RequestMapping等注解,方法参数使用@RequestBody和@PathVariable。例如:
java
@RestController @RequestMapping("/api/books") public class BookController { @Autowired private BookService bookService; @GetMapping("/page") public Result<Page<Book>> page(@RequestParam(defaultValue="1") int pageNum, @RequestParam(defaultValue="10") int pageSize) { return Result.success(bookService.pageQuery(pageNum, pageSize)); } @PostMapping public Result<Boolean> add(@RequestBody Book book) { return Result.success(bookService.save(book)); } // ... }其中Result统一响应类也是AI生成的(包含code、msg、data字段)。
整个后端核心代码耗时不到15分钟,传统模式至少需要1-2小时。
4.4 前端Vue3项目搭建与AI生成页面
4.4.1 初始化前端项目
使用Vite创建Vue3项目:
bash
npm create vite@latest book-front -- --template vue cd book-front npm install element-plus axios vue-router
4.4.2 AI生成主页面和CRUD组件
打开Cursor,将整个前端项目文件夹作为工作区。在对话框中输入:
帮我生成一个图书管理的前端页面,使用Vue3 + Element Plus。需要实现:图书表格展示(支持分页)、新增按钮弹出对话框表单、编辑和删除操作。axios请求后端API基地址为http://localhost:8080/api。
Cursor生成的完整Vue文件(src/views/BookManage.vue):
vue
<template> <div class="book-container"> <el-button type="primary" @click="handleAdd">新增图书</el-button> <el-table :data="tableData" border style="width: 100%"> <el-table-column prop="name" label="书名" /> <el-table-column prop="author" label="作者" /> <el-table-column prop="price" label="价格" /> <el-table-column prop="stock" label="库存" /> <el-table-column label="操作"> <template #default="{ row }"> <el-button link type="primary" @click="handleEdit(row)">编辑</el-button> <el-button link type="danger" @click="handleDelete(row.id)">删除</el-button> </template> </el-table-column> </el-table> <el-pagination v-model:current-page="pageNum" :page-size="pageSize" :total="total" @current-change="loadData" /> <!-- 新增/编辑对话框 --> <el-dialog v-model="dialogVisible" :title="dialogTitle"> <el-form :model="formData" label-width="80px"> <el-form-item label="书名"> <el-input v-model="formData.name" /> </el-form-item> <!-- 其他字段省略,类似 --> </el-form> <template #footer> <el-button @click="dialogVisible=false">取消</el-button> <el-button type="primary" @click="submitForm">确定</el-button> </template> </el-dialog> </div> </template> <script setup> import { ref, onMounted } from 'vue' import axios from 'axios' const api = axios.create({ baseURL: 'http://localhost:8080/api' }) const tableData = ref([]) const pageNum = ref(1) const pageSize = ref(10) const total = ref(0) // ... 完整的方法包括 loadData, handleAdd, handleEdit, handleDelete, submitForm </script>AI生成的代码中包含了所有必要的API调用(分页查询、新增、编辑、删除),逻辑完整。我们只需要微调一下字段名对应。
4.4.3 解决跨域问题
启动前端后,访问后端接口会报跨域错误。我们直接在Cursor中提问:
Spring Boot如何配置全局跨域?
AI给出CORS配置类,复制到后端项目即可:
java
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedMethods("GET","POST","PUT","DELETE") .allowCredentials(true); } }4.5 前后端联调与AI调试
联调过程中遇到了两个小bug:
前端提交的价格字段为字符串,后端期望BigDecimal
在Cursor中粘贴错误信息,AI建议:在axios请求拦截器中统一转换,或者后端使用@JsonFormat。我们采用后端方式:在实体类price字段上加@JsonFormat(shape = JsonFormat.Shape.STRING),同时前端确保传递数字。删除操作后分页数据不刷新
AI分析:删除成功后再次调用loadData()即可。代码调整后完美解决。
4.6 部署与AI辅助
项目需要打包部署。向AI询问:
如何将Spring Boot项目打包成jar并运行?Vue项目如何打包并部署到nginx?
AI分别给出Maven打包命令(mvn clean package)和Vite打包命令(npm run build),并提供了nginx配置示例。最终我们将jar包部署到服务器,nginx托管前端dist目录,成功运行。
五、AI编程使用技巧与心得
通过本次实战,我总结出几条高效使用AI编程的黄金法则:
把AI当作结对编程伙伴:不要只问“怎么写代码”,而是描述“我要实现什么功能,输入输出是什么,当前环境”。上下文越详细,输出越精准。
分步骤生成:不要一次性要求生成整个项目,而是从数据库→实体→Mapper→Service→Controller→前端,逐步推进。
善用注释引导:在Java类中写一行
// 分页查询带条件,AI会自动补全对应代码块。学会追问和调试:当AI生成的代码运行出错,直接将错误堆栈粘贴给AI,通常能快速定位问题。
保持代码审查:AI可能会使用过时的API或存在逻辑漏洞,比如忘记加
@Transactional,需要人工核对。
六、总结:AI编程的优缺点
优点
效率提升10倍以上:原本一周的工作量压缩到1天(包括学习摸索时间)。
降低样板代码负担:MyBatis-Plus集成、分页、REST接口、前端表格表单……AI统统代劳。
学习成本低:即使不熟悉某项技术(如Vue3组合式API),通过AI示例也能快速上手。
减少拼写和格式错误:AI生成的代码风格统一,避免手误。
缺点
不完全理解业务:生成的分页查询条件可能不符合实际业务逻辑,需要手动调整。
依赖网络和AI服务稳定性:偶尔AI会“拒绝回答”或生成半截代码。
存在代码安全隐患:例如AI生成的SQL拼接可能引发注入(使用MyBatis-Plus则安全)。开发者必须具备基本的安全意识。
盲目复制可能导致冗余:AI可能生成大量不必要的import或重复方法。
