python之路——作业:学生选课系统
一、作业要求:
选课系统:
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供两个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
二、程序目录说明
学生选课系统/
|-- bin/
| |-- __init__.py
| |-- start.py #程序启动的主入口
|
|-- conf/
| |-- __init__.py
| |-- setting.py #配置文件
|
|-- db/
| |-- admin/ #管理员数据文件夹
| |-- charge/ #学生缴费数据文件夹
| |-- classes/ #班级数据文件夹
| |-- course/ #课程数据文件夹
| |-- school/ #学校数据文件夹
| |-- score/ #学生成绩数据文件夹
| |-- student/ #学生数据文件夹
| |-- teacher/ #老师数据文件夹
|
|-- lib/
| |-- __init__.py
| |-- common.py #公共函数
| |-- main.py #各大类
|
|-- log/
| |-- log_sys.log #日志文件
|
|-- src/
| |-- __init__.py
| |-- admin.py #管理员系统
| |-- func.py #主逻辑函数
| |-- student.py #学生系统
| |-- teacher.py #老师系统
|
|-- 流程图
|-- README.txt
三、程序已实现功能
程序实现了以下功能:
1、创建管理员(已有管理员:japhi、alex;密码都是123)
2、管理员创建老师(已有老师:李杰、林海峰、武佩奇)
3、管理员创建班级(已有班级:go1班、python1班、linux1班)
4、管理员创建课程(已有课程:go、python、linux)
5、管理员查看老师、班级、课程信息
6、老师修改学生成绩
7、老师查看班级和学生信息
8、学生注册及缴费(已有学生:alex、张三、李四、王五、赵六)
9、数据序列号保存并读取
四、流程图
五、作业代码
1、bin文件夹下程序启动主入口start.py:
import os,sys frame = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),"src") sys.path.append(frame) from func import sys_func if __name__ == '__main__': sys_func()
2、conf文件夹下配置文件seetings.py:
import os,sys basdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #定义环境变量 sys.path.append(basdir) log_dir = os.path.join(basdir,"log")
3、lib文件夹下公共函数common.py:
import logging,os,pickle,sys,uuid frame = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(frame) from conf import setting def sys_logging(content,levelname): ''' 程序记录日志函数 :param content: 日志的内容 :param levelname: 日志的等级 :return: none ''' _filename = os.path.join(setting.log_dir,"log_sys.log") log = logging.getLogger(_filename) logging.basicConfig(filename=_filename,level=logging.INFO,format='%(asctime)s-%(levelname)s-%(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') if levelname == 'debug': logging.debug(content) elif levelname == 'info': logging.info(content) elif levelname == 'warning': logging.warning(content) elif levelname == 'error': logging.error(content) elif levelname == 'critical': logging.critical(content) def printer(msg,msg_type): ''' 程序不同信息打印的字体颜色 :param msg: 打印信息 :param msg_type: 打印信息的类型 :return: none ''' if msg_type == "info": show_msg = "\033[1;33m%s\033[0m"%msg elif msg_type == "error": show_msg = "\033[1;31m%s\033[0m"%msg elif msg_type == "msg": show_msg = "\033[1;37m%s\033[0m"%msg else: show_msg = "\033[1;32m%s\033[0m"%msg print(show_msg.center(60,'-')) sys_logging(msg,msg_type)
主类代码main.py:
import os,pickle,sys,time frame = os.path.dirname(os.path.abspath(__file__)) sys.path.append(frame) from common import printer class BasicObj(object): ''' 基类 ''' def save(self): basedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) file_path = os.path.join(os.path.join(os.path.join(basedir,"db"),self.form),self.name) with open(file_path,"wb") as f: pickle.dump(self,f) @staticmethod def gain_data(name): basedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) file_path = os.path.join(os.path.join(basedir,"db"),name) # print(file_path) res_list = [] for file in os.listdir(file_path): filename = os.path.join(file_path,file) res_list.append(pickle.load(open(filename,"rb"))) return res_list class School(BasicObj): ''' 学校类 ''' def __init__(self,form,name,city): self.form = form self.name = name self.city = city self.create_time = time.strftime('%Y-%m-%d') class Student(BasicObj): ''' 学生类 ''' def __init__(self,form,school,classes,name,psd): self.form = form self.school = school self.classes = classes self.name = name self.psd = psd self.create_time = time.strftime('%Y-%m-%d') class Teacher(BasicObj): ''' 老师类 ''' def __init__(self,form,name,level): self.form = form self.name = name self.level = level self.create_time = time.strftime('%Y-%m-%d') class Course(BasicObj): ''' 课程类 ''' def __init__(self,form,name,price,period,school): self.form = form self.name = name self.price = price self.period = period self.school = school self.create_time = time.strftime('%Y-%m-%d') class Classes(BasicObj): ''' 班级类 ''' def __init__(self,form,school,teacher,course,name): self.form = form self.school = school self.teacher = teacher self.course = course self.name = name class Admin(BasicObj): ''' 管理员类 ''' def __init__(self,form,name,psd): self.form = form self.name = name self.psd = psd self.create_time = time.strftime('%Y-%m-%d') @staticmethod def login(): ''' 管理员登陆系统 :return: 登陆成功返回True,否则返回False ''' sign = False ad_name = input("请输入您的用户名>>>").strip() ad_psd = input("请输入密码>>>").strip() admin_dic = {} for obj in BasicObj.gain_data("admin"): admin_dic[obj.name] = obj.psd if admin_dic.get(ad_name) == ad_psd: printer("登陆成功","info") sign = True else: printer("用户名或密码错误","error") return sign class StudentScore(BasicObj): ''' 学生分数类 ''' def __init__(self,form,name,score): self.form = form self.name = name self.score = score class StudentCharge(BasicObj): ''' 学生缴费类 ''' def __init__(self,form,name,charge): self.form = form self.name = name self.charge = charge
4、src文件下管理员逻辑函数admin.py:
import os,sys frame = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),"lib") sys.path.append(frame) from common import printer from main import BasicObj,Admin,Teacher,Course,Classes def exist_parse(data,list): ''' 对用户数的data是否存在于实例文件进行判断函数 :param data: 用户输入的数据 :param list: 用户输入的数据类型对应的实例对象列表 :return: 信号 ''' sign = True begin_list = [] for obj in list: begin_list.append(obj.name) if data not in begin_list: printer("您输入的[%s]不存在"%data,"a") sign = False return sign def exist_school(data,list): ''' 对用户选择的校区是否存在进行判断的函数 :param data: 用户输入的校区 :param list: 校区实例对象列表 :return: 信号 ''' sign = True begin_list = [] for obj in list: begin_list.append(obj.city) if data not in begin_list: printer("您输入的[%s]不存在"%data,"a") sign = False return sign def exist(data,list): ''' 对用户输入的数据是否存在实例对象进行判断的函数 :param data: 用户输入的数据 :param list: 实例对象列表 :return: 信号 ''' begin_list = [] sign = True for obj in list: begin_list.append(obj.name) if data in begin_list: printer("[%s]已存在"%data,"error") sign =False return sign def creat_teacher(): ''' 创建老师实例对象函数 :return: none ''' teacher_list = BasicObj.gain_data("teacher") while True: printer("创建老师信息","info") name = input("请输入您创建的老师的名字>>>") sign = exist(name,teacher_list) if sign: level = input("请输入您创建的老师的等级>>>") teacher0 = Teacher("teacher",name,level) teacher0.save() data = "姓名[%s]-等级[%s]"%(name,level) printer(data,"info") break else: continue def view_teacher(): ''' 查看老师信息的函数 :return: none ''' teacher_list = BasicObj.gain_data("teacher") printer("----------老师信息----------","info") for obj in teacher_list: teacher_info = "姓名[%s]-等级[%s]-注册时间[%s]"%(obj.name,obj.level,obj.create_time) printer(teacher_info,"info") def creat_class(): ''' 创建班级函数 :return: none ''' class_list = BasicObj.gain_data("classes") teacher_list = BasicObj.gain_data("teacher") school_list = BasicObj.gain_data("school") course_list = BasicObj.gain_data("course") while True: printer("创建班级信息", "info") school_data() school = input("请选择校区>>>") sign0 = exist_school(school,school_list) if sign0: teacher_data() teacher = input("请选择授课老师>>>") sign1 = exist_parse(teacher,teacher_list) if sign1: course_data() course = input("请选择班级课程>>>") sign2 = exist_parse(course,course_list) if sign2: name = input("请输入您创建的班级名称>>>") class0 = Classes("classes",school,teacher,course,name) sign3 = exist(name,class_list) if sign3: class0.save() data = "校区[%s]-老师[%s]-课程[%s]-班级[%s]" % (school,teacher,course,name) printer(data, "info") break def view_class(): ''' 查看班级信息函数 :return: none ''' class_list = BasicObj.gain_data("classes") if len(class_list) != 0: printer("----------班级信息----------", "info") for obj in class_list: class_info = "校区[%s]-老师[%s]-课程[%s]-班级[%s]"%(obj.school,obj.teacher,obj.course,obj.name) printer(class_info,"info") else: printer("暂无班级信息","a") def creat_course(): ''' 创建课程函数 :return: none ''' course_list = BasicObj.gain_data("course") school_list = BasicObj.gain_data("school") while True: printer("创建课程信息", "info") school_data() school= input("请选择校区>>>") sign0 = exist_school(school,school_list) if sign0: name = input("请输入您创建的课程的名字>>>") sign1 = exist(name,course_list) if sign1: price = input("请输入您创建的课程的价格>>>") period = input("请输入您创建的课程的周期>>>") course0 = Course("course",name,price,period,school) course0.save() data = "姓名[%s]-价格[%s]-周期[%s]" % (name,price,period) printer(data, "info") break def view_course(): ''' 查看课程函数 :return: none ''' course_list = BasicObj.gain_data("course") printer("----------课程信息----------", "info") for obj in course_list: course_info = "课程名[%s]-价格[%s]-周期[%s]-校区[%s]"%(obj.name,obj.price,obj.period,obj.school) printer(course_info,"info") def show_msg(): ''' 打印管理员功能选择以及处理输入端哦选择 :return: none ''' tag = False while not tag: choice = {"2": creat_teacher, "1": view_teacher,"4": creat_class, "3": view_class,"6": creat_course, "5": view_course} msg = '''----------管理员系统---------- 1、查看老师 2、创建老师 3、查看班级 4、创建班级 5、查看课程 6、创建课程 ''' printer(msg, "info") choose = input("请输入您选择>>>").strip() if choose.isdigit() and 0 < int(choose) <= len(choice): choice[choose]() else: printer("您输入的选择有误","error") def admin_serve(): ''' 管理员系统主函数 :return: none ''' sign = Admin.login() if sign: show_msg() def school_data(): ''' 打印学校实例对象信息 :return: none ''' school_list = BasicObj.gain_data("school") for obj in school_list: printer("学校[oldboy]-校区[%s]"%obj.city,"msg") def classes_data(): ''' 打印班级实例对象信息 :return: none ''' class_list = BasicObj.gain_data("classes") for obj in class_list: printer("可选班级:%s"%(obj.name),"msg") def teacher_data(): ''' 打印老师实例对象信息 :return: none ''' teacher_list = BasicObj.gain_data("teacher") for obj in teacher_list: printer("老师[%s]-等级[%s]"%(obj.name,obj.level),"msg") def course_data(): ''' 打印课程实例对象信息 :return: none ''' course_list = BasicObj.gain_data("course") for obj in course_list: printer("课程名[%s]-价格[%s]-周期[%s]-校区[%s]"%(obj.name,obj.price,obj.period,obj.school),"msg")
func.py 逻辑主函数:
import os,sys frame = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),"lib") sys.path.append(frame) from common import printer from admin import admin_serve from teacher import teacher_serve from student import student_serve from main import BasicObj,Admin def initialize(): ''' 管理员初始化函数 :return: none ''' admin_list = BasicObj.gain_data("admin") list_name = [] for obj in admin_list: list_name.append(obj.name) admin_name = input("请输入用户名>>>").strip() if admin_name in list_name: printer("您输入的用户名已存在","error") else: psd = input("请输入密码>>>").strip() admin0 = Admin("admin",admin_name,psd) printer("管理员创建成功","info") admin0.save() def sys_func(): ''' 程序的逻辑判断主函数 :return: ''' choice = {"1":admin_serve,"2":teacher_serve,"3":student_serve,"4":initialize} msg = '''----------欢迎光临选课系统---------- 1、管理员登陆 2、老师登陆 3、学生登陆 4、管理员初始化 ''' while True: printer(msg,"info") choose = input("请输入您选择>>>").strip() if choose.isdigit() and 0 < int(choose) <= len(choice): choice[choose]() else: printer("您输入的选择有误","error") # sys_func()
student.py 学生系统逻辑函数:
import os,sys,time frame = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),"lib") sys.path.append(frame) from common import printer from main import Student,BasicObj,StudentScore,StudentCharge from admin import exist_parse,exist_school,school_data,teacher_data,course_data,classes_data def fuck(name): ''' 对学生是否缴费进行判断的函数 :param name: 学生名字 :return: none ''' tag = False charge_list = BasicObj.gain_data("charge") for obj in charge_list: if obj.name == name : if int(obj.charge) != 0: tag = True return tag def goto_class(): ''' 学生上课函数 :return: none ''' choose = input("是否开始上课(Y/N)>>>").strip() if choose == "y": info = '''您正在上课中。。。。。 1、上厕所 2、结束上课 ''' while True: printer(info,"info") what = input("你要干嘛>>>").strip() if what == "1": printer("上完记得冲厕所","msg") elif what == "2":break def student_msg(student): ''' 学生信息以及缴费函数 :param student: 学生名字 :return: none ''' student_list = BasicObj.gain_data("student") class_list = BasicObj.gain_data("classes") course_list = BasicObj.gain_data("course") for obj1 in student_list: if obj1.name == student: classes_info = obj1.classes for obj2 in class_list: if obj2.name == classes_info: course_info = obj2.course for obj3 in course_list: if obj3.name == course_info: printer("您的班级信息", "info") printer("校区[%s]-老师[%s]-课程[%s]" % (obj2.school, obj2.teacher, obj2.course), "info") printer("您的课程信息","info") printer("名称[%s]-价格[%s]-周期[%s]"%(obj3.name,obj3.price,obj3.period),"info") sign = fuck(student) if not sign: choose = input("您还未缴纳费用,请选项是否缴费(Y/N)>>>").strip() if choose == "y": price = input("请输入您要缴纳的费用>>>") if int(price) == int(obj3.price): printer("缴费成功","info") charge0 = StudentCharge("charge",student,obj3.price) charge0.save() goto_class() elif int(price) < int(obj3.price): printer("你输入的费用不够,缴费失败","error") elif int(price) > int(obj3.price): left_money = int(price) - int(obj3.price) printer("缴费成功,您缴纳了%s,还剩下%s"%(obj3.price,left_money),"info") charge0 = StudentCharge("charge", student, obj3.price) charge0.save() goto_class() else: printer("缴费失败", "error") else: printer("您已缴费,可以开始上课","info") goto_class() def student_regist(student): ''' 学生登录注册函数 :param student: 学生名字 :return: none ''' school_list = BasicObj.gain_data("school") class_list = BasicObj.gain_data("classes") while True: name = input("请输入您的名字>>>").strip() school_data() school = input("请选择您入学的校区>>>").strip() if exist_school(school,school_list): classes_data() classes = input("请输入您要入学的班级>>>").strip() if exist_parse(classes,class_list): psd = input("请输入您的密码>>>").strip() student0 = Student("student",school,classes,name,psd) student0.save() charge = 0 charge0 = StudentCharge("charge",name,charge) charge0.save() score = 0 student_score0 = StudentScore("score",name,score) student_score0.save() data = "校区[%s]-班级[%s]-姓名[%s]" % (school,classes,name) printer("注册成功","error") printer(data,"info") student_msg(student) break def student_serve(): ''' 学生系统主函数 :return: none ''' student_dic = {} student_list = BasicObj.gain_data("student") for obj in student_list: student_dic[obj.name] = obj.psd student = input("请输入您的姓名>>>").strip() psd = input("请输入密码>>>").strip() if student_dic.get(student) == psd: student_msg(student) else: printer("您尚未注册,请先注册","a") student_regist(student)
teacher.py 老师系统逻辑函数:
import os,sys,pickle frame = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),"lib") sys.path.append(frame) from common import printer from main import Teacher,BasicObj,StudentScore from admin import exist_parse,school_data,teacher_data,course_data def check_info(data,list): ''' 老师信息在班级的处理函数 :param data: 老师的名字 :param list: 班级对象实例列表 :return: 老师的班级列表 ''' res = [] for obj in list: if obj.teacher == data: res.append(obj) return res def class_manage(teacher): ''' 班级管理函数 :param teacher: 老师的名字 :return: 信号和老师班级列表 ''' sign = False class_list = BasicObj.gain_data("classes") res = check_info(teacher,class_list) printer("班级信息","info") if len(res) != 0: for i in res: printer("校区[%s]-老师[%s]-课程[%s]-班名[%s]"%(i.school,i.teacher,i.course,i.name),"info") sign = True else: printer("您还没有自己的班级,请先创建班级","error") sign = False return sign,res def attend_class(teacher): ''' 老师选择上课班级的函数 :param teacher:老师名字 :return: none ''' sign,res = class_manage(teacher) class_name = [] if sign : while True: choose = input("请输入您要选择上课的班级名>>>").strip() for i in res: class_name.append(i.name) if choose in class_name: printer("选择上课班级成功","info") break else: printer("您输入的班级不存在","error") def view_student(teacher): ''' 查看班级学生的函数 :param teacher: 老师名字 :return: none ''' class_list = BasicObj.gain_data("classes") course_list = BasicObj.gain_data("course") student_list = BasicObj.gain_data("student") for obj1 in class_list: if obj1.teacher == teacher: class_name = obj1.name for obj2 in student_list: if obj2.classes == class_name: printer("%s学生:%s"%(obj2.classes,obj2.name),"info") def modify_score(teacher): ''' 修改学生成绩的函数 :param teacher: 老师名字 :return: none ''' class_list = BasicObj.gain_data("classes") student_list = BasicObj.gain_data("student") score_list = BasicObj.gain_data("score") stu_list = [] for obj1 in class_list: if obj1.teacher == teacher: class_name = obj1.name for obj2 in student_list: if obj2.classes == class_name: stu_list.append(obj2.name) for obj3 in score_list: if obj3.name in stu_list: printer("学生%s:%s分"%(obj3.name,obj3.score),"info") # for i in stu_list: # printer("学生%s:0分"%i,"info") st = input("请输入您要更改的学生的分数>>>") if st in stu_list: sc = input("请输入您修改的成绩(0-100)>>>>") if sc.isdigit and 0 <= int(sc) <= 100: st_score = StudentScore("score",st,int(sc)) st_score.save() printer("修改成功","info") else: printer("您输入的分数错误","error") else: printer("您输入的学生不存在","error") def teacher_msg(teacher): ''' 老师系统功能函数选项 :param teacher: 老师名字 :return: none ''' choice = {"2": attend_class, "1": class_manage, "4": modify_score, "3": view_student} msg = '''----------老师系统---------- 1、管理班级 2、选择班级 3、查看学生 4、修改成绩 5、返回 ''' tag = False while not tag: printer(msg, "info") choose = input("请输入您的功能选项>>>").strip() if choose.isdigit() and 0 < int(choose) <= len(choice): choice[choose](teacher) elif choose == "5": tag = True else: printer("您输入的选择有误", "error") def teacher_serve(): ''' 老师系统主函数 :return: none ''' teacher_list = BasicObj.gain_data("teacher") teacher_data() teacher = input("请输入您的姓名>>>").strip() sign = exist_parse(teacher,teacher_list) if sign: teacher_msg(teacher)
六、界面显示