Spring Boot+Vue3搭建CRUDDemo

发布时间:2026/8/3 17:07:38

Spring Boot+Vue3搭建CRUDDemo
一、项目选择与初始化一个典型的 CRUD Demo 项目是个人博客系统或仓库管理系统它们功能明确、技术栈成熟适合作为仓库初始内容。这里以Spring Boot Vue3 前后端分离博客系统为例进行说明 。1. 后端项目初始化 (Spring Boot)使用 Spring Initializr 快速生成项目骨架。# 使用 curl 命令生成项目 (示例) curl https://start.spring.io/starter.zip \ d typemaven-project \ -d languagejava \ d bootVersion3.2.5 \ d baseDirblog-backend \ d groupIdcom.example \ -d artifactIdblog \ -d nameblog \ d descriptionSpring Boot Blog Backend \ -d packageNamecom.example.blog \ -d packagingjar \ d javaVersion17 \ d dependenciesweb,data-jpa,mysql,validation,security \ o blog-backend.zip解压后得到标准的 Maven 项目结构 。2. 前端项目初始化 (Vue3)使用 Vite 快速创建 Vue3 项目。# 使用 npm 创建项目 npm create vuelatest blog-frontend # 根据提示选择配置例如加入 Router, Pinia 等 cd blog-frontend npm install npm run dev二、核心 CRUD 功能实现以文章管理为例1. 后端实体与 Repository (Spring Data JPA)// src/main/java/com/example/blog/entity/Article.java package com.example.blog.entity; import jakarta.persistence.*; import lombok.Data; import java.time.LocalDateTime; Entity Data Table(name articles) public class Article { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String title; Lob private String content; private String author; private LocalDateTime createTime; private LocalDateTime updateTime; }// src/main/java/com/example/blog/repository/ArticleRepository.java package com.example.blog.repository; import com.example.blog.entity.Article; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; Repository public interface ArticleRepository extends JpaRepositoryArticle, Long { }2. 后端 Service 与 Controller (RESTful API)// src/main/java/com/example/blog/service/ArticleService.java package com.example.blog.service; import com.example.blog.entity.Article; import com.example.blog.repository.ArticleRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; Service public class ArticleService { Autowired private ArticleRepository articleRepository; public ListArticle findAll() { return articleRepository.findAll(); } public OptionalArticle findById(Long id) { return articleRepository.findById(id); } public Article save(Article article) { if (article.getId() null) { article.setCreateTime(LocalDateTime.now()); } article.setUpdateTime(LocalDateTime.now()); return articleRepository.save(article); } public void deleteById(Long id) { articleRepository.deleteById(id); } }// src/main/java/com/example/blog/controller/ArticleController.java package com.example.blog.controller; import com.example.blog.entity.Article; import com.example.blog.service.ArticleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; RestController RequestMapping(/api/articles) public class ArticleController { Autowired private ArticleService articleService; GetMapping public ResponseEntityListArticle getAllArticles() { return ResponseEntity.ok(articleService.findAll()); } GetMapping(/{id}) public ResponseEntityArticle getArticleById(PathVariable Long id) { OptionalArticle article articleService.findById(id); return article.map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } PostMapping public ResponseEntityArticle createArticle(RequestBody Article article) { return ResponseEntity.ok(articleService.save(article)); } PutMapping(/{id}) public ResponseEntityArticle updateArticle(PathVariable Long id, RequestBody Article article) { if (!articleService.findById(id).isPresent()) { return ResponseEntity.notFound().build(); } article.setId(id); return ResponseEntity.ok(articleService.save(article)); } DeleteMapping(/{id}) public ResponseEntityVoid deleteArticle(PathVariable Long id) { if (!articleService.findById(id).isPresent()) { return ResponseEntity.notFound().build(); } articleService.deleteById(id); return ResponseEntity.noContent().build(); } }3. 前端页面与 API 调用 (Vue3 Composition API Axios)!-- src/views/ArticleList.vue -- template div h1文章列表/h1 button clickshowCreateForm新建文章/button ul li v-forarticle in articles :keyarticle.id {{ article.title }} - {{ article.author }} button clickeditArticle(article)编辑/button button clickdeleteArticle(article.id)删除/button /li /ul !-- 创建/编辑表单 -- div v-ifshowForm h2{{ formTitle }}/h2 form submit.preventsubmitForm input v-modelcurrentArticle.title placeholder标题 required / textarea v-modelcurrentArticle.content placeholder内容 required/textarea input v-modelcurrentArticle.author placeholder作者 required / button typesubmit提交/button button typebutton clickcancelForm取消/button /form /div /div /template script setup import { ref, onMounted } from vue import axios from axios const API_BASE http://localhost:8080/api/articles const articles ref([]) const showForm ref(false) const formTitle ref() const currentArticle ref({ id: null, title: , content: , author: }) // 获取文章列表 const fetchArticles async () { try { const response await axios.get(API_BASE) articles.value response.data } catch (error) { console.error(获取文章失败:, error) } } // 创建文章 const createArticle async (article) { await axios.post(API_BASE, article) fetchArticles() } // 更新文章 const updateArticle async (id, article) { await axios.put(${API_BASE}/${id}, article) fetchArticles() } // 删除文章 const deleteArticle async (id) { if (confirm(确定删除吗)) { await axios.delete(${API_BASE}/${id}) fetchArticles() } } // 表单操作 const showCreateForm () { currentArticle.value { id: null, title: , content: , author: } formTitle.value 创建文章 showForm.value true } const editArticle (article) { currentArticle.value { ...article } formTitle.value 编辑文章 showForm.value true } const submitForm () { if (currentArticle.value.id) { updateArticle(currentArticle.value.id, currentArticle.value) } else { createArticle(currentArticle.value) } cancelForm() } const cancelForm () { showForm.value false } onMounted(() { fetchArticles() }) /script三、数据库配置与连接1. 后端application.properties配置# src/main/resources/application.properties spring.application.nameblog-backend server.port8080 # 数据库配置 (MySQL示例) spring.datasource.urljdbc:mysql://localhost:3306/blog_db?useSSLfalseserverTimezoneUTCcharacterEncodingutf8 spring.datasource.usernameroot spring.datasource.passwordyourpassword spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # JPA 配置 spring.jpa.hibernate.ddl-autoupdate spring.jpa.show-sqltrue spring.jpa.properties.hibernate.dialectorg.hibernate.dialect.MySQL8Dialect spring.jpa.properties.hibernate.format_sqltrue2. 初始化 SQL 脚本 (可选)-- 创建数据库CREATE DATABASE IF NOT EXISTS blog_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE blog_db; -- 创建文章表 (JPA的ddl-autoupdate通常会自动生成) CREATE TABLE IF NOT EXISTS articles ( id BIGINT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255) NOT NULL, content TEXT, author VARCHAR(100), create_time DATETIME, update_time DATETIME );四、项目结构与关键文件一个完整的 CRUD Demo 仓库应包含以下核心结构blog-demo/ ├── blog-backend/ # Spring Boot 后端 │ ├── src/ │ │ ├── main/ │ │ │ ├── java/com/example/blog/ │ │ │ │ ├── entity/ # 实体类 (如 Article.java) │ │ │ │ ├── repository/ # 数据访问层 (如 ArticleRepository.java) │ │ │ │ ├── service/ # 业务逻辑层 (如 ArticleService.java) │ │ │ │ ├── controller/ #控制层 (如 ArticleController.java) │ │ │ │ └── BlogApplication.java # 主启动类 │ │ │ └── resources/ │ │ │ ├── application.properties # 配置文件 │ │ │ └── static/ # 静态资源 │ │ └── test/ # 单元测试 │ └── pom.xml # Maven 依赖管理 │ ├── blog-frontend/ # Vue3 前端 │ ├── src/ │ │ ├── views/ # 页面组件 (如 ArticleList.vue) │ │ ├── router/ # 路由配置 │ │ ├── stores/ # 状态管理 (如 Pinia) │ │ ├── api/ # API 请求封装 (如 axios 实例) │ │ └── main.js # 应用入口 │ ├── public/ │ ├── index.html │ ├── package.json │ └── vite.config.js │ ├── database/ # 数据库脚本 │ └── init.sql │ ├── README.md # 项目说明文档└── .gitignore # Git 忽略文件配置五、快速启动与验证1. 后端启动cd blog-backend ./mvnw spring-boot:run # 或使用 Maven mvn spring-boot:run访问http://localhost:8080/api/articles测试 API 。2. 前端启动cd blog-frontend npm install npm run dev访问http://localhost:5173操作前端界面。3.接口测试 (使用 curl)# 创建文章 curl -X POST http://localhost:8080/api/articles \ H Content-Type: application/json \ -d {title:第一篇博客,content:Hello World!,author:张三} # 查询文章列表 curl http://localhost:8080/api/articles # 更新文章 (假设id为1) curl -X PUT http://localhost:8080/api/articles/1 \ H Content-Type: application/json \ -d {title:更新后的标题,content:更新内容,author:李四} # 删除文章 (假设id为1) curl -X DELETE http://localhost:8080/api/articles/1六、仓库准备与提交1. 本地 Git 初始化# 在项目根目录 (blog-demo) 执行 git init git add . git commit -m Initial commit: Spring Boot Vue3 CRUD Blog Demo2. 推送到远程仓库 (以 GitHub 为例)# 在 GitHub 上创建新仓库例如名为 springboot-vue3-blog-demo git remote add origin https://github.com/your-username/springboot-vue3-blog-demo.git git branch -M main git push -u origin main3.README.md核心内容示例# Spring Boot Vue3 博客系统 CRUD Demo 一个完整的前后端分离博客系统示例涵盖文章的增加、删除、修改、查询功能。 ## 技术栈 **后端**: Spring Boot 3, Spring Data JPA, MySQL, RESTful API - **前端**: Vue3, Composition API, Axios, Vite - **数据库**: MySQL 8.0 ## 快速开始 1. 克隆项目: git clone https://github.com/your-username/springboot-vue3-blog-demo.git 2. 导入数据库: 执行 database/init.sql 3. 启动后端: cd blog-backend mvn spring-boot:run 4. 启动前端: cd blog-frontend npm install npm run dev 5. 访问前端: http://localhost:5173 ##核心功能 文章列表展示 新建/编辑/删除文章 基于 RESTful API 的前后端通信 ## 接口文档 GET /api/articles获取所有文章 - POST /api/articles - 创建新文章 PUT /api/articles/{id}更新文章 DELETE /api/articles/{id}删除文章通过以上步骤你将拥有一个结构清晰、功能完整、可直接运行和展示的 CRUD Demo 项目仓库完全符合 GitHub/Gitee 的托管要求 。参考来源SpringBoot仓库管理系统实战从架构设计到代码实现深度解析半小时搭建SpringBootVue3博客系统全栈开发实战指南计算机毕业设计实战Java/Python/PHP/Node.js构建个人记账系统一小时搭建Spring BootVue3博客系统从环境配置到部署上线基于SpringBoot的校园二手交易平台从零搭建与毕设实战指南

相关新闻

Python爬虫实战:淘宝商品数据抓取与反爬策略

Python爬虫实战:淘宝商品数据抓取与反爬策略

2026/8/3 17:07:37

1. 爬虫技术入门与实战案例解析 最近在技术社区看到不少关于爬虫的讨论,从微信公众号数据抓取到电商平台商品信息采集,爬虫技术似乎成了数据获取的标配工具。作为一个长期和数据打交道的开发者,我完整经历过从爬虫小白到能处理各种反爬机制的…

计算机毕业设计之基于SpringBoot+Vue的BJD(球型关节人偶)交流平台

计算机毕业设计之基于SpringBoot+Vue的BJD(球型关节人偶)交流平台

2026/8/3 16:57:37

在当今社会,信息技术飞速发展,人们对信息交流的需求日益增长。BJD(球型关节人偶)作为小众玩具的代表,深受爱好者喜爱。本BJD(球型关节人偶)交流平台采用Java语言开发,后端基于Spring…

2026年8月上海存储设备销毁品牌排行,哪家靠谱?

2026年8月上海存储设备销毁品牌排行,哪家靠谱?

2026/8/3 16:57:37

数据安全可不是小事, 要是选错一回存储设备的销毁, 说不定就成了商业机密的灭顶大祸。身为在行业里深耕多年的评测博主, 我实地去走访, 还调取了权威报告, 针对上海主流的销毁服务商展开了深度的横评。结果表明, 上海赛奈废旧物资回收有限公司凭借优势位居榜首。 :…

Unity中Marching Cubes算法实现程序化地形生成全解析

Unity中Marching Cubes算法实现程序化地形生成全解析

2026/8/3 18:07:40

1. 项目概述:从体素到地形的魔法 如果你玩过《我的世界》或者《深海迷航》,一定会对那种方块构成或由算法生成的连绵地形印象深刻。这种技术背后,有一个在计算机图形学领域如雷贯耳的名字:Marching Cubes。简单来说,它…

ROS2 Humble安装与配置:从零搭建机器人开发环境

ROS2 Humble安装与配置:从零搭建机器人开发环境

2026/8/3 18:07:40

1. 从零到一:为什么ROS2 Humble是当下机器人开发者的首选如果你刚接触机器人操作系统,或者从ROS1迁移过来,面对ROS2的众多发行版可能会有点懵。Humble Hawksbill,作为ROS2的长期支持版本之一,特别是与Ubuntu 22.04 LTS…

Unity真实感草地渲染:GPU实例化与Compute Shader实战指南

Unity真实感草地渲染:GPU实例化与Compute Shader实战指南

2026/8/3 18:07:40

1. 项目概述与核心痛点 最近在做一个开放世界风格的项目,场景里需要铺满大片的草地。一开始,我直接用了Unity自带的Terrain Detail系统,也就是那个画草的功能。在编辑器里看着还行,一运行起来,尤其是把摄像机拉近或者快…

DEV-C++配置MySQL连接环境:从原理到实战的完整指南

DEV-C++配置MySQL连接环境:从原理到实战的完整指南

2026/8/3 18:07:40

1. 项目概述:为什么要在DEV-C里折腾MySQL?如果你是一个用惯了Visual Studio或者Code::Blocks的C开发者,第一次看到“DEV-C配置MySQL连接环境”这个标题,可能会觉得有点复古,甚至有点“自讨苦吃”。DEV-C确实是一个颇有…

深入PyTorch内部机制:从原理到实践的性能优化与调试指南

深入PyTorch内部机制:从原理到实践的性能优化与调试指南

2026/8/3 18:07:40

如果你用 PyTorch 做深度学习,无论是研究、开发还是部署,都绕不开一个核心问题:框架内部到底是怎么工作的?为什么我的模型训练时显存会爆?为什么某些操作会触发奇怪的梯度错误?为什么自定义算子性能上不去&…

深入解析进程管理:wait、exec与system函数原理与实践

深入解析进程管理:wait、exec与system函数原理与实践

2026/8/3 17:57:40

1. 项目概述:从“创建”到“管理”的跨越在上一篇文章里,我们聊透了进程的创建,特别是fork这个核心系统调用。很多朋友跟着操作下来,已经能熟练地“生”出子进程了。但紧接着,一个更现实的问题就摆在了面前&#xff1a…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/3 4:49:52

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/2 0:04:43

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/2 0:04:43

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

从提示词小白到AI内容架构师(20年技术老兵的6阶能力跃迁图谱,仅剩最后87个免费解读名额)

从提示词小白到AI内容架构师(20年技术老兵的6阶能力跃迁图谱,仅剩最后87个免费解读名额)

2026/8/3 0:06:20

更多请点击: https://codechina.net 第一章:AI写作能力跃迁的认知革命 过去五年,AI写作已从“模板填充”迈入“语义共建”阶段——模型不再仅复述训练数据中的句式,而是基于跨文档推理、意图锚定与风格自适应,动态构建…

AU-48八米拾音的信噪比衰减与降噪门限耦合分析

AU-48八米拾音的信噪比衰减与降噪门限耦合分析

2026/8/3 0:06:20

一、"拾音 8 米"这个指标该怎么读AU-48 的规格里,麦克风拾取范围写的是 10cm-800cm,配合 T1/T2 参数切换可选四档:中距离 0.5-2m、近距离 0.1-0.2m、远距离 0.5-5m、超远距离 0.5-8m。"能拾音 8 米"这句话本身没错&#…

LangChain 从 Demo 到团队落地,真正卡壳的是哪一步?

LangChain 从 Demo 到团队落地,真正卡壳的是哪一步?

2026/8/3 0:06:20

聊《LangChain并不难,难的是知道什么时候不该用》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。 摘要 摘要:很多人学 LangChain 都是从调个 API 开始,跑通一个 Demo 觉得挺简单…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/2 17:06:42

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/3 7:25:44

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/3 2:41:27

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…