前后端分离项目之修改存储信息

news2024/11/25 21:11:49

本文章基于:前后端分离项目之登录页面(前后端请求、响应和连接数据库)_小俱的一步步的博客-CSDN博客 

目录

一、编辑者操作步骤

二、代码实现步骤


 

以下以存储学生信息为例

一、编辑者操作步骤

1.在前端“编辑”按钮,点击时弹出弹框,出现一个填有该行学生信息的表格。

 

2.修改当前学生信息,修改时,表格会有提示所填内容规范。修改内容不规范就不会保存。

3.点击保存,关闭编辑弹框,在学生列表中更新已出现的学生信息。 

二、代码实现步骤

1.弹出弹框,请求当前行的信息,响应在弹框中的表单中:

前端代码:

        由于弹框要在当前显示的组件中打开,需要编辑的组件导入当前组件,作为当前组件的子组件。

	import Add from './Add.vue';//添加组件也是当前studentList组件的子组件
	import Update from './Update.vue';//导入编辑的组件
	export default {
		components: { //注册主键
			Add,
			Update,
		},

         编辑按钮:

<el-button size="mini" @click="updateStudent(scope.row.id)">编辑</el-button>

         对应函数:将编辑组件可视并获取学生信息

updateStudent(id){
		this.$refs.update.dialogFormVisible = true;//将编辑组件可视
		this.$refs.update.getStudent(id);//获取学生信息				
}

         获取学生信息前端代码:

            getStudent(id) {
				this.$http.get("back/student?mark=getStudent&id=" + id).then((resp) => {
					if (resp.data.code == 200) {
						this.form.id = resp.data.data.id;
						this.form.num = resp.data.data.num;
						this.form.name = resp.data.data.name;
						this.form.gender = resp.data.data.gender;
						this.form.birthday = resp.data.data.birthday;
						this.form.phone = resp.data.data.phone;
						this.form.address = resp.data.data.address;
						this.form.majorid = resp.data.data.majorId;
					}
				});
			},

 后端代码:

    private void getStudentById(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        PrintWriter printWriter = resp.getWriter();
        CommonResult commonResult = null;
        try{
            String id= req.getParameter("id");
            StudentDao studentDao = new StudentDao();
            Student student =  studentDao.getStudentById(id);
            commonResult = new CommonResult(200,student,"成功");
        }catch (Exception e){
            e.printStackTrace();
            commonResult = new CommonResult(500,"系统忙");
        }
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(commonResult);
        printWriter.print(json);
    }

         StudentDao中从数据库中获取学习信息的方法:

 public Student getStudentById(String id) throws SQLException, ClassNotFoundException {
        Connection connection = null;
        PreparedStatement ps = null;
        Student student = new Student();
        try {
            connection = JDBCUtil.connestionJDBC();

            ps = connection.prepareStatement("SELECT\n" +
                    "  id,\n" +
                    "  num,\n" +
                    "  NAME,\n" +
                    "  gender,\n" +
                    "  birthday,\n" +
                    "  majorid,\n" +
                    "  phone,\n" +
                    "  address\n" +
                    "FROM\n" +
                    "  student WHERE id=?");
            ps.setObject(1, id);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                student.setId(rs.getInt("id"));
                student.setNum(rs.getInt("num"));
                student.setName(rs.getString("name"));
                student.setGender(rs.getString("gender"));
                student.setPhone(rs.getString("phone"));
                student.setBirthday(rs.getDate("birthday"));
                student.setMajorId(rs.getInt("majorid"));
                student.setAddress(rs.getString("address"));
            }
        } finally {
            JDBCUtil.close(connection,ps);
        }
        return student;
    }

 编辑组件代码:

<template>
	<el-dialog title="修改学生信息" :visible.sync="dialogFormVisible">
		<el-form :rules="rules" ref="ruleForm" :model="form" label-width="80px">
			<el-form-item label="学号" prop="num">
				<el-input v-model="form.num"></el-input>
			</el-form-item>
			<el-form-item label="姓名" prop="name">
				<el-input v-model="form.name"></el-input>
			</el-form-item>
			<el-form-item label="性别">
				<el-radio v-model="form.gender" label="男">男</el-radio>
				<el-radio v-model="form.gender" label="女">女</el-radio>
			</el-form-item>
			<el-form-item label="生日">
				<el-date-picker value-format="yyyy-MM-dd" v-model="form.birthday" type="date" placeholder="选择日期"
					:picker-options="pickerOptions0">
				</el-date-picker>
			</el-form-item>
			<el-form-item label="专业" prop="majorid">
				<el-select v-model="form.majorid" placeholder="请选择">
					<el-option v-for="item in majorList" :key="item.id" :label="item.name" :value="item.id">
					</el-option>
				</el-select>
			</el-form-item>
			<el-form-item label="手机">
				<el-input v-model="form.phone"></el-input>
			</el-form-item>
			<el-form-item label="地址">
				<el-input v-model="form.address"></el-input>
			</el-form-item>
			<el-form-item>
				<el-button type="primary" @click="save('ruleForm')">保存</el-button>
				<el-button @click="dialogFormVisible=false">取消</el-button>
			</el-form-item>
		</el-form>
	</el-dialog>
</template>

<script>
	export default {
		data() {
			return {
				dialogFormVisible: false,
				majorList: [],
				form: {
					id: "",
					num: "",
					name: "",
					gender: "男",
					birthday: "",
					phone: "",
					address: "",
					mark: "save",
					majorid: "",
				},
				rules: {
					num: [{
							required: true,
							message: '请输入学号',
							trigger: 'blur',
							},
						{
							min: 1,
							max: 15,
							message: '长度在 1 到 15 个字符',
							trigger: 'blur'
						}
					],
					name: [{
							required: true,
							message: '请输入姓名',
							trigger: 'blur'
						},
						{
							min: 2,
							max: 6,
							message: '长度在 2 到 6 个字符',
							trigger: 'blur'
						}
					],
					majorid: [{
						required: true,
						message: '请选择专业',
						trigger: 'blur'
					}],
				},
				pickerOptions0: {
					disabledDate(time) {
						return time.getTime() > Date.now() - 8.64e6
					}
				}
			}
		},
		methods: {
			getStudent(id) {
				this.$http.get("back/student?mark=getStudent&id=" + id).then((resp) => {
					if (resp.data.code == 200) {
						this.form.id = resp.data.data.id;
						this.form.num = resp.data.data.num;
						this.form.name = resp.data.data.name;
						this.form.gender = resp.data.data.gender;
						this.form.birthday = resp.data.data.birthday;
						this.form.phone = resp.data.data.phone;
						this.form.address = resp.data.data.address;
						this.form.majorid = resp.data.data.majorId;
					}
				});
			},
			save(formName) {

				this.$refs[formName].validate((valid) => {
					if (valid) {
						this.$http.post("back/student", jsonToString(this.form)).then((resp) => {
							if (resp.data.code == 200) {

								this.$message({
									message: resp.data.message,
									type: 'success'
								});

								this.dialogFormVisible = false; //关闭窗口
								this.$router.go(); //更新当前列表
							}
						})
					}
				});

			}
		},
		mounted() {
			this.$http.get("back/student?mark=majorList").then((resp) => {
				if (resp.data.code == 200) {
					this.majorList = resp.data.data;
				}
			})
		}
	}

	function jsonToString(jsonobj) {
		console.log(jsonobj);
		var str = "";
		for (var s in jsonobj) {
			str += s + "=" + jsonobj[s] + "&";
		}
		return str.substring(0, str.length - 1);
	}
</script>

<style>
</style>

2.双向绑定表单中的数据,将修改后的数据更新在数据库中。

 前端代码都在编辑组件中:

        保存按钮:

<el-button type="primary" @click="save('ruleForm')">保存</el-button>

        保存函数:

			save(formName) {

				this.$refs[formName].validate((valid) => {
					if (valid) {
						this.$http.post("back/student", jsonToString(this.form)).then((resp) => {
							if (resp.data.code == 200) {

								this.$message({
									message: resp.data.message,
									type: 'success'
								});

								this.dialogFormVisible = false; //关闭窗口
								this.$router.go(); //更新当前列表
							}
						})
					}
				});

			}

后端保存代码:由于在新增学生信息时也使用了改方法,编辑方法时将学生的id作为标识,因此下面判断了是否id为空,若不为空,将调用数据库修改的方法。

private void saveStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        PrintWriter printWriter = resp.getWriter();
        CommonResult commonResult = null;
        try {
            String id = req.getParameter("id");
            String num = req.getParameter("num");
            String name = req.getParameter("name");
            String gender = req.getParameter("gender");
            String birthday = req.getParameter("birthday");
            String majorid = req.getParameter("majorid");
            String phone = req.getParameter("phone");
            String address = req.getParameter("address");

            //需要从taken中获取当前登录人的id
            //获取请求头中的token
            String token = req.getHeader("adminToken");
            //解析token
            DecodedJWT tokenInfo = JWTUtil.getTokenInfo(token);
            //获取到token中管理员id
            Integer adminId = tokenInfo.getClaim("id").asInt();

            StudentDao studentDao = new StudentDao();

            if (id==null){
                studentDao.saveStudent(num,name,gender,birthday,majorid,phone,adminId,address);
            }else {
                studentDao.updateStudent(id,num,name,gender,birthday,majorid,phone,adminId,address);
            }

            commonResult = new CommonResult(200,null,"保存成功");
        }catch (Exception e){
            e.printStackTrace();
            commonResult = new CommonResult(500,"系统忙");
        }
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(commonResult);
        printWriter.print(json);
    }

 数据库修改信息方法:

    public void updateStudent(String id, String num, String name, String gender,
                              String birthday, String majorid, String phone, Integer adminId, String address) throws ClassNotFoundException, SQLException {
        Connection connection = null;
        PreparedStatement ps = null;
        try {
            connection = JDBCUtil.connestionJDBC();
            ps = connection.prepareStatement("UPDATE student SET num=?,NAME=?,gender=?,birthday=?,majorid=?,phone=?,address=?,adminid=?,oper_time=? WHERE id=?");
            ps.setObject(1, num);
            ps.setObject(2, name);
            ps.setObject(3, gender);
            ps.setObject(4, birthday);
            ps.setObject(5, majorid);
            ps.setObject(6, phone);
            ps.setObject(7, address);
            ps.setObject(8, adminId);
            ps.setObject(9, new Date());
            ps.setObject(10, id);
            ps.executeUpdate();
        } finally {
            JDBCUtil.close(connection,ps);
        }
    }

后端连接数据库的方法已经封装在JDBCUtil类中:

//封装jdbc
public class JDBCUtil {

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");//初始化驱动程序
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static Connection connestionJDBC() throws SQLException {
        String url = "jdbc:mysql://127.0.0.1:3306/web_db?serverTimezone=Asia/Shanghai";
        String uname = "root";
        String pwd = "123456";
        Connection connection = DriverManager.getConnection(url, uname, pwd);
        return connection;
    }
    public static void close(Connection connection,PreparedStatement ps) throws SQLException {
        if (connection != null) {
            connection.close();
        }
        if (ps != null) {
            ps.close();
        }
    }
}

3.刷新学生列表,将修改后的数据更新显示在前端。

 this.dialogFormVisible = false; //关闭窗口
 this.$router.go(); //更新当前列表

除此之外,删除和添加功能比编辑简单,可以仿照的写。

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

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

相关文章

某大厂测试开发面试总结,大家可以参考一下

目录 前言 1、RecyclerView和ListView的区别 2、技术选型的依据 3、原生monkey的原理 4、monkey和monkeyRunner区别 5、appium和uiautomator的关系或者Airtest和uiautomator的区别 6、Android进程间通信方式 7、内存溢出与内存泄露的区别及内存泄漏的原因 8、性能数据收…

mac版Excel表格中出现E+

相信很多人在使用Excel的时候都遇到过单元格变成###的情况&#xff0c;这是由于单元格列宽不够造成的&#xff0c;只需要增加列宽就可以正常显示。如果你在使用Excel的过程中遇到过出现"E"这种情况&#xff0c;此时不要惊慌&#xff0c;这是Excel自动对很大或很小的数…

C语言实现汉诺塔问题【图解和演示】

大家好&#xff0c;我是纪宁。 在高中时&#xff0c;曾有一位故友问过我类似这种移盘子的题目&#xff08;数列&#xff09;&#xff0c;我当时一脸茫然&#xff0c;上了大学才知道原来是著名的汉诺塔问题 本文&#xff0c;就将介绍汉诺问题的由来、原理、及C语言如何实现 目录…

ZooKeeper【实际案例】

服务器动态上下线监听 需求 在我们的分布式系统中&#xff0c;有多台服务器节点&#xff0c;我们希望任意一台客户端都能实时收到服务器节点的上下线。 实现 服务器节点上线以后自动去zookeeper目录注册自己的节点信息&#xff08;创建Znode临时节点&#xff09;&#xff0c…

无人机侦察区域覆盖

irvingvasquez/ocpp: Optimal coverage path planning (github.com) matlab2020可运行

MySQL数据表进阶操作

MySQL数据表高级操作 一、克隆表二、清空表三、创建临时表四、创建外键约束五、MySQL中6种常见的约束&#xff1a;六、数据库用户管理 一、克隆表 将数据表的数据记录生成到新的表中 被克隆的对象&#xff1a; 方法一&#xff1a; 第一步&#xff1a;create table 新表名 li…

2023年简历石沉大海,别投了,软件测试岗位饱和了....

各大互联网公司的接连裁员&#xff0c;政策限制的行业接连消失&#xff0c;让今年的求职雪上加霜&#xff0c;想躺平却没有资本&#xff0c;还有人说软件测试岗位饱和了&#xff0c;对此很多求职者深信不疑&#xff0c;因为投出去的简历回复的越来越少了。 另一面企业招人真的…

机器学习_预测概率校准

我们在建模时通常根据准确性或准确性来评估其预测模型&#xff0c;但几乎不会问自己&#xff1a;“我的模型能够预测实际概率吗&#xff1f;” 但是&#xff0c;从商业的角度来看&#xff0c;准确的概率估计是非常有价值的&#xff08;准确的概率估计有时甚至比好的精度更有价值…

Dao层、Service层、Entity层、Servlet层、Utils层

这几天在复习高数&#xff0c;还有刷题。 B&#xff1a; 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/S3imr G&#xff1a; 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/UVgfK Dao层是数据访问层Service层是业务逻辑层…

深度学习HashMap之手撕HashMap

认识哈希表 HashMap其实是数据结构中的哈希表在Java里的实现。 哈希表本质 哈希表也叫散列表&#xff0c;我们先来看看哈希表的定义&#xff1a; 哈希表是根据关键码的值而直接进行访问的数据结构。 简单说来说&#xff0c;哈希表由两个要素构成&#xff1a;桶数组和散列函数…

汽车电子Autosar之车载以太网

前言 近些年来&#xff0c;随着为了让汽车更加安全、智能、环保等&#xff0c;一系列的高级辅助驾驶功能喷涌而出。未来满足这些需求&#xff0c;就对传统的电子电器架构带来了严峻的考验&#xff0c;需要越来越多的电子部件参与信息交互&#xff0c;导致对网络传输速率&#x…

NR及LTE中的IQ数据与信息、比特率、码元、波特率之间的关系

信息与比特率 信息&#xff1a;对信源进行数字编码后的数据&#xff0c;基本单位是bit。 比特率&#xff1a;信息的速率称为比特率(bit/s、bps)&#xff0c;通常用Rb表示。 码元与波特率 码元 固定时长的信号波形(数字脉冲)&#xff0c;也称为一个符号&#xff0c;symb。 (…

LeetCode36. 有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; …

【极海APM32F4xx Tiny】学习笔记05-移植 RTT NANO工程

5.移植 RTT NANO工程 移植步骤&#xff1a; 1. mdk添加rtt nano 包文件 2. 添加源码 3. 屏蔽2个中断处理函数 4. 修改board.c文件 5. 添加控制台 6. 添加finsh组件 7. 编写测试工程 1. mdk添加rtt nano 包文件 也可以下载后手动安装 下载链接https://www.rt-thread.org/downl…

【openeuler】Yocto embedded sig联合例会 (2022-11-03)

Yocto &embedded sig联合例会 (2022-11-03)_哔哩哔哩_bilibili

从浏览器输入url到页面加载(六)前端必须了解的路由器和光纤小知识

前言 上一章我们说到了数据包在网线中的故事&#xff0c;说到了双绞线&#xff0c;还说到了麻花。这一章继续沿着这条线路往下走&#xff0c;说一些和cdn以及路由器相关&#xff0c;运营商以及光纤相关的小知识&#xff0c;前端同学应该了解一下的 目录 前言 1. CDN和路由器…

STM32-I2C通信在AT24C02的应用

AT24C02是一种失去电源供给后依旧能保持数据的储存器&#xff0c;常用来储存一些配置信息&#xff0c;在系统重新上电之后也可以加载。它的容量是2k bit的EEPROM存储器&#xff0c;采用I2C通信方式。 AT24C02支持两种写操作&#xff1a;字节写操作和页写操作。本实验中我们采用…

三十八、动态规划——背包问题( 01 背包 + 完全背包 + 多重背包 + 分组背包 + 优化)

动态规划-背包问题算法主要内容 一、基本思路1、背包问题概述2、动态规划&#xff08;DP&#xff09;问题分析 二、背包问题1、0 1 背包问题2、完全背包问题3、多重背包问题4、分组背包问题 三、例题题解 一、基本思路 1、背包问题概述 0 1 背包问题&#xff1a; 条件&#x…

前端解决按钮重复提交数据问题(节流和防抖)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到前端初见的博文&#xff0c;本文主要讲解在工作解决按钮重复提交数据问题&#xff08;节流和防抖&#xff09; &#x1f468;‍&#x1f527; 个人主页 : 前端初见 &#x1f9…

【redis】数据类型,持久化、事务和锁机制、Java和redis交互、使用redis缓存、三大缓存问题

文章目录 Redis数据库NoSQL概论Redis安装和部署基本操作数据操作 数据类型介绍HashListSet和SortedSet 持久化RDBAOF 事务和锁机制锁 使用Java与Redis交互基本操作SpringBoot整合Redis 使用Redis做缓存Mybatis二级缓存Token持久化存储 三大缓存问题缓存穿透缓存击穿缓存雪崩 Re…