前后端分离开发Springboot+VUE学习笔记

news2024/9/28 11:15:12

学习内容来源:传送门

目录

  • 前后端分离
  • 实现技术
    • 创建vue项目
    • 在idea中打开
      • 新建页面
    • 创建SpringBoot应用
      • 创建实体对象与数据库表元素绑定
      • 创建实体类接口
    • 前端调用数据
      • 跨域传输在springboot中解决
  • 总结

前后端分离

前后端分离就是将一个应用的前端和后端代码分开写,为何如此?
如果不使用前后端分离,会有什么问题?
传统Java Web开发过程中,前端使用JSP开发,流程为
前端工程师写HTML页面→后端工程师在此基础上加上JSP语法,完成整个JSP
在这里插入图片描述

这种开发方式效率极低(前后端沟通困难)
由此引入前后端分离开发方式

前端只需要独立编写客户端代码完成页面,后端也只需要独立编写服务端代码提供数据接口即可。
前端通过Ajax请求来访问后端的数据接口,将Model展示到View中即可。
前后端开发者只需要提前约定好接口文档(URL、参数、数据类型……)然后分别独立开发即可。前端可以用假数据测试,不完全依赖于后端;后端通过Postman等接口调试工具测试即可,真正实现前后端解耦合,极大提升开发效率。

完整程序:前端应用+后端应用
前端应用:负责数据展示和用户交互
后端应用:负责提供数据处理接口
前端HTML→Ajax→RESTful后端数据接口
在这里插入图片描述
前后端将一个单体应用拆分成两个独立的应用,前端应用和后端应用都是以JSON格式进行交互。

实现技术

Spring Boot + Vue
使用 SpringBoot 进行后端应用开发,使用Vue进行前端应用开发

创建vue项目

在vue cli 3.0以上版本可以通过可视化界面进行创建配置链接
命令行输入(注意要以管理员身份打开命令提示符CMD,进入待创建目录)

vue ui

即可自动打开可视化页面
在这里插入图片描述
会自动弹出页面,选择自己想要的文件路径就创建项目吧
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码校验可以去除
在这里插入图片描述
打开历史记录
在这里插入图片描述
无需保存模板
在这里插入图片描述

创建好后启动运行项目
在这里插入图片描述
点击输出即可在命令行查看地址
在这里插入图片描述
单击进入页面,这就代表创建成功
在这里插入图片描述

在idea中打开

在命令行中CTRL+C断开链接
在idea中导入项目并且记得安装插件
在这里插入图片描述
在terminal用命令行启动项目
在这里插入图片描述
同样是CTRL+C退出/终止项目

vue是单页面应用,其主页面就是app.vue的内容
单击不同链接只是替换页面内容
在这里插入图片描述
目录结构详解传送门

新建页面

在这里插入图片描述
编写页面内容

<template>
    <div>
        <table>
            <tr>
                <td>编号</td>
                <td>书名</td>
                <td>作者</td>
            </tr>
        </table>
        {{msg}}
    </div>
</template>

<script>
    export default {
        name: "Book",
        data(){
            return{
                msg:'Hello vue'
            }
        }
    }
</script>

<style scoped>

</style>

配置路由
在这里插入图片描述
浏览器输入网址进行跳转
在这里插入图片描述
页面填充一些数据(手动写的假数据)

<template>
    <div>
        <table>
            <tr>
                <th>编号</th>
                <th>书名</th>
                <th>作者</th>
            </tr>
            <tr v-for="item in books">
                <td>{{item.id}}</td>
                <td>{{item.name}}</td>
                <td>{{item.author}}</td>
            </tr>
        </table>
        {{msg}}
    </div>
</template>

<script>
    export default {
        name: "Book",
        data(){
            return{
                msg:'Hello vue',
                books:[
                    {
                        id:1,
                        name:'水浒传',
                        author:'施耐庵'
                    },{
                        id:2,
                        name:'红楼梦',
                        author:'曹雪芹'
                    },{
                        id:1,
                        name:'三国演义',
                        author:'罗贯中'
                    },{
                        id:1,
                        name:'西游记',
                        author:'吴承恩'
                    }
                ]
            }
        }
    }
</script>

<style scoped>

</style>

页面即可动态更新内容
在这里插入图片描述

创建SpringBoot应用

idea中新建工程项目

在这里插入图片描述
在这里插入图片描述

勾选一些依赖
在这里插入图片描述
创建好后自动下载依赖,并且替换application.propertity为application.yml
在这里插入图片描述

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/library?serverTimezone=UTC&useLegacyDatetimeCode=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
server:
  port: 8181

连接这个数据库
在这里插入图片描述

创建实体对象与数据库表元素绑定

加@Entity表明此对象与元素绑定,@Data自动配置get set方法
在这里插入图片描述

创建实体类接口

在这里插入图片描述
继承JpaRepository接口,第一个泛型为实体类的类型(此处即Book)第二个为主键的类型,其定义好了一套操作,无需我们手动写
在类名处右击→Go To可自动创建测试类
在这里插入图片描述
再注入对象,测试调用
注意是api .Test
在这里插入图片描述
pom.xml需要做一定改动(我改了半天)才能正常运行。否则一直是空指针异常
具体如下,复用的话对java版本和包路径进行更改

<?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 https://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.1.18.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.makerjack</groupId>
    <artifactId>springboottest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboottest</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.32</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.1.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

运行findAll测试即可出现以下结果
在这里插入图片描述

测试成功后,创建controller层,并且实现操作
在这里插入图片描述
然后在主程序入口xxxApplication中启动整个springboot项目,在浏览器中访问localhost:8181/book/findAll
即可出现刚才测试出的数据
在这里插入图片描述
此时后端就可以提供真实数据,前端调用这个数据接口呈现即可

前端调用数据

在前端项目中,控制台键入

vue add axios

··
在这里插入图片描述
目录中也会出现对应内容
在这里插入图片描述
重启vue项目后,页面可能会一片空白
解决方案
最终main.js如下
在这里插入图片描述
注意波浪线处的axios需要自己写明,不然会报未定义错误

在之前写过的页面Book.vue下加入初始化函数created()进行调用
在这里插入图片描述
测试成功,确实有弹窗

在这里插入图片描述
那么只需要在created()中调用后端提供的数据接口即可
首先测试一下能否成功调用数据
在create中加入

axios.get('http://localhost:8181/book/findAll').then(function (resp) {
        console.log(resp)
})

控制台中会发现
在这里插入图片描述
这就是跨域传输遇到的问题

跨域传输在springboot中解决

在后端项目文件下建立Config类
在这里插入图片描述
内容如下

package com.makerjack.springboottest.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class crossConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

重启项目,就能在前端请求到相应的数据
在这里插入图片描述
成功请求到,则只需将页面中的data内容替换即可
将create()函数改为

created() {
    const _this = this
    axios.get('http://localhost:8181/book/findAll').then(function (resp) {
        _this.books = resp.data
    })
}//初始化调用

注:此处get中不能直接使用this,直接this是指的回调函数中的this,而非我们想要的this,故用_this来指代

保存后页面刷新效果如下
在这里插入图片描述

总结

至此,一个简单的前后端分离项目就算完成了,大概步骤就是

  1. 搭建前端项目,使用假数据测试能否正确显示
  2. 搭建后端项目,取用数据库数据,并且提供访问接口,注意跨域传输的配置问题
  3. 前后端对接,使其真正成为一个项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端:分享JS中7个高频的工具函数

目录 ◆1、将数字转换为货币 ◆2、将 HTML 字符串转换为 DOM 对象 ◆3、防抖 ◆4、日期验证 ◆5、将 FormData&#xff08;表单数据&#xff09;转换为 JSON ◆6、衡量一个函数的性能 ◆7、从数组中删除重复项 JavaScript 实用函数是有用的、可重复使用的片段&#xff0…

STM32开发(14)----CubeMX配置ADC

CubeMX配置ADC前言一、什么是ADC&#xff1f;二、实验过程1.单通道ADC采集STM32CubeMX配置代码实现2.多通道ADC采样(非DMA)STM32CubeMX配置代码实现3.多通道ADC采样&#xff08;DMA&#xff09;STM32CubeMX配置代码实现总结前言 本章介绍使用STM32CubeMX对ADC进行配置的方法&a…

SpringCloud之Seata(二)

4.Seata如何应用于项目&#xff1f; 安装seata及修改配置 4.1 官网下载Seata安装包 4.2 修改seata/config.txt 4.2.1 修改存储方式 store.db.dbTypemysql store.db.driverClassNamecom.mysql.jdbc.Driver store.db.urljdbc:mysql://你的IP:3306/seata?useUnicodetrue sto…

第一篇博客------自我介绍篇

目录&#x1f506;自我介绍&#x1f506;学习目标&#x1f506;如何学习单片机Part 1 基础理论知识学习Part 2 单片机实践Part 3 单片机硬件设计&#x1f506;希望进入的公司&#x1f506;结束语&#x1f506;自我介绍 Hello!!!我是一名即已经步入大二的计算机小白。 --------…

F4—LVDS接口LCD显示彩图测试-2023-02-25

1.简介 系列文章TFT彩条测试介绍到&#xff0c;屏幕是由厂家提供的TFT显示模组和屏幕PCB背板组成。PCB的作用是提供LCD背光所需的电压、用于屏幕显示的电压、与其他设备相连的排针或者其他连接器形式。当模组支持触摸功能时还可以接上触摸转换或触摸控制芯片&#xff0c;通过SP…

Qt 中的XML

XML的基本介绍&#xff1a; 在前端开发中&#xff1a;HTML是用来显示数据&#xff0c;而XML是用来传输和存储数据的 XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;XML 是一种标记语言&#xff0c;很类似 HTMLXML 的设计宗旨是传输数据&#xff0c;而…

超简单的待办事项列表管理器todo

什么是 todo ? todo 是一个自托管的 todo web 应用程序&#xff0c;可让您以简单且最少的方式跟踪您的 todo。&#x1f4dd; 老苏觉得和之前介绍的 KissLists 比较像 文章传送门&#xff1a;最简单的共享列表服务器KissLists 官方提供了 Demo 演示站点&#xff1a;https://tod…

零基础的人如何入门 Python ?看完这篇文章你就懂了

第一部分&#xff1a;编程环境准备 零基础入门Python的话我不建议用IDE&#xff0c;IDE叫集成开发环境&#xff0c;这东西一般是专业程序员用来实战开发用的&#xff0c;好处很多&#xff0c;比如&#xff1a;调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测…

Android-MVVM之快速上手ViewModel

Android-MVVM之快速上手ViewModel什么是ViewModel&#xff1f;ViewModel生命周期&#xff1f;ViewModel的使用&#xff1f;什么是ViewModel&#xff1f; 简单来说&#xff0c;就是让view层(视图层)与model层(数据层)分离开来的桥梁。让view层展示ui&#xff0c;不持有数据。 Vi…

【2021春节】解题领红包之番外篇

【2021春节】解题领红包之番外篇前言原始代码解题思路flag1寻找flag2的寻找前言 记录下jsfuck的另类&#xff0c;时间都过去两年了&#xff0c;确实有点久远。。。 原始代码 要求找出flag1和flag2值 ([][])[([][[]][])[!![]](!![][][(![][])[[]](![][])[!![]!![]](![][])[!![…

Vue基础入门讲义(二)-语法基础

文章目录1.vue入门案例1.1.HTML模板1.2.vue渲染1.3.双向绑定1.4.事件处理2.Vue实例2.1.创建Vue实例2.2.模板或元素2.3.数据2.4.方法3.生命周期钩子3.1.生命周期3.2.钩子函数3.3.this1.vue入门案例 1.1.HTML模板 在项目目录新建一个HTML文件 01-demo.html 1.2.vue渲染 01-d…

SSM框架-AOP概述、Spring事务

16 spring整合mybatis 16.1 前情代码 实体类 public class Account {private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void …

搭建k8s高可用集群—20230225

文章目录多master&#xff08;高可用&#xff09;介绍高可用集群使用技术介绍搭建高可用k8s集群步骤1. 准备环境-系统初始化2. 在所有master节点上部署keepalived3.1 安装相关包3.2 配置master节点3.3 部署haproxy错误解决3. 所有节点安装Docker/kubeadm/kubelet4. 部署Kuberne…

对redis之键值型数据库的理解

键值数据库&#xff0c;首先就要考虑里面可以存什么样的数据&#xff0c;对数据可以做什么样的操作&#xff0c;也就是数据模型和操作接口。它们看似简单&#xff0c;实际上却是我们理解 Redis 经常被用于缓存、秒杀、分布式锁等场景的重要基础。理解了数据模型&#xff0c;你就…

2022年网络安全竞赛——数字取证调查attack.pcapng

攻击日志分析:需求环境可私信博主获取 任务环境说明: 服务器场景:PYsystem0031服务器场景操作系统:未知服务器场景FTP用户名:anonymous 密码:空从靶机服务器的FTP上下载attack.pcapng数据包文件,通过分析数据包attack.pcapng,找出黑客的IP地址,并将黑客的IP地址作为FL…

SPI协议介绍

SPI协议介绍 文章目录SPI协议介绍一、 SPI硬件知识1.1 硬件连线1.2 SPI控制器内部结构二、 SPI协议2.1 传输示例2.2 SPI模式致谢一、 SPI硬件知识 1.1 硬件连线 引脚含义如下&#xff1a; 引脚含义DO(MOSI)Master Output, Slave Input&#xff0c;SPI主控用来发出数据&#x…

逆向之Windows PE结构

写在前面 对于Windows PE文件结构&#xff0c;个人认为还是非常有必要掌握和了解的&#xff0c;不管是在做逆向分析、免杀、病毒分析&#xff0c;脱壳加壳都是有着非常重要的技能。但是PE文件的学习又是一个非常枯燥过程&#xff0c;希望本文可以帮你有一个了解。 PE文件结构…

buu [NCTF2019]babyRSA 1

题目描述&#xff1a; 题目分析&#xff1a; 首先明确两个公式&#xff1a; e*d 1 mod (p-1)(q-1) ed1 e*d - 1 k(p-1)(q-1)想要解出此题&#xff0c;我们必须知道n,而要知道n,我们要知道p和q的值通过 e*d 的计算&#xff0c;我们知道其长度为2066位&#xff0c;而生成p的…

《分布式技术原理与算法解析》学习笔记Day22

哈希与一致性哈希 在分布式系统中&#xff0c;哈希和一致性哈希是数据索引或者数据分布的常见实现方式。 数据分布设计原则 在分布式数据存储系统中&#xff0c;做存储方案选型时&#xff0c;一般会考虑以下因素&#xff1a; 数据均匀数据稳定节点异构性隔离故障域性能稳定…

Delphi Http Https 最好的解决方法(三) LoadLibrary扩展

开发环境: Delphi XE 10.1 Berlin 前提文章: Delphi Http Https 最好的解决方法(二) 目录 1. 项目描述 2. 问题描述 3. 解决方案 3.1 主程序在导入dll方法单元处理(不推荐) 3.2 在dll的工程文件处加入(不推荐) 3.3 在dll的工程文件获取dll(HelpTool.dll)的当前路径(推荐方…