一、功能简要

基本实现以下功能,但是有部分地方由于时间关系并未写,而且并未做细微的完善,大致功能完成。
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供两个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里 二、代码解析  
(1)文件目录:

  

(2)代码

start.py:

 #!/usr/bin/env python
# _*_ coding:utf-8 _*_
#Author:chenxz
import os,sys
base_path=os.path.dirname(os.path.dirname(__file__))
sys.path.append(base_path)
from core import main #开始启动程序
if __name__ == '__main__':
Mainprogram_obj=main.Mainprogram()
Mainprogram_obj.run()

start.py

setting:

 #!/usr/bin/env python
# _*_ coding:utf-8 _*_
#Author:chenxz
import logging
import os,sys BASE_DIR=base_path=os.path.dirname(os.path.dirname(__file__))
split=os.path.sep
#存放学校数据文件路径
school_file_path=base_path+split+'db'+split+'school'+split+'school_data' #日志文件
LOG_FILE=BASE_DIR+split+'log'+split+'service.log'
#日志级别和格式设置
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename=LOG_FILE,
filemode='a+') if __name__ == '__main__':
print(LOG_FILE)

setting.py

main:

 #!/usr/bin/env python
# _*_ coding:utf-8 _*_
#Author:chenxz
import os,sys
import pickle
base_path=os.path.dirname(os.path.dirname(__file__))
sys.path.append(base_path)
from conf import setting
from core import resource class Student_view(object):
'''
学生视觉类
'''
def __init__(self):
self.Admin_view_obj = Admin_view()
self.school_data = self.Admin_view_obj.school_data
def run_view(self):
'''
执行学生视觉,选择登录或者注册
:return:
'''
setting.logging.debug('run_student_view')
while True:
print('=====已有学校=======')
for i in self.school_data:
print('学校:%s ,地址:%s' % (i, self.school_data[i].addr))
school_choice=input('请输入你要管理的学校名(q退出r返回):')
if school_choice in self.school_data:
self.school_obj=self.school_data[school_choice]
while True:
def_dict={'':'register','':'student_login'}
for i,j in enumerate(def_dict):
print(i+1,def_dict[j])
def_choice=input('请输入你的选择(q退出r返回):')
if def_choice.isdigit():
if 0 < int(def_choice) <= len(def_dict):
if hasattr(self,def_dict[def_choice]):
getattr(self,def_dict[def_choice])()
else:
print('没有这个功能方法')
continue
else:
print('输入的数字不正确!')
continue
elif def_choice == 'r':
break
elif def_choice == 'q':
exit()
else:
print('输入必须是数字!')
continue
elif school_choice == 'r':
break
elif school_choice == 'q':
exit()
def register(self,):
'''
注册方法
:return:
'''
setting.logging.debug('学生开始注册')
while True:
student_name=input('请输入学生名称:')
student_password= input('请输入密码:')
student_age = input('请输入学生年纪:')
if student_name in self.school_obj.student_dict:
print('此学生已经注册')
continue
else:
student_obj=resource.Student(student_name,student_password,student_age)
self.school_obj.student_dict[student_name]=student_obj
self.school_data[self.school_obj.name]=self.school_obj
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('成功添加学生%s' % student_name)
break def student_login(self):
'''
学生登录校验以及选择登录成功后的操作
:return:
'''
while True:
student_user = input('请输入你的用户名:').strip()
student_password = input('请输入你的密码:').strip()
if student_user in self.school_obj.student_dict and self.school_obj.student_dict[
student_user].password == student_password:
print('%s用户登录成功' % student_user)
student_obj = self.school_obj.student_dict[student_user]
while True:
def_dict = {'': 'change_info', '': 'tell_info', '': 'test1', '': 'test2',
'': 'test3'}
for i in def_dict:
print(i, def_dict[i])
def_choice = input("请输入你的选择(q退出r返回):")
if def_choice.isdigit():
if 0 < int(def_choice) <= len(def_dict):
if hasattr(self, def_dict[def_choice]):
getattr(self, def_dict[def_choice])(student_obj)
else:
print('没有这个功能方法')
continue
else:
print('输入的数字不正确!')
continue
elif def_choice == 'r':
break
elif def_choice == 'q':
exit()
else:
print('输入必须是数字!')
continue
break
else:
print('用户密码不正确')
continue def tell_info(self,obj):
'''
查看学生信息
:param obj: 学生对象
:return:
'''
print('''
姓名:%s
年纪:%s
'''%(obj.name,obj.age)) def change_info(self,obj):
'''
修改学生信息
:param obj: 学生对象
:return:
'''
print('change_info') student_password = input('请输入新密码:')
student_age = input('请输入老师新年纪:')
student_name=obj.name
obj.password=student_password
obj.age=student_age
self.school_data[self.school_obj.name].student_name=obj
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('修改信息成功' ) class Teacher_view(object):
'''
老师视觉类
'''
def __init__(self):
self.Admin_view_obj=Admin_view()
self.school_data=self.Admin_view_obj.school_data
def run_view(self):
'''
执行老师视觉,进行登录以及选择对应的操作
:return:
'''
setting.logging.debug('run Teacher_view')
self.Admin_view_obj.show_school_list()
choice_school=input('请选择你要进入的学校名称:').strip()
if choice_school in self.school_data:
self.school_obj=self.school_data[choice_school]
while True:
teacher_user=input('请输入你的用户名:').strip()
teacher_password=input('请输入你的密码:').strip()
if teacher_user in self.school_obj.teacher_dict and self.school_obj.teacher_dict[teacher_user].password==teacher_password:
print('%s用户登录成功'%teacher_user)
teacher_obj=self.school_obj.teacher_dict[teacher_user]
while True:
def_dict = {'': 'teaching', '': 'tell_info', '': 'show_classes', '': 'show_student_scord',
'': 'change_info'}
for i in def_dict:
print(i, def_dict[i])
def_choice=input("请输入你的选择(q退出r返回):")
if def_choice.isdigit():
if 0 < int(def_choice) <= len(def_dict):
if hasattr(self, def_dict[def_choice]):
getattr(self, def_dict[def_choice])(teacher_obj)
else:
print('没有这个功能方法')
continue
else:
print('输入的数字不正确!')
continue
elif def_choice == 'r':
break
elif def_choice == 'q':
exit()
else:
print('输入必须是数字!')
continue
break
else:
print('用户密码不正确')
continue
else:
print('学校名输入错误!')
def teaching(self,obj):
'''
授课
:param obj: 老师对象
:return:
'''
print('%s is teaching'%obj.name) def tell_info(self,obj):
'''
查看老师信息
:param obj: 老师对象
:return:
'''
print('''
姓名:%s
年纪:%s
工资:%s
'''%(obj.name,obj.age,obj.salary)) def show_classes(self,obj):
'''
查看授课班级
:param obj: 老师对象
:return:
'''
print('====老师授课班级===')
for i in obj.classes:
print(i) def show_course(self,obj):
print('show_student_scord,未写') def change_info(self,obj):
'''
修改老师信息
:param obj: 老师对象
:return:
'''
print('change_info')
#teacher_name = input('请输入新名称:')
teacher_password = input('请输入新密码:')
teacher_salary = input('请输入老师新工资:')
teacher_age = input('请输入老师新年纪:')
teacher_name=obj.name
obj.password=teacher_password
obj.salary=teacher_salary
obj.age=teacher_age
self.school_data[self.school_obj.name].teacher_name=obj
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('修改信息成功' ) class Admin_view(object):
'''
管理员视图类
'''
def __init__(self):
self.f=open(setting.school_file_path,'rb')
self.school_data=pickle.loads(self.f.read())
def __del__(self):
pass
def run_view(self):
'''
执行管理员视图,并选择你要做的操作
:return:
'''
setting.logging.debug('run Admin_view')
def_dict = {'': 'add_school', '': 'show_school_list', '': 'del_school','':'manage_school'}
while True:
print('''
==========chen_school==========
''')
for i in def_dict:
print(i, def_dict[i])
choice = input('请选择进入的视图(q退出,r返回):')
if choice.isdigit():
if 0 < int(choice) <= len(def_dict):
if hasattr(self,def_dict[choice]):
getattr(self,def_dict[choice])()
else:
print('没有这个功能方法')
continue
else:
print('输入的数字不正确!')
continue
elif choice == 'r':
break
elif choice == 'q':
exit()
else:
print('输入必须是数字!')
continue
def add_school(self):
'''
添加学校方法
:return:
'''
school_name = input('请输入学校名:')
school_addr = input('请输入学校地址:')
school_obj = resource.School(school_name, school_addr)
self.school_data[school_name] = school_obj
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('添加学校%s成功'%school_name) def show_school_list(self):
'''
查看所有的学校
:return:
'''
print('=====已有学校=======')
for i in self.school_data:
print('学校:%s ,地址:%s'%(i,self.school_data[i].addr))
def del_school(self):
'''
删除学校
:return:
'''
print('=====已有学校=======')
for i in self.school_data:
print('学校:%s ,地址:%s' % (i, self.school_data[i].addr))
del_choice=input('请选择你要删除的学校名(r返回):')
if del_choice in self.school_data: del self.school_data[del_choice]
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('删除%s学校成功'%del_choice)
else:
print('你输入的学校不存在') def manage_school(self):
'''
管理学校方法,进行管理老师学生课程班级等作用
:return:
'''
while True:
print('=====已有学校=======')
for i in self.school_data:
print('学校:%s ,地址:%s' % (i, self.school_data[i].addr))
school_choice=input('请输入你要管理的学校名(q退出r返回):')
if school_choice in self.school_data:
school_obj=self.school_data[school_choice]
while True:
manage_list=['add_teacher','add_classes','add_course','show_teacher','show_classes','show_course','del_teaher','del_classes','del_course']
for i,j in enumerate(manage_list):
print(i+1,j)
manage_choice=input('请输入你的选择(q退出r返回):')
if manage_choice.isdigit():
if 0 < int(manage_choice) <= len(manage_list):
if hasattr(self, manage_list[int(manage_choice)-1]):
getattr(self, manage_list[int(manage_choice)-1])(school_obj)
else:
print('没有这个功能方法')
continue
else:
print('输入的数字不正确!')
continue
elif manage_choice == 'r':
break
elif manage_choice == 'q':
exit()
else:
print('输入必须是数字!')
continue
elif school_choice == 'r':
break
elif school_choice == 'q':
exit()
else:
print('输入的学校不存在')
continue
def add_teacher(self,school_obj):
'''
添加老师
:param school_obj: 要管理的学校对象
:return:
'''
while True:
teacher_name=input('请输入老师名称:')
teacher_password= input('请输入密码:')
teacher_salary = input('请输入老师工资:')
teacher_age = input('请输入老师年纪:')
if teacher_name in school_obj.teacher_dict:
print('此老师已经注册')
continue
else:
teacher_obj=resource.Teacher(teacher_name,teacher_password,teacher_salary,teacher_age)
school_obj.teacher_dict[teacher_name]=teacher_obj
self.school_data[school_obj.name]=school_obj
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('成功添加老师%s' % teacher_name)
break
def add_classes(self,school_obj):
'''
添加班级
:param school_obj: 要管理的学校对象
:return:
'''
while True:
classes_name=input('请输入班级名称:')
if classes_name in school_obj.classes_dict:
print('此班级已经存在')
continue
else:
classes_obj=resource.Classes(classes_name)
school_obj.classes_dict[classes_name]=classes_obj
self.school_data[school_obj.name]=school_obj
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('成功添加班级%s' % classes_name)
break
def add_course(self,school_obj):
'''
添加课程
:param school_obj: 要管理的学校对象
:return:
'''
while True:
course_name=input('请输入课程名称:')
course_pay=input('请输入课程价格:')
if course_name in school_obj.course_dict:
print('此课程已经存在')
continue
else:
course_obj=resource.Course(course_name,course_pay)
school_obj.course_dict[course_name]=course_obj
self.school_data[school_obj.name]=school_obj
f = open(setting.school_file_path, 'wb')
f.write(pickle.dumps(self.school_data))
f.close()
print('成功添加课程%s' % course_name)
break
def show_teacher(self,school_obj):
'''
查看老师
:param school_obj: 要管理的学校对象
:return:
'''
teacher_dict=self.school_data[school_obj.name].teacher_dict
for i in teacher_dict:
print('姓名:%s'%i)
def show_classes(self,school_obj):
'''
查看班级
:param school_obj: 要管理的学校对象
:return:
'''
classes_dict=self.school_data[school_obj.name].classes_dict
for i in classes_dict:
print('班级:%s'%i)
def show_course(self,school_obj):
'''
查看课程
:param school_obj: 要管理的学校对象
:return:
'''
course_dict=self.school_data[school_obj.name].course_dict
for i in course_dict:
print('课程:%s'%i)
def del_teaher(self,school_obj):
print('删除老师,未写')
def del_classes(self,school_obj):
print('删除班级,未写')
def del_course(self,school_obj):
print('删除课程,未写') class Mainprogram(object):
'''
主程序类,开启程序,并选择不同视图进入
'''
def __init__(self):
pass
def run(self):
'''
按需选择不同视图
:return:
'''
setting.logging.debug('开始启动程序...')
view_dict = {'': 'Student_view', '': 'Teacher_view', '': 'Admin_view'}
view_list = [Student_view, Teacher_view, Admin_view]
while True:
print('''
==========chen_school==========
''')
for i in view_dict:
print(i, view_dict[i])
choice = input('请选择进入的视图(q退出):')
if choice.isdigit():
if 0 < int(choice) <= len(view_dict):
obj=view_list[int(choice) - 1]()
obj.run_view()
else:
print('输入的数字不正确!')
continue
elif choice=='q':
break
else:
print('输入必须是数字!')
break if __name__ == '__main__':
Mainprogram_obj=Mainprogram()
Mainprogram_obj.run()

resource.py:

 #!/usr/bin/env python
# _*_ coding:utf-8 _*_
#Author:chenxz class School(object):
'''
学校类
'''
def __init__(self,name,addr,):
self.name=name
self.addr=addr
self.teacher_dict={}
self.student_dict={}
self.classes_dict={}
self.course_dict={} class Teacher(object):
'''
老师类
'''
def __init__(self,name,password,salary,age):
self.name=name
self.salary=salary
self.age=age
self.password=password
self.classes={}
self.course={} class Classes(object):
'''
班级类
'''
def __init__(self,name):
self.name=name
self.student={}
self.course={} class Course(object):
'''
课程类
'''
def __init__(self,name,pay):
self.name=name
self.pay=pay
self.student={} class Student(object):
'''
学生类
'''
def __init__(self,name,password,age):
self.name=name
self.age=age
self.password=password

resource.py

schoool.py:

 import pickle
import os,sys
base_path=os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
split=os.path.sep
sys.path.append(base_path)
from core import resource
from conf import setting def add_achool():
'''
重置学校文件数据的方法
:return:
'''
school_name=input('请输入学校名:')
school_addr=input('请输入学校地址:')
school_obj=resource.School(school_name,school_addr)
schoo_data={school_name:school_obj}
schoo_data_path=setting.school_file_path
data=pickle.dumps(schoo_data)
f=open(schoo_data_path,'wb')
f.write(data)
f.close() def open_school_file():
'''
查看学校文件
:return:
'''
f = open(setting.school_file_path, 'rb')
school_data = pickle.loads(f.read())
print(school_data['beijing'].teacher_list[0].name) if __name__ == '__main__':
add_achool()

school.py

选课系统项目_python的更多相关文章

  1. python 入门基础23 选课系统 项目

    选课系统 代码地址:github_code # 选课系统 # 角色:学校.学员.课程.讲师 # 要求: # 1. 创建北京.上海 2 所学校 # 2. 创建linux , python , go 3个 ...

  2. day27、28 二十八、项目:选课系统

    选课系统 作业要求 角色:学校.学生.课程.讲师 要求: 1. 创建北京.上海 2 所学校 ----> 创建学校 2. 创建linux , python , go 3个课程 , linux\py ...

  3. Python开发【项目】:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  4. C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明

    这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...

  5. python【项目】:选课系统【简易版】

    功能要求 角色:学校.学员.课程.讲师要求:1. 创建学校2. 创建课程3. 课程包含,周期,价格,通过学校创建课程4. 通过学校创建班级, 班级关联课程.讲师5. 创建学员时,选择学校,关联班级5. ...

  6. python开发项目:学生选课系统

    程序要求:1.创建北京.上海两所学校(分析:通过学校类实例化两个学校实例) 2.创建Linux.python.go三个课程,Linux\go在北京开,Linux在上海开(创建Linux.python. ...

  7. 一个简单的python选课系统

    下面介绍一下自己写的python程序,主要是的知识点为sys.os.json.pickle的模块应用,python程序包的的使用,以及关于类的使用. 下面是我的程序目录: bin是存放一些执行文件co ...

  8. 学生选课系统 c语言

    /********************************* *主题:学生选修课程系统设计 * *设计要求: *1.添加功能:程序能够任意添加课程和学生记录,可提供选择界面供用户选择所需要添加 ...

  9. Python3 之选课系统

    项目介绍:项目名称:(oldboy选课系统)项目功能: 分为 学员视角, 老师视角 , 管理员视角 学员视角{ (注册 登录 个人中心 选课 学习 上课) 登录 就是登录 注册: 填写 资料 信息 完 ...

随机推荐

  1. Python3(四) 分支、循环、条件与枚举

    表达式        表达式(Expression)是运算符(operator)和操作数(operand)所构成的序列 >>> 1 + 1 2 >>> a = [1 ...

  2. Linux下安装 php imagick扩展

    今天小编 由于工作需求用到了 imagick 这个扩展  服务器环境是 lnmp 架构下面稍微来介绍下 这个 东东 imagick是一个PHP的扩展,用ImageMagick提供的API来进行图片的创 ...

  3. Idea自定义代码块【学习笔记】

    前言 idea有一个自定义代码块的功能,可以自定义代码块,方便以后工作中减少一些重复操作,这里就简单记录一下idea好用的模板吧,现在有一个关于日志的模板,用于写一个ServiceImpl方法的时候, ...

  4. 论文《Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling》

    Entity Linking with Effective Acronym Expansion, Instance Selection and Topic Modeling 一.主要贡献 1. pro ...

  5. k8s 安装 prometheus 过程记录

    开始以为只要安装 prometheus-operator 就行了. git clone https://github.com/coreos/prometheus-operator.git cd pro ...

  6. bash通配符 shell正则表达式

    在linux中 通配符是系统命令使用,一般用来匹配文件名或者什么的用在系统命令中. 通配符是系统级别的,通配符多用在文件名上,比如查找find,ls,cp,rm 正则表达式是操作字符串,以行尾单位来匹 ...

  7. finalshell连接工具

    FinalShell功能特点: 1.多平台支持Windows,Mac OS X,Linux2.多标签,批量服务器管理.3.支持登录Ssh和Windows远程桌面.4.漂亮的平滑字体显示,内置100多个 ...

  8. 基于已构建S2SH项目配置全注解方式简化配置文件

    如果还不熟悉s2sh项目搭建的朋友可以先阅读 eclipse环境下基于tomcat-7.0.82构建struts2项目 eclipse环境下基于已构建struts2项目整合spring+hiberna ...

  9. C#使用Environment.TickCount 自定义的定时器类

    Environment.TickCount, 官网介绍:一个 32 位带符号整数,它包含自上次启动计算机以来所经过的时间(以毫秒为单位). *由于 TickCount 属性值的值是32位有符号整数,因 ...

  10. Cesium案例解析(三)——Camera相机

    目录 1. 概述 2. 实例 2.1. Camera.html 2.2. Camera.js 2.2.1. 飞行至某一点 2.2.2. 飞行至某区域 2.2.3. 两地之间飞行 2.2.4. 设置视图 ...