Django: 2. 创建菜单界面

news/2024/4/17 1:41:48/文章来源:https://blog.csdn.net/LYS00Q/article/details/127662315

更好的阅读体验\color{red}{更好的阅读体验}更好的阅读体验


文章目录

    • 2.1 项目设计
      • 2.1.1 项目系统设计
      • 2.1.2 项目文件结构
      • 2.1.3 项目全局配置
    • 2. 2 菜单界面结构创建
      • 2.2.1 html 文件结构
      • 2.2.2 js 对象文件结构
      • 2.2.3 views 文件结构
      • 2.2.4 urls 文件结构
    • 2.3 菜单界面文件创建
      • 2.3.1 创建 js 对象文件
      • 2.3.2 创建 css 文件
      • 2.3.3 打包文件


2.1 项目设计


2.1.1 项目系统设计

  • menu:菜单页面
  • playground:游戏界面
  • settings:设置界面

对于复杂的界面设计,我们在每个界面下递归细分功能模块,直到实现最基本的功能模块。模块化设计便于项目创建、更新和维护。

project/  #项目系统设计
|-- menu  #菜单界面
|-- playground  #游戏界面
|   |-- maps  #地图
|   |-- players  #人物
|   |   |-- atcions  #人物动作
|   |   |-- movements  #人物移动
|   |   `-- talents  #人物属性
|   `-- time  #时间
`-- settings  #设置界面

2.1.2 项目文件结构


对于一个 Django 项目,有如下框架:

django_project/  
|-- django_project  #整个Django项目的配置
|   |-- __init__.py  #初始化文件
|   |-- __pycache__
|   |   |-- __init__.cpython-38.pyc
|   |   `-- settings.cpython-38.pyc
|   |-- asgi.py  #异步通信服务启动文件
|   |-- settings.py  #项目的全局配置文件
|   |-- urls.py  #项目的全局路由设置
|   `-- wsgi.py  #web网关服务启动文件
|-- manage.py  #命令行工具
`-- project  #子应用|-- __init__.py|-- admin.py|-- apps.py|-- consumers  #管理 websocket 函数|-- migrations|   `-- __init__.py|-- models  #管理数据库数据|-- static  #管理静态文件|   |-- audio  #声音|   |-- css  #对象格式|   |-- image  #图片|   `-- js  #对象逻辑(脚本)|-- templates  #管理html|-- tests.py|-- urls  #管理路由`-- views  #管理http函数

我们在 python 中调用 import urls.xxx 时,需要索引文件 __init__.py。为了便于维护 urls.pyviews.pymodels.py,我们将其转为文件夹的方式存储,并在这三个文件夹目录下都添加 __init__.py 文件。

对于 templatesurlsviews 等的文件夹,最好都建立文件夹menuplaygroundsettings 文件夹,用于细分模块设计。

对于 css 一般不需要细分。

对于 js 需要分为 distsrc 两个文件,dist 是最终打包好的 .js 文件,src 用于存储开发时的各种模块化的 .js 文件供。

我们可以在 acappp/ 下创建一个文件夹 scripts,用来存储各种脚本,将 src 打包为 dist,创建打包 src 的脚本 compress_game_js.sh 如下

#!/bin/bashJS_PATH=~/workspace/ac_app/ACApp/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

记得加上可执行权限:

chmod +x compress_game_js.sh

2.1.3 项目全局配置


添加子应用

打开/game/apps.py,找到 class GameConfig,然后在全局的 settings.py里找到INSTALLED_APPS,在里面加入 :

'game.apps.GameConfig',

以便将创建的 game 加入进去。

静态文件地址设置

打开 settings.py,找到 STATIC_URL = '/static/' ,在该条目上方加入:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

此外按照上述方式再加入:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'     
  • 一般来说,static存开发的文件,media存用户的文件。

同时要记得import osos.path()是将路径合并在一起。通过该操作可以使我们的静态文件会放到这个目录下。

import os
from pathlib import Path  

2. 2 菜单界面结构创建


2.2.1 html 文件结构


首先进入 /game/templates/,创建三个文件夹 menuplaygroundsettings 文件夹,便于模块化设计。为了支持多种终端上运行,再创建一个文件夹 multiends 存储 html 文件。

先实现网页端,创建 web.html

{% load static %}  <!--查找并载入静态文件static的文件夹--><head><!--<head></head>存放所有的html资源文件--><!--引入jQuery的css--><link rel="stylesheet" href="https://cdn.acwing.com/static/jquery-ui-dist/jquery-ui.min.css"><!--引入jQuery的js-->  <script src="https://cdn.acwing.com/static/jquery/js/jquery-3.3.1.min.js"></script>  <!--引入自己写的game.css--><link rel="stylesheet" href="{% static 'css/game.css' %}"><!--引入自己写的game.js--><script src="{% static 'js/dist/game.js' %}"></script>
</head><body style="margin: 0"><!--<body></body>以后的网站内容都放在这里面--><!--创建游戏框架--><div id="ac_game_12345678"></div><!--引入js代码,以后前端渲染的部分都在js里面--><script>$(document).ready(function(){let ac_game = new AcGame("ac_game_12345678");});</script>
</body>

js 在客户端渲染,而 viewsurls 在后端处理,由此实现前后端分离,能够减轻服务器的压力,并能适应多终端的开发需求。


2.2.2 js 对象文件结构


html 文件的 <body>内的 <script> 将页面渲染交给客户,调用 let ac_game = AcGame(); 创建一个 js 对象,接下来实现这个创建 js 对象的文件。

进入 /game/static/js/,同样创建三个文件夹 menuplaygroundsettings,再创建一个总文件 zbase.js。由于打包时按照文件名字典序排列的,可以保证在打包的时 zbase.js 在最后打包。

class AcGame {constructor(id) {}    
}

web.html 中的 let ac_game = AcGame() 括号里面添加 id,即 AcGame("ac_game_12345678"),表示渲染<div id="ac_game_12345678">


2.2.3 views 文件结构


进入 /game/views,同样创建三个文件夹 menuplaygroundsettings,在这三个文件夹里存放需要被调用的 .py 文件,故都要添加索引 __init__.py

/game/views/ 里面写总的 index.py

from django.shortcuts import render # 从django.shortcuts引入renderdef index(request):return render(request, "multiends/web.html") # 返回响应,渲染"/game/templates/multiends/web.html"

这个 index.py 只会在 htmlWeb 中被调用,未来其他东西都不会调用他它,主要用来访问刚刚写的 html

其中 from django.shortcuts import renderDjango 的渲染工具,render 用来渲染 html 文件,通过 Python 来把 html 的内容写到网页上去。此处的路径是从 /game/templates/ 开始的。


2.2.4 urls 文件结构


进入 /game/urls,同样创建三个文件夹 menuplaygroundsettings,在这三个文件夹里存放需要被调用的 .py 文件,故都要添加索引 __init__.py

每个文件夹下添加对应的路由 index.py,格式如下:

from django.urls import pathurlpatterns = [
----
]

最后在 /game/urls/ 里面写总的 index.py

from django.urls import path, include # 引入路径管理
from game.views.index import index # 引入自己写的pythonurlpatterns = [path('', index, name='index'), # 到"/"的路由path('menu/', include('game.urls.menu.index')), # 到"menu/"的路由path('playground/', include('game.urls.playground.index')), # 到"playground/"的路由path('settings/', include('game.urls.settings.index')), # 到"settings/"的路由
]

2.3 菜单界面文件创建


2.3.1 创建 js 对象文件


进入 game/static/js/src/zbase.js,增添内容为:

class AcGame {constructor(id) {this.id = id;  //将id存下来this.$ac_game = $(`#` + id);  // 查找#id的html对象this.menu = new AcGameMenu(this);  //创建AcGame的AcGameMenu界面对象this.playground = new AcGamePlayground(this);  //创建AcGame的AcGameMenu界面对象}
}    

以上实现的是整个 js 对象文件的定义部分,接下来在各个模块里实现相应的 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_mod">单人模式</div><br><div class="ac_game_menu_field_item ac_game_menu_field_item_multi_mod">多人模式</div><br><div class="ac_game_menu_field_item ac_game_menu_field_item_settings">设置</div></div>
</div>
`);  //创建一个html对象menuthis.root.$ac_game.append(this.$menu);  //将html对象加入到这个游戏里面this.$single_mod = this.$menu.find('.ac_game_menu_field_item_single_mod');  //找到class对应的对象this.$multi_mod = this.$menu.find('.ac_game_menu_field_item_multi_mod');this.$settings = this.$menu.find('.ac_game_menu_field_item_settings');this.start();}start() {this.add_listening_events();}add_listening_events() {  //监听函数,监听按钮是否被click过let outer = this;this.$single_mod.click(function(){  //切换页面的逻辑outer.hide();  //关闭当前界面outer.root.playground.show();  //打开playground页面});this.$multi_mod.click(function(){console.log("click mulit_mod");});this.$settings.click(function(){console.log("click settings");});}//api接口函数show() {  //打开界面this.$menu.show();}hide() {  //关闭界面this.$menu.hide();}}
  • jquery 库提供了 api 接口 append(this.$menu),目的是将 this.$menu加入到 $ac_game 存储的 <div> 块内。
  • <div class="ac_game_menu">$menu 内定义一个 ac_game_menu,该样式从 /game/static/css/game.css 中调用,其他同理。

同理进入 /game/static/js/src/playground,创建 zbase.js

class AcGamePlayground {constructor(root) {this.root = root;this.$playground = $(`<div>游戏界面</div>`);this.hide();  //默认先关闭this.root.$ac_game.append(this.$playground);this.start();}start() {}show() { // 打开playground界面this.$playground.show();}hide() { // 关闭playground界面this.$playground.hide();}}

本节重点在于菜单界面的创建,至此简单实现了菜单界面跳转到游戏界面的按钮功能,后续添加实现其他功能。


2.3.2 创建 css 文件


js 对象文件创建完毕后,前端调用会在用户端进行渲染,其 html 样式仍需要从 /game/css 里调用。

首先下载一些静态资源,如背景图片等:

wget --output-document=自定义图片名称 图片地址

进入 /game/static/css/,打开 game.css

/*主菜单界面创建时的css样式*/
.ac_game_menu {width: 100%;height: 100%;background-image: url("/static/image/menu/background.png"); /*背景图片地址*/background-size: 100% 100%;user-select: none;
}/*主菜单的css样式*/
.ac_game_menu_field {width = 20vw;position: relative;top: 40vh;left: 19vw;
}/*主菜单条目的css样式*/
.ac_game_menu_field_item {color: white;width: 18vw;height: 7vh;font-size: 6vh;font-style: italic;padding: 2vh;text-align: center;background-color: rgba(39, 21, 28, 0.6);border-radius: 20px;letter-spacing: 0.5vw;cursor: pointer;
}/*hover 控制鼠标悬浮效果*/
.ac_game_menu_field_item:hover {transform: scale(1.15);transition: 130ms;
}

2.3.3 打包文件


实现完菜单界面的对应文件后,我们利用之前设计的打包脚本,将这些文件打包到 /game/static/js/dist

回到 scripts 文件夹,运行打包脚本:

./compress_game_js.sh

最后启动服务查看菜单界面:

python3 manage.py runserver 0.0.0.0:8000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_411612.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis客户端RedisTemplate入门学习

Redis的Java客户端 Jedis客户端入门 1.引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency>2.建立连接并操作 //建立连接BeforeEachvoid setUp()…

TIDB 性能测试(TIUP-TPCC)

New-Order&#xff1a;客户输入一笔新的订货交易&#xff1b; Payment: 更新客户账户余额以反映其支付状况; Delivery: 发货(模拟批处理交易); Order-Status: 查询客户最近交易的状态&#xff1b; Stock-Level: 查询仓库库存状况&#xff0c;以便能够及时补货。…

Android Studio入门之常用布局的讲解以及实战(附源码 超详细必看)(包括线性布局、权重布局、相对布局、网格布局、滚动视图 )

运行有问题或需要源码请点赞关注收藏后评论区留言 线性布局LinearLayout 顾名思义&#xff0c;线性布局像是用一根线把它的内部视图串起来&#xff0c;故而内部视图之间的排列顺序是固定的&#xff0c;要么从左到右&#xff0c;要么从上到下排列。通过属性android:orientation…

学完Python,不做程序员,只接兼职,哎,就是玩儿

现在这个时代&#xff0c;人人开始追求做斜杠青年&#xff0c;多方面开展副业&#xff0c;赚取几份工资。有很多朋友就抓住了Python的风口&#xff0c;靠着Python兼职月入一万。那么学完Python&#xff0c;有哪些可以做的兼职呢&#xff1f; 一、闲暇时间&#xff0c;接自由单…

DEFORMABLE DETR:用于端到端对象检测的可变形Transformer

论文&#xff1a;《DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION》 论文链接&#xff1a;https://arxiv.org/pdf/2010.04159.pdf 代码链接&#xff1a;https://github.com/fundamentalvision/Deformable-DETR 最近在目标检测领域提出了DETR&…

猿创征文|keil和Proteus使用教程

&#x1f4ac;推荐一款模拟面试、刷题神器 、从基础到大厂面试题&#xff1a;&#x1f449;点击跳转刷题网站进行注册学习 目录 一、keil的使用教程 1、新建一个项目 2、选择单片机型号 3、新建工程文件 二、Proteus的使用教程 1、新建一个工程 2、单片机型号及元器件的…

海藻酸钠-四嗪|TZ-PEG-alginate|海藻酸钠-peg-四嗪TZ

海藻酸钠-四嗪|TZ-PEG-alginate|海藻酸钠-peg-四嗪TZ 中文名称&#xff1a;海藻酸钠-聚乙二醇-四嗪 英文名称&#xff1a;TZ-PEG-alginate 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 …

【Web-CSS基础】CSS的三大特性、定位方式、静态定位、相对定位、绝对定位、浮动定位、固定定位、设置缩放动画

目录 CSS的三大特性 定位方式 静态定位 相对定位 绝对定位(absolute) 固定定位 浮动定位 粘性定位(sticky) 定位总结 综合练习 效果展示 目录 CSS的三大特性 定位方式 静态定位 相对定位 绝对定位(absolute) 固定定位 浮动定位 粘性定位(sticky) 定位总…

高分辨空间代谢组学测试的样品要求以及常见问题

高分辨空间代谢组学可实现定量检测&#xff0c;亦可定性检测&#xff0c;且可一次可同时检出多种类型的化合物&#xff0c;包括脂类、小分子代谢物、蛋白质、药物及其载体等&#xff0c;并且能够呈现出这些物质的空间分布情况。高分辨空间代谢组学测试的样品要求&#xff1a; …

五高引动三层需求 华为全屋智能3.0引领智能家居新进化

昨天,华为全屋智能3.0发布。从2020年11月发布全屋智能开始,华为不断迭代产品和体验,是全屋智能快速进化的主要推动者之一。这一次华为全屋智能3.0带来“高可靠、高掌控、高感官、高心意、高智能”的五高理念,更清晰定义了全屋智能,或者说空间智能该有的样子,这也将引领产…

GitHub榜一竟是Alibaba内部被疯狂转载的Spring全能指南?

spring相信大家都不会陌生! Spring 是目前主流的 Java Web 开发框架&#xff0c;是 Java 世界上最为成功的框架。该框架是一个轻量级的开源框架&#xff0c;具有很高的凝聚力和吸引力。 Spring 由 Rod Johnson 创立&#xff0c;2004 年发布了 Spring 框架的第一版&#xff0c;其…

自动控制原理 - 2 控制系统的数学模型 节2.7-2.10

2 控制系统的数学模型2.7 结构图的等效变换准则2.8 结构图等效变换的应用2.9 信号流图2.10 梅逊公式 2 控制系统的数学模型 2.7 结构图的等效变换准则 结构图没有直接给出系统输入与输出之间的定量关系。如何得到系统输入输出之间的传递函数&#xff0c;从而便于进一步分析系…

【LeetCode】No.78. Subsets -- Java Version

题目链接&#xff1a; 1. 题目介绍&#xff08;Subsets&#xff09; Given an integer array nums of unique elements, return all possible subsets (the power set). 【Translate】&#xff1a; 给定一个包含多个唯一元素的整数数组&#xff0c;返回所有可能的子集(幂集)。…

内部在看的Tomcat笔记,真不愧是阿里技术官

前言 SpringBoot中的Tomcat容器 SpringBoot可以说是目前最火的Java Web框架了。它将开发者从繁重的xml解救了出来&#xff0c;让开发者在几分钟内就可以创建一个完整的Web服务&#xff0c;极大的提高了开发者的工作效率。Web容器技术是Web项目必不可少的组成部分&#xff0c;…

学弟:手工测试和自动化测试的区别是啥?

一、 手工测试 1、 什么是手工测试&#xff1f; 手工测试是由测试工程师手动测试软件各项功能以发现缺陷的过程。测试人员应该从最终用户的角度出发&#xff0c;并确保所有功能都按照项目的需求文档中的说明工作。在此过程中&#xff0c;测试人员执行测试用例 并手动生成报告…

Word控件Spire.Doc 【文本】教程(11) ;如何将文本分成两列并在它们之间添加行

列被广泛用于设置页面布局&#xff0c;它可以将文本分成两列或多列&#xff0c;以便文本可以在同一页面上从一列流到下一列。使用 Spire.Doc&#xff0c;我们可以实现此功能并同时在列之间添加一条线。本文将介绍如何将文本拆分为两列并在它们之间添加行。 Spire.Doc for.NET …

图解 Redis 分布式锁,写得太好了!

分布式锁的演进 基本原理 我们可以同时去一个地方“占坑”&#xff0c;如果占到&#xff0c;就执行逻辑。否则就必须等待&#xff0c;直到释放锁。“占坑”可以去redis&#xff0c;可以去数据库&#xff0c;可以去任何大家都能访问的地方。等待可以自旋的方式。 阶段一 publi…

上海各梯队IB学校怎么选?

近日&#xff0c;随着各大国际学校开始公布秋招信息&#xff0c;第一轮秋招考试也将在本周末正式到来。 除了春招主力军A-level学校以外&#xff0c;许多IB和AP美高学校的秋招都格外收到关注。上海到底有哪些优质的IB学校&#xff1f;学生的IB成绩和升学情况如何&#xff1f;什…

中国房车产业深度调研及未来发展现状趋势预测报告

高消费人群的房车旅行新宠&#xff0c;百亿规模产业正在爆发。 随着人们收入和消费水平的提高&#xff0c;具有移动性、独立性、私密性等特点的房车旅游正成为新的热门中高端旅游产品。在小红的书里&#xff0c;与房车相关的笔记有40多万条。在Tik Tok的“房车”和“房车旅行”…

日本知名汽车零部件公司巡礼系列之株式会社104

株式会社104 业务内容&#xff1a; 汽车部件制造(刹车零件、发动机支架、其他支架等) 房屋部件制造 复印机等零件制造 公司简介&#xff1a; 成立时间&#xff1a;1978年3月 资本金&#xff1a;1000万日元&#xff08;2022年汇率约50万人民币&#xff09; 员工数&#x…