程序名称: 选课系统

角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程 
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
6. 创建讲师角色时要关联学校, 
7. 提供两个角色接口
8. 学员视图, 可以注册, 交学费, 选择班级,
9. 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩 
10. 管理视图,创建讲师, 创建班级,创建课程

11. 上面的操作产生的数据都通过pickle序列化保存到文件里

之前low的代码:

移步-》》http://www.cnblogs.com/lianzhilei/p/5832691.html

想法:

选课系统是在第六节课学完面向对象时Alex给留的练习作业,当时写的程序得了个B+,当时写出了觉得自己还挺厉害的,不过现在看之前的代码惨不忍睹,纯粹为了实现要求而实现的功能,程序的扩展性很差;刚好最近复习到面向对象的内容,觉得这个作业确实不错(逻辑性很强),准备重新写一下,加上之前看过天帅的代码框架,觉得有一些启发,下面就开始搞起来!

写这个博客的目的,一是为了方便自己以后用到时去查询,二是记录下自己的思路,以后再看的时候,明白当前的想法(有想法的对比,才能看出自己进步了多少)

开始搞:

写程序的第一步就会遇到问题,因为alex给出的要求确实太乱了,这么多关联关系根本理不清,首先先把要求换成自己能懂得话,把逻辑关系重新屡一下

先来个框架:

  三个视图:学员视图 讲师视图 管理视图  三个视图即为三个管理接口

  五个角色:学校、学员、课程、讲师、班级  五个角色即需要定义5个类

把要求对应成自己看懂的话:

  ① 创建北京、上海 2 所学校    分析:定义学校类,通过类去创建学校实例
  ② 创建linux , python , go 3个课程 ,linux\py 在北京开,go 在上海开  分析:定义课程类,通过课程类去创建课程实例

   ③ 课程包含,周期,价格,通过学校创建课程   分析:课程类里要包含周期、价格  课程实例通过学校类去创建

  ④ 班级关联课程、班级关联讲师  分析:可以创建班级的时候需输入关联的课程,创建讲师的时候需输入关联的班级;一个班级对应一个课程 一个班级对应一个讲师

  ⑤ 通过学校创建班级, 班级关联课程、讲师   分析:跟④一样

  ⑥ 创建学员时,选择学校,关联班级  分析:定义学员类,创建时选择学校,选择班级,通过学校类创建学员实例,班级类里面要有包含学员的信息的字典

  ⑦ 创建讲师角色时要关联学校  分析:之前一样,依然通过学校类去创建讲师实例

  ⑧ 学员视图 可以注册, 交学费, 选择班级    分析:看⑥ 学员选择班级后,通过班级关联的课程,打印课程的学费

  ⑨ 讲师视图, 讲师可以.....bala....bala      分析:讲师视图登录需要讲师名,通过讲师名可以找到对应的班级实例,班级实例里包含班级名,课程名,学员信息等

  注:一个班级对应一个课程 一个班级对应一个讲师

    一个课程可有多个班级

    一个讲师可教授多个班级

    一个学员可学习多个班级的课

分析下管理视图:

        管理视图具有的功能创建讲师, 创建班级,创建课程,这些都是通过学校创建(即通过学校类的方法调用),除了创建以外我们还需要增加查询讲师、班级、课程的功能(查看相应的信息),管理视图要有6个功能

分析下讲师视图:

        讲师视图可查看所授课的班级,班级学生信息  讲师视图具有2个功能

分析下学生视图:

       学生视图,要选择学校,选择班级(显示班级的名称,课程,价钱),添加到对应的班级内

咋做数据库呢?!

        看看注里面的内容就知道对应关系比较多,对应关系比较多就意味着,一个数据改了所有跟它有关系的数据都有变动,比如班级s14关联讲师alex,学生eric报名后,讲师alex自己的班级学生信息里就要能查到eric的个人信息;当然如果用数据库去做的话,非常简单;but 咱还没学数据库呢,只能用文件的方式存在本地,如果存多个文件的话,一个文件修改另一个文件也跟着修改(互相关联),所以为了简便,就只定义一个伪数据库;通过shelve模块,存储类型{“北京”:北京实例,“上海”:上海实例}

看我怎么做的类定义(只看__init__):

内容最小的学员类:只包含姓名,年龄,可扩展其他信息,关联信息不再这存

class Student(object):
'''学生类,包含姓名,年龄'''
def __init__(self,student_name,student_age):
self.student_name = student_name
self.student_age = student_age

都跟它有关系,但是他是被关系的课程类:只包含周期,价格,名称,可扩展其他信息,被关联,啥关联信息都不用存

class Course():
'''定义课程类,包含名称,价格,周期'''
def __init__(self,course_name,course_price,course_time):
self.course_name = course_name
self.course_price = course_price
self.course_time = course_time

跟三个都有关系,还一一对应(课程、讲师)的班级类:看④⑥  包含班级名,课程对应课程类(对应关系在本类里保存),班级学生成员字典,存放学生类,与讲师关联信息不再本类存

class Class(object):
'''班级类,包含名称,课程,学生'''
def __init__(self,class_name,course_obj):
self.class_name = class_name
self.class_courese = course_obj
self.class_student = {} #学生字典 {学生名:学生实例}

关联性单一,只跟班级相好的讲师类:看⑨  包含讲师名、薪资;讲师关联班级(对应关系在本类保存)班级成员列表,存放班级名(做判断,不会重复);通过班级名查看班级类里面的班级信息(包含学生),避免存双份数据

class Teacher(object):
'''讲师类,定义teacher_name,teacher_salary,包含teacher_class'''
def __init__(self, teacher_name, teacher_salary):
self.teacher_name = teacher_name
self.teacher_salary = teacher_salary
self.teacher_calss = [] #班级列表 [s14,15] def teacher_add_class(self,class_name,class_obj):
self.teacher_calss[class_name] = class_obj

内容最大,跟班级、课程、讲师都有关系的学校类:  包含学校名,学校地址,存放课程实例、班级实例、讲师实例,都是字典形式

class School(object):
'''学校类,包含名称,地址,课程,班级,教师'''
def __init__(self,school_name,school_addr):
self.school_name = school_name
self.school_addr = school_addr
self.school_course = {} #学校所有的课程实例 {"课程名“:课程实例}
self.school_class = {}
self.school_teacher = {} #类型与course一致
#self.school_student = {} #可扩展学生

框架有了,类有了,业务逻辑还不so easy?!

直接放目录架构:

代码区:

程序入口bin下的start.py:  注:判断了系统环境,添加了环境变量,调用了主业务区main.py

import os
import sys
import platform if platform.system() == "Windows":
BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1]) else:
BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1]) sys.path.insert(0,BASE_DIR)
#print(sys.path) from core import main
from conf import settings if __name__ == '__main__':
obj = main.Manage_center()
obj.run()

start.py

配置文件conf下的settings.py:  注:定义了数据库路径

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian import os
import sys
import platform if platform.system() == "Windows":
BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1])
database_path = os.path.join(BASE_DIR,"database") else:
BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1])
database_path = os.path.join(BASE_DIR, "database") school_db_file = os.path.join(database_path,"school")

settings.py

主业务core下的main.py:  注:定义了4个类,管理中心,学员视图,讲师视图,学校视图

import os
import sys
import shelve
from conf import settings
from modules.school import School class Manage_center(object):
def __init__(self):
pass def run(self):
while True:
print("\n欢迎进入CLASS_SYSTEM系统\n"
"1 学生视图\n"
"2 教师视图\n"
"3 学校视图\n"
"q 退出学员管理系统\n")
user_choice = input("\033[34;0m请输入您要登录的视图:\033[0m")
if user_choice == '':
Manage_student()
elif user_choice == '':
Manage_teacher()
elif user_choice == '':
Manage_school()
elif user_choice == 'q':
print("\033[34;1m感谢使用学员管理系统,退出\033[0m")
break
else:
print("\033[31;1m请输入正确的选项\033[0m") class Manage_school(object):
'''学校管理视图'''
def __init__(self):
if os.path.exists(settings.school_db_file+".dat"): #shelve会生成三个文件,其中有.dat结尾
self.school_db = shelve.open(settings.school_db_file) #打开学校数据库文件
self.run_manage() #运行管理视图
self.school_db.close() #关闭数据库文件
else:
print("\33[31;1m系统信息:初始化数据库\33[0m")
self.initialize_school() #初始化数据库
self.run_manage()
self.school_db.close() def initialize_school(self):
'''实例化两个学校北京/上海'''
self.school_db = shelve.open(settings.school_db_file)
self.school_db['北京'] = School('北京', '中国.北京')
self.school_db['上海'] = School('上海', '中国.上海') def run_manage(self):
'''运行学校管理视图 '''
while True:
for key in self.school_db:
print("学校名称:",key)
choice_school = input("\33[34;0m输入选择管理的学校名:\33[0m").strip()
if choice_school in self.school_db:
self.choice_school = choice_school
self.school_obj = self.school_db[choice_school]
while True:
print("\n欢迎来到老男孩%s校区\n"
"添加课程 add_course\n"
"增加班级 add_class\n"
"招聘讲师 add_teacher\n"
"查看课程 check_course\n"
"查看班级 check_class\n"
"查看讲师 check_teacher\n"
"退出程序 exit"% self.school_obj.school_name)
user_func = input('''\033[34;0m输入要操作的命令:\033[0m''').strip()
if hasattr(self,user_func):
getattr(self,user_func)()
else:
print("\33[31;1m输入错误:请输入正确的学校名\33[0m") def add_course(self):
course_name = input('''\033[34;0m输入要添加课程的名称:\033[0m''').strip()
course_price = input('''\033[34;0m输入要添加课程的价格:\033[0m''').strip()
course_time = input('''\033[34;0m输入要添加课程的时长:\033[0m''').strip()
if course_name in self.school_obj.school_course: #判断课程是否已经添加过
print("\33[32;1m课程存在\33[0m")
self.school_obj.create_course(course_name, course_price, course_time)
print("\33[32;1m课程更新完成\33[0m")
else:
self.school_obj.create_course(course_name,course_price,course_time)
print("\33[32;1m课程添加成功\33[0m")
self.school_db.update({self.choice_school: self.school_obj}) #更新数据库数据 def add_class(self):
class_name = input('''\033[34;0m输入要添加班级的名称:\033[0m''').strip()
course_name = input('''\033[34;0m输入要关联的课程:\033[0m''').strip()
if class_name not in self.school_obj.school_class:
if course_name in self.school_obj.school_course:
course_obj = self.school_obj.school_course[course_name]
self.school_obj.create_class(class_name,course_obj)
self.school_db.update({self.choice_school: self.school_obj}) # 更新数据库数据
print("\33[32;1m班级创建成功\33[0m")
else:
print("\33[31;1m系统错误:关联的课程不存在\33[0m")
else:
print("\33[31;1m系统错误:班级已经存在\33[0m") def add_teacher(self):
teacher_name = input('''\033[34;0m输入要招聘教师的名称:\033[0m''').strip()
teacher_salary = input('''\033[34;0m输入教师的薪资:\033[0m''').strip()
teacher_class = input('''\033[34;0m输入要关联的班级:\033[0m''').strip()
if teacher_class in self.school_obj.school_class: #判断班级是否存在
class_obj = self.school_obj.school_class[teacher_class] #获取班级名对应的实例
if teacher_name not in self.school_obj.school_teacher: #判断招聘教师是否存在,不存在创建,存在更新
self.school_obj.create_teacher(teacher_name,teacher_salary,teacher_class,class_obj)
print("\33[32;1m新讲师招聘成功\33[0m")
else:
self.school_obj.update_teacher(teacher_name, teacher_class, class_obj)
print("\33[32;1m讲师已经存在,信息更新完成\33[0m") self.school_db.update({self.choice_school: self.school_obj}) # 更新数据库数据
else:
print("\33[31;1m系统错误:关联的班级不存在\33[0m") def check_course(self):
self.school_obj.show_course() def check_class(self):
self.school_obj.show_class() def check_teacher(self):
self.school_obj.show_teacher() def exit(self):
self.school_db.close()
sys.exit("\033[32;1m欢迎下次使用学员管理系统\033[0m") class Manage_student(object):
'''学生视图'''
def __init__(self):
if os.path.exists(settings.school_db_file + ".dat"): # shelve会生成三个文件,其中有.dat结尾
self.school_db = shelve.open(settings.school_db_file) # 打开学校数据库文件
self.run_manage() # 运行管理视图
self.school_db.close() # 关闭数据库文件
else:
print("\033[31;1m数据库文件不存在,请先创建学校\033[0m")
exit() def run_manage(self):
print("\n欢迎进入学员视图")
for key in self.school_db:
print("学校名称:", key)
choice_school = input("\33[34;0m输入选择注册的学校名:\33[0m").strip()
if choice_school in self.school_db:
self.choice_school = choice_school
self.school_obj = self.school_db[choice_school]
student_name = input('''\033[34;0m输入学生的姓名:\033[0m''').strip()
student_age = input('''\033[34;0m输入学生的年龄:\033[0m''').strip()
self.school_obj.show_class_course()
class_choice = input('''\033[34;0m输入上课的班级:\033[0m''').strip()
if class_choice in self.school_obj.school_class:
self.school_obj.create_student(student_name,student_age,class_choice)
self.school_db.update({self.choice_school: self.school_obj}) # 更新数据库数据
print("\33[32;1m学生注册成功\33[0m")
else:
print("\33[31;1m系统错误:输入的班级不存在\33[0m")
else:
print("\33[31;1m系统错误:输入的学校不存在\33[0m") class Manage_teacher(object):
'''教师视图'''
def __init__(self):
if os.path.exists(settings.school_db_file + ".dat"): # shelve会生成三个文件,其中有.dat结尾
self.school_db = shelve.open(settings.school_db_file) # 打开学校数据库文件
self.run_manage() # 运行管理视图
self.school_db.close() # 关闭数据库文件
else:
print("\033[31;1m数据库文件不存在,请先创建学校\033[0m")
exit() def run_manage(self):
for key in self.school_db:
print("学校名称:", key)
choice_school = input("\33[34;0m输入选择学校名:\33[0m").strip()
if choice_school in self.school_db:
self.choice_school = choice_school
self.school_obj = self.school_db[choice_school]
teacher_name = input('''\033[34;0m输入登录讲师的姓名:\033[0m''').strip()
while True:
if teacher_name in self.school_obj.school_teacher:
print("\n欢迎来到教师中心\n"
"查看班级 check_class\n"
"退出程序 exit" )
user_func = input('''\033[34;0m输入要操作的命令:\033[0m''').strip()
if hasattr(self, user_func):
getattr(self, user_func)(teacher_name)
else:
print("\033[31;1m讲师不存在\033[0m") def check_class(self,teacher_name):
self.school_obj.show_teacher_classinfo(teacher_name) def exit(self,*args):
self.school_db.close()
sys.exit("\033[32;1m欢迎下次使用学员管理系统\033[0m")

main.py

数据文件database:  注:不用管,自动初始化生成

注:不用管,自动初始化生成

database

模块modules下的school: 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian
from modules.course import Course
from modules.classs import Class
from modules.teacher import Teacher
from modules.student import Student class School(object):
'''学校类,包含名称,地址,课程,班级,教师'''
def __init__(self,school_name,school_addr):
self.school_name = school_name
self.school_addr = school_addr
self.school_course = {} #学校所有的课程实例
self.school_class = {}
self.school_teacher = {}
#self.school_student = {} def create_course(self,course_name,course_price,course_time):
'''创建课程'''
course_obj = Course(course_name,course_price,course_time)
self.school_course[course_name] = course_obj def show_course(self):
'''查看课程信息'''
for key in self.school_course:
course_obj = self.school_course[key]
print("\33[32;1m课程:%s\t价格:%s\t周期:%s月\33[0m"%(course_obj.course_name,course_obj.course_price,
course_obj.course_time,)) def create_class(self,class_name,courese_obj):
'''创建班级'''
class_obj = Class(class_name,courese_obj)
self.school_class[class_name] = class_obj def show_class(self):
for key in self.school_class:
class_obj = self.school_class[key]
print("\33[32;1m班级:%s\t关联课程:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name)) def show_class_course(self):
for key in self.school_class:
class_obj = self.school_class[key]
course_obj = class_obj.class_courese
print("\33[32;1m班级:%s\t关联课程:%s\t价格:%s\t周期:%s月\33[0m" % (class_obj.class_name, course_obj.course_name,
course_obj.course_price,course_obj.course_time)) def create_teacher(self,teacher_name, teacher_salary,class_name,class_obj):
'''创建讲师'''
teacher_obj = Teacher(teacher_name, teacher_salary)
teacher_obj.teacher_add_class(class_name,class_obj)
self.school_teacher[teacher_name] = teacher_obj def update_teacher(self,teacher_name,class_name,class_obj):
'''更新教师信息'''
teacher_obj = self.school_teacher[teacher_name]
teacher_obj.teacher_add_class(class_name,class_obj) def show_teacher(self):
'''查看讲师信息'''
for key in self.school_teacher:
teacher_obj = self.school_teacher[key]
class_list = []
for i in teacher_obj.teacher_calss:
class_list.append(i)
print("\33[32;1m讲师:%s\t薪资:%s\t关联班级:%s\33[0m" % (teacher_obj.teacher_name, teacher_obj.teacher_salary,
class_list ))
def create_student(self,student_name,student_age,class_choice):
'''注册学生'''
student_obj = Student(student_name,student_age) #生成学生实例
class_obj = self.school_class[class_choice] #获取学生所注册班级的实例对象
class_obj.class_student[student_name]=student_obj #班级实例里添加学生信息
self.school_class[class_choice] = class_obj #学校班级字典更新 def show_teacher_classinfo(self,teacher_name):
teacher_obj = self.school_teacher[teacher_name]
for i in teacher_obj.teacher_calss:
class_obj = self.school_class[i]
student_list = []
for k in class_obj.class_student:
student_list.append(k)
print("\33[32;1m班级:%s\t关联课程:%s\t学员:%s\33[0m" % (class_obj.class_name, class_obj.class_courese.course_name,
student_list))

student.py

模块modules下的class:

class Class(object):
'''班级类,包含名称,课程,学生'''
def __init__(self,class_name,course_obj):
self.class_name = class_name
self.class_courese = course_obj
self.class_student = {} #学生字典

class.py

模块modules下的course:

class Course():
'''定义课程类,包含名称,价格,周期'''
def __init__(self,course_name,course_price,course_time):
self.course_name = course_name
self.course_price = course_price
self.course_time = course_time

course.py

模块modules下的student:

class Student(object):
'''学生类,包含姓名,年龄'''
def __init__(self,student_name,student_age):
self.student_name = student_name
self.student_age = student_age

student.py

模块modules下的teacher:

class Teacher(object):
'''讲师类,定义teacher_name,teacher_salary,包含teacher_class'''
def __init__(self, teacher_name, teacher_salary):
self.teacher_name = teacher_name
self.teacher_salary = teacher_salary
self.teacher_calss = [] #班级列表 [s14,15] def teacher_add_class(self,class_name,class_obj):
self.teacher_calss[class_name] = class_obj

teacher.py

运行示例图:

学校视图:

学生视图:

讲师视图:

 

 

												

最新文章

  1. 基于 Ubuntu 编译 windows 版 adb
  2. yii 多表联合查询的几种方法
  3. bootstrap input框清空
  4. 使用OpenXML操作Office文档
  5. 《编写高质量代码:改善C#程序的157个建议》源码下载
  6. SQLServer、MySQL、Oracle语法差异小集锦
  7. [POJ1050]To the Max(最大子矩阵,DP)
  8. RMAN 备份详解
  9. Canvas处理头像上传
  10. 在ASM中移动数据文件
  11. 几个好用的截取字符串的php函数分享
  12. Day 3 @ RSA Conference Asia Pacific & Japan 2016 (morning)
  13. Android 之夜间模式(多主题)的实现
  14. post与get,这两人到底神马区别??
  15. 测试驱动开发 TDD
  16. asp.net 页面生命周期事件详细
  17. python工程遇到的错误
  18. redis安全删key脚本(模糊匹配,长list,大set等)
  19. 喵哈哈村的魔法考试 Round 16 (Div.2) 比赛题解
  20. 为什么要设置Java环境变量(windows)

热门文章

  1. 关于删除 hao123 主页设置的一点经验
  2. MFC接收命令行参数的三种方法
  3. 连接mysql 数据库时出现2003 -can't connect to mysql server on 'localhost'(100038)的问题
  4. ThinkPHP框架 表单传值自动验证!!
  5. Mysql----整理
  6. .net core中使用Type.GetType()从字符串获取类型遇到的问题
  7. /usr/bin/ld: 找不到 -lmsc----解决方案
  8. MFC实现一元稀疏多项式运算器
  9. [No0000156]天干地支-狗年我懂,戊戌二字怎么来的?
  10. [administrative][lvm] lvm 分区修改