python项目开发:学员管理系统
学员管理系统
#需求:
1.用户角色:讲师/学员,登陆后根据角色不同能做的事情不同
2.讲师视图
- 管理班级,可创建班级,根据学员qq号把学员加入班级
- 可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录, 即每节课都有整班学员上,
- 为了纪录每位学员的学习成绩,需在创建每节上课纪录是,同时为这个班的每位学员创建一条上课纪录
- 为学员批改成绩, 一条一条的手动修改成绩
3.学员视图
- 提交作业
- 查看作业成绩
- 一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样, 所以提交作业时需先选择班级,再选择具体上课的节数
附加:学员可以查看自己的班级成绩排名
#注:开发过程中遇到的问题
- 只有当两张表都是用class()方法建表时,这两张表之间才能建立反查关联
- 当两张通过class()方法建立的表要建立多对多关系时,第三张表必须使用Table()方法来建立
- Table()方法中建立联合唯一索引:UniqueConstraint("lesson_id","class_id",name="lesson_class_id")
- Table()方法不是通过类来建立映射关系的,因此不能通过"类名"."字段名"来查询
- 获取刚插入数据的主键id,只需刷新一下即可(session.flush())
#业务逻辑:
#数据表设计:
#代码实例
ReadMe.txt
#博客地址:https://www.cnblogs.com/BUPT-MrWu/p/10626405.html
#学员管理系统
- 程序要求:
1.用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下
2.讲师视图
- 管理班级,可创建班级,根据学员qq号把学员加入班级
- 可创建指定班级的上课纪录,注意一节上课纪录对应多条学员的上课纪录, 即每节课都有整班学员上,
- 为了纪录每位学员的学习成绩,需在创建每节上课纪录是,同时为这个班的每位学员创建一条上课纪录
- 为学员批改成绩, 一条一条的手动修改成绩
3.学员视图
- 提交作业
- 查看作业成绩
- 一个学员可以同时属于多个班级,就像报了Linux的同时也可以报名Python一样, 所以提交作业时需先选择班级,再选择具体上课的节数
- 附加:学员可以查看自己的班级成绩排名 #目录结构
|--StudentManageSystem
|--bin
|--start.py #程序入口
|--conf
|--settings.py #配置
|--core
|--main.py #主逻辑交互
|--models
|--datasheet.py #数据表
|--modules
|--authentication.py #登陆模块
|--student_center.py #学生中心
|--teacher_center.py #讲师中心
|--logs #可扩展日志模块
|--ReadMe.txt #初始数据库
- 默认创建两名教师
- id: 1 name: alex password: 111111
- id: 2 name: MrWu password: 222222
- 默认创建20天教学周期
bin//start.py
import os,sys
BASE_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
sys.path.append(BASE_dir)
from core import main if __name__ == '__main__':
obj = main.MainLogic()
conf//settings.py
conn = "mysql+pymysql://root:187847@localhost/testdb?charset=utf8" #数据库连接方式
min_score = 0 #批改作业默认最小分数
max_score = 100 #批改作业默认最大分数
class_days = 20 #课程默认最大周期为20天
core//main.py
from modules import student_center,teacher_center
from models import datasheet
from conf import settings
from sqlalchemy.orm import sessionmaker class MainLogic(object):
def __init__(self):
self.__initialization()
self.interactive() def interactive(self):
while True:
menu = '''
1.学生中心
2.讲师中心
q.退出
'''
print("\033[1;33m欢迎来到学员管理系统\033[0m".center(40,"*").strip(),menu)
user_choice = input("input your choice ID>>>:")
if user_choice == "":
student_center.Student()
elif user_choice =="":
teacher_center.Teacher()
elif user_choice == "q":
print("感谢您使用学员管理系统,退出ing......")
break
def __initialization(self):
'''初始化数据库'''
Session = sessionmaker(bind=datasheet.engine)
session = Session()
query_teacher = session.query(datasheet.Teacher).filter(datasheet.Teacher.id>=1).all()
if not query_teacher:
tea_obj = datasheet.Teacher(name="alex",password="")
tea_obj2 = datasheet.Teacher(name="MrWu",password="")
session.add_all([tea_obj,tea_obj2])
session.commit()
query_lesson = session.query(datasheet.Lesson).filter(datasheet.Lesson.id>=1).all()
if not query_lesson:
lesson_list = []
day = 1
while day <= settings.class_days:
lesson_obj = datasheet.Lesson(class_day=day)
lesson_list.append(lesson_obj)
day += 1
session.add_all(lesson_list)
session.commit()
session.close()
return
modules//authentication.py
from sqlalchemy.orm import sessionmaker
from models import datasheet Session_class = sessionmaker(bind=datasheet.engine)
session = Session_class() def auth(auth_type):
def out_wrapper(func):
def wrapper():
if auth_type == "auth_student":
stu_id = input("请输入学号ID>>>:")
password = input("请输入密码password>>>:")
query_stu_obj = session.query(datasheet.Student).filter(
datasheet.Student.id==stu_id,
datasheet.Student.password==password).first()
if query_stu_obj:
res = func()
return res,stu_id
else:
print("学号ID或密码输入错误!")
return "false"
elif auth_type == "auth_teacher":
tea_id = input("请输入职工号ID>>>:")
password = input("请输入密码password>>>:")
query_tea_obj = session.query(datasheet.Teacher).filter(
datasheet.Teacher.id==tea_id,
datasheet.Teacher.password==password).first()
if query_tea_obj:
res = func()
return res,tea_id
else:
print("教职工号ID或密码输入错误!")
return "false"
return wrapper
return out_wrapper @auth(auth_type="auth_student")
def auth_student_center():
return "true"
@auth(auth_type="auth_teacher")
def auth_teacher_center():
return "true"
modules//student_center.py
import random
from models import datasheet
from modules import authentication
from sqlalchemy.orm import sessionmaker class Student(object):
def __init__(self):
Session_obj = sessionmaker(bind=datasheet.engine)
self.session = Session_obj()
self.interactive() def interactive(self):
while True:
menu = '''
1.学员注册
2.上传作业
3.查看成绩
q.退出
'''
print("\033[1;33m欢迎来到学生管理系统/学员中心\033[0m".center(40, "*"), menu)
user_choice = input("input your choice ID>>>:")
if user_choice == "":
self.sign_up()
elif user_choice == "":
self.up_work()
elif user_choice == "":
self.check_grade()
elif user_choice == "q":
print("\033[1;34m感谢您使用学生管理系统/学员中心\033[0m")
break def sign_up(self):
'''学员注册'''
while True:
name = input("input your name>>>:")
qq = input("input yur QQ number>>>:")
if not name or not qq:
continue
query_student = self.session.query(datasheet.Student).filter(datasheet.Student.qq == qq).first()
if not query_student:
password = str(random.randint(10000, 100000))
stu_obj = datasheet.Student(name=name, qq=qq, password=password)
self.session.add(stu_obj)
self.session.commit()
query_stu_obj = self.session.query(datasheet.Student).filter(datasheet.Student.qq == qq).first()
print("学员[name: %s]注册成功" % (name))
print("请记住登陆信息:\n"
"学号[ID :%s]\n"
"密码[password: %s]" % (query_stu_obj.id, password))
break
else:
print("此学员已注册成功!")
break def up_work(self):
'''上传作业'''
learn_record_obj,lesson_day,lesson_class_id = self.__learn_record()
if learn_record_obj.homework:
print("【lesson day: %s】作业已上传!" % (lesson_day))
else:
learn_record_obj.homework ="Y"
self.session.commit()
print("【lesson day: %s】作业上传完毕"%(lesson_day)) def check_grade(self):
'''查看成绩、排名'''
learn_record_obj,lesson_day,lesson_class_id = self.__learn_record()
score = learn_record_obj.score
if not score:
print("作业还未批改完毕!")
else:
fewer_score_count = self.session.query(datasheet.LearnRecord).filter(
datasheet.LearnRecord.score>score,
datasheet.LearnRecord.lesson_class_id==lesson_class_id).count()
print("【lesson_day: %s】【grade: %s】【ranking: %s】"%(lesson_day,score,fewer_score_count+1)) def __learn_record(self):
'''登陆后,获取learn_record_obj'''
res = authentication.auth_student_center()
if res[0] == "false":
return
stu_id = res[1]
stu_obj = self.session.query(datasheet.Student).filter(datasheet.Student.id == stu_id).first()
while True:
class_id = input("请输入班级ID>>>:")
lesson_day = input("请输入班级lesson day>>>:")
query_lesson_obj = self.session.query(datasheet.Lesson).filter(
datasheet.Lesson.class_day == lesson_day).first()
if not query_lesson_obj:
print("此班级lesson day不存在,请重新输入!")
continue
query_class_obj = self.session.query(datasheet.Class).filter(datasheet.Class.id == class_id).first()
if not query_class_obj:
print("此班级不存在,请重新输入!")
continue
if stu_obj not in query_class_obj.student:
print("您不是此班级的学生!")
continue
lesson_class_obj = self.session.query(datasheet.lesson_MtoM_class).filter(
datasheet.lesson_MtoM_class.class_id == class_id,
datasheet.lesson_MtoM_class.lesson_id == query_lesson_obj.id).first()
learn_record_obj = self.session.query(datasheet.LearnRecord).filter(
datasheet.LearnRecord.stu_id == stu_id,
datasheet.LearnRecord.lesson_class_id == lesson_class_obj.id).first()
if not learn_record_obj:
print("此次班级课节还未完成,无法查询!")
continue
break
return learn_record_obj,lesson_day,lesson_class_obj.id
modules//teacher_center.py
from modules import authentication
from models import datasheet
from conf import settings
from sqlalchemy import func
from sqlalchemy.orm import sessionmaker class Teacher(object):
def __init__(self):
Session_class = sessionmaker(bind=datasheet.engine)
self.session = Session_class()
self.tea_id = self.__auth()
self.interactive() def interactive(self):
while True:
menu = '''
1.创建班级
2.招收学员
3.创建学习记录
4.批改作业
q.退出
'''
print("\033[1;33m欢迎来到学生管理系统/讲师中心\033[0m".center(40, "*"), menu)
choice = input("请输入选择ID>>>:")
if choice == "":
self.create_class()
elif choice == "":
self.enrolling_student()
elif choice == "":
self.create_record()
elif choice == "":
self.correct_work_score()
elif choice == "q":
print("\033[1;34m感谢您使用学生管理系统/讲师中心\033[0m")
break def create_class(self):
'''创建班级,开设课程'''
while True:
max_count = settings.class_days # 课程最大周期数
course = input("请输入您创建班级的课程名>>>:")
if not course: continue
class_day = int(input("请输入课程周期天数[最大为:%s]>>>:" % (max_count)))
if class_day > max_count:
print("输入错误!")
break
class_obj = datasheet.Class(course=course)
tea_obj = self.session.query(datasheet.Teacher).filter(datasheet.Teacher.id == self.tea_id).first()
class_obj.teacher = [tea_obj, ]
self.session.add(class_obj)
self.session.commit()
self.session.flush()
class_lesson_list = []
count = 1
while count <= class_day:
lesson_class_obj = datasheet.lesson_MtoM_class(lesson_id=count,class_id=class_obj.id)
class_lesson_list.append(lesson_class_obj)
count += 1
self.session.add_all(class_lesson_list)
self.session.commit()
if_continue = input("创建[%s班级]成功,是否继续创建?Y/N>>>:" % (course))
if if_continue == "Y":
continue
else:
break def enrolling_student(self):
'''招收学员'''
while True:
class_list = []
qq = input("请输入招收学员的QQ号>>>:")
if not qq: continue
stu_obj = self.session.query(datasheet.Student).filter(datasheet.Student.qq == qq).first()
if not stu_obj:
print("不存在此学生!")
break
tea_obj = self.session.query(datasheet.Teacher).filter(datasheet.Teacher.id == self.tea_id).first()
all_class_obj = tea_obj.banji
class_obj_list = [] #存放班级实例
while True:
class_id = input("请输入学员加入的班级ID>>>:")
query_class_obj = self.session.query(datasheet.Class).filter(datasheet.Class.id==class_id).first()
if query_class_obj not in all_class_obj:
print("不存在此班级或您对此班级没有权限!")
continue
if stu_obj in query_class_obj.student:
print("班级[ID:%s]中已存在此学生!"%(class_id))
continue
if_continue = input("该学生是否要加入其他班级?Y/N>>>:")
if if_continue == "Y":
class_obj_list.append(query_class_obj)
continue
else:
class_obj_list.append(query_class_obj)
break
stu_obj.banji = class_obj_list
self.session.add(stu_obj)
self.session.commit()
if_continue = input("招收[学员%s]成功,是否继续招收新的学员?Y/N>>>:" % (stu_obj.name))
if if_continue == "Y":
continue
else:
break def create_record(self):
'''为学生创建上课记录'''
while True:
class_id = input("请输入班级ID:>>>:")
tea_obj = self.session.query(datasheet.Teacher).filter(datasheet.Teacher.id == self.tea_id).first()
all_class_obj = tea_obj.banji
query_class_obj = self.session.query(datasheet.Class).filter(datasheet.Class.id==class_id).first()
if query_class_obj not in all_class_obj:
print("班级不存在或您对此班级没有权限!")
break
class_day = input("请输入班级lesson day>>>:")
lesson_obj = self.session.query(datasheet.Lesson).filter(datasheet.Lesson.class_day == class_day).first()
if not lesson_obj:
print("输入错误!")
break
lesson_class_obj = self.session.query(datasheet.lesson_MtoM_class).filter(
datasheet.lesson_MtoM_class.lesson_id == lesson_obj.id,
datasheet.lesson_MtoM_class.class_id == class_id).first()
if not lesson_class_obj:
print("不存在这个班级课节!")
break
lesson_class_id = lesson_class_obj.id
query_learn_record = lesson_class_obj.learn_record
if not query_learn_record:
pass
else:
print("班级[ID:%s] lesson day[day:%s]的记录已存在!"%(class_id,class_day))
break
all_student_obj = query_class_obj.student
learn_record_list = [] # 存放LearnRecord实例
for stu_obj in all_student_obj:
while True:
if_absence = input("请输入学生[姓名: %s qq: %s]是否正常上课?Y/N>>>:" % (stu_obj.name, stu_obj.qq))
if if_absence == "Y" or if_absence == "N":
obj = datasheet.LearnRecord(stu_id=stu_obj.id, lesson_class_id=lesson_class_id,
status=if_absence)
learn_record_list.append(obj)
break
else:
print("输入错误,请重新输入!")
self.session.add_all(learn_record_list)
self.session.commit()
if_continue = input("为班级[ID: %s]创建学习记录完毕,是否为其他班级创建学习记录?Y/N>>>:"%(class_id))
if if_continue == "Y":
continue
else:
break def correct_work_score(self):
'''为学生批改成绩'''
while True:
class_id = input("请输入班级ID:>>>:")
class_day = input("请输入班级lesson day>>>:")
if not class_id or not class_day:continue
lesson_obj = self.session.query(datasheet.Lesson).filter(datasheet.Lesson.class_day==class_day).first()
if not lesson_obj:
print("不存在此班级lesson day!")
break
lesson_class_obj = self.session.query(datasheet.lesson_MtoM_class).filter(
datasheet.lesson_MtoM_class.class_id==class_id,
datasheet.lesson_MtoM_class.lesson_id==lesson_obj.id).first()
if not lesson_class_obj:
print("不存在此班级课节!")
break
all_learn_record = lesson_class_obj.learn_record
if not all_learn_record:
print("此班级课节未完成,无法批改成绩!")
break
for learn_record_obj in all_learn_record:
while True:
print("学号ID: %s 作业完成情况: %s 考勤记录: %s"%(learn_record_obj.stu_id,
learn_record_obj.homework,learn_record_obj.status)) score = int(input("请为该学生打上成绩>>>:"))
if score >= settings.min_score and score <= settings.max_score:
learn_record_obj.score = score
break
else:
print("输入范围超过限制,请重新输入!")
self.session.commit()
if_continue = input("班级[ID:%s]的作业以批改完毕,是否继续批改其他班级的作业?Y/N>>>:")
if if_continue == "Y":
continue
else:
break def __auth(self):
res = authentication.auth_teacher_center()
if res[0] == "false":
return
return res[1]
models//datasheet.py
import sqlalchemy
from conf import settings
from sqlalchemy import Column,Table,create_engine
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer,String,Enum,Date,ForeignKey,UniqueConstraint engine = create_engine(settings.conn)
Base = declarative_base() stu_MtoM_class = Table(
"stu_MtoM_class",Base.metadata,
Column('stu_id',Integer,ForeignKey("student.id")),
Column("class_id",Integer,ForeignKey("banji.id"))
) tea_MtoM_class = Table(
"tea_MtoM_class",Base.metadata,
Column("tea_id",Integer,ForeignKey("teacher.id")),
Column("class_id",Integer,ForeignKey("banji.id")),
) # lesson_MtoM_class = Table(
# "lesson_MtoM_class",Base.metadata,
# Column("id",Integer,primary_key=True),
# Column("lesson_id",Integer,ForeignKey("lesson.id")),
# Column("class_id",Integer,ForeignKey("banji.id")),
# UniqueConstraint("lesson_id","class_id",name="lesson_class_id") #建立联合唯一索引
# )
class lesson_MtoM_class(Base):
__tablename__ = "lesson_MtoM_class"
__table_args__ = (UniqueConstraint("lesson_id","class_id",name="lesson_class_id"),)
id = Column(Integer,primary_key=True)
lesson_id = Column(Integer,ForeignKey("lesson.id"))
class_id = Column(Integer,ForeignKey("banji.id")) class Student(Base):
__tablename__ = 'student'
id = Column(Integer,primary_key=True)
name = Column(String(32),nullable=False)
qq = Column(String(32),unique=True,nullable=False)
password = Column(String(16),nullable=False)
banji = relationship("Class",secondary="stu_MtoM_class",backref="student")
learn_record = relationship("LearnRecord",backref="student") class Teacher(Base):
__tablename__ = 'teacher'
id = Column(Integer,primary_key=True)
name = Column(String(32),nullable=False)
password = Column(String(16),nullable=False)
banji = relationship("Class",secondary="tea_MtoM_class",backref="teacher") class Class(Base):
__tablename__ = 'banji'
id = Column(Integer,primary_key=True)
course = Column(String(32),nullable=False) class Lesson(Base):
__tablename__ = "lesson"
id = Column(Integer,primary_key=True)
class_day = Column(Integer,unique=True,nullable=False)
# banji = relationship("Class",secondary="lesson_MtoM_class",backref="lesson")#不能通过第三张类表建立反查关联 class LearnRecord(Base):
__tablename__ = 'learn_record'
__table_args__ = (UniqueConstraint("stu_id","lesson_class_id",name="stu_lesson_class_id"),)
id = Column(Integer,primary_key=True)
stu_id = Column(Integer,ForeignKey("student.id"))
lesson_class_id = Column(Integer,ForeignKey("lesson_MtoM_class.id"))
status = Column(Enum("Y","N"),nullable=False)
homework = Column(Enum("Y","N"))
score = Column(Integer)
lesson_MtoM_class = relationship("lesson_MtoM_class",backref="learn_record") Base.metadata.create_all(engine)
#运行实例
python项目开发:学员管理系统的更多相关文章
- python项目开发视频
精品Python项目开发学习视频 所属网站分类: 资源下载 > python视频教程 作者:乐天派 链接:http://www.pythonheidong.com/blog/article/44 ...
- IDEA 学习笔记之 Python项目开发
Python项目开发: 下载Python: https://www.python.org/downloads/release/python-363/ 安装Python: 配置环境变量(path): C ...
- python项目开发:ftp server开发
程序要求: 1.用户加密认证 (对用户名密码进行MD5验证)2.允许同时多用户登陆 (使用socket server方法,为每个用户都创建一个信息文件)3.每个用户有自己的家目录,且只能访问自己的家目 ...
- Python项目开发公用方法--excel生成方法
在实际开发中,我们有时会遇到数据导出的需求.一般的,导出的文件格式为Excel形式. 那么,excel的生成就适合抽离出一个独立的公用方法来实现: def generate_excel(excel_n ...
- python项目开发:用RabbitMQ实现异步RPC
程序要求: 1. 用Rabbit MQ实现RPC 1. 可以异步地执行多条命令 2. 可以对一次性对多个机器执行命令 程序效果: --->run dir host1 host2 .... --- ...
- Django项目之【学员管理系统】
Django项目[学员管理系统] 项目规划阶段 项目背景 现实生活中,特别是在学校,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求. 因此需一套方便易用的“学员管理系统”,来提高 ...
- Python基础之模块:7、项目开发流程和项目需求分析及软件开发目录
一.项目开发流程 1.项目需求分析 明确项目具体功能: 明确到底要写什么东西,实现什么功能,在这个阶段的具体要询问项目经理和客户的需求 参与人员: 产品经理.架构师.开发经理 技术人员主要职责: 引导 ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- Python开发程序:学员管理系统(mysql)
主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...
随机推荐
- Linux framebuffer显示bmp图片【转】
本文转载自:http://blog.csdn.net/luxiaoxun/article/details/7622988 framebuffer简介 帧缓冲(framebuffer)是Linux为显示 ...
- bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...
- uoj#149
dp 没想出来 最先开始想 dp[i][j][k]表示s匹配到i,t匹配到j,当前分了k段的方案数 s[i]==t[j] dp[i][j][k]+=dp[i-1][j-1][k-1] s[i]==t[ ...
- js getyear和getfullyear
getyear()函数如果今年是2015年会得到115,getfullyear()会得到完整的年份.
- [Apple开发者帐户帮助]五、管理标识符(4)注册一个应用程序组
您需要注册一个或多个组才能启用应用组. 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左侧的弹出菜单中选择操作系统. 在“标识符”下,选择“应用程序组”,然后单击右上角的“添 ...
- python大杂铺
python中continue,break,return三者之间的区别 return 会直接令函数返回,所有该函数体内的代码都不再执行了,所以该函数体内的循环也不可能再继续运行. break:跳出 ...
- go的接口
一.接口定义 接口类型 在讲基础数据类型时,我们曾提了一下 interface 数据类型,这个数据类型就是接口类型 什么是接口 Go 语言不是"传统"的面向对象的编程语言:它里面没 ...
- 快速搭建ELK集中化日志管理平台
由于我们的项目是分布式,服务分布于多个服务器上,每次查看日志都要登录不同服务器查看,而且查看起来还比较麻烦,老大让搭一个集中化日志管理的东西,然后就在网上找到了这个东西ELK ELK就是elastic ...
- B - String Task
Problem description Petya started to attend programming lessons. On the first lesson his task was to ...
- MySql c#通用类
using System; using System.Collections.Generic; using System.Linq; using System.Text;//导命名空间 using S ...