一.需求分析
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linuxpy 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
6. 创建讲师角色时要关联学校,
6. 提供两个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
二.程序设计原理图
三.代码实现
工程的创建按照较为简便的格式来描述,大致目录结构如图:
选课系统/
|-- bin
| |-- __init__.py
|
|-- db/
| |--database/
| |-- 北京电影学院.pickle
| |-- 上海戏剧学院.pickle
| |-- __init__.py
|
|-- core/
| |-- __init__.py
| |-- db_handle.py
| |-- db_opt.py
| |-- main.py
| |-- school_class.py
|
|-- conf/
| |-- __init_py.py
| |-- setting.py
|
|-- __init__.py
|-- requirements.txt
|-- README
setting.py程序代码如下:
1 import os 2 import sys 3 4 BASE_DIR = os.path.abspath(r'..') 5 6 # print(os.environ) 7 8 DATA_BASE ={ 9 'engine' :'file_storage', 10 'suffix':'pickle', 11 'name': 'database', 12 'path':'%sdb'%BASE_DIR 13 } 14 15 # print(DATA_BASE['path'])
db_handle.py程序代码如下:
1 ''' 2 handle all the database interactions 3 ''' 4 5 def file_handle_db(conn_param): 6 ''' 7 parse the db file path 8 :param conn_param: the db connection params set in settings 9 :return: file path 10 ''' 11 db_path = '%s'%conn_param['path'] 12 return db_path 13 14 def mysql_db_handle(conn_parms): 15 ''' 16 17 :param conn_parms: 18 :return: 19 ''' 20 pass 21 22 def db_handle(conn_param): 23 ''' 24 prase all db type 25 :param conn_param: db config 26 :return: 27 ''' 28 if conn_param['engine'] == 'file_storage': 29 return file_handle_db(conn_param) 30 elif conn_param['engine'] == 'mysql': 31 return mysql_db_handle(conn_param) 32 else: 33 pass
db_opt.py程序代码如下:
1 import pickle 2 import json 3 import os 4 5 from 课后作业.选课系统.conf import setting 6 from 课后作业.选课系统.core import db_handle 7 8 9 def file_opt_read(account_file,conn_params): 10 ''' 11 use pickle to load data 12 :param account_file: file path 13 :param conn_params: data_base config 14 :return: file data 15 ''' 16 with open(account_file, 'rb') as f: 17 if conn_params['suffix'] == 'pickle': 18 account_data = pickle.load(f) 19 elif conn_params['suffix'] == 'json': 20 account_data = json.load(f) 21 else: 22 return 23 return account_data 24 25 26 def file_opt_wtite(school_file,account_data,conn_params): 27 ''' 28 use pickle to dump data 29 :param school_file: file path 30 :param account_data: jump data 31 :param conn_params: data_base config 32 :return: 33 ''' 34 with open(school_file, 'wb') as f: 35 if conn_params['suffix'] == 'pickle': 36 acc_data = pickle.dump(account_data, f) 37 elif conn_params['suffix'] == 'json': 38 acc_data = json.dump(account_data, f) 39 return True 40 41 42 def database_read(name): 43 ''' 44 to read school data from database 45 :param name: file name 46 :return: 47 ''' 48 db_path = db_handle.db_handle(setting.DATA_BASE)#获取路径 49 account_file = "%s\%s\%s.%s" % (db_path,setting.DATA_BASE['name'],name,setting.DATA_BASE['suffix']) 50 if os.path.isfile(account_file): 51 return file_opt_read(account_file,setting.DATA_BASE) 52 else: 53 return False 54 55 56 57 def database_write(account_data): 58 ''' 59 after updated transaction or account data , dump it back to file db 60 :param account_data: 61 :return: 62 ''' 63 db_path = db_handle.db_handle(setting.DATA_BASE) 64 school_file = "%s/%s/%s.%s" %(db_path,setting.DATA_BASE['name'],account_data.name,setting.DATA_BASE['suffix']) 65 return file_opt_wtite(school_file,account_data,setting.DATA_BASE)
school_class.py程序代码如下:
1 from 课后作业.选课系统.core import db_opt 2 3 class Course(object): 4 ''' 5 create a course class 6 :param name:Course name price: Course price time :Course learning cycle 7 :return: 8 ''' 9 def __init__(self,name,price,time): 10 self.name = name 11 self.price = price 12 self.time = time 13 14 def tell(self): 15 print(''' 16 --- Info of Course [%s] --- 17 Name = %s 18 Price = %s 19 Time = %s 20 '''%(self.name,self.name,self.price,self.time)) 21 22 class Class(object): 23 ''' 24 create a class class 创建一个班级类 25 :param name:class name ,course:a course class ,teacher:a teacher class 26 :return: 27 ''' 28 def __init__(self,name,course,teacher): 29 self.name = name 30 self.course = course 31 self.teacher = teacher 32 self.student = [] 33 def tell(self): 34 print(''' 35 --- Info of %s --- 36 Class :%s 37 Course :%s 38 Teacher :%s 39 '''%(self.name,self.name,self.course,self.teacher)) 40 41 class School(object): 42 ''' 43 create a school class 创建一个班级类 44 :param name:school name ,addr:school addr ,teachers[]:a list save in memory that info of teachers be hired 45 :param students[]:a list save in memory that info of students be enrolled 46 :param courses[]:a list save in memory that info of courses be created 47 :param classes[]:a list save in memory that info of classes be created 48 :return: 49 ''' 50 def __init__(self,name,addr): 51 self.name = name 52 self.addr = addr 53 self.teachers = [] 54 self.students = [] 55 self.courses = [] 56 self.classes = [] 57 def tell(self): 58 print(''' 59 --- Info of School :%s --- 60 Name : %s 61 Addr : %s 62 '''%(self.name,self.name,self.addr)) 63 64 def hire(self,teacher,salary): 65 teacher.school = self.name 66 teacher.salary =salary 67 self.teachers.append(teacher) 68 print("%s has hire %s to be a teacher"%(self.name,teacher.name)) 69 70 def enroll(self,student,student_class): 71 self.students.append(student) 72 student_class.student.append(student) 73 student.choose_school(self.name) 74 student.choose_class(student_class) 75 print("%s has enroll %s to be a student"%(self.name,student.name)) 76 77 def create_course(self,course_name,price,time):#创建课程类 78 self.courses.append(Course(course_name,price,time)) 79 print("%s has creat course[%s]"%(self.name,course_name)) 80 81 def create_class(self,Class_name,course,teacher): 82 info = Class(Class_name,course.name,teacher.name) 83 self.classes.append(info) 84 teacher.Class.append(info) 85 86 class SchoolMember(object): 87 ''' 88 it's a base class include of teacher and student 89 :param 90 :return 91 ''' 92 def __init__(self,name,age,sex): 93 self.name = name 94 self.age = age 95 self.sex = sex 96 def tell(self):#个人信息,子类来完善 97 pass 98 99 class Teacher(SchoolMember): 100 ''' 101 it's a subclass class Inheritance by SchoolMember to create a Teacher object 102 :param 103 :return 104 ''' 105 def __init__(self,name,age,sex,course,salary='null',school='null'): 106 super(Teacher,self).__init__(name,age,sex) 107 self.salary = salary 108 self.course = course 109 self.school = school 110 self.Class =[] 111 112 def tell(self): 113 print(''' 114 --- Info of %s --- 115 Name = %s 116 Age = %s 117 Sex = %s 118 Salary = %s 119 Course = %s 120 Shool = %s 121 '''%(self.name,self.name,self.age,self.sex,self.salary,self.course,self.school)) 122 123 class Student(SchoolMember): 124 ''' 125 it's a subclass class Inheritance by SchoolMember to create a Student object 126 :param 127 :return 128 ''' 129 def __init__(self, name, age, sex,school='null',grade='null',Class='null',tuition = False): 130 super(Student, self).__init__(name, age, sex) 131 self.__school = school 132 self.grade = grade 133 self.__Class = Class 134 self.__tuition = tuition 135 136 def choose_school(self,name): 137 self.__school = name 138 139 def choose_grade(self,grade): 140 self.grade = grade 141 print("%s grade change success !!!"%self.name) 142 143 def choose_class(self,Class): 144 self.__Class = Class.name 145 print("%s choose class success !!!"%self.name) 146 147 def tuition(self): 148 self.__tuition = True 149 print("%s tuituin success !!!"%self.name) 150 151 def tell(self): 152 print(''' 153 --- Info of %s --- 154 Name = %s 155 Age = %s 156 Sex = %s 157 School = %s 158 Class = %s 159 Grade = %s 160 tuition = %s 161 '''%(self.name,self.name,self.age,self.sex,self.__school,self.__Class,self.__grade,self.__tuition))
main.py程序代码如下:
1 from 课后作业.选课系统.core import db_opt 2 from 课后作业.选课系统.core import school_class 3 4 5 def creat_school(): 6 ''' 7 create a school class 8 :return: 9 ''' 10 name = input('please input the school name:').strip() 11 addr = input('Plsase input the school addr:').strip() 12 13 School = school_class.School(name,addr) 14 if(db_opt.database_write(School)): 15 print("