金宝贝早教中心管理系统
摘 要:这些年,父母对自己的孩子的学习问题越来越看重,所以都希望从小就开始教育。因此,许多早教机构应运而生,而随着就够人员的增多,机构的管理成为重中之重。因此,本系统就旨在便于管理员对机构用户,课程的管理,同时使家长们更加了解机构。
本系统的设计过程中使用了Mysql数据库来对机构中的信息进行增删查改,使用Python[3]和Django实现后台的相关逻辑,使用HTML实现前段页面的显示,使用xadmin实现后台管理系系统,以便管理员对数据的操作。本网站包含三类用户:一是家长用户,二是教师,三是管理员。家长用户访问网站查看机构的基本情况;教师向网站添加课程的相关信息;管理员对机构中的所有数据进行维护。通过管理员和教师对网站的维护,是家长能够更加清楚的了解机构,并报名机构。
关键词:Python,Django,后台管理
Jinbao Early Learning Center Management System
ABSTRACT:In recent years, parents have paid more and more attention to the education of children and advocated enlightenment education. Therefore, many early education institutions have emerged as the times require, and with the increase of sufficient personnel, the management of the organization has become a top priority. Therefore, the system is designed to facilitate administrators to manage institutional users, courses, and to make parents more aware of the organization.
The design process of this system uses Mysql database to add, delete and modify the information in the organization, use Python and Django to realize the related logic in the background, use HTML to realize the display of the previous page, use xadmin to realize the background management system, so that the administrator The operation of the data. This website contains three types of users: one is the parent user, the second is the teacher, and the third is the administrator. Parent users visit the website to view the basics of the organization; the teacher adds information about the course to the website; the administrator maintains all the data in the organization. Through the maintenance of the website by administrators and teachers, parents can understand the organization more clearly and register the institution.
Key words: Python, Django, Backstage management
1 引言
1.1 项目开发背景
自第三次工业革命爆发以来,计算机进入人们的视野。在我国随着改革开放的不断推进,计算机技术日渐成熟,人们的生活也日益富裕,因此更加注重孩子的启蒙教育。所以,可以利用计算机技术对传统教育技术提供更好的支持。计算机技术拥有计算精密,查找快速,便于大量数据存储,数据共享,不易丢失等特点,它可以替代人们手工存储数据,在大量的数据中缓慢的查找信息,数据信息不易携带等方式。因此使用计算机技术可以对早教机构进行更方便的管理。
1.2 项目开发意义
利用计算机技术对早教机构进行管理,已经成为一种必然的趋势。它有以下几方面优势:
对于机构管理者,可以高效率的管理学生,家长的基本信息,教师的信息。使家长更加了解本机构。使家长和孩子们对本机构的课程更加感兴趣。
对于家长来说,能够清楚的了解孩子的所知所学,更好的跟孩子做朋友,在日常的教育中游刃有余。
对于孩子来说,可以从小培养孩子的多元化发展和自我创新能力,使宝贝从小开始接触知识,为日后的学习打下坚实的基础。使宝贝能够更好的成才。
1.3 项目可行性分析
首先是经济可行性。随着我国的经济不断发展,国民的经济水平不断提升。同时计算机技术在全球不断发展。计算机进入大众的视野。现在,对于学生来说,几乎人手一个计算机。而本项目所需要的就是计算机,因此,不必有额外的开销,因此在经济上是可行的。
其次就是技术可行性。本项目中使用的是成熟的B/S模式。使用Python[2]和Django进行编码。Python是近年来兴起的一种被广泛使用的计算机程序设计语言,拥有强大的开发库,非常便于开发者去调用。Django作为一个开源的Web框架,非常便于使用。此外,使用CSS和HTML对前端页面进行设计和美化。Mysql作为数据库,存储本项目中的所有数据。上述的几种技术都是非常成熟的,并在实践中被广泛使用的,因此在技术上也是可行的。
2 系统开发技术简介
2.1 开发工具简介
PyCharm是python的集成开发环境,可用于python代码的开发编写,调试,运行等[1]。它提供了代码规范,如代码缩进,代码高亮,代码补全,错误提示,代码跳转等快捷方式,使用户能够更方便的进行开发编码。此外,还提供了用于django框架下专业Web开发的高级功能,它自带html,css,javascript编辑器[4],可以使用户能够更便捷对前端页面进行操作。另一方面,它的安装非常简便,直接在官网上下载即可。
Mysql是一种关系型数据库管理系统[6],它广泛应用在前后端开发,服务器开发等方面[5]。它建立一个个有关联的数据表,将用户数据存放在这些数据表中,使用户对于数据的增加,删除,查找,修改的操作非常便捷[9],同时因为符合同一特征的数据存储在一张数据表中,所以数据库的相关操作非常快速,节省了运行时间,非常便于用户开发。
Navicat是一个数据库的管理工具,Navicat使用户可以连接到本机的主机和任何的远程服务器,对数据库的操作更加方便。同时它还支持数据表的建立,SQL语言的搜索,数据的备份,导入,导出等,非常便于用户操作。
2.2 开发语言简介
Python是目前使用比较广泛的标准程序设计语言之一[1]。Python也是一种动态语言。因为他的变量类型可以随意改变。Python最初是作为一种脚本语言开发而来,它可以用于编写各种自动化测试脚本,是开发代码的运行更加快捷。而随着使用者越来越多,不断的有人开发添加新的功能,使得Python的源码更加丰富,功能更加强大。因此,Python慢慢的也被更多人用于项目的开发。
Django是一个开源的,应用广泛的,由 Python编写的Web框架。Django是一种基于MVC的模式[4]。Django允许开发者使用第三方插件以完善自己的项目功能,亦可以自行开发一些所需的插件。Django是一个开源的项目,因此对于开发者来说非常友好,直接在命令提示符中使用pip进行安装即可。
3 网站设计
3.1 系统结构设计
本系统的结构设计如下图:
图1 系统结构设计图
上图是本系统的结构设计图,本系统共包含三个模块:用户模块,课程模块,教师模块。其中用户分为一般用户和管理员。管理员拥有本系统的最高权限。管理员可以增加,删除查找,修改用户的信息。课程模块由教师负责,该权限也是由管理员分配而得。对于教师的基本信息,也是有管理员来完成的。
3.2 数据库设计
本系统中包含很多用户,课程,教师的基本信息,将这些数据信息存储在数据库中进行保存:
表1 页边距的设置
信息表
|
表描述
|
用户信息表
|
描述学生用户信息
|
机构教师表
|
描述机构教师信息
|
机构课程表
|
描述机构课程信息
|
续表1
信息表
|
表描述
|
用户收藏表
|
描述用户的收藏信息
|
用户报名表
|
描述用户的报名信息
|
本系统中的数据表由以上组成。用户信息表中存放的是注册本系统的用户信息。机构教师表存放的是机构中的基本信息。机构课程表存放的是机构中开设的课程基本信息。用户收藏表存放的是用户收藏的教师和课程的基本信息。用户报名表存放的是用户报名的课程信息。
3.3 系统E-R图
图2 系统E-R图
上图为本系统的E-R图。其中管理员拥有一切权限,管理员管理用户和教师,对教师和用户的信息进行维护。教师管理课程,对课程的信息进行维护。用户报名或收藏课程。
4 网站实现
本网站有前端页面和后台管理系统组成。
4.1 网站前端页面设计
用户通过指定的url访问本网站,进入网站首页。首页有四部分组成。首先是教师/专家介绍,对本机构中的教师或专家进行详情介绍。其次是课程介绍,对本机构中开设的课程进行介绍,然后是活动报名部分,列举的是本周将要开设的课程,供用户进行报名。最后是个人中心部分。包含用户个人信息的修改,用户收藏,用户报名,用户课表等。
用户通过点击相关的按钮提示,跳转到指定的页面,获取想要了解的内容。
4.2 后台管理系统
后台管理系统用于机构内部人员对数据进行快速的增删查改等。后台管理系统一般为机构内部人员登录。根据人员的不同,所拥有的权限也各不相同。管理员拥有所有权限。教师拥有部分权限,教师权限的使用也需要通过管理员来进行分配。因此,后台管理系统就是方便机构内部人员对数据进行操作,一般的用户不能访问后台管理系统。
5 软件测试
一个系统在设计实现的过程中,会存在许多的问题,有些问题很容易发现并修改,但有些问题可能不容易发现,此时就需要进行专门的测试,是系统更加稳固。常用的测试方法有黑盒测试,白盒测试[7]等方法。测试的流程包含,指定测试计划,编写测试用例,执行测试脚本等。通过以上所述对本系统进行测试。
本系统采用的是黑盒测试,即测试系统的功能能否正常实现。测试模块包含:用户注册模块,用户登录模块,前端页面显示模块,搜索功能模块,用户搜索模块,用户报名模块,用户个人资料模块。测试用例的编写包含正确或错误等方面,根据测试用例对其进行测试,使系统更加安全。
6 总结
在本次系统的设计开发中,学习到了很多东西。
首先是思考问题方面,,通过对该系统的市场需求进行分析,我了解到了该系统应该具有的基本功能,再针对每个功能,设计出相应的网页,在网页上运用恰当的控件,完成其相应的功能,然后找出各网页之间的联系,对具体每一步进行思考,找出解决的方案,最后将各网页联系起来,找出最终的解决方案[8]。
其次,通过这次课设,进一步加强了我的HTML标记语言的运用能力,通过对各个控件的使用,我了解到了一些基本控件的功能,使用方法及使用场景等,在对网站进行开发时需要与数据库进行远程连接,而使用Django可以非常方便将其余数据库连接,并且操纵使用数据库,通过对Django的使用,使我在某些基本操作方面都得到了加强与巩固,使我受益良多。
然后,通过使用Python语言编写代码,使我进一步了解了他的优势。Python中首先会提供非常多的库供开发者使用,这样就节省了一定的时间,其次它的编程风格非常简洁,使代码的可读性非常强,最后就是在Python的学习上,非常容易上手,因此,通过对Python的使用,使我了解到了一门简洁的编程语言。进一步巩固了我的编程能力。
最后,在word文档格式的设置方面,我也学会了许多,例如在段落布局,页面设置,页眉页脚,生成目录方面都有了充分的了解,发现自己以往所学知识的不足。
致谢
在这次网站的设计中,遇到了很多问题,最后都得以圆满解决,在过程中,很多人都给了我许多帮助。首先对于网站设计过程中的技术上的问题,需要感谢老师,公司同事给予的帮助。在遇到问题时,他们耐心的给我讲解,使我理解。非常感谢他们,其次是同学的帮助,在文档的格式书写上,界面的美观设计上,他们也给了很多的意见。非常感谢他们。最后使父母的帮助,他们在我的毕业设计之间,默默的给我精神上的支持,非常感谢他们。
参考文献
[1] Magnus Lie Hetland. Python基础教程[M]. 北京: 人民邮电出版社, 2010.
[2] Eric Matthes. Python编程:从入门到实践[M]. 北京: 人民邮电出版社, 2016.
[3] 明日科技. 零基础学Python [M]. 吉林: 吉林大学出版社, 2018.
[4] 李健. Django2.0入门与实践[M]. 北京: 清华大学出版社.2019.
[5] 施瓦兹. 高性能Mysql[M]. 北京: 电子工业出版社, 2013.
[6] 塔皮奥拉赫登迈奇. 数据库索引设计与优化[M]. 北京:电子工业出版社, 2015.
[7] 曲朝阳, 刘志颖. 软件测试技术[M]. 北京: 中国水利水电出版社, 2006.
[8] 胡思康. 软件工程[M]. 北京: 清华大学出版社, 2012.
[9] 萨师煊,王珊编.数据库系统概论(第四版)[M].高等教育出版社.2006
Course.view.py
# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.views.generic.base import View
from django.http import HttpResponse
from django.db.models import Q
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
from operation.models import UserFavorite, UserApply, CourseComments, UserCourse
from utils.mixin_utils import LoginRequiredMixin
from users.models import UserProfile
from .models import Course, CourseResourse
from users.models import Banner
# Create your views here.
class CourseListView(View):
def get(self, request):
# 根据添加时间获取所有课程
all_courses = Course.objects.filter(is_detail=True).order_by('-add_time')
# 根据点击数获取热门课程
hot_courses = Course.objects.filter(is_detail=True).order_by('-click_nums')
# 课程搜索
search_keywords = request.GET.get('keywords', '')
if search_keywords:
all_courses = all_courses.filter(Q(name__icontains=search_keywords) | Q(desc__icontains=search_keywords) | Q (detail__icontains=search_keywords))
# 课程排序
sort = request.GET.get('sort', "")
if sort:
if sort == "cg":
all_courses = all_courses.filter(category=0)
# all_courses = all_courses.order_by("-students")
elif sort == "zt":
all_courses = all_courses.filter(category=1)
# all_courses = all_courses.order_by("-click_nums")
# 对课程进行分页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
p = Paginator(all_courses, 3, request=request) # 5表示每一页的数量
all_courses = p.page(page)
return render(request, 'course-list.html', {
'all_courses': all_courses,
'sort': sort,
'hot_courses': hot_courses,
})
class MyCourseListView(View):
"""
课程介绍页 这里的is_banner变量代表的是 日常课程(具体课程)还是课程介绍中的课程(概括课程)
is_banner:True表示概括课程,False表示日常课程
这里取出的是概括课程
"""
def get(self, request):
# # 取出轮播图
# all_banners = Banner.objects.all().order_by('index')
# 取出概括课程
all_courses = Course.objects.filter(is_detail=False)
# 课程搜索
search_keywords = request.GET.get('keywords', '')
if search_keywords:
all_courses = all_courses.filter(Q(name__icontains=search_keywords) | Q(desc__icontains=search_keywords) | Q(detail__icontains=search_keywords))
# 课程排序
sort = request.GET.get('sort', "")
if sort:
if sort == "cg":
all_courses = all_courses.filter(category=0)
# all_courses = all_courses.order_by("-students")
elif sort == "zt":
all_courses = all_courses.filter(category=1)
# all_courses = all_courses.order_by("-click_nums")
# 对课程进行分页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
p = Paginator(all_courses, 3, request=request) # 5表示每一页的数量
all_courses = p.page(page)
# banner_courses = Course.objects.filter(is_banner=True)
return render(request, 'mycourse-list.html', {
# 'all_banners': all_banners,
'all_courses': all_courses,
# 'banner_courses': banner_courses,
})
class CourseDetailView(View):
"""
课程详情页
"""
def get(self, request, course_id):
course = Course.objects.get(id=int(course_id))
# 增加课程点击报名数
course.click_nums += 1
course.save()
# 是否收藏课程
has_fav_course = False
# 是否收藏机构
has_fav_org = False
# 是否报名
has_apply_name = False
# 如果用户登陆
if request.user.is_authenticated():
if UserFavorite.objects.filter(user=request.user, fav_id=course.id, fav_type=1):
has_fav_course = True
if UserFavorite.objects.filter(user=request.user, fav_id=course.course_org.id, fav_type=2):
has_fav_org = True
if UserApply.objects.filter(user=request.user, fav_id=course.id):
has_apply_name = True
tag = course.tag
if tag:
relate_courses = Course.objects.filter(tag=tag)[:1]
else:
relate_courses = []
return render(request, "course-detail.html", {
'course': course,
'relate_courses': relate_courses,
'has_fav_course': has_fav_course,
'has_fav_org': has_fav_org,
'has_apply_name': has_apply_name
})
class MyCourseDetailView(View):
def get(self, request, course_id):
course = Course.objects.get(id=int(course_id))
return render(request, "mycourse-detail.html", {
'course': course,
})
class CourseInfoView(LoginRequiredMixin, View):
"""
课程章节信息
"""
def get(self, request, course_id):
course = Course.objects.get(id=int(course_id))
course.students += 1
course.save()
# 查询用户是否已经关联了该课程
user_courses = UserCourse.objects.filter(user=request.user, course=course)
if not user_courses:
user_course = UserCourse(user=request.user, course=course)
user_course.save()
user_cousers = UserCourse.objects.filter(course=course)
user_ids = [user_couser.user.id for user_couser in user_cousers]
all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
# 取出所有课程id
course_ids = [user_couser.course.id for user_couser in all_user_courses]
# 获取该用户学过的其他所有课程
relate_courses = Course.objects.filter(id__in=course_ids).order_by("-click_nums")[:5]
all_resources = CourseResourse.objects.filter(course=course)
return render(request, "course-video.html", {
'course': course,
'course_resources': all_resources,
'relate_courses': relate_courses
})
class CommentsView(LoginRequiredMixin, View):
"""
课程评论信息
"""
def get(self, request, course_id):
course = Course.objects.get(id=int(course_id))
all_resources = CourseResourse.objects.filter(course=course)
all_comments = CourseComments.objects.filter(course=course).order_by("-id")
return render(request, "course-comment.html", {
'course': course,
'course_resources': all_resources,
'all_comments': all_comments,
})
class AddCommentsView(View):
# 用户添加课程评论
def post(self, request):
if not request.user.is_authenticated(): # 判断用户是否登陆
# 判断用户登陆状态
return HttpResponse("{'status':'fail', 'msg':'用户未登录'}",
content_type='application/json')
# 获取用户输入的课程id和对该课程的评论
course_id = request.POST.get("course_id", 0)
comments = request.POST.get("comments", "")
if course_id > 0 and comments:
# 创建课程评论的实例
course_comments = CourseComments()
# 获取用户评论的课程id
course = Course.objects.get(id=int(course_id))
course_comments.course = course
course_comments.comments = comments
course_comments.user = request.user
course_comments.save()
return HttpResponse("{'status':'success', 'msg':'添加成功'}",
content_type='application/json')
else:
return HttpResponse("{'status':'fail', 'msg':'添加失败'}",
content_type='application/json')