天天看點

學生管理系統 | 手把手教你入門Python之八十二

上一篇: 生成器 | 手把手教你入門Python之八十一 下一篇: 子產品的使用| 手把手教你入門Python之八十三 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程 《Python入門2020最新大課》 ,主講人姜偉。

學生管理系統

一個學生資訊對應一個字典

整個系統的所有學生:所有學生對應一個清單,清單中的元素全是字典

整個系統:一個字典,字典中有一個key(all_student)

對應的值是所有學生;

這個字典需要做資料持久化,将資料存儲到json檔案中,檔案名就是目前登入的賬号名

jack.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
}           

建立檔案:welcome.txt

===================================
     ** 歡迎xx來到學生管理系統 **

        ♦  1.    登      錄

        ♦  2.    注      冊

        ♦  3.    退      出

===================================           

建立檔案:students_page.txt

===================================
🌺🌺歡迎%s:

            ♥ 1.     添加學生
            ♥ 2.     檢視學生
            ♥ 3.     修改學生資訊
            ♥ 4.     删除學生
            ♥ 5.     傳回
===================================           

index.py:

import sys

import file_manager
import model
import student_manager
  

def register():
    # 讀取檔案,檢視檔案裡是否有資料,如果檔案不存在,預設是一個字典
    data = file_manager.read_json('data.json', {})
    while True:
        teacher_name = input('請輸入賬号(3~6位):')
        if not 3 <= len(teacher_name) <= 6:
            print('賬号不符合要求,請重新輸入!')
        else:
            break

    if teacher_name in data:
        print('注冊失敗!該賬号已經注冊過!')
        return

    while True:
        password = input('請輸入密碼(6~12):')
        if not 6 <= len(password) <= 12:
            print('密碼不符合要求,請重新輸入!')
        else:
            break
    

    # 使用者名密碼都已經輸入正确以後,建立一個teacher對象{'zhang':'123456'}
    t = model.Teacher(teacher_name, password)
    data[t.name] = t.password
    # data[teacher_name] = password
    file_manager.write_json('teacher.json', teacher)

def login():
    # 讀取檔案,檢視檔案裡是否有資料,如果檔案不存在,預設是一個字典
    data = file_manager.read_json('data.json', {})
    teacher_name = input('請輸入老師賬号:')
    if teacher_name not in data:
        print('登入失敗!該賬号沒有注冊!')
        return
    password = input('請輸入密碼:')
    import tools
    if data[teacher_name] == tools.encrypt_password(password):
        student_manager.name = teacher_name
        student_manager.show_manager()
    else:
        print('密碼錯誤,登入失敗!')

def start():
    content = file_manager.read_file('welcome.txt')
    while True:
        operator = input(content + '\n請選擇(1-3):')
        if operator == '1':
            login()
        elif operator == '2':
            register()
        elif operator =='3':
            # break  # 停止死循環
            # exit(0)  # 退出整個程式
            sys.exit(0)
        else:
            print('輸入有誤!')
    

if __name__ = '__main__':
    start()            

file_manager.py:

base_dir = './files/'

def read_file(file_name)
    try:
        with open('base_dir' + file_name, 'r', encoding='utf8') as file:
            content= file.read()
            return content
    except FileNotFoundError:
        print('檔案未找到')


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


def read_json(file_name, default_data):
    try:
        with open('base_dir' + file_name, 'r', encoding='utf8') as file:
            import json
            return json.load(file)
    except FileNotFoundError:
        # print('檔案未找到')
        return default_data           

student_manager.py:

import model

name = ''


def add_student():
    x = file_manager.read_json(name + '.json', {})
    if not x:
        students = []
        num = 0
    else:
        students = x['all_student']
        num = int(x['num'])
    while True:    
        s_name = input('請輸入學生姓名:')
        s_age = input('請輸入年齡:')
        s_gender = input('請輸入性别:')
        s_tel = input('請輸入電話号碼:')
        
        num += 1
        # 字元串的zfill方法,在字元串的前面補0
        s_id = 'stu_' + str(num).zfill(4)

        # 建立一個Student對象
        s = model.Student(s_id, s_name, s_age, s_gender, s_tel)
    
        # {
        # 'all_student': [
        #       {'name':'zhangsan', 'age':18, 'gender':'男', 'tel':'110'},
        #       {'name':'zhangsan', 'age':18, 'gender':'男', 'tel':'110'}
        #   ],
        # 'num':2
        # }
        students.append(s.__dict__)

        # 拼接字典
        data = {'all_student': students, 'num':len(students)}
        # print(data)
        # 把資料寫進檔案裡
        file_manager.write_json(name + '.json', data)
        choice = input('添加成功!\n1.繼續\n2.傳回\n請選擇(1-2):')
        if choice =='2':
            break


def show_student():
    key = value = ''
    x = input('1.檢視所有學生\n2.根據姓名查找\n3.根據學号查找\n其他:傳回\n請選擇:')
    y = file_manager.read_json(name + '.json', {})

    students = y.get('all_student', [])

    if not students:
        print('該老師還沒有學員,請添加學員')
        return

    if x == '1':  # 查詢所有
        pass
    elif x == '2':  
        value = input('請輸入學員的姓名:')
        key = 'name'

    elif x == '3':
        value = input('請輸入學員的id:')
        key = 's_id'

    else:
        return

    
    students = filter(lambda s: s.get(key, '') == value, students)

    if not students:
        print('未找到學員')
        return
    for Student in students:
        print('學号: {s_id}, 姓名: {name}, 性别: {gender}, 年齡: {age}, ☎: {tel}'.format(**student))   

def modify_student():
    pass

def delte_student():
    y = file_manager.read_json(name + '.json', {})
    students = y.get('all_student', [])
    key = value = ''

    if not students:
        print('該老師還沒有學員,請添加學員')
        return

    input('1.按姓名删\n2.按學号删\n其他:傳回\n請選擇:')
    if num == '1'
        key = 'name'
        value = input ('請輸入要删除的學生的名字:')
    elif num == '2'
        key = 's_id'
        value = input('請輸入要删除的學生id:')
    else:
        return

    students = list(filter(lambda s: s.get(key, '') == value, all_students))
    if not students:
        print('沒有找到對應的學生')
        return
    for x, s in enuerate(students):
        print('{x} 學号: {s_id}, 姓名: {name}, 性别: {gender}, 年齡: {age}, ☎: {tel}'.format(x=i, **s))

    n = input('請輸入需要删除的學生的标号(0~{}),q-傳回:'.format(i) # 使用變量 i 有潛在風險

    if not n.isdigit() or not 0 <= int(n) <= i:
        print('輸入的内容不合法')
        return

    # 将學生從all_students裡删除
    all_students.remove(students[int(n)])

    y['all_student'] = all_students
    file_manager.write_json(name + '.json', y)


def show_manager():
    # print('顯示管理頁面')
    content = file_manager.read_file('students_page.txt') % name
    while True:
        operator = input('請選擇(1-5):')
        if operator == '1':
            add_student()
        elif operator == '2':
            show_student()
        elif operator == '3':
            modify_student()
        elif operator == '4':
            delte_student()
        elif operator == '5':
            break
        else:
            print('輸入有誤!')           

model.py:

class Teacher(object):
    def __init__(self, name, password):
        import tools
        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           

tools.py:

import hashlib

def encrypt_password(passwd, x='afsoijweogj4wiu'):
    h = hashlib.sha256()
    h.update(passwd.encode('utf8'))  # 123456afsoijweogj4wiu
    h.update(x.encode('utf8'))
    return h.hexdigest()           

data.json:

資料集           

此系統存在的問題:學生id的問題,應該是用學生id的最大數+1去補充,否則可能會出現id重複。

另外,後續會利用資料庫來處理此類問題。

配套視訊