LibrarySystem图书管理系统开发(一)
概述
本文介绍了一种设计和开发图书管理系统的方法,该系统使用Python编程语言和Django框架开发。
需求
我们的图书管理系统需要具备以下功能:
- 添加/编辑/删除图书
- 添加/编辑/删除图书分类
- 借阅/归还图书
- 搜索图书
- 管理员登录
设计
数据库设计
我们需要至少两个相关的数据库表来存储数据: Book
和 Category
。下面是它们的表结构:
Book表
字段名 | 类型 | 描述 |
---|---|---|
id | Integer | 自动生成的唯一标识符 |
title | Char | 图书的标题 |
author | Char | 图书的作者 |
category | Category | 图书的分类,外键关联Category表 |
status | Boolean | 图书的状态,True表示可借,False表示不可借 |
borrower | Char | 该图书的借阅者 |
borrow_at | Date | 该图书的借阅日期 |
return_at | Date | 该图书的归还日期 |
Category表
字段名 | 类型 | 描述 |
---|---|---|
id | Integer | 自动生成的唯一标识符 |
name | Char | 分类的名称 |
应用程序设计
我们需要为该图书管理系统编写一个Django应用程序。
模型
我们可以创建两个模型 Book
和 Category
对应于上面的两张表.
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
status = models.BooleanField(default=True)
borrower = models.CharField(max_length=50, blank=True, null=True)
borrow_at = models.DateField(blank=True, null=True)
return_at = models.DateField(blank=True, null=True)
def __str__(self):
return self.title
视图
我们需要为该应用程序创建一些视图函数,以便图书的 CRUD 操作、借阅和归还等。
from django.shortcuts import render, get_object_or_404, redirect
from .models import Book, Category
from .forms import BookForm, CategoryForm
from django.contrib.auth.decorators import login_required
@login_required
def home(request):
books = Book.objects.all().order_by('-id')
categories = Category.objects.all()
return render(request, 'home.html', {'books': books, 'categories': categories})
@login_required
def add_book(request):
if request.method == 'POST':
form = BookForm(request.POST)
if form.is_valid():
book = form.save()
return redirect('home')
else:
form = BookForm()
return render(request, 'add_book.html', {'form': form})
@login_required
def edit_book(request, pk):
book = get_object_or_404(Book, pk=pk)
if request.method == 'POST':
form = BookForm(request.POST, instance=book)
if form.is_valid():
book = form.save()
return redirect('home')
else:
form = BookForm(instance=book)
return render(request, 'edit_book.html', {'form': form})
@login_required
def delete_book(request, pk):
book = get_object_or_404(Book, pk=pk)
book.delete()
return redirect('home')
@login_required
def add_category(request):
if request.method == 'POST':
form = CategoryForm(request.POST)
if form.is_valid():
category = form.save()
return redirect('home')
else:
form = CategoryForm()
return render(request, 'add_category.html', {'form': form})
@login_required
def edit_category(request, pk):
category = get_object_or_404(Category, pk=pk)
if request.method == 'POST':
form = CategoryForm(request.POST, instance=category)
if form.is_valid():
category = form.save()
return redirect('home')
else:
form = CategoryForm(instance=category)
return render(request, 'edit_category.html', {'form': form})
@login_required
def delete_category(request, pk):
category = get_object_or_404(Category, pk=pk)
category.delete()
return redirect('home')
@login_required
def borrow_book(request, pk):
book = get_object_or_404(Book, pk=pk)
book.status = False
book.borrower = request.user.username
book.borrow_at = datetime.date.today()
book.save()
return redirect('home')
@login_required
def return_book(request, pk):
book = get_object_or_404(Book, pk=pk)
book.status = True
book.borrower = ''
book.borrow_at = None
book.return_at = datetime.date.today()
book.save()
return redirect('home')
@login_required
def search_book(request):
if request.method == 'POST':
search = request.POST['search']
books = Book.objects.filter(title__icontains=search)
categories = Category.objects.all()
return render(request, 'home.html', {'books': books, 'categories': categories})
表单
我们需要为添加/编辑图书、添加/编辑图书分类等操作编写表单。
from django import forms
from .models import Book, Category
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ('title', 'author', 'category',)
class CategoryForm(forms.ModelForm):
class Meta:
model = Category
fields = ('name',)
模板
我们需要为应用程序模板编写4个视图模板,并创建以下5个URL:
from django.urls import path
from .views import *
urlpatterns = [
path('', home, name='home'),
path('add-book/', add_book, name='add_book'),
path('edit-book/<int:pk>/', edit_book, name='edit_book'),
path('delete-book/<int:pk>/', delete_book, name='delete_book'),
path('add-category/', add_category, name='add_category'),
path('edit-category/<int:pk>/', edit_category, name='edit_category'),
path('delete-category/<int:pk>/', delete_category, name='delete_category'),
path('borrow-book/<int:pk>/', borrow_book, name='borrow_book'),
path('return-book/<int:pk>/', return_book, name='return_book'),
path('search-book/', search_book, name='search_book'),
]
示例 1:
为了更好的地展示此应用程序,下面是主页的简单实现。我们将所有的图书列表和分类列表都渲染到主页上。该模板文件为home.html
{% extends 'base.html' %}
{% block content %}
<form class="search-form" method="post" action="{% url 'search_book' %}">
{% csrf_token %}
<div class="form-group mb-2">
<input type="text" name="search" placeholder="请输入要搜索的图书标题" class="form-control">
</div>
<button type="submit" class="btn btn-primary mb-2">搜索</button>
</form>
{% if books %}
<table class='table table-striped'>
<thead>
<th>图书名</th>
<th>作者</th>
<th>图书分类</th>
<th>状态</th>
<th>借阅人</th>
<th>借阅日期</th>
<th>归还日期</th>
<th>操作</th>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ book.title }}</td>
<td>{{ book.author }}</td>
<td>{{ book.category }}</td>
{% if book.status %}
<td>可借</td>
{% if user.is_authenticated %}
<td>
<a href="{% url 'borrow_book' book.pk %}" class="btn btn-primary">借阅</a>
</td>
{% endif %}
{% else %}
<td>不可借</td>
{% if user.is_authenticated and user.username == book.borrower %}
<td>
<a href="{% url 'return_book' book.pk %}" class="btn btn-primary">归还</a>
</td>
{% else %}
<td>{{ book.borrower }}</td>
{% endif %}
{% endif %}
<td>{{ book.borrow_at }}</td>
<td>{{ book.return_at }}</td>
<td>
{% if user.is_authenticated %}
<a href="{% url 'edit_book' book.pk %}" class="btn btn-primary">编辑</a>
{% endif %}
{% if user.is_staff %}
<a href="{% url 'delete_book' book.pk %}" class="btn btn-danger">删除</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>暂无图书记录</p>
{% endif %}
<h2>分类列表</h2>
{% if categories %}
<ul class='list-group'>
{% for category in categories %}
<li class='list-group-item'><a href="{% url 'home' %}?category={{ category.id }}">{{ category.name }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>暂无分类记录</p>
{% endif %}
{% endblock %}
示例 2:
我们还需要创建一个添加图书的简单实现,该模板文件为add_book.html
. 下面是代码实现:
{% extends 'base.html' %}
{% block content %}
<h2>添加图书</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="form-group mt-3 mb-3">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'home' %}" class="btn btn-secondary">取消</a>
</div>
</form>
{% endblock %}
当我们运行项目python manage.py runserver
成功后,可以在浏览器里访问localhost:8000
,进入到一个简单的图书管理系统。我们可以查看主页上所有的图书和分类列表、添加新的图书、编辑和删除图书、借阅和归还图书、搜索图书等操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:LibrarySystem图书管理系统开发(一) - Python技术站