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爬虫实战:淘宝商品数据抓取与反爬策略

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

2026/8/3 17:07:53 阅读更多 →
Origin2021安装全攻略:从环境配置到错误排查的完整解决方案

Origin2021安装全攻略:从环境配置到错误排查的完整解决方案

1. 项目概述:当Origin2021安装成为一场“技术排雷”如果你正在为Origin2021的安装而头疼,相信我,你绝对不是一个人。作为一款在科研绘图和数据分析领域拥有庞大用户基础的软件,OriginLab系列以其强大的功能著称,但其安…

2026/8/3 17:07:53 阅读更多 →
483. Java 反射 - 调用构造器

483. Java 反射 - 调用构造器

文章目录483. Java 反射 - 调用构造器1. 定位构造器 (Locating Constructors)2. 示例:获取 String 类的构造器输出结果(JDK 23 中部分示例):3. 获取特定构造器4. 调用构造器创建实例5. 总结483. Java 反射 - 调用构造器 在反射中…

2026/8/3 17:07:52 阅读更多 →

最新新闻

企业私有化音视频系统部署与EasyDSS实战指南

企业私有化音视频系统部署与EasyDSS实战指南

1. 为什么企业需要私有化音视频系统?在数字化转型浪潮下,音视频内容已成为企业信息传递的核心载体。但公有云视频服务存在三大致命伤:一是关键数据经过第三方服务器,存在商业机密泄露风险;二是突发流量可能引发服务降级…

2026/8/4 1:59:27 阅读更多 →
OSS Browser:阿里云对象存储的桌面管理神器,开发者如何高效管理云端文件?

OSS Browser:阿里云对象存储的桌面管理神器,开发者如何高效管理云端文件?

OSS Browser:阿里云对象存储的桌面管理神器,开发者如何高效管理云端文件? 【免费下载链接】oss-browser OSS Browser 提供类似windows资源管理器功能。用户可以很方便的浏览文件,上传下载文件,支持断点续传等。 项目…

2026/8/4 1:59:27 阅读更多 →
搞懂这一点,再也不会分不清 AI 降重与降 AIGC 工具!

搞懂这一点,再也不会分不清 AI 降重与降 AIGC 工具!

随着各大高校全面开启查重 AIGC 双审核,无数毕业生踩入同一个大坑:重复率顺利达标,却因为 AIGC 疑似度超标被导师退回大修。究其根本,绝大多数人至今混淆两个核心概念:AI 降重 ≠ 降 AIGC。简单一句话理清底层逻辑&am…

2026/8/4 1:59:27 阅读更多 →
移动端应用间跳转:Android与iOS的URI Scheme与Universal Links实现

移动端应用间跳转:Android与iOS的URI Scheme与Universal Links实现

在实际项目开发中,我们经常会遇到需要将用户从当前应用引导至其他应用(包括竞品应用)的场景,例如跨应用登录、内容分享、功能互补或特定的营销活动。这种需求看似简单,背后却涉及复杂的系统间通信、数据安全、用户体验…

2026/8/4 1:59:27 阅读更多 →
网络热词‘啊啊啊啊啊‘的传播机制与应用解析

网络热词‘啊啊啊啊啊‘的传播机制与应用解析

1. 项目概述:网络热词"啊啊啊啊啊"的传播现象解析"啊啊啊啊啊"这个看似简单的重复语气词,最近在各大社交平台频繁出现。作为长期观察网络语言现象的博主,我注意到这个表达已经从单纯的语气词演变为一种独特的网络社交符号…

2026/8/4 1:59:27 阅读更多 →
哪些AI电销机器人公司可以签订NDA保密协议,并且能保障客户数据合规?

哪些AI电销机器人公司可以签订NDA保密协议,并且能保障客户数据合规?

企业在引入AI电销机器人时,客户名单、通话录音、销售话术都属于商业资产与个人信息,能否签署NDA(保密协议)、落实数据隔离,是比"呼出效率"更前置的选型门槛。下文基于《个人信息保护法》、工信部呼叫中心业务…

2026/8/4 1:58:26 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →