Spring + Vue2 入门实战:从零搭建前后端分离项目

对于刚接触前后端分离开发的初学者来说,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 不断扩展功能,逐步深入两个技术栈的更多特性。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容