Python 校园选课系统
程序员文章站
2022-06-24 10:13:44
面向对象作业——校园选课系统 角色: 学校、学员、课程、讲师 要求: 1. 创建北京、上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格 4. 班级关联课程、讲师 5. 创建学员时,选择学校,关联 ......
面向对象作业——校园选课系统
角色:
学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格
4. 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
6. 创建讲师角色时要关联学校
7. 提供三个角色视图
7.1 学员视图, 登陆, 查看课程、查看班级
7.2 讲师视图, 讲师可查看自己教学的班级、课程。
进阶需求:可管理自己的班级, 查看班级学员列表 , 修改所管理的学员的成绩
7.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
一 、分析需求
创建北京、上海 2 所学校 分析:创建学校类
创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
分析:创建课程类,通过课程类去创建课程,并自动判断地点,当课程为go是地点为上海,为Linux或python时地点为北京课程包含,周期,价格 分析:课程包含的周期、价格属性
班级关联课程、讲师 分析:可以创建班级的时候需输入关联的课程,创建讲师的时候需输入关联的班级;一个班级对应一个课程 一个班级对应一个讲师
创建学员时,选择学校,关联班级 分析:创建学员时需要输入所属的班级,并自动关联课程和学校
创建讲师角色时要关联学校 分析:创建教师时根据教师所教的课程自动关联学校
提供三个角色视图 分析:让用户可选择角色
7.1 学员视图, 登陆, 查看课程、查看班级 分析:学员角色可以有的功能
7.2 讲师视图, 讲师可查看自己教学的班级、课程。 分析:教师角色有的功能
进阶需求:可管理自己的班级, 查看班级学员列表 , 修改所管理的学员的成绩
7.3 管理视图,创建讲师, 创建班级,创建课程 分析:管理员有的功能
二、 readme(程序说明文件)
运行环境:python3.6
主程序为While 循环,先让用户选择角色,进入所需的角色后提示选择相应的功能
选择功能时必须先登录,如没有登录,则会跳转让用户登录
角色功能:
1 学生
(1)登录 (2)查看班级 (3)查看课程 (4)返回上层目录 (5)注销
2 教师
(1)登录 (2)查看所教的班级 (3)查看所教的课程 (4)查看班级学员 (5)返回上层目录 (6)注销
3 管理员
(1)登录 (2)创建学校 (3)创建班级 (4)创建讲师 (5)创建课程 (6)创建学员 (7)返回上层 (8)注销
程序说明:
1 函数initalize用来进行初始化,创建程序所需的文件
classinfo.txt 文件用来存放班级信息, 格式为:班级名=地点=课程=讲师 例如:s22=北京=python=taibai courseinfo.txt 文件用来存课程信息 格式为:课程=周期=价格=地点 例如:python=6个月=9999=北京 managerinfo.txt 文件用来存管理员信息 格式为:用户名=密码 例如:admin=123 schoolinfo.txt 文件用来存学校信息 格式为:学校名=地点 例如:oldboy=北京 studentinfo.txt 文件用来存学生信息 格式为:姓名=密码=班级=课程 例如:abc=123=s22=python teacherinfo.txt 用来存教师信息 格式为:姓名=密码=课程=所教班级=地点 例如:taibai=123=python=s22=北京
2 函数 myinput 用来进行输入,如果输入为空则重新输入
3 函数 login 用来进行登录,如果登录成则修改对应的状态信息,并记录用户名
4 学校类 School 有两个属性,学校地点和学校名
5 班级类 Class 有四个属性,分别为班级名称、班级地点、班级课程、班级授课老师
6 课程类 Course 有四个属性,分别是课程名称、课程周期、课程价格、课程地点
7 老师类 Teacher 有一个记录状态的字典、四个属性、两个方法、一个装饰器
字典status_dict用来记录用户名和登录状态 属性分别为老师姓名、老师密码、老师所教课程、所教班级 方法 view_class 用来查看课程和班级 方法 viem_student用来查看班级的学生 装饰器decorator_t 用来进行登录判断,如果没有登录则让用户登录
8 学生类 Student 有一个记录状态的字典、三个属性、两个方法、一个装饰器
字典status_dict用来记录用户名和登录状态 方法view_class用来查看自己的班级 方法view_course用来查看自己的课程 装饰器decorator_s 用来进行登录判断,如果没有登录则让用户登录
9 管理员类 Manager 有一个记录状态的字典、二个属性、五个方法、一个装饰器
字典status_dict用来记录用户名和登录状态 方法create_school用来创建学校 方法create_course用来创建课程 方法create_class 用来创建班级 方法create_teacher用来创建教师并自动关联地点 方法create_student用来创建学生并自动关联课程 装饰器decorator_s 用来进行登录判断,如果没有登录则让用户登录
三、全部代码如下
1 代码基本信息
#!/usr/bin/python3 # -*- coding: UTF-8 -*- # Author:zengzeng # Version: 4.0
2 定义初始化函数,创建程序所需的文件
def initialize(): '初始化,创建所需的文件' print("""初始化开始...\n将创建程序所需文件: 'classinfo.txt', 'courseinfo.txt', 'managerinfo.txt', 'schoolinfo.txt', 'studentinfo.txt', 'teacherinfo.txt',""") with open('classinfo.txt', 'w+', encoding='utf-8') as f1: f1.write('s22=北京=python=taibai\n') with open('courseinfo.txt', 'w+', encoding='utf-8') as f2: f2.write('python=6个月=9999=北京\n') with open('managerinfo.txt', 'w+', encoding='utf-8') as f3: f3.write('admin=123\n') with open('schoolinfo.txt', 'w+', encoding='utf-8') as f4: f4.write('oldboy=北京\n') with open('studentinfo.txt', 'w+', encoding='utf-8') as f5: f5.write('abc=123=s22=python\n') with open('teacherinfo.txt', 'w+', encoding='utf-8') as f6: f6.write('taibai=123=python=s22=北京\n') print("初始化完成!")
3 定义输入函数,用来判断输入是否为空
def myinput(content): '''content为输入时的提示语''' info = input("%s" % content).strip() if len(info) == 0: print("不能为空,请重新输入") return myinput(content) else: return info
4 定义登录函数
def login(file, role): "file 为存用户信息的文件,role为类名" i = 0 while i < 3: username = input("请输入用户名:").strip() password = input("请输入密码:").strip() with open(file, 'r', encoding='utf-8') as fl: for line in fl: line_list = line.strip().split('=') if username == line_list[0] and password == line_list[1]: print("登录成功") # 登录成功后,记录用户登录状态 # global status_dict role.status_dict['username'] = username role.status_dict['status'] = True return True else: print("账号或密码不正确,请重新输入") i += 1 else: print("错误三次,请稍后再试") return login()
5 定义学校类
class School: def __init__(self, location, school_name): self.location = location self.school_name = school_name
6 定义班级类
class Class: def __init__(self, class_name, class_loaction, class_course, class_teacher): self.class_name = class_name self.class_location = class_loaction self.class_course = class_course self.class_teacher = class_teacher
7 定义课程类
class Course: def __init__(self, course_name, course_time, course_price, course_location): self.course_name = course_name self.course_time = course_time self.course_price = course_price self.course_location = course_location
8 定义老师类
class Teacher: '''定义老师类,可记录登录状态,可具有查看所带班级和所教课程的功能''' status_dict = { 'username': None, 'status': False } def __init__(self, teacher_name, teacher_passwd='passwd', teach_course='course', teach_class='class'): self.teacher_name = teacher_name self.teacher_passwd = teacher_passwd self.teach_course = teach_course self.teach_class = teach_class def decorator_t(f): def inner(*args, **kwargs): # 判断登录状态 if Teacher.status_dict['status']: ret = f(*args, **kwargs) return ret else: print("您还没有登陆,请输入账号密码进行登陆!") return login('teacherinfo.txt', Teacher) return inner @decorator_t def view_class(self, teach_name, list_index): '''查看所教的班级''' with open('teacherinfo.txt', encoding='utf-8') as t2: for line in t2: if line.strip().split('=')[0] == Teacher.status_dict['username']: teach_course = line.strip().split('=')[list_index] print("您所教的%s为:%s" % (teach_name, teach_course)) break else: pass else: print("没有查到信息") @decorator_t def view_student(self): '''查看班级的学生''' with open('teacherinfo.txt', encoding='utf-8') as t3: for line in t3: if line.strip().split('=')[0] == Teacher.status_dict['username']: teach_course = line.strip().split('=')[3] with open('studentinfo.txt', encoding='utf-8') as t4: user_list = [] for i in t4: course_name = i.strip().split('=')[2] user_name = i.strip().split('=')[0] if course_name == teach_course: user_list.append(user_name) print("学员列表如下:", user_list)
9 定义学生类
class Student: '''定义学生类,可记录登录状态,有查看班级和课程的功能''' status_dict = { 'username': None, 'status': False } def __init__(self, student_name, student_passwd='passwd', student_class='class1'): self.student_name = student_name self.student_passwd = student_passwd self.student_class = student_class def decorator_s(f): def inner(*args, **kwargs): # 判断登录状态 if Student.status_dict['status']: ret = f(*args, **kwargs) return ret else: print("您还没有登陆,请输入账号密码进行登陆!") return login('studentinfo.txt', Student) return inner @decorator_s def view_class(self): '''查看自己的班级''' with open('studentinfo.txt', 'r', encoding='utf-8') as fl: for line in fl: line_list = line.strip().split('=') # 判断用户名 # if stu1.student_name.upper()==line_list[0].upper(): if Student.status_dict['username'].upper() == line_list[0].upper(): student1 = Student(line_list[0], line_list[1], line_list[2]) student1.student_course = line_list[3] with open('classinfo.txt', encoding='utf-8') as vcc: for i in vcc: class_info = i.strip().split('=') if class_info[0].upper() == student1.student_class.upper(): class2 = Class(class_info[0], class_info[1], class_info[2], class_info[3]) print("您的班级为:", class2.class_name) print("班级详情如下:\n 班级名称:%s,所教课程:%s,地点:%s,老师:%s" \ % (class2.class_name, class2.class_course, \ class2.class_location, class2.class_teacher)) break else: pass else: print("班级不存在") else: pass @decorator_s def view_course(self): '''查看自己的课程''' with open('studentinfo.txt', 'r', encoding='utf-8') as fl, \ open('courseinfo.txt', 'r', encoding='utf-8') as vc2: for line in fl: line_list = line.strip().split('=') if Student.status_dict['username'].upper() == line_list[0].upper(): stu_class = line_list[3] for i in vc2: info = i.strip().split('=') if info[0].upper() == stu_class.upper(): # course = i.split('=')[0] course1 = Course(info[0], info[1], info[2], info[3]) print("您的课程为:", course1.course_name) print("课程详细为:\n 课名称:%s,周期:%s,价格:%s,地点:%s" \ % (course1.course_name, course1.course_time, \ course1.course_price, course1.course_location)) break else: pass else: print("没有此课程信息")
10 定义管理员类
class Manager: status_dict = { 'username': None, 'status': False } def __init__(self, manager_name, manager_passwd='passwd'): self.manager_name = manager_name self.manager_passwd = manager_passwd def decorator_m(f): def inner(*args, **kwargs): # 判断登录状态 if Manager.status_dict['status']: ret = f(*args, **kwargs) return ret else: print("您还没有登陆,请输入账号密码进行登陆!") return login('managerinfo.txt', Manager) return inner @decorator_m def create_school(self): '''管理员创建学校''' school_name = myinput("请输入校名:") location = myinput("请输入所在地点:").strip() school1 = School(location, school_name) with open('schoolinfo.txt', 'a+', encoding='utf-8') as s1: s1.write("%s=%s\n" % (school1.school_name, school1.location)) print("学校 %s 创建成功!" % school_name) print("学校名称:%s,学校地点:%s" % (school_name, location)) @decorator_m def create_course(self): '''管理员创建课程''' course_name = myinput("请输入课程名:").strip() course_time = myinput("请输入课程周期:").strip() course_price = myinput("请输入课程价格:").strip() course_location = myinput("请输入课程所在地点:").strip() cour1 = Course(course_name, course_time, course_price, course_location) with open('courseinfo.txt', 'a+', encoding='utf-8') as cou1: cou1.write("%s=%s=%s=%s\n" % (cour1.course_name, cour1.course_time, \ cour1.course_price, cour1.course_location)) print("创建课程 %s 成功" % cour1.course_name) print("课程名称:%s,课程周期:%s,课程价格:%s,课程地点:%s" \ % (cour1.course_name, cour1.course_time, cour1.course_price, cour1.course_location)) @decorator_m def create_class(self): '''管理员创建班级''' while True: class_name = myinput("请输入班级名:").strip() with open('teacherinfo.txt', 'r', encoding='utf-8') as cc2: class_name_list = cc2.readlines() name_info = [] for info in class_name_list: name_info.append(info.strip().split('=')[0]) if class_name in name_info: print("班级 %s 已经存在,请重新输入" % class_name) print("已经存在班级列表:", name_info) else: class_location = myinput("请输入班级所在校区:").strip() class_course = myinput("请输入班级的课程:").strip() class_teacher = myinput("请输入授课老师:").strip() c1 = Class(class_name, class_location, class_course, class_teacher) with open('classinfo.txt', 'a+', encoding='utf-8') as cf1: cf1.write( "%s=%s=%s=%s\n" % (c1.class_name, c1.class_location, c1.class_course, c1.class_teacher)) print("创建班级 %s 成功!" % c1.class_name) print("班级名称:%s,班级地点:%s,班级课程:%s,班级教课老师:%s" \ % (c1.class_name, c1.class_location, c1.class_course, c1.class_teacher)) return False @decorator_m def create_teacher(self): '''管理员创建老师''' while True: teacher_name = myinput("请输入教师姓名:").strip() with open('teacherinfo.txt', 'r', encoding='utf-8') as t2: teacher_name_list = t2.readlines() name_info = [] for info in teacher_name_list: name_info.append(info.strip().split('=')[0]) if teacher_name in name_info: print("老师已存在,请重新输入") print("已有老师列表:", name_info) else: teacher_passwd = myinput("请输入教师的密码:").strip() while True: ###根据老师所教课程,自动判断所在校区,linux、python在北京,go在上海 teach_course = input("请输入教师所教课程:").strip() if teach_course.upper() == 'python'.upper() or teach_course.upper() == 'linux'.upper(): teacher_location = '北京' elif teach_course.upper() == 'go'.upper(): teacher_location = '上海' else: print("输入有误,请重新输入,课程只有python,linux,go") return True teach_class = myinput("请输入教师所教班级:").strip() t1 = Teacher(teacher_name, teacher_passwd, teach_course, teach_class) with open('teacherinfo.txt', 'a+', encoding='utf-8') as ct1: ct1.write('%s=%s=%s=%s=%s\n' % ( t1.teacher_name, t1.teacher_passwd, t1.teach_course, t1.teach_class, teacher_location)) print("创建教师: %s 成功!并且以自动添加地点:%s" % (t1.teacher_name, teacher_location)) print("创建教师的信息如下:\n'姓名':%s,'密码':%s,'所教课程':%s,'所教班级':%s,'地点':%s" \ % (t1.teacher_name, t1.teacher_passwd, \ t1.teach_course, t1.teach_class, teacher_location)) return False @decorator_m def create_student(self): '''管理员创建学生''' student_name = myinput("请输入学员姓名:").strip() student_passwd = myinput("请输入学员密码:").strip() while True: student_class = myinput("请输入学员所属班级:").strip() with open('classinfo.txt', 'r', encoding='utf-8') as c2: content = c2.readlines() class_info = [] for info in content: a = info.strip().split('=')[0].upper() class_info.append(a) class_course = info.strip().split('=')[2].upper() if student_class.upper() in class_info: s1 = Student(student_name, student_passwd, student_class) with open('studentinfo.txt', 'a+', encoding='utf-8') as cs1: cs1.write('%s=%s=%s=%s\n' \ % (s1.student_name, s1.student_passwd, s1.student_class, class_course)) print("学员 %s 添加成功!并自动关联班课程%s" % (s1.student_name, class_course)) print("学员姓名:%s,密码:%s,学员班级:%s" \ % (s1.student_name, s1.student_passwd, s1.student_class)) return False else: print("你所输入的班级不存在请重新输入,或先创建班级") print("现在的班级有:%s" % [line for line in class_info])
11 主程序进程
#运行初始化函数 initialize() while True: # 这是主进程,控制整个程序 # 打印首页选择信息 print("""请选择角色: 1 学生 2 教师 3 管理员 4 退出系统""") userchoice = input("请输入你的选择:").strip() if userchoice == '1': while True: print("""请选择功能: 1 登录 2 查看班级 3 查看课程 4 返回上级 5 注销 """) stu_choice = input("请输入你要选择的功能:").strip() if stu_choice == '1': login('studentinfo.txt', Student) elif stu_choice == '2': Student.view_class('a') elif stu_choice == '3': Student.view_course('b') elif stu_choice == '4': break elif stu_choice == '5': Student.status_dict['username'] = None Student.status_dict['status'] = False else: print("输入有误,请重新输入") elif userchoice == '2': print("This is teacher view") while True: print("""请选择功能: 1 登录 2 查看所教的班级 3 查看所教的课程 4 查看班级学员列表 5 返回上级 6 注销 """) stu_choice = input("请输入你要选择的功能:").strip() if stu_choice == '1': login('teacherinfo.txt', Teacher) elif stu_choice == '2': Teacher.view_class('a', '班级', 3) elif stu_choice == '3': Teacher.view_class('b', '课程', 2) elif stu_choice == '4': Teacher.view_student('c') elif stu_choice == '5': break elif stu_choice == '6': Teacher.status_dict['username'] = None Teacher.status_dict['status'] = False print("注销成功") else: print("输入有误,请重新输入") elif userchoice == '3': while True: print("""请选择功能: 1 登录 2 创建学校 3 创建班级 4 创建讲师 5 创建课程 6 创建学员 7 返回上级 8 注销 """) manager_choice = input("请输入所选的功能(1-8):").strip() if manager_choice == '1': login('managerinfo.txt', Manager) elif manager_choice == '2': Manager.create_school('a') elif manager_choice == '3': Manager.create_class('b') elif manager_choice == '4': Manager.create_teacher('c') elif manager_choice == '5': Manager.create_course('d') elif manager_choice == '6': Manager.create_student('e') elif manager_choice == '7': break elif manager_choice == '8': Manager.status_dict['username'] = None Manager.status_dict['status'] = False print("注销成功!") else: print("输入有误,请重新输入") elif userchoice == '4': print("欢迎再次使用本系统") exit() else: print("输入有误")
四、运行结果如下
1 学生视图
1.1 主程序选择界面
1.2 学生登录
1.3 查看自己班级功能
1.4 注销功能
1.5 返回上级
2 教师视图
2.1 选择教师界面
2.2 教师登录界面
2.3 教师查看所带班级
2.4 教师查看班级学员
3 管理员视图
3.1 管理员登录
3.2 管理员创建班级
3.3 管理员创建老师
3.4 管理员注销
3.5 管理员返回上级
4 退出系统
上一篇: Go语言并发编程 sync.Once
下一篇: 老生常谈C语言链表小结