Django项目之学生体温填报管理系统
提示:
目录
前言
提示:
提示:以下是本篇文章正文内容,下面案例可供参考
一、项目介绍
1.1 项目内容
基于Django框架搭建学生体温填报管理信息系统,方便学生每天上报个人的体温数据,方便学校管理部门及时了解学生体温情况
1.2 开发环境
①Python 3.9
② pycharm-community-2021.2.1
③ Django 3.2.9
二、项目需求
2.1 管理员模块
2.1.1 登录
①实现管理员的登录功能
2.1.2 基本设置
① 用户管理:对用户信息进行增、删、改、查
② 部门管理:对学校部门信息进行增、删、改、查
③ 班级管理:对班级信息进行增、删、改、查
④ 学生管理:对学生信息进行增、删、改、查,可以将学生信息导出为Excel文件
2.1.3 统计报表
① 全体体温记录:管理员可以查看学生的体温数据;若学生体温大于37.5℃,则在体温记录表中标明为红色,反之,标明为绿色;可以将学生体温数据导出为Excel文件
② 体温异常人员名单:将学生体温大于37.5℃的体温数据显示在‘体温异常人员名单’页面,管理员可以将‘体温异常人员名单’导出为Excel文件
2.2 学生模块
2.2.1 登录
① 实现学生的登录功能
2.2.2 基本设置
① 个人信息:显示登录学生的信息在‘个人信息’页面,登录学生可以对个人信息进行修改
2.2.3 体温管理
① 体温填报:学生每天登录系统填写体温信息
② 历史记录:可以查询、修改所有体温数据
2.3 其他
① 首页:页面右上角显示登录用户的用户名
② 退出登录:用户退出个人管理页面,返回到登录页面
③ 分页:将信息进行分页展示
三、项目数据库设计
3.1 数据库目录结构
3.2 管理员表 t_admin
3.3 班级表 t_classes
3.4 部门表 t_department
3.5 学生表 t_student
3.6 体温表 t_temperature
四、项目框架搭建
4.1 项目目录结构
4.2 settings文件
4.2.1 配置MySQL数据库连接信息
在django_learn3\mysite\mysite_init_.py添加
4.2.2 静态资源配置
4.2.3 设置语言和时区
4.2.4 设置静态主页html文件保存目录
4.3 定义模型models.py
4.4 配置URLs 路由
4.4.1 总路由 mysite/urls.py
4.4.2 子路由 polls.urls.py
五、设计实现的难点和亮点
5.1 难点
5.1.1 使用PyCharm社区版搭建Django项目
PyCharm开源社区版不像商业版那样可以直接通过Django来创建项目,Pycharm社区版需要进行初始化设置,需要用一些自动生成的代码配置一个 Django project —— 即一个 Django 项目实例需要的设置项集合,包括数据库配置、Django 配置和应用程序配置。还要避免使用 Python 或 Django 的内部保留字来命名项目。
5.1.2 前后端交互
5.1.3 Django 处理请求
当一个用户请求Django 站点的一个页面,Django 确定使用根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入 HttpRequest 对象拥有 urlconf 属性(通过中间件设置),它的值将被用来代替 ROOT_URLCONF 设置。Django 加载该 Python 模块并寻找可用的 urlpatterns 。Django 依次匹配每个URL 模式,在与请求的URL 匹配的第一个模式停下来。一旦有 URL 匹配成功,Djagno 导入并调用相关的视图,这个视图是一个简单的 Python 函数。如果没有 URL 被匹配,或者匹配过程中出现了异常,Django 会调用一个适当的错误处理视图。
5.2 亮点
① 利用前后端交互实现分页功能
② 设置权限,根据不同用户登录系统,跳转到不同页面
③ 根据不同体温数据,前端数据列表体温数据显示不同颜色
④ 通过过滤器检索指定对象
⑤ 可以将学生名单、体温数据信息、体温异常人员名单等导出为Excel文件
六、系统关键截图
七、系统关键代码
# 管理员登录
def admin_login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
if not all([username, password]):
context = {
'message': '账号或密码不能为空!'
}
return render(request, 'login.html', context)
else:
checkAdmin = AdminInfo.objects.filter(username=username, password=password)
if len(checkAdmin):
# 将用户的信息存放到session中,session在中间件中是默认启用的
request.session['loginSession'] = {
'id': checkAdmin[0].id,
'username': username,
'password': password
}
context = {
'status': username,
'message': '已登录',
'length': 1
}
return render(request, 'admin_index.html', context)
else:
context = {
'message': '账号或密码错误'
}
return render(request, 'login.html', context)
else:
context = {
'status': '未登录状态',
'length': 0
}
return render(request, 'login.html', context)
# 添加用户
def admin_add_submit(request):
# 拿到前端form表单的值,要通过post方法
if request.method == 'POST':
# 开始取到前端操作的值
addAdmin = AdminInfo()
# 括号内部是form表单内每一个字段的name
addAdmin.username = request.POST.get("username")
addAdmin.password = request.POST.get("password")
# 保存到数据库
addAdmin.save()
print("添加的值为:username = ", addAdmin.username + ", password = " + addAdmin.password)
# 添加成功:重定向到admin_list.html
return redirect("/myapp/admin_list")
# 添加失败:返回admin_add.html
print("添加失败")
return render(request, "admin_add.html")
# 查询全部,列表显示
def admin_list(request):
# 数据库取值用是get方法
if request.method == 'GET':
# 数据库的字段信息数据
adminList = AdminInfo.objects.all().values('id', 'username', 'password')
page = request.GET.get('page')
# 实例化pagination对象
pagination = Pagination(page, adminList.count(), request, per_page_num=5)
adminList = adminList[pagination.start:pagination.end]
context = {
'all': adminList,
'page_html': pagination.show_html()
}
# 渲染到admin_list.html界面
return render(request, 'admin_list.html', context)
# 删除用户
def admin_delete(request):
id = request.GET.get('id')
AdminInfo.objects.filter(id=id).delete()
return redirect("/myapp/admin_list")
<body>
<form action="" id="listform" method="get">
<div class="panel admin-panel">
<div class="panel-head">
<strong class="icon-reorder"> 用户信息列表</strong>
</div>
<div class="padding border-bottom">
<ul class="search" style="padding-left: 10px;">
<li>
<a class="button border-main icon-plus-square-o" href="{% url 'polls:admin_add' %}"> 添加用户</a>
</li>
</ul>
</div>
<table class="table table-hover text-center">
<thead>
<tr>
<th width="100">编号</th>
<th>用户名</th>
<th>密码</th>
<th width="20%">操作</th>
</tr>
</thead>
<tbody>
{% for i in all %}
<tr>
<td><p>{{ i.id }}</p></td>
<td><p>{{ i.username }}</p></td>
<td><p>{{ i.password }}</p></td>
<td>
<div class="button-group">
<a class="button border-main" href="/myapp/admin_edit?id={{ i.id }}">
<span class="icon-edit"></span> 修改
</a>
<a class="button border-red" href="/myapp/admin_delete?id={{ i.id }}">
<span class="icon-trash-o"></span>删除
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</form>
<br><br>
<nav aria-label="Page navigation" class="pull-right" style="text-align:center;">
<ul class="pagination">
{{ page_html|safe }}
</ul>
</nav>
<script type="text/javascript">
</script>
</body>
<body>
<div class="panel admin-panel">
<div class="panel-head" id="add">
<strong><span class="icon-pencil-square-o"></span>增加用户</strong>
</div>
<div class="body-content">
<form class="form-x" action="{% url 'polls:admin_add_submit' %}" method="post">
<div class="form-group">
<div class="label">
<label>用户名:</label>
</div>
<div class="field">
<input type="text" class="input w50" name="username" placeholder="请输入用户名" data-validate="required:请输入用户名"/>
<div class="tips"></div>
</div>
</div>
<div class="form-group">
<div class="label">
<label>密码:</label>
</div>
<div class="field">
<input type="text" class="input w50" name="password" placeholder="请输入密码" data-validate="required:请输入密码"/>
<div class="tips"></div>
</div>
</div>
<div class="form-group">
<div class="label">
<label></label>
</div>
<div class="field">
<button class="button bg-main" style="padding:10px 30px;" type="submit">
添加
</button>
<button class="button bg-main icon-check-square-o" type="reset">
重置
</button>
</div>
</div>
</form>
</div>
</div>
</body>