07 后台主页模块设计
一、Banner数据表model设计
1、utils/model.py
from django.db import models
# 因为考虑后期课程表,轮播图都会用到这些字段
class BaseModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='最后更新时间')
is_delete = models.BooleanField(default=False, verbose_name='是否删除')
is_show = models.BooleanField(default=True, verbose_name='是否展示')
display = models.IntegerField(verbose_name='优先级')
class Meta:
abstract = True # 创建一张虚拟表
2、home/models.py
from django.db import models
from luffy.utils.models import BaseModel
class Banner(BaseModel):
title = models.CharField(max_length=16, unique=True, verbose_name='标题名称')
image = models.ImageField(upload_to='banner', verbose_name='图片')
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
3、数据库迁移
>: python manage.py makemigrations
>: python manage.py migrate
4、注册app:dev.py
INSTALLED_APPS = [
# ...
'rest_framework',
'home',
]
二、设计Banner数据接口
1、home/views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.mixins import ListModelMixin
from .models import Banner
from . import serializers
from django.conf import settings
class BannerViewSet(ModelViewSet, ListModelMixin):
queryset = Banner.objects.all().filter(is_delete=False, is_show=True)[:settings.BANNER_COUNT] # 通过切片值只显示几张图片
serializer_class = serializers.BannerSerializer
2、home/serializers.py
from rest_framework import serializers
from . import models
class BannerSerializer(serializers.ModelSerializer):
class Meta:
model = models.Banner
fields = ['title', 'image', 'link']
3、home/urls.py
from django.urls import path
from luffyapi.apps.home import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('banner', views.BannerView, 'banner')
urlpatterns = [
path('home/', views.TextView.as_view())
]
urlpatterns += router.urls
4、自定义轮播图显示页数
# settings/const.py
# 首页轮播图显示的张数
BANNER_COUNT = 2
# settings/dev.py
# 首页轮播图设置
from luffyapi.settings.const import *
在home/views.py中添加
class BannerView(GenericViewSet, ListModelMixin):
serializer_class = BannerSerializer
queryset = Banner.objects.all().filter(is_delete=False, is_show=True)[:settings.BANNER_COUNT] # 通过切片值只显示几张图片
4、接口
http://127.0.0.1:8000/home/banner/
四、轮播图前端:点图片跳转
1、components/Banner.vue
2、router/index.js:增加路由
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
// 新增的三个组件
import ActualCourse from "../views/ActualCourse";
import FreeCourse from "../views/FreeCourse";
import LightCourse from "../views/LightCourse";
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/free-course',
name: 'FreeCourse',
component: FreeCourse
},
{
path: '/light-course',
name: 'LightCourse',
component: LightCourse
},
{
path: '/actual-course',
name: 'ActualCourse',
component: ActualCourse
},
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
3、assets/js/settings.js
export default {
base_url: 'http://127.0.0.1:8000'
}
4、main.js
import settings from "./assets/js/settings"; # 赋值到$settings
Vue.prototype.$settings=settings