当前位置: 首页 > news >正文

python Django项目学生管理系统

涉及技术:
后台:Django mysql
前端:Html css js Ajax boostrap
数据库:MySQL5.7

功能简介:

管理系统使用Xadmin框架,内置Bootstrap3、插件库

  • 登录注册:普通用户与管理人员入口不同,老师及学生通过状态选择验证。
  • 权限管理:权限组管理及个人权限管理。
  • 基本信息管理:针对用户(学生,老师,年级主任,管理人员)基本信息的增删改查。
  • 年级管理:年级与年级主任,该年级下属的班级关联。
  • 班级管理:班级与班级主任,授课老师,该班级所有的学生,统计学生数,按老师筛选班级。
  • 宿舍管理:宿舍责任老师,宿舍长,以及当前宿舍学生。
  • 考试管理:考试记录的建立。
  • 成绩管理:成绩排名,单条成绩记录的增加修改以及删除时同此考试,年级或班级的相应个人成绩重新排序。
  • 增删改查,异步处理,唯一性判断,缓存清楚功能,重要数据加密功能,正则表达式判断功能

部署效果截图

学生信息表

请添加图片描述

管理人员表

在这里插入图片描述

学生基本信息

请添加图片描述

登陆界面

请添加图片描述

部分代码

class Administrator(AbstractUser):"""管理人员"""id = models.AutoField(verbose_name='管理人员编号', db_column='管理员编号', primary_key=True)username = models.CharField(max_length=150, verbose_name='用户名', db_column='用户名', unique=True)password = models.CharField(max_length=128, verbose_name='密码', db_column='密码')email = models.EmailField(verbose_name='邮箱', db_column='邮箱', null=True, blank=True)add_time = models.DateTimeField(default=datetime.now, db_column='添加时间', verbose_name="添加时间")remark = models.TextField(max_length=100, verbose_name='备注', db_column='备注', default='',null=True , blank=True,help_text='备注不超过一百个汉字',error_messages={'max_length': '备注不超过一百个字'})class Meta:verbose_name = '管理人员'verbose_name_plural = verbose_namedb_table = '管理人员表'def __str__(self):return self.usernameclass EmailVerifyRecord(models.Model):"""邮箱验证码"""SEND_CHOICES = (("register", "注册"),("forget", "找回密码"),("update_email", "修改邮箱"))code = models.CharField(max_length=50, verbose_name="验证码", db_column='验证码')email = models.EmailField(max_length=50, verbose_name="邮箱", db_column='邮箱')send_type = models.CharField(choices=SEND_CHOICES, max_length=20, verbose_name="发送类型", db_column='验证码类型')send_time = models.DateTimeField(default=datetime.now, verbose_name="发送时间", db_column='发送时间')# 将now()中的括号去掉保证默认时间是models实例化的时间,而不是编译时间class Meta:verbose_name = "邮箱验证码"verbose_name_plural = verbose_namedb_table = '验证码表'def __str__(self):return self.codeclass DormitoryInfo(models.Model):"""宿舍信息"""dormitory_number = models.CharField(max_length=5, db_column='寝室号', verbose_name='寝室号', default='001')year = models.CharField(max_length=10, db_column='年份', default='2018', verbose_name='年份',)teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL,null=True, verbose_name='老师档案号', db_column='老师档案号')remark = models.TextField(max_length=100, verbose_name='备注', db_column='备注',help_text='备注不超过一百个汉字',null=True, blank=True,error_messages={'max_length': '备注不超过一百个字'})class Meta:verbose_name = '宿舍'verbose_name_plural = verbose_name# ordering = ['year', 'dormitory_number']db_table = '宿舍信息表'# unique_together = ['dormitory_number', 'year']def __str__(self):return "{0}年入住,宿舍号:{1}".format(self.year, self.dormitory_number)def get_dormitory_students(self):students_list = self.studentinfo_set.all()students_list = ','.join([i.student_name for i in students_list])return students_listget_dormitory_students.short_description = '宿舍学生'def get_student_number(self):num = self.studentinfo_set.all().count()return numget_student_number.short_description = '宿舍当前人数'class GradeInfo(models.Model):"""年级信息"""grade_number = models.CharField(max_length=2, db_column='年级', verbose_name='年级', default='1')year = models.CharField(max_length=10, db_column='届', verbose_name='届', default='2018', unique=True,help_text='学生入学年份')header = models.CharField(max_length=10, db_column='年级主任', verbose_name='年级主任', default='', null=True, blank=True)remark = models.TextField(max_length=100, verbose_name='备注', db_column='备注',default='', null=True, blank=True,help_text='备注不超过一百个汉字',error_messages={'max_length': '备注不超过一百个字'})class Meta:verbose_name = '年级信息'verbose_name_plural = verbose_namedb_table = '年级信息表'# unique_together = ['grade_number', 'year']# ordering = ['-year', 'grade_number']  # datetime.time 对象不可序列化def __str__(self):year_now = date.today().yearmonth_now = date.today().month#  计算出年级,但是为防止转校生,没有动态的加载到数据库if month_now >= 9 and year_now >= int(self.year):grade = year_now - int(self.year) + 1elif month_now < 9 and year_now >= int(self.year):grade = year_now - int(self.year)else:grade = int(self.grade_number)# 如果学生的年级大于三年级,则显示已经毕业if grade > 3:return '{0}届入学, 目前已毕业'.format(self.year)else:return '{0}届入学, 目前{1}年级'.format(self.year, grade)def save(self, *args, **kwargs):super(GradeInfo, self).save(*args, **kwargs)def get_class_number(self):# 通过关联查询该年级的所有班级数num = self.classinfo_set.count()return numget_class_number.short_description = '班级数'def get_grade_students_number(self):return self.studentinfo_set.all().count()get_grade_students_number.short_description = '年级总人数'
class ClassInfo(models.Model):"""班级信息"""class_number = models.CharField(max_length=5, db_column='班级', verbose_name='班级', default='1')header = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, null=True,limit_choices_to={'is_class_leader': True},verbose_name='班主任档案号', db_column='班主任档案号')grade = models.ForeignKey(GradeInfo, on_delete=models.SET_NULL, null=True, verbose_name='年级', db_column='年级')# 各科老师chinese_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='chinese_teacher_class',limit_choices_to={'subject': '语文'}, blank=True,null=True, verbose_name='语文老师', db_column='语文老师')math_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='math_teacher_class',limit_choices_to={'subject': '数学'}, blank=True,null=True, verbose_name='数学老师', db_column='数学老师')english_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='english_teacher_class',limit_choices_to={'subject': '英语'}, blank=True,null=True, verbose_name='英语老师', db_column='英语老师')physical_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='physical_teacher_class',limit_choices_to={'subject': '物理'}, blank=True,null=True, verbose_name='物理老师', db_column='物理老师')chemistry_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL,related_name='chemistry_teacher_class',limit_choices_to={'subject': '化学'}, blank=True,null=True, verbose_name='化学老师', db_column='化学老师')biology_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='biology_teacher_class',limit_choices_to={'subject': '生物'}, blank=True,null=True, verbose_name='生物老师', db_column='生物老师')politics_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='politics_teacher_class',limit_choices_to={'subject': '政治'}, blank=True,null=True, verbose_name='政治老师', db_column='政治老师')geography_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL,related_name='geography_teacher_class',limit_choices_to={'subject': '地理'}, blank=True,null=True, verbose_name='地理老师', db_column='地理老师')history_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='history_teacher_class',limit_choices_to={'subject': '历史'}, blank=True,null=True, verbose_name='历史老师', db_column='历史老师')sport_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='sport_teacher_class',limit_choices_to={'subject': '体育'}, blank=True,null=True, verbose_name='体育老师', db_column='体育老师')music_teacher = models.ForeignKey(TeacherInfo, on_delete=models.SET_NULL, related_name='music_teacher_class',limit_choices_to={'subject': '音乐'}, blank=True,null=True, verbose_name='音乐老师', db_column='音乐老师')remark = models.TextField(max_length=100, verbose_name='备注', db_column='备注',default='', null=True, blank=True,help_text='备注不超过一百个汉字',error_messages={'max_length': '备注不超过一百个字'})class Meta:verbose_name = '班级信息'verbose_name_plural = verbose_name# ordering = ['grade', 'class_number']db_table = '班级信息表'# unique_together = ['grade', 'class_number', 'header']def __str__(self):return '班级:{}'.format(self.class_number)def get_class_student_number(self):# 根据班主任还有入学年份筛选num = self.studentinfo_set.all().count()return numget_class_student_number.short_description = '班级人数'def get_grade_leader(self):grade_leader = GradeInfo.objects.get(pk=self.grade.id).headerreturn grade_leaderget_grade_leader.short_description = '年级主任'

相关文章:

  • NAND Separate Command Address (SCA) 接口命令解读
  • Jmeter执行接口自动化测试-如何初始化清空旧数据
  • 什么是云服务器?云服务器的工作原理是介绍
  • 【QML COOK】- 002-添加一个图片
  • JAVA面试部分——后端-线程前篇
  • 突然又对 Go 感兴趣,GOPATH entry cannot start with shell metacharacter 错误
  • 融云 CEO 董晗荣获 51CTO 「2023 年度科技影响力人物奖」
  • 【MATLAB】CEEMDAN+FFT+HHT组合算法
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点面试题 02.07. 链表相交、142.环形链表II
  • Node.js和npm
  • android自定义来电秀UI
  • 权值初始化
  • 【爬虫实战】-爬取微博之夜盛典评论,爬取了1.7w条数据
  • 用几行Asp代码实现防止表单多次被提交
  • metartc5_jz源码阅读-yang_rtcpush_on_rtcp_ps_feedback
  • C学习-枚举(九)
  • Java 23种设计模式 之单例模式 7种实现方式
  • nodejs实现webservice问题总结
  • python学习笔记-类对象的信息
  • Rancher-k8s加速安装文档
  • ReactNative开发常用的三方模块
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 简析gRPC client 连接管理
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深入 Nginx 之配置篇
  • 使用putty远程连接linux
  • 思维导图—你不知道的JavaScript中卷
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 树莓派用上kodexplorer也能玩成私有网盘
  • $().each和$.each的区别
  • (145)光线追踪距离场柔和阴影
  • (bean配置类的注解开发)学习Spring的第十三天
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (java)关于Thread的挂起和恢复
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)RocketMQ初步认识
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ./configure,make,make install的作用(转)
  • .gitignore文件---让git自动忽略指定文件
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net8.0与halcon编程环境构建
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • /boot 内存空间不够
  • :中兴通讯为何成功
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [AI Google] Ask Photos: 使用Gemini搜索照片的新方法
  • [android] 练习PopupWindow实现对话框
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [C# WPF] 如何给控件添加边框(Border)?
  • [C++] sqlite3_get_table 的使用
  • [javascript]Tab menu实现