1. 项目概述与开发环境准备
Spring Boot+Vue.js是目前企业级应用开发中最流行的全栈技术组合之一。作为一名长期从事前后端分离开发的工程师,我经常需要从零开始搭建这样的项目框架。本文将详细介绍如何从环境配置到前后端联调的完整过程,包含大量实际开发中的经验技巧。
1.1 技术选型解析
选择Spring Boot作为后端框架主要基于以下考虑:
- 内嵌Tomcat服务器,无需单独部署
- 自动配置特性大幅减少XML配置
- 丰富的Starter依赖简化集成过程
- 完善的生态体系和企业级支持
Vue.js作为前端框架的优势:
- 渐进式框架,学习曲线平缓
- 组件化开发模式提高代码复用率
- 响应式数据绑定简化DOM操作
- 丰富的官方和社区生态(如Element UI)
1.2 开发环境配置清单
基础软件环境
-
Node.js (v14+)
- 验证安装:
node -v - 建议使用nvm管理多版本
- 验证安装:
-
Vue CLI (v5.0.8+)
- 安装:
npm install -g @vue/cli - 验证:
vue -V
- 安装:
-
JDK (推荐JDK11/17)
- 验证:
java -version和javac -version - 注意配置JAVA_HOME环境变量
- 验证:
-
IDE选择
- IntelliJ IDEA Ultimate(后端开发)
- VS Code(前端开发,轻量级)
数据库环境
-
MySQL (v8.0+)
- 建议使用Docker容器部署
- 可视化工具:Navicat/DBeaver
-
Redis (可选)
- 用于会话缓存等场景
提示:所有环境安装完成后,建议执行
vue --version、java -version等命令进行交叉验证,确保环境变量配置正确。
2. Vue前端工程搭建实战
2.1 项目初始化与配置
使用Vue CLI创建项目时,推荐选择手动配置:
bash复制vue create springboot-vue-demo
配置选项建议:
- 选择Vue 2.x(企业项目更稳定)
- 添加Babel和Router
- 选择ESLint + Standard config
- 配置文件位置:In dedicated config files
国内开发者必备优化
- 设置淘宝镜像源:
bash复制npm config set registry https://registry.npmmirror.com
- 安装yarn替代npm:
bash复制npm install -g yarn
yarn config set registry https://registry.npmmirror.com
2.2 核心架构设计
目录结构规范
code复制src/
├── api/ # 接口请求封装
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex状态管理
├── utils/ # 工具函数
├── views/ # 页面组件
└── App.vue # 根组件
全局样式方案
- 创建
src/assets/styles目录 - 添加reset.css重置浏览器默认样式
- 创建variables.scss定义CSS变量
- 在main.js中全局引入:
javascript复制import '@/assets/styles/reset.css'
import '@/assets/styles/variables.scss'
2.3 Element UI深度集成
按需引入优化
- 安装依赖:
bash复制yarn add element-ui
yarn add babel-plugin-component -D
- 修改babel.config.js:
javascript复制module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [
[
'component',
{
libraryName: 'element-ui',
styleLibraryName: 'theme-chalk'
}
]
]
}
- 创建src/plugins/element.js:
javascript复制import Vue from 'vue'
import { Button, Table, Pagination } from 'element-ui'
Vue.use(Button)
Vue.use(Table)
Vue.use(Pagination)
主题定制技巧
- 安装sass-loader:
bash复制yarn add sass-loader node-sass -D
- 创建主题变量文件:
scss复制/* element-variables.scss */
$--color-primary: #1890ff;
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";
- 在vue.config.js中配置:
javascript复制module.exports = {
css: {
loaderOptions: {
sass: {
prependData: `@import "@/styles/element-variables.scss";`
}
}
}
}
3. Spring Boot后端工程搭建
3.1 项目初始化关键点
使用Spring Initializr创建项目时需注意:
- 打包方式选择Jar
- Java版本与本地环境一致
- 必选依赖:
- Spring Web
- MyBatis Framework
- MySQL Driver
- Lombok
POM文件优化配置
xml复制<!-- 阿里云镜像加速 -->
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<!-- 资源过滤配置 -->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
3.2 分层架构设计
标准项目结构:
code复制src/main/java/
├── config/ # 配置类
├── controller/ # 控制器层
├── service/ # 服务层
│ ├── impl/ # 服务实现
├── dao/ # 数据访问层
├── entity/ # 实体类
├── dto/ # 数据传输对象
├── util/ # 工具类
└── Application.java
数据库配置示例
yaml复制# application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
3.3 跨域解决方案
全局CORS配置
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
控制器层示例
java复制@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public Result listUsers(@RequestParam Map<String, Object> params) {
PageUtils page = userService.queryPage(params);
return Result.ok().put("page", page);
}
}
4. 前后端联调实战
4.1 接口规范设计
推荐RESTful风格:
- GET /api/users - 获取用户列表
- POST /api/users - 创建用户
- PUT /api/users/{id} - 更新用户
- DELETE /api/users/{id} - 删除用户
统一响应格式
java复制public class Result extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public Result() {
put("code", 0);
put("msg", "success");
}
public static Result error(int code, String msg) {
Result r = new Result();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static Result ok() {
return new Result();
}
public Result put(String key, Object value) {
super.put(key, value);
return this;
}
}
4.2 Axios封装技巧
请求拦截器示例
javascript复制import axios from 'axios'
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000
})
// 请求拦截
service.interceptors.request.use(
config => {
const token = localStorage.getItem('token')
if (token) {
config.headers['Authorization'] = 'Bearer ' + token
}
return config
},
error => {
return Promise.reject(error)
}
)
// 响应拦截
service.interceptors.response.use(
response => {
const res = response.data
if (res.code !== 0) {
Message.error(res.msg || 'Error')
return Promise.reject(new Error(res.msg || 'Error'))
} else {
return res
}
},
error => {
Message.error(error.message)
return Promise.reject(error)
}
)
export default service
4.3 开发环境代理配置
javascript复制// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
}
5. 项目部署与优化
5.1 前端构建优化
多环境配置
- 创建.env.development
code复制NODE_ENV=development
VUE_APP_BASE_API=/api
- 创建.env.production
code复制NODE_ENV=production
VUE_APP_BASE_API=http://your-domain.com/api
打包配置
javascript复制// vue.config.js
module.exports = {
productionSourceMap: false,
configureWebpack: {
externals: process.env.NODE_ENV === 'production' ? {
'vue': 'Vue',
'element-ui': 'ELEMENT'
} : {}
}
}
5.2 后端部署方案
JAR包运行
bash复制nohup java -jar your-application.jar --spring.profiles.active=prod > app.log 2>&1 &
常用JVM参数
code复制-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
5.3 性能监控方案
- Spring Boot Actuator
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- Prometheus + Grafana监控
xml复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
在实际项目开发中,我发现Element UI的按需引入可以显著减小打包体积,而Spring Boot的多环境配置则大大简化了部署流程。前后端分离开发时,一定要确保接口文档的及时更新,推荐使用Swagger或YApi等工具进行协作。