python实现前后端学生管理系统(前后端不分离)

news2024/12/23 7:51:35

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:项目。

目录

  • 1、前言
  • 2、简述实现内容
    • 首页
    • 注册
    • 登录
    • 管理员
  • 3、详细代码
    • 3.1、项目目录
    • 3.2、templates
      • 3.2.1、testxzl01.html
      • 3.2.2、testxzl02.html
      • 3.2.3、testxzl03.html
      • 3.2.4、testxzl04.html
      • 3.2.5、testxzl05.html
      • 3.2.6、testxzl06.html
    • 3.3、sqlite.py
    • 3.4、xzl_flask.py

1、前言

本文介绍的是用python实现的前后端学生管理系统,前后端不分离,较为简单易上手。使用的技术点为:HTML+CSS+JavaScript+Flask+sqlite。
下面这个链接实现的是前后端分离的学生管理系统,前后端实现简单的解耦合。使用的技术点为:HTML+CSS+JavaScript+Flask+sqlite+Vue+Axios。
链接:python实现前后端学生管理系统(前后端分离)

2、简述实现内容

下面是关于实现的功能的总览:

首页

①管理系统的首页:(如有需求,可以自行使用前端框架美化)
  在这里插入图片描述

其中:
注册和登陆是链接:
  注册链接到注册功能页面
  登陆链接到登陆功能页面

注册

②注册
注册功能页面,注册功能页面自定义,需要包含如下注册信息并对输入内容进行校验:

注册信息验证规则
姓名姓名缩写,不能为空
学号数字类型,不能为空
学院不能为空
专业不能为空
班级不能为空
年龄17-22间的任意数字,数字类型,不能为空
电话数字类型,不能为空
Email邮件格式
用户名字母大小写、数字、下划线四种类型至少包含三种,字母开始,长度至少6位
密码字母大小写、数字、下划线四种类型至少包含三种,长度至少8位
确认密码重复密码

在这里插入图片描述
基本流程:验证成功后,这些注册信息都需要写入sqlite的数据库stu.db的students表中(该表需要先单独创建,字段为上面的注册信息,名字自定义,类型要满足需求,另外用户名设置为主键,这样表中的用户名取值就不能相同)。然后跳转到注册成功页面,该页面有返回首页链接。

登录

③登录
登陆功能页面,该页面需要输入用户名和密码,输入的用户名和密码与students表中已有记录进行比对,若用户名和对应密码在表中存在则跳转到登陆成功页面,否则提示用户名不存在或密码错误,不跳转。登陆成功页面直接以表格方式显示自己注册的所有信息,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

管理员

④管理员账号
创建一个admin表,字段包括管理员名和密码,自己通过sql语句插入三条记录,即创建三个管理员账号。
网站有个路径为/admin,供管理员账号登陆的页面:
在这里插入图片描述
登录之后展示全部信息:
在这里插入图片描述

3、详细代码

3.1、项目目录

在这里插入图片描述

3.2、templates

templates目录是模板目录,存放静态的html代码。

3.2.1、testxzl01.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xzl</title>
    <style>
    h1 {color:black}
    a:link {color:#9932CC;align-items:center}
    </style>
</head>
<body>
<br>
<h1 style="font-size:60px">欢迎访问本站</h1><br>
<h1>
<a href="{{url_for('new_student')}}" >注册</a><br><br>
<a href="{{url_for('enter')}}" >登录</a><br>
</h1>

</body>
</html>

3.2.2、testxzl02.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xzl</title>
    <style>
    </style>
</head>
<body>
<div style="text-align:center;">
    <h1>用户登录</h1><br>
    <form action="{{ url_for('check') }}" method="POST">
        用户名: <input type="text" name="user"><br><br>
        密码: <input type="password" name="pwd"><br><br>
        <input type="submit" value="登录" /><br>
        <h2>{{ msg }}</h2>
    </form>
    <a href="/" style="color:#3CBC8D;">返回首页</a>

</div>
</body>
</html>

3.2.3、testxzl03.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xzl</title>

</head>
<head>
    <script>
    var flag = false;
    function checkName() {
        var name = document.getElementById("name").value;
        if (name.length == 0 || name == null) {
            document.getElementById("name-error").innerHTML = "名字不能为空";
            flag = false;
        }else {
            document.getElementById("name-error").innerHTML = "";
            flag=true;
        }
    }
    function checkNumber() {
        var number = document.getElementById("number").value;
        if (number.length == 0 || number == null) {
            document.getElementById("number-error").innerHTML = "学号不能为空";
            flag = false;
        } else {
            var regex = /^\d+$/;
            if (!regex.test(number)) {
                document.getElementById("number-error").innerHTML = "学号必须是数字";
                flag = false;
            } else {
                document.getElementById("number-error").innerHTML = "";
                flag=true;
            }
        }
    }
    function checkAcademy() {
        var academy = document.getElementById("academy").value;
        if (academy.length == 0 || academy == null) {
            document.getElementById("academy-error").innerHTML = "学院不能为空";
            flag = false;
        } else {
            document.getElementById("academy-error").innerHTML = "";
            flag=true;
        }
    }
    function checkMajor() {
        var flag = false;
        var major = document.getElementById("major").value;
        if (major.length == 0 || major == null) {
            document.getElementById("major-error").innerHTML = "专业不能为空";
            flag = false;
        } else {
            document.getElementById("major-error").innerHTML = "";
            flag=true;
        }
    }
    function checkCLASS() {
        var classValue = document.getElementById("Class").value;
        if (classValue.length == 0 || classValue == null) {
            document.getElementById("Class-error").innerHTML = "班级不能为空";
            flag = false;
        } else {
            document.getElementById("Class-error").innerHTML = "";
            flag=true;
        }
    }
    function checkAge() {
        var age = document.getElementById("age").value;
        if (age.length == 0 || age == null) {
            document.getElementById("age-error").innerHTML = "年龄不能为空";
            flag = false;
        } else if (isNaN(age)) {
            document.getElementById("age-error").innerHTML = "年龄必须为数字";
            flag = false;
        } else if (age < 17 || age > 22) {
            document.getElementById("age-error").innerHTML = "年龄必须在17-22之间";
            flag = false;
        } else {
            document.getElementById("age-error").innerHTML = "";
            flag=true;
        }
    }
    function checkPhoneNumber() {
        var phoneNumber = document.getElementById("phone-number").value;
        if (phoneNumber.length == 0 || phoneNumber == null) {
            document.getElementById("phone-number-error").innerHTML = "电话号码不能为空";
            flag = false;
        } else if (isNaN(phoneNumber)) {
            document.getElementById("phone-number-error").innerHTML = "电话号码必须为数字";
            flag = false;
        } else {
            document.getElementById("phone-number-error").innerHTML = "";
            flag = true;
        }
    }
    function checkEmail() {
        var email = document.getElementById("email").value;
        if (email.length == 0 || email == null) {
            document.getElementById("email-error").innerHTML = "邮箱不能为空";
            flag = false;
        } else {
            var regex = /\S+@\S+\.\S+/;
            if (!regex.test(email)) {
                document.getElementById("email-error").innerHTML = "邮箱格式有误";
                flag = false;
            } else {
                document.getElementById("email-error").innerHTML = "";
                flag=true;
            }
        }
    }
    function checkUser() {
        var user = document.getElementById("user").value;
        if (user.length < 6) {
            document.getElementById("user-error").innerHTML = "用户名长度不能少于6位";
            flag = false;
        } else {
            var regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d|_)[a-zA-Z\d_]{6,}$/;
            if (!regex.test(user)) {
                document.getElementById("user-error").innerHTML = "用户名必须包含字母大小写、数字、下划线四种类型中的至少三种";
                flag = false;
            } else {
                document.getElementById("user-error").innerHTML = "";
                flag=true;
            }
        }
    }
    function checkPassword() {
        var password = document.getElementById("password").value;
        if (password.length < 8) {
            document.getElementById("password-error").innerHTML = "密码长度不能少于8个字符";
            flag = false;
        } else {
            var regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d|_)[a-zA-Z\d_]{8,}$/;
            if (!regex.test(password)) {
                document.getElementById("password-error").innerHTML = "密码必须包含字母大小写、数字、下划线四种类型中的至少三种";
                flag = false;
            } else {
                document.getElementById("password-error").innerHTML = "";
                flag = true;
            }
        }
    }
    function checkSurePassword() {
        var password1 = document.getElementById("password").value;
        var password2 = document.getElementById("surePassword").value;
        if(password1!=password2){
            document.getElementById("surePassword-error").innerHTML = "两次密码不一致";
            flag = false;
        }else {
            document.getElementById("surePassword-error").innerHTML = "";
            flag=true;
        }
    }

    function checkForm() {
        var nameValid = checkName();
        var numberValid = checkNumber();
        var academyValid = checkAcademy();
        var majorValid = checkMajor();
        var classValid = checkCLASS();
        var ageValid = checkAge();
        var phoneNumberValid = checkPhoneNumber();
        var emailValid = checkEmail();
        var userValid = checkUser();
        var passwordValid = checkPassword();
        var surePasswordValid = checkSurePassword();
        if(flag){
            alert("提交成功")
            return true;
        }else{
            alert("提交失败")
            return false;
        }
    }
    </script>
</head>
<body>
<h1>欢迎注册</h1>
<form action="{{ url_for('addrec') }}" method="POST" \
      name="myform" onsubmit="return validateForm()">
    <h3>请填写你的信息</h3>
    <h4>
    姓名: <input type="text" name="name" id="name" onblur="checkName()">
    <span id="name-error" style="color: red;"></span><br>
    学号: <input type="text" name="num" id="number" onblur="checkNumber()">
    <span id="number-error" style="color: red;"></span><br>
    学院: <input type="text" name="academy" id="academy" onblur="checkAcademy()">
    <span id="academy-error" style="color: red;"></span><br>
    专业: <input type="text" name="major" id="major" onblur="checkMajor()">
    <span id="major-error" style="color: red;"></span><br>

    班级: <input type="text" name="Class" id="Class" onblur="checkCLASS()">
    <span id="Class-error" style="color: red;"></span><br>

    年龄: <input type="text" name="age" id="age" onblur="checkAge()">
    <span id="age-error" style="color: red;"></span><br>
    电话: <input type="text" name="phone" id="phone-number" onblur="checkPhoneNumber()">

    <span id="phone-number-error" style="color: red;"></span><br>
    Email: <input type="text" name="email" id="email" onblur="checkEmail()">
    <span id="email-error" style="color: red;"></span><br>
    用户名: <input type="text" name="user" id="user" onblur="checkUser()">
    <span id="user-error" style="color: red;"></span><br>
    密码: <input type="password" name="pwd" id="password" onblur="checkPassword()">
    <span id="password-error" style="color: red;"></span><br>
    确认密码: <input type="password" name="repwd" id="surePassword" onblur="checkSurePassword()">
    <span id="surePassword-error" style="color: red;"></span><br>
    </h4>
    <input type="submit" value="提交" onclick="return checkForm()" id="submit"/>
    <span id="checkForm-error" style="color: red;"></span><br>
    <h3><a href="/" style="color:#3CBC8D;">返回首页</a></h3>
</form>
</body>
</html>

3.2.4、testxzl04.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xzl</title>
    <style>
        #customers
        {
            width:88%;
            border-collapse:collapse;
            margin: auto;
        }
        th {
            width:200px;
            font-size: 1.1em;
            text-align: left;
            padding-top: 5px;
            padding-bottom: 4px;
            background-color: blue;
            color: #ffffff;
            white-space: nowrap;
        }
        td
        {
            border:1px solid #98bf21;
        }

    </style>
</head>
<body>
<div style="text-align:center;">
    <h1>学生信息表</h1><br>
    <table id="customers">
        <thead>
        <th>name</th>
        <th>num</th>
        <th>academy</th>
        <th>major</th>
        <th>Class</th>
        <th>age</th>
        <th>phone</th>
        <th>email</th>
        <th>user</th>
        </thead>

        {% for row in rows %}
        <tr>
            <td>{{row["name"]}}</td>
            <td>{{row["num"]}}</td>
            <td>{{row["academy"]}}</td>
            <td>{{row["major"]}}</td>
            <td>{{row["Class"]}}</td>
            <td>{{row["age"]}}</td>
            <td>{{row["phone"]}}</td>
            <td>{{row["email"]}}</td>
            <td>{{row["user"]}}</td>
        </tr>
        {% endfor %}
    </table>
    <br>
    <a href="/" style="color:#3CBC8D;">返回首页</a>
</div>

</body>
</html>

3.2.5、testxzl05.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xzl</title>

</head>
<body>
<div style="text-align:center;">
    <h1>管理员登录</h1><br>
    <form action="{{ url_for('checkAdmin') }}" method="POST">
        用户名: <input type="text" name="user"><br><br>
        密码: <input type="password" name="pwd"><br><br>
        <input type="submit" value="登录" /><br>
        <h2>{{ msg }}</h2>
    </form>
    <a href="/" style="color:#3CBC8D;">返回首页</a>

</div>
</body>
</html>

3.2.6、testxzl06.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xzl</title>
    <style>
        #customers
        {
            width:98%;
            border-collapse:collapse;
            margin: auto;
        }
        th {
            width:200px;
            font-size: 1.1em;
            text-align: left;
            padding-top: 5px;
            padding-bottom: 4px;
            background-color: #ADD8E6;
            color: #ffffff;
            white-space: nowrap;
        }
        td
        {
            border:1px solid #98bf21;
        }

    </style>
</head>
<body>
<div style="text-align:center;">
    <h1>管理员权限:学生信息表</h1><br>
    <table id="customers">
        <thead>
        <th>姓名</th>
        <th>学号</th>
        <th>学院</th>
        <th>专业</th>
        <th>班级</th>
        <th>年龄</th>
        <th>电话</th>
        <th>邮箱</th>
        <th>用户名</th>
        <th>密码</th>
        <th>delete</th>
        </thead>

        {% for row in rows %}
        <tr>
            <td>{{row["name"]}}</td>
            <td>{{row["num"]}}</td>
            <td>{{row["academy"]}}</td>
            <td>{{row["major"]}}</td>
            <td>{{row["Class"]}}</td>
            <td>{{row["age"]}}</td>
            <td>{{row["phone"]}}</td>
            <td>{{row["email"]}}</td>
            <td>{{row["user"]}}</td>
            <td>{{row["pwd"]}}</td>
            <td><a href="{{ url_for('delete',user=row['user']) }}">删除</a></td>
        </tr>
        {% endfor %}
    </table>
    <br>
    <a href="/" style="color:#3CBC8D;">返回首页</a>
</div>

</body>
</html>

3.3、sqlite.py

sqlite.py文件的代码是用来生成数据库表单和管理员账号密码的:

import sqlite3 as sql
conn=sql.connect('database.db')
print("opened database successfully")

conn.execute('CREATE TABLE students(name TEXT,\
                                    num INT,\
                                    academy TEXT,\
                                    major TEXT,\
                                    Class TEXT,\
                                    age INT,\
                                    phone INT,\
                                    email TEXT,\
                                    user TEXT PRIMARY KEY,\
                                    pwd TEXT)')
conn.execute('CREATE TABLE admins(admin TEXT PRIMARY KEY,pwd TEXT)')
cur=conn.cursor()
cur.execute("INSERT INTO admins (admin,pwd) VALUES('xzl1','xzl1')")
cur.execute("INSERT INTO admins (admin,pwd) VALUES('xzl2','xzl2')")
cur.execute("INSERT INTO admins (admin,pwd) VALUES('xzl3','xzl3')")
conn.commit()
print("Table created successfully")
conn.close()

运行成功之后,会在代码文件的同目录下生成database.db数据库文件:
在这里插入图片描述

3.4、xzl_flask.py

这个是该项目的后端服务器代码,基于flask实现。类似于Java的注解web开发。

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/6/19 9:25
from flask import Flask,render_template,request,redirect,url_for
import sqlite3 as sql
app = Flask(__name__)
@app.route('/')
def home():
    return render_template('testxzl01.html')

@app.route('/newStudent')
def new_student():
    return render_template('testxzl03.html')

@app.route('/enter')
def enter():
    return render_template('testxzl02.html')

@app.route('/check',methods=['POST'])
def check():
    if request.method =='POST':
        user = request.form['user']
        pwd = request.form['pwd']
        with sql.connect("database.db") as con:
            cur = con.cursor()
            cur.execute('select pwd from students where user=(?)',(user,))
            psw=cur.fetchall()
            print("psw:",psw)
            if not psw:
                msg="用户名错误"
                print(msg)
                return render_template("testxzl02.html",msg=msg)
            elif psw[0][0] == pwd:
                msg="登录成功"
                print(msg)
                return redirect(url_for('List',user=user))
            else:
                msg="密码错误"
                print(msg)
                return render_template("testxzl02.html",msg=msg)

@app.route('/addrec',methods=['POST'])
def addrec():
    if request.method =='POST':
        try:
            name=request.form['name']
            num=request.form['num']
            academy=request.form['academy']
            major=request.form['major']
            Class = request.form['Class']
            age = request.form['age']
            phone = request.form['phone']
            email = request.form['email']
            user = request.form['user']
            pwd = request.form['pwd']
            with sql.connect("database.db") as con:
                cur = con.cursor()
                cur.execute("INSERT INTO students (name,num,academy,major,Class,age,phone,email,user,pwd)\
                            VALUES(?,?,?,?,?,?,?,?,?,?)",(name,num,academy,major,Class,age,phone,email,user,pwd) )
                con.commit()
                msg1="增加记录成功"
                msg2=""
        except:
            con.rollback()
            msg1="增加记录失败"
            msg2="可能原因为用户名重复"
        finally:
            con.close()
            return render_template("testxzl01.html",msg1=msg1,msg2=msg2)


@app.route('/List/<user>')
def List(user):
    con =sql.connect("database.db")
    con.row_factory=sql.Row
    cur=con.cursor()
    cur.execute('select name,num,academy,major,Class,age,phone,email,user,pwd from students where user=(?)',(user,))
    rows=cur.fetchall()
    return render_template("testxzl04.html",rows=rows)

@app.route('/listAdmin')
def listAdmin():
    con =sql.connect("database.db")
    con.row_factory=sql.Row
    cur=con.cursor()
    cur.execute('select name,num,academy,major,Class,age,phone,email,user,pwd from students ')
    rows=cur.fetchall()
    return render_template("testxzl06.html",rows=rows)

@app.route('/delete/<user>')
def delete(user):
    try:
        with sql.connect("database.db") as con:
            cur=con.cursor()
            cur.execute('delete from students where user=(?)',(user,))
            con.commit()
            print("删除记录成功")
            msg="删除记录成功"
            return redirect(url_for('listAdmin',msg=msg))
    except:
        con.rollback()
        print("删除记录失败")
        msg="删除记录失败"
        return redirect(url_for('listAdmin',msg=msg))
    finally:
        con.close()

@app.route('/admin')
def admin():
    return render_template('testxzl05.html')

@app.route('/checkAdmin',methods=['POST'])
def checkAdmin():
    if request.method =='POST':
        user = request.form['user']
        pwd = request.form['pwd']
        with sql.connect("database.db") as con:
            cur = con.cursor()
            cur.execute('select pwd from admins where admin=(?)',(user,))
            psw=cur.fetchall()
            print("psw:",psw)
            if not psw:
                msg="管理员用户名错误"
                print(msg)
                return render_template("testxzl05.html",msg=msg)
            elif psw[0][0] == pwd:
                msg="登录成功"
                print(msg)
                return redirect(url_for('listAdmin'))
            else:
                msg="管理员密码错误"
                print(msg)
                return render_template("testxzl05.html",msg=msg)
if __name__=='__main__':
    app.run(debug=True)

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

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

相关文章

赛效:如何在线转换图片格式

1&#xff1a;点击左侧菜单栏里的“格式转换”&#xff0c;然后在转换格式菜单栏里点击上传按钮。 2&#xff1a;选择下方输出格式&#xff0c;点击右下角“开始转换”。 3&#xff1a;稍等片刻转换成功后&#xff0c;点击图片右下角的“下载”&#xff0c;将转换后的图片保存到…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(四)ApplyHierarchy

继续解析《Electric Dreams》项目中的自定义节点和子图&#xff1a;ApplyHierarchy 文章目录 前导文章标准组合拳ApplyHierarchyExecute with ContextIteration Loop BodyPoint Loop Body应用场景 小结 前导文章 《UE5《Electric Dreams》项目PCG技术解析 之 理解Assembly&…

【Android】APT与JavaPoet学习与实战

PS&#xff1a;本文讲解的APT全称为Annotation Processing Tool&#xff0c;而非是Android Performance Tuner&#xff0c;这两种工具简称皆为APT&#xff0c;前者是“注释处理工具”&#xff0c;后者是“Android性能调试器”。 本文分别使用Java、kotlin 语言进行开发&#xf…

做一个游戏小项目有多简单?

认识一个朋友&#xff0c;学了很多年的 python, 还停留在 helloworld 阶段&#xff0c;每次拿起又放下&#xff0c;是不是很熟悉&#xff1f;每天都在想&#xff0c;我要学编程&#xff0c;我要学编程&#xff0c;但是又不知道从何学起&#xff0c;学了一点又不知道怎么用&…

java并发编程原理-----线程

目录 上下文切换 java代码创建线程的两种方式 线程的五个状态 线程join方法 多线程之间的影响 上下文切换 CPU的每一个核心同一时刻只能执行一个线程&#xff0c;但是我们会发现电脑同一时刻现实会进行几千个线程&#xff0c;这就是cpu在快速的切换执行线程&#xff0c;由…

Python中的迭代器

一、介绍 在Python中&#xff0c;迭代器是一种访问集合元素的方式&#xff0c;可以用于遍历数据集中的元素&#xff0c;而不需要事先知道集合的大小。迭代器可以被用于循环语句中&#xff0c;例如for循环&#xff0c;来遍历集合中的每个元素。 Python中的迭代器是一个实现了迭…

将Windows系统上的音频、视频通过iTunes传输到iPhone上

这个地方需要下载安装版的iTunes 下载地址&#xff1a; https://www.apple.com/itunes/download/win64 不要从Windows的APP Store中下载iTunes&#xff0c;不好使。 安装完成后&#xff0c;如果是导入一个文件夹中的资料&#xff0c;则点击 【文件】》【将文件夹添加到资料库】…

岛屿数量 (力扣) dfs + bfs (JAVA)

给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的…

在内卷化竞争时代,金龙鱼重返增长的关键到底是什么?

提到欧丽薇兰、胡姬花、香满园、海皇、金味、丰苑、锐龙洁劲100、丸庄酱油等品牌,多数消费者的第一反应是什么?多数消费者认为是某个不知名的新品牌。问题的重点不在产品&#xff0c;而在主品牌定位。 事实上&#xff0c;这都是金龙鱼母公司益海嘉里旗下的品牌。内行都知道益海…

“坏邻居”导致的kafka生产者TPS下降原因排查

背景&#xff1a; 今天测试了两种不同的场景下kafka producer的tps性能数据&#xff0c;两种场景下都是使用3个线程&#xff0c;每个线程都是对应一个kafka producer&#xff0c;测试发送到kafka集群的消息的量&#xff0c;两个场景的区别是场景A只发送kafka消息&#xff0c;场…

自定义类型

目录 什么是自定义类型 结构体 结构体的声明 常规结构体的声明形式 特殊的结构体声明形式 匿名结构体&#xff1a; 匿名结构体的重命名&#xff1a; 注意事项&#xff1a; 结构体的自引用 什么是结构体的自引用 结构体变量的定义与初始化 方法一&#xff1a; 方法…

总结python安装包(库)过程中的采坑

绝大数的包比如numpy、pandas可以用pip install或者conda install解决&#xff0c;使用pip时可以用pip -V命令看一下自己的pip安装在了哪个虚拟环境&#xff0c;一般pip安装在哪默认就把python包安装在哪。 pip -VC:\Users\20478>pip -V pip 23.1.2 from D:\Python\lib\sit…

Android Java代码与JNI交互 JNI子线程访问Java方法 (八)

🔥 Android Studio 版本 🔥 🔥 创建包含JNI的类 JNIInvokeMethod.java 🔥 package com.cmake.ndk1.jni;import com.cmake.ndk1.base.ICallbackMethod; import com.cmake.ndk1.base.IThreadCallback;public class JNIInvokeMethod {static {System.loadLibrary("…

VBA代码如何切换word和excel(3)

【分享成果&#xff0c;随喜正能量】人不能因为一件好事&#xff0c;高兴一整年&#xff0c;却能因为一个创伤&#xff0c;郁郁终生。痛苦给人的刺激&#xff0c;总是远远大于快乐。成年人的烦恼&#xff0c;和谁说都不合适&#xff0c;悲喜自渡&#xff0c;他人难悟。人最强大…

DDOS防御,阻止DDoS攻击的15个独家技巧

DDoS攻击可以使企业完全宕机数小时以上&#xff0c;而宕机的后果可能很严重&#xff0c;各种规模的企业和政府都可能受到影响。2021年&#xff0c;由于系统中断一小时导致销售额大幅下降&#xff0c;亚马逊为此遭受了约3400万美元的直接财务损失。而随后由于Fakebook的服务中断…

Spring源码系列-第2章-后置工厂处理器和Bean生命周期

第2章-后置工厂处理器和Bean生命周期 后置工厂处理器属于后置处理器&#xff0c;后置处理器是Spring最核心的部分&#xff0c;Spring几乎所有的附加功能全由它完成。 什么是BeanPostProcessor&#xff1f; public interface BeanPostProcessor {/*** Apply this {code BeanPos…

桥接(Bridge)模式

目录 动机使用场景参与者优劣协作实现相关模式应用和思考 桥接模式是将抽象部分和它的实现部分分离&#xff0c;使他们都可以独立的变化的对象结构型模式。桥接模式通过将继承改为组合的方式来解决问题&#xff1b;具体来说就是抽取其中一个维度并使之成为独立的类层次。 动机…

gma 2 教程(二)数据操作:2. 功能逻辑架构和栅格数据类型简介

功能逻辑架构 gma栅格数据操作所含功能/属性的关系结构如下图所示&#xff1a; 栅格数据类型 gma栅格数据类型继承自GDAL&#xff0c;与NumPy数据关联&#xff0c;但又有所不同&#xff0c;详细关系见下表&#xff1a; 栅格格式支持 栅格格式信息统计 gma继承了GDAL全部的栅格…

详谈三次握手

作者&#xff1a;爱塔居 专栏&#xff1a;计算机网络 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步 经过三次的对话&#xff0c;这两个火柴人才确认了双方都能够说话&#xff0c;都能听见。三次握手也是一样的&#xff0c;只要这样才能确认双方的接受与发送能力…

文件操作--按数据块读写文件

函数fread&#xff08;&#xff09;和函数fwrite&#xff08;&#xff09;用于一次读取一组数据&#xff0c;即按数据块读写文件。fread&#xff08;&#xff09;的函数原型为&#xff1a; unsigned int fread(void *buffer ,unsigned int size,unsigned int count ,FILE *fp);…