对于刚接触前后端分离开发的初学者来说,Spring 作为后端框架、Vue2 作为前端框架的组合是非常经典且容易上手的选择。本文将从环境准备到项目联调,一步步带你搭建一个完整的前后端分离 Demo,帮助你快速理解两个技术栈的核心协作流程。
一、技术栈基础与环境准备
在开始编码前,我们需要先理清核心技术组件和开发环境配置,这是确保项目顺利推进的基础。
1.1 核心技术栈说明
后端(Spring 生态):
Spring Boot:简化 Spring 应用配置,快速搭建独立运行的后端服务
Spring MVC:处理 HTTP 请求,实现接口开发
Spring Data JPA:简化数据库操作,无需手动编写 SQL(适合入门)
前端(Vue2 生态):
Vue2:核心前端框架,基于组件化开发
Vue Router:实现前端路由跳转(页面切换)
Axios:发送 HTTP 请求,与后端接口交互
Element UI:提供现成 UI 组件,快速搭建页面(降低入门难度)
1.2 开发环境配置
后端环境:
JDK 1.8+(Spring Boot 2.x 推荐版本)
Maven 3.6+(项目依赖管理)
IntelliJ IDEA(推荐,社区版足够)
MySQL 8.0(数据库,需提前创建数据库实例)
前端环境:
Node.js 14+(Vue CLI 依赖,建议使用 LTS 版本)
npm 6+ 或 yarn(前端包管理工具)
Visual Studio Code(推荐,安装 Vetur 插件支持 Vue 语法)
环境验证:安装完成后,分别在终端执行 java -version、mvn -v、node -v,能正常显示版本号即配置成功。
二、后端开发:Spring Boot 接口实现
我们将创建一个简单的「用户管理」后端服务,包含查询、新增两个核心接口,演示 Spring Boot 的基本使用流程。
2.1 步骤 1:创建 Spring Boot 项目(IDEA)
打开 IDEA → 新建项目 → 选择「Spring Initializr」
配置项目信息:
Group:com.example(自定义,通常是公司域名反转)
Artifact:spring-vue-demo
类型:Maven
语言:Java
版本:Spring Boot 2.7.x(稳定版)
选择依赖:
Web → Spring Web(提供 HTTP 接口能力)
SQL → Spring Data JPA + MySQL Driver(数据库操作)
选择项目路径,完成创建。
2.2 步骤 2:配置数据库连接(application.properties)
打开 src/main/resources/application.properties,添加 MySQL 配置:
# 数据库连接地址(test为数据库名,需提前在MySQL中创建)
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
# 数据库用户名
spring.datasource.username=root
# 数据库密码(替换为你的MySQL密码)
spring.datasource.password=123456
# 数据库驱动(MySQL 8.0需指定此驱动)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# JPA配置:自动生成表结构,打印SQL(方便调试)
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
2.3 步骤 3:编写核心代码(实体类、接口、服务)
① 实体类(User.java)
对应数据库中的user表,使用 JPA 注解定义字段和表关系:
package com.example.springvuedemo.entity;
import javax.persistence.*;
@Entity // 标识为JPA实体类
@Table(name = "user") // 对应数据库表名
public class User {
@Id // 主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增策略
private Long id;
@Column(nullable = false) // 非空字段
private String name;
@Column(nullable = false)
private Integer age;
// 无参构造(JPA必需)
public User() {}
// 有参构造(用于创建对象)
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
// Getter和Setter(必须,否则无法访问字段)
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
② 数据访问接口(UserRepository.java)
继承JpaRepository,无需编写实现类即可获得基本 CRUD 能力:
package com.example.springvuedemo.repository;
import com.example.springvuedemo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
// JpaRepository<实体类, 主键类型>
public interface UserRepository extends JpaRepository<User, Long> {
}
③ 服务层(UserService.java)
封装业务逻辑,调用 Repository 操作数据库:
package com.example.springvuedemo.service;
import com.example.springvuedemo.entity.User;
import com.example.springvuedemo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service // 标识为服务类,交给Spring管理
public class UserService {
// 自动注入UserRepository(依赖注入)
@Autowired
private UserRepository userRepository;
// 1. 查询所有用户
public List<User> findAllUsers() {
return userRepository.findAll();
}
// 2. 新增用户
public User addUser(User user) {
return userRepository.save(user); // save()方法:新增/更新
}
}
④ 控制器(UserController.java)
定义 HTTP 接口,接收前端请求并返回数据:
package com.example.springvuedemo.controller;
import com.example.springvuedemo.entity.User;
import com.example.springvuedemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController // 标识为REST接口控制器(返回JSON数据)
@RequestMapping("/api/user") // 接口统一前缀(避免URL冲突)
@CrossOrigin // 允许跨域请求(前端和后端端口不同时必需)
public class UserController {
@Autowired
private UserService userService;
// 1. 查询所有用户:GET请求
@GetMapping
public List<User> getAllUsers() {
return userService.findAllUsers();
}
// 2. 新增用户:POST请求,接收JSON参数
@PostMapping
public User addUser(@RequestBody User user) {
return userService.addUser(user);
}
}
2.4 步骤 4:启动后端服务
找到项目主类 SpringVueDemoApplication.java(带@SpringBootApplication注解)
点击 IDEA 右上角的「运行」按钮,启动服务
验证:服务启动成功后,访问http://localhost:8080/api/user(默认端口 8080),此时返回空数组[](数据库中暂无数据),说明接口正常。
三、前端开发:Vue2 页面与接口交互
我们将使用 Vue CLI 创建前端项目,开发一个简单的用户管理页面,实现「查询用户列表」和「新增用户」功能,演示 Vue2 与后端接口的交互。
3.1 步骤 1:创建 Vue2 项目(Vue CLI)
打开终端,执行命令安装 Vue CLI(已安装可跳过):
npm install -g @vue/cli
创建 Vue 项目:
vue create vue2-demo
选择配置:
手动选择特性(Manually select features)
勾选:Babel、Router、CSS Pre-processors(其他暂时不选)
选择 Vue 版本:2.x
其他选项默认(按回车即可)
进入项目目录并启动:
cd vue2-demo
npm run serve
验证:访问http://localhost:8081(默认端口 8081,避免与后端冲突),能看到 Vue 欢迎页即创建成功。
3.2 步骤 2:安装依赖(Element UI + Axios)
在前端项目目录下执行命令,安装所需依赖:
# 安装Element UI(Vue2版本)
npm i element-ui -S
# 安装Axios(HTTP请求工具)
npm i axios -S
3.3 步骤 3:全局配置(main.js)
打开 src/main.js,引入 Element UI、Axios 并全局注册:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
// 1. 引入Element UI
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
// 2. 引入Axios
import axios from 'axios'
// 配置Axios基础路径(后端接口前缀)
axios.defaults.baseURL = 'http://localhost:8080/api'
// 将Axios挂载到Vue原型,方便所有组件使用
Vue.prototype.$axios = axios
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount('#app')
3.4 步骤 4:开发用户管理页面(User.vue)
在 src/views 目录下创建 User.vue 文件,实现页面布局和接口交互逻辑:
<template>
<div class="www.kaLeebags.com">
<el-card title="用户管理" style="margin: 20px;">
<!-- 1. 新增用户表单 -->
<el-form :model="newUser" label-width="80px" style="margin-bottom: 20px;">
<el-form-item label="姓名">
<el-input v-model="douyin.joyyouxi.com" placeholder="请输入姓名"></el-input>
</el-form-item>
<el-form-item label="年龄">
<el-input v-model.number="web.joyyouxi.com" placeholder="请输入年龄"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="kaLeebags.com">新增用户</el-button>
</el-form-item>
</el-form>
<!-- 2. 用户列表表格 -->
<el-table :data="m.kaLeebags.com" border stripe>
<el-table-column prop="id" label="ID" width="80"></el-table-column>
<el-table-column prop="name" label="姓名"></el-table-column>
<el-table-column prop="age" label="年龄" width="80"></el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
export default {
name: 'User',
data() {
return {
// 新增用户表单数据
newUser: {
name: '',
age: ''
},
// 用户列表数据
userList: []
}
},
mounted() {
// 页面加载完成后,查询用户列表
this.getUserList()
},
methods: {
// 1. 查询用户列表(调用后端GET接口)
async getUserList() {
try {
// 使用Axios发送GET请求
const response = await this.$axios.get('/user')
this.userList = response.data // 将后端返回的数据赋值给userList
} catch (error) {
this.$message.error('查询用户失败,请重试!')
console.error(error)
}
},
// 2. 新增用户(调用后端POST接口)
async addUser() {
// 简单表单验证
if (!this.newUser.name || !this.newUser.age) {
this.$message.warning('姓名和年龄不能为空!')
return
}
try {
// 发送POST请求,携带JSON格式的用户数据
await this.$axios.post('/user', this.newUser)
this.$message.success('新增用户成功!')
// 新增成功后,重置表单并重新查询列表
this.newUser = { name: '', age: '' }
this.getUserList()
} catch (error) {
this.$message.error('新增用户失败,请重试!')
console.error(error)
}
}
}
}
</script>
<style scoped>
.user-container {
padding: 20px;
}
</style>
3.5 步骤 5:配置路由(index.js)
打开 src/router/index.js,添加 User 页面的路由规则:
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
// 引入User组件
import User from './views/User.vue'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'Home',
component: Home
},
// 添加User页面路由
{
path: '/user',
name: 'User',
component: User
}
]
})
3.6 步骤 6:启动前端服务并测试
确保后端服务已启动(端口 8080)
前端项目目录下执行 npm run serve,启动前端服务(端口 8081)
访问http://localhost:8081/#/user,进入用户管理页面:
输入姓名和年龄,点击「新增用户」,提示 “新增成功”
表格中会显示新增的用户数据(数据来自后端数据库)
刷新页面,数据依然存在(说明数据已持久化到 MySQL)
四、前后端联调常见问题与解决方案
跨域问题:前端访问后端时出现「Access to XMLHttpRequest at ... from origin ... has been blocked by CORS policy」
解决方案:后端控制器类上添加 @CrossOrigin 注解(如本文 2.3 节④中的代码)。
数据库连接失败:后端启动时提示「Could not create connection to database server」
检查 MySQL 是否已启动
确认 application.properties 中的用户名、密码、数据库名是否正确
MySQL 8.0 需指定 driver-class-name: com.mysql.cj.jdbc.Driver(而非旧版的 com.mysql.jdbc.Driver)
前端请求 404:访问接口时出现「404 Not Found」
检查后端接口路径是否正确(如本文中后端接口前缀是 /api/user)
确认前端 Axios 的 baseURL 配置是否与后端一致(本文中是http://localhost:8080/api)
五、项目扩展方向(入门后进阶)
掌握了基础的前后端分离流程后,可以尝试以下扩展:
后端:
增加用户修改、删除接口(使用 JpaRepository 的 save()、deleteById() 方法)
添加参数校验(使用 javax.validation 注解,如 @NotBlank、@Min)
集成 Spring Security 实现用户登录认证
前端:
增加用户修改、删除功能(调用后端对应接口)
使用 Vuex 管理全局状态(如用户登录信息)
优化页面样式和交互(如表单验证提示、加载中动画)
通过本文的实战,你已经掌握了 Spring Boot + Vue2 前后端分离的核心流程:从环境搭建到接口开发,再到前端页面与后端的交互。后续可以基于这个 Demo 不断扩展功能,逐步深入两个技术栈的更多特性。