主题:
需求:
用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下
讲师视图
管理班级,可创建班级,根据学员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 ,sysView Code
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 ,sysView Code
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 ,sysView Code
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 ,sysView Code
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 ,sysView Code
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 pythonView Code
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 pythonView Code
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,'培训班级:',i.class_name)
134 return student_l
135
136 #学员选择
137 def stu_cher(self):
138 student_l=self.stu_l()
139 stu_id=input('请按ID选择学员>>:').strip()
140 if stu_id.isdigit() :#判断是否是整数
141 for i in student_l:#
142 if int(stu_id)==i.id:
143 return int(stu_id)#返回班级ID
144 else:
145 pass
146 else:
147 print('选择学员有误!')
148 return None
149
150 #班级关联学员
151 def class_student(self):#班级增加学员
152 print('\033[35;1m班级关联学员界面\033[0m'.center(60,'='))
153 cla_id=self.class_cher()#调用查看班级
154 if not cla_id:return None
155 #获取班级对象
156 c=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()
157 if not c:return None
158 stu_id=self.stu_cher()
159 #student_qq=input('请输入学生QQ号码>>:').strip()
160 s_qq=self.Session.query(admin_class.Student).filter(admin_class.Student.id==stu_id).first()#学员qq对象
161 if s_qq:#如果有这个qq
162 c.students.append(s_qq)#加入班级
163 self.Session.commit()
164 print('加入班级成功!')
165 else:
166 return print('对应的学员不存在')
167
168 #增加函数
169 def add_all(self,lists):#增加函数
170 self.Session.add_all([lists])
171 confirm=input('请进行确认: 按\033[31;1mN\033[0m回滚操作,其他键确认!' ).upper().strip()
172 if confirm=="N":
173 self.Session.rollback()#
174 return False
175 try:
176 self.Session.commit()
177 print('操作成功')
178 return
179 except Exception as e:
180 self.Session.rollback()#
181 print('操作失败!,可能该信息已经存在!')
182 print(e)
183 return
184 #退出
185 def tech_exit(self):
186 return exit()
187
188 #登陆
189 #登陆
190 def user_log(self):#登陆
191 user_n=input('请输入管理员用户名>>:').strip()
192 aut_obj=self.Session.query(admin_class.Admin_user).filter(admin_class.Admin_user.name==user_n).first()
193 if aut_obj:
194 #print(self.aut_obj_1.pwd)#用户对应密码
195 pwds=input('请输入密码>>:').strip()
196 if pwds == aut_obj.pwd:
197
198 self.openatin()
199 else:
200 print('密码有误')
201 return
202 else:
203 print('输入的用户名不存')
204 return
| |- - -student_class.py#学员逻辑 类
1 #!usr/bin/env pythonView Code
2 #-*-coding:utf-8-*-
3 # Author calmyan
4 #python
5 #2017/7/8 12:29
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.ext.declarative import declarative_base
11 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
12 from sqlalchemy.orm import sessionmaker, relationship
13 from sqlalchemy import create_engine
14 from sqlalchemy import func #统计
15 from core import admin_class
16 from cfg import config
17 #学员类
18 class Stu_Mag(object):
19
20 def __init__(self):
21 self.Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类
22 self.Session=self.Session_class()#生成实例
23 self.stu_name=''#学员姓名
24
25 #开始相关操作
26 def openatin(self):#开始相关操作
27 while True:
28 print('\033[32;1m学员界面\033[0m'.center(60,'='))
29 print(('\033[36;1m[%s]\033[0m'%self.stu_name).center(60,'='))
30
31 for index,i in enumerate(config.STUED_OPEN):
32 print(index,':',i[0])
33 id=input('请选择>>:')
34 if id.isdigit():
35 if int(id)>=len(config.STUED_OPEN):continue
36 s=config.STUED_OPEN[int(id)][1]
37 else:
38 continue
39 if hasattr(self,s):#是反射否存在
40 func=getattr(self,s)#调用
41 func()#执行
42
43 #提交作业
44 def up_work(self):
45 class_id=self.class_l()
46 if not class_id:
47 return None#班级ID
48 les_id=self.lessn_obj(class_id)#课节表ID\
49 if not les_id:return None
50 cl_dayid=self.class_less(class_id,les_id)#课程表ID
51 if cl_dayid:
52 stu_id=self.stu_obj.id#学员ID
53 stu_work=self.Session.query(admin_class.Student_work).filter_by(students_id=stu_id,class_id=cl_dayid.id).first()
54 if stu_work:
55 if stu_work.status=='yes':
56 print('\033[31;1m作业已经提交,不能重复提交!\033[0m')
57 return None
58 #对应的课程表
59 les_n=self.Session.query(admin_class.Class_Day).filter_by(class_id=class_id,lesson_id=les_id).first()
60 print('姓名:',self.stu_name,'班级:',les_n.class_n,'课节:',les_n.lesson_n,'作业提交状态:',stu_work.status,'成绩:',stu_work.results)
61 chend=input('提交作业>>>: Y/y 确认!').upper().strip()
62 if chend=='Y':
63 self.Session.query(admin_class.Student_work).filter_by(students_id=stu_id,class_id=cl_dayid.id).update({"status":"yes"})
64 print('提交完成!')
65 self.Session.commit()
66 return
67 else:
68 return None
69 else:
70 print('\033[31;1m您可能没有上本节课!无法提交\033[0m')
71 return None
72 else:
73 print('\033[31;1m本节课可能没有开始!\033[0m')
74 return None
75
76
77 #获取课程ID
78 def class_less(self,cla_id,les_id):
79 cl_dayid=self.Session.query(admin_class.Class_Day).filter(admin_class.Class_Day.class_id==cla_id).\
80 filter(admin_class.Class_Day.lesson_id==les_id).first()#获取班级课程表id
81 if cl_dayid:
82 return cl_dayid
83 else:
84 return None
85
86 #获取课程表 选课节
87 def lessn_obj(self,cla):
88 les_l=self.Session.query(admin_class.Class_Day).filter_by(class_id=cla).all()
89 for i in les_l:
90 print('编号:',i.lesson_id,'课节:',i.lesson_n)
91 les_id=input('请按编号选择课节 >>:').strip()
92 if les_id.isdigit():
93 for i in les_l:
94 if int(les_id)==i.lesson_id:
95 return int(les_id)#返回课节ID
96 else:
97 print('选择课节有误!')
98 return None
99 else:
100 print('选择课节有误!')
101 return None
102
103 #查看班级选择
104 def class_l(self):#查看班级
105 for i in self.stu_obj.class_name:
106 print('编号',i.id,'>>:',i.name)
107 class_id=input('请按编号选择班级>>:').strip()
108 if class_id.isdigit() :#判断是否是整数
109 for i in self.stu_obj.class_name:#是否在学员的班级中
110 if int(class_id)==i.id:
111 return int(class_id)#返回班级ID
112 else:
113 print('选择班级有误!')
114 return None
115 else:
116 print('选择班级有误!')
117 return None
118
119 #查看课节
120 def lesson_l(self):
121 for i in self.les:
122 print('编号',i.id,'>>:',i)
123 les_id=input('请按编号选择课节 >>:').strip()
124 if les_id.isdigit():
125 for i in self.les:
126 if int(les_id)==i.id:
127 return int(les_id)#返回课节ID
128 else:
129 pass
130 else:
131 print('选择课节有误!')
132 return None
133
134 #查看成绩
135 def set_resu(self):
136 class_id=self.class_l()#班级ID
137 les_l=self.Session.query(admin_class.Class_Day).filter_by(class_id=class_id).all()#本班所有课节
138 stu_id=self.stu_obj.id#学员ID
139 for i in les_l:
140 stu_work=self.Session.query(admin_class.Student_work).filter_by(students_id=stu_id,class_id=i.id).first()#取对应的课节
141 if stu_work:
142 cla_day=self.Session.query(admin_class.Class_Day).filter_by(id=stu_work.class_id).first()#课程表对象
143 if cla_day:
144 print('姓名:',self.stu_name,'班级:',cla_day.class_n,'课节:',cla_day.lesson_n,' 作业提交状态:',stu_work.status,'成绩:',stu_work.results)
145 else:
146 pass
147 else:
148 pass
149
150 #查看排名
151 def cla_top(self):
152 class_id=self.class_l()#班级ID
153 les_l=self.Session.query(admin_class.Class_Day).filter_by(class_id=class_id).all()#取当前班级的所有课节
154 stu_id_l=self.Session.query(admin_class.Student).all()#取学生id
155 top_list=[]#分数
156 for i in stu_id_l:
157 resut=0
158 for j in les_l:
159 stu_work=self.Session.query(admin_class.Student_work).filter_by(students_id=i.id,class_id=j.id).first()
160 if not stu_work:continue
161 if stu_work.results:
162 resut+=int(stu_work.results)
163 else:
164 top_list.append((resut,i.name))
165 print(top_list)
166 self.sort(top_list)
167 for index,i in enumerate(top_list):
168 print('名次',index+1,'总分数--姓名:',i)
169
170 #排序
171 def sort(self,ls):
172 for i in range(len(ls)-1):
173 for j in range(len(ls)-i-1):
174 if ls[j]<ls[j+1]:
175 ls[j],ls[j+1] =ls[j+1],ls[j]
176 return ls
177
178
179
180 #退出
181 def tech_exit(self):
182 return exit()
183
184 #登陆
185 def user_log(self):#登陆
186 user_n=input('请输入用户名(qq)>>:').strip()
187 if not user_n.isdigit():return None
188 aut_obj=self.Session.query(admin_class.Student).filter(admin_class.Student.qq==int(user_n)).first()
189 if aut_obj:
190 #print(self.aut_obj_1.pwd)#用户对应密码
191 pwds=input('请输入密码>>:').strip()
192 if pwds == aut_obj.pwd:
193 self.stu_name=aut_obj.name
194 self.qq=aut_obj.qq
195 self.stu_obj = self.Session.query(admin_class.Student).filter(admin_class.Student.qq==self.qq).first()#取当前学员对象实例
196 self.openatin()
197 else:
198 print('密码有误')
199 return
200 else:
201 print('输入的用户名不存')
202 return
203
204
205
206 #stu.up_work()
| |- - -teach_class.py#讲师逻辑 类
1 #!usr/bin/env pythonView Code
2 #-*-coding:utf-8-*-
3 # Author calmyan
4 #python
5 #2017/7/7 17:48
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
13 from sqlalchemy.orm import sessionmaker, relationship
14 from sqlalchemy import create_engine
15 from sqlalchemy import func #统计
16 from core import admin_class
17 from cfg import config
18
19 #讲师类
20 class Teach_Mag(object):
21
22 def __init__(self):
23 self.Session_class=sessionmaker(bind=admin_class.engine)#创建与数据库的会话 类
24 self.Session=self.Session_class()#生成实例
25 self.teach_name=''
26
27 #开始相关操作
28 def openatin(self):#开始相关操作
29 while True:
30 print('\033[35;1m讲师界面\033[0m'.center(60,'='))
31 for index,i in enumerate(config.TEACH_OPEN):
32 print(index,':',i[0])
33 id=input('请选择>>:')
34 if id.isdigit():
35 if int(id)>=len(config.TEACH_OPEN):continue
36 s=config.TEACH_OPEN[int(id)][1]
37 else:
38 continue
39 if hasattr(self,s):#是反射否存在
40 func=getattr(self,s)#调用
41 func()#执行
42
43 #查看班级
44 def show_class(self):#查看班级
45 print('\033[32;1m查看班级(可管理)\033[0m'.center(60,'='))
46 #show_class=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.teach_name==self.teach_name)
47 print('\033[31;1m全部班级\033[0m'.center(45,'-'))#所有班级
48 for i in self.class_list:
49 print(i)
50 print('\033[35;1m可管理班级\033[0m'.center(45,'-'))
51 cla_id=self.class_l()#调用查看班级
52 class_obj=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()
53 if class_obj:#获取班级对象成功 有内容
54 print(class_obj,class_obj.name,class_obj.id)
55 self.student_l(class_obj.name)#调用查看学员 得到班级对象
56 # print('[%s] 班 学员列表'.center(60,'=')%c)
57 # for i in c.students:
58 # print(i.id,'姓名:',i.name,'QQ:',i.qq)
59 # print('end'.center(60,'='))
60 return
61 else:
62 print('选择有误!')
63 return
64
65 #查看班级选择
66 def class_l(self):#查看班级
67 for i in self.teach_obj.class_n:
68 print('编号',i.id,'班级:',i.name)
69 class_id=input('请按编号选择班级>>:').strip()
70 if class_id.isdigit() :#判断是否是整数
71 for i in self.teach_obj.class_n:#是否在讲师的班级中
72 if int(class_id)==i.id:
73 return int(class_id)#返回班级ID
74 else:
75 print('选择班级有误!')
76 return None
77 else:
78 print('选择班级有误!')
79 return None
80
81 #查看班级学员
82 def student_l(self,class_name):#查看班级学员
83 stu_l=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.name==str(class_name)).first()#所选班级对象
84 print('[%s] 班 学员列表'.center(60,'=')%stu_l)
85 for i in stu_l.students:
86 print(i.id,'姓名:',i.name,'QQ:',i.qq)
87 print('end'.center(60,'='))
88 return stu_l#返回所选班级对象
89
90 #查看课节
91 def less_cher(self):
92 les=self.Session.query(admin_class.Lesson).all()#取课节名列表
93 for i in les:
94 print('编号',i.id,'课节名>>:',i)
95 return les
96 #查看课节 选择
97 def lesson_l(self):
98 les=self.less_cher()#取课节名列表
99 # for i in les:
100 # print('编号',i.id,'课节名>>:',i)
101 les_id=input('请按编号选择课节 >>:').strip()
102 if les_id.isdigit():
103 for i in les:
104 if int(les_id)==i.id:
105 return int(les_id)#返回课节ID
106 else:
107 print('选择课节有误!')
108 return None
109 else:
110 print('选择课节有误!')
111 return None
112
113 #创建班级
114 def add_class(self):#创建班级
115 print('\033[35;1m创建班级界面\033[0m'.center(60,'='))
116 attr=input("输入班级名>>:").strip()
117 if attr in self.class_list:#如果存在
118 return print('班级名重复!')
119 c=admin_class.Class_name(name=attr)#创建新班级
120 self.teach_obj.class_n.append(c)#关联讲师与班级
121 if self.add_all(c):#进行调用添加
122 self.Session.add_all([c])
123 self.Session.commit()
124 return
125
126 #班级增加学员
127 def add_student(self):#班级增加学员
128 print('\033[35;1m增加学员界面\033[0m'.center(60,'='))
129 cla_id=self.class_l()#调用查看班级
130 if not cla_id:return None
131 #获取班级对象
132 c=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()
133 if not c:return None
134 stu_l=self.student_l(c.name)#查看班级学员
135 student_qq=input('请输入学生QQ号码>>:').strip()
136 s_qq=self.Session.query(admin_class.Student).filter(admin_class.Student.qq==int(student_qq)).first()#学员qq对象
137 if s_qq:#如果有这个qq
138 c.students.append(s_qq)#加入班级
139 self.Session.commit()
140 print('加入班级成功!')
141 else:
142 return print('QQ对应的学员不存在')
143
144 #添加课节
145 def add_lesson(self):#添加课节
146 print('现有课节'.center(40,'='))
147 les=self.less_cher()#取课节名列表
148 day_name=input('输入课节名>>:').strip()
149 d1=admin_class.Lesson(name=day_name)
150 self.add_all(d1)
151
152 #获取课程ID
153 def class_less(self,cla_id,les_id):
154
155 cl_dayid=self.Session.query(admin_class.Class_Day).filter(admin_class.Class_Day.class_id==cla_id).\
156 filter(admin_class.Class_Day.lesson_id==les_id).first()#获取班级课程表id
157 if cl_dayid:
158 return cl_dayid
159 else:
160 return None
161
162 #获取班级对象
163 def class_obj(self,cla_id):
164 clas_obj=self.Session.query(admin_class.Class_name).filter(admin_class.Class_name.id==cla_id).first()#获取班级对象
165 return clas_obj
166
167 #开始上课
168 def add_cla_day(self):#开始上课
169 print('\033[32;1m班级上课\033[0m'.center(60,'='))
170 cla_id=self.class_l()##获取班级id
171 if not cla_id:return None
172 les_id=self.lesson_l()#获取课节id
173 if not les_id:return None
174 clas_obj=self.class_obj(cla_id)#获取班级对象
175 print(clas_obj,clas_obj.id)#班级名,ID
176 cl_dayid=self.class_less(cla_id,les_id)#获取课程表对象
177 if cl_dayid:#如果课程表存在
178 print('当前班级该节课已经上过!')
179 return
180 clas_day=admin_class.Class_Day(class_id=cla_id,lesson_id=les_id)#创建上课课程记录
181 self.Session.add(clas_day)#添加记录
182 cl_day_id=self.class_less(cla_id,les_id)#获取当前班级课程对象
183 c_obj=self.student_l(cl_day_id.class_n)#获取班级 学员对象
184 for i in c_obj.students:
185 stu_work=admin_class.Student_work(students_id=i.id,class_id=cl_day_id.id,status='not')#创建上课记录
186 self.Session.add(stu_work)#添加记录
187 self.Session.commit()
188 return print('上课记录添加完成')
189
190 #批改作业
191 def set_results(self):#批改作业
192 print('\033[32;1m批改作业\033[0m'.center(60,'='))
193 cla_id=self.class_l()##获取班级id
194 if not cla_id:return None
195 les_id=self.lesson_l()#获取课节id
196 if not les_id:return None
197 cl_day_id=self.class_less(cla_id,les_id)#获取课程表对象
198 if not cl_day_id:print('本节课未上!');return None
199 #获取当前班级中,
200 stude_day=self.Session.query(admin_class.Student_work).filter(admin_class.Student_work.class_id==cl_day_id.id).all()
201 print('\033[36;1m开始批改作业\033[0m'.center(60,'='))
202 print('\033[31;1m作业未提交则不显示\033[0m')
203 for i in stude_day:
204 if i.status=='yes' and not i.results:
205 print(i.id,'姓名:',i.students_w.name,'成绩:',i.results)
206 resu=input('请输入成绩>>:').strip()
207 if resu.isdigit():
208 self.Session.query(admin_class.Student_work).filter(admin_class.Student_work.id==i.id).update({"results":resu})
209 elif i.status=='yes' and i.results:
210 print(i.id,'姓名:',i.students_w.name,'成绩:',i.results)
211 resu=input('是否修改成绩? N/n 跳过,输入新成绩').upper().strip()
212 if resu=='N':
213 continue
214 if resu.isdigit():
215 self.Session.query(admin_class.Student_work).filter(admin_class.Student_work.id==i.id).update({"results":resu})
216
217 else:
218 self.Session.commit()
219 print("已提交的作业全部批改完毕!")
220
221 #增加函数
222 def add_all(self,lists):#增加函数
223 self.Session.add_all([lists])
224 confirm=input('请进行确认: 按\033[31;1mN\033[0m回滚操作,其他键确认!' ).upper().strip()
225 if confirm=="N":
226 self.Session.rollback()#
227 return False
228 try:
229 self.Session.commit()
230 print('操作成功')
231 return lists
232 except Exception as e:
233 self.Session.rollback()#
234 print('操作失败!,可能该信息已经存在!')
235 return
236
237 #退出
238 def tech_exit(self):
239 return exit()
240 #登陆
241 def user_log(self):#登陆
242 user_n=input('请输入用户名>>:').strip()
243 aut_obj=self.Session.query(admin_class.Teacher).filter(admin_class.Teacher.user==user_n).first()
244 if aut_obj:
245 #print(self.aut_obj_1.pwd)#用户对应密码
246 pwds=input('请输入密码>>:').strip()
247 if pwds == aut_obj.pwd:
248 self.teach_name=aut_obj.name
249 #print(self.teach_name)#当前讲师姓名
250 self.teach_obj = self.Session.query(admin_class.Teacher).filter(admin_class.Teacher.name==self.teach_name).first()#取当前讲课对象实例
251 self.class_list=self.Session.query(admin_class.Class_name).all()#获取班级名列表
252 #self.les=self.Session.query(admin_class.Lesson).all()#取课节名列表
253 #print(self.s_name_list[2])
254 self.openatin()
255 else:
256 print('密码有误')
257 return
258 else:
259 print('输入的用户名不存')
260 return
261
262 #Session.query()
263 while True:
264 teach=Teach_Mag()
265 #teach.add_teach()
266 #teach.add_stu()
267
268 teach.user_log()