当前位置:   article > 正文

基于Python+Django+Vue+Mysql前后端分离的图书管理系统_djangovue前后端分离图书馆

djangovue前后端分离图书馆

利用空闲休息时间开始自己写了一套图书管理系统。现将源码开源,项目遇到问题

Python+Django+Vue图书管理系统开发全流程

大家好,我是程序员科科,这是我开源的基于Python+Django+Vue的图书管理系统

希望可以帮助想学前后端分离的同学

项目中遇到问题欢迎添加微信python_kk一起探讨

如果感觉项目还不错,请帮我点个star~

项目运行截图

首页

出版社

图书

作者

登录

怎么运行项目

前端

npm install

npm run dev

后端

使用虚拟环境

python manage.py runserver 127.0.0.1:8000

前端8080端口,后端8000端口

1、pycharm创建django项目(使用虚拟环境,避免项目干扰)

2、配置总路由

  1. from django.urls import path,re_path,include
  2. from django_vue_tushu.settings import MEDIA_ROOT
  3. from django.contrib import admin
  4. from dvtushu import views
  5. from django.views.static import serve
  6. from rest_framework.documentation import include_docs_urls
  7. urlpatterns = [
  8. # 接口文档
  9. path('docs/', include_docs_urls(title='tushu')),
  10. path('admin/', admin.site.urls),
  11. path('django_vue_tushu/', include('dvtushu.urls'),name='dvtushu'),
  12. # 图片上传接口
  13. re_path('img_upload/', views.img_uploadApiview.as_view()),
  14. # 前端查找图片地址
  15. re_path('upimg/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT})
  16. ]

3、配置子路由

  1. from django.urls import path,re_path
  2. from . import views
  3. urlpatterns = [
  4. # path('/', ),
  5. ]

3、启动项目

python manage.py runserver 127.0.0.1 或者 pycharm 启动

4、安装依赖(有默认前后端分离所需依赖)

pip install -r .\utils\requ.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

依赖放入 /utils/requirements.txt

  1. asgiref==3.7.2
  2. certifi==2024.2.2
  3. cffi==1.15.1
  4. charset-normalizer==3.3.2
  5. coreapi==2.3.3
  6. coreschema==0.0.4
  7. cryptography==42.0.2
  8. Django==3.2.23
  9. django-cors-headers==4.1.0
  10. django-filter==23.5
  11. django-rest-swagger==2.2.0
  12. djangorestframework==3.14.0
  13. djangorestframework-jwt==1.11.0
  14. drf-yasg==1.21.7
  15. idna==3.6
  16. inflection==0.5.1
  17. install==1.3.5
  18. itypes==1.2.0
  19. Jinja2==3.1.3
  20. MarkupSafe==2.1.5
  21. openapi-codec==1.3.2
  22. packaging==24.0
  23. pycparser==2.21
  24. PyJWT==1.7.1
  25. PyMySQL==1.1.0
  26. pytz==2023.4
  27. PyYAML==6.0.1
  28. requests==2.31.0
  29. simplejson==3.19.2
  30. sqlparse==0.4.4
  31. typing_extensions==4.7.1
  32. uritemplate==4.1.1
  33. urllib3==1.26.12

5、修改数据库

djvue_school_shop/settings.py

  1. DATABASES = {
  2. "default": {
  3. "ENGINE": "django.db.backends.mysql",
  4. "HOST": "127.0.0.1",
  5. "PORT": 3306,
  6. "USER": "root",
  7. "PASSWORD": "123456",
  8. "NAME": "dvlvyou",
  9. }
  10. }

djvue_school_shop/init.py

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

6、设置settings相关内容

(1):添加跨域和djangorestframework

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'djvue_schoolshop.apps.DjvueSchoolshopConfig',
  9. 'corsheaders',
  10. 'rest_framework',
  11. ]

(2):添加跨域中间件和注释csrf

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. # 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. 'corsheaders.middleware.CorsMiddleware',
  10. ]

(3):时间中国

  1. LANGUAGE_CODE = 'zh-Hans'
  2. TIME_ZONE = 'Asia/Shanghai'

(4):添加跨域请求头和请求地址相关

  1. # # # CORS组的配置信息
  2. # CORS_ORIGIN_WHITELIST = (
  3. # #'www.hippo.cn:8080', #如果这样写不行的话,就加上协议(http://www.hippo.cn:8080,因为不同的corsheaders版本可能有不同的要求)
  4. # 'http://127.0.0.1:8080',
  5. # )
  6. CORS_ORIGIN_ALLOW_ALL = True
  7. # 是否允许ajax跨域请求时携带cookie,False表示不用,我们后面也用不到cookie,所以关掉它就可以了,以防有人通过cookie来搞我们的网站
  8. CORS_ALLOW_CREDENTIALS = False
  9. # 请求方法
  10. CORS_ALLOW_METHODS = (
  11. 'DELETE',
  12. 'GET',
  13. 'OPTIONS',
  14. 'PATCH',
  15. 'POST',
  16. 'PUT',
  17. 'VIEW',
  18. )
  19. # 允许的请求头,不能用*,要写具体的请求头,不然Vue会跨域失败,在这里坑了我好久好久MD
  20. CORS_ALLOW_HEADERS = (
  21. '*'
  22. )

(5):添加djangorestframework全局处理类

  1. REST_FRAMEWORK = {
  2. # 异常处理
  3. # 'EXCEPTION_HANDLER': 'hippo_api.utils.exceptions.custom_exception_handler',
  4. # jwt
  5. 'DEFAULT_AUTHENTICATION_CLASSES': (
  6. # 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
  7. 'rest_framework.authentication.SessionAuthentication',
  8. 'rest_framework.authentication.BasicAuthentication',
  9. # 'dj_vue_jc.TokenAuthtication.TokenAuthtication',
  10. ),
  11. }

(6):添加媒体上传文件配置

  1. # 指定文件获取的url路径
  2. MEDIA_URL = "/upimg/"
  3. # 文件上传的保存路径
  4. MEDIA_ROOT = BASE_DIR / 'upimg'

7、创建媒体文件

upimg

8、urls中设置前端文件图片上传地址和访问地址

  1. from django.urls import path,re_path,include
  2. from django_vue_tushu.settings import MEDIA_ROOT
  3. from django.contrib import admin
  4. from dvtushu import views
  5. from django.views.static import serve
  6. from rest_framework.documentation import include_docs_urls
  7. urlpatterns = [
  8. # 接口文档
  9. path('docs/', include_docs_urls(title='tushu')),
  10. path('admin/', admin.site.urls),
  11. path('django_vue_tushu/', include('dvtushu.urls'),name='dvtushu'),
  12. # 图片上传接口
  13. re_path('img_upload/', views.img_uploadApiview.as_view()),
  14. # 前端查找图片地址
  15. re_path('upimg/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT})
  16. ]

9、views 设置 图片上传接口

  1. # 前台返回格式
  2. ret = {
  3. "data": {},
  4. "meta": {
  5. "status": 200,
  6. "message": "注册成功"
  7. }
  8. }
  9. # 图片上传接口
  10. class img_uploadApiview(View):
  11. def get(self, request):
  12. return JsonResponse(data={'code': 200, 'message': '方法测试'})
  13. # 图片上传接口通过 request.data 可以接收到前端发来的
  14. def post(self,request):
  15. response = {}
  16. dataduixiang = request.POST.get('data','')
  17. file = request.FILES.get('file')
  18. # try:
  19. # 构造图片保存路径 路径为<USER_AVATAR_ROOT + 文件名>
  20. # USER_AVATAR_ROOT刚刚在settings.py中规定过,需要导入进来
  21. file_path = os.path.join(settings.MEDIA_ROOT, file.name)
  22. # 保存图片
  23. print(dataduixiang,file)
  24. with open(file_path, 'wb+') as f:
  25. f.write(file.read())
  26. f.close()
  27. response['file'] = file.name # 返回新的文件名
  28. response['code'] = 0
  29. response['msg'] = "图片上传成功!"
  30. return JsonResponse(data={'code': 200, 'message': '上传成功', 'data': response})

10、启动项目

python manage.py runserver 127.0.0.1:8000

11、数据库设计

  1. from django.db import models
  2. # Create your models here.
  3. # 管理表
  4. class Guanli(models.Model):
  5. username = models.CharField(max_length=255)
  6. password = models.TextField()
  7. from django.db import models
  8. # Create your models here.
  9. class Book(models.Model):
  10. title = models.CharField(max_length=32, verbose_name="书籍名称")
  11. price = models.IntegerField(verbose_name="价格")
  12. # pub_date = models.DateField(verbose_name="出版日期")
  13. img_url = models.CharField(max_length=255, null=True,blank=True,verbose_name="")
  14. bread = models.IntegerField(verbose_name="阅读量")
  15. bcomment = models.IntegerField(verbose_name="评论量")
  16. publish = models.ForeignKey("Publish", on_delete=models.CASCADE, verbose_name="出版社")
  17. authors = models.ManyToManyField("Author",verbose_name="作者")
  18. def __str__(self):
  19. return self.title
  20. class Publish(models.Model):
  21. name = models.CharField(max_length=32, verbose_name="出版社名称")
  22. email = models.EmailField(verbose_name="出版社邮箱")
  23. def __str__(self):
  24. return self.name
  25. class Author(models.Model):
  26. name = models.CharField(max_length=32, verbose_name="作者")
  27. age = models.IntegerField(verbose_name="年龄")
  28. def __str__(self):
  29. return self.name

12、迁移

  1. python manage.py makemigrations
  2. python manage.py migrate

13、登录接口

url

  1. # 登录接口
  2. path('logintest/', views.LoginView.as_view()),

view

  1. from .TokenAuthtication import TokenAuthtication
  2. from rest_framework.response import Response
  3. from django.core.paginator import Paginator
  4. from rest_framework.views import APIView
  5. from django.views import View
  6. from django.http import HttpResponse,JsonResponse
  7. from django_vue_tushu import settings
  8. from .Serializer import *
  9. from .models import *
  10. import datetime
  11. import jwt
  12. import os
  13. class LoginView(APIView):
  14. def post(self, request):
  15. ret = {
  16. "data": {},
  17. "meta": {
  18. "status": 200,
  19. "message": ""
  20. }
  21. }
  22. try:
  23. username = request.data["username"]
  24. password = request.data["password"]
  25. value = int(request.data["value"])
  26. if value == 1:
  27. user = Guanli.objects.filter(username=username,password=password)
  28. print(username,password,value,user)
  29. if user.count == 0:
  30. ret["meta"]["status"] = 500
  31. ret["meta"]["message"] = "用户不存在或密码错误"
  32. return Response(ret)
  33. elif user and user.first().password:
  34. dict = {
  35. "exp": datetime.datetime.now() + datetime.timedelta(days=1), # 过期时间
  36. "iat": datetime.datetime.now(), # 开始时间
  37. "id": user.first().id,
  38. "username": user.first().username,
  39. }
  40. token = jwt.encode(dict, settings.SECRET_KEY, algorithm="HS256")
  41. ret["data"]["token"] = token
  42. ret["data"]["username"] = user.first().username
  43. ret["data"]["user_id"] = user.first().id
  44. # 这里需要根据数据库判断是不是管理员
  45. ret["data"]["isAdmin"] = 1
  46. ret["meta"]["status"] = 200
  47. ret["meta"]["message"] = "登录成功"
  48. print(ret,type(ret))
  49. return Response(ret)
  50. else:
  51. ret["meta"]["status"] = 500
  52. ret["meta"]["message"] = "用户不存在或密码错误"
  53. return Response(ret)
  54. except Exception as error:
  55. print(error)
  56. ret["meta"]["status"] = 500
  57. ret["meta"]["message"] = "用户不存在或密码错误"
  58. return Response(ret)

14、创建Serializer

djvue_schoolshop

  1. from rest_framework import serializers
  2. from rest_framework.serializers import ModelSerializer
  3. from . import models
  4. class GuanliModelSerializers(ModelSerializer):
  5. """管理员信息模型序列化器"""
  6. username = serializers.CharField(read_only=True)
  7. class Meta:
  8. model = models.Guanli
  9. fields = '__all__'
  10. class PublishSerializer(serializers.ModelSerializer):
  11. class Meta:
  12. model=models.Publish
  13. fields = "__all__"
  14. class AuthorSerializer(serializers.ModelSerializer):
  15. class Meta:
  16. model=models.Author
  17. fields = "__all__"
  18. class BookInfoModelSerializermodel(serializers.ModelSerializer):
  19. # 使用PublishSerializer作为publish字段的嵌套序列化器
  20. publish = PublishSerializer(read_only=True)
  21. # 使用主键字段类型 并且将publish_id设置为"只写",也就是读取的时候不会返回!
  22. publish_id = serializers.PrimaryKeyRelatedField(queryset=models.Publish.objects.all(), source='publish',
  23. write_only=True)
  24. # 使用AuthorSerializer作为author字段的嵌套序列化器
  25. authors = AuthorSerializer(read_only=True, many=True)
  26. # 使用主键字段类型 并且将author_id设置为"只写",也就是读取的时候不会返回!
  27. authors_id = serializers.PrimaryKeyRelatedField(queryset=models.Author.objects.all(), source='authors',
  28. write_only=True, many=True)
  29. class Meta:
  30. model = models.Book
  31. # fields = ['id', 'title', 'price', 'pub_date', 'bread', 'bcomment', 'publish_id', 'publish', 'authors',
  32. # 'authors_id']
  33. fields = "__all__"
  34. # depth = 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/879820
推荐阅读
相关标签
  

闽ICP备14008679号