Python基于Django实现图书馆借阅管理系统(可用于毕业设计/作业)-2

Python基于Django实现图书馆借阅管理系统(可用于毕业设计/作业)-2
Python基于Django实现图书馆借阅管理系统示意图

在Django中,使用的是MTV框架设计模式,其中M层称之为model层(模型层),用于处理数据。比如生成数据表、修改数据表字段、将数据存入数据表、取出数据表的记录、修改数据表的记录、删除数据表中记录。

web程序,首先涉及到数据表的设计,即我们的web应用需要用到哪些数据,并分别存放到哪些表中。在Django中不直接写sql代码操作数据库,而是通过Django为我们封装的orm框架,将数据库表和python类进行一一映射,通过对类的操作,进而建立数据表、对数据进行增删改查操作。

对于图书馆借阅管理系统而言,我们需要创建八个表,分别是书籍表、出版社、书籍类别、书架、用户表(继承Django原有用户表)、等级规则表、借阅证、借阅记录表。

下面是八个表的源代码,后面会一一讲解每个表中字段的类型,以及为什么这么设计的原因。代码后面要放到创建应用下的model.py文件中。

书籍表

# 书籍
class Book(models.Model):
    class Meta:
        ordering = ["-id"]
    name = models.CharField(max_length=64, verbose_name="图书", help_text="请输入书籍名称", db_index=True)
    autor = models.CharField(max_length=128, verbose_name="作者", db_index=True)
    # isbn码 只有10位或13位,均为数字,需要钩子校验,且唯一,需检索
    isbn_code = models.CharField(max_length=13, verbose_name="ISBN码", unique=True, db_index=True)
    price = models.DecimalField(max_digits=8, verbose_name="定价", decimal_places=2)
    pub_date = models.DateField(verbose_name="出版日期")
    description = models.TextField(max_length=128, verbose_name="书籍描述", help_text="请输入书籍描述")
    publish = models.ForeignKey(to="Publish", verbose_name="出版社", on_delete=models.CASCADE)
    category = models.ForeignKey(to="Category", verbose_name="书籍分类", on_delete=models.CASCADE)
    bookshelf = models.ForeignKey(to="Bookshelf", verbose_name="放置书架", on_delete=models.CASCADE)
    add_time = models.DateTimeField(auto_now_add=True, editable=False)  # 首次录入系统时间
    is_on_bookshelf = models.BooleanField(default=True)  # 图书录入系统时,默认上架操作。PS:正在出借的图书不能做下架处理
    is_lend = models.BooleanField(default=False)  # 默认该图书未借出

出版社

# 出版社
class Publish(models.Model):
    name = models.CharField(max_length=32, unique=True, verbose_name="出版社")

    def __str__(self):
        return self.name

    class Meta:
        ordering = ["-id"]

书籍类别

# 书籍类别
class Category(models.Model):
    name = models.CharField(max_length=32, unique=True, verbose_name="类别")

    def __str__(self):
        return self.name

    class Meta:
        ordering = ["-id"]

书架

# 书架
class Bookshelf(models.Model):
    name = models.CharField(max_length=32, unique=True, verbose_name="书架号")

    def __str__(self):
        return self.name

    class Meta:
        ordering = ["-id"]

用户表(继承Django原有用户表)

# 继承扩展用户表,原有表字段有(username、password、email、is_staff、is_active、date_joined...)
class UserInfo(AbstractUser):
    class Meta:
        ordering = ["-id"]
    # 手机号
    phone = models.CharField(max_length=11, unique=True, verbose_name="手机号", help_text="请输入手机号")
    is_student = models.BooleanField(default=True)

等级规则表

# 等级规则表
class Rule(models.Model):
    class Meta:
        ordering = ["-id"]
    name = models.CharField(max_length=32, unique=True, verbose_name="等级名称")
    limit_count = models.SmallIntegerField(verbose_name="可借数量")  # 可借书数量
    limit_date = models.SmallIntegerField(verbose_name="可借天数")  # 可借书的天数
    date_price = models.DecimalField(max_digits=6, decimal_places=2, default=0, verbose_name="逾期每天收费")  # 逾期每天收费标准

    def __str__(self):
        return self.name

借阅证

# 借阅证
class Card(models.Model):
    class Meta:
        ordering = ["-id"]
    card_number = models.BigIntegerField(verbose_name="借阅证卡号", unique=True)  # 管理员激活卡时填写该卡号
    rule = models.ForeignKey(to="Rule", on_delete=models.CASCADE, verbose_name="角色")
    user = models.OneToOneField(to="UserInfo", on_delete=models.CASCADE, verbose_name="借阅者")
    is_use = models.BooleanField(verbose_name="是否激活")  # 默认不可用,需要管理员激活

借阅记录表

# 借书记录表
class BorrowBook(models.Model):
    class Meta:
        ordering = ["-id"]
    card = models.ForeignKey(to="Card", on_delete=models.DO_NOTHING)
    book = models.ForeignKey(to="Book", on_delete=models.DO_NOTHING)
    borrow_time = models.DateTimeField()
    need_return_time = models.DateTimeField()  # 根据借书时间进行计算
    is_return = models.BooleanField()
    actual_return_time = models.DateTimeField()  # 读者还书时实际时间
    exceed_date = models.DurationField()  # 读者每次登陆时更新该数据

下一节,我会演示从零开始通过pycharm创建Django的web应用。

关于更新:纯属分享,一般一天更新1~2篇,直至完结。大家的支持是笔者更新内容的最大动力,如果觉得内容对您有所帮助,请点赞支持一下,我会认为分享的内容是有价值的,同时会尽力加大更新内容的力度,谢谢。

猜你喜欢

转载自blog.csdn.net/xiaomi170/article/details/131047485