项目前台和后台界面模板都是自己编写,前台采用Bootstrap框架UI,后台EasyUI框架UI,没有采用Django自动生成的那个后台管理,因为那个后台实在是太丑了,丑得惨不忍睹!整个项目主要负责图书信息的添加,修改,多个条件组合查询,删除。虽然系统功能不是很复杂,不过这是一个很好的学习案例,包括了常用字段的设计,比如字符串,浮点型,整型,日期型,图片型,富文本字符串型,文件型和下拉框外键关联型,囊括了所有商业项目设计需要的字段类型,通杀所有商业系统设计原理!当然也是学习的不二选择,好东西值得分享,强烈推荐.后台登录用户名密码均为a。
系统实体对象:
图书类型:图书类别,类别名称,可借阅天数
图书:图书条形码,图书名称,图书所在类别,图书价格,库存,出版日期,出版社,图书图片,图书简介,图书文件。
程序运行截图


核心代码

"""
Django settings for PythonProject project.Generated by 'django-admin startproject' using Django 2.2.5.For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""import os
import sys# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'fav!(r-3=i+bya!meg=vw*zcn-$4g3vhav!!)mw=f!b)7+7it2'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','apps.Index', #首页模块'apps.BookType', #图书分类模块'apps.Book', #图书信息模块'tinymce', #富文本编辑器
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]ROOT_URLCONF = 'PythonProject.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'PythonProject.wsgi.application'# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'db_book','USER': 'root','PASSWORD': 'sxing86','HOST': '127.0.0.1','PORT': 3306,}
}# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/STATIC_URL = '/static/'
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ]MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace("\\", "/")
MEDIA_URL = '/media/'# 配置session存储
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"#富文本编辑器配置
TINYMCE_DEFAULT_CONFIG = {'theme': 'simple','width': '100%','height': '300px',
}

BookType/views.py

from django.views.generic import View
from django.shortcuts import render
from apps.BookType.models import BookType
from django.core.paginator import Paginator
from django.http import JsonResponseclass FrontAddView(View):def get(self,request):passdef post(self,request):passclass ListAllView(View):def get(self,request):bookTypes = BookType.objects.all()bookTypeList = []for bookType in bookTypes:bookTypeObj = {'bookTypeId': bookType.bookTypeId,'bookTypeName': bookType.bookTypeName,}bookTypeList.append(bookTypeObj)return JsonResponse(bookTypeList,safe=False)class FrontListView(View):def get(self,request):pageSize = 5currentPage = request.GET.get("currentPage")bookTypes = BookType.objects.all()paginator = Paginator(bookTypes, pageSize)totalPage = paginator.num_pagesrecordNumber = paginator.count# 获取第page页的内容try:currentPage = int(currentPage)except Exception as e:currentPage = 1if currentPage > totalPage:currentPage = totalPage# 获取第page页的Page实例对象bookTypes_page = paginator.page(currentPage)startIndex = (currentPage - 1) * pageSize #计算起始序号startPage = currentPage - 5endPage = currentPage + 5if startPage < 1:startPage=1if endPage > totalPage:endPage = totalPage;pageList = list(range(startPage,endPage+1))context = {'bookTypes_page': bookTypes_page,'currentPage': currentPage,'totalPage': totalPage,'recordNumber': recordNumber,'startIndex': startIndex,'pageList': pageList,}print(pageList)# 使用模板return render(request, 'BookType/bookType_frontquery_result.html', context)def post(self,request):pass

Book/views.py

from django.views.generic import View
from apps.BaseView import BaseView
from django.shortcuts import render
from django.core.paginator import Paginator
from apps.Book.models import Book
from apps.BookType.models import BookType
from django.http import JsonResponse
from django.http import FileResponse
from apps.BaseView import ImageFormatException
from django.conf import settings
import pandas as pd
import osclass FrontAddView(BaseView):  # 前台图书添加def primaryKeyExist(self, barcode):  # 判断主键是否存在try:Book.objects.get(barcode=barcode)return Trueexcept Book.DoesNotExist:return Falsedef get(self,request):bookTypes = BookType.objects.all()  # 获取所有图书类型context = {'bookTypes': bookTypes,}# 使用模板return render(request, 'Book/book_frontAdd.html', context)def post(self,request):barcode = request.POST.get('book.barcode') # 判断图书条形码是否存在if self.primaryKeyExist(barcode):return JsonResponse({'success': False, 'message': '图书条形码已经存在'})book = Book() # 新建一个图书对象然后获取参数book.barcode = barcodebook.bookName = request.POST.get('book.bookName')book.bookTypeObj = BookType.objects.get(bookTypeId=int(request.POST.get('book.bookTypeObj.bookTypeId')))book.price = float(request.POST.get('book.price'))book.count = int(request.POST.get('book.count'))book.publishDate = request.POST.get('book.publishDate')book.publish = request.POST.get('book.publish')try:book.bookPhoto = self.uploadImageFile(request,'book.bookPhoto')except ImageFormatException as ife:return JsonResponse({'success': False, 'message': ife.error})book.bookDesc = request.POST.get('book.bookDesc')book.bookFile = self.uploadCommonFile(request,'book.bookFile')book.save() # 保存图书信息到数据库return JsonResponse({'success': True, 'message': '保存成功'})class FrontModifyView(BaseView):  # 前台修改图书def get(self, request, barcode):context = {"barcode": barcode}return render(request, 'Book/book_frontModify.html', context)class FrontListView(BaseView):  # 前台图书查询列表def get(self, request):return self.handle(request)def post(self, request):return self.handle(request)def handle(self,request):self.getCurrentPage(request)  # 获取当前要显示第几页# 下面获取查询参数barcode = self.getStrParam(request, 'barcode')bookName = self.getStrParam(request, 'bookName')publishDate = self.getStrParam(request, 'publishDate')bookTypeObj_bookTypeId = self.getIntParam(request, 'bookTypeObj.bookTypeId')# 然后条件组合查询过滤book = Book.objects.all()if barcode != '':book = book.filter(barcode__contains=barcode)if bookName != '':book = book.filter(bookName__contains=bookName)if publishDate != '':book = book.filter(publishDate__contains=publishDate)if bookTypeObj_bookTypeId != '0':book = book.filter(bookTypeObj=bookTypeObj_bookTypeId)# 对查询结果利用Paginator进行分页self.paginator = Paginator(book, self.pageSize)# 计算总的页码数,要显示的页码列表,总记录等self.calculatePages()# 获取第page页的Page实例对象books_page = self.paginator.page(self.currentPage)# 获取所有图书类型bookTypes = BookType.objects.all()# 构造模板需要的参数context = {'bookTypes': bookTypes,'books_page': books_page,'barcode': barcode,'bookName': bookName,'publishDate': publishDate,'bookTypeObj_bookTypeId': int(bookTypeObj_bookTypeId),'currentPage': self.currentPage,'totalPage': self.totalPage,'recordNumber': self.recordNumber,'startIndex': self.startIndex,'pageList': self.pageList,}# 渲染模板界面return render(request, 'Book/book_frontquery_result.html', context)class FrontShowView(View):  # 前台显示图片详情页def get(self, request, barcode):bookTypes = BookType.objects.all()# 查询需要显示的图书对象book = Book.objects.get(barcode=barcode)context = {'bookTypes': bookTypes,'book': book}# 渲染模板显示return render(request, 'Book/book_frontshow.html', context)class UpdateView(BaseView):  # Ajax方式图书更新def get(self, request, barcode):# GET方式请求查询图书对象并返回图书json格式book = Book.objects.get(barcode=barcode)return JsonResponse(book.getJsonObj())def post(self, request, barcode):# POST方式提交图书修改信息更新到数据库book = Book.objects.get(barcode=barcode)book.bookName = request.POST.get('book.bookName')book.bookTypeObj = BookType.objects.get(bookTypeId=int(request.POST.get('book.bookTypeObj.bookTypeId')))book.price = float(request.POST.get('book.price'))book.count = int(request.POST.get('book.count'))book.publishDate = request.POST.get('book.publishDate')book.publish = request.POST.get('book.publish')try:bookPhotoName = self.uploadImageFile(request, 'book.bookPhoto')except ImageFormatException as ife:return JsonResponse({'success': False, 'message': ife.error})if bookPhotoName != 'img/NoImage.jpg':book.bookPhoto = bookPhotoNamebook.bookDesc = request.POST.get('book.bookDesc')bookFileName = self.uploadCommonFile(request, 'book.bookFile')if bookFileName != 'file/NoFile.jpg':book.bookFile = bookFileNamebook.save()return JsonResponse({'success': True, 'message': '保存成功'})class AddView(BaseView):  # 后台添加图书def primaryKeyExist(self, barcode):  # 判断主键是否存在try:Book.objects.get(barcode=barcode)return Trueexcept Book.DoesNotExist:return Falsedef get(self, request):# 获取所有图书类型bookTypes = BookType.objects.all()context = {'bookTypes': bookTypes,}# 渲染显示模板界面return render(request, 'Book/book_add.html', context)def post(self, request):# POST方式处理图书添加业务barcode = request.POST.get('book.barcode')if self.primaryKeyExist(barcode):return JsonResponse({'success': False, 'message': '图书条形码已经存在'})# 新建一个图书对象然后收集图书参数book = Book()book.barcode = barcodebook.bookName = request.POST.get('book.bookName')book.bookTypeObj = BookType.objects.get(bookTypeId=int(request.POST.get('book.bookTypeObj.bookTypeId')))book.price = float(request.POST.get('book.price'))book.count = int(request.POST.get('book.count'))book.publishDate = request.POST.get('book.publishDate')book.publish = request.POST.get('book.publish')try:book.bookPhoto = self.uploadImageFile(request, 'book.bookPhoto')except ImageFormatException as ife:return JsonResponse({'success': False, 'message': ife.error})book.bookDesc = request.POST.get('book.bookDesc')book.bookFile = self.uploadCommonFile(request, 'book.bookFile')book.save()  # 这里提交更新到数据库return JsonResponse({'success': True, 'message': '保存成功'})class BackModifyView(BaseView):  # 后台更新图书def get(self, request, barcode):context = {"barcode": barcode}return render(request, 'Book/book_modify.html', context)class ListView(BaseView):  # 后台图书列表def get(self, request):# 使用模板return render(request, 'Book/book_query_result.html')def post(self,request):# 获取当前要显示第几页和每页几条数据self.getPageAndSize(request)# 收集查询参数barcode = self.getStrParam(request, 'barcode')bookName = self.getStrParam(request, 'bookName')publishDate = self.getStrParam(request, 'publishDate')bookTypeObj_bookTypeId = self.getIntParam(request, 'bookTypeObj.bookTypeId')# 然后条件组合查询过滤books = Book.objects.all()if barcode != '':books = books.filter(barcode__contains=barcode)if bookName != '':books = books.filter(bookName__contains=bookName)if publishDate != '':books = books.filter(publishDate__contains=publishDate)if bookTypeObj_bookTypeId != '0':books = books.filter(bookTypeObj=bookTypeObj_bookTypeId)# 利用Paginator对查询结果集分页self.paginator = Paginator(books, self.pageSize)# 计算总的页码数,要显示的页码列表,总记录等self.calculatePages()# 获取第page页的Page实例对象books_page = self.paginator.page(self.currentPage)# 查询的结果集转换为列表bookList = []for book in books_page:book = book.getJsonObj()bookList.append(book)# 构造模板页面需要的参数book_res = {'rows': bookList,'total': self.recordNumber,}# 渲染模板页面显示return JsonResponse(book_res, json_dumps_params={'ensure_ascii':False})class DeletesView(BaseView):  # 删除图书信息def get(self, request):return self.handle(request)def post(self, request):return self.handle(request)def handle(self, request):barcodes = self.getStrParam(request, 'barcodes')barcodes = barcodes.split(',')count = 0try:for barcode in barcodes:Book.objects.get(barcode=barcode).delete()count = count + 1message = '%s条记录删除成功!' % countsuccess = Trueexcept Exception as e:message = '数据库删除发生错误!'success = Falsereturn JsonResponse({"success": success, "message": message})class OutToExcelView(BaseView):  # 导出图书信息到excel并下载def get(self,request):# 收集查询参数barcode = self.getStrParam(request, 'barcode')bookName = self.getStrParam(request, 'bookName')publishDate = self.getStrParam(request, 'publishDate')bookTypeObj_bookTypeId = self.getIntParam(request, 'bookTypeObj.bookTypeId')# 然后条件组合查询过滤books = Book.objects.all()if barcode != '':books = books.filter(barcode__contains=barcode)if bookName != '':books = books.filter(bookName__contains=bookName)if publishDate != '':books = books.filter(publishDate__contains=publishDate)if bookTypeObj_bookTypeId != '0':books = books.filter(bookTypeObj=bookTypeObj_bookTypeId)#将查询结果集转换成列表bookList = []for book in books:book = book.getJsonObj()bookList.append(book)# 利用pandas实现数据的导出功能pf = pd.DataFrame(bookList)# 设置要导入到excel的列columns_map = {'barcode': '图书条形码','bookName': '图书名称','bookTypeObj': '图书类别','price': '图书价格','count': '图书数量','publishDate': '出版日期','publish': '出版社',}pf = pf[columns_map.keys()]pf.rename(columns=columns_map, inplace=True)# 将空的单元格替换为空字符pf.fillna('', inplace=True)#设定文件名和导出路径filename = 'books.xlsx'# 这个路径可以在settings中设置也可以直接手动输入root_path = settings.MEDIA_ROOT + '/output/'file_path = os.path.join(root_path, filename)pf.to_excel(file_path, encoding='utf-8', index=False)# 将生成的excel文件输出到网页下载file = open(file_path, 'rb')response = FileResponse(file)response['Content-Type'] = 'application/octet-stream'response['Content-Disposition'] = 'attachment;filename="books.xlsx"'return response

完整程序代码下载:Python基于mysql+Django框架图书管理系统源代码(含mysql文件)
更多Python源代码请关注公众号:Python代码大全。

Python基于mysql+Django框架图书管理系统源代码(含mysql文件)相关推荐

  1. python中型项目---Django框架---图书管理网站的制作-01

    图书管理网站的制作详解(个人学习django框架的笔记) 第01号笔记最终成果图: 当前笔记所完成的网站的功能简介: 1 网页从数据库获得图书名称 2 点击新增按钮后增加一本书,当前名为"流 ...

  2. Python框架:Django写图书管理系统(LMS)

    今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始 Django文件配置 Django模版 ...

  3. 【毕业设计】 基于Django的图书管理系统

    文章目录 1 前言 2 背景意义 3 功能需求 4 技术栈 5 实现效果 6 项目架构 7 数据库表设计 7.1 出版社信息表 7.2 图书信息表 7.3 作者信息表 7.4 用户信息表 8 部分代码 ...

  4. 系统业务逻辑书籍_Python框架:Django写图书管理系统(LMS)

    今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始 Django文件配置 Django模版 ...

  5. 基于SSM框架图书管理系统开发与设计(附源码资料)-毕业设计

    文章目录 1. 适用人群 2. 你将收获 3.项目简介 4.技术实现 5.系统功能 5.1.管理员身份登录 5.1.1.登录 5.1.2.管理员登录首页 5.1.3.借阅管理 5.1.4.图书管理 5 ...

  6. ssm毕设项目基于用户激励的图书管理系统fx8il(java+VUE+Mybatis+Maven+Mysql+sprnig)

    ssm毕设项目基于用户激励的图书管理系统fx8il(java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql ...

  7. hive导数据到mysql 自增主键出错_python+mysql做一个图书管理系统?

    开发一个图书管理系统,首先需要对此项目进行一个简单的需求分析: 主要功能包括: 图书信息 图书分类 用户信息 用户借阅统计 管理员 管理员权限 接下来可以进行数据库的设计,在这里我提供一个简单的数据库 ...

  8. java用spring图书管理系统_基于Java + SpringMVC的图书管理系统

    需求分析 基于Java+SpringMVC的图书管理系统, 实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能 本站提供了其他类型的 图书管理系统源代码 ...

  9. java计算机毕业设计基于ssm的少儿编程管理系统(源代码+数据库+Lw文档)

    项目介绍 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革.多样性.质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化.依照这一现实为基础,设计一个快捷而又方便的网上少儿编程教育网 ...

最新文章

  1. 并发编程-09安全发布对象+单例模式详解
  2. 快排堆排归排三种排序的比较
  3. JS中基本数据类型和引用类型最根本的区别
  4. Map 3D中程序设置地图中心点
  5. 数据库2.1.1mysql的特点
  6. 【BZOJ3172】单词,AC自动机练习
  7. 1788:Pell数列
  8. UEA1224——郭恩赐 day06 作业
  9. 命令行下对apk签名
  10. Google map API:查询地理位置和经纬度信息示例
  11. 受激发射损耗显微术(一)
  12. 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集
  13. allure-report详细使用教程
  14. 微信小程序分享生成海报(自带二维码)+头像+昵称
  15. 云服务器虚拟化搭建,虚拟化搭建云服务器
  16. Unsupervised Domain Adaption of Object Detectors : A Survey
  17. Mysql数据库-表的增、删、查、改
  18. PCIE学习笔记(二)PCIe总线的拓扑结构,协议层,数据传输流程
  19. 第12周项目2—摩托车继承自行车和机动车
  20. 论文:学习用于分子构象生成的梯度场

热门文章

  1. C++语言编写程序:输入电话号码,对电话号码的合法性进行检查,输出是否合法,不合法在屏幕上输出错误原因。电话号码合法要求:电话号码由三部分构成地区码:空白或三位数字前缀码:非“0“或”1”
  2. CLIPS专家系统基本编程手册(一)
  3. 思科 计算机网络 第10章测试考试 答案
  4. C语言:统计单词的长度
  5. 带有备忘录的递归算法
  6. 计算机教学在数学中的应用,探讨计算机在数学教学中的应用论文
  7. SpringCloud——Nacos下载
  8. 生产成本 - 异想天开
  9. c++完整实现地图寻路A星算法
  10. chatgpt赋能python:Python中的面积计算:平方米和亩