宿舍管理系统代码详解(操作界面)

       

目录

一、前端代码

1.样式展示

2.代码详解

<1>主页面列表部分

(1)template部分

(2)script部分

<2>新增页面

(1)template部分

(2)script部分

<3>修改页面

二、后端代码

(1)Servlet层

1.doGet方法

2.doPost方法

3.doGet中的方法

<1>查询学生列表

<2>查询专业列表 

 <3>删除学生

<4>查找所需内容 

(2)model层

(3)Dao层

1.查询学生列表

2.查询专业列表

3.删除学生

4.新增学生

5.查询所需的学生信息

6.修改学生


        在此系统中,操作界面大致相同,本篇将以学生管理的操作页面为例进行代码详解,在其他不同的操作页面有不同的情况下也会进行详解。

一、前端代码

1.样式展示

2.代码详解

<1>主页面列表部分

(1)template部分
<template><el-card class="box-card"><!-- 卡片 --><div slot="header" class="clearfix"><span>学生列表</span><el-button style="float: right; padding: 3px 0" type="text" @click="openDialog()">新增<i class="el-icon-circle-plus-outline el-icon--right"></i></el-button></div><el-table :data="tableList" border :stripe="true" style="width: 100%"><!-- stripe:斑马纹 --><el-table-column type="index" label="序号" width="60" align="center"></el-table-column><el-table-column prop="num" label="学号" width="100" sortablealign="center"></el-table-column><!-- sortable排序 --><el-table-column prop="name" label="姓名" width="100" align="center"></el-table-column><el-table-column prop="gender" label="性别" width="50" align="center":resizable="false"></el-table-column><!-- resizable禁止拖拽 --><el-table-column prop="birthday" label="生日" align="center"></el-table-column><el-table-column prop="phone" label="电话" align="center"></el-table-column><el-table-column prop="mname" label="专业" align="center"></el-table-column><el-table-column prop="account" label="操作人" align="center"></el-table-column><el-table-column prop="operTime" label="操作时间" align="center" sortable></el-table-column><el-table-column label="操作" align="center"><template slot-scope="scope"><el-button size="mini" @click="openUpdateDialog(scope.row.id)">编辑</el-button><!-- scope.row获取到你所点击的那一行的数据 --><el-button size="mini" type="danger" @click="deletestudent(scope.row.id)">删除</el-button></template></el-table-column></el-table><add ref="add"></add><!-- 使用组件 --><update ref="update"></update></el-card>
</template>

        利用element-UI组件中的布局进行修改,已达到目的要求样式

        注意最后的部分是用来调用新增,修改的组件的

(2)script部分
<script>/* 导入其他组件 */import add from "./add.vue";import update from "./update.vue";export default {components: { //注册组件add,update},data() {return {tableList: []}},methods: {openDialog() {//在父组件操作子组件this.$refs.add.dialogVisible = true;},openUpdateDialog(id){this.$refs.update.dialogVisible = true;this.$refs.update.findStudentById(id);},deletestudent(id) {this.$confirm('您确定要删除吗?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {//向后端发送请求,并返回id到后端this.$http.get("/api/student?mark=deletestudent&id=" + id).then((resp) => {if (resp.data.code == 200) {this.$message({type: 'success',message: '删除成功!'});this.$router.go(0);}})})}},mounted() {//打开组件后自动向后端发送一个查询学生列表的请求this.$http.get("api/student?mark=studentlist").then((resp) => {if (resp.data.code == 200) {//接收后端响应的数据this.tableList = resp.data.result;//把学生信息显示到数据表格中}})}}
</script>

       1. 在进行增加和修改的操作时,会弹出一个窗口来进行操作,我们将这部分的代码重新放在一个vue中调用来使用。

        正常的调用其他vue需要重新打开一个新窗口,而此方法可以在原本的额网页基础上弹出浮窗来显示vue中的内容。

        用import...from...来进行调用,并在temp中进行调用

<add ref="add"></add>
<update ref="update"></update>	import add from "./add.vue";
import update from "./update.vue";

        2.openDialog() 用来显示出弹窗,改变dialogVisible的boolean值来使得弹窗显示和消失(点击修改操作时类似)

        3.在进行删除操作时,我们需要获取到当前的id,以id来对数据库内的数据进行删除,而获取方法即:

scope.row.id

         在scope中获取点击的这一行(row)的id

        4.在进行删除操作时,要进行提示,确定用户是否要进行删除操作,删除成功后也要进行提示

deletestudent(id) {this.$confirm('您确定要删除吗?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {//向后端发送请求,并返回id到后端this.$http.get("/api/student?mark=deletestudent&id=" + id).then((resp) => {if (resp.data.code == 200) {this.$message({type: 'success',message: '删除成功!'});this.$router.go(0);}})})}

        this.$router.go(0)是为了关闭提示信息的。

''/api/student?mark=deletestudent&id=" + id

是用来与后端连接的,在后端中,给servlet中命名

@WebServlet(urlPatterns = "/api/student")

在前端需要后端的doget或dopost方法时,即可用/api/student来对后端进行连接

但是前端不止需要一个doget方法,所以还需要对每个不同的方法“起名”mark=deletestudent

后端在doget方法中接收不同的Mark,来执行不同的方法。

String mark = req.getParameter("mark");
if (mark.equals("studentlist")) {findStudents(req, resp);
}

而有些需要给后端传值,比如上面需要传id值进行查询,就在后面将id值传到后端&id=" + id

后端需要进行接收id,进行查询即可

String id = req.getParameter("id");

        5.mounted()是打开组件就进行的函数操作,将查询学生列表的函数放在其中进行查询,即可直接显示出学生列表

mounted() {//打开组件后自动向后端发送一个查询学生列表的请求this.$http.get("api/student?mark=studentlist").then((resp) => {if (resp.data.code == 200) {//接收后端响应的数据this.tableList = resp.data.result;//把学生信息显示到数据表格中}})}

<2>新增页面

(1)template部分
<template><!-- 新增代码内容是比较多的,建议抽取出来,定义到一个独立的vue文件中在列表组件中导入添加组件--><el-dialog title="新增学生" :visible.sync="dialogVisible" width="50%"><el-form ref="form" label-width="80px"><el-form-item label="学号"><el-input v-model="form.num"></el-input></el-form-item><el-form-item label="姓名"><el-input v-model="form.name"></el-input></el-form-item><el-form-item label="性别"><el-radio-group v-model="form.gender"><el-radio label="男"></el-radio><el-radio label="女"></el-radio></el-radio-group></el-form-item><el-form-item label="生日"><el-date-picker type="date" placeholder="选择日期" v-model="form.birthday" style="width: 100%;"value-format="yyyy-MM-dd" :picker-options="pickerOptions"></el-date-picker></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 label="专业"><el-select placeholder="请选择" v-model="form.majorid"><el-option v-for="major in majorlist" :key="major.id" :label="major.name" :value="major.id"></el-option></el-select></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="dialogVisible = false">取 消</el-button><el-button type="primary" @click="save()">保 存</el-button></span></el-dialog>
</template>

        利用elem-UI中的表单组件进行修改,添加所需元素。

(2)script部分
<script>export default {data() {return {pickerOptions: {disabledDate(time) {return time.getTime() > Date.now() - 8.64e6; //如果没有后面的-8.64e6就是不可以选择今天的}},dialogVisible: false,majorlist: [],form: {num: "",name: "",gender: "",birthday: "",phone: "",majorid: ""}}},methods: {save() {this.$http.post("api/student", jsonToString(this.form)).then((resp) => {if (resp.data.code == 200) {this.$message({message:resp.data.desc,type:'success'});this.dialogVisible = false;this.$router.go(0);}})}},mounted() {//向后端发送一个请求,查询专业信息this.$http.get("api/student?mark=majorlist").then((resp) => {if (resp.data.code == 200) {this.majorlist = resp.data.result;}})}}//将json对象序列化为 键=值&键=值function jsonToString(form) {var str = "";for (var s in form) {str += s + "=" + form[s] + "&";}return str.substring(0, str.length - 1);}
</script>

        1.pickerOptions中的disabledDate(time)是用来更改时间格式的,因为在后端查询出来的时间指的是从1979到现在的毫秒值,我们需要转换格式将其显示到前端上去。

        2.this.$http.post("api/student", jsonToString(this.form))调用的是后端的dopost方法,将form中的值传给后端进行保存。

        3.在新增中,我们需要知道所有专业信息,将专业信息放在下拉框中,才能新增学生信息时,给学生选定专业。所以我们需要查询专业信息,将查到的信息放在majorlist中,赋到专业下拉框中。

<3>修改页面

        修改页面与新增页面相同,不同的是需要在修改页面中把选中的那个学生的信息显示到修改页面当中,所以需要在点开页面时进行一次查询,将内容赋到页面上去

findStudentById(id){//向后端发送请求this.$http.get("api/student?mark=findstudent&id="+id).then((resp) => {if (resp.data.code == 200) {this.form=resp.data.result;}})}

        在学生列表(主页面)中,点击编辑按钮,调用openUpdateDialog(scope.row.id)函数,并将获取到的id传到findStudentById(id)中,在编辑页面进行执行,向后端传入id值,利用id查询学生信息,传回到前端中。

二、后端代码

(1)Servlet层

1.doGet方法

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("student doget");String mark = req.getParameter("mark");if (mark.equals("studentlist")) {findStudents(req, resp);}if (mark.equals("majorlist")) {findMajors(req, resp);}if(mark.equals("deletestudent")){deleteStudent(req,resp);}if(mark.equals("findstudent")){findStudent(req,resp);}}

        doget方法:因为前端传回来不同的doget请求,所以将给个请求分到不同的方法中,然后在doget中调用即可。

2.doPost方法

@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String id=req.getParameter("id");//新增时,请求中没有id,修改时请求中有idString num = req.getParameter("num");String name = req.getParameter("name");String gender = req.getParameter("gender");String birthday = req.getParameter("birthday");String phone = req.getParameter("phone");String address = req.getParameter("address");String majorid = req.getParameter("majorid");String token = req.getHeader("token");//操作人idDecodedJWT decodedJWT = JWTUtil.getTokenInfo(token);int adminid = decodedJWT.getClaim("id").asInt();//调用dao层,将接收到的数据保存到数据库StudentDao studentDao = new StudentDao();Result result;try {if(id==null){studentDao.insertStudent(num, name, gender, birthday, phone, address, majorid, adminid);}else{studentDao.updateStudent(id, name, gender, birthday, phone, address, majorid, adminid);}result = new Result(200, "保存成功", null);} catch (SQLException throwables) {throwables.printStackTrace();result = new Result<>(500, "保存失败", null);}//向前端作出响应resp.getWriter().print(new ObjectMapper().writeValueAsString(result));}

        doPost方法中,需要先接收前端传过来的数据(form中的数据),然后根据这些数据进行下一步的操作。

        前端向后端发送的doPost请求也有两种,一种是新增学生内容,将新增的内容传给后端,一种是修改内容,将修改后的内容传给后端。因为两种请求的区别在于有没有传给后端id值,所以只需要在doPost中判断是否接受了id值,来进行不同的方法。

        后端与数据库连接的部分在dao中,所以将方法放在dao中,在Servlet中调用dao中的方法。

3.doGet中的方法

<1>查询学生列表
/*查询学生列表*/public void findStudents(HttpServletRequest req, HttpServletResponse resp) throws IOException {StudentDao studentDao = new StudentDao();Result result;try {ArrayList<Student> students = studentDao.findStudents();result = new Result(200, "查询成功", students);} catch (SQLException throwables) {throwables.printStackTrace();result = new Result(500, "系统忙", null);}resp.getWriter().print(new ObjectMapper().writeValueAsString(result));}
<2>查询专业列表 
/*查询专业列表*/public void findMajors(HttpServletRequest req, HttpServletResponse resp) throws IOException {StudentDao studentDao = new StudentDao();Result result;try {ArrayList<Major> majors = studentDao.findMajors();result = new Result(200, "查询成功", majors);} catch (SQLException throwables) {throwables.printStackTrace();result = new Result(500, "系统忙", null);}resp.getWriter().print(new ObjectMapper().writeValueAsString(result));}
 <3>删除学生
/*删除学生*/public void deleteStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException {StudentDao studentDao = new StudentDao();Result result;try {String id = req.getParameter("id");studentDao.deleteStudent(id);result = new Result(200, "删除成功", null);} catch (SQLException throwables) {throwables.printStackTrace();result = new Result(500, "系统忙", null);}resp.getWriter().print(new ObjectMapper().writeValueAsString(result));}
<4>查找所需内容 
private void findStudent(HttpServletRequest req, HttpServletResponse resp) throws IOException {StudentDao studentDao = new StudentDao();Result result;try {String id = req.getParameter("id");Student student=studentDao.findstudent(id);result = new Result(200, "查询1成功", student);} catch (SQLException throwables) {throwables.printStackTrace();result = new Result(500, "系统忙", null);}resp.getWriter().print(new ObjectMapper().writeValueAsString(result));}

(2)model层

        在model层中,需要将所需的数据都表示出来,封装到一个类中,方便后面的调用。

package com.ffyc.dormserver.model;import com.fasterxml.jackson.annotation.JsonFormat;import java.sql.Timestamp;
import java.util.Date;public class Student {private int id;private int num;private String name;private String gender;@JsonFormat(pattern ="yyy-MM-dd",timezone = "GMT+8")//后端把对象转为json时,把日期格式化private Date birthday;private String phone;private String mname;private String address;private int majorid;private String account;@JsonFormat(pattern ="yyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date operTime;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getMname() {return mname;}public void setMname(String mname) {this.mname = mname;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public Date getOperTime() {return operTime;}public void setOperTime(Date operTime) {this.operTime = operTime;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public int getMajorid() {return majorid;}public void setMajorid(int majorid) {this.majorid = majorid;}
}

(3)Dao层

        Dao层就是后端与数据库进行连接的地方,所有SQL语句都在这里面

1.查询学生列表

public ArrayList<Student> findStudents() throws SQLException {ArrayList<Student> students = new ArrayList<>();PreparedStatement ps = null;Connection connection = null;try {connection = JDBCUtil.GetConnection();ps = connection.prepareStatement("SELECT\n" +"s.id,\n" +"s.num,\n" +"s.name,\n" +"s.gender,\n" +"s.birthday,\n" +"s.phone,\n" +"m.name mname,\n" +"a.account,\n" +"s.oper_time\n" +"FROM student s LEFT JOIN major m ON s.majorid=m.id\n" +"LEFT JOIN admin a ON s.adminid=a.id");ResultSet rs = ps.executeQuery();while (rs.next()) {Student student = new Student();student.setId(rs.getInt("id"));student.setNum(rs.getInt("num"));student.setName(rs.getString("name"));student.setGender(rs.getString("gender"));student.setBirthday(rs.getDate("birthday"));student.setPhone(rs.getString("phone"));student.setMname(rs.getString("mname"));student.setAccount(rs.getString("account"));student.setOperTime(rs.getTimestamp("oper_time"));students.add(student);}} finally {JDBCUtil.close(connection, ps);}return students;}

2.查询专业列表

public ArrayList<Major> findMajors() throws SQLException {ArrayList<Major> majors = new ArrayList<>();PreparedStatement ps = null;Connection connection = null;try {connection = JDBCUtil.GetConnection();ps = connection.prepareStatement("SELECT id,name FROM major");ResultSet rs = ps.executeQuery();while (rs.next()) {Major major = new Major();major.setId(rs.getInt("id"));major.setName(rs.getString("name"));majors.add(major);}} finally {JDBCUtil.close(connection, ps);}return majors;}

3.删除学生

public void deleteStudent(String id) throws SQLException {System.out.println("deletestudent");PreparedStatement ps = null;Connection connection = null;try {connection = JDBCUtil.GetConnection();ps = connection.prepareStatement("delete from student where id = ?");ps.setObject(1, id);ps.executeUpdate();} finally {JDBCUtil.close(connection, ps);}}

4.新增学生

public boolean insertStudent(String num, String name, String gender, String birthday, String phone, String address, String majorid, int adminid) throws SQLException {System.out.println("insertstudent");PreparedStatement ps = null;Connection connection = null;try {connection = JDBCUtil.GetConnection();ps = connection.prepareStatement("insert into student (num,name,gender,birthday,phone,address,majorid,adminid,oper_time)values(?,?,?,?,?,?,?,?,now())");ps.setObject(1, num);ps.setObject(2, name);ps.setObject(3, gender);ps.setObject(4, birthday);ps.setObject(5, phone);ps.setObject(6, address);ps.setObject(7, majorid);ps.setObject(8, adminid);ps.executeUpdate();} finally {JDBCUtil.close(connection, ps);}return true;}

5.查询所需的学生信息

public Student findstudent(String id) throws SQLException {PreparedStatement ps = null;Connection connection = null;Student student = new Student();try {connection = JDBCUtil.GetConnection();ps = connection.prepareStatement("SELECT\n" +"id,\n" +"num,\n" +"NAME,\n" +"gender,\n" +"birthday,\n" +"phone,\n" +"address,\n" +"majorid\n" +"FROM 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.setBirthday(rs.getDate("birthday"));student.setPhone(rs.getString("phone"));student.setAddress(rs.getString("address"));student.setMajorid(rs.getInt("majorid"));}} finally {JDBCUtil.close(connection, ps);}return student;}

6.修改学生

 public void updateStudent(String id, String name, String gender, String birthday, String phone, String address, String majorid, int adminid) throws SQLException {System.out.println("insertstudent");PreparedStatement ps = null;Connection connection = null;try {connection = JDBCUtil.GetConnection();ps = connection.prepareStatement("UPDATE student set NAME=?,gender=?,birthday=?,phone=?,address=?,majorid=?,adminid=?,oper_time=NOW() WHERE id=?\n");ps.setObject(1, name);ps.setObject(2, gender);ps.setObject(3, birthday);ps.setObject(4, phone);ps.setObject(5, address);ps.setObject(6, majorid);ps.setObject(7, adminid);ps.setObject(8, id);ps.executeUpdate();} finally {JDBCUtil.close(connection, ps);}}

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

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

相关文章

NXP i.MX8系列平台开发讲解 - 3.13 Linux 之Audio子系统(二)

专栏文章目录传送门&#xff1a;返回专栏目录 目录 1. Linux ALSA 内核框架 2. Linux ALSA 代码分析 2.1 声卡驱动初始化 2.2 声卡创建注册 2.3 PCM设备创建 3. ALSA ASoC 3.1 Machine 3.2 Platform 3.3 Codec 上一章节&#xff0c;对于Linux Audio子系统有了大概的了解…

LabVIEW通过以太网控制PLC程序开发

在使用LabVIEW通过以太网控制PLC程序开发时&#xff0c;需要综合考虑硬件、软件和通信协议的协调工作。以下是详细步骤、注意事项、重点和难点分析&#xff0c;以及几种实现方式及其特点的概述。 实现步骤 确定硬件和软件环境&#xff1a; 确定PLC型号和品牌&#xff08;如西门…

WebGL技术在工程控制中的应用

WebGL技术在工程控制中的应用非常广泛&#xff0c;它利用了浏览器内的强大图形处理能力&#xff0c;可以为工程领域提供实时的三维可视化和交互功能。以下是WebGL在工程控制中的几个主要应用领域及其具体应用。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

【Qt 学习笔记】Qt窗口 | Qt窗口介绍 | QMainwindow类及各组件介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | Qt窗口介绍 | QMainwindow类及各组件介绍 文章编号&#xff…

力扣63 不同路径Ⅱ Java版本

文章目录 题目描述代码 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格…

粤嵌—2024/5/28—最大正方形(✔)

代码实现&#xff1a; 方法一&#xff1a;模拟——超时 int maximalSquare(char **matrix, int matrixSize, int *matrixColSize) {int maxSide 0;if (matrix NULL || matrixColSize NULL || matrixSize < 0 || matrixColSize[0] < 0) {return 0;}for (int i 0; i &l…

【每日一坑】KiCAD 覆铜区域约束

【每日一坑】 1.螺丝孔周围不想要要铜皮&#xff1b; 2、首先在CTRLshiftK;画一个区域&#xff0c;比如铺一个GND; 3、选择CUTOUT; 4、画线&#xff0c;画好闭合图形&#xff1b;如下图 5、就是这样了&#xff0c;就是还没有画圆或者异形的&#xff1b;

linux安装Java报错cannot execute binary file: Exec format error

uname -a 查看自己jdk版本 下载JDK路径Java Archive Downloads - Java SE 17 下载对应的版本jdk jdk-17.0.10_linux-aarch64_bin.tar.gz jdk-17.0.10_linux-x64_bin.tar.gz

吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.8-3.9

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周&#xff1a; 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架&#xff08;Hyperparameter …

【Python】 删除列表元素的简单方法

基本原理 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种非常灵活的数据结构&#xff0c;它允许我们存储一系列的元素。有时&#xff0c;我们需要根据元素的值来删除列表中的特定元素。虽然Python没有内置的函数直接通过值来删除列表中的元素&#xff0c;但我…

01 一文理解,Prometheus详细介绍

01 一文理解&#xff0c;Prometheus详细介绍 介绍 大家好&#xff0c;我是秋意零。 Prometheus 是一个开源的系统监控和报警工具包&#xff0c;最初由SoundCloud开发&#xff0c;并在2012年作为开源项目发布。Prometheus 目前由Cloud Native Computing Foundation&#xff08…

Qt发生“无法消除重载函数歧义的问题”

当使用Qt5的信号与槽语法时&#xff0c;如果一个槽或信号被重载了&#xff08;即同一个函数名有不同的参数列表&#xff09;&#xff0c;编译器可能会因为不清楚应该连接哪个函数版本而报错。 为了解决这个问题&#xff0c;可以通过提供静态转型 (static_cast) 或者提供函数指针…

常见的螺纹防松措施有哪些?——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺纹连接作为机械工程中常见的连接方式&#xff0c;其稳定性和可靠性对于整个机械系统的正常运行至关重要。然而&#xff0c;由于振动、冲击、温度变化等因素的影响&#xff0c;螺纹连接往往会出现松动现象&#xff0c;…

【Mac】Ulysses for Mac(优秀的markdown写作软件) v34.3中文版安装教程

软件介绍 哪款markdown写作软件最好用&#xff1f;小编推荐您使用尤利西斯&#xff1a;Ulysses mac版&#xff01;这是mac上一款优秀的markdown写作工具。Ulysses mac版具备全新的Soulmen写作坏境&#xff0c;采用了革命性的功能增强&#xff0c;结合了最好的部分最小标记&…

DES加密算法笔记

【DES加密算法&#xff5c;密码学&#xff5c;信息安全】https://www.bilibili.com/video/BV1KQ4y127AT?vd_source7ad69e0c2be65c96d9584e19b0202113 根据此视频学习 DES是对称密码中的分组加密算法 (分组加密对应流加密算法) 流加密算法就是一个字节一个字节加密 分组加…

Day38 代码随想录打卡|二叉树篇---二叉树的最大深度

题目&#xff08;leecode T104&#xff09;&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 递归法&#xff1a; 递归法首先将根节点作为参数传入&#xff0c;随后每一轮传入当前节点的…

20道经典自动化测试面试题

概述 觉得自动化测试很难&#xff1f; 是的&#xff0c;它确实不简单。但是学会它&#xff0c;工资高啊&#xff01; 担心面试的时候被问到自动化测试&#xff1f; 嗯&#xff0c;你担心的没错&#xff01;确实会被经常问到&#xff01; 现在应聘软件测试工程师的岗位&…

Apache-Doris单机部署

参考&#xff1a; 快速体验 Apache Doris - Apache Doris 1、Apache Doris是一款 基于MPP架构的高性能、实时的分析型数据库&#xff0c;以高效、简单、统一的特点被人们所熟知&#xff0c;仅需 亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点…

C#开发上位机应用:基础与实践

C#是一种流行的面向对象编程语言&#xff0c;常用于Windows应用程序的开发。上位机应用是一种用于监控和控制设备或系统的应用程序&#xff0c;通常与下位机&#xff08;如传感器、执行器等&#xff09;进行通信。在本文中&#xff0c;我们将介绍C#开发上位机应用的基础知识和实…

适用于Android的最佳数据恢复软件

如果您的 Android 设备崩溃&#xff0c;您需要找到一种方法来取回您的数据。幸运的是&#xff0c;有许多数据恢复程序可以帮助您恢复丢失的文件。有些是免费的&#xff0c;而另一些则需要付费。这是适用于Android设备的最佳数据恢复软件列表。 什么是数据恢复软件&#xff1f; …