LibrarySystem图书管理系统开发(一)

LibrarySystem图书管理系统开发(一)

概述

本文介绍了一种设计和开发图书管理系统的方法,该系统使用Python编程语言和Django框架开发。

需求

我们的图书管理系统需要具备以下功能:

  1. 添加/编辑/删除图书
  2. 添加/编辑/删除图书分类
  3. 借阅/归还图书
  4. 搜索图书
  5. 管理员登录

设计

数据库设计

我们需要至少两个相关的数据库表来存储数据: BookCategory。下面是它们的表结构:

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应用程序。

模型

我们可以创建两个模型 BookCategory 对应于上面的两张表.

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技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • mybatis自动建表的实现方法

    MyBatis是一个流行的ORM框架,可以让开发人员通过简单的配置实现Java对象与关系型数据库之间的映射。它支持自动建表,在配置文件中添加一些参数,就可以让MyBatis自动创建数据库表结构。下面是实现自动建表的步骤: 1. 添加自动建表所需的依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>o…

    Java 2023年5月20日
    00
  • 【MongoDB for Java】Java操作MongoDB数据库

    MongoDB是开源的、高性能的文档型数据库,而Java作为一种流行的编程语言,有丰富的工具和库支持MongoDB。本文将详细说明Java操作MongoDB数据库的完整攻略,具体过程包括以下几个步骤: 安装MongoDB驱动 Java操作MongoDB需要先安装MongoDB的Java驱动,可以通过Maven等依赖工具导入: <dependency&g…

    Java 2023年6月1日
    00
  • Mybatis之动态sql标签的使用

    那么首先我们先讲一下什么是Mybatis的动态sql标签。动态sql标签可以根据传递的参数生成不同的SQL查询语句,提供更加灵活的查询方式。相对于其他ORM框架,Mybatis的动态sql标签有独特的实现方式。那么接下来我们来看看如何使用Mybatis的动态sql标签。 判断语句标签<if> 我们可以使用<if>标签来进行条件判断。例…

    Java 2023年5月20日
    00
  • Springboot拦截器如何获取@RequestBody参数

    下面是关于Spring Boot拦截器如何获取@RequestBody参数的攻略。 什么是拦截器 拦截器是Spring框架中的一个组件,它是在请求到达Controller之前或离开Controller之后执行的代码块。拦截器主要用于对请求进行预处理和后处理,在预处理中可以实现一些安全性检查和参数校验等操作,而后处理中可以对响应结果进行处理。 如何获取@Req…

    Java 2023年5月20日
    00
  • Java之int数组声明与初始化方式

    Java之int数组声明与初始化方式 在Java中,数组是一种特殊的数据类型,可以用来存储多个相同类型的数据。在Java中声明和初始化数组有多种方式,本文将介绍其中一种常用的方式——int数组声明与初始化方式。 声明和初始化int数组 以下是声明和初始化int数组的语法: int[] arr = new int[length]; 其中,arr是数组的名称,i…

    Java 2023年5月26日
    00
  • Mybatis联合查询的实现方法

    下面是对于Mybatis联合查询的实现方法的详细讲解及示例。 1. 联合查询的概念 Mybatis的联合查询实际上是多表查询的一种实现方式,也就是说,它是通过对多个数据表进行连接查询,然后再将查询结果进行合并,最终得到一个包含所有所需数据的结果集。联合查询通常用于查询复杂的业务需求,例如需要返回关联表或多个表中的信息的场合。 2. 联合查询的实现方法 在My…

    Java 2023年5月20日
    00
  • 基于Java创建一个订单类代码实例

    以下是基于Java创建一个订单类的完整攻略过程: 1. 定义订单类 在创建订单类之前,需要先明确订单类需要存储哪些信息,例如订单编号、订单创建时间、订单金额等等,再根据这些信息定义订单类的属性。同时,还需要定义订单类的基本行为,例如添加商品到订单、计算订单总金额等等,并将这些功能定义为订单类的方法。 public class Order { private …

    Java 2023年5月23日
    00
  • Java编程Retry重试机制实例详解

    Java编程Retry重试机制实例详解 在实际工作中,我们经常会遇到一些不稳定的网络或服务,如果我们在请求时遇到了异常,通常需要进行重试。这时,Retry重试机制能够有效保证我们的请求能够成功返回。这篇文章就来详细讲解Java编程Retry重试机制的实例。 Retry重试机制是什么 Retry重试机制是指我们在请求某个服务时,如果第一次请求失败了,我们可以再…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部