基于Django的python图书管理系统源码实现
今天实现一个基于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
开发服务器启动后,控制台会显示服务器地址。打开浏览器访问该地址即可看到系统首页。

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



所有评论(0)