【10.0】后台首页搭建和banner

发布时间 2023-08-19 17:19:31作者: Chimengmeng

【一】创建后台主页模块

python ../../manage.py startapp home

【二】创建模型表(轮播图)

  • luffyCity\luffyCity\utils\common_models.py
from django.db import models


class BaseModel(models.Model):
    '''
        公共字段创建基表 ---- 其他表也可能用
        id img图片地址 上传时间 是否删除 是否显示 显示排序
    '''
    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  # 这个表模型只用来继承,不用来在数据库中生成表
  • luffyCity\luffyCity\apps\home\models.py
from django.db import models

from luffyCity.utils.common_models import BaseModel


# Create your models here.
class Banner(BaseModel):
    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

【三】注册APP并执行数据库迁移

python ../../manage.py makemigrations
python ../../manage.py migrate

【四】simpleui后台管理

【1】录入数据:

  • 在后台管理中,录入数据是一项重要任务。
  • 通过使用simpleui,您可以在后台管理系统的界面上方便地进行数据录入操作。
  • 通常情况下,您需要登录到后台管理系统,并选择相应的数据录入模块。
  • 根据您的需求,选择合适的表单或页面,然后填写所需的数据信息。
  • 这些信息可能包括文本、数字、日期等各种类型的数据。
  • 填写完毕后,可以保存数据并进行进一步的处理或展示。

【2】主站和后台管理:

  • 在公司的网站中,通常会分为主站和后台管理两部分。
  • 主站是向外部用户提供产品、服务和信息的界面,用于展示公司的形象和吸引客户。
  • 后台管理则是为运营人员提供的具有控制权和权限管理的系统,用于管理和操作网站的各个功能和数据。
  • 后台管理系统往往有更多的功能和权限,包括数据录入、编辑、删除、统计分析等。
  • 而主站则是给予外部用户访问和使用的界面,不涉及敏感操作和权限管理。

【3】Simpleui后台管理:

  • Simpleui是一款简单易用的后台管理系统框架。

  • 它基于Python的Django框架开发,并提供了一套美观、高效的用户界面。通过使用Simpleui,您可以快速搭建一个功能齐全、易于维护的后台管理系统。

  • Simpleui提供了丰富的组件和插件,可以方便地进行数据录入、表单校验、数据展示、样式定制等操作。

  • 同时,Simpleui还支持响应式布局,可以适应不同屏幕尺寸的设备,提供更好的用户体验。

  • 在使用Simpleui进行后台管理时,您可以根据具体需求进行配置和扩展。

  • 例如,您可以创建自定义的数据模型,定义字段名称、类型和验证规则。

  • 您还可以创建页面,用于展示和处理特定的数据信息。

  • Simpleui还提供了权限管理功能,可以根据用户角色和权限设置不同的访问权限。

  • 通过Simpleui,您可以灵活地管理网站的各项功能和数据,提高运营效率和数据管理的准确性。

【4】安装Simpleui框架

  • 需要以下命令:

    • 首先,确保您的Python已经安装并配置好了环境。
    • 打开终端(Windows用户可使用命令提示符或PowerShell),输入以下命令安装Simpleui:
    pip install django-simpleui
    
    • 执行上述命令后,pip会自动下载Simpleui框架及其所依赖的库,并进行安装。
    • 等待安装完成后,即可在您的Django项目中开始使用Simpleui的功能。

【5】APP注册

INSTALLED_APPS = [
    # simpleui 后台管理
    'simpleui',
]

【6】切换时区和语言

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_TZ = False

【7】创建超级管理员并登录后台

python ../../manage.py createsuper
用户名:  admin
电子邮件地址:  
Warning: Password input may be echoed.
Password:  521

【8】模型表注册admin

from django.contrib import admin

from luffyCity.apps.home.models import Banner


# Register your models here.
@admin.register(Banner)
class UserAdmin(admin.ModelAdmin):
    list_display = ['title', 'image', 'link', 'info', 'created_time', 'updated_time', 'is_delete', 'is_show',
                    'orders']
  • 切换后台显示 home ---> 首页功能
    • luffyCity\luffyCity\apps\home\apps.py
from django.apps import AppConfig


class HomeConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'luffyCity.apps.home'
    verbose_name = '首页功能'

【五】轮播图接口

【1】路由分发

  • 主路由分发到APP路由
from django.contrib import admin
from django.urls import path, include
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    # 后台首页接口
    path('api/v1/home/', include('luffyCity.apps.home.urls')),
]
  • app路由自动注册路由
from rest_framework.routers import SimpleRouter

from luffyCity.apps.home.views import BannerView

router = SimpleRouter()
router.register('banner', BannerView, 'banner')

urlpatterns = [
]
urlpatterns += router.urls

【2】主视图

  • luffyCity\luffyCity\apps\home\views.py
from django.shortcuts import render
from rest_framework.viewsets import GenericViewSet
from django.conf import settings
from luffyCity.apps.home.models import Banner
from luffyCity.apps.home.serializers.Banner_serializer import BannerSerializer
from luffyCity.utils.common_mixin import CommonListModelMixin


class BannerView(GenericViewSet, CommonListModelMixin):
    # 过滤出没有被删除 + 可以显示 + 优先级排序
    queryset = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')[:settings.BANNER_COUNT]

    serializer_class = BannerSerializer

【补充】自定义响应数据格式

  • luffyCity\luffyCity\utils\common_response.py
# -*-coding: Utf-8 -*-
# @File : common_response .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/8/8
from rest_framework.response import Response


class CommonResponse(Response):
    def __init__(self, code=100, msg="请求成功", status=None, headers=None, **kwargs):
        data = {"code": code, "msg": msg}
        # kwargs 可能会携带数据 {token:'...'}
        if kwargs:
            data.update(kwargs)

        # 调用父类(Response)的 __init__ 方法进行初始化
        super().__init__(data=data, status=status, headers=headers)

【补充】自定义banner序列化类

  • luffyCity\luffyCity\apps\home\serializers\Banner_serializer.py
# -*-coding: Utf-8 -*-
# @File : Banner_serializer .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/8/8

from rest_framework import serializers

from luffyCity.apps.home.models import Banner


class BannerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Banner
        fields = ['id', 'title', 'image', 'link']

【补充】自定义视图类

  • luffyCity\luffyCity\utils\common_mixin.py
# -*-coding: Utf-8 -*-
# @File : common_mixin .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/8/8
from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin, \
    DestroyModelMixin

from luffyCity.utils.common_response import CommonResponse


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


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


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


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


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

【补充】自定义banner切片

  • luffyCity\luffyCity\settings\dev.py
###############轮播图切片配置文件#################
from luffyCity.utils.common_settings import *
  • luffyCity\luffyCity\utils\common_settings.py
# -*-coding: Utf-8 -*-
# @File : common_settings .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/8/8

BANNER_COUNT = 4

【补充】表模型继承

  • 表模型继承是指在实现数据库表时,通过继承的方式使得子模型能够继承父模型的字段和方法。
  • 在给出回答之前,我先解释一下上述内容中提到的几个概念。

【1】ModelMixin:

  • ModelMixin 是一个 Mixin 类,它定义了一些通用的方法,可以被其他表模型继承并使用。

  • 其中包括 to_dict 方法,用于将表模型对象序列化为字典形式的数据。

  • 通过在继承类的定义中添加 ModelMixin,子类就可以直接使用 to_dict 方法进行对象序列化操作。

【2】to_dict() 方法:

  • to_dict 方法是 ModelMixin 类中定义的方法,用于将表模型对象序列化为字典形式的数据。

  • 该方法允许通过参数指定只序列化需要的字段,可以提高性能并避免暴露不必要的数据。

【3】开源项目 Spug:

  • https://gitee.com/openspug/spug

  • Spug 是一个开源的运维平台,由国内知名技术团队开发并维护。

  • 其中的 ModelMixin 类提供了一套常用的方法,方便开发者在表模型中使用。

【4】表模型继承的应用场景和使用方法:

  • 在开发过程中,经常会遇到多个表模型之间存在相似的字段和方法。

  • 此时,我们可以将这些共享的属性和方法抽象到一个父类中,然后通过继承方式让子类继承这些属性和方法,以实现代码复用和减少冗余。

  • 在上述补充内容中提到的示例中,通过继承 ModelMixin 类,子类便可以使用 to_dict 方法将对象序列化为字典。

  • 其中的参数 a=['id','name'] 表示只序列化 ID 和名称字段,通过指定需要的字段可以避免暴露不必要的数据,提高性能。

【5】总结来说

  • 表模型继承是一种通过抽象共享属性和方法到父类的方式,使得子类可以继承这些属性和方法,提高代码复用性和减少冗余。
  • 具体到示例中的 ModelMixin 类,它包含了 to_dict 方法,可以用于将表模型对象序列化为字典形式的数据。