时间:2021-07-01 10:21:17 帮助过:41人阅读
需求:
用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下
讲师视图
管理班级,可创建班级,根据学员qq号把学员加入班级
可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录, 即每节课都有整班学员上, 为了纪录每位学员的学习成绩,需在创建每节上课纪录是,同时 为这个班的每位学员创建一条上课纪录
为学员批改成绩, 一条一条的手动修改成绩
学员视图
提交作业
查看作业成绩
一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样, 所以提交作业时需先选择班级,再选择具体上课的节数
附加:学员可以查看自己的班级成绩排名
学员管理系统
实现功能:
1、系统初始化
2、管理员视图
功能:创建讲师、查看讲师、创建班级、查看班级、关联讲师与班级、创建学员、查看学员、班级关联学员
3、讲师视图
功能:管理班级、创建班级(自动与自己关联)、班级增加学员、增加新课节、
指定班级上课,选择上课课节(自动创建课程记录,同时为这个班的每位学员创建一条上课纪录)
批改成绩(先选择一个班级、再选择学员)
4、学员视图
功能:提交作业
查看作业成绩
查看班级中的总成绩排名
stude_mag_sys/#程序目录
|- - -__init__.py
|- - -bin/#启动目录
| |- - -__init__.py
| |- - -admin_start.py#管理员视图启动
| |- - -mag_init.py#系统初始化
| |- - -student.py#学员视图启动
| |- - -teach_start.py#讲师视图启动
|
|- - -cfg/#配置目录
| |- - -__init__.py
| |- - -config.py#配置文件
|
|- - -core/#主逻辑目录
| |- - -__init__.py
| |- - -admain_class.py#主要逻辑 类
| |- - -admin_log.py#管理员逻辑 类
| |- - -student_class.py#学员逻辑 类
| |- - -teach_class.py#讲师逻辑 类
|
|- - -REDMAE
先上一个表结构图
流程美图来一张:
stude_mag_sys/#程序目录
|- - -__init__.py
|- - -bin/#启动目录
| |- - -__init__.py
| |- - -admin_start.py#管理员视图启动
1 import os ,sys 2 from sqlalchemy import create_engine 3 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 4 sys.path.append(BASE_DIR)#增加环境变量 5 from core import admin_class 6 from core import admin_log 7 from cfg import config 8 if __name__ == '__main__': 9 # 用户 密码 主机 库 10 #engine = create_engine(config.HOSTS,)#连接 11 #admin_class.Base.metadata.create_all(admin_class.engine)#创建表结构 12 while True: 13 admin=admin_log.Admin_Mag() 14 admin.user_log()
| |- - -mag_init.py#系统初始化
1 import os ,sys 2 from sqlalchemy import create_engine 3 from sqlalchemy.orm import sessionmaker, relationship 4 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 5 sys.path.append(BASE_DIR)#增加环境变量 6 from core import admin_class 7 from core import admin_log 8 from cfg import config 9 if __name__ == '__main__': 10 # 用户 密码 主机 库 11 #engine = create_engine(config.HOSTS,)#连接 12 13 admin_class.Base.metadata.create_all(admin_class.engine)#创建表结构 14 A1 = admin_class.Admin_user(name=config.USER,pwd=config.PWD)#初始化 15 Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类 16 Session=Session_class()#生成实例 17 Session.add(A1) 18 Session.commit()
| |- - -student.py#学员视图启动
1 import os ,sys 2 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 3 sys.path.append(BASE_DIR)#增加环境变量 4 from core.student_class import Stu_Mag 5 from cfg import config 6 if __name__ == '__main__': 7 while True: 8 stu=Stu_Mag() 9 stu.user_log()
| |- - -teach_start.py#讲师视图启动
1 import os ,sys 2 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 3 sys.path.append(BASE_DIR)#增加环境变量 4 from core.teach_class import Teach_Mag 5 from cfg import config 6 if __name__ == '__main__': 7 while True: 8 teach=Teach_Mag() 9 teach.user_log()
|- - -cfg/#配置目录
| |- - -__init__.py
| |- - -config.py#配置文件
1 import os ,sys 2 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 3 sys.path.append(BASE_DIR)#增加环境变量 4 5 BAES='test_student_mag'#库名 6 HOSTS="mysql+pymysql://root:root@127.0.0.1:3306/"+BAES+"?charset=utf8"#连接 7 USER='admin' 8 PWD='admin' 9 10 ADMIN_OPEN=[ 11 ('创建讲师','add_teach'), 12 ('查看讲师','teach_l'), 13 ('创建班级','add_class'), 14 ('查看班级','class_l'), 15 ('讲师关联班级','assoc'), 16 ('创建学员','add_stu'), 17 ('查看学员','stu_l'), 18 ('班级关联学员','class_student'), 19 ('退出','tech_exit'), 20 ] 21 22 TEACH_OPEN=[ 23 ('查看班级','show_class'), 24 ( '创建新班级','add_class'), 25 ('班级增加学员','add_student'), 26 ('增加新课节','add_lesson'), 27 ('开始上课','add_cla_day'), 28 ('批改成绩','set_results'), 29 ('退出','tech_exit') 30 ] 31 STUED_OPEN=[ 32 ('提交作业','up_work'), 33 ( '查看成绩','set_resu'), 34 ('查看班级排行','cla_top'), 35 ('退出','tech_exit') 36 ]
|- - -core/#主逻辑目录
| |- - -__init__.py
| |- - -admain_class.py#主要逻辑 类
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #python 5 #2017/7/7 17:46 6 #__author__='Administrator' 7 # 创建表 8 import os ,sys 9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 10 sys.path.append(BASE_DIR)#增加环境变量 11 from sqlalchemy.ext.declarative import declarative_base 12 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,Table,DATE 13 from sqlalchemy.orm import sessionmaker, relationship 14 from sqlalchemy import create_engine 15 from sqlalchemy import func #统计 16 from cfg import config 17 Base = declarative_base()#生成orm 基类 18 19 #创建班级关联学员表,自动维护 20 class_name_m2m_student = Table('class_name_m2m_student', Base.metadata, 21 Column('class_name_id',Integer,ForeignKey('class_name.id')),#关联外键,班级id 22 Column('student_id',Integer,ForeignKey('student.id')),#关联外键,学员id 23 ) 24 #创建班级关联老师表,自动维护 25 teacher_name_m2m_class = Table('teacher_name_m2m_class', Base.metadata, 26 Column('teacher_id',Integer,ForeignKey('teacher.id')),#关联外键,老师id 27 Column('class_name_id',Integer,ForeignKey('class_name.id')),#关联外键,班级id 28 ) 29 #班级表 30 class Class_name(Base):#班级表 31 __tablename__ = 'class_name' 32 id = Column(Integer,primary_key=True) 33 name = Column(String(64),unique=True) 34 students = relationship('Student',secondary=class_name_m2m_student,backref='class_name')#关联学员,班级 35 #teachers = relationship('Teacher',secondary=class_name_m2m_teacher,backref='class_name')#关联老师,班级 36 def __repr__(self): 37 return self.name 38 39 #老师表 40 class Teacher(Base):#老师表 41 __tablename__ = 'teacher' 42 id = Column(Integer, primary_key=True) 43 name = Column(String(32)) 44 user = Column(String(32),unique=True) 45 pwd = Column(String(32)) 46 class_n = relationship('Class_name',secondary=teacher_name_m2m_class,backref='teach_name')#关联老师,班级 47 def __repr__(self): 48 return self.name 49 50 #学员表 51 class Student(Base):#学员表 52 __tablename__ = 'student' 53 id = Column(Integer, primary_key=True) 54 name = Column(String(32)) 55 pwd = Column(String(64)) 56 qq = Column(Integer,nullable=False,unique=True) 57 def __repr__(self): 58 return self.id 59 60 #进度 课节表 61 class Lesson(Base): 62 __tablename__='lesson' 63 id = Column(Integer, primary_key=True) 64 name=Column(String(32),unique=True)#唯一课节名 65 def __repr__(self): 66 return self.name 67 68 #课程表 69 class Class_Day(Base):#课程表 70 __tablename__='class_day' 71 id=Column(Integer,primary_key=True) 72 class_id=Column(Integer,ForeignKey("class_name.id"),nullable=False)#外键 班级 73 lesson_id= Column(Integer,ForeignKey("lesson.id"),nullable=False)#课程进度 74 class_n=relationship("Class_name",foreign_keys=[class_id],backref="m_class_day")#自定义关联反查 班级Class_name通过m_class_day 查Class_day 75 lesson_n=relationship("Lesson",foreign_keys=[lesson_id],backref="m_lesson_day")#自定义关联反查 课节Lesson通过m_lesson_day 查Class_day 76 def __repr__(self): 77 return self.id#课程名ID 78 79 class Student_work(Base):# 作业 上 课记录 80 __tablename__='student_work' 81 id=Column(Integer,primary_key=True) 82 students_id=Column(Integer,ForeignKey("student.id"))#外键 学员ID 83 class_id= Column(Integer,ForeignKey('class_day.id'))#班级课程 日期 ID 84 status= Column(String(32),nullable=False)#作业提交 状态 85 results= Column(String(64))#成绩 86 students_w=relationship("Student",foreign_keys=[students_id],backref="m_study_class")#自定义关联反查 学员类Student通过m_study_class 查student_work 87 stu_class=relationship("Class_Day",foreign_keys=[class_id],backref="class_stu_work")#自定义关联反查 班级Class_name通过m_class_study 查Student_work 88 89 class Admin_user(Base): 90 __tablename__='admin_user' 91 id=Column(Integer,primary_key=True) 92 name=Column(String(32),nullable=False,unique=True) 93 pwd=Column(String(64),nullable=False) 94 95 # 用户 密码 主机 库 96 engine = create_engine(config.HOSTS,)#连接 97 Base.metadata.create_all(engine)#创建表结构
| |- - -admin_log.py#管理员逻辑 类
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 #python 5 #2017/7/9 23:12 6 #__author__='Administrator' 7 import os ,sys 8 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 9 sys.path.append(BASE_DIR)#增加环境变量 10 from sqlalchemy.orm import sessionmaker, relationship 11 from core import admin_class 12 from cfg import config 13 #管理登陆 14 class Admin_Mag(object): 15 def __init__(self): 16 self.Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类 17 self.Session=self.Session_class()#生成实例 18 #开始相关操作 19 def openatin(self):#开始相关操作 20 while True: 21 print('\033[35;1m管理员界面\033[0m'.center(60,'=')) 22 for index,i in enumerate(config.ADMIN_OPEN): 23 print(index,':',i[0]) 24 id=input('请选择>>:') 25 if id.isdigit(): 26 if int(id)>=len(config.ADMIN_OPEN):continue 27 s=config.ADMIN_OPEN[int(id)][1] 28 else: 29 continue 30 if hasattr(self,s):#是反射否存在 31 func=getattr(self,s)#调用 32 func()#执行 33 34 #关联讲师班级 35 def assoc(self): 36 t_id=self.tech_cher() 37 cla_id=self.class_cher() 38 #讲师表对象 39 t=self.Session.query(admin_class.Teacher).filter(admin_class.Teacher.id==t_id).first() 40 #获取班级对象 41 c=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first() 42 t.class_n.append(c) 43 self.Session.commit() 44 print('讲师:',t.name,'班级:',c.name) 45 print('关联完成!') 46 47 #讲师表对象 48 def tech_cher(self): 49 #t=self.Session.query(admin_class.Teacher).all()#讲师表对象 50 t=self.teach_l() 51 #for i in t : 52 #print('编号',i.id,'>>:',i.name) 53 t_id=input('请按编号选择讲师>>:').strip() 54 if t_id.isdigit() :#判断是否是整数 55 for i in t:# 56 if int(t_id)==i.id: 57 return int(t_id)#返回班级ID 58 else: 59 pass 60 else: 61 print('选择讲师有误!') 62 return None 63 #创建班级 64 def add_class(self): 65 print('\033[35;1m创建班级界面\033[0m'.center(60,'=')) 66 self.class_l() 67 attr=input("输入班级名>>:").strip() 68 self.class_list=self.Session.query(admin_class.Class_name).all()#获取班级名列表 69 if attr in self.class_list:#如果存在 70 return print('班级名重复!') 71 c=admin_class.Class_name(name=attr)#创建新班级 72 self.add_all(c) 73 74 #查看讲师 75 def teach_l(self): 76 t=self.Session.query(admin_class.Teacher).all() 77 for i in t: 78 print('编号:',i.id,'讲师姓名:',i.name,'用户名:',i.user,'密码',i.pwd,' 管理班级:',i.class_n) 79 return t 80 81 82 #查看班级 83 def class_l(self): 84 c=self.Session.query(admin_class.Class_name).all()#班级对象 85 print("全部班级信息".center(50,'-')) 86 for i in c: 87 print('编号',i.id,'>>:',i.name) 88 return c 89 90 #查看班级选择 91 def class_cher(self):#查看班级 92 c=self.class_l() 93 class_id=input('请按编号选择班级>>:').strip() 94 if class_id.isdigit() :#判断是否是整数 95 for i in c:# 96 if int(class_id)==i.id: 97 return int(class_id)#返回班级ID 98 else: 99 pass 100 else: 101 print('选择班级有误!') 102 return None 103 #创建讲师 104 def add_teach(self):#创建讲师 105 while True: 106 name =input('输入讲师姓名>>:').strip() 107 user =input('输入讲师用户名>>:').strip() 108 pwd =input('输入讲师密码>>:').strip() 109 t1 = admin_class.Teacher(name=name,user=user,pwd=pwd) 110 self.add_all(t1) 111 e=input('是否继续 Y/y 继续! 其他返回').upper().strip() 112 if e=='Y':continue 113 break 114 #学员添加 115 def add_stu(self):#学员添加 116 while True: 117 name =input('输入学员姓名>>:').strip() 118 pwd =input('输入学员密码>>:').strip() 119 qq =input('输入学员QQ>>:').strip() 120 if not qq.isdigit(): 121 print('QQ必需是数字') 122 continue 123 s=admin_class.Student(name=name,pwd=pwd,qq=int(qq)) 124 self.add_all(s) 125 e=input('是否继续 Y/y 继续! 其他返回').upper().strip() 126 if e=='Y':continue 127 break 128 129 #查看学员 130 def stu_l(self): 131 student_l=self.Session.query(admin_class.Student).all() 132 for i in student_l: 133 print('ID:',i.id,'学员姓名:',i.name,'QQ:',i.qq,'培训班级:<