今天实现一个基于python的图书管理系统。

完整项目:https://pan.quark.cn/s/8ed201893b30

请看效果展示

实现图书信息的录入、查询、修改和删除功能。

系统采用Django的架构模式,分为三个核心层次:

第一层,表现层:使用Bootstrap 5和FontAwesome构建前端界面,包含图书管理、读者管理、借还管理等多个页面。

第二层,业务逻辑层:由三个Django应用组成,books负责图书相关操作,members负责读者管理,circulation负责借阅和归还业务。

第三层,数据访问层:通过Django ORM操作SQLite数据库,所有数据表由模型类自动生成。

2.2 功能模块划分

根据图书管理的实际业务需求,系统分为三个核心应用:

books应用,负责图书分类管理和图书信息管理,以及图书检索功能,核心模型为Category和Book。

members应用,负责读者管理和读者状态跟踪,核心模型为Member。

circulation应用,负责借书操作、还书操作、借阅记录查询和逾期罚款计算,核心模型为BorrowRecord和Reservation。

2.3 技术选型

Web框架选用Django 4.2以上版本,功能完善、社区活跃、内置管理后台。

数据库选用SQLite,零配置、适合中小型系统,是毕业设计的首选方案。

前端框架选用Bootstrap 5,响应式设计、组件丰富、上手快捷。

图标库选用FontAwesome 6,开源免费、图标种类丰富。

图片处理使用Pillow,作为Django ImageField的依赖库。

三、数据库模型设计

3.1 图书分类模型

分类模型用于管理图书的分类信息,每个分类有唯一的编号和名称。sort_order字段允许管理员自定义分类的显示顺序。

3.2 图书信息模型

图书模型是整个系统的核心。关键设计点包括:

ISBN作为唯一标识,确保每本书在系统中的唯一性,便于查询和去重。

total_count与available_count分离,前者表示馆藏总量,后者表示当前可借数量,借还操作时只更新可借数量。

3.3 读者模型

读者模型的设计体现了以下考量:

借阅证号card_id作为业务主键,是读者在图书馆中的唯一标识,用于借还书时的身份验证。

读者类型member_type区分学生和教师,不同类型拥有不同的最大借书量和借书期限。

status字段支持正常、冻结、挂失三种状态,冻结状态的读者不能借书。

3.4 借书记录模型

借书记录是系统中数据量最大的模型,其设计直接关系到借还业务的正确性。

借书日期通过auto_now_add自动记录创建时间。应还日期在模型的save方法中根据读者的借书期限自动计算。逾期判断通过比较当前时间和应还日期实现。

def is_overdue(self):
    return self.return_date is None and 当前时间 > self.due_date

def days_overdue(self):
    if self.return_date:
        return max(0, (self.return_date - self.due_date).days)
    return max(0, (当前时间 - self.due_date).days)

def calculate_fine(self):
    return round(self.days_overdue() * 0.5, 2)

3.5 数据关系总结

Category与Book是一对多关系,一个分类下可以有多本图书。

Book与BorrowRecord是一对多关系,一本图书可以有多次借阅记录。

Member与BorrowRecord是一对多关系,一位读者可以有多次借阅记录。

四、核心业务功能实现

4.1 图书管理功能

图书管理模块实现了对图书信息的增删改查操作。

图书搜索功能使用Q对象实现多字段联合搜索,select_related进行外键的预加载优化查询性能。icontains提供了大小写不敏感的模糊匹配。

if form.is_valid():
    keyword = form.cleaned_data[keyword]
    category = form.cleaned_data[category]

    if keyword:
        books = books.filter(
            Q(title__icontains=keyword) |
            Q(author__icontains=keyword) |
            Q(isbn__icontains=keyword)
        )
    if category:
        books = books.filter(category=category)

return render(request, books/book_list.html, {books: books, form: form})

图书表单验证中,clean_isbn方法实现了自定义字段验证,自动去除ISBN中的连字符和空格,然后检查长度是否为10位或13位。

4.2 借书功能

借书是系统中最核心的业务操作,涉及到多个数据表的一致性变更,因此使用数据库事务来保证操作的原子性。

事务的atomic保证了以下操作的原子性:创建借书记录,减少图书可借数量。如果其中任何一步失败,整个操作回滚。

                record = BorrowRecord.objects.create(
                    book=book, member=member,
                    borrow_date=timezone.now(),
                    due_date=timezone.now() + timedelta(days=member.borrow_days),
                )
                book.available_count -= 1
                book.save()

                提示借书成功
                return redirect(circulation_index)
        except Exception as e:
            提示借书失败

借书表单验证包含三层业务规则检查:

第一,读者有效性,检查借阅证号是否存在,读者状态是否正常。

第二,借书限额,检查读者当前在借数量是否已达到上限。

第三,图书可借性,检查图书是否存在,是否还有可借副本。

4.3 还书功能

还书时除了创建归还记录外,还需要处理逾期罚款的自动计算。select_for_update在事务中使用了行级锁,防止在高并发场景下出现数据竞争问题。

                record.return_date = timezone.now()
                overdue_days = record.days_overdue()
                if overdue_days > 0:
                    record.status = overdue
                    record.fine_amount = record.calculate_fine()
                else:
                    record.status = returned
                record.save()

                record.book.available_count += 1
                record.book.save()
                提示还书成功
        except BorrowRecord.DoesNotExist:
            提示未找到记录

`

4.4 首页数据统计

首页展示了系统的核心运营指标,包括图书总数、注册读者数、当前借出数量和逾期数量。

recent_books = Book.objects.order_by(-created_at)[:8]
recent_records = BorrowRecord.objects.select_related(book, member).order_by(-borrow_date)[:6]

`

这里使用了F表达式实现数据库层的字段比较,以及annotate加Count实现分组统计。

五、前端界面设计

5.1 模板继承体系

系统使用Django的模板继承机制构建了统一的界面风格。base.html作为基础模板,包含导航栏、消息提示区域和页脚,所有子模板通过extends标签继承基础布局。

5.2 导航栏设计

导航栏采用深色主题,包含图书管理、读者管理、借还管理、借阅记录和后台管理五个功能入口。登录状态下显示用户名和退出按钮,未登录时显示登录按钮。

5.3 数据统计卡片

首页使用四个卡片展示系统核心指标,每个卡片使用不同的颜色区分:

蓝色卡片显示图书总数,关联到图书管理模块。

绿色卡片显示注册读者数,关联到读者管理模块。

黄色卡片显示当前借出数量,关联到借还管理模块。

红色卡片显示逾期未还数量,用于催还管理。

5.4 表单美化

所有表单都使用了Bootstrap的表单样式类,通过Django表单的widget属性指定CSS类名。日期输入框使用HTML5的date类型,选择框使用form-select样式。

系统预置了10个图书分类,覆盖计算机技术、文学、经济、自然科学等多个领域。

分类名称分类编号说明
计算机科学TP3编程、算法、数据结构、人工智能等
软件工程TP31开发方法、项目管理、设计模式等
网络技术TP393计算机网络、网络安全、云计算等
数据库技术TP311数据库设计、SQL、大数据等
文学小说I247中外小说、散文、诗歌等作品
经济管理F2经济学、管理学、市场营销等
自然科学N数学、物理、化学、生物等
历史传记K中外历史、人物传记、文化研究
外语学习H31英语、日语、法语等学习资料
艺术设计J绘画、设计、摄影、影视等

7.2 图书数据示例

系统预置了39本图书,涵盖各分类。以下为列表:

书名作者ISBN分类馆藏量
Python编程:从入门到实践Eric Matthes9787115546081计算机科学5本
深度学习入门斋藤康毅9787115545367计算机科学3本

7.3 读者数据示例

系统预置了20位读者,包含学生、教师和其他三种类型。

借阅证号姓名类型院系借书权限
2021001张三学生计算机学院5本,期限30天
2021002李四学生软件学院5本,期限30天

八、系统运行指南

8.1 环境准备

确保已安装 Python 3.9 或更高版本。

在命令行窗口中进入项目目录,然后安装项目所需的依赖包:

pip install -r requirements.txt

这条命令会自动安装Django、Pillow等所有必需的Python库。

8.2 初始化项目

整个初始化过程需要按顺序执行六个步骤。

第一步,为每个应用生成数据库迁移文件。makemigrations会检测各个应用中models.py的变化,生成对应的数据库迁移文件。

python manage.py makemigrations books

python manage.py makemigrations members

python manage.py makemigrations circulation

第二步,创建数据库表。migrate将上一步生成的迁移文件应用到数据库,自动创建所有数据表。Django内置的认证、管理后台、会话等模块的表也会一并创建。

python manage.py migrate

执行成功后,项目目录下会生成db.sqlite3数据库文件。

第三步,创建超级管理员账号。按提示输入用户名、邮箱和密码。

python manage.py createsuperuser

超级管理员可以登录管理后台,对图书、读者、借阅记录进行直接管理。

第四步,导入预置的示例数据。

Get-Content data\init_data.py | python manage.py shell

这条命令会在Django shell环境中执行数据导入脚本,自动创建10个图书分类、39本图书信息、20位读者信息和约50条借阅记录。

第五步,启动。

python manage.py runserver

开发服务器启动后,控制台会显示服务器地址。打开浏览器访问该地址即可看到系统首页。

更多推荐