当前位置:   article > 正文

搭建SpringBoot+Vue框架_基于springboot和vue框架

基于springboot和vue框架

一、SpringBoot框架搭建

  •  首先先检查自己的软件版本 :

138594ef7ce1423c98fd7dfbc3bb92d0.png

  • 开始新建框架

58d82cbe8a8441d48cbfdfa31400266e.png

c0bd04222f5a4861a80cede1f47f6266.png

0153933b71fd4136bf3abcee61311f91.png

df249055ae274d1a9082ba09367fef95.png

341fde49fd6d4830baa8bdae78f22f67.png

  • 报这个错主要是第二张图片Type选错了,应该选择Maven,切记java版本不要选错了

16c6d8366ec6415985cb2d9b079916aa.png

4ef0cddd2e9746e98276b8d5cee2273e.png

  • 删了上述的还需要删除test
  • 未配置数据库,直接运行出错

fb437cdd95a94455b1cd63aaff04f942.png

  • 新建一个数据库,需要选择这些

24b9a05841a64f2fbb97f60f38268349.png

  • 然后修改配置文件

9a27a5a6159141589303963fc798af0d.png

  • 代码如下
  • 端口8080
  • 数据库是zd_study     用户名:root   密码:123456
  1. server:
  2. port: 8080
  3. spring:
  4. datasource:
  5. driver-class-name: com.mysql.cj.jdbc.Driver
  6. url: jdbc:mysql://localhost:3306/zd_study?serverTimezone=GMT%2b8
  7. username: root
  8. password: 123456

 只是配置好了数据能正常启动,但是不能进入端口,因为还没有配置启动类,配置如下:

代码如下:

  1. @RestController
  2. @SpringBootApplication
  3. public class SpringbootApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringbootApplication.class, args);
  6. }
  7. @GetMapping("/")
  8. public String index(){
  9. return "OK";
  10. }
  11. }

6182c39153e94931bdae917c82516083.png

试了下  @GetMapping  不加  ("/")  这个也已运行,目前不知道什么原因,代码:

  1. @RestController
  2. @SpringBootApplication
  3. public class SpringbootApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringbootApplication.class, args);
  6. }
  7. @GetMapping
  8. public String index(){
  9. return "OK";
  10. }
  11. }

二、在IDEA中使用Git 上传到git远程仓库

  • 首先在终端运行git init  命令

ff7337885fdc4488b831f1f489269789.png

  • 运行之后即会出现下图的 git 箭头 

 a65f87ff91f14f5d84ed85fc15181b0c.png

0dac1432fcfd44e0a3381b5dd6bb5d5b.png

三、前端框架

  •  首先在终端cmd进入一个文件夹里,就是在这个文件夹创建前端项目

 2d7fae3fd096472b8c4d3c565a540b36.png

  • 然后运行第一条命令,创建名字是 vue 的前端项目  
  • vue  create vue  
  • 进行选择   Manually select features   ,回车

bb082e94ac254ec8928300f16960e7dd.png

e05ec04bad7a463a900bc226cc617e02.png40e3ee7dd6534e148df4e4de2f49cf07.png fc9dfd02d5e34bf4b63fe98b8c3490b2.png

 54357c461b5849c289563dba08106cfe.png

cfbf92eea4664b2292b2401dcb8614ad.png 8b240fb8962842ed94a3cc97c24ea871.png

c83e8a999cc641af8343fd4970099f2a.png

  •  然后用IDEA打开这个vue,可以先单独打开

7aab60e50f3445b3be4f16f2c6332691.png

  • 在IDEA终端运行 npm run serve  命令 

aa3bedc8f760416d990b6f032e064494.png

  •  运行成功之后:

60b7d1f987dc4b1db54d772a032cadd7.png

  •  输入地址,查看是否成功

8056aeafd480499c9ad5b3916f9361d8.png

b6fb8c1372cf4613a668a8ceb5b04217.png

  • 已经解决,原因是运行了俩次,
  • npm run serve 运行端口是8080
  • 点击按钮前未关,运行端口为8081 

3.1 前端项目和后端项目整合在一起

  • 直接拖动前端项目到后端项目里即可

  • 可以先运行一下程序,如果正确然后上传到远程仓库

  • 首先在后端的application.yml配置文件里修改后端端口为9090,防止俩个端口冲突 

  • 然后运行前后端都是正常的,即可推送到远程仓库 

  • 选择修改的内容,进行推送

  • 这一步圈画错了,应该是Push 
  • 这样推送只是上传了 application.yml 配置文件,但是vue并没有上传,需要继续推送,应该是第一次没有配置vue的远程仓库,未选择,vue是Define  remote,所以还需要继续配置一下

这样推送也不可以,显示vue: push to origin/master was rejected ,被拒绝了 

3.2查了很多,整了一个多小时,没整出来

  1. 最后把一开始创建的vue项目删除了,又重新在后端项目里创建了vue项目,然后运行没错误,但是git的时候显示
  2. The directory <Project>\vue is registered as a Git root, but no Git repositories were found there.
  3. 参考下面的博客,解决了
  4. 就是把红色的vue项目删了,就可以了

导入Git项目报错:is registered as a Git root, but no Git repositories were found there_Cignus的博客-CSDN博客

  • 这样推送上去,git显示的vue是个模块,不是文件夹,打不开,然后又在git里删除了vue模块,在IDEA重新拉去了一下,vue的文件变红色,又重新推送一下,结果成功了

  •  然后分别修改前后端项目代码,重新上传都可以,至此git  整成功了

四、Vue2集成ElementUI 框架

1、安装ElementUI:npm i element-ui -S 

  • git 上传到远程仓库,俩个文件发生了变化,安装成功,可以查看版本号

2、引入Element 

  • 你可以引入整个 Element,或是根据需要仅引入部分组件。我们先介绍如何引入完整的 Element。
  • 完整引入
  • 在 main.js 中写入以下内容:

main.js

  1. import Vue from 'vue'
  2. import ElementUI from 'element-ui';
  3. import 'element-ui/lib/theme-chalk/index.css';
  4. import App from './App.vue'
  5. import router from './router'
  6. Vue.use(ElementUI, {size: "small"});
  7. Vue.config.productionTip = false
  8. new Vue({
  9. router,
  10. render: h => h(App)
  11. }).$mount('#app')
  • 修改了文件的名字

  • 在router 的index.js文件里修改以下内容 

 改造Home.vue 和 APP.vue 

五、Vue后台主体、整体布局搭建

  • Container 布局容器

  • 用于布局的容器组件,方便快速搭建页面的基本结构:
  • <el-container>:外层容器。当子元素中包含 <el-header> 或 <el-footer> 时,全部子元素会垂直上下排列,否则会水平左右排列。
  • <el-header>:顶栏容器。
  • <el-aside>:侧边栏容器。
  • <el-main>:主要区域容器。
  • <el-footer>:底栏容器。
  • 以上组件采用了 flex 布局,使用前请确定目标浏览器是否兼容。此外,<el-container> 的子元素只能是后四者,后四者的父元素也只能是 <el-container>
  • 找了 Element的一个实例,进行修改的

  • Home.vue主要代码如下: 
  1. <template>
  2. <el-container style="min-height: 100vh">
  3. <el-aside :width="sideWidth + 'px'"
  4. style="background-color: rgb(238, 241, 246); box-shadow: 2px 0 6px rgb(0 21 41 / 35%);">
  5. <el-menu :default-openeds="['1', '3']" style="min-height: 100%; overflow-x: hidden"
  6. background-color="rgb(48, 65, 86)"
  7. text-color="#fff"
  8. active-text-color="#ffd04b"
  9. :collapse-transition="false"
  10. :collapse="isCollapse"
  11. >
  12. <div style="height: 60px; line-height: 60px; text-align: center">
  13. <img src="../assets/logo.png" alt=""
  14. style="width: 20px; position: relative; top: 5px; margin-right: 5px">
  15. <b style="color: white" v-show="logoTextShow">ERP管理系统</b>
  16. </div>
  17. <el-submenu index="1">
  18. <template slot="title">
  19. <i class="el-icon-house"></i>
  20. <span slot="title">主页</span>
  21. </template>
  22. </el-submenu>
  23. <el-submenu>
  24. <template slot="title"><i class="el-icon-menu"></i><span slot="title">系统管理</span></template>
  25. <el-menu-item index="2-1">用户管理</el-menu-item>
  26. <el-menu-item index="2-2">角色管理</el-menu-item>
  27. <el-menu-item index="2-3">菜单管理</el-menu-item>
  28. <el-menu-item index="2-3">文件管理</el-menu-item>
  29. </el-submenu>
  30. <el-submenu index="3">
  31. <template slot="title"><i class="el-icon-setting"></i><span slot="title">生产管理</span></template>
  32. <el-menu-item index="3-1">选项1</el-menu-item>
  33. <el-menu-item index="3-2">选项2</el-menu-item>
  34. <el-menu-item index="3-3">选项3</el-menu-item>
  35. <el-menu-item index="3-3">选项3</el-menu-item>
  36. </el-submenu>
  37. </el-menu>
  38. </el-aside>
  39. <el-container>
  40. <el-header style="font-size: 12px; border-bottom: 1px solid #ccc; line-height: 60px; display: flex">
  41. <div style="flex: 1; font-size: 20px">
  42. <span :class="collapseBtnClass" style="cursor: pointer" @click="collapse"></span>
  43. </div>
  44. <el-dropdown style="width: 70px; cursor: pointer">
  45. <i class="el-icon-setting" style="margin-right: 15px"></i>
  46. <el-dropdown-menu slot="dropdown">
  47. <el-dropdown-item>修改密码</el-dropdown-item>
  48. <el-dropdown-item>个人信息</el-dropdown-item>
  49. <el-dropdown-item>退出</el-dropdown-item>
  50. </el-dropdown-menu>
  51. </el-dropdown>
  52. <span>王小虎</span>
  53. </el-header>
  54. <el-main>
  55. <div style="margin-bottom: 30px">
  56. <el-breadcrumb separator="/">
  57. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  58. <el-breadcrumb-item>用户管理</el-breadcrumb-item>
  59. </el-breadcrumb>
  60. </div>
  61. <div style="margin: 10px 0">
  62. <el-input style="width: 200px" placeholder="请输入名称" suffix-icon="el-icon-search"></el-input>
  63. <el-input style="width: 200px" placeholder="请输入邮箱" suffix-icon="el-icon-message"
  64. class="ml-5"></el-input>
  65. <el-input style="width: 200px" placeholder="请输入地址" suffix-icon="el-icon-position"
  66. class="ml-5"></el-input>
  67. <el-button class="ml-5" type="primary">搜索</el-button>
  68. </div>
  69. <div style="margin: 10px 0">
  70. <el-button type="primary">新增 <i class="el-icon-circle-plus-outline"></i></el-button>
  71. <el-button type="danger">批量删除 <i class="el-icon-remove-outline"></i></el-button>
  72. <el-button type="primary">导入 <i class="el-icon-bottom"></i></el-button>
  73. <el-button type="primary">导出 <i class="el-icon-top"></i></el-button>
  74. </div>
  75. <el-table :data="tableData">
  76. <el-table-column prop="date" label="日期" width="140">
  77. </el-table-column>
  78. <el-table-column prop="name" label="姓名" width="120">
  79. </el-table-column>
  80. <el-table-column prop="address" label="地址">
  81. </el-table-column>
  82. <el-table-column label="操作" width="200" align="center">
  83. <template slot-scope="scope">
  84. <el-button type="success">编辑 <i class="el-icon-edit"></i></el-button>
  85. <el-button type="danger">删除 <i class="el-icon-remove-outline"></i></el-button>
  86. </template>
  87. </el-table-column>
  88. </el-table>
  89. <div style="padding: 10px 0">
  90. <el-pagination
  91. :page-sizes="[5, 10, 15, 20]"
  92. :page-size="10"
  93. layout="total, sizes, prev, pager, next, jumper"
  94. :total="400">
  95. </el-pagination>
  96. </div>
  97. </el-main>
  98. </el-container>
  99. </el-container>
  100. </template>
  101. <script>
  102. // @ is an alias to /src
  103. import HelloWorld from '@/components/HelloWorld.vue'
  104. export default {
  105. name: 'Home',
  106. data() {
  107. const item = {
  108. date: '2016-05-02',
  109. name: '王小虎',
  110. address: '上海市普陀区金沙江路 1518 弄'
  111. };
  112. return {
  113. tableData: Array(10).fill(item),
  114. collapseBtnClass: 'el-icon-s-fold',
  115. isCollapse: false,
  116. sideWidth: 200,
  117. logoTextShow: true,
  118. headerBg: 'headerBg'
  119. }
  120. },
  121. methods: {
  122. collapse() { // 点击收缩按钮触发
  123. this.isCollapse = !this.isCollapse
  124. if (this.isCollapse) { // 收缩
  125. this.sideWidth = 64
  126. this.collapseBtnClass = 'el-icon-s-unfold'
  127. this.logoTextShow = false
  128. } else { // 展开
  129. this.sideWidth = 200
  130. this.collapseBtnClass = 'el-icon-s-fold'
  131. this.logoTextShow = true
  132. }
  133. }
  134. }
  135. }
  136. </script>
  137. <style>
  138. .headerBg {
  139. background: #eee!important;
  140. }
  141. </style>

实现了如下图所示的页面:

六、SpringBoot集成Mybatis 实现 增删改查,分页查询

 1、实现一个小小的查询全部数据

  1. 在zd_study数据库中新建sys_user表:
  1. CREATE TABLE `sys_user` (
  2. `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
  3. `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名',
  4. `password` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
  5. `nickname` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '昵称',
  6. `role` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色',
  7. `email` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '邮件',
  8. `phone` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机',
  9. `address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '地址',
  10. `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  11. `avatar_val` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '头像',
  12. PRIMARY KEY (`id`)
  13. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2.在springboot项目里新建 entiy,controller,mapper 文件夹,分别创建了 User实体类、UserController类和UserMapper接口。

  1. User:
  2. @Data
  3. public class User {
  4. private Integer id; //id
  5. private String username; //名字
  6. private String password;//密码
  7. private String nickname;//昵称
  8. private String role; //角色
  9. private String email; //邮件
  10. private String phone; //手机号
  11. private String address; //地址
  12. private Date createTime; //创建时间
  13. private String avatarVal; //头像
  14. }
  15. UserController:
  16. @RestController
  17. //https://www.cnblogs.com/fishpro/p/spring-boot-study-restcontroller.html
  18. //解释注解的文章
  19. public class UserController {
  20. @Resource
  21. private UserMapper userMapper;
  22.     //查询所有的数据
  23. @GetMapping("/")
  24. public List<User> findAll() {
  25. List<User> users = userMapper.findAll();
  26. return users;
  27. }
  28. }
  29. UserMapper:
  30. @Mapper
  31. public interface UserMapper {
  32. @Select("select * from sys_user")
  33. List<User> findAll();
  34. }
  • 运行结果如下图,但是创建时间没有查出来:(貌似就是查不出来的,跟着视频学的人家也查不出来)

2、实现增删改查 

  1.  Controller 调用 service 接口封装的mapper里的方法,serviceImpl是实现类,mapper的sql查询语句在mapper.xml文件里写。
  2. Entity就是实体层,Mapper层与DAO等价,是用于直接操作数据库的层。

    Service层就是对DAO层进行封装,相当于做好的工具,让用户直接用就好了。

  3. xml文件需要进行的配置如下: namespace="com.zd.springboot.mapper.UserMapper"  表示指定的mapper文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.zd.springboot.mapper.UserMapper">
    5. </mapper>
  4. 配置yml文件,不配置会出现错误,因为SpringBoor并不知道去哪找xml文件,需要配置路径,如下代码

    1. mybatis:
    2. mapper-locations: classpath:mapper/*.xml #扫描所有mybatis的xml文件

  5. 以下是几个文件的代码:

  1. //UserController:
  2. @RestController
  3. @RequestMapping("/user")
  4. public class UserController {
  5. @Resource
  6. private UserMapper userMapper;
  7. @Resource
  8. private IUserService userService;
  9. /**
  10. * 查询所有的数据
  11. * @return
  12. */
  13. @GetMapping
  14. public List<User> findAll() {
  15. List<User> users = userMapper.findAll();
  16. return users;
  17. }
  18. /**
  19. * 更新或者增加
  20. * @param user
  21. * @return
  22. */
  23. @PostMapping
  24. public Integer save(@RequestBody User user){
  25. int save = userService.save(user);
  26. return save;
  27. }
  28. @DeleteMapping("/{id}")
  29. public Integer delete(@PathVariable Integer id){
  30. // @PathVariable 必须要有这个注解,使得"/{id}"与Integer id保持一致
  31. int save = userService.deleteById(id);
  32. return save;
  33. }
  34. }
  35. //IUserService ::::
  36. public interface IUserService {
  37. int save(User user);
  38. int deleteById(Integer id);
  39. }
  40. //IUserServiceImpl :
  41. @Service
  42. public class IUserServiceImpl implements IUserService {
  43. @Resource
  44. private UserMapper userMapper;
  45. @Override
  46. public int save(User user) {
  47. if (user.getId() == null) {
  48. return userMapper.insert(user);
  49. }else {
  50. return userMapper.update(user);
  51. }
  52. }
  53. @Override
  54. public int deleteById(Integer id) {
  55. return userMapper.deleteById(id);
  56. }
  57. }
  58. //UserMapper
  59. @Mapper
  60. public interface UserMapper {
  61. @Select("select * from sys_user")
  62. List<User> findAll();
  63. int insert(User user);
  64. int update(User user);
  65. int deleteById(Integer id);
  66. }
  67. //UserMapper .xml
  68. <?xml version="1.0" encoding="UTF-8"?>
  69. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  70. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  71. <mapper namespace="com.zd.springboot.mapper.UserMapper">
  72. <update id="update">
  73. update sys_user
  74. <set>
  75. <if test="username != null">
  76. username = #{username},
  77. </if>
  78. <!-- <if test="password != null">-->
  79. <!-- password = #{password}-->
  80. <!-- </if>-->
  81. <if test="nickname != null">
  82. nickname = #{nickname},
  83. </if>
  84. <if test="email != null">
  85. email = #{email},
  86. </if>
  87. <if test="phone != null">
  88. phone = #{phone},
  89. </if>
  90. <if test="address != null">
  91. address = #{address}
  92. </if>
  93. </set>
  94. <where>
  95. id = #{id}
  96. </where>
  97. </update>
  98. <insert id="insert" parameterType="com.zd.springboot.entity.User">
  99. INSERT INTO sys_user(
  100. username, password,nickname,email,phone,address
  101. )VALUES (#{username}, #{password},#{nickname}, #{email},#{phone}, #{address})
  102. </insert>
  103. <delete id="deleteById">
  104. delete from sys_user where id = #{id}
  105. </delete>
  106. </mapper>

3、分页查询 

  1. 两个不同的端口进行数据交互需要设置跨域请求,前端后端的端口分别为8080和9090,所以首先要设置跨域请求
  2. 分页思路:
    1. SELECT * from sys_user limit 0,2; --第一页
    2. -- (2 -1) * 2 = 2
    3. SELECT * from sys_user limit 2,2; --第二页
    4. -- (3-1)* 2 = 4
    5. SELECT * from sys_user limit 4,2; --第三页
    6. -- 结论: limit第一个参数 = (pageNum - 1) * pageSize
  3. 各个代码:UserController: /** * 分页查询 * 接口路径:/user/page?pageNum=1&pageSize=10 * @RequestParam接受 * @param pageNum * @param pageSize * @param username * @return */ @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 = userService.selectPage(pageNum, pageSize,username); Integer total = userService.selectTotal(username); Map<String, Object> res = new HashMap<>(); res.put("data", data); res.put("total", total); return res; } CorsConfig : @Configuration public class CorsConfig { // 当前跨域请求最大有效时长。这里默认1天 private static final long MAX_AGE = 24 * 60 * 60; @Bean public 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); } } IUserService: //分页查询 List<User> selectPage(Integer pageNum, Integer pageSize, String username); //通过名字模糊查询个数 Integer selectTotal(String username); IUserServiceImpl: @Override public List<User> selectPage(Integer pageNum, Integer pageSize, String username) { return userMapper.selectPage(pageNum, pageSize, username); } @Override public Integer selectTotal(String username) { return userMapper.selectTotal(username); } Usermapper: List<User> selectPage(Integer pageNum, Integer pageSize, String username); Integer selectTotal(String username); Usermapper.xml <select id="selectPage" resultType="com.zd.springboot.entity.User"> select * from sys_user where username like #{username} limit #{pageNum}, # {pageSize} </select> <select id="selectTotal" resultType="integer"> select count(*) from sys_user where username like concat('%', #{username}, '%') </select> Home.vue <el-input style="width: 200px" placeholder="请输入名称" suffix-icon="el-icon-search" v-model="username"></el-input> <el-button class="ml-5" type="primary" @click="load">搜索</el-button> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageNum" :page-sizes="[2, 5, 10, 20]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> data() { return { tableData: [], total: 0, pageNum: 1, pageSize: 2, username:"", collapseBtnClass: 'el-icon-s-fold', isCollapse: false, sideWidth: 200, logoTextShow: true, headerBg: 'headerBg' } }, created() { //请求分页数据 this.load() }, load() { fetch("http://localhost:9090/user/page?pageNum="+this.pageNum+"&pageSize=" + this.pageSize + "&username=" + this.username) .then(res => res.json()).then(res => { this.tableData = res.data this.total = res.total }) }, handleSizeChange(pageSize) { this.pageSize = pageSize this.load() }, handleCurrentChange(pageNum) { this.pageNum = pageNum this.load() }

七、SpringBoot集成Mybatis-Plus 和 SwaggerUI

  1. 添加 Mybatis-Plus的依赖,配置MybatisPlusConfig.java ,还需要在

    application.yml文件里添加配置

    1. 添加依赖:
    2. <!-- mybatis-plus -->
    3. <dependency>
    4. <groupId>com.baomidou</groupId>
    5. <artifactId>mybatis-plus-boot-starter</artifactId>
    6. <version>3.5.1</version>
    7. </dependency>
    8. 配置MybatisPlusConfig.java :
    9. @Configuration
    10. @MapperScan("com.zd.springboot.mapper")
    11. public class MybatisPlusConfig {
    12. // 最新版
    13. @Bean
    14. public MybatisPlusInterceptor mybatisPlusInterceptor() {
    15. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    16. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    17. return interceptor;
    18. }
    19. }
    20. 配置 application.yml:
    21. mybatis-plus:
    22. configuration:
    23. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  2. 添加SwaggerUI 的依赖,并进行配置SwaggerConfig.java

    1. 添加依赖:
    2. <!--swag-->
    3. <dependency>
    4. <groupId>io.springfox</groupId>
    5. <artifactId>springfox-swagger2</artifactId>
    6. <version>2.9.2</version>
    7. </dependency>
    8. <dependency>
    9. <groupId>io.springfox</groupId>
    10. <artifactId>springfox-swagger-ui</artifactId>
    11. <version>2.9.2</version>
    12. </dependency>
    13. 配置SwaggerConfig.java :
    14. @EnableSwagger2
    15. @Configuration
    16. public class SwaggerConfig {
    17. /**
    18. * 创建API应用
    19. * apiInfo() 增加API相关信息
    20. * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
    21. * 本例采用指定扫描的包路径来定义指定要建立API的目录。
    22. *
    23. * @return
    24. */
    25. @Bean
    26. public Docket restApi() {
    27. return new Docket(DocumentationType.SWAGGER_2)
    28. .groupName("标准接口")
    29. .apiInfo(apiInfo("Spring Boot中使用Swagger2构建RESTful APIs", "1.0"))
    30. .useDefaultResponseMessages(true)
    31. .forCodeGeneration(false)
    32. .select()
    33. .apis(RequestHandlerSelectors.basePackage("com.zd.springboot.controller"))
    34. .paths(PathSelectors.any())
    35. .build();
    36. }
    37. /**
    38. * 创建该API的基本信息(这些基本信息会展现在文档页面中)
    39. * 访问地址:http://ip:port/swagger-ui.html
    40. *
    41. * @return
    42. */
    43. private ApiInfo apiInfo(String title, String version) {
    44. return new ApiInfoBuilder()
    45. .title(title)
    46. .description("更多请关注: https://blog.csdn.net/xqnode")
    47. .termsOfServiceUrl("https://blog.csdn.net/xqnode")
    48. .contact(new Contact("xqnode", "https://blog.csdn.net/xqnode", "xiaqingweb@163.com"))
    49. .version(version)
    50. .build();
    51. }
    52. }

    运行地址是:http://localhost:9090/swagger-ui.html#/

  3. 修改以前没使用Mybatis-Plus的增删改查语句和分页查询,使用Mybatis-Plus,需把相同方法相同名字的原方法注释一下,mapper,service,.xml都需要注释一下,运行成功在Postman能够查看到数据并显示,但是在前端并没显示数据,(可能是还未进行修改前端代码)

  4. mapper接口需继承   extends BaseMapper<User>,@Mapper 已经在MybatisPlusConfig.java进行配置,注解:@MapperScan("com.zd.springboot.mapper"),所以这里无需@Mapper

    1. //@Mapper
    2. public interface UserMapper extends BaseMapper<User> {
    3. }
  5. IUserService接口需继承 extends IService<User>

    1. public interface IUserService extends IService<User> {
    2. }
  6. IUserServiceImpl 实现类IUserServiceImpl extends ServiceImpl<UserMapper,User> 

    1. @Service
    2. public class IUserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {
    3. }
  7. 控制层UserController进行修改了一些修改以前没使用Mybatis-Plus的增删改查语句和分页查询,使用Mybatis-Plus进行查询,实现了用Mybatis-Plus的增删改查和分页查询,但是用PostMan进行分页查询是可以查看到数据的,在前端显示有数据,但是看不到 

    1. @RestController
    2. @RequestMapping("/user")
    3. public class UserController {
    4. @Resource
    5. private IUserService userService;
    6. /**
    7. * 查询所有的数据
    8. *
    9. * @return
    10. */
    11. @GetMapping
    12. public List<User> findAll() {
    13. return userService.list();
    14. }
    15. /**
    16. * 更新或者增加
    17. *
    18. * @param user
    19. * @return
    20. */
    21. @PostMapping
    22. public Boolean save(@RequestBody User user) {
    23. return userService.saveOrUpdate(user);
    24. }
    25. /**
    26. * 通过id删除
    27. *
    28. * @param id
    29. * @return
    30. */
    31. @DeleteMapping("/{id}")
    32. public boolean delete(@PathVariable Integer id) {
    33. // @PathVariable 必须要有这个注解,使得"/{id}"与Integer id保持一致
    34. return userService.removeById(id);
    35. }
    36. /**
    37. * Mybatis-Plus的分页查询
    38. * 接口路径:/user/page?pageNum=1&pageSize=10
    39. * @RequestParam接受
    40. * @param pageNum
    41. * @param pageSize
    42. * @param username
    43. * @return
    44. */
    45. @GetMapping("/page")
    46. public IPage<User> findPage(@RequestParam Integer pageNum,
    47. @RequestParam Integer pageSize,
    48. @RequestParam(defaultValue = "") String username,
    49. @RequestParam(defaultValue = "") String nickname,
    50. @RequestParam(defaultValue = "") String address) {
    51. IPage<User> page = new Page<>(pageNum, pageSize);
    52. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    53. if (!"".equals(username)) {
    54. queryWrapper.like("username", username);
    55. }
    56. if (!"".equals(nickname)) {
    57. queryWrapper.like("nickname", nickname);
    58. }
    59. if (!"".equals(address)) {
    60. queryWrapper.like("address", address);
    61. }
    62. return userService.page(page,queryWrapper);
    63. }
    64. }

八、Vue实现增删改查 

1、增删改查

  1. 前端请求后台的工具axios,vue安装axios:npm i axios -S
  2.  request.js封装  axios,
    1. import axios from 'axios'
    2. const request = axios.create({
    3. baseURL: 'http://localhost:9090', //以后就不用在方法里写这个请求头了,直接/user这样就可以
    4. timeout: 5000
    5. })
    6. // request 拦截器
    7. // 可以自请求发送前对请求做一些处理
    8. // 比如统一加token,对请求参数统一加密
    9. request.interceptors.request.use(config => {
    10. config.headers['Content-Type'] = 'application/json;charset=utf-8';
    11. // config.headers['token'] = user.token; // 设置请求头
    12. return config
    13. }, error => {
    14. return Promise.reject(error)
    15. });
    16. // response 拦截器
    17. // 可以在接口响应后统一处理结果
    18. request.interceptors.response.use(
    19. response => {
    20. let res = response.data;
    21. // 如果是返回的文件
    22. if (response.config.responseType === 'blob') {
    23. return res
    24. }
    25. // 兼容服务端返回的字符串数据
    26. if (typeof res === 'string') {
    27. res = res ? JSON.parse(res) : res
    28. }
    29. return res;
    30. },
    31. error => {
    32. console.log('err' + error) // for debug
    33. return Promise.reject(error)
    34. }
    35. )
    36. export default request
  3. 实现各个功能代码
     
    1. UserController:
    2. //批量删除
    3. @PostMapping("/del/batch")
    4. public boolean deleteBath(@RequestBody List<Integer> ids) {
    5. return userService.removeByIds(ids);
    6. }
    7. Home.vue
    8. save() {
    9. request.post("/user", this.form).then(res => {
    10. if (res) {
    11. this.$message.success("保存成功")
    12. this.dialogFormVisible = false
    13. this.load()
    14. } else {
    15. this.$message.error("保存失败")
    16. }
    17. })
    18. },
    19. handleAdd() {
    20. this.dialogFormVisible = true
    21. this.form = {}
    22. },
    23. handleEdit(row) {
    24. this.form = row //把列表的数据赋予row,row是表单scop
    25. this.dialogFormVisible = true
    26. },
    27. del(id) {
    28. request.delete("/user/" + id).then(res => {
    29. if (res) {
    30. this.$message.success("删除成功")
    31. this.load()
    32. } else {
    33. this.$message.error("删除失败")
    34. }
    35. })
    36. },
    37. delBatch() {
    38. let ids = this.multipleSelection.map(v => v.id) // [{}, {}, {}] => [1,2,3]
    39. request.post("/user/del/batch", ids).then(res => {
    40. if (res) {
    41. this.$message.success("批量删除成功")
    42. this.load()
    43. } else {
    44. this.$message.error("批量删除失败")
    45. }
    46. })
    47. },
    48. reset() {
    49. this.username = ""
    50. this.email = ""
    51. this.address = ""
    52. this.load()
    53. },
    54. handleSelectionChange(val) { //批量删除时选择那些存到val里
    55. console.log(val)
    56. this.multipleSelection = val
    57. },

2、SpringBoot代码生成器 

  1. 导入Mybatis-Plus生成器的依赖
    1. <!-- 代码生成器 -->
    2. <dependency>
    3. <groupId>com.baomidou</groupId>
    4. <artifactId>mybatis-plus-generator</artifactId>
    5. <version>3.5.1</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.apache.velocity</groupId>
    9. <artifactId>velocity</artifactId>
    10. <version>1.7</version>
    11. </dependency>
  2. 配置  CodeGenerator
    1. /**
    2. * mp代码生成器
    3. * by 青哥哥
    4. * @since 2022-01-26
    5. */
    6. public class CodeGenerator {
    7. public static void main(String[] args) {
    8. generate();
    9. }
    10. private static void generate() {
    11. FastAutoGenerator.create("jdbc:mysql://localhost:3306/zd_study?serverTimezone=GMT%2b8", "root", "123456")
    12. .globalConfig(builder -> {
    13. builder.author("郑迪") // 设置作者
    14. .enableSwagger() // 开启 swagger 模式
    15. .fileOverride() // 覆盖已生成文件
    16. .outputDir("D:\\IDEAcode\\郑迪学习框架\\springboot\\src\\main\\java\\"); // 指定输出目录
    17. })
    18. .packageConfig(builder -> {
    19. builder.parent("com.zd.springboot") // 设置父包名
    20. .moduleName(null) // 设置父包模块名
    21. .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D:\\IDEAcode\\郑迪学习框架\\springboot\\src\\main\\resources\\mapper\\")); // 设置mapperXml生成路径
    22. })
    23. .strategyConfig(builder -> {
    24. builder.entityBuilder().enableLombok();
    25. // builder.mapperBuilder().enableMapperAnnotation().build();
    26. builder.controllerBuilder().enableHyphenStyle() // 开启驼峰转连字符
    27. .enableRestStyle(); // 开启生成@RestController 控制器
    28. builder.addInclude("sys_user") // 设置需要生成的表名
    29. .addTablePrefix("t_", "sys_"); // 设置过滤表前缀
    30. })
    31. // .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
    32. .execute();
    33. }
    34. }
    3、编写生成配置
    1. package ${package.Controller};
    2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    3. import org.springframework.web.bind.annotation.*;
    4. import javax.annotation.Resource;
    5. import java.util.List;
    6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    7. import ${package.Service}.${table.serviceName};
    8. import ${package.Entity}.${entity};
    9. #if(${restControllerStyle})
    10. import org.springframework.web.bind.annotation.RestController;
    11. #else
    12. import org.springframework.stereotype.Controller;
    13. #end
    14. #if(${superControllerClassPackage})
    15. import ${superControllerClassPackage};
    16. #end
    17. /**
    18. * <p>
    19. * $!{table.comment} 前端控制器
    20. * </p>
    21. *
    22. * @author ${author}
    23. * @since ${date}
    24. */
    25. #if(${restControllerStyle})
    26. @RestController
    27. #else
    28. @Controller
    29. #end
    30. @RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
    31. #if(${kotlin})
    32. class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end
    33. #else
    34. #if(${superControllerClass})
    35. public class ${table.controllerName} extends ${superControllerClass} {
    36. #else
    37. public class ${table.controllerName} {
    38. #end
    39. @Resource
    40. private ${table.serviceName} ${table.entityPath}Service;
    41. // 新增或者更新
    42. @PostMapping
    43. public Result save(@RequestBody ${entity} ${table.entityPath}) {
    44. ${table.entityPath}Service.saveOrUpdate(${table.entityPath});
    45. return Result.success();
    46. }
    47. @DeleteMapping("/{id}")
    48. public Result delete(@PathVariable Integer id) {
    49. ${table.entityPath}Service.removeById(id);
    50. return Result.success();
    51. }
    52. @PostMapping("/del/batch")
    53. public Result deleteBatch(@RequestBody List<Integer> ids) {
    54. ${table.entityPath}Service.removeByIds(ids);
    55. return Result.success();
    56. }
    57. @GetMapping
    58. public Result findAll() {
    59. return Result.success(${table.entityPath}Service.list());
    60. }
    61. @GetMapping("/{id}")
    62. public Result findOne(@PathVariable Integer id) {
    63. return Result.success(${table.entityPath}Service.getById(id));
    64. }
    65. @GetMapping("/page")
    66. public Result findPage(@RequestParam Integer pageNum,
    67. @RequestParam Integer pageSize) {
    68. QueryWrapper<${entity}> queryWrapper = new QueryWrapper<>();
    69. queryWrapper.orderByDesc("id");
    70. return Result.success(${table.entityPath}Service.page(new Page<>(pageNum, pageSize), queryWrapper));
    71. }
    72. }
    73. #end

     

九、Vue使用路由

怎么整目前都整不对,具体显示如下图: 

 

十、SpringBoot和Vue实现导入导出 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/328578
推荐阅读
相关标签
  

闽ICP备14008679号