后台主页模块设计

发布时间 2023-06-28 20:36:18作者: 星空看海

一、创建home模块

前提:在 luffy 虚拟环境下

1.终端从项目根目录进入apps目录
>: cd luffyapi & cd apps

2.创建app
>: python ../../manage.py startapp home

注册home模块:dev.py

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'home',
]

二、Banner数据表model设计

  • 写一个基表BaseModel
  • 写轮播图表
  • 数据迁移

utils/common_models.py

### 基表:BaseModel##########
# 可以模仿这个类来写,django.contrib.auth.models.AbstractUser
from django.db import models

class BaseModel(models.Model):
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_time = models.DateTimeField(auto_now=True, verbose_name='最后更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')
    is_show = models.BooleanField(default=True, verbose_name='是否上架')
    orders = models.IntegerField(verbose_name='优先级')


    class Meta:
        abstract = True  # 这个表模型只用来继承,不用来在数据库中生成表

apps/home/models.py

########Banner########
from django.db import models
from utils.common_models import BaseModel


class Banner(BaseModel):
    # 分析字段:id  img图片地址        长传时间  是否删除 是否显示 order
    # 把公共字段抽取到某个基表中,以后要使用,直接继承基表,扩写自己的字段就可以了---> 用过的AbstractUser就是这个原理
    title = models.CharField(max_length=16, unique=True, verbose_name='名称')
    image = models.ImageField(upload_to='banner', verbose_name='图片')
    # 点击图片,调整到的路径
    # 前端跳转的地址: 可能是前端路由    或者是完整的http链接
    link = models.CharField(max_length=64, verbose_name='跳转链接')
    info = models.TextField(verbose_name='详情')  # 也可以用详情表,宽高出处

    class Meta:
        db_table = 'luffy_banner'
        verbose_name_plural = '轮播图表'  # 后台管理中显示中文表名

    def __str__(self):
        return self.title

数据迁移:在大luffyapi路径下的终端

>: python manage.py makemigrations
>: python manage.py migrate
    
    
# 执行第一条命令后,就会在应用下的migrations包中产生一条迁移记录,记录在py文件中,不会正式的创建表
# 执行第二条命令后,才会真正的创建表,然后在django_migrations中增加一条迁移记录。

三、simpleui后台管理

# 安装
pip install django-simpleui
# 在dev.py的应用中注册
INSTALLED_APPS = [
    'simpleui',
    ...
]

# 创建一个超级用户
python manage.py createsuperuser
Username: admin
Password: lqz12345

# 把自己创建的表Banner注册到后台
# home/admin.py
from django.contrib import admin
from .models import Banner
admin.site.register(Banner)

# 后台中应用名显示中文
# home/apps.py
class HomeConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'home'
    verbose_name = '首页功能'  # 增加这行后,后台中应用名就显示中文


# 录入数据

# 正常在公司中,网站分主站和后台管理
# 后台管理,主要是运营录入数据,使用simpleui

四、轮播图接口

4.1 封装自己的mixin

  • 使用自己封装好的返回格式函数
  • utils/common_mixin.py
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,  DestroyModelMixin
from utils.common_response import APIResponse


class CommonListModelMixin(ListModelMixin):
    def list(self, request, *args, **kwargs):
        res = super().list(request, *args, **kwargs)
        return APIResponse(data=res.data)


class CommonCreateModelMixin(CreateModelMixin):
    def create(self, request, *args, **kwargs):
        res = super().create(request, *args, **kwargs)
        return APIResponse(data=res.data)  # {code:100,msg:成功,data:{}}


class CommonRetrieveModelMixin(RetrieveModelMixin):
    def retrieve(self, request, *args, **kwargs):
        res = super(CommonRetrieveModelMixin, self).retrieve(request, *args, **kwargs)
        return APIResponse(data=res.data)


class CommonUpdateModelMixin(UpdateModelMixin):
    def update(self, request, *args, **kwargs):
        res = super(CommonUpdateModelMixin, self).update(request, *args, **kwargs)
        return APIResponse(data=res.data)


class CommonDestroyModelMixin(DestroyModelMixin):
    def destroy(self, request, *args, **kwargs):
        res = super().destroy(request, *args, **kwargs)
        return APIResponse(msg='删除成功')

4.2 轮播图接口

视图 home/views.py

# 查询所有 轮播图接口
from rest_framework.viewsets import GenericViewSet
from utils.common_mixin import CommonListModelMixin as ListModelMixin
from .models import Banner
from .serializer import BannerSerializer


class BannerView(GenericViewSet, ListModelMixin):
    # 展示被软删除的,和显示上架的,和根据orders排序
    queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')
    serializer_class = BannerSerializer

路由 urls.py

## 总路由
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/home/', include('home.urls')),
    # static 默认开启的,后期咱们会开启media文件夹,除此之外的其它文件夹,尽量不要开放,让外部访问
    path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}),

]

分路由 home/urls.py

from .views import BannerView
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('banner', BannerView, 'banner')
urlpatterns = [
    # path('admin/', admin.site.urls),
]
urlpatterns += router.urls

序列化类 home/serializers.py

from rest_framework import serializers
from . import models


class BannerSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Banner
        # 只返回给前端需要的字段名
        fields = ['id', 'image', 'title', 'link']

接口

http://localhost:8000/home/banners/

4.3 自定义配置文件

# 通过配置文件控制显示多少条轮播图
# 使用步骤
    1 在settings下新建:common_settings.py
    	BANNER_COUNT = 3

    2 在dev.py中加入
        # 导入轮播图设置
        from .common_settings import *

    3 在轮播图接口上,直接导入使用
    class BannerView(GenericViewSet, ListModelMixin):
        queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')[:settings.BANNER_COUNT]
        serializer_class = BannerSerializer