文章目录

  • 一、创建后端 SpringBoot 项目
  • 二、Vue 创建前端项目
  • 三、SpringBoot 集成 MyBatis
  • 四、前后端联调

一、创建后端 SpringBoot 项目

  1. 创建过程 略
  2. 创建好后,删除多余文件(可参考后续目录格式)
  3. 修改 Maven 相应的路径配置
  4. 编写 yml 文件,编写端口、数据库连接等配置
  5. 测试一下后端
    编写测试代码如下:

    运行结果如下:

    ok ! 后端的初步搭建告一段落

二、Vue 创建前端项目

  • 这里需要说明的是:前端项目将他放在了后端项目的一个文件夹中,所以创建时,需要切换目录到相应位置。
  1. win+R --> cmd,切换目录到相应位置,创建前端项目
vue init webpack xxxxx
//其中xxxxx为Vue的项目名称


创建完成后,到IDEA,查看后端项目目录,看是否创建成功;若成功则继续下面的步骤;

  1. 切换到vue目录下,然后 npm run dev

在这一步有个插曲,在IDEA运行出现了这样的错误:

解决方法如下:
看看自己的项目里面是否有node_modules文件夹,
(1)如果没有就尝试执行npm install,这是因为缺少依赖包。
(2)如果有就将这个node_modules文件夹删掉,重新执行npm install,等待安装完之后,再次运行“npm run dev”

按第二步执行完后,运行成功:


前端的搭建就 OK 了 !


三、SpringBoot 集成 MyBatis

  1. 创建数据库

  1. 按下面的目录,创建相关的文件

  1. 编写下面的代码,并进行测试
package com.zjw.management;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@SpringBootApplication
public class ManagementApplication {public static void main(String[] args) {SpringApplication.run(ManagementApplication.class, args);}
}
package com.zjw.management.entity;import lombok.Data;
import java.io.Serializable;
import java.util.Date;@Data
public class User implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String username;private String password;private String nickname;private String email;private String phone;private String address;private Date createTime;private String avatarUrl;private String role;
}
package com.zjw.management.controller;import com.zjw.management.entity.User;
import com.zjw.management.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class UserController {@Autowiredprivate UserMapper userMapper;@GetMapping("/")public List<User> index(){List<User> all = userMapper.findAll();return all;}
}
package com.zjw.management.mapper;import com.zjw.management.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * from sys_user")List<User> findAll();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zjw.management.mapper.UserMapper"></mapper>

测试结果如下:

到这里,后端项目和数据库的连接已经成功 !


四、前后端联调

  1. 编写后端代码,实现 “findAll” 和 “findPage” 方法,并对接口进行测试;
package com.zjw.management.mapper;import com.zjw.management.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * from sys_user")List<User> findAll();@Select("select * from sys_user where username like #{username} limit #{pageNum}, #{pageSize}")List<User> selectPage(Integer pageNum, Integer pageSize, String username);@Select("select count(*) from sys_user where username like concat('%', #{username}, '%') ")Integer selectTotal(String username);
}
package com.zjw.management.controller;import com.zjw.management.entity.User;
import com.zjw.management.mapper.UserMapper;
import com.zjw.management.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserMapper userMapper;//查询所有@GetMappingpublic List<User> findAll(){List<User> all = userMapper.findAll();return all;}//分页查询//接口路径:/user/page?pageNum=1&pageSize=3&username@GetMapping("/page")public Map<String, Object> findPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize,@RequestParam String username){pageNum = (pageNum - 1) * pageSize;username = "%" + username + "%";List<User> data = userMapper.selectPage(pageNum, pageSize, username);Integer total = userMapper.selectTotal(username);Map<String, Object> res = new HashMap<>();res.put("data", data);res.put("total", total);return res;}
}

测试一下:

  1. 编写前端测试页面 “Home.vue” ,并配置相关路由,进行测试;
    修改或添加以下的文件:

(1) gloable.css

*{margin: 0;padding: 0;box-sizing: border-box;
}.ml-5 {margin-left: 5px;
}
.mr-5 {margin-right: 5px;
}
.pd-10 {padding: 10px 0;
}

(2) router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Home from '@/views/Home'Vue.use(Router)export default new Router({routes: [{path: '/',name: 'HelloWorld',component: HelloWorld},{path: '/Home',name: 'Home',component: Home}]
})

(3) views/Home.vue

<template><el-container style="min-height: 100vh"><el-aside :width="sideWidth + 'px'" style="box-shadow: 2px 0 6px rgb(0 21 41 / 35%);"><el-menu :default-openeds="['1', '3']" style="min-height: 100%; overflow-x: hidden"background-color="rgb(48, 65, 86)"text-color="#fff"active-text-color="#ffd04b":collapse-transition="false":collapse="isCollapse"><div style="height: 60px; line-height: 60px; text-align: center"><img src="../assets/logo.png" alt="" style="width: 20px; position: relative; top: 5px; right: 5px"><b style="color: white" v-show="logoTextShow">后台管理系统</b></div><el-submenu index="1"><template slot="title"><i class="el-icon-message"></i><span slot="title">导航一</span></template><el-menu-item-group title="分组2"><el-menu-item index="1-3">选项3</el-menu-item></el-menu-item-group><el-submenu index="1-4"><template slot="title">选项4</template><el-menu-item index="1-4-1">选项4-1</el-menu-item></el-submenu></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-menu"></i><span slot="title">导航二</span></template><el-submenu index="2-4"><template slot="title">选项4</template><el-menu-item index="2-4-1">选项4-1</el-menu-item></el-submenu></el-submenu><el-submenu index="3"><template slot="title"><i class="el-icon-setting"></i><span slot="title">导航三</span></template><el-submenu index="3-4"><template slot="title">选项4</template><el-menu-item index="3-4-1">选项4-1</el-menu-item></el-submenu></el-submenu></el-menu></el-aside><el-container><el-header style="font-size: 12px; border-bottom: 1px solid #ccc; line-height: 60px; display: flex"><div style="flex: 1; font-size: 20px"><span :class="collapseBtnClass" style="cursor: pointer" @click="collapse"></span></div><el-dropdown style="width: 70px; cursor: pointer"><span>王小虎</span><i class="el-icon-arrow-down" style="margin-left: 5px"></i><el-dropdown-menu slot="dropdown" ><el-dropdown-item style="font-size: 14px; padding: 5px 0">个人信息</el-dropdown-item><el-dropdown-item style="font-size: 14px; padding: 5px 0">退出</el-dropdown-item></el-dropdown-menu></el-dropdown></el-header><el-main><div style="margin-bottom: 30px"><el-breadcrumb separator="/"><el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item><el-breadcrumb-item>用户管理</el-breadcrumb-item></el-breadcrumb></div><div style="margin: 10px 0"><el-input style="width: 200px" placeholder="请输入名称" suffix-icon="el-icon-search" v-model="username"></el-input><el-input style="width: 200px" placeholder="请输入邮箱" suffix-icon="el-icon-message" class="ml-5"></el-input><el-input style="width: 200px" placeholder="请输入地址" suffix-icon="el-icon-position" class="ml-5"></el-input><el-button class="ml-5" type="primary" @click="load">搜索</el-button></div><div style="margin: 10px 0"><el-button type="primary">新增 <i class="el-icon-circle-plus-outline"></i></el-button><el-button type="danger">批量删除 <i class="el-icon-remove-outline"></i></el-button><el-button type="primary">导入 <i class="el-icon-bottom"></i></el-button><el-button type="primary">导出 <i class="el-icon-top"></i></el-button></div><el-table :data="tableData" border stripe :header-cell-class-name="headerBg"><el-table-column prop="id" label="ID" width="80"></el-table-column><el-table-column prop="username" label="用户名" width="140"></el-table-column><el-table-column prop="nickname" label="昵称" width="120"></el-table-column><el-table-column prop="email" label="邮箱"></el-table-column><el-table-column prop="phone" label="电话"></el-table-column><el-table-column prop="address" label="地址"></el-table-column><el-table-column label="操作"  width="200" align="center"><template slot-scope="scope"><el-button type="success">编辑 <i class="el-icon-edit"></i></el-button><el-button type="danger">删除 <i class="el-icon-remove-outline"></i></el-button></template></el-table-column></el-table><div style="padding: 10px 0"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination></div></el-main></el-container></el-container>
</template><script>export default {name: 'Home',data() {return {tableData: [],total: 0,pageNum: 1,pageSize: 2,username: "",msg: "hello 青哥哥",collapseBtnClass: 'el-icon-s-fold',isCollapse: false,sideWidth: 200,logoTextShow: true,headerBg: 'headerBg'}},created() {// 请求分页查询数据this.load()},methods: {collapse() {  // 点击收缩按钮触发this.isCollapse = !this.isCollapseif (this.isCollapse) {  // 收缩this.sideWidth = 64this.collapseBtnClass = 'el-icon-s-unfold'this.logoTextShow = false} else {   // 展开this.sideWidth = 200this.collapseBtnClass = 'el-icon-s-fold'this.logoTextShow = true}},load() {fetch("http://localhost:9090/user/page?pageNum="+this.pageNum+"&pageSize=" + this.pageSize + "&username=" + this.username).then(res => res.json()).then(res => {console.log(res)this.tableData = res.datathis.total = res.total})},handleSizeChange(pageSize) {console.log(pageSize)this.pageSize = pageSizethis.load()},handleCurrentChange(pageNum) {console.log(pageNum)this.pageNum = pageNumthis.load()}}
}
</script><style>
.headerBg {background: #eee!important;
}
</style>

(4) App.vue

<template><div id="app"><router-view/></div>
</template><script>
export default {name: 'App'
}
</script><style>
#app {min-height: 100vh;
}
</style>

(5) main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import './assets/gloable.css'Vue.config.productionTip = false
Vue.use(ElementUI, { size: "mini" });/* eslint-disable no-new */
new Vue({router,render: h => h(App)
}).$mount('#app')
  1. 解决跨域问题,并进行前后端联调测试;

在后端 config 目录下,编写 CorsConfig.java 解决跨域问题

package com.zjw.management.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;@Configuration
public class CorsConfig {// 当前跨域请求最大有效时长。这里默认1天private static final long MAX_AGE = 24 * 60 * 60;@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("http://localhost:8080"); // 1 设置访问源地址corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法corsConfiguration.setMaxAge(MAX_AGE);source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置return new CorsFilter(source);}
}

前后端联调,在前端页面进行测试,结果如下:

到这里,前端可以成功地将数据库的数据展示到页面上,联调成功,框架搭建结束。


搭建SpringBoot+Vue 项目 完整流程相关推荐

  1. MacOS 搭建一个vue项目(完整步骤)

    搭建一个Vue项目 一.安装node环境 二.搭建vue项目环境 1.全局安装vue-cli 2.检查是否安装成功 3.创建一个基于 webpack 模板的新项目 4.安装依赖 5.启动项目 三.vu ...

  2. 搭建一个Vue项目(完整步骤)

    一.安装Node环境 具体请参考:http://www.dinganan.cn/nodej安装和配置/ 二.搭建vue项目环境 1.全局安装vue-cli npm install --global v ...

  3. vue = 什么意思_记录使用@vue/cli搭建Vue3项目完整流程

    最近发现vue两大UI框架Element UI和Ant Design Vue都已经支持Vue3了,如果再不学习Vue3就落伍了,此文章记录下使用@vue/cli搭建Vue3项目完整流程. 1 安装vu ...

  4. cli vue 卸载_记录使用@vue/cli搭建Vue3项目完整流程

    最近发现vue两大UI框架Element UI和Ant Design Vue都已经支持Vue3了,如果再不学习Vue3就落伍了,此文章记录下使用@vue/cli搭建Vue3项目完整流程. 1 安装vu ...

  5. 一键生成Springboot Vue项目! 【私活神器】

    今天给大家推荐一款自己公司正在打磨的一款一键部署,一键生成全自动化的低代码生成器工具,可以实现前端可视化操作(拖拽形式+配置就可以生成前端页面),后端直接结合前端代码一键生成,数据库(含表字段)可一键 ...

  6. springboot+Vue项目使用axios实现跨域(CROS)

    springboot+Vue项目使用axios实现(CROS)跨域 一.项目背景 二.跨域资源共享 CORS 详解 三.axios跨域实现 3.1 安装qs模块 3.2 axios使用 四.sprin ...

  7. 从零开始搭建一个vue项目 -- vue-cli/cooking-cli(一)

    从零开始搭建一个vue项目 -- vue-cli/cooking-cli(一) 1.vue-cli搭建一个可靠成熟的项目 1.介绍 vue-cli 我是去年六月份接触的vue1.0,当时还是个菜逼,当 ...

  8. 部署springboot+vue项目文档(若依ruoyi项目部署步骤)

    部署springboot+vue项目文档(若依ruoyi项目部署步骤) 一:部署linux + nginx 二:部署windows + tomcat(无nginx) 三:解决调用第三方api如百度地图 ...

  9. 如何搭建一个Vue项目和配置环境

    如何搭建一个Vue项目和配置环境 一.Vue简介 Vue(读音/vju/, 类似于view) 是一套用于构建用户界面的渐进式框架, 发布于2014年2月.与其它大型框架不同的是, Vue被设计为可以自 ...

最新文章

  1. ckedit 文本编辑器
  2. 近期活动盘点:三创对接会——先进制造专场
  3. Java学习记录(补充三:String类)
  4. Java 8 –按值对HashMap进行升序和降序排序
  5. 《C#本质论》读书笔记(十二)构造器 @ Lennon
  6. 灵魂拷问:a = 1 + 2 究竟是怎么被 CPU 执行的
  7. oracle Instance status: READY–lsnrctl status|start|stop
  8. android 广播观察者,作业三——观察者模式在Android广播机制上的应用
  9. 第二期: 如何搭建 多用户的平台?(未完)
  10. v8go 库手动编译 v8 golang 库手动编译
  11. jquery 发送验证码60s倒计时,后重新发送
  12. 谷歌浏览器安装Octotree插件
  13. 第8集丨流氓皇帝,贬谪之路,险象环生
  14. 一杯凉茶 mysql_那一杯凉茶
  15. (转)大数据量分页存储过程效率测试附代码
  16. FIR.im的使用_亲自实验
  17. 在面试软件测试岗位时被问到最多的问题
  18. com.ibm.db2.jcc.b.SqlException:Parameter instance is invalid for requested conversion.
  19. python服务器环境搭建_服务器python环境搭建
  20. 标准美式计算机键盘,简体中文美式键盘如何添加【图解】

热门文章

  1. python剪刀石头布_Python Tkinter教程系列01:剪刀石头布游戏
  2. Unsupervised Learning of Visual Features by Contrasting Cluster Assignments(SwAV)---论文阅读笔记
  3. Android之扫描二维码和根据输入信息生成名片二维码
  4. 心理测评软件的心理测试法的优缺点,使用心理测评软件的意义与重要性
  5. 前端实现文件上传的断点续传
  6. 什么是python的内置函数_什么是python内置函数
  7. 微信小程序之map地图
  8. YUV 转 RGB快速算法
  9. Android性能优化大全
  10. 中国车用尿素市场规模调研与发展趋势分析报告2022-2028年