前后端交互Demo练习

分离式前后端的交互(超详细) 超详细前后端交互过程 阅读详情

        前面知识点大概都讲完了,今天来说一下星期天做的前后端交互的Demo,进行知识的汇总,查漏补缺。

        这个Demo主要是把数据库中的信息展现到前端页面,用户通过点击按钮进行增删改查的操作。

流程图:

 

一、前端页面的搭建

工具:HBuilder X

语言:HTML、JS、CSS

框架:VUE

1.前端页面框架的搭建

1.1 项目结构vue基本框架搭建

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>前后端交互案例</title>
		<script src="../js/axios.js" type="text/javascript"></script>
		<script src="../js/vue.js" type="text/javascript"></script>
	</head>
	<body>
		<div id="app">
			<!-- 用户修改 -->
			<div id="">
				
			</div>
			<!-- 用户新增 -->
			<div id="">
				
			</div>
			<!-- 用户列表 -->
			<div id="">
				
			</div>
			
		</div>
		<script type="text/javascript">
			const app=new Vue({
				el:"#app",
				data:{
					
				}methods:{
					
				},
				created() {
					
				}
			})
		</script>
	</body>
</html>

知识点:

注意导入Ajax和vue的JS文件

注意生命周期函数created在VUE对象的根目录写,不在methods里写,由系统在完成创建对象后自动调用 

1.2根据数据库数据进行内容填充

用户修改:

<div id="" align="center">
				<h2>用户修改</h2>
				编号:<input type="text" name="" id="" value="" disabled/>
				姓名:<input type="text" name="" id="" value="" /><br>
				年龄:<input type="text" name="" id="" value="" />
				性别:<input type="text" name="" id="" value="" /><br>
				<button type="button">确认修改</button>
			</div>

用户新增:

<div id="" align="center">
				<h2>用户新增</h2>
				姓名:<input type="text" name="" id="" value="" />
				年龄:<input type="text" name="" id="" value="" />
				性别:<input type="text" name="" id="" value="" />
				<button type="button">确认新增</button>
			</div>

用户列表:

<div id="">
				<table border="" cellspacing="" cellpadding="" align="center" width="80%">
					<tr><th colspan="5"><h2>用户列表</h2></th></tr>
					<tr>
						<th>编号</th>
						<th>姓名</th>
						<th>年龄</th>
						<th>性别</th>
						<th>操作</th>
					</tr>
					<tr v-for="user in userList">
						<td v-text="user.id"></td>
						<td v-text="user.name"></td>
						<td v-text="user.age"></td>
						<td v-text="user.sex"></td>
						<td align="center" width="15%">
							<button type="button">修改</button>
							<button type="button">删除</button>
						</td>
					</tr>
				</table>	
			</div>

页面展现:

 知识点:

用户修改编号的值不可以改,所以加disabled关键字不可输入

用户列表作为表名要合并列,加colspan="5"进行合并5列

v-for="user in userList" for循环 user为每一个属性   userList为要循环遍历的数组名

v-text  防止闪现问题的出现

1.3用户数据的填充

<script type="text/javascript">
			axios.defaults.baseURL="http://127.0.0.1:8888/vue"
			const app=new Vue({
				el:"#app",
				data:{
					userdata:[]
				}methods:{
					userList(){
						axios.get("findAll").then(promise => {
							this.userdata=promise.data
						})
					}
					
				},
				created() {
					this.userList()
				}
			})
		</script>

知识点:

axios.defaults.baseURL语句定义默认URL地址头,一般在最开始写入,简化后面地址的编写

思路:在数据区定义一个空数组用来存放用户数据,添加userList方法用Ajax请求获取后端调用数据库的数据赋值给userdata空数组,created在页面展现之初就会默认执行,所以用它调用userList方法,使页面一加载就会展现出数据

二、后端项目的搭建

工具:IDEA

语言:JAVA

框架:Springboot、Spring、SpringMVC、Mybatis、MybatisPlus

1.后端项目框架的搭建

1.1核心配置文件

#端口配置
server:
  port: 8888

#配置数据源
spring:
  datasource:
    #如果使用高版本驱动 则添加cj
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

#Spring整合MybatisPlus
mybatis-plus:
  #定义别名包
  type-aliases-package: com.jt.pojo
  #导入映射文件
  mapper-locations: classpath:/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

#为这个包下的sql打印日志
logging:
  level:
    com.jt.mapper: debug

知识点:

yml文件有严格的层级结构,注意前面的空格

不手动编写,直接复制粘贴进行具体业务内容的修改即可

1.2映射文件

<?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.jt.mapper.UserMapper">



</mapper>

知识点:

注意持久层对应的接口

单表CRUE的操作改用MP,多表查询或者又复杂查询时再用Mybatis在此文件中编写sql语句

一般不在resources的根目录下,应重新建目录文件存放在里面

1.3启动类

package com.jt;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.jt.mapper")
public class RunApp {
    public static void main(String[] args) {
        SpringApplication.run(RunApp.class );
    }
}

知识点:

手动添加包扫描,参数是持久层的全路径

写在大包下

1.4实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@TableName("demo_user")
public class User implements Serializable{
    @TableId(type = IdType.AUTO)
    private Integer id;
    @TableField("name")
    private String name;
    @TableField("age")
    private Integer age;
    @TableField("sex")
    private String sex;
}

知识点:

Lombok的使用简化代码编写

实现Serializable序列化接口:保证对象网络传输的有效性!!!

@TableName("demo_user")对应数据库的表名

@TableId(type = IdType.AUTO)主键添加自增

@TableField("name")如果属性名与数据库表字段名相同可以省略此注解

1.5持久层

public interface UserMapper extends BaseMapper<User> {
}

知识点:

        继承BaseMapper<User>接口,就可以调用MP的基本CRUD的方法,必须传入泛型,传实体类名称

1.6业务层

接口

public interface UserService {
}

知识点: 

在这里定义抽象方法,规范代码,解耦操作

接口实现类

@Service
public class UserServiceimpl implements UserService{
    @Autowired
    private UserMapper userMapper;
}

知识点:

进行IOC,交给spring管理

DI持久层,使用MP的方法

进行接口方法的重写,调用MP的具体方法完成业务功能

1.7控制层

@RestController
@RequestMapping("vue")
@CrossOrigin
public class UserController {
    @Autowired
    private UserService userService;
    
}

知识点:

@RestController包含@Controller和@ResponseBody两个注解,分别进行IOC交给spring管理和把java返回的对象变成JSON串传输

@RequestMapping("vue")     URL定义类

@CrossOrigin解决跨域问题

DI入业务层进行业务的调用

1.8总体结构示例

 

三、前后交互设计

1.获取用户数据

前端发起Ajax请求数据,后端进行方法调用返回List集合

    //所有用户数据
    @GetMapping("findAll")
    public List<User> findAll(){
        return userService.findAll();
    }



    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }

知识点:

在查询所有时,构造器直接传NULL即可 

页面展现:

 2.进行用户删除操作

前端发起Ajax请求删除数据,后端进行方法调用返回删除提示信息

前端代码

<button type="button" @click="deleteuser(user)">删除</button>

deleteuser(user){
				axios.delete("deleteuser",{params:user}).then(promise => {
					alert(promise.data)
					this.userList()	
						})
					}

思路:删除按钮添加点击事件并传入user参数,方法区添加方法发起删除Ajax请求,删除后弹出后端返回的删除成功提示信息,并再次调用userList方法进行列表的刷新操作

知识点:

delete和get传的参数为对象时要加{params:对象名}

后端代码:

    @DeleteMapping("deleteuser")
    public String deleteuser(Integer id){
        userService.deleteuser(id);
        return "删除成功";
    }


    @Override
    public void deleteuser(Integer id) {
        userMapper.deleteById(id);
    }

知识点:

传入的时User对象,接收时可以接收User对象,也可以接收Integer id,因为mvc底层会从传入user对象自动进行拼接setid、setname等,只接受id后面用deleteById方法简单一点

页面展现:

 

 

王昭君成功删除了 

3.进行用户新增操作

前端发起Ajax请求新增数据,后端进行方法调用返回新增提示信息

前端代码

<div id="" align="center">
				<h2>用户新增</h2>
				姓名:<input type="text" name="" id="" value="" v-model="useradd.name"/>
				年龄:<input type="text" name="" id="" value="" v-model="useradd.age"/>
				性别:<input type="text" name="" id="" value="" v-model="useradd.sex"/>
				<button type="button" @click="postuser">确认新增</button>
			</div>


useradd:{
						name:'',
						age:'',
						sex:''
					}


postuser(){
						axios.post("postuser",this.useradd).then(promise => {
							alert(promise.data)
							this.userList()
							this.useradd={}
						})
					}

思路:新建一个useradd对象用来与新增输入双向绑定,添加点击事件调用postuser方法进行Ajax请求发送,然后进行后端返回提示信息弹框,刷新列表,清空新增输入框内容

知识点:

post和put向后端传对象时可以直接传对象名称

后端代码:

    @PostMapping("postuser")
    public String postuser(@RequestBody User user){
        userService.postuser(user);
        return "新增成功";
    }


    @Override
    public void postuser(User user) {
        userMapper.insert(user);
    }

知识点:

前端用post和put传入的是对象,后端接收的时候需要加@RequestBody注解:表示把json串转化为User对象

页面展现:

 

4.用户信息修改 

前端发起Ajax请求修改数据,后端进行方法调用返回修改提示信息

前端代码:

<button type="button" @click="getuser(user)">修改</button>

getuser(user){
						this.upuser=user
					}

upuser:{
						id:'',
						name:'',
						age:'',
						sex:''
					}

<div id="" align="center">
				<h2>用户修改</h2>
				编号:<input type="text" name="" id="" value="" disabled v-model="upuser.id"/>
				姓名:<input type="text" name="" id="" value="" v-model="upuser.name"/><br>
				年龄:<input type="text" name="" id="" value="" v-model="upuser.age"/>
				性别:<input type="text" name="" id="" value="" v-model="upuser.sex"/><br>
				<button type="button" @click="putuser">确认修改</button>
			</div>


async putuser(){
						let{data:result} =
						 await axios.put("upuser",this.upuser)
							alert(result)
							this.userList()
							this.upuser={}
						}

思路:通过修改按钮添加触发事件把当前user值赋值给定义的upuser对象,同时与修改输入框进行双向绑定,值出现在修改框里,进行修改后点击按钮触发点击事件进行Ajax向后台发起修改,弹出后端修改成功返回的值,刷新列表,把修改框清空。

知识点:

put传对象可以直接传

Ajax新写法,同一行调用一个方法执行,防止BUG

后端代码:

    @PutMapping("upuser")
    public String upuser(@RequestBody User user){
        userService.upuser(user);
    return "修改成功";
    }


    @Override
    public void upuser(User user) {
        userMapper.updateById(user);
    }

知识点:

post和put接收json对象需要加@RequestBody注解

updateById方法解析对象的值,id为where条件,其他为要修改的值

如果有重复的条件和修改的值可以用restFul+对象的方式传输,后端接收时需要分别加@RequestBody和@PathVariable注解,接收的url需要更换名称,否则会覆盖,引发BUG,具体如下

 @PutMapping("updateUserByName/{wherename}")
    //restFul可以尾对象的属性赋值
    //注意restFul的名称不要与属性重名,否则会覆盖,引发BUG
    public String ccc(@RequestBody User user,@PathVariable String wherename){
        userService.upp3(user,wherename);
        return "修改成功";
    }

页面展现:

 

到这里这个小Demo就结束了!

满怀希望就会所向披靡!!! 

云对象 - 重新定义前后端交互 云对象:服务器编写API,客户端调用API,不再开发传输json的接口。思路更清晰、代码更精简。比如服务端编写一个云对象news,该对象导出若干方法:add()、getList()、getDetailById()、softDel()、changeContent()、allowPublic()、addComment()、getComments()...等方法。客户端的js则可以直接import这个news云对象,然后直接调用add等方法。 阅读详情

相关推荐

SpringBoot+Maven 多模块项目的构建、运行、打包实战

主要介绍了SpringBoot+Maven 多模块项目的构建、运行、打包实战,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

前端如何调用后端接口进行数据交互(极简)

axios,前后端数据交互,数据渲染,发请求,axjax

weixin_43005654的博客 7万+

手把手教你用FPGA解析AD9680的JESD204B数据流(附Verilog代码)

本文详细介绍了如何利用FPGA解析AD9680的JESD204B数据流,包括协议核心机制、硬件平台搭建、Verilog代码实现及调试技巧。通过实战案例和代码示例,帮助工程师快速掌握高速ADC数据采集与处理技术,提升系统性能。

weixin_33640562的博客 371

html小Demo: js调用java后端提供的接口

文章目录html小Demo: js调用java后端提供的接口html常用的一些标签(初级版)以及对html的一些理解的笔记head常用标签body常用标签JavaScriptJava springboot代码java后端:前端jshtml遇到的问题以及解决1. Cannot read property 'addEventListener' of null2. 跨域问题最后放个效果图 html小Demo: js调用java后端提供的接口 描述:springboot提供接口,ajax调用调用接口,html显示

daxiandan的博客 8175

杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)

使用keycloak实现SSO单点登录(概念、原理、逻辑、详细步骤、难点解释)

野生猿林仔的博客 2万+

WGS-84 ECEF ENU 坐标系学习记录

地球坐标系固定在地球上而随地球一起在空间做公转和自转运动,因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化。地心地固直角坐标系和大地坐标系都属于这种坐标系。 一、 几种坐标系 地心地固直角坐标系(ECEF)坐标系 其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿...

YYshuangshuang的博客 1万+

Java接口练习

文章目录题目代码 题目 定义一个接口,其中包含一个 display ( )方法用于显示信息:通知类、汽车类、广告类均要实现该接口,以显示“通知内容”、“汽车油量”、“广告消息”。试编程实现并测试类的设计。创建的对象用接口引用,并通过接口引用变量执行 display ( )方法。 代码 public class Port {     public static void main(String[] a

qq_50589028的博客 1037

探索实时交互的艺术:websocket-demo前后端交互实例代码

探索实时交互的艺术:websocket-demo前后端交互实例代码 去发现同类优质开源项目:https://gitcode.com/ 在互联网技术飞速发展的今天,前后端的实时交互成为了构建现代Web应用的核心需求。WebSocket作为一种先进的网络通信协议,能够实现服务器与客户端之间的全双工通信,大大增强了用户体验。今天,我将为您详细介绍一个优秀的开源项目——websocket-demo前后端交...

gitblog_06756的博客 446

设置Solidworks导出文件的坐标系,stl坐标系平移

使用solidworks输出的模型坐标不再原点,怎么平行坐标系,这个方法很简单

weixin_45650767的博客 1万+

计算机网络基础:认识网络硬件与传输介质

计算机网络基础:认识网络硬件与传输介质,在计算机网络的庞大体系中,网络硬件与传输介质犹如坚实的骨架与脉络,支撑并承载着信息的流动。从家庭中的小型网络,到企业复杂的办公网络,再到覆盖全球的互联网,各类网络硬件设备各司其职,不同的传输介质发挥着独特的传输作用。它们相互协作,使得数据能够在不同设备之间快速、准确地传输,为人们的日常沟通、工作办公、娱乐休闲等活动提供了基础保障。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

适合新手拿来练习的springboot+vue前后端分离小Demo

神的孩子在歌唱

智的博客 6998

Qt Quick/QML入门到精通_专栏demo对应文章目录(目前50个左右demo/长期更新)

自定义图标下拉列表框的效果如下所示:自定义三态按钮的效果如下所示:传送门:53.qt quick-自定义三态按钮、自定义图标下拉列表框_诺谦的博客-优快云博客传送门:59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式_诺谦的博客-优快云博客63.qt quick-QML侧边滑动栏(不需要任何图片资源,支持自定义左右方向和大小)_诺谦的博客-优快云博客_qt实现好看侧边栏。...

抵抗时间扭曲,坚持做一件有意义的事 2万+

flask实现一个简单的前后端交互功能

总共写了4个文件: 一个主程序demo.py 一写测试数据脚本(直接在终端执行添加测试数据) 一个用来添加数据html文件,login.html 一个用来展示数据的html文件,index.html 写的很low的,临时写的,还有很多不用要的,比如manager,已开始写上去准备命令执行已有数据库的迁移,但是从新创建了一个模型类做简单的操作所以用不到,可以删掉的。而且什么验证都没做,添加...

Best_fish的博客 1万+

数据资产可视化分析:PowerBI在大数据管理中的实战

目的:帮你搞懂“为什么数据资产需要可视化?”“PowerBI能帮企业解决什么问题?”,并掌握用PowerBI做大数据可视化的实战技巧。范围:覆盖数据资产定义、可视化分析原理、PowerBI核心功能(数据连接、建模、可视化)、零售企业实战案例,以及未来趋势与挑战。背景:为什么企业的数据像乱堆的玩具?核心概念:数据资产、可视化分析、PowerBI分别是什么?它们怎么配合?实战步骤:用PowerBI帮零售企业整理“销售玩具箱”,做出能指导决策的仪表盘;应用场景:不同部门怎么用这个“整理好的玩具箱”?

2501_92132293的博客 906

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SSM前后端交互 demo

刚刚开始学习SSM框架,看着各式各样的书,听着大佬们录的视频,觉得很简单。但是亲自实践之后,就不会这么觉得了。 从github上拉一个项目下来,一个个花里胡哨,SSM框架结构各式各样 ...

Designer 小郑的技术博客 2058

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HTML+PHP实现前后端交互(新手篇)教程资源

HTML+PHP实现前后端交互(新手篇)教程资源 去发现同类优质开源项目:https://gitcode.com/ 简介 本教程资源包含了一个简单的前后端交互小demo,旨在帮助新手快速理解和掌握HTML与PHP的结合使用,实现基础的数据交互功能。本资源适合对网页开发感兴趣的初学者,通过动手实践来加深对前后端技术的理解。 内容概述 HTML基础:构建网页前端界面,展示基本的标签使用和表单创建。 ...

gitblog_06730的博客 664

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

springboot+mybatis+thymeleaf项目搭建及前后端交互

springboot+mybatis+thymeleaf项目搭建及前后端交互 前言 spring boot简化了spring的开发, 开发人员在开发过程中省去了大量的配置, 方便开发人员后期维护. 使用spring boot可以快速的开发出restful风格微服务架构. 本文将详细的介绍如何搭建一套spring boot 项目, 实现前后端交互. 开发工具 : IDEA , jdk 8 , mysql 开发完成后目录截图 : 一. 新建项目 file-new-project-Spring Initia

LDS666win的博客 2154

SSM--前后端交互

一.脚手架安装 1.1安装 vue安装 1.2导入项目 说明: 前端的完整项目在码云资源文件中. 用户将资源下载到本地 通过vue-cli客户端导入即可. 路径说明 挑选路径 点击导入即可 运行项目效果如图 二. MybatisPlus 学习 2.1 MP入门案例 package com.jt; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.core.conditions

望山。 6199

【Spring MVC】学会这些你就会利用Spring Boot进行前后端交互了,美滋滋,距离编程世界更近一步了,何乐而不为呢 ? ? ?

【Spring MVC】学会这些你就会利用Spring Boot进行前后端交互了,美滋滋,距离编程世界更近一步了,何乐而不为呢 ? ? ?

程序员良辰 1829

基于http协议使用protobuf进行前后端交互

protobuf介绍 由于网上关于protobuf的交互的资料比较零散,所以自己整理了一下关于protobuf前后端交互的资料,以作参考。 Google Protocol Buffers 简称 Protobuf,它提供了一种灵活、高效、自动序列化结构数据的机制,可以联想 XML,但是比 XML 更小、更快、更简单。仅需要自定义一次你所需的...

weixin_34306446的博客 693

vue ¥ajax,vue ajax前后端交互demo

最近在看vue项目,记录一下一个简单的前后端交互例子前端html页面vue和jquery异步获取数据对比{{ posts.category }}{{ item.title }}{{ item.author }}// ajax 获取数据var vm2=new Vue({el: '.vue_ajax',data: {posts:{}},// 页面加载的时候会自动执行mountedmounted: fu...

weixin_34476045的博客 435

Vue - 前后端交互

1. 前后端交互模式 1.1 接口调用方式 原生Ajax 基于JQuery的Ajax fetch axios 1.2 URL地址 1.2.1 传统形式的URL 格式:schema://host:post/path?query#fragment schema:协议 host:域名或IP地址 port:端口,http默认端口80,可省略 path:路径 query:查询参数 fragment:锚点(哈希Hash),用于定位页面的某个位置 1.2.2 restful形式的URL HTTP请求方式

友人A的博客 1762

5分钟搭建websocket前后端交互原型

原型开发最怕环境配置,平台预置的运行环境节省大量时间- 实时预览对前端调试特别友好,改代码立刻见效果- websocket服务保持长期运行,完美匹配平台部署能力整个过程就像拼积木一样顺畅,尤其适合需要快速验证技术方案的场景。推荐试试。

SapphireOwl29的博客 289
上一篇: vue与Ajax
下一篇: 组件化--路由--重定向/转发--跨域问题
希望不要秃头的0.0
博客等级 码龄6年 64粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值