今天实现一个基于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 Matthes 9787115546081 计算机科学 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

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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐