当前位置: 首页 > news >正文

使用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:

  1. 前端提交的价格字段为字符串,后端期望BigDecimal
    在Cursor中粘贴错误信息,AI建议:在axios请求拦截器中统一转换,或者后端使用@JsonFormat。我们采用后端方式:在实体类price字段上加@JsonFormat(shape = JsonFormat.Shape.STRING),同时前端确保传递数字。

  2. 删除操作后分页数据不刷新
    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编程的黄金法则:

  1. 把AI当作结对编程伙伴:不要只问“怎么写代码”,而是描述“我要实现什么功能,输入输出是什么,当前环境”。上下文越详细,输出越精准。

  2. 分步骤生成:不要一次性要求生成整个项目,而是从数据库→实体→Mapper→Service→Controller→前端,逐步推进。

  3. 善用注释引导:在Java类中写一行// 分页查询带条件,AI会自动补全对应代码块。

  4. 学会追问和调试:当AI生成的代码运行出错,直接将错误堆栈粘贴给AI,通常能快速定位问题。

  5. 保持代码审查:AI可能会使用过时的API或存在逻辑漏洞,比如忘记加@Transactional,需要人工核对。

六、总结:AI编程的优缺点

优点

  • 效率提升10倍以上:原本一周的工作量压缩到1天(包括学习摸索时间)。

  • 降低样板代码负担:MyBatis-Plus集成、分页、REST接口、前端表格表单……AI统统代劳。

  • 学习成本低:即使不熟悉某项技术(如Vue3组合式API),通过AI示例也能快速上手。

  • 减少拼写和格式错误:AI生成的代码风格统一,避免手误。

缺点

  • 不完全理解业务:生成的分页查询条件可能不符合实际业务逻辑,需要手动调整。

  • 依赖网络和AI服务稳定性:偶尔AI会“拒绝回答”或生成半截代码。

  • 存在代码安全隐患:例如AI生成的SQL拼接可能引发注入(使用MyBatis-Plus则安全)。开发者必须具备基本的安全意识。

  • 盲目复制可能导致冗余:AI可能生成大量不必要的import或重复方法。

http://www.cnnetsun.cn/news/2080858.html

相关文章:

  • 安卓应用级虚拟定位终极指南:FakeLocation实现多应用独立位置模拟
  • STM32 HAL库实战:释放PB3-5和PA13-15引脚做I2C,别再被SWD/JTAG坑了
  • 从“单兵作战”到“组网互联”:深入浅出图解RS485总线网络拓扑与主从通信协议
  • AI驱动的网络安全攻防技术解析与实战
  • 原神帧率解锁工具:轻松突破60FPS限制,让高刷显示器发挥真正实力
  • Autosar网络管理时间参数详解:T_WakeUp、T_Repeat_Message这些值到底怎么设?
  • 别再误会 `async def`:一篇讲透 `asyncio` 事件循环、线程与并发并行的实战指南
  • 不止于通信:用Android串口打造智能硬件控制中心(附完整项目源码)
  • 【AI面试临阵磨枪】为什么生产级 Agent 必须上 Harness,而不能只靠 Prompt?
  • 阿里开源模型Qwen3-4B快速体验:上传文档,让它帮你总结分析
  • 量子退火器热力学特性与Gibbs分布验证研究
  • BBDown终极指南:5步掌握B站视频下载神器
  • 一键部署多用户:Stable Diffusion v1.5 Archive共享服务搭建教程
  • 终极网页排版指南:如何通过Typography Handbook快速提升设计水平
  • 汽车HIL测试中RAG增强LLM的优化实践与应用
  • 智能体记忆系统构建指南:从向量检索到工程实践
  • Kaggle冠军的数据科学实战策略与竞赛方法论
  • spartan.ng测试策略:Jest单元测试与Cypress e2e测试最佳实践
  • vscode-settings快捷键与工作流:10个必备技巧大幅提升编码速度
  • hook-flow 高级应用:利用生命周期流程图调试复杂 React 组件
  • PHP Server Monitor配置完全手册:10个关键设置技巧
  • NCM音频解密技术深度解析:构建高效音乐格式转换的最佳实践
  • 终极文本摘要利器:Pointer-Generator Networks完全指南
  • 递归语言模型:突破大语言模型长文本处理瓶颈
  • ARM Compiler工具链优化与嵌入式开发实战
  • 基于DQN的超级马里奥AI训练:从环境搭建到奖励函数设计实战
  • 微信支付-支付宝支付回调通知处理
  • LeaderF与Git集成:如何在版本控制项目中高效搜索文件
  • Ouibounce终极指南:提升着陆页转化率的7-15%秘诀
  • 终极Vant Demo测试实践:3步打造高质量UI组件单元测试指南