Vue+ElementUI+Springboot实现前后端分离的一个demo
目录
vue官方文档:介绍 — Vue.js (vuejs.org)
elementUI官方文档:elementUI
项目代码:(master分支)
- myfirstVue_web:https://gitee.com/wulinchun/myfirst-vue_web.git
- myfirstVue_rear:https://gitee.com/wulinchun/myfirst-vue_rear.git
1、前期准备
首先要安装好node.js、vue-cli、webpack。

2、创建一个vue项目
首先进入到vue项目所要创建到的目录下,然后使用命令“vue init webpack 项目名”在该目录下创建vue项目。

vue init webpack 项目名

vue创建说明:

standalone和runtime的区别具体可以参考官方文档:官方文档

在vue项目中引入elementUI框架
npm i element-ui -S

在main.js文件中添加以下三行代码:
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)


如果是使用Intell idea开发的话,要在idea中安装好两个插件:vue.js和element


因为idea自己是无法识别和创建.vue类型的文件的,因此要在fileType的HTML中添加.vue文件

这里一定要注意:.vue文件一定要建在HTML之下,不可以建在其他下面,之前我是错把.vue文件建在了XHTML下面,结果整合elementUI的时候elementUI组件全部标红了!!!

3、vue前端

login.vue
<template>
<div>
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" label-width="100px">
<el-form-item label="用户名" prop="userName">
<el-col :span="8">
<el-input ref="userName" v-model="loginForm.userName" placeholder="用户名">
</el-input>
</el-col>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-col :span="8">
<el-input ref="password" type="password" v-model="loginForm.password" placeholder="密码"></el-input>
</el-col>
</el-form-item>
<el-form-item>
<el-col :span="8">
<el-button @click="login">登录</el-button>
</el-col>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { handlelogin } from '@/api/login'
export default {
name: '',
data () {
return {
loginForm: {
userName: '',
password: ''
},
res: '',
passwordType: 'password',
showDialog: 'false',
loginRules: {
userName: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
}
}
},
methods: {
login () {
console.log('userName' + this.loginForm.userName)
console.log('password' + this.loginForm.password)
handlelogin(this.loginForm).then(response => {
var res = response.data
console.log('****res123**' + response.data)
if (res === true) {
alert('登录成功')
this.$router.push('/firstPage')
} else {
alert('用户名密码错误')
}
// console.log('****res123**' + response.data)
})
// console.log('qwe' + handlelogin(this.loginForm))
}
}
}
</script>
<style scoped>
</style>
firstPage.vue
<template>
<div>
<h1>首页</h1>
<el-link type="success" href="#/SecondPage" target="_blank">去第二个页面</el-link>
</div>
</template>
<script>
export default {
name: ''
}
</script>
<style scoped>
</style>
SecondPage.vue
<template>
<h1>第二个页面</h1>
</template>
<script>
export default {
name: ''
}
</script>
<style scoped>
</style>
login.js
先安装axios
npm install axios

import axios from 'axios'
export function handlelogin (data) {
return axios.post('http://192.168.1.5:8082/login/handlelogin', {
userName: data.userName,
password: data.password
}).then(response => response).catch(error => error)
}
配置路由请求index.js (路由主要是为了实现页面跳转)
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import login from '@/views/login'
import firstPage from '@/views/firstPage'
import SecondPage from '@/views/SecondPage'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/', // '/'表示vue项目启动后的默认显示界面
name: 'HelloWorld',
component: HelloWorld
},
{
path: '/login',
name: 'login',
component: login
},
{
path: '/firstPage',
name: 'firstPage',
component: firstPage
},
{
path: '/SecondPage',
name: 'SecondPage',
component: SecondPage
}
]
})
4、java后端

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/>
</parent>
<groupId>org.example</groupId>
<artifactId>myfirstVue_rear</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Mybatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!--mybatis-plus 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 8082
spring:
profiles:
active: dev
application-dev.yml
server:
port: 8082
spring:
datasource:
name: mybatis_plus
url: jdbc:mysql://localhost:3306/mysql?serverTimezone=UTC&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml #注意:一定要对应mapper映射xml文件的所在路径
type-aliases-package: com.myfirstvue.entity # 注意:对应实体类的路径
CorsConfig类:解决跨域问题
编写配置类用来解决跨域请求(接口是http,而axios一般请求的是https。从https到http是跨域,因此要配置跨域请求)
package com.myfirstvue.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* @author: wu linchun
* @time: 2021/7/25 14:55
* @description: 解决跨域问题
*/
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); //允许任何域名
corsConfiguration.addAllowedHeader("*"); //允许任何头
corsConfiguration.addAllowedMethod("*"); //允许任何方法
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); //注册
return new CorsFilter(source);
}
}
LoginUserPO类
package com.myfirstvue.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author: wu linchun
* @time: 2021/7/25 13:30
* @description:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_login")
public class LoginUserPO implements Serializable {
@TableField("uname")
private String userName;
@TableField("pwd")
private String password;
}
LoginMapper接口
package com.myfirstvue.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.myfirstvue.entity.LoginUserPO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
/**
* @description:
* @author: wu linchun
* @time: 2021/7/25 13:34
*/
@Component("loginMapper")
public interface LoginMapper extends BaseMapper<LoginUserPO> {
}
LoginService接口
package com.myfirstvue.service;
import com.myfirstvue.entity.LoginUserPO;
import org.springframework.stereotype.Component;
/**
* @description:
* @author: wu linchun
* @time: 2021/7/25 13:36
*/
@Component
public interface LoginService {
/**
* @author: wu linchun
* @create: 2021/7/25 13:38
* @desc: 登录
**/
boolean login(LoginUserPO loginUserPO);
}
LoginService接口实现类
package com.myfirstvue.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.myfirstvue.entity.LoginUserPO;
import com.myfirstvue.mapper.LoginMapper;
import com.myfirstvue.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* @author: wu linchun
* @time: 2021/7/25 13:38
* @description:
*/
@Service("loginService")
public class LoginServiceImpl implements LoginService {
@Autowired
@Qualifier("loginMapper")
private LoginMapper loginMapper;
@Override
public boolean login(LoginUserPO loginUserPO) {
LambdaQueryWrapper<LoginUserPO> queryWrapper = new LambdaQueryWrapper<>();
if (Objects.nonNull(loginUserPO)) {
queryWrapper.eq(LoginUserPO::getUserName, loginUserPO.getUserName());
String pwd = loginMapper.selectOne(queryWrapper).getPassword();
if (pwd.equals(loginUserPO.getPassword())) {
return true;
}
}
return false;
}
}
Springboot启动类
package com.myfirstvue;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author: wu linchun
* @time: 2021/7/25 13:44
* @description:
*/
@SpringBootApplication
@MapperScan("com.myfirstvue.mapper") //扫描mapper包下
public class RunApplication {
public static void main(String[] args) {
SpringApplication.run(RunApplication.class, args);
}
}
5、启动
5.1、启动vue项目
配置启动端口

配置启动后的默认页面

去除vue的logo图片(不去的话,vue项目启动后页面会展示vue图标)


使用npm run dev启动vue项目
npm run dev


5.2、启动后端

6、效果



7、总结
去年的时候,我也整理过一篇关于vue+springboot的前后端分离
去年那种在html页面中引入vue开发环境的模式
可以通过在线地址引入

也可以通过下载vue的相应js文件的方式引入


vue直接写在html里面的还是比较低端的前后端分离的写法。去年的那种写法并不是真正意义上的前后端分离,因为只是避免了以前jsp会出现的在前端写java/php代码的写法。
在jsp中通过<%%>写一些后端的代码,当然在运行jsp的时候,是会优先执行<%%>里面的代码

把前端html以及后端代码整合成一个项目的前后端分离,然后启动整个项目,前后端就相当于一起启动起来了。最后是打成一个包(war包)


本文所述的前后端分离才是真正意义上的前后端分离,也是目前应用最广泛的前后端分离模式。前端只管调接口,后端只管提供接口,无视前后端语言。
vue前端打包打成一个dist文件
npm run build

后端打包打成一个jar包

8、参考资料
- 封装 axios 请求 并 return 结果 - 韭菜包子敲代码 - 博客园 (cnblogs.com)
- Intellij IDEA搭建vue-cli项目 - 前端小童鞋 - 博客园 (cnblogs.com)
- 解析Vue-cli中的Standalone和Runtime-only模式 - 小专栏 (xiaozhuanlan.com)
- 解析Vue-cli中的Standalone和Runtime-only模式 - 小专栏 (xiaozhuanlan.com)
- 如何搭建一个vue项目(完整步骤) - 对方屌丝正在输入中 - 博客园 (cnblogs.com)
- Vue2.0史上最全入坑教程(上)—— 搭建Vue脚手架(vue-cli) - 简书 (jianshu.com)
- Vue2.0史上最全入坑教程(中)—— 脚手架代码详解 - 简书 (jianshu.com)
- Vue2.0史上最全入坑教程(下)—— 实战案例 - 简书 (jianshu.com)
- Vue2.0史上最全入坑教程(完)—— 实战案例 - 简书 (jianshu.com)
- 对Vue中 runtime-compiler 和 runtime-only 两种模式的理解_Jackie Huang-CSDN博客
- npm ERR! myvue@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js_shujuku____的博客-CSDN博客
- 打war包时test模块打不了包
Vue+ElementUI+Springboot实现前后端分离的一个demo的更多相关文章
- springboot+apache前后端分离部署https
目录 1. 引言 2. 了解https.证书.openssl及keytool 2.1 https 2.1.1 什么是https 2.1.2 https解决什么问题 2.2 证书 2.2.1 证书内容 ...
- SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程01---搭建前端工程
豆宝社区项目实战教程简介 本项目实战教程配有免费视频教程,配套代码完全开源.手把手从零开始搭建一个目前应用最广泛的Springboot+Vue前后端分离多用户社区项目.本项目难度适中,为便于大家学习, ...
- vue.js+UEditor集成 [前后端分离项目]
首先,谈下这篇文章中的前后端所涉及到的技术框架内容. 虽然是后端的管理项目,但整体项目,是采用前后端分离的方式完成,这样做的目的也是产品化的需求: 前端,vue+vuex+vue router+web ...
- 如何利用vue和php做前后端分离开发?
新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...
- springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生
人生如戏,戏子多半掉泪! 我是一名大四学生,刚进入一家软件件公司实习,虽说在大学中做过好多个实训项目,都是自己完成,没有组员的配合.但是在这一个月的实习中,我从以前别人教走到了现在的自学,成长很多. ...
- vue+uwsgi+nginx部署前后端分离项目
前后端分离,vue前端提供静态页面,且可以向后台发起get,post等restful请求. django后台提供数据支撑,返回json数据,返回给vue,进行数据页面渲染 后端 创建虚拟环境 解决dj ...
- nginx+vue+uwsgi+django的前后端分离项目部署
Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...
- REST风格框架实战:从MVC到前后端分离(附完整Demo)
既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:(1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂 ...
- 【转】REST风格框架实战:从MVC到前后端分离(附完整Demo)
版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步! https://blog.csdn.net/justloveyou_/ ...
- SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程02---创建后端工程
本节代码开源地址 代码地址 项目运行截图 搭建后端工程 0.导入sql 在数据库导入 /* Navicat Premium Data Transfer Source Server : localhos ...
随机推荐
- HDU2586 How far away ? (树链剖分求LCA)
用树链剖分求LCA的模板: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const ...
- go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构
0.转载 go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构 0.1源码地址 https://github.com/liuyuede123/go-zero-co ...
- webgl(three.js)3D光伏,3D太阳能能源,3D智慧光伏、光伏发电、清洁能源三维可视化解决方案——第十六课
序: 能源是文明和发展的重要保障,人类命运不可避开的话题,无论是战争还是发展,都有它存在的身影.从石器时代到现代文明,人类的能源应用在进步,也在面临能源枯竭的危机与恐惧,而开发与应用可再生能源才是解决 ...
- spring框架-jdbcTemplate
首先 dao层: dao -bookdao(interface) -bookdaoimpl service层: bookService 实体类对象 entiry-book 测试类 Test-TestB ...
- 如何通过Java导出带格式的 Excel 数据到 Word 表格
在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件.但是如果表格比较长,内容就会存在一定程度的丢失,无法 ...
- ubuntu生成pem证书连接服务器(已验证)
SSH 密钥认证是什么? 与用户密码登录相比,SSH 密钥认证更安全,因为只有拥有密钥的人才能连接,并且密钥通过不同的算法进行了很好的加密.它还通过无密码登录使 SSH 连接变得简单. 这个搞两个方案 ...
- Windows自带管理工具
exe类notepad 记事本 control 控制面板 mstsc 远程桌面连接explorer 资源管理器 taskmgr 任务管理器resmon 资源监视器 perfmon 性能监视器reged ...
- 核磁共振成像学习笔记——从FID信号到K空间
在理想磁场环境下(没有不存在场不均匀性),对于一个没有梯度场的方块. 此时,RF pulse的两路正交信号(相位差为90°)对此方块进行激发,然后收取信号,我们可以得到由此方块产生的FID信号. 设此 ...
- .NET性能优化-使用内存+磁盘混合缓存
我们回顾一下上一篇文章中的内容,有一个朋友问我这样一个问题: 我的业务依赖一些数据,因为数据库访问慢,我把它放在Redis里面,不过还是太慢了,有什么其它的方案吗? 其实这个问题比较简单的是吧?Red ...
- JavaSE -进阶基础---反射技术
反射常见用法: Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法的 ...