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日

相关文章

  • jQuery progressbar通过Ajax请求实现后台进度实时功能

    Sure!下面我会给你详细讲解“jQuery progressbar通过Ajax请求实现后台进度实时功能”的完整攻略。 概述 通过Ajax和jQuery的配合,可以轻松地实现前台进度条与后台处理任务的进度同步显示。主要思路是在前端发出一个Ajax请求,服务器端进行进度处理后,将进度实时反馈到前端页面。 步骤 下面我将分为以下几个步骤讲述完整攻略: 安装jQu…

    Java 2023年5月20日
    00
  • Java基础之教你怎么用代码一键生成POJO

    下面是Java基础之教你怎么用代码一键生成POJO的完整攻略。 简介 POJO指的是“普通Java对象”(Plain Old Java Object),它是一种基础的Java类,通常用于存储数据。在实际开发中,我们需要大量地编写POJO,这个过程比较繁琐。因此,我们可以使用一些工具,来快速地生成POJO的代码。本文将介绍一种使用IDEA插件一键生成POJO的…

    Java 2023年5月19日
    00
  • Java中类的加载顺序剖析(常用于面试题)

    Java中类的加载顺序剖析 在Java中,类的加载顺序是一个很重要的概念,也是经常出现在面试题中的一个考点。本文将会详细讲解Java中类的加载顺序,并且提供相关的代码示例。 类的生命周期 在深入讲解类的加载顺序之前,我们需要先了解Java中类的生命周期。Java中类的生命周期分为五个部分:加载、验证、准备、解析、初始化。 加载:在该阶段,Java虚拟机将会从…

    Java 2023年5月26日
    00
  • 安全管理器的作用是什么?

    安全管理器是一种可以用来管理Java应用程序中的安全策略的类,它可以控制应用程序访问受限资源的权限。在Java应用程序中,安全管理器主要用于保护操作系统的安全和避免恶意代码的攻击。 安全管理器主要有以下作用: 对于受保护的代码块进行管理和控制 安全管理器可以用来管理和控制Java应用程序中的受保护的代码块或敏感操作,例如文件读写操作、网络访问和反射调用。如果…

    Java 2023年5月11日
    00
  • 如何利用JAVA正则表达式轻松替换JSON中的大字段

    下面是如何利用Java正则表达式轻松替换JSON中的大字段的完整攻略: 什么是正则表达式 在介绍如何利用Java正则表达式替换JSON大字段之前,先来简单介绍一下正则表达式。正则表达式是一种文本模式,可以用来匹配搜索文本中的字符串。Java正则表达式是指Java语言中可用的正则表达式。在Java中,正则表达式由 java.util.regex 包提供支持。 …

    Java 2023年5月26日
    00
  • 牛客网BC115—超级圣诞树(java)

    和女朋友坐一块的时候,突然想到了,哈哈哈哈哈 不会很难!!!   import java.util.*; import java.lang.Math; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scann…

    Java 2023年4月17日
    00
  • Erlang初学:Erlang的一些特点和个人理解总结

    Erlang初学:Erlang的一些特点和个人理解总结 概述 Erlang是一门函数式编程语言,适合用于分布式、并发和容错应用的开发。它最初由瑞典电信设备公司Ericsson开发,主要是为了在电话交换机系统中进行并发编程。 Erlang的设计目标是建立一种可容错、可扩展的系统,可以在大规模的、分布式的环境中运行。它的并发机制、错误处理和代码的热升级能力都是它…

    Java 2023年5月26日
    00
  • 十分钟速懂java知识点 System类

    十分钟速懂java知识点 System类 什么是System类? System类是Java中的一个工具类,提供了许多与系统和程序相关的方法和属性。它包含了标准输入/输出、错误输出、系统属性、系统时间等系统级别的操作。 System类的主要方法 System.out.println() 这是Java中最常用的输出方法。它可以将一段字符串或变量的值输出到控制台。…

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