Python---学生管理系统、hashlib模块

news2024/11/18 23:21:58

1. 学生管理系统

学生管理系统的数据结构设置:
一个学生信息对应一个字典
整个系统的所有学生:所有学生对应一个列表,列表中的元素全是字典
整个系统:一个字典, 字典中有一个key(all_student)
对应的值是所有学生;
这个字典需要做数据持久化,将数据存储到json文件中, 文件名就是当前登录的账号名
{
'all_student': [
{'name': '张三', 'age': 89, 'tel': '237837293'},
{'name': '张三', 'age': 89, 'tel': '237837293'},
{'name': '张三', 'age': 89, 'tel': '237837293'},
{'name': '张三', 'age': 89, 'tel': '237837293'}
],
'num': 4
}

file_manage:

读取JSON文件

import json

base_dir = './files/'


def read_text(file_name):
    try:
        with open(base_dir + file_name, 'r', encoding='utf8') as file:
            msg = file.read()
            return msg
    except FileNotFoundError:
        print('读取文件失败,请检查路径')
        return ''


def read_json(json_name, non_data):
    try:
        with open(base_dir + json_name, 'r', encoding='utf8') as file:
            msg = file.read()
            return json.loads(msg)
    except FileNotFoundError:
        return non_data


def write_json(json_name, data):
    with open(base_dir + json_name, 'w', encoding='utf8') as file:
        json.dump(data, file)

index:

登录与注册

import file_manager
import model
import student_manager
import tools

USERS_FILE = 'teachers.json'


def login():
    all_user = file_manager.read_json(USERS_FILE, {})

    user_name = input('请输入账号:')
    if user_name not in all_user:
        print('登录失败!该账号没有注册!')
    else:
        password = input('请输入密码:')
        if tools.encrypt_password(password) == all_user[user_name]:
            # print('登录成功!')
            student_manager.USER_NAME = user_name
            student_manager.show_system()


def register():
    while True:
        user_name = input('请输入账号(3~6位):')
        if 3 <= len(user_name) <= 6:
            break
        print('账号不符合要求,请重新输入!')

    all_user = file_manager.read_json(USERS_FILE, {})

    if user_name in all_user:
        print("注册失败!该账号已经注册过!")
        return

    while True:
        password = input('请输入密码(6~12位):')
        if 6 <= len(password) <= 12:
            break
        print('密码不符合要求,请重新输入!')

    s = model.Teacher(user_name, password)
    all_user[s.name] = s.password
    file_manager.write_json(USERS_FILE, all_user)


def start():
    content = file_manager.read_text('welcome.txt')
    while True:
        print(content)
        value = input('请选择(1-3):')
        if value == '1':
            login()
        elif value == '2':
            register()
        elif value == '3':
            print('退出成功!')
            exit()
        else:
            print('输入有误!')


if __name__ == '__main__':
    start()

model:

import tools


class Teacher(object):
    def __init__(self, name, password):
        self.name = name
        self.password = tools.encrypt_password(password)


class Student(object):
    def __init__(self, s_id, name, age, gender, tel):
        self.s_id = s_id
        self.name = name
        self.age = age
        self.gender = gender
        self.tel = tel

student_manage:

删除学生;查找学生;增加学生;获取学生信息


import file_manager
import model

USER_NAME = ''
ALL_STUDENT = 'all_student'
COUNT = 'count'


def del_student():
    system_data = file_manager.read_json(USER_NAME + '.json', {})
    all_student = system_data.get(ALL_STUDENT, [])
    if not all_student:
        print('该账号没有可管理的学生!请先添加学生!')
        return

    print('1.按姓名删\n2.按学号删\n其他:返回')
    del_studens = []
    choice = input('请选择:')
    key = value = ''
    if choice == '1':
        key = 'name'
        value = input('请输入要删除的学生名字:')
    elif choice == '2':
        key = 's_id'
        value = input('请输入要删除的学生id:')
    else:
        return

    # 找到名字和删除学生名字相同的学生
    for stu in all_student:
        if stu[key] == value:
            del_studens.append(stu)
    if not del_studens:
        print('没有该学生!')
        return
    length = len(del_studens)
    for index, s in enumerate(del_studens):
        print(index, get_stu_message(s))

    try:
        choice = int(input('请输入需要删除的学生的标号(0~%d),q-返回:' % (length - 1)))
    except ValueError:
        return

    if not 0 <= choice <= length - 1:
        return

    # 删除对应的学生
    all_student.remove(del_studens[choice])
    system_data[ALL_STUDENT] = all_student
    file_manager.write_json(USER_NAME + '.json', system_data)
    print('删除成功!')


def add_student():
    system_data = file_manager.read_json(USER_NAME + '.json', {})
    all_student = system_data.get(ALL_STUDENT, [])

    while True:
        # 1.输入学生信息
        name = input('请输入姓名:')
        age = input('请输入年龄:')
        gender = input('请输入性别:')
        tel = input('请输入电话:')

        # 创建学号
        count = system_data.get(COUNT, 0)
        count += 1
        s_id = 'stu' + str(count).zfill(4)

        # 2.创建学生对象
        s = model.Student(s_id, name, age, gender, tel)

        # 4. 更新数据
        all_student.append(s.__dict__)
        system_data[ALL_STUDENT] = all_student
        system_data[COUNT] = count

        # 5. 更新文件
        file_manager.write_json(USER_NAME + '.json', system_data)
        print('添加成功!')

        # 6.给出选择
        value = input('1.继续\n2.返回\n请选择(1-2):')
        if value != '1':
            break


def get_stu_message(stu):
    return '学号:{s_id}, 姓名:{name},性别:{gender},年龄:{age}, ☎:{tel}'.format(**stu)


def find_student():
    all_student = file_manager.read_json(USER_NAME + '.json', {}).get(ALL_STUDENT, [])
    if not all_student:
        print('该账号没有可管理的学生!请先添加学生!')
        return

    print('1.查看所有学生\n2.根据姓名查找\n3.根据学号查找\n其他: 返回')
    value = input('请选择:')

    if value == '1':
        # 查看所有学生
        for stu in all_student:
            print(get_stu_message(stu))
    elif value == '2':
        # 根据姓名查找
        name = input('请输入学生名字:')
        flag = True  # 是否没有这个名字的学生
        for stu in all_student:
            if stu['name'] == name:
                print(get_stu_message(stu))
                flag = False
        if flag:
            print('没有该学生!')
    elif value == '3':
        # 根据学号查找
        study_id = input('请输入学生学号:')
        for stu in all_student:
            if stu['s_id'] == study_id:
                print(get_stu_message(stu))
                break
        else:
            print('没有该学生!')
    else:
        return


def show_system():
    content = file_manager.read_text('students_page.txt') % USER_NAME
    while True:
        print(content)
        value = input('请选择(1-5):')
        if value == '1':
            add_student()
        elif value == '2':
            find_student()
        elif value == '3':
            print('修改学生信息')
        elif value == '4':
            del_student()
        elif value == '5':
            return
        else:
            print('输入有误!')

tools:

密码加密

import hashlib


def encrypt_password(pwd):
    sha = hashlib.sha256()
    sha.update(pwd.encode('utf8'))
    return sha.hexdigest()

2. hashlib模块 

import hashlib
import hmac

# 这两个模块都是用来进行数据加密
# hashlib模块里主要支持两个算法  md5 和  sha 加密
# 加密方式: 单向加密:只有加密的过程,不能解密md5/sha   对称加密   非对称加密rsa

# 需要将要加密的内容转换成为二进制
x = hashlib.md5('y239ym23r9b!'.encode('utf8'))  # 生成一个md5对象
# x.update('y239ym23r9b!'.encode('utf8'))
print(x.hexdigest())  # 900150983cd24fb0d6963f7d28e17f72
# 'abc'  ==>  900150983cd24fb0d6963f7d28e17f72


h1 = hashlib.sha1('123456'.encode())
print(h1.hexdigest())  # 7c4a8d09ca3762af61e59520943dc26494f8941b
h2 = hashlib.sha224('123456'.encode())  # 224位  一个十六进制占4位
print(h2.hexdigest())  # f8cdb04495ded47615258f9dc6a3f4707fd2405434fefc3cbf4ef4e6
h3 = hashlib.sha256('123456'.encode())
print(h3.hexdigest())  # 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
h4 = hashlib.sha384('123456'.encode())
print(
    h4.hexdigest())  # 0a989ebc4a77b56a6e2bb7b19d995d185ce44090c13e2984b7ecc6d446d4b61ea9991b76a4c2f04b1b4d244841449454

(日常美图时间)

 

 

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

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

相关文章

从传统Java应用到现代微服务,SpringBoot入门的基础指南

目录 一. 创建SpringBoot项目1.1 使用Spring Initializr快速构建项目1.2 手动创建springboot项目 二. SpringBoot入门案例解析2.1 依赖管理特性2.2 starter场景启动器2.3 引导类自动配置 三. REST风格四. 配置文件4.1 配置文件类型4.2 YAML文件的简介与使用4.3 Value与Configur…

VSCode 开发flutter 实现安卓设备远程调试

1&#xff0c;首先安装 ADB Commanads for VSCode扩展 并且必须确保ADB已经添加到系统环境变量中 如未添加请按照下面的方式添加&#xff0c;如添加请直接跳到下面。 2&#xff0c;添加环境变量&#xff08;windows可参考&#xff0c;mac忽略此项&#xff09; 我将ADB安装到这…

3分钟快速实现mysql全量增量备份

需求说明&#xff1a; mysql数据库ip地址为192.168.1.100&#xff0c;端口3306&#xff0c;root密码111111&#xff0c; 服务器cantos7中ip地址192.168.1.101 利用xtrabackup每周六进行全量备份&#xff0c;每天进行增量备份&#xff0c;保留2个礼拜的备份&#xff0c;并且保存…

睡眠经济2.0时代来了,老巨头们有护城河吗?

在第23个世界睡眠日&#xff0c;中国睡眠研究会等机构发布了《中国睡眠研究报告2023》&#xff0c;近半数人每晚平均睡眠时长不足8小时&#xff0c;“失眠”已成为了当代人的生活常态。 越是睡不好&#xff0c;越要想办法。年轻人纷纷求助于好的寝具、好的助眠产品乃至保健品&…

【C语言进阶C++】 C++基础--让你丝滑的从C语言进阶到C++

目录 前言 正文 1. 面向过程、面向对象 面向过程思维 面向对象思维 面向过程语言优缺点 面向对象语言优缺点 C面向对象特点 2. 输入、输出 C中的输入输出 总结C和C输入输出 3. 命名空间 作用域 命名空间 4. 动态申请空间 C动态申请空间&#xff08;new、delete&…

Leetcode刷题之回文链表和交换链表中的结点

竭力履行你的义务&#xff0c;你应该就会知道&#xff0c;你到底有多大的价值。 --列夫.托尔斯泰 目录 &#x1fab4;一.回文链表 &#x1f33b;1.快慢指针 &#x1f341;2.把值存入数组中&#xff0c;然后使用双指针 &#x1f33c;二.交换链表中的结点 &#x1…

经典论文解读 — 端到端的VL预训练网络SOHO

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 论文标题&#xff1a; Seeing Out of tHe bOx :End-to-End Pre-training for Visual-Language Representation Learning》 Motivation 本文针对目前大量Visual-Language(VL) tasks使用由Faster-RCNN提取出的…

余弦相似度公式推导及代码实现

余弦相似度公式推导 1. 为什么使用余弦值相似度&#xff1f;2. 公式推导2.1 三角函数余弦公式推导2.2 三角函数向量余弦公式推导 3. 余弦相似度代码实现 1. 为什么使用余弦值相似度&#xff1f; 空间维度上两个点之间相似定义 在空间维度上两个点之间是有夹角和方向&#xff0…

计算机操作系统实验:页面置换算法的实现

目录 前言实验目的实验内容实验过程最佳置换算法代码实现算法流程流程图设计思路运行结果 先进先出算法代码实现算法流程流程图设计思路运行结果 最近最久未使用算法代码实现算法流程流程图设计思路运行结果 总结 前言 本实验的目的是通过编程模拟不同的页面置换算法&#xff…

基于思科模拟器的路由与交换实训报告(单臂路由、三层交换机实现vlan通信、ospf、rip、dhcp、acl、nat技术总结)

本博客是路由与交换实训报告&#xff0c;基于思科模拟器分别做了单臂路由、三层交换机实现vlan间通信、ospf、rip、dhcp、nat的实验&#xff0c;最后的nat综合实验是本次实训的大拓扑&#xff0c;综合了上述的几个技术。 大家可以当作一些思科小实验的总结&#xff0c;供网络工…

数据库管理-第七十二期 复盘(20230505)

数据库管理 2023-05-05 第七十二期 复盘1 再测试2 对照分析&#xff1a; 3 如何解决总结 第七十二期 复盘 上一期的内容&#xff0c;我承认主要是在放假&#xff0c;分析过程还是水了一点&#xff0c;SR转回国内之后&#xff0c;处理效率还是提升了一大截。 1 再测试 在客户…

Linux - 第11节 - 网络基础(一)

1.计算机网络背景 1.1.网络发展 独立模式&#xff1a;计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计…

Python进阶——实现人脸识别

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 今天我们来实现一下人脸识别~ 先问大家一个问题 什么是百度Aip模块&#xff1f; 百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中 本文写的是使用百度AI的在线接口SDK模块&#xff08;baidu-aip&#…

单链表——单链表的定义及基本操作(初始化、头插法尾插法建表、查找、插入、删除、判空等)

单链表的定义 由于顺序表存在以下缺陷&#xff0c;所以衍生出了链表&#xff0c;而链表种类有很多种&#xff0c;今天我们讲的是单链表。 顺序表存在的问题如下 1.中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释…

CPU 架构(x86/ARM)简介

CPU 架构通过指令集的方式一般可分为 复杂指令集&#xff08;CISC&#xff09; 和 精简指令集&#xff08;RISC&#xff09; 两类&#xff0c;CISC 主要是 x86 架构&#xff0c;RISC 主要是 ARM 架构&#xff0c;还有 MIPS、RISC-V、PowerPC 等架构。 本文重点介绍 x86 和 ARM…

idea中maven的几个操作按钮:clean、validate、compile...

idea中Maven生命周期指令 clean命令 清除由项目编译创建的target validate命令 验证项目是否正确&#xff0c;并且所有必要的信息均可用 compile命令 编译项目的源代码 test命令 使用合适的单元测试框架来测试编译的源代码。 这些测试不应要求将代码打包或部署 verify命令 …

智安网络|一文看懂内核平台和系统服务的联系

内核平台和系统服务是操作系统中两个非常重要的组成部分。内核平台是系统底层的核心&#xff0c;负责管理和控制计算机硬件和资源的访问。而系统服务则是在内核之上运行的程序集合&#xff0c;为操作系统提供各种功能和服务。 内核平台和系统服务的关联非常密切。系统服务必须…

Emqx的简单使用

Emqx 是一个mqtt 的服务器产品。之前activemq可以作为mqtt协议的服务器&#xff0c;但是功能相对来说比较单一。Emqx作为跟Mqtt协议相关的新一代产品&#xff0c;功能实际上更为强大。 它的功能也主要体现在可视化/认证/规则/httpApi 上面。 1.Emqx 的安装 这里采用了docker…

JMeter 计算上一个接口取值到本次接口进行四则运算赋值

项目场景&#xff1a; 公司项目需要接口关联计算进行赋值&#xff1a; 项目场景&#xff1a;A接口提取的返回值&#xff0c;在传到B接口使用时&#xff0c;需要先进行四则运算后&#xff0c;再赋值使用。 A接口提取的值 B接口需要使用计算后的值 问题描述 使用beanshell预…

必须掌握的ArrayList,LinkedList,HashMap,HashTable,Collection,Colections

人的自由并不在于可以做他想做的事&#xff0c;而在于可以不做他不想做的事。 ArrayList和linkedList的区别 Array数组是基于索引&#xff08;index&#xff09;的数据结构&#xff0c;它使用索引在数组中搜索和读取数据是很快的 Array获取数据的时间复杂度是o(1)&#xff…