提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
初始Django之宿舍管理系统(ORM入门篇)
项目部分功能展示:
**
管理员登录:
**
**
宿管登录:
**
**
学生登录:
**
前言
- 宿舍管理系统是一种能够提高学生宿舍管理效率的工具。随着大学生群体的不断增长,宿舍管理工作变得越来越复杂,传统的手工管理方式已经无法满足需求。为了提高宿舍管理的便利性和效率,引入计算机技术成为了必然选择。
- Django是一种基于Python语言开发的高性能Web开发框架,它的设计理念是简洁、优雅、高效。它提供了丰富的功能和强大的开发工具,使得开发人员能够快速构建出稳定可靠的Web应用程序。
- 本文将介绍如何使用Django开发一个宿舍管理系统。宿舍管理系统主要包括学生信息管理、入住管理、楼栋和房间管理、报修管理等功能。(最简单方式无from表单验证)
提示:以下是本篇文章正文内容,下面案例可供参考
一、宿舍管理系统需求分析
所需技术包:
asgiref==3.8.1
Django==5.0.7
et-xmlfile==1.1.0
openpyxl==3.1.5
PyMySQL==1.1.1
sqlparse==0.5.1
tzdata==2024.1
设置权限管理:系统管理员可以设置不同用户的权限,限制其对系统功能的访问和操作。
1.学生信息管理:
学生信息录入: 包括学生姓名、学号、性别、班级,宿舍号,并自动保存学号后六位为密码等信息。
学生信息查询: 根据学号等关键字进行查询,并显示学生的详细信息。
学生信息导入: 使用openpyxl读取并导入本地的.xlsx文件。
学生信息导出: 使用openpyxl创建一个新的Excel工作簿并将数据写入其中,最后保存至本地。
2.宿舍信息管理:
楼栋信息: 楼栋编号、楼栋名称、楼栋地址等。可以实现楼栋信息的增加、修改、删除和查询功能。
宿管信息: 宿管楼栋、宿管姓名、宿管电话等。 可以实现宿管信息的增加、修改、删除和查询功能。
宿舍信息: 楼栋编号、宿管编号、宿舍容量人数、宿舍已住人数等。可以实现宿舍信息的增加、修改、删除和查询功能。
可以根据学生信息绑定的宿舍自动更新已住人数,如超过容量则不允许更换学生寝室。
入住统计:系统可以生成宿舍入住统计报表。
3.维修信息管理:
报修管理:学生可以提交宿舍报修请求,管理员可以查看并处理报修请求。
维修信息: 申请人、申请宿舍(学生登陆时自动绑定宿舍不可更改)、故障信息、申请时间等信息进行增加、修改、删除和查询功能。
4.访客信息管理
访客基本信息管理: 记录和管理访客的基本信息,包括姓名、联系方式等。
访问记录管理: 记录和管理访客的访问记录,包括访问时间、访问地点等信息
5.宿舍通知管理
允许管理员和宿管发布、修改、删除通知。通知应包括标题、内容、发布时间等信息。
二、系统设计与实现
1.ORM中Model设计
在ORM(Object-Relational Mapping)中,处理外键关系(如一对多、一对一、多对多)是非常重要的。这些关系帮助我们在数据库中维护数据的一致性和完整性。以下是在ORM中定义和使用这些关系的基本写法和用法,以Python的Django ORM为例(因为Django的ORM非常流行且易于理解):
一对多(ForeignKey):
一对多关系是最常见的数据库关系之一。在Django中,你可以通过在模型中使用ForeignKey字段来定义一对多关系。
一对一(OneToOneField):
一对一关系用于表示两个模型之间的严格一对一映射。在Django中,你可以使用OneToOneField来定义这种关系。
多对多(ManyToManyField)
多对多关系表示两个模型之间可以存在多个关联。在Django中,你可以使用ManyToManyField来定义这种关系。
(1). 宿舍信息模型代码如下(示例):
from django.db import models
from django.contrib.auth.hashers import make_password, check_password
from django.core.validators import RegexValidator, MinLengthValidator
class Building(models.Model):
building_name = models.CharField(max_length=50, verbose_name='楼宇名字')
remarks = models.TextField(verbose_name='楼宇备注')
def __str__(self):
return self.building_name
class Dormitory(models.Model):
dorm_num = models.CharField(max_length=10, unique=True, verbose_name='宿舍号')
# 这里是外键 一对多的关系 一个楼宇 对应多个宿舍
building = models.ForeignKey('Building', on_delete=models.CASCADE, verbose_name='楼宇')
floor = models.IntegerField(verbose_name='楼层')
capacity = models.PositiveIntegerField(verbose_name='容量', default=4)
current_occupancy = models.PositiveIntegerField(verbose_name='当前已住人数', default=0)
remarks = models.TextField(verbose_name='备注')
class Meta:
ordering=['building']
def __str__(self):
return self.dorm_num
def add_student(self):
if self.current_occupancy < self.capacity:
self.current_occupancy += 1
self.save()
else:
print("宿舍已满,无法新增学生")
def remove_student(self):
if self.current_occupancy > 0:
self.current_occupancy -= 1
self.save()
else:
print("宿舍为空,无法移除学生")
class DormitoryManager(models.Model):
GENDER_CHOICES = [
('M', '男'),
('F', '女'),
]
manager_name = models.CharField(max_length=50, verbose_name="宿管姓名")
manager_tel = models.CharField(
max_length=15,
verbose_name='宿管电话',
validators=[RegexValidator(r'^\d{10,15}$', '请输入有效的电话号码')],
unique=True,
)
manager_password = models.CharField(
max_length=128,
verbose_name="宿管密码",
validators=[MinLengthValidator(6)]
)
# 这里也是一对多的关系 !!!
building = models.ForeignKey(Building, on_delete=models.CASCADE, verbose_name='管理楼宇')
def save(self, *args, **kwargs):
if not self.pk and not self.manager_password:
# 设置初始密码并加密
self.manager_password = make_password(self.manager_tel[-6:])
elif self.manager_password and not self.manager_password.startswith('pbkdf2_sha256$'):
# 如果密码没有加密,确保再次加密(防止更新时明文存储)
self.manager_password = make_password(self.manager_password)
super(DormitoryManager, self).save(*args, **kwargs)
def __str__(self):
return self.manager_name
def check_password(self, raw_password):
return check_password(raw_password, self.manager_password)
(2). 学生信息模型代码如下(示例):
from django.db import models
from django.core.validators import RegexValidator, MinLengthValidator
from django.contrib.auth.hashers import make_password
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from dorm.models import Dormitory
class Student(models.Model):
GENDER_CHOICES = [
('M', '男'),
('F', '女'),
]
STATUS_CHOICES = [
('active', '激活'),