基于Vue+SpringBoot+MySQL实现个人博客系统

简介: 基于Vue+SpringBoot+MySQL实现个人博客系统

基于Vue+SpringBoot+MySQL实现个人博客系统

实现前后端完全分离:

前端

  • 使用Vue等技术构建单页应用
  • 通过Axios或Fetch调用后端提供的API
  • 关注交互逻辑和UI展现

后端

  • 提供基于RESTful的JSON API
  • 只关注数据与业务逻辑
  • 不关心前端技术

交互

  • 前端通过Axios等调用后端API
  • 后端返回JSON数据
  • 前端根据JSON数据更新UI

优点

  • 前后端解耦
  • 独立开发、部署
  • 更易于维护
  • 前端可替换
  • 后端可扩展

例如:

// 前端
axios.get('/api/articles').then(response => {
  this.articles = response.data
})
// 后端
@GetMapping("/api/articles")
public List<Article> getArticles() {
  return articleService.findAll();
}

上述代码实现了:

  • 前端调用/api/articles接口获取文章列表数据
  • 后端提供基于RESTful的JSON API接口
  • 通过JSON数据交互

实现前后端分离。

前端只关注使用JSON数据更新UI,后端只关注提供JSON数据。

部署方面,前端可以部署到任何webapp上,后端可以部署到任何Java应用服务器。

通过这种方式,我们可以:

  • 独立开发前后端
  • 独立部署前后端
  • 通过JSON数据进行通信

前端(Vue):

创建Vue项目,包含路由、状态管理等

根据你提供的需求,可按以下步骤创建Vue项目:

  1. 创建项目
vue create my-blog

选择默认配置(请选择Manually select features)

  1. 安装依赖
npm install vue-router vuex axios
  • vue-router:路由
  • vuex:状态管理
  • axios:请求库
  1. 定义路由(router/index.js)
import VueRouter from 'vue-router'
const router = new VueRouter({
  routes: [
    { path: '/', component: ArticleList }
  ]
})
export default router
  1. 创建状态管理器(store/index.js)
import Vuex from 'vuex'
const store = new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: { 
  }
})
export default store
  1. 定义接口服务(api/article.js)
import axios from 'axios'
export default {
  getArticles() {
    return axios.get('/api/articles')  
  }
}

通过这种方式,我们基本搭建好路由、状态管理和接口调用功能,后续再根据需求完善组件、actions等内容。

定义ArticleList组件,获取文章列表

ArticleList组件获取文章列表的代码如下:

<template>
  <ul>
    <li v-for="article in articles">
     {{ article.title }}   
    </li>    
  </ul>
</template>
<script>
export default {  
  data() {
    return {
      articles: []
    }   
  },
  created() {
    this.getArticles()    
  },   
  methods: {
    async getArticles() {
      let { data } = await axios.get('/api/articles')    
      this.articles = data    
    }    
  }    
}   
</script>
  • data函数中定义articles数组保存文章数据
  • created生命周期钩子中,调用getArticles方法获取文章列表
  • getArticles方法异步调用接口请求文章列表
  • 接口请求成功后,将响应数据data赋值给articles,从而渲染文章列表

主要功能包括:

  1. 定义articles数据
  2. created钩子中调用接口
  3. 通过await执行异步接口请求
  4. 接口成功后设置articles渲染列表

上述代码实现了:

  • 定义ArticleList组件渲染文章列表
  • 在创建时调用接口获取文章数据
  • 设置数据后渲染列表

重复定义ArticleEdit、TagList等组件

根据你提供的需求,可按以下步骤定义其他组件:

  1. ArticleEdit组件
<template>
  <form @submit.prevent="saveArticle">
    <input v-model="article.title" /> 
    <textarea v-model="article.content"></textarea>
    <button type="submit">保存文章</button>   
  </form>  
</template>
<script>
export default {
  data() {
    return {
      article: {
        title: '',
        content: ''  
      }
    }
  },
  methods: {    
    async saveArticle() {
      await axios.post('/api/article', this.article)
      this.$router.push('/')     
    }    
  }    
}
</script>
  1. TagList组件
<template>
 <ul>
   <li v-for="tag in tags">
    {{ tag.name }}
   </li>
 </ul>  
</template>
<script>
export default {    
  data() {
    return {
      tags: []
    }      
  },  
  async created() {
    let { data } = await axios.get('/api/tags')
    this.tags = data    
  }   
}
</script>
  1. CommentList组件
<template>
  <ul>  
   <li v-for="comment in comments">
     <p>{{ comment.content }}</p>   
   </li>      
  </ul>
</template>
<script>
export default {
  data() {
    return {
      comments: []
    }
  },
  async created() {
    let { data } = await axios.get('/api/comments')
    this.comments = data      
  }        
}
</script>

通过定义不同的组件,对应处理不同的数据和业务逻辑,我们就可以完整展现页面所需功能。

后端(Spring Boot):

创建Spring Boot项目,配置JPA和MySQL依赖

根据需求,可以按照以下步骤搭建Spring Boot项目:

  1. 使用IDE(IDEA、STS)创建 Spring Initialzr 项目

选择:

  • Group: com.example
  • Artifact: demo
  • Java: 1.8
  • Packaging: Jar
  • Dependencies:
  • Web
  • MySQL
  • JPA
  1. 添加MySQL连接信息

application.properties添加:

spring.datasource.url= jdbc:mysql://localhost:3306/demo  
spring.datasource.username= root
spring.datasource.password= 123456
  1. 定义Article实体类
@Entity
public class Article {
  @Id  
  @GeneratedValue
  private Long id;
  private String title;
  private String content;
  // getters and setters
}
  1. 定义ArticleRepository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}
  1. 定义ArticleService
@Service
public class ArticleService {
  @Autowired
  ArticleRepository articleRepository;
  public List<Article> findAll() {
    return articleRepository.findAll();
  }
}
  1. 定义ArticleController提供API
@GetMapping("/articles")
public List<Article> findAll() {
  return articleService.findAll();
}

通过这种方式,我们基于Spring Boot + JPA 就能快速搭建一个连接MySQL的示例项目。

定义Article实体类映射到数据库表

,Article实体类可以如下定义:

@Entity
@Table(name = "articles")
public class Article {
  @Id  
  @GeneratedValue  
  private Long id;
  @Column(name = "title")  
  private String title;  
  @Column(name = "content")  
  private String content;  
  // getters and setters  
}

主要特征有:

  1. 使用@Entity注解声明这是一个实体类
  2. 使用@Table指定数据库表名为articles
  3. id字段使用@Id@GeneratedValue注解,指定为主键和自动增长
  4. 其他字段使用@Column注解指定数据库列名
  5. 为字段提供对应的gettersetter方法

当我们运行项目时,Spring Data JPA 会根据此对象对应的表的结构:

CREATE TABLE articles (
  id bigint AUTO_INCREMENT,   
  title VARCHAR(255),
  content TEXT,
  PRIMARY KEY (id)
)

所以通过在实体类上使用JPA注解,我们就实现了:

  • 定义一个映射到数据库表的实体类
  • 指定主键和列名映射
  • 将Java属性映射到数据库列

JPA在后续进行持久化时,就会根据此对象操作对应的数据库表。

定义ArticleRepository接口,继承JpaRepository

根据需求,ArticleRepository可以如下定义:

public interface ArticleRepository extends JpaRepository<Article, Long> {
}
  • 继承JpaRepository
  • 参数一:管理的实体类Article
  • 参数二:实体类主键类型Long

通过继承JpaRepository,我们即声明了一个操作Article实体类与数据库表对应的仓库接口。

Spring Data JPA会自动为我们实现该接口,提供如下方法:

save()   // 保存实体
findAll() //查询全部
findById() // 根据id查询
...

比如findAll()方法实现为:

public List<Article> findAll() {
  return em.createQuery("from Article").getResultList();
}

所以通过继承JpaRepository,我们只需要定义接口即可:

  • 不需要编写任何实现
  • Spring Data JPA会自动实现
  • 提供CRUD和复杂查询的方法

在后续ArticleService中,我们可以通过自动装配的方式使用此仓库:

@Autowired
ArticleRepository articleRepository;

通过调用其方法实现与数据库的交互。

定义ArticleService服务,调用Repository

根据需求,ArticleService可以如下定义:

@Service
public class ArticleService {
  @Autowired 
  ArticleRepository articleRepository;
  public List<Article> findAll() {
    return articleRepository.findAll();
  }
  // 定义其他方法 
}
  • 使用@Service注解声明这是一个服务类
  • 通过@Autowired自动装配ArticleRepository
  • 定义findAll()方法调用仓库的findAll()方法获取全部文章
  • 可以定义其他业务方法,调用Repository

所以在服务类中:

  1. 通过@Autowired注入对应的仓库
  2. 定义业务方法,调用仓库方法
  3. 提供业务逻辑

同时我们:

  • 解耦了Service和Repository
  • 服务可以支持多种数据持久层
  • Repository专注于数据访问

在Controller中,我们可以注入此服务类使用:

@Autowired
ArticleService articleService;
// ...
articleService.findAll();

通过这种设计:

  • Service调用Repository访问数据
  • Controller调用Service提供业务

实现了清晰的分层结构。

定义ArticleController控制器,提供RESTful API

根据你的需求,ArticleController可以如下定义:

@RestController
@RequestMapping("/api/articles")
public class ArticleController {
  @Autowired
  ArticleService articleService;
  @GetMapping
  public List<Article> findAll() {
    return articleService.findAll();  
  }
  @GetMapping("/{id}")  
  public Article findById(@PathVariable Long id) {
    ...  
  }
  // 其它API
}

主要特征:

  1. 使用@RestController注解,代表一个RESTful的控制器
  2. 使用@RequestMapping指定基础URL为/api/articles
  3. 通过@Autowired注入ArticleService
  4. 使用@GetMapping标注GET请求路由,映射到方法
  5. 在方法中调用服务进行业务逻辑
  6. 使用@PathVariable绑定URL模板变量,如id
  7. 返回对应实体类的JSON数据

通过这种方式,我们定义了与Article相关的所有RESTful API:

  • GET /api/articles 获取全部文章
  • GET /api/articles/{id} 根据id获取文章
  • 其他获取、新增、修改、删除文章的API

客户端(前端)通过这些接口与后端交互,获取JSON格式的数据。

重复定义Tag、Comment等实体类

根据需求,可以按照以下方式定义Tag、Comment等实体类:

Tag

@Entity
public class Tag {
  @Id  
  @GeneratedValue  
  private Long id;
  @Column(name = "name")
  private String name;
  @ManyToMany  
  @JoinTable(
     name = "article_tag", 
     joinColumns = @JoinColumn(name = "tag_id"),
     inverseJoinColumns = @JoinColumn(name = "article_id"))       
  private Set<Article> articles;
  // getters and setters  
}

Comment

@Entity
public class Comment {
  @Id  
  @GeneratedValue  
  private Long id;  
  @Column(name = "content")     
  private String content;  
  @ManyToOne
  @JoinColumn(name = "article_id")  
  private Article article;
  // getters and setters
}

主要特征:

  • 使用JPA注解定义实体类
  • 指定ID生成策略
  • 映射数据库表字段
  • 定义关系:
  • @ManyToMany 一个标签对应多个文章
  • @ManyToOne 一个评论对应一个文章
  • 使用@JoinTable指定关系表article_tag
  • 为属性提供gettersetter方法

通过这种方式,我们可以:

  • 定义多个实体类映射到不同数据库表
  • 定义实体类间的关系映射
  • 搭建完整的ORM框架

部署:

分别构建并部署Vue项目和Spring Boot项目

根据你的需求,可以按以下步骤分别构建和部署Vue前端项目和Spring Boot后端项目:

Vue项目

  1. 使用vue create命令创建Vue项目
  2. 安装依赖:npm install
  3. 开发前端组件,定义接口调用等
  4. 构建产物:
npm run build

此命令会构建出一个dist文件夹,包含静态文件

  1. 部署:
  • 直接上传dist文件夹到任意web服务器即可提供服务
  • 也可以使用:npm install -g serve安装serve,使用serve -s dist本地部署

Spring Boot项目

  1. 使用IDE创建Spring Initializr项目
  2. 连接MySQL数据库,编写实体、服务、接口等代码
  3. 构建产物:
./mvnw package

生成一个可执行的jar文件

  1. 部署:
  • 直接运行jar文件:java -jar demo.jar
  • 也可部署到任意Java服务器上

交互

  • Vue项目中,通过Axios调用Spring Boot提供的RESTful API接口
  • 获取JSON数据后,渲染到相应组件
  • 实现前后端完全分离

通过这种方式,我们可以:

  • 分别开发和部署前后端
  • 前端使用Vue等技术
  • 后端提供RESTful API服务
  • 前后端通过JSON交互

实现前后端完全分离的个人博客系统。

Vue通过Axios调用Spring Boot提供的JSON API

前端Vue项目通过Axios调用Spring Boot提供的JSON API的过程如下:

在Vue项目中,需要:

  1. 安装Axios库:
npm install axios
  1. 定义接口服务:
import axios from 'axios'
export default {  
  getArticles() {
    return axios.get('http://localhost:8080/api/articles')  
  }
}
  1. 在组件中使用接口:
import ArticleApi from './api/article'
export default {
  methods: {
    async loadArticles() {
      let { data } = await ArticleApi.getArticles()
      this.articles = data    
    }
  } 
}
  1. 调用方法加载数据:
created() {
  this.loadArticles()
}

在Spring Boot后端,需要定义:

  1. ArticleController:
@GetMapping("/api/articles")
public List<Article> getArticles() {
  return articleService.findAll();  
}
  1. ArticleService,ArticleRepository在Spring Boot后端,需要定义:ArticleService
@Service
public class ArticleService {
  @Autowired
  ArticleRepository articleRepository;
  public List<Article> findAll() {
    return articleRepository.findAll();  
  }
}
  1. ArticleService中的方法:
  • 调用ArticleRepository进行数据访问
  • 提供业务逻辑,如新增、删除文章
  1. ArticleRepository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}
  1. ArticleRepository:
  • 继承JpaRepository,定义对Article操作的方法
  • Spring Data JPA会自动实现接口,提供基本CRUD方法
  1. ArticleController
@RestController
public class ArticleController {
  @Autowired
  ArticleService articleService;
  @GetMapping("/api/articles")  
  public List<Article> getArticles() {
    return articleService.findAll();  
  }  
}
  1. ArticleController:
  • 定义JSON API端点
  • 通过@Autowired注入ArticleService
  • 实现HTTP请求处理方法,调用ArticleService
  1. 三者组合结构:
  • ArticleRepository提供数据访问
  • ArticleService封装业务逻辑,调用Repository
  • ArticleController提供API,调用Service
  1. 分层设计:
  • 解耦了数据访问和业务逻辑
  • Repository只负责数据,Service只负责业务
  • Controller只关注API定义
  1. 所以在Spring后端,需要定义三个部分:Repository(数据)、Service(业务)和Controller(API)。

上述接口会返回:

[ 
  {
    "id": 1,
    "title": "Introduction to Spring Boot",
    "content": "..."   
  },
  ...
]

Vue项目通过Axios调用该接口,获取JSON数据,再设置给articles 用来渲染。

通过这种方式,我们实现了:

  • 前端通过Axios调用后端提供的JSON API接口
  • 后端使用Spring MVC定义Restful JSON API
  • 通过JSON交互实现前后端分离
  • 实现前后端完全分离

通过以上步骤,我们就可以实现一个基于Vue、Spring Boot和MySQL的简单个人博客系统,实现前后端分离


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
432 10
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
1451 5
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
867 7
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
1287 1
|
11月前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
1423 4
基于springboot+vue开发的会议预约管理系统
|
12月前
|
前端开发 JavaScript Java
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
本系统基于SpringBoot与Vue3开发,实现校园食堂评价功能。前台支持用户注册登录、食堂浏览、菜品查看及评价发布;后台提供食堂、菜品与评价管理模块,支持权限控制与数据维护。技术栈涵盖SpringBoot、MyBatisPlus、Vue3、ElementUI等,适配响应式布局,提供完整源码与数据库脚本,可直接运行部署。
618 6
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
975 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
589 5
|
Java 关系型数据库 MySQL
Spring Boot入门(2)使用MySQL数据库
介绍   本文将介绍如何在Spring项目中连接、处理MySQL数据库。   该项目使用Spring Data JPA和Hibernate来连接、处理MySQL数据库,当然,这仅仅是其中一种方式,你也可以使用Spring JDBC或者MyBatis.   Spring Data JPA是Spring Data的一个子项目,主要用于简化数据访问层的实现,使用Spring Data JPA可以轻松实现增删改查、分页、排序等。
2833 0
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1447 0

推荐镜像

更多