vue3-实战-14-管理后台-数据大屏-男女比例-年龄比例-地图以及轨迹-趋势折线图等

news2024/9/20 5:34:49

目录

1-男女比例【柱状图】

1.1-大屏男女比例原型需求

1.2-结构样式逻辑开发

2-年龄比例-饼图

2.1-原型需求分析

2.2-结构样式逻辑开发

3-中国地图和运行轨迹

3.1-地图组件需求原型

3.2-结构样式逻辑开发

4-未来7天游客数量趋势图-折线图

5-右侧的相关图

6-总结


1-男女比例【柱状图】

1.1-大屏男女比例原型需求

 这里主要是用到echart的横向柱状图,需求还是比较简单。

1.2-结构样式逻辑开发

文件src\views\screen\components\sex\index.vue结构如下:

文件src\views\screen\components\sex\index.vue核心业务逻辑如下:
       当页面挂载完成,需要初始化echarts实例,然后进行相关的项设置。这里男女比例是58%和42%;其实是两个横向的柱状图,我们在男性数据设置为58,女性数据设置为100;然后调整女性柱状图位置barGap为-100%;这样我们就把男性的遮住了,这里我们使用属性z将男性的数据比例展示出来。

import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';
//获取图形图标的DOM节点
let charts = ref();
onMounted(() => {
  //初始化echarts实例
  let mycharts = echarts.init(charts.value);
  //设置配置项
  mycharts.setOption({
    //组件标题
    title: {
      text: '男女比例',//主标题
      textStyle: {//主标题颜色
        color: 'skyblue'
      },
      left: '40%'
    },
    //x|y
    xAxis: {
      show: false,
      min: 0,
      max: 100
    },
    yAxis: {
      show: false,
      type: 'category'
    },
    series: [
      {
        type: 'bar',
        data: [58],
        barWidth: 20,
        z: 100,
        itemStyle: {
          color: 'skyblue',
          borderRadius: 20
        }
      }
      ,
      {
        type: 'bar',
        data: [100],
        barWidth: 20,
        //调整女士柱条位置
        barGap: '-100%',
        itemStyle: {
          color: 'pink',
          borderRadius: 20
        }
      }
    ],
    grid: {
      left: 0,
      top: 0,
      right: 0,
      bottom: 0
    }
  });
})

文件src\views\screen\components\sex\index.vue样式如下:

<style scoped lang="scss">
.box1 {
  width: 100%;
  height: 100%;
  background: url(../../images/dataScreen-main-cb.png) no-repeat;
  background-size: 100% 100%;
  margin: 20px 0px;

  .title {
    margin-left: 20px;
    margin-top: 20px;

    p {
      color: white;
      font-size: 20px;
    }
  }

  .sex {
    display: flex;
    justify-content: center;

    .man {
      margin: 20px;
      width: 111px;
      height: 115px;
      background: url(../../images/man-bg.png) no-repeat;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .women {
      margin: 20px;
      width: 111px;
      height: 115px;
      background: url(../../images/woman-bg.png) no-repeat;
      display: flex;
      justify-content: center;
      align-items: center;
    }

  }

  .rate {
    display: flex;
    justify-content: space-between;
    color: white;
  }

  .charts {
    height: 100px;
  }
}
</style>

2-年龄比例-饼图

2.1-原型需求分析

       看到这个原型需求跟上面的性别的结构类似,只不过这里是饼图,我们需要使用到echarts里面的饼图。

2.2-结构样式逻辑开发

      由于本章节的处理和上章节差不多,结构类似,echarts处理简单,所以这里不做过多的分析和处理,直接贴出代码。

<template>
    <div class="box2">
        <div class="title">
            <p>年龄比例</p>
            <img src="../../images/dataScreen-title.png" alt="">
        </div>
        <!-- 图形图标的容器 -->
        <div class="charts" ref="charts"></div>
    </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue';
//引入echarts
import * as echarts from 'echarts';
let charts = ref();
//组件挂载完毕初始化图形图标
onMounted(() => {
    let mychart = echarts.init(charts.value);
    //设置配置项
    let option = {
        tooltip: {
            trigger: 'item'
        },
        legend: {
            right: 30,
            top: 40,
            orient: 'vertical',//图例组件方向的设置
            textStyle: {
                color: 'white',
                fontSize: 14
            }
        },
        series: [
            {
                name: 'Access From',
                type: 'pie',
                radius: ['40%', '70%'],
                avoidLabelOverlap: false,
                itemStyle: {
                    borderRadius: 10,
                    borderColor: '#fff',
                    borderWidth: 2
                },
                label: {
                    show: true,
                    position: 'inside',
                    color:'white'
                },

                labelLine: {
                    show: false
                },
                data: [
                    { value: 1048, name: '军事' },
                    { value: 735, name: '新闻' },
                    { value: 580, name: '直播' },
                    { value: 484, name: '娱乐' },
                    { value: 300, name: '财经' }
                ]
            }
        ],
        //调整图形图标的位置
        grid: {
            left: 0,
            top: 0,
            right: 0,
            bottom: 0
        }
    };
    mychart.setOption(option);
});
</script>
<script lang="ts">
export default {
  name: 'Age',
}
</script>

<style scoped lang="scss">
.box2 {
    width: 100%;
    height: 100%;
    background: url(../../images/dataScreen-main-cb.png) no-repeat;
    background-size: 100% 100%;

    .title {
        margin-left: 20px;
        // margin-top: 20px;

        p {
            color: white;
            font-size: 20px;
        }
    }

    .charts {
        height: 260px;
    }

}
</style>

3-中国地图和运行轨迹

3.1-地图组件需求原型

       在大屏中间的上面是地图组件,我们单独将这部分抽取为一个组件。首先,我们要获取到中国地图的经纬度坐标系,这个数据我们可以从网站DataV.GeoAtlas地理小工具系列中获取到相关的json数据。


ps:由于echarts官方网站是国外网站,打开速度很慢,我们可以使用网址来打开,这个打开速度快,而且社区里面有很多已经设置好的demo,到时候直接获取就行

 

 由于需要制定轨迹,我们需要使用的到地图中的一个系列 type: 'lines',//航线的系列。

3.2-结构样式逻辑开发

      文件src\views\screen\components\map\china.json中的json是从我们上面的阿里云获取,存放在本地。
       文件:src\views\screen\components\map\index.vue是地图组件的内容。

<template>
    <div class="box4" ref="map">
        
    </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';
//引入中国地图的JSON数据
import chinaJSON from './china.json'
//获取DOM元素
let map = ref();
//注册中国地图
echarts.registerMap('china', chinaJSON as any)
onMounted(() => {
    let mychart = echarts.init(map.value);
    //设置配置项
    mychart.setOption({
        //地图组件
        geo: {
            map: 'china',//中国地图
            roam: true,//鼠标缩放的效果
            //地图的位置调试
            left: 150,
            top: 150,
            right: 150,
            zoom:1.2,
            bottom: 0,
            //地图上的文字的设置
            label: {
                show: true,//文字显示出来
                color: 'white',
                fontSize: 14
            },

            itemStyle: {
                //每一个多边形的样式
                color: {
                    type: 'linear',
                    x: 0,
                    y: 0,
                    x2: 0,
                    y2: 1,
                    colorStops: [{
                        offset: 0, color: 'red' // 0% 处的颜色
                    }, {
                        offset: 1, color: 'blue' // 100% 处的颜色
                    }],
                    global: false // 缺省为 false
                },
                opacity: .8
            },
            //地图高亮的效果
            emphasis: {
                itemStyle: {
                    color: 'red'
                },
                label: {
                    fontSize: 40
                }
            }
        },
        //布局位置
        grid: {
            left: 0,
            top: 0,
            right: 0,
            bottom: 0
        },
        series: [
            {
                type: 'lines',//航线的系列
                data: [
                    {
                        coords: [
                            [116.405285, 39.904989],  // 起点
                            [119.306239, 26.075302]   // 终点

                        ],
                        // 统一的样式设置
                        lineStyle: {
                            color: 'orange',
                            width: 5
                        }
                    },
                    {
                        coords: [
                            [116.405285, 39.904989],  // 起点
                            [114.298572,30.584355]   // 终点

                        ],
                        // 统一的样式设置
                        lineStyle: {
                            color: 'yellow',
                            width: 5
                        }
                    }
                ],
                //开启动画特效
                effect: {
                    show: true,
                    symbol: 'arrow',
                    color: 'black',
                    symbolSize: 10
                }
            }
        ]
    })

});
</script>
<script lang="ts">
export default {
  name: 'Map',
}
</script>

<style scoped></style>

4-未来7天游客数量趋势图-折线图

      我们看到需求原型是一个折线图,需要用到echarts里面的折线图type: 'line'系列,我们主要要对配置项进行设置。标题设置,x轴的均匀分布,两侧不留白,折线圆润以及填充图的颜色等。文件src\views\screen\components\line\index.vue完整内容如下:

<template>
    <div class="box5">
        <div class="title">
            <p>未来七天游客数量趋势图</p>
            <img src="../../images/dataScreen-title.png" alt="">
        </div>
        <div class="charts" ref='line'></div>
    </div>
</template>

<script setup lang="ts">
import * as echarts from 'echarts';
import { ref, onMounted } from 'vue';
//获取图形图标的节点
let line = ref();
onMounted(() => {
    let mycharts = echarts.init(line.value);
    //设置配置项
    mycharts.setOption({
        //标题组件
        title: {
            text: '访问量'
        },
        //x|y轴
        xAxis: {
            type: 'category',//x轴均匀分布
            boundaryGap: false,//两侧不留白
            //分割线不要
            splitLine: {
                show: false
            },
            data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
            //轴线的设置
            axisLine: {
                show: true
            },
            //刻度
            axisTick: {
                show: true
            }
        },
        yAxis: {
            splitLine: {
                show: false
            },
            //轴线的设置
            axisLine: {
                show: true
            },
            //刻度
            axisTick: {
                show: true
            }
        },
        grid: {
            left: 40,
            top: 0,
            right: 20,
            bottom: 20
        },
        //系列
        series: [
            {
                type: 'line',
                data: [120, 1240, 66, 2299, 321, 890, 1200],
                smooth: true,//平滑曲线的设置
                //区域填充样式
                areaStyle: {
                    color: {
                        type: 'linear',
                        x: 0,
                        y: 0,
                        x2: 0,
                        y2: 1,
                        colorStops: [{
                            offset: 0, color: 'red' // 0% 处的颜色
                        }, {
                            offset: 1, color: 'blue' // 100% 处的颜色
                        }],
                        global: false // 缺省为 false
                    }
                }
            }
        ]
    })
})
</script>
<script lang="ts">
export default {
  name: 'Line',
}
</script>

<style scoped lang="scss">
.box5 {
    width: 100%;
    height: 100%;
    background: url(../../images/dataScreen-main-cb.png) no-repeat;
    background-size: 100% 100%;
    margin: 0px 20px;

    .title {
        margin-left: 10px;

        p {
            color: white;
            font-size: 20px;
        }
    }

    .charts {
        height: calc(100% - 40px);
    }

}
</style>

5-右侧的相关图

      右侧的一些图,开发的方式和逻辑和前面的差不多,这里我们不再进行开发和阐述,大家可以参考echarts官网去查看相关的配置进行开发。

6-总结

       在开发的工程中,我们先从宏观在父组件中对当前页面进行拆分各种组件,定义好布局和格式,父组件中基本不涉及到echarts各种系列,图形图表的操作;只是对页面的大小和缩放进行相关处理,其他的具体工作我们在每个子组件中开发,然后我们就专注于我们各种子组件开发,这样最后在父组件中引入各种子组件,我们的数据大屏工作才可以完整展示。文件src\views\screen\index.vue父组件的内容如下:

<template>
    <div class="container">
        <!-- 数据大屏展示内容区域 -->
        <div class="screen" ref="screen">
            <!-- 数据大屏顶部 -->
            <div class="top">
                <Top />
            </div>
            <div class="bottom">
                <div class="left">
                    <Tourist class="tourist"></Tourist>
                    <Sex class="sex"></Sex>
                    <Age class="age"></Age>
                </div>
                <div class="center">
                    <Map class="map"></Map>
                    <Line class="line"></Line>
                </div>
                <div class="right">
                    <Rank class="rank"></Rank>
                    <Year class="year"></Year>
                    <Counter class="count"></Counter>
                </div>
            </div>
        </div>
    </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from "vue";
//引入顶部的子组件
import Top from './components/top/index.vue';
//引入左侧三个子组件
import Tourist from './components/tourist/index.vue';
import Sex from './components/sex/index.vue';
import Age from './components/age/index.vue'

//引入中间两个子组件
import Map from './components/map/index.vue';
import Line from './components/line/index.vue';

//引入右侧三个子组件
import Rank from './components/rank/index.vue';
import Year from './components/year/index.vue';
import Counter from './components/couter/index.vue'
//获取数据大屏展示内容盒子的DOM元素
let screen = ref();
onMounted(() => {
    screen.value.style.transform = `scale(${getScale()}) translate(-50%,-50%)`
});
//定义大屏缩放比例
function getScale(w = 1920, h = 1080) {
    const ww = window.innerWidth / w;
    const wh = window.innerHeight / h;
    return ww < wh ? ww : wh;
}
//监听视口变化
window.onresize = () => {
    screen.value.style.transform = `scale(${getScale()}) translate(-50%,-50%)`
}


</script>

<style scoped lang="scss">
.container {
    width: 100vw;
    height: 100vh;
    background: url(./images/bg.png) no-repeat;
    background-size: cover;

    .screen {
        position: fixed;
        width: 1920px;
        height: 1080px;
        left: 50%;
        top: 50%;
        transform-origin: left top;

        .top {
            width: 100%;
            height: 40px;
        }

        .bottom {
            display: flex;

            .right {
                flex: 1;
                display: flex;
                flex-direction: column;
                margin-left: 40px;

                .rank {
                    flex: 1.5;
                }

                .year {
                    flex: 1;

                }

                .count {
                    flex: 1;
                }
            }

            .left {
                flex: 1;
                height: 1040px;
                display: flex;
                flex-direction: column;

                .tourist {
                    flex: 1.2;
                }

                .sex {
                    flex: 1;

                }

                .age {
                    flex: 1;
                }
            }

            .center {
                flex: 1.5;
                display: flex;
                flex-direction: column;

                .map {
                    flex: 3;
                }

                .line {
                    flex: 1;
                }
            }
        }
    }
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字空间-服务器应用监控系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 随着各行业信息化建设的不断深入发展&#xff0c;单独的服务器已经再无法满足企业的需求。网络和应用规模日趋扩大&#xff0c;服务器网络集群大量应用于中、小型企业中&#xff0c;服务器性能监控和日常维护变…

金属元素螯合剂:(S)-DOTAGA-(COOt-Bu)4,1023889-20-4,可应用于制备纳米材料

文章关键词&#xff1a;金属元素螯合剂&#xff0c;大环配体&#xff0c;DOTA标记(COOt-Bu)4 ●中文名&#xff1a;(S)-DOTAGA-四叔丁酯 ●英文名&#xff1a;(S)-DOTAGA-(COOt-Bu)4 ●外观以及性质&#xff1a; 西安凯新生物科技有限公司供应的​(S)-DOTAGA-(COOt-Bu)4中DOT…

vue项目 ‘npm run dev‘ 报错 npm ERR! errno 134

npm ERR! errno 134 表示 npm 执行出现了致命错误&#xff0c;通常是由于内存不足或程序崩溃导致的。 这时需要我们分配更多的内存给vue-cli-service serve 解决方案 1. 安装increase-memory-limit cross-env依赖 npm install increase-memory-limit cross-env increase-mem…

Java面试题及答案整理( 2023年 6 月最新版,持续更新)

秋招金九银十快到了&#xff0c;发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全~这套互联网 Java 工程师面试题包括了&#xff1a;MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Spring…

其他品牌的触控笔能用在ipad上?好用不贵手写笔推荐

任何一种产品&#xff0c;都是有好有坏&#xff0c;就像苹果的Pencil&#xff0c;因为受到了消费者的欢迎&#xff0c;所以也推出了一些新的产品&#xff0c;比如平替电容笔&#xff0c;这些产品&#xff0c;有的质量好&#xff0c;有的价格低&#xff0c;被消费者所接受。但也…

cpu个数、核数、超线程的一些概念

cpu个数&#xff1a; 物理cpu个数&#xff1a;物理CPU数就是实际服务器中插槽上的CPU个数&#xff0c;主板上实际插入的cpu数量 逻辑cpu个数&#xff1a;物理CPU个数 * 每颗物理CPU的核数 * 超线程数 cpu核数&#xff1a; 每颗物理CPU可以有1个或者多个物理内核&#xff0c;通…

git上传文件到远程分支

1、进入文件目录&#xff08;kernel&#xff09;执行make distclean 清除配置文件 2、查看所在分支 git branch -a 3、查看远程分支 git branch -r 3、添加文件到分支 git add . git commit -m "XXXX" 4、上传文件 git push -u origin develop-camera

Spring Boot 中的 @PostMapping 注解,如何使用

Spring Boot 中的 PostMapping 注解 在 Spring Boot 中&#xff0c;我们经常需要编写 RESTful Web 服务&#xff0c;以便于客户端与服务器之间的通信。为了简化 RESTful Web 服务的开发&#xff0c;Spring Boot 提供了 PostMapping 注解&#xff0c;它可以让我们更方便地编写 …

结合uview实现倒计时

实现场景&#xff1a;试卷答题&#xff0c;点击开始考试&#xff0c;出现倒计时&#xff0c;刷新倒计时就没有了 实现思路&#xff1a; 关键点在于进来以后获取当前时间计算出结束时间 假设接口是20分钟以后倒计时结束&#xff0c;下面就算出了都是秒的时候倒计时结束了 new …

Jmeter性能压测报错address already in use:connect

目录 解决方法一&#xff1a; 解决方法二&#xff1a; 报错截图如下&#xff1a; 原因分析&#xff1a; 这个问题的原因是windows端口被耗尽了&#xff08;默认1024-5000&#xff09;&#xff0c;而且操作系统要 2~4分钟才会重新释放这些端口&#xff0c;所以可以增加window…

龙讯旷腾Q-Flow和Q-Studio新功能,在线进行材料计算

Q-Flow和Q-Studio功能升级 Q-Flow&#xff08;在线可视化提交任务工具&#xff09;以及Q-Studio&#xff08;在线建模工具&#xff09;依托Mcloud平台免费向用户开放使用。告别Linux编辑代码提交任务的模式&#xff0c;Q-Flow可在浏览器里通过拖拽图形化的第一性原理计算功能组…

【刷题笔记】牛客网:删除公共字符

1、题目描述 2、题目分析 具体思路如下&#xff1a; 预先定义String result ""作为输出结果 1、遍历str2字符串中的每个字符&#xff0c;将其存储到HashMap中&#xff08;其中key为单个字符&#xff0c;value为该字符出现的次数&#xff09; 2、遍历str1字符串中的…

SOLIDWORKS装配体轻量化处理工具-SpeedPak

大部分SOLIDWORKS用户都知道&#xff0c;在进行装配体建模时&#xff0c;零件数量越多、零件建模越复杂&#xff0c;都会越影响软件性能。在大部分的情况下&#xff0c;使用轻化、大型装配体模式这类打开方式就可以将输入进软件的模型信息进行简化&#xff0c;从而提升软件运行…

在conda中仍然调用了home/.local路径下的包。which is显示的不是conda路径,而是home路径。

如上图所示&#xff0c;当前在conda环境中。 调用fitlog时&#xff0c;which is显示的不是conda路径&#xff0c;而是home路径。查看python&#xff0c;可以看到显示的是conda路径。 按理说&#xff0c;在conda环境应该调用conda路径下的包&#xff0c;这个fitlog居然调用hom…

git push 到 github 出现 fatal: Authentication failed 的处理方案

花了不少时间&#xff0c;记录一下这个问题。 问题截图&#xff1a; 解决方式&#xff08;点击链接有官方文档说明&#xff09;&#xff1a; 将远程 URL 从 SSH 切换到 HTTPS&#xff08;已经是https的直接忽略&#xff09;生成细粒度token安装Github CLI缓存token 使用 g…

小程序技术分享| 小程序集成 pixi 渲染引擎

开发小程序时一些特殊场景需要使用canvas,但canvas渲染一些特效时太过耗费性能造成页面卡顿并且展示效果也不好(拖动卡顿不连贯等)&#xff0c;因此使用渲染引擎来满足需求。本文在小程序中使用 pixi 渲染引擎。 引入改造后的 pixi pixi与小程序不是很匹配&#xff0c;需要进…

K8s(Kubernetes)学习(二):k8s集群搭建

k8s集群搭建 minikube 只是一个 K8S 集群模拟器&#xff0c;只有一个节点的集群&#xff0c;只为测试用&#xff0c;master 和 worker 都在一起。裸机安装 至少需要两台机器&#xff08;主节点、工作节点个一台&#xff09;&#xff0c;需要自己安装 Kubernetes 组件&#xff…

基于javaweb实现新闻公布系统,ssm+mysql实现新闻发布平台

使用说明 src/main文件中存放的是前端代码&#xff0c;target文件夹中存放的是后端代码&#xff0c;.idea文件夹是存储IntelliJ IDEA项目的配置信息&#xff0c;主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息&#xff0c;.…

CnOpenData中国各级政府税收分成数据

一、数据简介 “测算中国各级政府间财政收入划分&#xff0c;从数据上把握政府收入的分级分配的规律&#xff0c;是剖析中国地方政府行为及其经济影响的重要基础。本文结合中国政府间财政关系的特点&#xff0c;详细测算多层级政府、多口径财政收入的分配状况&#xff0c;构建了…

【unity之UI专题】GUI(IMGUI)详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…