django_创建菜单(实现整个项目的框架,调包)

前言

为了赶进度,没有写什么记录文档,其实也快不了多少,反而不写记录文档,做的过程中遇到的一些问题,自己解决之后,以后回顾的时候容易忘记,所以记录其实算是一个非常好的习惯,进度重要,扎实也比较重要

代码仓库地址

代码仓库

欢迎大家多多 star

在线演示网址

网址

目前是这个网址,但是这个服务器是笔者租的服务器,三个月之后就会到期,到时候笔者可能需要把 docker 里面的文件打包传到新的服务器上面,或者是继续租现在免费体验的这个服务器,之后再更新

启动网站的时候出现错误

笔者输入这条命令,试图启动网站(昨天晚上其实就已经成功启动网站了,只是今天改了点儿东西就启动不了了)
python3 manage.py runserver 0.0.0.0:8000
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
昨天晚上算是实现了一些简单的网页展示,还有跳转的按钮,今天做的修改是把一些路由改了

URL 代表着是统一资源定位符(Uniform Resource Locator)。URL 无非就是一个给定的独特资源在 Web 上的地址。理论上说,每个有效的 URL 都指向一个唯一的资源。这个资源可以是一个 HTML 页面,一个 CSS 文档,一幅图像,等等。而在实际中,也有一些例外,最常见的情况就是一个 URL 指向了不存在的或是被移动过的资源。由于通过 URL 呈现的资源和 URL 本身由 Web 服务器处理,因此 web 服务器的拥有者需要认真地维护资源以及与它关联的 URL

SyntaxError: closing parenthesis ‘]’ does not match opening parenthesis ‘(’ on line 8

上面出现的这个问题是语法错误,应该是敲代码的时候敲错了

index文件少写了一个小括号,加上之后成功启动了网站
在这里插入图片描述
能够在终端看到这个访问记录
在这里插入图片描述

渲染

简单的解释,前端写好html模板,让后端直接填数据,这就是后端渲染。 前端渲染是,通过ajax请求接口返回的数据,将数据渲染出来。 后端只写接口,分工更明细

在软件开发中,"渲染"通常指的是将数据或者某种描述转换为用户界面的可视化输出的过程


按照笔者的理解就是把代码或者字符串输出为图片文字等,让没有学过计算机的用户能够简单直接的使用这个软件(或者说是系统)

该项目是前后端分离的项目,前端渲染的好处就是可以降低服务器的压力

路径的一些说明

from django.urls import path,include
from game.views.index import index

urlpatterns=[
    path("",index,name="index"),
    path("menu/",include("game.urls.menu.index")),
    path("playground/",include("game.urls.playground.index")),
    path("settings/",include("game.urls.settings.index"),
]

上面的代码是整个项目的 index 文件,中括号里第一行是返回项目网址的链接(因为什么都没加,是一个空值),我们查看现在的网站的源码,如下

(这个还不算是整个项目的 index 文件,这个是 urls 里面的 index 文件,按照笔者的理解,这些 index 文件主要作用是提供一些可以跳转的路径,因为逻辑的改变,可以跳转到不同的页面)
在这里插入图片描述
可以发现上面的代码和这个代码是一模一样的

{% load static %}
<head>
    <link rel="stylesheet" href="https://cdn.acwing.com/static/jquery-ui-dist/jquery-ui.min.css">
    <script src="https://cdn.acwing.com/static/jquery/js/jquery-3.3.1.min.js"></script>
    <link rel="stylesheet" href="% static 'css/game.css' %">
    <script src="{% static 'js/dist/game.js' %}"></script>
</head>

<body style="margin:0">
    <div id="ac_game_12345678"></div>
    <script>
        $(document).ready(function("ac_game_12345678"){
            let ac_game=AcGame();

        });
    </script>
</body>

这份代码是 Multiple_front_ends/web.html ,表示的是多个前端文件夹下面的 web 前端文件

该项目的定位是一个后端,等未来有机会的话,希望能实现多个前端,比如说网页端,应用端,小程序端等

文件结构

在这里插入图片描述

网页显示一条错误

GET http://39.105.183.81:8000/%%20static%20'css/game.css'%20% net::ERR_EMPTY_RESPONSE
我找到这个文件,去对应的地方修改一下

修改了一下,发现是因为文件里面没有什么具体的内容,所以报错了,没有什么影响

到目前为止就把前期的一些准备工作做好了

后面发现不是因为文件是空的报错,而是因为一个语法格式写错了报错的,后面有写

路由顺序

首先访问 fight 里面的 fight 文件夹里面的 urls 文件,

"""fight URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('',include('game.urls.index')),
    path('admin/', admin.site.urls),
]

跳转到 game.urls.index 文件

from django.urls import path,include
from game.views.index import index

urlpatterns=[
    path("",index,name="index"),
    path("menu/",include("game.urls.menu.index")),
    path("playground/",include("game.urls.playground.index")),
    path("settings/",include("game.urls.settings.index")),
]

然后跳转到 views 里面的 index 文件

from django.shortcuts import render

def index(request):
    return render(request,"Multiple_front_ends/web.html")

然后跳转到 Multiple_front_ends/web.html 文件,这个文件里面的内容就是目前网页显示的源代码

js

这个文件夹下面有一些文件夹和文件
在这里插入图片描述

打包

每一次修改 js 文件之后都需要打包一下这个文件,也就是执行一次scripts/compress_game_js.sh 文件

#! /bin/bash

JS_PATH=/home/acs/fight/game/static/js/
JS_PATH_DIST=${JS_PATH}dist/
JS_PATH_SRC=${JS_PATH}src/

find . $JS_PATH_SRC -type f -name '*.js' | sort | xargs cat > ${JS_PATH_DIST}game.js

src 里面的所有 js 文件打包发送到 distgame.js 文件里面

出现问题的代码

<link rel="stylesheet" href="% static 'css/game.css' %">

这段代码貌似没啥问题

改成了这样就没有错误了
<link rel="stylesheet" href="{% static 'css/game.css' %}">

原来是没有加大括号

函数没有起作用

在这里插入图片描述

目前在 zbase.js文件里面的输出,没有正常在控制台显示

我们可以看到,这个 web.html 显示的是这个输出

{% load static %}
<head>
    <link rel="stylesheet" href="https://cdn.acwing.com/static/jquery-ui-dist/jquery-ui.min.css">
    <script src="https://cdn.acwing.com/static/jquery/js/jquery-3.3.1.min.js"></script>
    <link rel="stylesheet" href="% static 'css/game.css' %">
    <script src="{% static 'js/dist/game.js' %}"></script>
</head>

<body style="margin:0">
    <div id="ac_game_12345678"></div>
    <script>
        $(document).ready(function(){
            let ac_game=new AcGame("ac_game_12345678");

        });
        console.log("hello world");
    </script>
</body>

是正常的,是笔者看教程的时候把这个漏掉了,应该是因为教程把这个代码里面的 hello world 删除了,然后在 zbase.js 文件里面进行修改
在这里插入图片描述

删除之后并没有显示我们想要看到的内容,我们把这个文件修改,打包刷新之后没有像教程一样,在控制台输出我们需要的内容

这是为什么呢

检查 game.js 文件,发现是这个情况
在这里插入图片描述
zbase.js文件里面的内容是一样的,只是没有显示在控制台

我们认为可能是调用这个函数的时候没有调用成功,可能是函数名字没有写对

对比了一下代码都是相同的,可能是因为空行的原因吗,感觉基本不可能因为空行调用不了函数,但还是试试
在这里插入图片描述
太离谱了呀,我把空行删除之后就能正常显示了,可能是因为这个控制台每次只能输出一行数据

关于进度

今天本来想学两个章节,但是现在这一个章节都没有学完,我今天不把这一个章节学完就不睡觉了,之后每天至少学一个章节,要把进度推一推

开发细节

因为打包的函数是按照文件名的字典序来打包的,所以我们把文件名前面加上一个 z 可以保证这个文件会出现在最后面,否则不是在最后面,可能出现先调用再定义的问题,会报错

显示不了图片

把背景图片加到 css 文件里面,但是自己的网页还是空白的

我不知道问题出在哪里,准备返回去重新听一遍教程

js 文件里面,一般对象是 html 对象,前面加上 $ 符号,不是的话就不加

找到问题所在了,有一行语法写的有点问题,少了一个等号,加上之后就可以正常显示图片了

在这里插入图片描述

梳理一下函数调用的流程

首先是主函数,就是 web.html 文件,然后调用了 zbase.jsAcGame 函数,这个函数里面调用了 js/menu/zbase.js 文件里面的 AcGameMenu 函数,这个函数里面创建了一个 div ,存到了最开始的 web.html 里面,等于说形成了一个闭环

我们可以查看一下源码
在这里插入图片描述

确实在这里创建好了,但是确实比较难以找到

修改一些宽度参数

可以看到前面展示的图片不是一个完整的图片,有一些别的图片,我们把高度宽度都设置成百分之百就可以让图片占据整个屏幕
在这里插入图片描述
全屏显示效果更佳
在这里插入图片描述

class

因为一些专有名词自己其实记住没有什么意义,知道是怎么使用的其实更加实在,笔者初中的时候沉迷转魔方,但是其实也是只会那个最初阶的魔方公式,然后就跟着教程练会了之后,自己其实也不知道怎么就能拼好,形成了肌肉记忆了都,但是要我教会别人,我可能得再整理一下思路

class 写在 div 里面,目前这个部分写在了 js 文件里面,之后需要在 css 文件里面使用 .class_name{} 来调整这个板块的样式

一个 class 里面可以有多个描述的东西,比如这样:<div class="ac-game-menu-field-item ac-game-menu-field-item-single">

js 里面的一些细节

我写的时候一直比较模糊,现在梳理一下这个文件里面的一些代码,之后担心随着项目的推进,这个问题一直没有解决

首先目前写了两个 js 文件,一个是 game/static/js/src/zbase.js 这个文件,另一个是 game/static/js/src/menu/zbase.js 这个文件

前面的是一个整体的 js 文件,后面的是菜单部分的 js 文件

其实这两个文件最后都是放到 game/static/js/dist/game.js 里面执行的,主要是把文件分开,开发者在开发的时候更加方便,是使用了一个打包的脚本文件把所有的 js 文件全部集成到 game.js 文件里面(scripts/compress_game_js.sh)

下面分析一下 game/static/js/src/zbase.js 该文件

class AcGame{
    constructor(id){
        this.id=id;
        this.$ac_game=$('#'+id);
        this.menu=new AcGameMenu(this);
    }
}

这种其实是一些模板函数,构造函数,然后把一些参数传进去

下面说一下这个文件 game/static/js/src/menu/zbase.js

class AcGameMenu{
    constructor(root){
        this.root=root;
        this.$menu=$(`
<div class="ac-game-menu">
    <div class="ac-game-menu-field">
        <div class="ac-game-menu-field-item ac-game-menu-field-item-single">
            单人模式
        </div>

        <div class="ac-game-menu-field-item ac-game-menu-field-item-multi">
            多人模式
        </div>

        <div class="ac-game-menu-field-item ac-game-field-item-settings">
            设置
        </div>
    </div>
</div>
`);
        this.root.$ac_game.append(this.$menu);
    }
}

构造函数调用了 root ,也就是前面一个文件,创建了一个菜单,然后把这个菜单加到了 root 的后面,创建菜单的时候用了 $ 表示这是一个 html 对象,具体写 html 的时候用 `` 把自己定义的 div 括起来,里面是一些简单的 htmlclass 的写法

之前大二下的时候其实学过一部分 web 的知识,所以这个不算太陌生,但是自己之前感觉和没学区别不是很大,没有转换为生产力呀

让三个按钮可以点击

this.$singel=this.$menu.find('.ac-game-menu-field-item-single');
this.$multi=this.$menu.find('.ac-game-menu-field-item-multi');
this.$settings=this.$menu.find('.ac-game-field-item-settings');  

注意 class 前面需要加上 . 才能找到这个 class

设置按钮的样式

在这里插入图片描述
现在这里有三个按钮,但是明显不是很美观,非常简陋,但是因为这个项目重点不在于前端,所以最后可能前端也不是很美观

等笔者把前端知识也学了一点之后,有时间会再完善一下,现在先稍微完善一下

vh vw 表示设置百分比的高度和宽度,比较方便
在这里插入图片描述
设置的 css 样式如下,都比较简单直观

.ac-game-menu-field{
    width:20vw;
    position:relative;
    top:40vh;
    left:19vw;
}

.ac-game-menu-field-item{
    color:white;
    height:7vh;
    width:18vw;
    font-size:6vh;
    font-style:italic;
    padding:2vh;
    background-color:rgba(39,21,28,0.6);
    text-align:center;
    border-radius:10px;
    letter-spacing:0.5vx;
    cursor:pointer;                                                                                                                               
}

css鼠标悬停样式
实现鼠标悬停的动态效果的代码如下

.ac-game-menu-field-item:hover{
    transform:scale(1.2);
    transition:100ms;
}

在前端实现页面的切换

menu 下面的 js 文件里面设置了一些函数,但是在前端浏览器控制台看不到自己的函数输出,不知道原因

在这里插入图片描述
按道理说自己点击了图标,在控制台会显示点击了这个按钮

使用的代码如下

start(){
        this.add_listening_events();
    }                                                                                                                                             

    add_listening_events(){
        let outer=this;
        this.$single_mode.click(function(){
            console.log("click single mode");
        });
        this.$multi_mode.click(function(){
            console.log("click multi mode");
        });
        this.$settings.click(function(){
            console.log("click settings");
        });
    }

前面还有一个 start 函数的使用,只有一行,就没有粘贴过来了

自己找了一遍没有发现问题出在哪里,现在回过头去看教程是怎么操作的,这次看仔细一点

在这里插入图片描述
目前是有一个报错和一个警告,还是有点无奈的

重新看了一遍教程,和我写的是一样的,但是为什么我的代码报错警告了,控制台输出不了想要输出的内容呢

试了一下源代码仓库的文件也是显示不行,应该不是我这边的问题了,我继续跟着教程做就行

看来不行,这一步卡住之后,后面的也和教程不一样了

点击进入到一个新界面,目前点击这个按钮进入不了新的界面
在这里插入图片描述

class AcGameMenu {
    constructor(root) {
        this.root = root;
        this.$menu = $(`
<div class="ac-game-menu">
    <div class="ac-game-menu-field">
        <div class="ac-game-menu-field-item ac-game-menu-field-item-single-mode">
            单人模式
        </div>
        <br>
        <div class="ac-game-menu-field-item ac-game-menu-field-item-multi-mode">
            多人模式
        </div>
        <br>
        <div class="ac-game-menu-field-item ac-game-menu-field-item-settings">
            设置
        </div>
    </div>
</div>
`);
        this.root.$ac_game.append(this.$menu);
        this.$single_mode = this.$menu.find('.ac-game-menu-field-item-single-mode');
        this.$multi_mode = this.$menu.find('.ac-game-menu-field-item-multi-mode');
        this.$settings = this.$menu.find('.ac-game-menu-field-item-settings');

        this.start();
    }

    start() {
        this.add_listening_events();
    }

    add_listening_events() {
        let outer = this;
        this.$single_mode.click(function(){
            outer.hide();
            outer.root.playground.show();
        });
        this.$multi_mode.click(function(){
            console.log("click multi mode");
        });
        this.$settings.click(function(){
            console.log("click settings");
        });
    }

    show() {  // 显示menu界面
        this.$menu.show();
    }

    hide() {  // 关闭menu界面
        this.$menu.hide();
    }
}

menu 里面的 js 文件写成上面这样可以跳转和在控制台正常显示输出,但是还是有一些报错

playground 里面的 js 文件重新写了一遍,现在没有报错了,估计是因为一些肉眼看不见的标点符号之类的错误,因为笔者有时候操作 tmuxvim 有一些误操作,所以以后宁愿写的慢一点,也不要把代码敲错,debug 的时间远大于节省的这一点点打字的时间
在这里插入图片描述

结语

这个菜单就算结束了,确实作为独立开发者,自己的源码还是闭源比较好,但是这个作为自己的学习项目的话,开源影响也不是很大,等自己以后独立开发的时候再闭源,目前自己的 github 其实有含金量的东西,可以认为是没有的哈哈哈

以后要是自己一个人一个月,可以上线一款 app ,想想还是非常激动的

  • 36
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三冬四夏会不会有点漫长

一块钱也是支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值