课程表管理系统

课程表管理系统

1.学生/教师用户登录界面

2.首页

3.课程详细

4.保存csv功能

5.管理员登录界面

6.管理员后台界面

7.代码详解

8.项目部署


课程表管理系统

1.学生/教师用户登录界面

 

2.首页

 

3.课程详细

点击已有课程,可弹出课程详细数据。

 

4.保存csv功能

        点击保存csv按钮,可下载当前显示课表的csv格式文档。

5.管理员登录界面

 

6.管理员后台界面

        管理员通过后台可以对老师、学生、班级等数据表进行增删改查功能,同时管理员后台首页可以实时的对每个班级/老师的课程进行安排,还有简单的筛选搜索功能、导出csv功能、新增/删除/修改课表信息功能。

 

7.代码详解

  • 数据库建模

        根据需求分析,总共建立了老师表、班级表、学生表、教室表、课程总表

  • 表之间的关系

        学生表和班级表是一对多的关系,

        课程表和老师表是一对多的关系,

        课程表班级表是一对多的关系,

        课程表教室表是一对多的关系。

#models.py
from django.db import models
from django.utils import timezone
# Create your models here.
​
​
#老师表
class Teacher(models.Model):id=models.BigAutoField(primary_key=True,blank=False)teacher_name = models.CharField(max_length=255,verbose_name='教师姓名')teacher_num = models.CharField(max_length=255, blank=True, null=True,verbose_name='教师工号')password=models.CharField(max_length=200,verbose_name='密码')teacher_level = models.IntegerField(verbose_name='教师等级')sex = models.IntegerField(verbose_name='性别',help_text='1 男 2 女')age = models.IntegerField(blank=True, null=True,verbose_name='年龄')phone = models.CharField(max_length=255,verbose_name='手机号')birthday = models.CharField(max_length=255, blank=True, null=True,verbose_name='出生年月')email = models.CharField(max_length=255, blank=True, null=True,verbose_name='教师邮箱')school = models.CharField(max_length=255, blank=True, null=True,verbose_name='毕业院校')department = models.CharField(max_length=255, blank=True, null=True,verbose_name='毕业院校院系')major = models.CharField(max_length=255, blank=True, null=True,verbose_name='毕业院校专业')education = models.CharField(max_length=255, blank=True, null=True,verbose_name='学历')def __str__(self):return self.teacher_nameclass Meta:verbose_name_plural='老师表'# managed = Falsedb_table = 'teacher'
#班级表
class BasicClass(models.Model):id=models.BigAutoField(primary_key=True,blank=False)class_name = models.CharField(max_length=200,verbose_name='班级名')class_cate = models.IntegerField(blank=True, null=True,verbose_name='班级分类',help_text='0 五天全日制 1 六天全日制 2预科班 3 周末班')start_time = models.DateTimeField(verbose_name='开班时间')class_status = models.IntegerField(blank=True, null=True,verbose_name='班级状态',help_text='0 正常 1禁用')description = models.CharField(max_length=200, blank=True, null=True,verbose_name='备注')def __str__(self):return self.class_nameclass Meta:verbose_name_plural='班级表'# managed = Falsedb_table = 'basic_class'
​
#学生表
class Student(models.Model):id=models.BigAutoField(primary_key=True,blank=False)student_name = models.CharField(max_length=200,verbose_name='学生姓名')password=models.CharField(max_length=200,verbose_name='密码')student_num = models.CharField(max_length=255, null=False,verbose_name='学号')#学生表和班级表是一对多的关系,这里建立外键Class =models.ForeignKey(BasicClass, verbose_name='班级', on_delete=models.CASCADE)add_time = models.DateTimeField(verbose_name='加入班级时间')student_status = models.IntegerField(verbose_name='学生状态',help_text='0正常 1 请假 2 休学 3 退学')sex = models.IntegerField(blank=True, null=True,verbose_name='性别')age = models.IntegerField(blank=True, null=True,verbose_name='年龄')birthday = models.CharField(max_length=200, blank=True, null=True,verbose_name='出生年月日')student_email = models.CharField(max_length=200, blank=True, null=True,verbose_name='邮箱')student_school = models.CharField(max_length=200, blank=True, null=True,verbose_name='院校')student_department = models.CharField(max_length=200, blank=True, null=True,verbose_name='院系')student_major = models.CharField(max_length=200, blank=True, null=True,verbose_name='专业')student_school_class = models.CharField(max_length=200, blank=True, null=True,verbose_name='在校班级')student_education = models.CharField(max_length=200, blank=True, null=True,verbose_name='学历')phone = models.CharField(max_length=200,verbose_name='手机号')qq_number = models.CharField(max_length=200, blank=True, null=True,verbose_name='qq号')wechart_number = models.CharField(max_length=200, blank=True, null=True,verbose_name='微信号')idcard = models.CharField(max_length=200, blank=True, null=True,verbose_name='身份证号')emergency_name = models.CharField(max_length=200, blank=True, null=True,verbose_name='紧急联系人姓名')emergency_phone = models.CharField(max_length=200, blank=True, null=True,verbose_name='紧急联系人电话')family_address = models.CharField(max_length=200, blank=True, null=True,verbose_name='家庭住址')now_address = models.CharField(max_length=200, blank=True, null=True,verbose_name='现在住址')guarder = models.CharField(max_length=200, blank=True, null=True,verbose_name='监护人')guarder_phone = models.CharField(max_length=200, blank=True, null=True,verbose_name='监护人电话')description = models.CharField(max_length=200, blank=True, null=True,verbose_name='备注')def __str__(self):return self.student_nameclass Meta:verbose_name_plural='学生表'# managed = Falsedb_table = 'student'
#教室表
class Room(models.Model):id=models.BigAutoField(primary_key=True,blank=False)room_name = models.CharField(max_length=200,verbose_name='教室名')room_count = models.IntegerField(blank=True, null=True,verbose_name='教室容量')room_status = models.IntegerField(blank=True, null=True,verbose_name='教室状态',help_text='0教室空闲 1教室禁用',default=0)description = models.CharField(max_length=200, blank=True, null=True,verbose_name='描述')def __str__(self):return self.room_nameclass Meta:verbose_name_plural='教室表'# managed = Falsedb_table = 'rooms'
#课程表
class CourseWeekData(models.Model):id=models.BigAutoField(primary_key=True,blank=False)week = models.IntegerField(verbose_name="周数",default=0)Section=models.IntegerField(verbose_name="节次",null=False)subject=models.CharField(verbose_name="课程名", max_length=50,null=False)day=models.IntegerField(verbose_name="星期",null=False)#课程表和老师表、班级表、教室表都是一对多的关系teacher=models.ForeignKey(Teacher, verbose_name='老师', on_delete=models.CASCADE)Class=models.ForeignKey(BasicClass, verbose_name='班级', on_delete=models.CASCADE)room=models.ForeignKey(Room, verbose_name='教室', on_delete=models.CASCADE)def __str__(self):return str(self.week)class Meta:verbose_name_plural='周课表数据'db_table='course_weekdata'
  • 后台管理

        后台管理使用的Django的第三方ui库simpleui来美化后台界面,参数配置如下。

#settings.py
#后台logo
SIMPLEUI_LOGO=r'/static/favicon.ico'
#关闭simpleui广告
SIMPLEUI_HOME_INFO = False 
#后台首页
SIMPLEUI_HOME_PAGE = '/root_index'  
​
​
INSTALLED_APPS = ['simpleui',#注册simpleuiAPP,需要放到最前面'django.contrib.contenttypes','django.contrib.admin','django.contrib.auth','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','courseIndex',#注册courseIndexAPP
]

 list_display是后台管理界面需要显示出的字段

search_fields是后台参与搜索的字段

 ordering是参与排序的字段

#admin.py
from django.contrib import admin
# Register your models here.
from  .models import *
​
#后台名字
admin.site.site_title = "后台管理"
admin.site.site_header = "排课系统"
​
#注册老师表后台管理功能
@admin.register(Teacher)
class TeacherAdmin(admin.ModelAdmin):exclude = []list_display=['teacher_num','teacher_name']search_fields=['teacher_name']
#注册课程表后台管理功能    
@admin.register(CourseWeekData)
class CourseWeekDataAdmin(admin.ModelAdmin):exclude = []list_display = ['id','subject','week','teacher','Class','room','day','Section']ordering=['week','day','Section']search_fields=['week','teacher']
#注册班级表后台管理功能
@admin.register(BasicClass)
class BasicClassAdmin(admin.ModelAdmin):exclude = []search_fields=['class_name']
#注册教室表后台管理功能
@admin.register(Room)
class RoomAdmin(admin.ModelAdmin):exclude = []search_fields=['room_name']
#注册学生表后台管理功能
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):list_display=['student_num','student_name']exclude = []search_fields=['student_name']
  • 项目路由

#course.urls.py
#主路由
from django.contrib import admin
from django.urls import path,include
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [#管理员后台path('admin/', admin.site.urls,name='admin'),#拼接courseIndex应用所有路由path('', include("courseIndex.urls")),
]+ static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
​
#courseIndex路由
#courseIndex.urls.py
from django.urls import path
from . import views
from django.conf.urls import url
app_name='courseIndex'
​
urlpatterns = [#管理员首页path('root_index', views.root_index,name='root_index'),#获取当前可带课的老师数据path('getteacher',views.getteacher,name='getteacher' ),#获取当前空闲教室数据path('getroom',views.getroom,name='getroom' ),#获取当前无课班级数据path('getclasses',views.getclasses,name='getclasses' ),#获取当前课表数据path('getdata',views.getdata,name='getdata' ),#添加课表详细接口path('adddata',views.adddata,name='adddata' ),#删除课表详细接口path('deldata',views.deldata,name='deldata' ),#保存当前课表数据path('savedata',views.savedata,name='savedata' ),#首页path('', views.index,name='index'),#登录页path('login', views.Login.as_view(),name='login'),
​
]
  • 视图函数 ​

        课程表数据核心代码

#获取课程表数据
def getdata(request):#获取当前周次week = int(request.GET.get('week', 1))#筛选条件cid = request.GET.get('cid', '')#班级idtid = request.GET.get('tid', '')#老师id#初始化课程表'''[[[], [], [], [], [], []],[[], [], [], [], [], []],[[], [], [], [], [], []],[[], [], [], [], [], []],[[], [], [], [], [], []],[[], [], [], [], [], []],[[], [], [], [], [], []]]是一个7行6列的列表,行代表星期,列代表课程节次,最里面的小列表是为了处理一个时间段有多个班级多门课的情况'''li = [[[] for j in range(6)] for i in range(7)]#如果传入了老师/班级筛选条件,就进行筛选if cid == '':courses = CourseWeekData.objects.filter(Q(week=week))else:courses = CourseWeekData.objects.filter(Q(week=week) & Q(Class_id=cid))if tid == '':passelse:courses = courses.filter(teacher_id=tid)#将每行里的小列表填上查到的课表数据for course in courses:li[course.day-1][course.Section-1].append({'id': course.id, 'subject': course.subject, 'teacher': course.teacher.teacher_name, 't_id': course.teacher.id, 'class': course.Class.class_name,'c_id': course.Class.id, 'room': course.room.room_name, 'r_id': course.room.id, 'week': course.week, 'day': course.day, 'Section': course.Section})return JsonResponse({"list": li, 'week': week}, json_dumps_params={'ensure_ascii': False})#保存csv,查询原理同上
def savedata(request):week = int(request.GET.get('week', 1))cid = request.GET.get('cid', '')cname = ''tid = request.GET.get('tid', '')li = {f'星期{i+1}': ['' for j in range(6)] for i in range(7)}if cid == '':courses = CourseWeekData.objects.filter(Q(week=week))else:cname = BasicClass.objects.get(id=cid).class_namecourses = CourseWeekData.objects.filter(Q(week=week) & Q(Class_id=cid))if tid == '':passelse:courses = courses.filter(teacher_id=tid)for course in courses:li[f'星期{course.day}'][course.Section-1] += course.subject+'@' + \course.teacher.teacher_name+'@' + \course.Class.class_name+'@'+course.room.room_name+'\n'#将查询到的课表数据转换为DataFrame对象df = pd.DataFrame(li)#改字段名df.columns = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天']df.index = [i for i in range(1, 7)]#生成课表名name = f'{cname}第{week}周课程表_{datetime.datetime.now().timestamp()}.csv'#保存至项目media/csv/目录下df.to_csv(r'media/csv/'+name)#返回保存路径return redirect('/media/csv/'+name)

8.项目部署

  • 创建虚拟环境

conda create -n course python=3.8
  • 安装项目依赖

#进入项目虚拟环境
conda activate course
#进入项目目录
cd xxx
#安装依赖
pip install -r requirements.txt
  • 修改数据库设置

#进入项目settings.py,修改数据库配置
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': '数据库名','USER':'用户名','PASSWORD':'密码','HOST':'127.0.0.1','POST':'3306','OPTIONS': {'charset': 'utf8mb4'},}
}
  • 迁移数据库

#进入项目目录
cd xxx
python manage.py makemigrations
python manage.py migrate
  • 启动项目

python manage.py runserver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36719.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android课程表App

最近写了个简单的Android 课程表App,我是个初学者,这个App里使用了: Android内置的SQLite数据库储存课程数据。课程的视图用CardView卡片视图。 课程的View是动态加入的,动态添加View的好处是很灵活 如果靠静态的XML构建的话就有点难扩展了,因为你不知道…

微信小程序实现课程表

1.实现效果 2.实现步骤 2.1 获取当前日期一周数据 Date.getDay(): getDay() 方法返回指定日期是星期几(从 0 到 6,星期日为 0,星期一为 1,依此类推。)。 var d new Date();//2022-8-11 var n d.getDay();//4--周四Date.getDate…

学生表,选课表,课程表

课后作业 一、用Navicat Premium 12软件创建三张表:学生表、选课表、课程表 学生表(学号, 姓名, 性别, 年龄, 电话) - 学号是字符串类型 选课表(学号, 课程号, 成绩) 课程表(课程号, 课程名, 课时数) - 课程号是字符串类型 学生表: 选课表: …

Android课程表的设计开发

Android课程表的设计开发 下载链接 鉴于很多人需要源码,这里给下代码。 下载地址(需要5积分,支持下(积累点积分。。。),没有积分的直接留言邮箱,我发给你或者找其他已经发过的人要下&#xf…

超级课程表课表的界面的实现

由于毕业设计有一个功能模块是课程表,就想模仿一下超级课程表的界面,可是开始做的时候却没有一点头绪,百度google均无果,在CSDN和知乎上提问了也没人回答,总之自己鼓捣了几天还是弄出来了,虽然实现的方法很挫。。。因为有好几个人都发私信问我怎么实现的,现在毕设做完了…

尤瓦尔最新演讲:人工智能不需要意识就可以毁灭人类文明

我们现在必须与一种新的大规模杀伤性武器作斗争,这种武器可以消灭我们的精神和社会世界。核武器和人工智能最大的区别是,核武器不能制造更强大的核武器。 但人工智能可以产生更强大的人工智能,所以我们需要在人工智能失去控制之前迅速采取行动…

chatgpt赋能python:Python绘制雷达图教程

Python绘制雷达图教程 在数据分析和可视化中,雷达图是一种非常有用的可视化工具,用于显示多个变量的相对大小。在这篇文章中,我们将介绍如何使用Python绘制雷达图,使用Matplotlib和Seaborn这两个Python数据可视化库。 准备数据 …

测试职业的发展方向

测试职业转型 很多工作了几年的测试人员都会产生迷惘,随着经验的累积和技能的提升,会有一个瓶颈期。未来应该往哪个方向发展,之前说过做测试要懂得很多技能和知识。正因为如此测试可以发展的方向选择面就非常广了,既可以继续在测试…

重塑职业未来:在竞争激烈的职场上脱颖而出的关键策略

在竞争激烈的职场上,各种职场难题时常出现,如何进行有效沟通、如何应对工作压力、如何提升职业能力等,这都是需要去克服的问题。下面分享一下职场老人的经验! 一、你遇到过哪些职场问题?分享一下你是怎么解决的呢&…

未来软件测试人员会失业?看ChatGPT怎么说

Q:未来软件测试人员会失业? A:虽然自动化测试和AI技术的应用已经带来了一定的冲击,但是软件测试人员未来失业的可能性非常低。以下是几个原因: 软件测试是软件开发生命周期的重要环节。在软件开发过程中,…

AI_News周刊:第二期

2023.02.13—2023.02.17 1.ChatGPT 登上TIME时代周刊封面 这一转变标志着自社交媒体以来最重要的技术突破。近几个月来,好奇、震惊的公众如饥似渴地采用了生成式人工智能工具,这要归功于诸如 ChatGPT 之类的程序,它对几乎任何查询做出连贯&a…

各大工作室都在用的视觉特效软件,开启你的虚拟制作之旅

为您的虚拟制作设置的免费视觉特效工具 使用领先工作室们所信任的创意资源管理软件,免费开始您的下一个虚拟制作项目。 花更多时间在创作上,更少时间在设置上 增强型Studio包 —— 现已可以部署在微软 Azure 上使用 —— 包含了您所需要的所有工具&…

博主,公司让我们无限期放假!

推荐阅读:程序员降薪40%去国企,只因要35岁了!值得吗? 下午收到一位网友的求助: 公司无故辞退员工,却不按正常裁员程序走。公司以没钱为由,给出2种方案: 一个月赔偿;无限期…

网址被腾讯拦截的处理方法

事发于2021年6月5日,为主域名的其中一个子域名被拦截,主域名未被拦截,原因为恶意广告,恶意营销。 网站内容为普通商城类,不存在强制推广,于是进行站长申诉,反馈结果为驳回~ 2021年6月7日&#…

文远知行COO张力离职;天翼云宣布进军国际市场;百家云发布AIGC新品;深兰科技推出大语言模型SaaS平台丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 文远知行COO张力离职 文远知行COO张力日前在个人社交平台发布疑似离职的相关动态。对此,文远知行方面今日回应称:“由于个人及家庭原因,文远知行COO张力最近决定辞任&#xf…

对话数十位学术合作代表:如何提升前沿技术在商业领域的落地应用?

从去年火出天际的元宇宙,到今年年初的现象级应用 ChatGPT,科技圈似乎从不缺少热门的技术概念与话题。尤其是在云计算、人工智能、大数据等技术呈爆发式增长的背景下,我们愈发体会到前沿技术对于产业产生的深远影响,而这也延伸出了…

Gartner:数字经济如火如荼,企业该做哪些准备?

从“数据二十条”发布,到国家数据局成立,广大中国企业应该从中嗅到哪些重要信号? “数据二十条”与国家数据局 关注数据领域的小伙伴估计都知道,我国近年来一直高度重视数字经济的发展,尤其是近期更是接连出台针对数据…

快商通与美亚、华大共同申报的AI课题被纳入科技局重大科技项目

近日,厦门市科学技术局对“2022年工业及信息化领域科技计划项目”进行公示,快商通与美亚柏科、华侨大学联合申报的“基于深度学习的可信多媒体鉴定关键技术研究及其产业化应用”课题成功入选厦门市重大科技项目! ChatGPT震惊全球、效果爆棚&a…

近期最火AutoGPT|自主 AI 来了?来看怎么玩!

文章目录 近期最火AutoGPT|自主 AI 来了?来看怎么玩!1. 它是什么?2. 能做些什么?3. 本质是什么?4. 怎么尝试5. 注意点6. 期待 近期最火AutoGPT|自主 AI 来了?来看怎么玩!…

如何同步公众号内容到头条自媒体?

公众号的内容是无法直接同步到头条自媒体当中的,我们需要借助其他工具进行辅助,才能够在其他平台一键发布。在这个大数据时代,有很多自媒体创作者希望自己的作品能够在各大平台进行发布,这样不仅可以第一时间将自己的作品展示给粉…