简单图书管理系统

发布时间 2023-08-07 19:31:27作者: 凡人半睁眼

一、首页

1、home html 页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<nav class="navbar navbar-inverse">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                    data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">图书管理系统</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">作者 <span class="sr-only">(current)</span></a></li>
                <li><a href="#">图书</a></li>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                       aria-expanded="false">更多下拉框 <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="#">Action</a></li>
                        <li><a href="#">Another action</a></li>
                        <li><a href="#">Something else here</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="#">Separated link</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="#">One more separated link</a></li>
                    </ul>
                </li>
            </ul>
            <form class="navbar-form navbar-left">
                <div class="form-group">
                    <input type="text" class="form-control" placeholder="Search">
                </div>
                <button type="submit" class="btn btn-default">Submit</button>
            </form>
            <ul class="nav navbar-nav navbar-right">
                <li><a href="#">jerry</a></li>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                       aria-expanded="false">更多操作 <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="#">Action</a></li>
                        <li><a href="#">Another action</a></li>
                        <li><a href="#">Something else here</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="#">Separated link</a></li>
                    </ul>
                </li>
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>

<div class="container-fluid">
    <div class="row">
        <div class="col-md-3">
            <div class="list-group">
                <a href="/home/" class="list-group-item active">
                    首页
                </a>
                {#                <a href="{% url 'book_list' %}" class="list-group-item">图书列表</a>#}
                <a href="/book_list/" class="list-group-item">图书列表</a>
                <a href="/publish_list/" class="list-group-item">出版社列表</a>
                <a href="/authors_list/" class="list-group-item">作者列表</a>
                <a href="#" class="list-group-item">更多</a>
            </div>
        </div>
        <div class="col-md-9">
            <div class="panel panel-primary">
                <div class="panel-heading">
                    <h3 class="panel-title">图书管理系统</h3>
                </div>
                {% block content %}
                    <div class="panel-body">
                        <div class="jumbotron">
                            <h1>欢迎来到jingzhi的读书平台</h1>
                            <p>library home</p>
                            <p><a class="btn btn-primary btn-lg" href="#" role="button">学习更多</a></p>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-sm-6 col-md-4">
                            <div class="thumbnail">
                                <img src="https://th.bing.com/th/id/R.ed543702d27a0d67c3b35a8e0335c036?rik=dYjjCZeYCJhgMw&riu=http%3a%2f%2fi.52desktop.cn%3a81%2fupimg%2fallimg%2f20140317%2f201431723185278778024.jpg&ehk=YeKRjoz4pnD1%2fbqTKDHgqIzTM5bG%2fxpIQf6Pl0FcipY%3d&risl=&pid=ImgRaw&r=0"
                                     alt="...">
                                <div class="caption">
                                    <h3>阅读</h3>
                                    <p>...</p>
                                    <p><a href="#" class="btn btn-primary" role="button">Button</a> <a href="#"
                                                                                                       class="btn btn-default"
                                                                                                       role="button">Button</a>
                                    </p>
                                </div>
                            </div>
                        </div>
                        <div class="col-sm-6 col-md-4">
                            <div class="thumbnail">
                                <img src="https://pic.52112.com/180528/JPG-180528_366/6oelrV9vrx_small.jpg"
                                     alt="...">
                                <div class="caption">
                                    <h3>明史</h3>
                                    <p>...</p>
                                    <p><a href="#" class="btn btn-primary" role="button">Button</a> <a href="#"
                                                                                                       class="btn btn-default"
                                                                                                       role="button">Button</a>
                                    </p>
                                </div>
                            </div>
                        </div>
                        <div class="col-sm-6 col-md-4">
                            <div class="thumbnail">
                                <img src="https://th.bing.com/th/id/R.da2e941fffa6645dde283f3ea83e0d88?rik=wpXjy4qakLJNKw&riu=http%3a%2f%2fi.52desktop.cn%3a81%2fupimg%2fallimg%2f20140317%2f2014317231856171778091.jpg&ehk=a8bKUOh59rIJf%2fxwJoHiqgse80giA9kP5yJ4Rx0Nll8%3d&risl=&pid=ImgRaw&r=0"
                                     alt="...">
                                <div class="caption">
                                    <h3>明事</h3>
                                    <p>...</p>
                                    <p><a href="#" class="btn btn-primary" role="button">Button</a> <a href="#"
                                                                                                       class="btn btn-default"
                                                                                                       role="button">Button</a>
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                {% endblock %}

            </div>
        </div>
    </div>
</div>
</body>
</html>

2、urls 

"""library URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/', views.home),
    path('book_list/', views.book_list),
    path('book_add/', views.book_add),
    path('book_edit/', views.book_edit),
    path('book_del/', views.book_del),
    path('publish_list/', views.publish_list),
    path('publish_edit/', views.publish_edit),
    path('publish_add/', views.publish_add),
    path('publish_del/', views.publish_del),
    path('authors_list/', views.authors_list),
    path('authors_add/', views.authors_add),
    path('authors_edit/', views.authors_edit),
    path('authors_del/', views.authors_del),
]

3、views

from django.shortcuts import render, redirect
from app01 import models


# Create your views here.
def home(request):
    return render(request, 'home.html')


# 图书列表
def book_list(request):
    # 查询图书列表数据
    book_queryset = models.Book.objects.all()
    print(book_queryset)
    # <QuerySet [<Book: Book object (1)>, <Book: Book object (4)>, <Book: Book object (6)>, <Book: Book object (7)>, <Book: Book object (8)>, <Book: Book object (9)>, <Book: Book object (10)>, <Book: Book object (11)>]>
    # Book object (1) 为id号,数据删除后,id不翟按照顺序,顺序在增大,删掉的id不再存在
    return render(request, 'book_list.html', locals())


# 添加图书
def book_add(request):
    # 登录页面,GET请求方式,需要展示数据库可选的出版社和作者
    # 出版社下拉框
    publish_queryset = models.Publish.objects.all()
    # 作者下拉框
    author_queryset = models.Author.objects.all()

    # 接收form表单提交过来的数据
    if request.method == 'POST':
        title = request.POST.get('title')
        price = request.POST.get('price')
        date = request.POST.get('date')
        publish = request.POST.get('publish')  # 前端传过来的是id 数字
        authors = request.POST.getlist('authors')  # 有多个作者的情况['zjz', 'ldj']
        # 把数据写到数据库中(前四个字段在Book表中)
        book_obj = models.Book.objects.create(title=title, price=price, publish_date=date, publish_id=publish)
        print(book_obj)  # Book object (6)
        # 添加作者,第三张表插入数据
        book_obj.authors.add(*authors)  # 多对多添加数据
        # 添加完成,页面跳转
        return render(request, 'book_add.html')

    return render(request, 'book_add.html', locals())


# 修改图书信息
def book_edit(request):
    edit_id = request.GET.get('id')
    edit_obj = models.Book.objects.filter(pk=edit_id).first()

    # 出版社列表
    publish_queryset = models.Publish.objects.all()

    # 作者列表
    author_queryset = models.Author.objects.all()

    # 如果是post请求,就走下面的逻辑
    if request.method == 'POST':
        # 接收form表单提交过来的数据
        hidden_id = request.POST.get('hidden_id')
        title = request.POST.get('title')
        price = request.POST.get('price')
        date = request.POST.get('date')
        publish = request.POST.get('publish')  # 1 2 3
        authors = request.POST.getlist('authors')  # ['1', '2', '3']

        edit_obj = models.Book.objects.filter(pk=hidden_id).first()
        models.Book.objects.filter(pk=hidden_id).update(title=title, price=price, publish_date=date, publish_id=publish)
        # 操作第三张表
        edit_obj.authors.set(authors)
        return redirect('/book_list/')

    # print(edit_obj.authors.all())
    authors_list = []

    for i in edit_obj.authors.all():
        authors_list.append(i.pk)
    print(authors_list)  # [1, 3]

    return render(request, 'book_edit.html', locals())


# 删除图书
def book_del(request):
    # 获取id,根据id去数据库删除相关的信息
    del_id = request.GET.get('id')
    # print(del_id)
    models.Book.objects.filter(pk=del_id).delete()

    return redirect('/book_list/')


# 出版社列表
def publish_list(request):
    publish_queryset = models.Publish.objects.all()
    return render(request, 'publish_list.html', locals())


# 添加出版社
def publish_add(request):
    if request.method == 'POST':
        # 接收form表单提交过来的数据
        name = request.POST.get('name')
        addr = request.POST.get('addr')
        models.Publish.objects.create(name=name, addr=addr)
        return redirect('/publish_list/')
    return render(request, 'publish_add.html')


# 修改出版社
def publish_edit(request):
    publish_edit_id = request.GET.get('id')  # 先获取id
    publish_obj = models.Publish.objects.filter(pk=publish_edit_id).first()  # 获取一个publish_obj对象
    if request.method == 'POST':
        new_name = request.POST.get('name')  # 获取前端传来的出版社名,name对应的只
        new_addr = request.POST.get('addr')
        # 更新出版社名称和地址
        publish_obj.name = new_name
        publish_obj.addr = new_addr
        publish_obj.save()
        return redirect('/publish_list/')
    return render(request, 'publish_edit.html', locals())


# 删除出版社
def publish_del(request):
    # 获取id,根据id去数据库删除相关的信息
    del_id = request.GET.get('id')
    # print(del_id)
    models.Publish.objects.filter(pk=del_id).delete()
    return redirect('/publish_list/')


# 作者列表
def authors_list(request):
    authors_queryset = models.Author.objects.all()
    print(authors_queryset)
    # <QuerySet [<Author: Author object (1)>, <Author: Author object (2)>, <Author: Author object (3)>, <Author: Author object (4)>]>
    return render(request, 'authors_list.html', locals())


# 添加作者
def authors_add(request):
    if request.method == 'POST':
        # 接收form表单提交过来的数据
        name = request.POST.get('name')
        age = request.POST.get('age')
        phone = request.POST.get('phone')
        addr = request.POST.get('addr')
        # 作者详情外键字段逻辑,先添加作者详情表字段
        authors_detail_obj = models.Authordetail.objects.create(phone=phone, addr=addr)
        models.Author.objects.create(name=name, age=age, author_id=authors_detail_obj.pk)

        return redirect('/authors_list/')
    return render(request, 'authors_add.html')


# 修改作者
def authors_edit(request):
    author_edit_id = request.GET.get('id')  # 先获取id
    author_obj = models.Author.objects.filter(pk=author_edit_id).first()  # 获取一个publish_obj对象
    if request.method == 'POST':
        new_name = request.POST.get('name')
        new_age = request.POST.get('age')
        # 写入数据库
        author_obj.name = new_name
        author_obj.age = new_age
        author_obj.save()
        return redirect('/authors_list/')
    return render(request, 'authors_edit.html', locals())


#  删除作者
def authors_del(request):
    del_id = request.GET.get('id')
    models.Author.objects.filter(pk=del_id).delete()
    return redirect('/authors_list/')

4、models 

from django.db import models


# 图书表、出版社表、作者表、作者详情表
class Book(models.Model):
    title = models.CharField(max_length=64, )
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)
    # 外键,多对多
    authors = models.ManyToManyField(to='Author')
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)


class Publish(models.Model):
    name = models.CharField(max_length=64)
    addr = models.CharField(max_length=64)

    def __str__(self):
        return self.name


class Author(models.Model):
    name = models.CharField(max_length=64)
    age = models.IntegerField()
    # 外键
    author = models.OneToOneField(to='Authordetail', on_delete=models.CASCADE)


class Authordetail(models.Model):
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=64)

5、效果

二、图书功能页

1、展示图书列表

{% extends 'home.html' %}


{% block content %}
    <h1 class="text-center">图书列表展示</h1>
    <a href="/book_add/" class="btn btn-info">添加图书</a>
    <table class="table  table-striped table-hover">
        <thead>
        <tr>
            <th>标题</th>
            <th>价格</th>
            <th>出版日期</th>
            <th>出版社</th>
            <th>作者</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for foo in book_queryset %}
            <tr>
                <td>{{ foo.title }}</td>
                <td>{{ foo.price }}</td>
                <td>{{ foo.publish_date|date:'Y-m-d' }}</td>
                <td>{{ foo.publish.name }}</td>  {#书查出版社,正向查询,外键字段跳表#}
                <td>
                    {% for author in foo.authors.all %}
                        {% if forloop.last %}
                            {{ author.name }}
                        {% else %}
                            {{ author.name }} |
                        {% endif %}
                    {% endfor %}

                </td>
                <td>
{#                    <a href="/book/edit/{{ foo.pk }}" class="btn btn-success">修改</a>#}
                    <a href="/book_edit/?id={{ foo.pk }}" class="btn btn-success">修改</a>
                    <a href="/book_del/?id={{ foo.pk }}"  class="btn btn-danger">删除</a>
                </td>
            </tr>
        {% endfor %}


        </tbody>
    </table>
{% endblock %}

2、添加图书

{% extends 'home.html' %}


{% block content %}
    <h1 class="text-center">新增图书</h1>
    <div class="container">
        <div class="row">
            <form action="" method="post">
                {% csrf_token %}
                <input type="hidden" value="{{ edit_obj.pk }}" name="hidden_id">
                <div class="form-group">
                    图书名称:<input type="text" class="form-control" name="title" value="{{ edit_obj.title }}">
                </div>
                <div class="form-group">
                    图书价格:<input type="number" class="form-control" name="price" value="{{ edit_obj.price }}">
                </div>
                <div class="form-group">
                    出版日期:<input type="date" class="form-control" name="date"
                                value="{{ edit_obj.publish_date|date:'Y-m-d' }}">
                </div>
                <div class="form-group">

                    出版社:
                    <select name="publish" id="" class="form-control">
                        {% for foo in publish_queryset %}
                            {% if foo.pk == edit_obj.publish_id %}
                                <option value="{{ foo.pk }}" selected>{{ foo.name }}</option>
                            {% else %}
                                <option value="{{ foo.pk }}">{{ foo.name }}</option>
                            {% endif %}

                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    作者:
                    <select name="authors" class="form-control" multiple id="">
{#                    multiple 实现下拉框多选效果#}
                        {% for foo in author_queryset %}
                             {% if foo.pk in authors_list %}
                                <option value="{{ foo.pk }}" selected>{{ foo.name }}</option>
                             {% else %}
                                <option value="{{ foo.pk }}">{{ foo.name }}</option>
                             {% endif %}
                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <input type="submit" class="btn btn-success btn-block">
                </div>
            </form>
        </div>
    </div>
{% endblock %}

3、修改图书

{% extends 'home.html' %}

{% block content %}
    <h1 class="text-center">修改图书</h1>
    <div class="container">
        <div class="row">
            <form action="" method="post">
                {% csrf_token %}
                <input type="hidden" value="{{ publish_queryset.pk }}" name="hidden_id">
                <div class="form-group">
                    图书名称:<input type="text" class="form-control" name="title" value="{{ edit_obj.title }}">
                </div>
                <div class="form-group">
                    图书价格:<input type="number" class="form-control" name="price" value="{{ edit_obj.price }}">
                </div>
                <div class="form-group">
                    出版日期:<input type="date" class="form-control" name="date"
                                value="{{ edit_obj.publish_date|date:'Y-m-d' }}">
                </div>
                <div class="form-group">
                    出版社:
                    <select name="publish" id="" class="form-control">
                        {% for foo in publish_queryset %}
{#                            foo是所有的出版社循环的一条结果,判断当前循环的id值是不是和传进的参数id一样 #}
                            {% if foo.pk == edit_obj.publish_id %}
                                <option value="{{ foo.pk }}" selected>{{ foo.name }}</option>
                            {% else %}
                                <option value="{{ foo.pk }}">{{ foo.name }}</option>
                            {% endif %}

                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    作者:
                    <select name="authors" class="form-control" multiple id="">  {#  multiple的作用,作者多选  #}
                        {% for foo in author_queryset %}
                             {% if foo.pk in authors_list %} {# authors_list 是 edit_obj对象跳表拿到的循环作者结果 #}
                                <option value="{{ foo.pk }}" selected>{{ foo.name }}</option>
                             {% else %}
                                <option value="{{ foo.pk }}" >{{ foo.name }}</option>
                             {% endif %}
                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <input type="submit" class="btn btn-success btn-block">
                </div>
            </form>
        </div>
    </div>
{% endblock %}

4、删除图书

见views

5、效果

三、出版社功能页

1、展示出版社列表

{% extends 'home.html' %}


{% block content %}
    <h1 class="text-center">出版社列表展示</h1>
    <a href="/publish_add/" class="btn btn-info">添加出版社</a>
    <table class="table  table-striped table-hover">
        <thead>
        <tr>
            <th>出版社</th>
            <th>地址</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for pub in publish_queryset %}
            <tr>
                <td>{{ pub.name }}</td>
                <td>{{ pub.addr }}</td>
                <td>
                    <a href="/publish_edit/?id={{ pub.pk }}" class="btn btn-success">修改</a>
                    <a href="/publish_del/?id={{ pub.pk }}"  class="btn btn-danger">删除</a>
                </td>
            </tr>

        {% endfor %}
        </tbody>
    </table>
{% endblock %}

2、添加出版社

{% extends 'home.html' %}


{% block content %}
    <h1 class="text-center">新增出版社</h1>
    <div class="container">
        <div class="row">
            <form action="" method="post">
                {% csrf_token %}
                <div class="form-group">
                    出版社名称:<input type="text" class="form-control" name="name">
                </div>
                <div class="form-group">
                    出版社地址:<input type="text" class="form-control" name="addr">
                </div>
                <div class="form-group">
                    <input type="submit" class="btn btn-success btn-block">
                </div>
            </form>
        </div>
    </div>
{% endblock %}

3、修改出版社

{% extends 'home.html' %}


{% block content %}
    <h1 class="text-center">修改出版社</h1>
    <div class="container">
        <div class="row">
            <form action="" method="post">
                <div class="form-group">
                    <input type="hidden" value="{{ edit_obj.pk }}" name="hidden_id">
                    <div class="form-group">
                    出版社:<input type="text" class="form-control" name="name" value="{{ publish_obj.name }}">
                    </div>
                </div>
                <div class="form-group">
                    出版社地址:<input type="text" class="form-control" name="addr" value="{{ publish_obj.addr }}">
                </div>
                <div class="form-group">
                    <input type="submit" class="btn btn-success btn-block">
                </div>
            </form>
        </div>
    </div>
{% endblock %}

4、删除出版社

见view

四、作者功能页

1、展示作者列表

{% extends 'home.html' %}

{% block content %}
    <h1 class="text-center">作者列表展示</h1>
    <a href="/authors_add/" class="btn btn-info">添加作者</a>
    <table class="table  table-striped table-hover">
        <thead>
        <tr>
            <th>作者名</th>
            <th>年龄</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for aut in authors_queryset %}
            <tr>
                <td>{{ aut.name }}</td>
                <td>{{ aut.age }}</td>
                <td>
                    <a href="/authors_edit/?id={{ aut.pk }}" class="btn btn-success">修改</a>
                    <a href="/authors_del/?id={{ aut.pk }}"  class="btn btn-danger">删除</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
{% endblock %}

2、添加作者

{% extends 'home.html' %}


{% block content %}
    <h1 class="text-center">新增作者</h1>
    <div class="container">
        <div class="row">
            <form action="" method="post">
                {% csrf_token %}
                <div class="form-group">
                    作者名:<input type="text" class="form-control" name="name">
                </div>
                <div class="form-group">
                    作者年龄:<input type="text" class="form-control" name="age">
                </div>
                <div class="form-group">
                    联系方式:<input type="text" class="form-control" name="phone">
                </div>
                <div class="form-group">
                    地址:<input type="text" class="form-control" name="addr">
                </div>
                <div class="form-group">
                    <input type="submit" class="btn btn-success btn-block">
                </div>
            </form>
        </div>
    </div>
{% endblock %}

3、修改作者

{% extends 'home.html' %}


{% block content %}
    <h1 class="text-center">修改作者</h1>
    <div class="container">
        <div class="row">
            <form action="" method="post">
                <div class="form-group">
                    <input type="hidden" value="{{ edit_obj.pk }}" name="hidden_id">
                    <div class="form-group">
                    作者名:<input type="text" class="form-control" name="name" value="{{ author_obj.name }}">
                    </div>
                </div>
                <div class="form-group">
                    年龄:<input type="text" class="form-control" name="age" value="{{ author_obj.age }}">
                </div>
                <div class="form-group">
                    <input type="submit" class="btn btn-success btn-block">
                </div>
            </form>
        </div>
    </div>
{% endblock %}

4、删除作者

见view