当前位置:   article > 正文

二十分钟秒懂:实现前后端分离开发(vue+element+spring boot+mybatis+MySQL)

前后端分离

目录

开发者介绍

什么是前后端分离开发

vue与springboot开发的优势

Vue.js 的优势:

Spring Boot 的优势:

vue与springboot如何实现前后端连接

demo简介

重要部分前端部分代码

重要部分后端代码

后端解决跨域问题

Controller部分

xml部分

service部分

demo示例演示


开发者介绍

后端开发者:小昕ᵇᵃᵇʸ.的博客_CSDN博客-领域博主小昕ᵇᵃᵇʸ.关注python,css,java,c语言,html5,数据结构领域.https://blog.csdn.net/m0_68936458?type=blog前端开发者:

lqj_本人的博客_CSDN博客-python人工智能视觉(opencv)从入门到实战,微信小程序,前端领域博主lqj_本人擅长python人工智能视觉(opencv)从入门到实战,微信小程序,前端,等方面的知识https://blog.csdn.net/lbcyllqj?spm=1000.2115.3001.5343

什么是前后端分离开发

前后端分离开发是一种软件开发模式,将前端和后端的开发分离开来,使得前端和后端可以独立开发、测试和部署。在前后端分离开发中,前端负责展示数据和用户交互,后端负责处理业务逻辑和数据存储。 具体来说,前端开发人员使用 HTML、CSS、JavaScript 等技术实现用户界面和交互逻辑,通过 AJAX 或 WebSocket 等技术与后端进行通信,获取数据并将数据展示给用户。后端开发人员则负责编写业务逻辑和数据存储的代码,提供 API 接口供前端调用。 前后端分离开发的优点包括:

  1. 提高开发效率:前后端可以并行开发,减少了开发时间。
  2. 提高可维护性:前后端分离后,代码耦合度降低,修改一个模块不会影响到其他模块。
  3. 提高可扩展性:前后端分离后,可以更容易地添加新的功能模块。
  4. 提高用户体验:前端可以更快地响应用户操作,提高用户体验。

vue与springboot开发的优势

Vue.js 和 Spring Boot 是两个非常流行的开发框架,它们分别用于前端和后端开发。它们的优势如下:

Vue.js 的优势:

  1. 响应式数据绑定:Vue.js 的核心是响应式数据绑定,它可以自动追踪数据的变化,并且更新视图。这使得开发者可以更加专注于业务逻辑的实现,而不用过多关注 DOM 操作。
  2. 组件化开发:Vue.js 支持组件化开发,可以将一个页面拆分成多个组件,每个组件都有自己的状态和行为。这样可以提高代码的复用性和可维护性。
  3. 轻量级:Vue.js 的体积非常小,只有 20KB 左右,加载速度非常快,可以提高用户体验。

Spring Boot 的优势:

  1. 快速开发:Spring Boot 提供了自动配置和快速启动的特性,可以快速搭建一个基于 Spring 的应用程序。
  2. 高度集成:Spring Boot 集成了大量的第三方库和框架,可以方便地与其他技术进行集成,如数据库、消息队列、缓存等。
  3. 易于部署:Spring Boot 应用程序可以打包成一个可执行的 JAR 文件,可以方便地部署到任何支持 Java 的环境中。

综上所述,Vue.js 和 Spring Boot 都有各自的优势,它们可以很好地配合使用,实现高效的全栈开发。Vue.js 负责前端 UI 的实现和交互逻辑,Spring Boot 负责后端业务逻辑的实现和数据处理。

vue与springboot如何实现前后端连接

Vue和Spring Boot可以通过RESTful API实现前后端连接。

        首先,在Spring Boot中创建一个RESTful API,可以使用Spring Boot提供的@RestController注解来实现。在这个API中,你可以定义HTTP请求的处理逻辑,比如从数据库中获取数据并返回给前端。

        然后,在Vue中,你可以使用Vue提供的axios库来发送HTTP请求,获取后端数据。你可以在Vue组件中使用axios发送请求,然后将返回的数据渲染到页面上。

具体实现步骤如下:

  1. 在Spring Boot中创建一个RESTful API,使用@RestController注解来标记这个API。
  2. 在API中定义HTTP请求的处理逻辑,比如从数据库中获取数据并返回给前端。
  3. 在Vue中使用axios库发送HTTP请求,获取后端数据。
  4. 在Vue组件中将返回的数据渲染到页面上。

简单的示例:

在Spring Boot中创建一个RESTful API:

  1. @RestController
  2. @RequestMapping("/api")
  3. public class ApiController {
  4. @Autowired
  5. private UserService userService;
  6. @GetMapping("/users")
  7. public List<User> getUsers() {
  8. return userService.getUsers();
  9. }
  10. }

在Vue中使用axios发送HTTP请求:

  1. import axios from 'axios'
  2. export default {
  3. data() {
  4. return {
  5. users: []
  6. }
  7. },
  8. mounted() {
  9. axios.get('/api/users')
  10. .then(response => {
  11. this.users = response.data
  12. })
  13. .catch(error => {
  14. console.log(error)
  15. })
  16. }
  17. }

在Vue组件中将返回的数据渲染到页面上:

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="user in users" :key="user.id">{{ user.name }}</li>
  5. </ul>
  6. </div>
  7. </template>
  8. <script>
  9. import axios from 'axios'
  10. export default {
  11. data() {
  12. return {
  13. users: []
  14. }
  15. },
  16. mounted() {
  17. axios.get('/api/users')
  18. .then(response => {
  19. this.users = response.data
  20. })
  21. .catch(error => {
  22. console.log(error)
  23. })
  24. }
  25. }
  26. </script>

demo简介

注:小demo只是做了简单的演示示例,功能齐全但样式简单,望大家谅解!

此小demo适用于刚接触前端后分离开发的小伙伴,尤其针对前端vue+后端spring boot分离开发的小伙伴。

本项目主要完成了通过前端的vue.js与后端的spring boot的连接,实现了简单的实现了通过前端页面来调用后端API接口,从而完成对数据库中内容的增删改查。

重要部分前端部分代码

  1. <template>
  2. <div class="big_box">
  3. <!-- 添加数据 -->
  4. <div style="display:flex;">
  5. <el-input v-model="newData.product_date" placeholder="请输入日期"></el-input>
  6. <el-input v-model="newData.brand" placeholder="请输入品牌"></el-input>
  7. <el-input v-model="newData.commodity_name" placeholder="请输入产品"></el-input>
  8. <el-input v-model="newData.act" placeholder="请输入产品描述"></el-input>
  9. <el-input v-model="newData.commodity_id" placeholder="请输入产品编号"></el-input>
  10. <el-input v-model="newData.price" placeholder="请输入价格"></el-input>
  11. <el-input v-model="newData.amount" placeholder="请输入库存量"></el-input>
  12. <el-button @click="add" type="success" size="small">添加</el-button>
  13. </div>
  14. <!-- 数据展示 -->
  15. <el-table
  16. :data="tableData"
  17. border
  18. style="width: 100%">
  19. <el-table-column
  20. fixed
  21. prop="product_date"
  22. label="日期"
  23. width="150">
  24. </el-table-column>
  25. <el-table-column
  26. prop="brand"
  27. label="品牌"
  28. width="120">
  29. </el-table-column>
  30. <el-table-column
  31. prop="commodity_name"
  32. label="产品"
  33. width="120">
  34. </el-table-column>
  35. <el-table-column
  36. prop="act"
  37. label="产品描述"
  38. width="300">
  39. </el-table-column>
  40. <el-table-column
  41. prop="commodity_id"
  42. label="产品编号"
  43. width="120">
  44. </el-table-column>
  45. <el-table-column
  46. prop="price"
  47. label="价格"
  48. width="120">
  49. </el-table-column>
  50. <el-table-column
  51. prop="amount"
  52. label="库存量"
  53. width="120">
  54. </el-table-column>
  55. <el-table-column
  56. fixed="right"
  57. label="操作">
  58. <template slot-scope="scope">
  59. <el-button @click="handleClick(scope.row)" type="warning" size="small">修改</el-button>
  60. <el-button @click="del_data(scope.row.commodity_id)" type="danger" size="small">删除</el-button>
  61. </template>
  62. </el-table-column>
  63. </el-table>
  64. <!-- 修改数据 -->
  65. <div v-if="this.update">
  66. <div style="display:flex;">
  67. <el-input v-model="upData.product_date" placeholder="请输入日期"></el-input>
  68. <el-input v-model="upData.brand" placeholder="请输入品牌"></el-input>
  69. <el-input v-model="upData.commodity_name" placeholder="请输入产品"></el-input>
  70. <el-input v-model="upData.act" placeholder="请输入产品描述"></el-input>
  71. <el-input v-model="upData.commodity_id" placeholder="请输入产品编号"></el-input>
  72. <el-input v-model="upData.price" placeholder="请输入价格"></el-input>
  73. <el-input v-model="upData.amount" placeholder="请输入库存量"></el-input>
  74. <el-button @click="edit_put" type="success" size="small">修改</el-button>
  75. </div>
  76. </div>
  77. </div>
  78. </template>
  79. <script>
  80. import axios from 'axios'
  81. export default{
  82. mounted(){
  83. // 显示数据
  84. axios.get('http://localhost:8090/car/query').then(res=>{
  85. console.log(res.data.data);
  86. this.tableData = res.data.data
  87. })
  88. },
  89. methods: {
  90. handleClick(row) {
  91. this.update = true
  92. this.row_data = row
  93. console.log(this.row_data);
  94. this.id = row.commodity_id
  95. },
  96. // 条件修改
  97. edit_put(){
  98. axios.post('http://localhost:8090/car/update',{
  99. commodity_id:this.upData.commodity_id
  100. }).then(res=>{
  101. console.log(res.data)
  102. this.update = false
  103. })
  104. },
  105. // 添加数据
  106. add(){
  107. axios.post('http://localhost:8090/car/add',this.newData).then(res=>{
  108. console.log(res.data)
  109. })
  110. },
  111. // 删除数据
  112. del_data(commodity_id){
  113. console.log(commodity_id);
  114. axios.get('http://localhost:8090/car/del?commodity_id='+commodity_id).then(res=>{
  115. console.log(res.data)
  116. })
  117. }
  118. },
  119. data() {
  120. return {
  121. update:false,
  122. id:'',
  123. row_data:'',
  124. // 添加数据data
  125. newData:{
  126. brand:'',
  127. commodity_id:'',
  128. commodity_name:'',
  129. product_date:'',
  130. act:'',
  131. amount:null,
  132. price:null
  133. },
  134. // 修改数据data
  135. upData:{
  136. brand:'',
  137. commodity_id:'',
  138. commodity_name:'',
  139. product_date:'',
  140. act:'',
  141. amount:null,
  142. price:null
  143. },
  144. tableData: []
  145. }
  146. }
  147. }
  148. </script>
  149. <style scoped>
  150. .big_box{
  151. width: 1200px;
  152. }
  153. </style>

重要部分后端代码

后端解决跨域问题

@CrossOrigin(origins = "*")

Controller部分

  1. package com.wfit.boot.controller;
  2. import com.wfit.boot.commons.Result;
  3. import com.wfit.boot.model.Car;
  4. import com.wfit.boot.service.CarService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.*;
  7. import java.util.List;
  8. @RestController
  9. @RequestMapping("/car")
  10. public class CarController {
  11. @Autowired
  12. private CarService carService;
  13. /**
  14. * 新增汽车用品信息
  15. * @param car
  16. * @return
  17. */
  18. @PostMapping("/add")
  19. @CrossOrigin(origins = "*")
  20. public Result addCar(@RequestBody Car car){
  21. carService.saveCar(car);
  22. return Result.success("新增汽车用品信息成功:" + car);
  23. }
  24. /**
  25. * 修改
  26. * @param car
  27. * @return
  28. */
  29. @PostMapping ("/update")
  30. @CrossOrigin(origins = "*")
  31. public Result updateCar(@RequestBody Car car){
  32. carService.updateCar(car);
  33. return Result.success("修改汽车用品信息成功:" + car);
  34. }
  35. /**
  36. * 删除
  37. * @param commodity_id
  38. * @return
  39. */
  40. @GetMapping("/del")
  41. @CrossOrigin(origins = "*")
  42. public Result delCar(String commodity_id){
  43. carService.delCar(commodity_id);
  44. return Result.success("删除编号为" + commodity_id + "汽车用品信息成功!");
  45. }
  46. /**
  47. * 查询
  48. * @return
  49. */
  50. @GetMapping("/query")
  51. @CrossOrigin(origins = "*")
  52. public Result queryCar(){
  53. List<Car> carList = carService.queryCar();
  54. return Result.success(carList);
  55. }
  56. }

xml部分

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.wfit.boot.mapper.CarMapper">
  4. <!--保存汽车用品信息-->
  5. <insert id="saveCar" parameterType="com.wfit.boot.model.Car">
  6. insert into car values (
  7. #{brand},
  8. #{commodity_id},
  9. #{commodity_name},
  10. #{act},
  11. #{product_date},
  12. #{amount},
  13. #{price}
  14. )
  15. </insert>
  16. <!-- 修改汽车用品信息-->
  17. <update id="updateCar" parameterType="com.wfit.boot.model.Car">
  18. update car
  19. set price = #{price}
  20. where commodity_id =#{commodity_id}
  21. </update>
  22. <!-- 删除汽车用品信息-->
  23. <delete id="delCar" parameterType="java.lang.String">
  24. delete from car where commodity_id = #{commodity_id};
  25. </delete>
  26. <!-- 查询汽车用品信息-->
  27. <select id="queryCar" resultType="com.wfit.boot.model.Car">
  28. select *
  29. from car
  30. </select>
  31. </mapper>

service部分

  1. package com.wfit.boot.service.impl;
  2. import com.wfit.boot.mapper.CarMapper;
  3. import com.wfit.boot.model.Car;
  4. import com.wfit.boot.service.CarService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. @Service
  9. public class CarServiceImpl implements CarService {
  10. @Autowired
  11. private CarMapper carMapper;
  12. @Override
  13. public void saveCar(Car car) {
  14. carMapper.saveCar(car);
  15. }
  16. @Override
  17. public void updateCar(Car car) {
  18. carMapper.updateCar(car);
  19. }
  20. @Override
  21. public void delCar(String commodity_id) {
  22. carMapper.delCar(commodity_id);
  23. }
  24. @Override
  25. public List<Car> queryCar() {
  26. return carMapper.queryCar();
  27. }
  28. }

demo示例演示

 

 

 

 

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

闽ICP备14008679号