2019-08-06_Work_Day12

学生管理系统

student.py
# -*- coding: utf-8 -*-
"""
@project:   day12-文件操作和异常处理
@file:      student.py
@author:    wanglei
@time:      2019-08-06 16:41:14
"""
import datetime


class User(object):
    def __init__(self, name, password):
        self._name = name
        self._password = password
        self._file_path = ''.join(['files/', str(name), '_', datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
                                   , '.pkl'])

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, pwd):
        self._password = pwd

    @property
    def file_path(self):
        return self._file_path

    def __repr__(self) -> str:
        return 'User[user_name = ' + self.name \
               + ', password = ' + self.password + \
               ', files = ' + self.file_path + ']'


class Student(object):
    def __init__(self, sid, name, age, phone):
        self._sid = sid
        self._name = name
        self._age = age
        self._phone = phone

    @property
    def sid(self):
        return self._sid

    @sid.setter
    def sid(self, sid):
        self._sid = sid

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age

    @property
    def phone(self):
        return self._phone

    @phone.setter
    def phone(self, phone):
        self._phone = phone

    def __repr__(self) -> str:
        return self.sid + '\t' + self.name + '\t\t' + str(self.age) + '\t\t' + self.phone
studentManage.py
# -*- coding: utf-8 -*-
"""
@project:   day12-文件操作和异常处理
@file:      studentManage.py
@author:    wanglei
@time:      2019-08-06 16:41:14
"""
from student import *
import _pickle as pickle
import os

file_path = ''
user = User(None, None)
USER_DIR_PATH = 'files/user.pkl'


def stu_is_exist(fn):
    """装饰器,判断学生文件及打印学生信息"""

    def show_info():
        """打印学生信息"""
        with open(file_path, 'br') as f_stu:
            try:
                stu_list = pickle.load(f_stu)
                print('=' * 30)
                print('序号\t\t学生姓名\t学生年龄\t学生电话\t')
                for stu in stu_list:
                    print(stu)
                print('=' * 30)
            except EOFError:
                print('学生信息不存在,请先进行添加!')
                welcome()

    # 判断信息文件是否存在
    def exist(*args, **kwargs):
        if not os.path.exists(file_path):
            with open(file_path, mode='bw') as f:
                f.close()
                with open(file_path, mode='bw') as f_stu:
                    pickle.dump([], f_stu, True)
                print('=' * 30)
                print('学生信息文件不存在,重新创建成功!')
                welcome()

        else:
            show_info()
            fn(*args, **kwargs)
            show_info()

            print('1.继续\n2.返回')
            choose_num = input('请选择1~2:')
            while True:
                if choose_num == '1':
                    show_info()
                    fn(*args, **kwargs)
                    show_info()
                elif choose_num == '2':
                    welcome()
                else:
                    print('输入错误,请重新输入!\n')
                print('1.继续\n2.返回')
                choose_num = input('请选择1~2:')

    return exist


def login():
    """登录"""
    print('=' * 30)
    print('\t** 欢迎来到 xx 管理系统 **\n')
    print('\t♦️\t1.\t登\t\t录\n\t♦️\t2.\t注\t\t册\n\t♦️\t3.\t退\t\t出')
    print('\n', '=' * 30)
    choose_num = input('请选择1~3:')
    while True:
        if choose_num == '1':
            user_login_verify()
            break
        elif choose_num == '2':
            user_login_register()
            break
        elif choose_num == '3':
            print('欢迎下次使用~')
            exit(0)
        else:
            print('输入错误,请重新输入!\n')
            choose_num = input('请选择1~3:')


def user_login_verify():
    """用户登录验证"""

    if os.path.exists(USER_DIR_PATH):
        with open(USER_DIR_PATH, 'br') as f_user:
            try:
                user_list = pickle.load(f_user)
                # print(user_list)
                user_name, password = user_info_verify()
                for u in user_list:
                    if u.name == user_name and u.password == password:
                        global user
                        user = u
                        global file_path
                        file_path = user.file_path
                        # print(file_path)
                        if not os.path.exists(file_path):
                            with open(file_path, mode='bw') as f:
                                f.close()
                                with open(file_path, mode='bw') as f_stu:
                                    pickle.dump([], f_stu, True)
                                print('=' * 30)
                                print('学生信息文件不存在,重新创建成功!')
                        welcome()
                        return
                if user_name not in [u.name for u in user_list]:
                    print('该用户名尚未注册,请先进行注册!')
                    login()
                    return
                print("用户名或密码错误,请重试!")
                login()
            except EOFError:
                print("用户信息不存在...")
                print('=' * 30)
                print('跳转注册...')
                user_login_register()
    else:
        with open(USER_DIR_PATH, mode='w'):
            print('=' * 30)
            print("用户文件不存在,重新用户文件成功!")
            print('=' * 30)
            print('跳转注册...')
            user_login_register()


def user_login_register():
    """用户注册"""
    user_name, password = user_info_verify()
    if not os.path.exists(USER_DIR_PATH):
        with open(USER_DIR_PATH, mode='bw'):
            print('=' * 30)
            print('用户信息文件不存在,重新创建成功!')
    with open(USER_DIR_PATH, 'br') as f_user:
        try:
            user_list = pickle.load(f_user)
        except EOFError:
            user_list = []
    for u in user_list:
        if u.name == user_name:
            print('用户名已存在, 请进行登录!')
            login()
    new_user = User(user_name, password)
    user_list.append(new_user)
    with open(USER_DIR_PATH, 'wb') as f_user:
        pickle.dump(user_list, f_user, True)
    print("用户注册成功!")
    login()


def user_info_verify():
    while True:
        user_name = input('请输入用户名(3-6位):')
        if 3 <= len(user_name) <= 6:
            break
        else:
            print('输入有误,用户名长度必须为3-6位!')
    while True:
        password = input('请输入密码(6-12位):')
        if 6 <= len(password) <= 12:
            break
        else:
            print('输入有误,密码长度必须为6-12位!')
    return user_name, password


def welcome():
    """欢迎页面"""
    print('=' * 30)
    print('🌺🌺欢迎%s:' % user.name)
    func_list = ['添加学生', '查看学生', '修改学生信息', '删除学生', '返回']
    for i in range(len(func_list)):
        print('❤ %d.\t %s' % (i + 1, func_list[i]))
    print('=' * 30)
    choose_func()


def choose_func():
    """选择功能"""
    choose_num = input('请选择1-5:')
    if choose_num == '1':
        add_stu()
    elif choose_num == '2':
        get_stu()
    elif choose_num == '3':
        set_stu()
    elif choose_num == '4':
        del_stu()
    elif choose_num == '5':
        print('亲爱的%s,欢迎下次使用,bye~' % user.name)
        login()
    else:
        print('输入错误,请重新输入!\n')
        choose_func()


def stu_info_verify():
    while True:
        stu_name = input('请输入学生姓名:')
        if stu_name.isdigit():
            print('输入有误,学生姓名不能为数字!')
        else:
            break
    while True:
        stu_age = input('请输入学生年龄:')
        if stu_age.isdigit():
            stu_age = int(stu_age)
            break
        else:
            print('输入有误,学生年龄请输入数字!')
    while True:
        stu_phone = input('请输入学生电话:')
        if stu_phone.isdigit():
            break
        else:
            print('输入有误,学生电话信息请输入数字!')
    return stu_name, stu_age, stu_phone


@stu_is_exist
def add_stu():
    """增加学生信息"""
    with open(user.file_path, 'br') as f_stu:
        try:
            stu_list = pickle.load(f_stu)
            f_stu.close()
        except EOFError:
            stu_list = []
    if not stu_list:
        stu_sid = '1'.zfill(5)
    else:
        stu_sid = str(int(stu_list[-1].sid) + 1).zfill(5)
    stu_name, stu_age, stu_phone = stu_info_verify()
    new_student = Student(stu_sid.zfill(5), stu_name, stu_age, stu_phone)
    stu_list.append(new_student)
    with open(user.file_path, 'wb') as f_stu:
        pickle.dump(stu_list, f_stu, True)
        f_stu.close()
    print("学生信息添加成功!")


@stu_is_exist
def get_stu():
    """查看学生信息"""
    input('请按任意键返回:')
    welcome()


@stu_is_exist
def set_stu():
    """修改学生信息"""

    with open(user.file_path, 'br') as f_stu:
        try:
            stu_list = pickle.load(f_stu)
            is_find = False
            stu_sid = int(input('请输入想要修改的序号:'))
            for index in range(len(stu_list)):
                if int(stu_list[index].sid) == stu_sid:
                    stu_list[index].name, stu_list[index].age, stu_list[index].phone = stu_info_verify()
                    is_find = True
                    break
            f_stu.close()
        except EOFError:
            print('学生信息不存在,请先进行添加!')
            welcome()
    if not is_find:
        print('序号不存在,请重试!')
        welcome()
    with open(user.file_path, 'wb') as f_stu:
        pickle.dump(stu_list, f_stu, True)
        f_stu.close()
    print("学生信息修改成功!")


@stu_is_exist
def del_stu():
    """删除学生信息"""

    with open(user.file_path, 'br') as f_stu:
        try:
            stu_list = pickle.load(f_stu)
            is_find = False
            stu_sid = int(input('请输入想要删除的序号:'))
            for index in range(len(stu_list)):
                if int(stu_list[index].sid) == stu_sid:
                    del stu_list[index]
                    is_find = True
                    break
            f_stu.close()
        except EOFError:
            print('学生信息不存在,请先进行添加!')
            welcome()
    if not is_find:
        print('序号不存在,请重试!')
        del_stu()

    with open(user.file_path, 'wb') as f_stu:
        pickle.dump(stu_list, f_stu, True)
        f_stu.close()

    print("学生信息删除成功!")


if __name__ == '__main__':
    login()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355