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

yizhihongxing

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日

相关文章

  • java打印表格 将ResultSet中的数据打印成表格问题

    要将ResultSet中的数据打印成表格,我们可以采用以下步骤: 使用 ResultSetMetaData 获取结果集中的列信息,包括列名、列数据类型、列数等信息; 将列信息拼接成表头; 遍历 ResultSet,将每一行数据拼接成一行表格数据,并将所有行拼接成完整的表格; 使用 System.out.println() 或其他输出方式将表头和表格输出到控制…

    Java 2023年5月26日
    00
  • Java反射,泛型在Json中的运用

    【Java反射,泛型在Json中的运用】 1. Java反射在Json中的运用 1.1 什么是Java反射 Java反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取对象信息以及动态调用对象方法的功能称为Java反射。 1.2 在Json中使用Java反射 在Java开发中,J…

    Java 2023年5月26日
    00
  • Java中的throw和throws关键字是什么?

    在Java中,throw和throws关键字都与异常处理有关。 throw关键字 throw是一个关键字,用于抛出一个异常对象。我们可以使用throw来手动抛出一个异常,这通常在程序出错时使用。 throw的使用形式如下: throw exception; 其中,exception代表需要抛出的异常对象。 下面是一个示例,假设我们要写一个方法来处理两个数的除…

    Java 2023年4月28日
    00
  • java实现的二级联动菜单效果

    下面是详细讲解 “java实现的二级联动菜单效果” 的完整攻略。 1. 确定需求 首先,需要明确二级联动菜单的核心需求,例如:用户选择一级菜单项后,联动显示对应的二级菜单项,用户再选择二级菜单项后,能够得到正确的信息或进行相应操作。 2. 设计数据结构 在了解需求后,需要考虑如何设计数据结构来满足需求。对于二级联动菜单,我们可以考虑使用嵌套的Map或List…

    Java 2023年6月15日
    00
  • 关于Ubuntu Server 18.04 LTS 安装Tomcat并配置systemctl管理Tomcat服务的问题

    下面是详细的攻略: 环境准备 确保已经安装了Java环境,Tomcat需要依赖Java运行 sudo apt install default-jdk 下载Tomcat 可以在官网下载Tomcat https://tomcat.apache.org/download-90.cgi。 这里以apache-tomcat-9.0.52.tar.gz为例,在终端中执行…

    Java 2023年6月2日
    00
  • 黑客如何利用文件包含漏洞进行网站入侵

    黑客通过利用文件包含漏洞,可以轻松地将自己的代码注入到网站服务器中,从而实现对网站的入侵。下面是黑客会使用的一些攻击方法和技术: 使用文件包含漏洞的攻击方法 抓取页面源代码 黑客可以访问页面的URL,并使用一些指定的参数来获取页面的源代码。一旦黑客获取了页面的源代码,就可以查看其中是否存在文件包含漏洞。 判断漏洞类型 黑客可以通过分析页面源代码,判断该漏洞是…

    Java 2023年6月15日
    00
  • 微信小程序(十六)form组件详细介绍

    让我来为你详细讲解“微信小程序(十六)form组件详细介绍”的完整攻略。 什么是form组件 在小程序中,form组件是一种用于提交表单数据的组件。form组件可以包含input、textarea、button等表单元素。每个表单元素都有一个name属性和一个value属性,表单元素的数据可以在提交时一并提交到服务器端。 form组件的使用方法 form组件…

    Java 2023年5月23日
    00
  • Java Spring 声明式事务详解

    Java Spring 是一个非常流行的开源框架,可以用来构建企业级应用程序。Spring 内置了事务管理器,提供了声明式事务的支持,让我们能够更加方便地管理事务。本篇文章将着重讲解 Java Spring 声明式事务的完整攻略。 什么是声明式事务 声明式事务是基于 Spring AOP 的一种事务管理方式,它通过对业务方法进行拦截和代理,从而实现自动管理事…

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