吐血整理最佳实践:SpringBoot整合Vue前后端分离开发

[toc]

开发环境

  • IDEA V2018.5
  • npm v6.4.x
  • vue-cli v2.9.x

创建项目

IDEA > Create New Project > Gradle

2018-10-27.10.40.49-image.png

此处的 Frameworks全部取消勾选,接着就一直 Next,提示填写的地方填写,不需要填写的就用默认配置就 ok。

项目创建成功,项目结构应该是这样的。


2018-10-27.10.48.48-image.png

创建后台模块

▼ 项目 > 右键 > New > Module

2018-10-28.00.50.19-image.png

▼ Spring Initializr

2018-10-28.00.52.21-image.png

▼ 这一步按照正常项目信息填写。

注意:Type 属性需要选择 Gradle Config

2018-10-28.00.54.47-image.png

▼ 按照自己需要的依赖进行选取

2018-10-28.00.57.14-image.png

▼ 下一步默认,然后 Finish。之后需要等待 Gradle 进行模块的初始化,如果是首次创建 SpringBoot 项目,此处初始化可能需要比较长的时间,需要耐心和良好的网络环境。

2018-10-28.01.03.54-image.png

成功后是如上所示结构,之后我们需要手动完善一些结构和配置

配置后台模块

一、配置模块依赖

在根项目的settings.gradle文件中增加 include 'server'

2018-10-28.01.08.45-image.png

二、完善 server 项目工程结构

server 目录默认创建出来只有一个build.gradle文件,我们需要手工完善项目结构

2018-10-28.01.15.43-image.png

如上图所示,可以看到,我们其实建立出来的就是一个标准的 java 工程结构。

  • src 目录下游 main 目录,正常情况此处src 下还需要有 test 目录,这里演示就略过了。
  • main 下面创建 java 和 resources 。
  • java 下面创建对应的包结构和 SpringBoot 的启动类,代码如图的右边区域,非初次接触 SpringBoot 对这个代码应该不陌生。
  • resources 目录下暂时就只创建配置文件application.yml

三、配置后台数据源

加入了数据源的 SpringBoot 项目需要在application.yml中配置数据源信息,否则项目会启动失败。

2018-10-28.02.32.31-image.png

# 配置项目的数据源
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&useUnicode=true&useSSL=false
    password: root
    username: root

到此后台模块创建配置完成

创建前端模块

▼ 项目 > 右键 > New > Module

2018-10-28.01.25.41-image.png

前端模块这里选择 Gradle,然后注意右边 Frameworks 这里需要取消 java 的勾选

2018-10-28.01.28.34-image.png

这一步只需要填写一下 ArtifactId,名字可以自己定义,不一定要照搬我的命名习惯。然后一直下一步 直到 Finish。

2018-10-28.01.30.37-image.png

模块完成初始化后,结构如上图所示,多出一个 client 目录,也是只有一个 build.gradle 文件。由于这个我们之间选择的新增 Gradle 的模块,所以在 settings.gradle 文件中,工具自动帮我们把 include 补全了。


▼▼▼接下来就是比较关键的步骤了,敲黑板.....▼▼▼

我们需要将 client 模块初始化为 vue 项目。这里我们用到的 vue 提供的vue-cli模块。

关于 vue-cli 的安装请参考百度。

初始化 vue 项目

打开 idea 底部的 Terminal


2018-10-28.01.38.58-image.png

在控制台输入:

vue init webpack client

注意: 此处的项目名称一定需要和你的创建前端模块的名称一致。例如我的前端模块目录是 client,我这里就是vue init webpack client。然后其他的配置,的配置选项就是正常的 vue 初始化过程了。我这里选择的构建工具是 Yarn,不是 npm。此处的选择不影响后面的构建。

2018-10-28.01.46.08-image.png

这一步完成后,基本的前端模块算初始化完成。接下来,我们需要将前端模块整合道 Gradle 中便于统一编译和管理。

配置前端模块

一、clinet/build.gradle配置

2018-10-28.01.54.54-image.png

将clinet/build.gradle内容修改为如下:

plugins {
    id "com.moowork.node" version "1.2.0"
}

node {
    version = '8.7.0'
    yarnVersion = '1.3.2'
    download = true
}

task bootRun(dependsOn: 'start') {
    group = 'application'
    description = 'Run the client app (for use with gradle bootRun -parallel)'
}

task start(type: YarnTask, dependsOn: 'yarn') {
    group = 'application'
    description = 'Run the client app'
    args = ['run', 'start']
}

task build(type: YarnTask, dependsOn: 'yarn') {
    group = 'build'
    description = 'Build the client bundle'
    args = ['run', 'build']
}

此处主要是为Gradle 配置了几个任务。大致意思就是用 Gradle 来代理执行前端的编译命令。

二、build.gradle配置

这里需要配置是根项目下的build.gradle

2018-10-28.02.01.29-image.png

在build.gradle 中追加下面代码

task copyHtml(type: Copy) {
    group = 'build'
    description = '复制编译后的index.html到 server 的 resource 目录'
    from 'client/dist/index.html'
    into 'server/build/resources/main/static'
}

task copyStatic(type: Copy, dependsOn: 'copyHtml') {
    group = 'build'
    description = '复制编译后的静态文件到 server 的 resource 目录'

    from 'client/dist/static'
    into 'server/build/resources/main/static/static'
}

copyStatic.mustRunAfter('client:build')

task mergeBuild(dependsOn: ['client:build', ':copyStatic', 'server:bootJar']) {
    group = 'build'
    description = '合并编译输出'
}

task independentBuild(dependsOn: ['client:build', 'server:bootJar']) {
    group = 'build'
    description = '独立编译输出'
}

此处主要解释一下mergeBuildindependentBuild

mergeBuild:合并编译输出

合并编译输出输出的意思,表示前后端开发的时候是分模块分离开发,但是最终编译到发布项目的时候,会将前端编译的静态内容和html 复制道后台SpringBoot 项目的静态资源目录中,从而达到一体发布。

independentBuild:独立编译输出

独立编译输出区别于mergeBuild是不会复制前端文件到SpringBoot端来,所以我们在部署项目的时候,需要单独部署前端服务。

三、配置前端开发模式代理

2018-10-28.02.12.45-image.png

client/config/index.js 修改proxyTableport两处配置,如图所示。端口修改是因为,SpringBoot 运行的默认端口也是8080,为了不冲突,前端修改端口。proxyTable表示在开发阶段,前端所有已/server开头的请求,都代理到http://localhost:8080后台服务进行处理,pathRewrite意思是代理的转发时,剔除/server部分。


例:

前台请求:http://localhost:8081/server/user/list

实际代理执行请求:http://localhost:8080/user/list

端口和路径都发生了变化

到此项目的初始配置就基本完成。


最后:如何运行项目

2018-10-28.02.22.52-image.png

找到 idea 右边栏上的 Gradle 选项卡,打开找到 vueb 下面的 Tasks>appplication>bootRun 右键选择Create 'vueb [bootRun]'...

2018-10-28.02.24.32-image.png

在 Arguments 中增加-parallel参数,然后 ok。

2018-10-28.02.26.27-image.png

最后在运行栏中可以看到配置的启动项。点击旁边的三角形就可以同时启动前端和后端服务。

2018-10-28.02.27.45-image.png

最后可以看到控制台提示两个启动成功的信息,则表示项目构建成功。

2018-10-28.02.36.03-image.png

上图所示,表示 SpringBoot 项目启动成功

2018-10-28.02.36.17-image.png

上图所示,前端项目启动成功,我们可以访问http://localhost:8081

2018-10-28.02.38.04-image.png

Over

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • //获取当前时间 Calendar calendar = Calendar.getInstance(); //获取...
    君养了只羊阅读 573评论 0 1
  • 四个姑娘中的两个从她住的地方搬了出来,找了一个差不多的主卧,花着差不多的价钱,离地铁差不多的距离。 因为这两个姑娘...
    失真图阅读 233评论 0 0
  • 这两天,因为单位出现电路故障,没电,无法正常上班。所以休假在家,连同端午节,5天小长假,乐得清闲。早上送孩子去上学...
    一哈哈儿阅读 1,179评论 2 2
  • 9月9日,苹果召开了2015年秋季新品发布会。让我用四分钟来告诉你发布会所有的干货吧,全程高能无尿点。本次发布会中...
    刘小牛是一只产品汪阅读 1,867评论 9 8