• Python正课152 —— luffy项目 头部、轮播图、接口


    本文内容皆为作者原创,如需转载,请注明出处:https://www.cnblogs.com/xuexianqi/p/13347573.html

    一:路由跳转

    1.html中路由跳转

    <router-link to="/">
    	<img src="../assets/img/head-logo.svg" alt="">
    </router-link>
    

    2.js中控制路由跳转

    this.$router.push('/');
    

    二:Vue项目(luffycity)

    1.头部Header组件

    components内新建Header.vue,添加如下代码:

    <template>
        <div class="header">
            <div class="slogan">
                <p>老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活</p>
            </div>
            <div class="nav">
                <ul class="left-part">
                    <li class="logo">
                        <router-link to="/">
                            <img src="../assets/img/head-logo.svg" alt="">
                        </router-link>
                    </li>
                    <li class="ele">
                        <span @click="goPage('/free-course')" :class="{active: url_path === '/free-course'}">免费课</span>
                    </li>
                    <li class="ele">
                        <span @click="goPage('/actual-course')" :class="{active: url_path === '/actual-course'}">实战课</span>
                    </li>
                    <li class="ele">
                        <span @click="goPage('/light-course')" :class="{active: url_path === '/light-course'}">轻课</span>
                    </li>
                </ul>
    
                <div class="right-part">
                    <div>
                        <span>登录</span>
                        <span class="line">|</span>
                        <span>注册</span>
                    </div>
                </div>
            </div>
        </div>
    
    </template>
    
    <script>
    
        export default {
            name: "Header",
            data() {
                return {
                    url_path: sessionStorage.url_path || '/',
                }
            },
            methods: {
                goPage(url_path) {
                    // 传入的路由如果不是当前所在路径,就跳转
                    if (this.url_path !== url_path) {
                        this.$router.push(url_path);
                    }
                    sessionStorage.url_path = url_path;
                },
            },
            created() {
                sessionStorage.url_path = this.$route.path;
                this.url_path = this.$route.path;
            }
        }
    </script>
    
    <style scoped>
        .header {
            background-color: white;
            box-shadow: 0 0 5px 0 #aaa;
        }
    
        .header:after {
            content: "";
            display: block;
            clear: both;
        }
    
        .slogan {
            background-color: #eee;
            height: 40px;
        }
    
        .slogan p {
             1200px;
            margin: 0 auto;
            color: #aaa;
            font-size: 13px;
            line-height: 40px;
        }
    
        .nav {
            background-color: white;
            user-select: none;
             1200px;
            margin: 0 auto;
    
        }
    
        .nav ul {
            padding: 15px 0;
            float: left;
        }
    
        .nav ul:after {
            clear: both;
            content: '';
            display: block;
        }
    
        .nav ul li {
            float: left;
        }
    
        .logo {
            margin-right: 20px;
        }
    
        .ele {
            margin: 0 20px;
        }
    
        .ele span {
            display: block;
            font: 15px/36px '微软雅黑';
            border-bottom: 2px solid transparent;
            cursor: pointer;
        }
    
        .ele span:hover {
            border-bottom-color: orange;
        }
    
        .ele span.active {
            color: orange;
            border-bottom-color: orange;
        }
    
        .right-part {
            float: right;
        }
    
        .right-part .line {
            margin: 0 10px;
        }
    
        .right-part span {
            line-height: 68px;
            cursor: pointer;
        }
    </style>
    

    2.配置全局css和`setting

    main.js中配置

    // 配置全局样式 @ 符号,代指src路径
    import '@/assets/css/global.css'
    // 配置全局自定义设置
    import settings from '@/assets/js/settings'
    Vue.prototype.$settings = settings;
    // 在所有需要与后台交互的组件中:this.$settings.base_url + '再拼接具体后台路由'
    

    3.在assets下的css文件夹中加入global.css

    先提前在assets中 创建cssjsimg3个文件夹

    /* 声明全局样式和项目的初始化样式 */
    body, h1, h2, h3, h4, h5, h6, p, table, tr, td, ul, li, a, form, input, select, option, textarea {
        margin: 0;
        padding: 0;
        font-size: 15px;
    }
    
    a {
        text-decoration: none;
        color: #333;
    }
    
    ul {
        list-style: none;
    }
    
    table {
        border-collapse: collapse; /* 合并边框 */
    }
    

    4.在assets下的js文件夹中加入settings.js

    export default {
        base_url: 'http://127.0.0.1:8000'
    }
    

    5.前台配置

    安装

    cnpm install axios
    cnpm install vue-cookies
    cnpm install element-ui
    cnpm install jquery
    cnpm install bootstrap@3
    

    main.js中配置

    #axios配置
    import axios from 'axios'
    Vue.prototype.$axios = axios;
    # vue-cookies配置
    import cookies from 'vue-cookies'
    Vue.prototype.$cookies = cookies;
    # ElementUI的配置
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    Vue.use(ElementUI);
    # bootstrap配置
    import 'bootstrap'
    import 'bootstrap/dist/css/bootstrap.min.css'
    

    jquery的配置,不太一样(Vue中不推荐使用jquery,此条可忽略)

    # 项目根路径创一个 vue.config.js
    const webpack = require("webpack");
    
    module.exports = {
        configureWebpack: {
            plugins: [
                new webpack.ProvidePlugin({
                    $: "jquery",
                    jQuery: "jquery",
                    "window.jQuery": "jquery",
                    "window.$": "jquery",
                    Popper: ["popper.js", "default"]
                })
            ]
        }
    };
    

    6.尾部组件

    components内新建Footer.vue,添加如下代码:

    <template>
        <div class="footer">
            <ul>
                <li>关于我们</li>
                <li>联系我们</li>
                <li>商务合作</li>
                <li>帮助中心</li>
                <li>意见反馈</li>
                <li>新手指南</li>
            </ul>
            <p>Copyright © luffycity.com版权所有 | 京ICP备17072161号-1</p>
        </div>
    </template>
    
    <script>
        export default {
            name: "Footer"
        }
    </script>
    
    <style scoped>
        .footer {
             100%;
            height: 128px;
            background: #25292e;
            color: #fff;
        }
    
        .footer ul {
            margin: 0 auto 16px;
            padding-top: 38px;
             810px;
        }
    
        .footer ul li {
            float: left;
             112px;
            margin: 0 10px;
            text-align: center;
            font-size: 14px;
        }
    
        .footer ul::after {
            content: "";
            display: block;
            clear: both;
        }
    
        .footer p {
            text-align: center;
            font-size: 12px;
        }
    </style>
    

    7.在components内新建Banner.vue,添加如下代码:

    <template>
    
        <div id="banner">
    
            <el-carousel height="400px">
                <el-carousel-item v-for="item in banner_list">
                    <!--<img src="../assets/img/banner1.png" alt="">-->
                    <router-link :to="item.link">
                        <img :src="item.img" :alt="item.name">
                    </router-link>
    
                </el-carousel-item>
            </el-carousel>
        </div>
    
    </template>
    
    <script>
        export default {
            name: "Banner",
            // data:function(){},
            data() {
                return {
                    banner_list: []
                }
            },
            created() {
                //当banner组件一创建,就向后台发请求,拿回轮播图数据
                this.$axios.get(this.$settings.base_url + '/home/banner/').then(response => {
                    console.log(response.data)
                    this.banner_list = response.data
                }).catch(error => {
                })
            },
    
        }
    </script>
    
    <style scoped>
        .el-carousel__item {
            height: 400px;
            min- 1200px;
        }
    
        .el-carousel__item img {
            height: 400px;
            /*margin-left: 20px;*/
            /*margin-left: calc(50% - 1920px / 2);*/
        }
    </style>
    

    8.在routerindex.js中配置

    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
        },
    
    ]
    

    三:DRF项目(luffyapi)轮播图接口

    1.appshomeurls.py

    from django.urls import path, re_path, include
    from . import views
    
    from rest_framework.routers import SimpleRouter
    
    router = SimpleRouter()
    router.register('banner', views.BannerView, 'banner')
    urlpatterns = [
        # path('banner/', views.BannerView.as_view()),
        path('', include(router.urls)),
    
    ]
    

    2.appshome中的models.py

    from django.db import models
    
    # from luffyapi.utils.models import BaseModel
    from utils.models import BaseModel
    
    
    class Banner(BaseModel):
        name = models.CharField(max_length=32, verbose_name='图片名字')
        img = models.ImageField(upload_to='banner', verbose_name='轮播图', help_text='图片尺寸必须是:3840*800', null=True)
        link = models.CharField(max_length=32, verbose_name='跳转连接')
        info = models.TextField(verbose_name='图片简介')
    
        # type=models.IntegerField(choices=)
    
        def __str__(self):
            return self.name
    
    

    3.appshome中创建serializer,并添加代码

    from rest_framework import serializers
    from . import models
    
    
    class BannerModelSerilaizer(serializers.ModelSerializer):
        class Meta:
            model = models.Banner
            fields = ['name', 'link', 'img']
    
    

    4.appshomeviews.py

    from django.shortcuts import render
    
    from rest_framework.views import APIView
    from luffyapi.utils.response import APIResponse
    from luffyapi.utils.logger import log
    
    from rest_framework.mixins import ListModelMixin
    from rest_framework.generics import GenericAPIView
    from rest_framework.viewsets import GenericViewSet
    from . import models
    from . import serializer
    
    # class BannerView(GenericAPIView,ListModelMixin):  # 这个路由配置  path('banner/', views.BannerView.as_view()),
    
    # 路由位置
    '''
    from rest_framework.routers import  SimpleRouter
    router=SimpleRouter()
    router.register('banner',views.BannerView,'banner')
    path('', include(router.urls)),
    '''
    from django.conf import settings
    
    
    class BannerView(GenericViewSet, ListModelMixin):
        # 无论有多少条待展示的数据,最多就展示3条
        queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('display_order')[
                   :settings.BANNER_COUNTER]
        serializer_class = serializer.BannerModelSerilaizer
    
    

    5.在小luffyapi创建utils包,创建models.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_order = models.IntegerField()
        class Meta:
            abstract=True  # 一定不要忘了
    

    6.在settings文件夹中新建const.py

    # 首页轮播图个数
    BANNER_COUNTER=3
    

    7.在dev.py中添加代码

    from .const import *
    

    四:添加图片

    1.进入后台127.0.0.1:8000/xadmin

    image-20200720203616027

    2.增加Banner

    image-20200720203633779

    3.填好信息,保存

    image-20200720203748892

    4.进入127.0.0.1:8080,查看效果

    image-20200720203837253

  • 相关阅读:
    项目中的*签到*小功能!
    亲们,拿到DateTime.Now你是否也是这样比较的?
    <input type="file" />,美化自定义上传按钮
    让你的页面实现自定义的 Ajax Loading加载的体验!
    按回车键提交表单!
    字符串比较大小,CompareTo来搞定!
    巧用Contains可以做到过滤同类项!
    项目开发中遇到的Bug知识整理!
    SharePoint中详细的版本对比
    ASP.NET安全隐患及SharePoint中的Workaround
  • 原文地址:https://www.cnblogs.com/xuexianqi/p/13347573.html
Copyright © 2020-2023  润新知