数据工厂平台9: 首页的数据关联

简介: 数据工厂平台9: 首页的数据关联

本节课继续来搞定首页的这个统计图的具体数据关联。


   这里我们先要去想,数据的来源,数据来源在哪?当然是以后的各个工具的使用次数了。那么这个使用次数我们记载到哪里呢?

   所以我们决定,先把各种工具的使用次数放在一个专用的统计表中,这样我们首页去提取数据的速度会非常快,而且也便于之后这些统计数据另做他用等等。


   所以先去models.py中新建一个表叫 DB_Statistics 统计数据的意思:

字段等代码如下:

image.png

   表的内容我们先暂定如上。现在我们去执行同步表结构的命令:

image.png

然后去admin.py中 注册:

注册后就可以在后台中看到这个表并且增删改查具体数据了。

image.png

上述写法,有些小伙伴反馈说,太麻烦了,每次新写的数据表,都要来手动写一句注册,有没有什么办法一劳永逸呢?


   这里博主想了个遍历方法可以解决这个问题,代码如下,我们删掉之前的注册代码,改成下面:

image.png

from django.contrib import admin
# Register your models here.
from myapp.models import *
import sys
import inspect
clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass)
for i in clsmembers:
    admin.site.register(eval(i[0]))

好写好这个后,我们就再也不用管这个admin.py文件了,关闭即可。

然后我们打开后台,可以看到 所有表都可以看得到,我们去给统计表增加几个假的数据,方便我们前后端调试。

image.png

image.png

image.png

然后我们现在面临的问题是,如何把这些数据给到前端展示。

也就是整条数据链路 是什么样的,难点是什么?


链路如下:

数据库---->views.py----->前端的vue----->统计图dom


分解好后,就简单多了,一共三个箭头。

我们先完成第一个箭头,在views.py中把数据从数据库拿出来。

打开views.py,修改我们目前唯一的进入Home的函数如下:

image.png

def home(request):
    res = {}
    res['user'] = request.user
    res['big_statistics'] = list(DB_Statistics.objects.filter(tool_which='big').values())
    return render(request,'home.html',res)

注意,此函数和之前变化较大,请大家详细对比。最终返回给前端的都是一个字典,所以写法改成图中,用一个res作为这个字典,来包容各个数据,这样下面return就不用再额外写了,而是直接写res即可。


注意,我删除了之前我们做实验用的links,超链接,那个超链接我们之后另做他用,不过home页面就用不到了,删除即可。


现在我们回到home.html中,找到之前的vue的函数,我们要把数据从views.py传送给vue了呢!

image.png

现在理论上我们的vue函数已经拿到了这个数据,之后我们就要想办法把数据在传送给统计图Dom层了,也就是上面的这些具体标签内。


这里我们要明白一点,就是vue的函数作用域的问题,我新建的这个 var div , 它的el 写的就是它可以管理的那个元素和其内部子元素。所以我们要给我们传送数据的那个 统计图 的id 写到这里才行,不过它貌似并没有,所以我们要先手动给它加一个:

image.png然后修改下面的vue函数部分:

image.png

然后我们其实此时已经属于和dom建立了链接,数据也可以作用上去了。但是具体怎么用,我们要先研究一番。

仔细观察这个dom结构,可以发现 目前是写死的 并列条形图:

image.png

我们当然不能让写死,应该是 自动根据我们的数据进行生成才对。


所以这里我们只保留一组作为内部循环体,删除掉其他的:

image.png

然后我们要写一个循环 ,来让这剩下的唯一一个循环:

image.png

注意v-for的位置,只能在id=‘Statistics’ 内部哦~ ,所以我选择了在li上。刷新看看目前的 页面展示:

image.png

注意,此时俩根柱子,证明我们后台的两条数据起了效果,现在就让我们来显示他们的名字吧:

image.png

改成 [[ i.tool_name ]]

也就是用这个循环体i 的too_name字段来展示在这里。可以看到效果如下:

image.png

此时工具的名字成功显示出来了。


接下来是具体的数据了, 这种时刻我们需要细心的去研究这个第三方统计图的数据在哪生效的才能去想办法修改。这里经过我的细心摸索,发现这个图预置的数据都放在这里:

image.png

没想到它会把数据写死在一个css文件,这是很出乎我意料的事情。这也解释了为什么我们点击页面上方的四个按钮,可以切换不同的数据:

image.png

所以我们这里要做的就是想办法,通过观察,我们发现,实际上这个数值填充效果,就是去修改height的高度值而已。所以我们没必要通过css文件来进行控制了,毕竟我们很难把真实的数据传送给css文件。

所以我们干脆 截断 这个第三方统计图的数据流,也就是删除顶部的四个按钮,和这个css文件中的这个对应的四个数据的部分。

image.png

image.png

代码修改成如下:注意俩个br换行符

image.png

效果如下:

image.png

好,现在我们就需要重新设计这个高度了,我们可以直接通过vue控制这个

<div class="bar-inner" style="height: px"></div>

DIV的height高度。


关于具体高度多少合适,我们之后需要具体计算,现在我们先打通这个数据链路:

image.png

注意写法!!!

:style='{height:i.counts+"px"}'

vue的循环内,想修改style的属性并且带变量,就要这么写哦~


好看看效果,为了方便看到具体使用次数,我们在名字span里也放上了这个i.counts:

image.png

注意,150px 和 180px 看起来都成功显示了。但是我们不能这么简单的计算,毕竟万一出现个 30000px的时候,我们屏幕都放不下了怎么办?


所以这里我们还是得想办法用百分比来计算出合适的高度才行。


既然要计算具体使用次数对应的百分比。就需要俩个数:

当前/总数 * 100    就是最终的 x%


这里我们就要改成如下的代码,就变成了 百分比:

image.png

现在,我们面临的问题就是,这个sumx ,应该是多少的问题了,它是一个动态的,我们不能写死,它是每次进入首页的这些统计数据加起来 的和。


我们这里俩种方案,一种是在views.py中求出来给到前端,python我们很擅长。


另一种方案 是在vue的js中求出来,然后当做变量,让dom中直接使用。


显然,我们这个系列要锻炼大家的vue,所以用第二种方案。

这里我们要学习 vue的一个功能:computed

  • computed用来监控自己定义的变量,该变量不在data里面声明,直接在computed里面定义,然后就可以在页面上进行双向数据绑定展示出结果或者用作其他处理;
  • computed比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化,举例:购物车里面的商品列表和总金额之间的关系,只要商品列表里面的商品数量发生变化,或减少或增多或删除商品,总金额都应该发生变化。这里的这个总金额使用computed属性来进行计算是最好的选择


这个computed 简单来说,就是我们可以用它来声明变量和进行计算。而且它和dom关联后,还能起到监控实时变化的作用。


具体用法如下:

image.png

如上图,我新定义了一个变量sumx,并且在dom中使用了它。

sumx后面接了一个function,意思是一个匿名函数。这个函数最终要返回一个值,这值就是变量sumx的值了,不过这里我们先写死500,然后看看效果:

image.png

可以看到,180 / 500 * 100 = 36  这个计算是正确的,并且成功搭建了这个变量的数据链路。


我们现在只剩最后一步了,就是在vue.js中 真实的遍历统计数据表来求得总数

image.png

注意,这里其实可以写js代码的哦~所以说js可不是没用的语言,selenium或者vue可都是在这基础上发展的,当封装的框架弄不了的时候,js这个万能语言就可以大显身手了,我的前一个系列接口测试平台就全是js哦,也是为了给大家打好基础,拉高上限。


看看计算后的最终结果:

image.png

上图可以看到,计算的结果完全正确。证明我们的实验成功了~


不过这里还是有一点点小问题,就是高度虽然计算成功,但是图上看的却还是都偏矮了一些!!!,这个第三方统计图,不知道又藏了什么坑。


不过这可难不倒我测试开发工程师。毕竟js/jq/vue/css/html 都略懂才是个勉强合格的测开嘛~。


经过测量,足足差了将近8.9%的高度,所以我们给最终结果 都补上8.9%即可。

image.png

有时候,解决问题,并不一定要真的去从根本上解决,如果性价比差距很大的情况来说,表层解决也可以。

效果如下:

现在俩个柱子高度加起来就正好是100%了基本。









相关文章
|
1月前
|
Web App开发 人工智能 自然语言处理
Playwright MCP浏览器自动化指南
本文教你如何通过Playwright MCP让AI直接操作浏览器,自动运行和调试代码,无需手动切换界面。只需简单配置,即可用自然语言指挥AI完成页面操作、问题排查与自主修复,真正实现自动化高效开发。
|
SQL 存储 数据采集
数据中台建设方法论
数据中台建设方法论
|
资源调度 JavaScript
nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
8228 2
|
Kubernetes Dubbo Nacos
nacos常见问题之Nacos国内下载Nacos 太慢如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
2440 3
|
SQL 缓存 监控
SpringBoot整合阿里巴巴Druid数据源
Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。 Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。 本文主要讲解如何整合Druid数据源及Druid常用配置项和详解
5867 1
SpringBoot整合阿里巴巴Druid数据源
Vue2时间轴(横向)
该横向时间轴组件 `HorizonTimeLine` 可自定义时间轴数据 (`timelineData`) 和初始选中年份 (`activeYear`)。通过点击不同的年份,可以改变当前激活的年份,并有相应的视觉反馈。该组件支持均匀自适应排列,且易于在其他页面中引入和使用。
999 0
Vue2时间轴(横向)
|
人工智能 关系型数据库 MySQL
基于阿里云的PolarDB MySQL版实现AI增强数据管理
本文将介绍如何利用阿里云的PolarDB MySQL版结合AI技术,实现数据管理的自动化和智能化。
933 0
|
12月前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
279 3
|
机器学习/深度学习 编解码 PyTorch
CVPR 2023 | 主干网络FasterNet 核心解读 代码分析
本文分享来自CVPR 2023的论文,提出了一种快速的主干网络,名为FasterNet。核心算子是PConv,partial convolution,部分卷积,通过减少冗余计算和内存访问来更有效地提取空间特征。
9817 58