主题:
需求:
用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下
讲师视图
管理班级,可创建班级,根据学员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('