草庐IT

[django项目实战1]图书管理系统

三金C_C 2023-04-15 原文

在上周经过了Django的学习后,(没看到可以点击此处)深入理解一个框架的意义就是直接使用其来进行开发。这里以简单的图书管理系统为例。其中,前端使用的是比较流行的Bootstrap4框架,数据库由于便捷性使用的是云服务的数据库,比较好移植运行
本次从前端到后端业务逻辑部分,可谓是web开发的全部工作了。掌握这篇相信你对web开发有足够的认识了。同时几小时就可以建造自己的网站了!
关于代码部分可以私信博主获得,或者你可以咸鱼上搜我的用户名 MTK3 ,宝贝里面有django图书管理系统哦~欢迎大家前来学习!,由于篇幅原因就不再贴前端代码了。增删改查部分都基本一致,主要也是巩固ORM模型代码书写,做到熟练。当然,编写与运行中仍然会遇到种种问题,相信大家可以通过搜索问题,或者评论留言争取把这个简易的管理搞懂吧!

本地环境 python 3.7.9. Pycharm 2022 Django 3.2 Mysql 5.7 Bootstrap4

关于项目部署将单独做一期,另外项目源码可私信博主获取。

目录

概要分析与数据库设计

本次图书管理系统,分为三个管理系统端,分别是出版社信息,作者信息,图书信息管理。同时有登录和注册界面。
数据库实体设计:
出版社(出版社编号,出版社地址,出版社名称)
图书(序号,图书名称,图书编号,译者,出版日期,出版社)
译者(序号,姓名,性别,年龄,联系方式)
作者(序号,用户名,密码,邮箱,手机)

效果图

这是本次项目的全部文件概览。可以看到结构是比较清晰的,app01就是app部分(视图),bms就是配置部分(路由),static使用的是前端框架bootstrap4,templates是前端页面。运行入口是manage.py。在test.py部分是测试部分或者是一些脚本工作区。

部分运行截图

创建django项目与数据库连接

新建空项目,并在终端输入

django-admin startproject bms

在数据库中创建数据库library

CREATE DATABASE IF NOT EXISTS library DEFAULT CHARSET utf8;

在settings.py配置数据库相关设置

# 默认初始:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
需要修改:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
        'NAME': 'library',  # 数据库名称
        'HOST': '**********', # 服务器地址,如果是本地可以写127.0.0.1
        'PORT': 3306,
        'USER':'root',
        'PASSWORD':'P@ssw0rd', 
    }
}

templates={
'DIRS': [os.path.join(BASE_DIR, 'templates')],
}

在/bms/init.py文件下:

import pymysql

pymysql.install_as_MySQLdb()

以上初始化工作已经完成

Django模型定义

模型使用自带的ORM,在业务层与数据库层充当了桥梁的作用。ORM将python代码转换成sql语句,sql语句通过pymysql传到服务器数据库中,数据库执行SQL语句。
django规定,如果要使用模型,必须要创建一个app,使用以下命令创建app01的app

python3 manage.py startapp app01

目前现在的文件夹工区:

同时在/bms/settings.py中installed_apps添加app01

现在定义模型了。
之前已经创建一个library数据库了,现在用python来进行sql语句创建。
注意django对模型和目标数据库有映射关系,如果在自己的数据库建表会存在不一定符合django规则,从而导致模型与目标数据库无法连接。下面在app01/models.py创建关于表的内容

建表命令:
CREATE DATABASE IF NOT EXISTS library DEFAULT CHARSET utf8;
from django.db import models

# Create your models here.

# 出版社类
class Publisher(models.Model):
    id = models.AutoField('序号',primary_key=True)
    name = models.CharField('名称',max_length=64)
    addr = models.CharField('地址',max_length=64)


# 书籍类
class Book(models.Model):
    id = models.AutoField('序号',primary_key=True)
    name = models.CharField('名称',max_length=64,null=True)
    ISBN = models.CharField('编号',max_length=64)
    translator = models.CharField('译者',max_length=64)
    translator = models.CharField('译者', max_length=64)
    date = models.DateField('出版日期', max_length=64, blank=True)
    publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)

# 作者的类
class Author(models.Model):
    id = models.AutoField('序号', primary_key=True)
    name = models.CharField('姓名', max_length=64)
    sex = models.CharField('性别', max_length=4)
    age = models.IntegerField('年龄', default=0)
    # Django 中创建外键联表操作
    tel = models.CharField('联系方式', max_length=64)
    # 一个作者可以对应多本书,一本书也可以有多个作者,多对多,在数据库中创建第三张表
    book = models.ManyToManyField(to=Book)
    # 用户的类

class LmsUser(models.Model):
    id = models.AutoField('序号', primary_key=True)
    username = models.CharField('用户名', max_length=32)
    password = models.CharField('密码', max_length=32)
    email = models.EmailField('邮箱')
    mobile = models.IntegerField('手机', max_length=11)

下面使用命令使得命令创建表的内容:

//如果在app01/migrations 有除了__init__.py以外的文件,那么先删掉然后使用命令
python manage.py flush

python manage.py migrate

看到如下界面表示运行成功了,如果没有成功,请关注pymysql,mysql-connector模块安装,当然注意init.py文件下的操作(见上)

终端输入:

python manage.py makemigrations app01
python manage.py migrate app01


在pycharm专业版中的数据库下面,可以看到library已经创建了如下表。

功能模块实现

前端框架选用Bootstrap4,它是基于Html css javascript,使得web开发快捷。
在项目根目录下新建一个static,用于存放前端模版静态资源,同时将前端资源导入。同时新建templates,用于存放前
这是目前的前端框架文件。
打开/bms/settings.py 修改django识别静态资源和模版网页地址,找到templates配置修改为用于识别模版网页网址。

'DIRS': [os.path.join(BASE_DIR,'templates')], # 只要添加dirs这一项就可以了。

在static_url下面添加:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'), # 添加此项
]

创建出版社视图

在app01/views.py创建出版社视图

from django.shortcuts import render
import models

# Create your views here.

# 出版社展示列表
def publisher_list(request):
    publisher = models.Publisher.objects.all()
    return render(request,'pub_list.html',{'pub_list':publisher})

在urls.py配置路由信息

from django.contrib import admin
from django.urls import path
from django.conf.urls import url

from ..app01 import  views


urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'^pub_list/',views.publisher_list)
]

在templates/pub_list.html中写入前端代码:

(前端代码就不放这里了)

出版社新增

/app01/views.py
新增出版社视图

# 添加出版社
def add_publisher(request):
    if request.method == 'POST':
        new_publisher_name = request.POST.get('name')
        new_publisher_addr = request.POST.get('addr')
        models.Publisher.objects.create(name=new_publisher_name,addr=new_publisher_addr)
        return redirect('/pub_list/')
    return render(request,'pub_add.html')

修改urls.py映射关系

url(r'^add_pub/',views.add_publisher)

在/templates/pub_add.html新增前端代码:
前端代码就不给了,比较多。

出版社修改

创建修改出版社视图函数
views.py

def edit_publisher(request):
    if request.method == 'POST':
        edit_id = request.GET.get('id')
        edit_obj = models.Publisher.objects.get(id=edit_id)
        new_name = request.POST.get('edit_name')
        new_addr = request.POST.get('edit_addr')
        edit_obj.name=new_name
        edit_obj.addr=new_addr
        edit_obj.save()
        return  redirect('/pub_list/')

    edit_id = request.GET.get('id')
    edit_obj = models.Publisher.objects.get(id=edit_id)
    return  render(request,'pub_edit.html',{'publisher':edit_obj})

urls.py

url(r'^edit_pub/',views.edit_publisher),

templates/pub_edit.html

删除出版社

views.py

#删除出版社
def drop_publisher(request):
    drop_id = request.GET.get('id')
    drop_obj = models.Publisher.objects.get(id=drop_id)
    drop_obj.delete()
    return redirect('/pub_list/')

urls.py

url(r'^drop_pub/', views.drop_publisher),

增删改查(作者视图函数)

views.py

# 添加作者
def add_author(request):
    if request.method == 'POST':
        new_author_name = request.POST.get('name')
        new_author_sex = request.POST.get('sex')
        new_author_age = request.POST.get('age')
        new_author_tel = request.POST.get('tel')
        models.Author.objects.create(name=new_author_name, sex=new_author_sex, age=new_author_age, tel=new_author_tel)
        return redirect('/author_list/')
    return render(request, 'author_add.html')


# 删除作者
def drop_author(request):
    drop_id = request.GET.get('id')
    drop_obj = models.Author.objects.get(id=drop_id)
    drop_obj.delete()
    return redirect('/author_list/')


# 修改作者
def edit_author(request):
    if request.method == 'POST':
        edit_id = request.GET.get('id')
        edit_obj = models.Author.objects.get(id=edit_id)
        new_author_name = request.POST.get('edit_name')
        new_author_sex = request.POST.get('edit_sex')
        new_author_age = request.POST.get('edit_age')
        new_author_tel = request.POST.get('edit_tel')
        new_book_id = request.POST.getlist('book_id')
        edit_obj.name = new_author_name
        edit_obj.sex = new_author_sex
        edit_obj.age = new_author_age
        edit_obj.tel= new_author_tel
        edit_obj.book.set(new_book_id)
        edit_obj.save()
        return redirect('/author_list/')
    edit_id = request.GET.get('id')
    edit_obj = models.Author.objects.get(id=edit_id)
    all_book = models.Book.objects.all()
    return render(request, 'auth_edit.html', {
        'author': edit_obj,
        'book_list': all_book
    })

urls.py

	url(r'^author_list/', views.author_list),     # 作者列表
    url(r'^add_author/', views.add_author),    # 新增作者
    url(r'^drop_author/', views.drop_author),    # 删除作者
    url(r'^edit_author/', views.edit_author),    # 编辑作者

增删改查(图书信息)

views.py

# 书籍列表
def book_list(request):
    book = models.Book.objects.all()
    return render(request, 'book_list.html', {'book_list': book})


# 添加书籍
def add_book(request):
    if request.method == 'POST':
        new_book_name = request.POST.get('name')
        new_book_ISBN = request.POST.get('ISBN')
        new_book_translator = request.POST.get('translator')
        new_book_date = request.POST.get('date')
        publisher_id = request.POST.get('publisher_id')
        models.Book.objects.create(name=new_book_name, publisher_id=publisher_id, ISBN=new_book_ISBN,
                                   translator=new_book_translator, date=new_book_date)
        return redirect('/book_list/')
    res = models.Publisher.objects.all()
    return render(request, 'book_add.html', {'publisher_list': res})


# 删除书籍
def drop_book(request):
    drop_id = request.GET.get('id')
    drop_obj = models.Book.objects.get(id=drop_id)
    drop_obj.delete()
    return redirect('/book_list/')
# 编辑书籍
def edit_book(request):
    if request.method == 'POST':
        new_book_name = request.POST.get('name')
        new_book_ISBN = request.POST.get('ISBN')
        new_book_translator = request.POST.get('translator')
        new_book_date = request.POST.get('date')
        new_publisher_id = request.POST.get('publisher_id')
        edit_id = request.GET.get('id')
        edit_obj = models.Book.objects.get(id=edit_id)
        edit_obj.name = new_book_name
        edit_obj.ISBN = new_book_ISBN
        edit_obj.translator = new_book_translator
        edit_obj.date = new_book_date
        edit_obj.publisher_id = new_publisher_id
        edit_obj.save()
        return redirect('/book_list/')
    edit_id = request.GET.get('id')
    edit_obj = models.Book.objects.get(id=edit_id)
    all_publisher = models.Publisher.objects.all()
    return render(request, 'book_edit.html', {'book': edit_obj, 'publisher_list': all_publisher})

urls.py

	url(r'^book_list/', views.book_list),     # 图书列表
    url(r'^add_book/', views.add_book),     # 新增图书
    url(r'^drop_book/', views.drop_book),     # 删除图书
    url(r'^edit_book/', views.edit_book),     # 编辑图书

注册登录功能实现

密码使用的是md5加密, 这里是密码没有进行明文保存的,一般来说,目前都是使用这种的密码保护。
views.py

# 密码加密 md5加密
def setPassword(password):
    md5 = hashlib.md5()
    md5.update(password.encode())
    password = md5.hexdigest()
    return str(password)

# 登录
def login(request):
    if request.method == 'POST' and request.POST:
        email = request.POST.get("email")
        password = request.POST.get("password")
        e = LmsUser.objects.filter(email=email).first()
        if e:
            now_password = setPassword(password)
            db_password = e.password
            if now_password == db_password:
                reponse = HttpResponseRedirect('/pub_list/')
                reponse.set_cookie("username",e.username)
                return reponse
    return render(request,"login.html")


# 注册
def register(request):
    if request.method == "POST" and request.POST:
        data = request.POST
        username = data.get("username")
        email = data.get("email")
        password= data.get("password")
        mobile = data.get("mobile")
        LmsUser.objects.create(
            username = username,
            email = email,
            password = setPassword(password),
            mobile = mobile,
        )
        return  HttpResponseRedirect('/login/')
    return render(request,"register.html")

urls.py

	url(r'^login/', views.login),     # 登录动作
    url(r'^signup/', views.register),     # 注册页面
    url(r'^register/', views.register),     # 注册

以上基于django的图书管理系统的业务部分已经全部完成了,关于前端代码有需要的私信联系。
希望有所收获哦!

有关[django项目实战1]图书管理系统的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  6. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  7. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  8. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

随机推荐