41.vue3.0项目创建
1.电脑上安装node.js
下载自己对应操作系统版本 安装即可
2.全局下载项目脚手架
打开cmd 输入 npm install -g @vue/cli
3.创建项目
把cmd的路径切换到指定路径下 vue create 项目名
(3-1)选择项目配置模板 选择第三项自主选择你项目所需的配置
Please pick a preset:
Default ([Vue 2] babel, eslint) vue cli 2 默认的项目模板
Default (Vue 3 Preview) ([Vue 3] babel, eslint) vue cli 3 默认的项目模板
❯ Manually select features
(3-2)选择项目配置选项 勾选所需要的模块
? Check the features needed for your project:
◉ Choose Vue version
◉ Babel
◯ TypeScript
◯ Progressive Web App (PWA) Support
◉ Router
◉ Vuex
❯◉ CSS Pre-processors
◉ Linter / Formatter
◯ Unit Testing
◯ E2E Testing
(3-3)选择想要开始项目的Vue.js版本 选择 3.x
? Choose a version of Vue.js that you want to start the project with
2.x
❯ 3.x (Preview)
(3-4)是否用history模式来创建路由 直接回车默认项目
? Use history mode for router? (Requires proper server setup for index fallback in pr
oduction) (Y/n)
(3-5)选择CSS 预处理类型 选择LESS
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default):
Sass/SCSS (with dart-sass)
Sass/SCSS (with node-sass)
❯ Less
Stylus
(3-6) 选择代码校验会犯 选择第一项 只进行报错提醒
? Pick a linter / formatter config: (Use arrow keys)
❯ ESLint with error prevention only
ESLint + Airbnb config
ESLint + Standard config
ESLint + Prettier
(3-7)询问项目的什么时候校验格式(第一个是保存时,第二个是提交时)
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to
invert selection)
❯◉ Lint on save
◯ Lint and fix on commit
(3-8)询问项目的配置文件放在那里 (1.独立文件 2.package.json中)
? Where do you prefer placing config for Babel, ESLint, etc.? (Use arrow keys)
❯ In dedicated config files
In package.json
(3-9)是否保存配置当做后续项目的可选配置 我们选择不保存
? Save this as a preset for future projects? (y/N)
4运行项目
把cmd的路径切换到你项目名下
npm run serve 启动项目
42.项目初始化?
1.删除src文件夹下的cpmponents文件夹下的Helloword.vue文件
2.删除vuews下的两个.vue文件
3.在views中新建我们的页面文件 homePage.vue文件
<template>
<div>
我是页面
</div>
</template>
<script>
export default {
}
</script>
<style>
</style>
4.修改router下的index.js配置路由文件
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/page',
name: 'About',
component: () => import('../views/homePage.vue')
},
// 设置路由重定向
{
path:"/",
redirect:"/page"
}
]
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
})
export default router
5修改根组件默认显示内容与初始化项目样式
<template>
<router-view/>
</template>
<style lang="less">
*{
margin: 0px;
padding: 0px;
box-sizing: border-box;//border-box 告诉浏览器去理解你设置的边框和内边距的值是包含在width内的。
}
</style>
到此为止项目已经初始化完毕
43项目分辨率响应式分析与实施
项目基本结构
整体轮廓分为上下结构
在下半部分区域分为左中右结构
技术栈
- vue3.0+vue-router4.0+axios
- flex布局
- LESS
- rem屏幕适配
- echarts5.0
44.项目分辨率响应式创建
我们的项目是需要根据页面的大小改变 做出响应式改变的 所以我们可以使用
我们可以使用 第三方插件flexible.js帮助我们修改html根节点的font-size大小 从而控制当前页面的rem (会根据页面的html根节点font-size大小改变而改变) 样式改变
flexible.js
flexible.js web自适应方案 阿里团队开源的一个库。使用flexible.js轻松搞定各种不同的移动端设备兼容自适应问题。
1.下载 npm i -S lib-flexible
2.在main.js中进行配置
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 引用
import 'lib-flexible/flexible.js'
createApp(App).use(store).use(router).mount('#app')
3.修改flexible配置
因为默认情况下只会在540px分辨率一下生效 所以我们需要根据我们的项目分辨率进行调整
在node_module/lib-flexible/flexible.js中修改代码如下
// 修改原始的
// if (width / dpr > 540) {
// width = 540 * dpr;
// }
// var rem = width / 10;
// 修改成为
// 最小400px,最大适配2560px
if (width / dpr < 400) {
width = 400 * dpr;
} else if (width / dpr > 2560) {
width = 2560 * dpr;
}
// 设置成24等份,设计稿时1920px的,这样1rem就是80px (1920/24=80)方便使用
var rem = width / 24;
这个时候重启项目大家打开浏览器调试器 即可发现在浏览器大小改变的时候 在html根节点上会自动设置一个font-size
cssrem插件
我们在写代码的时候发现如果我们都根据80px为1rem在编写代码的时候转换非常的麻烦 所以我们可以在vscode中安装一个cssrem的插件帮助我们进行转换 这样一来开发过程中会更加的方便
配置方式
在vscode扩展中找到 cssrem插件 最新名字叫px to rem & rpx 安装到vscode中 点击右下角设置
修改Root Font Size(基准font-size) 配置项为80即可
测试与使用
在写css的时候就会出现相应的rem转换结果
45.项目顶部信息条创建
1.设置背景图
把图片方法assets文件夹中 在app.vue中设置背景图
body{
background: url('~@/assets/bg.jpg') top center no-repeat;
}
2.设置标题文字
<template>
<div>
<header>
<h1>大数据可视化--vue3.0与echarts</h1>
</header>
</div>
</template>
<script>
export default {
}
</script>
<style lang="less">
header{
height: 1rem;
width: 100%;
/* 设置一个半透明淡蓝色 */
background-color: rgba(0, 0, 255, .2);
/* 把标题文字样式设置 */
h1{
font-size: .375rem;
color:#fff;
text-align: center;
line-height: 1rem;
}
}
</style>
46.页面主体创建
主体部分是下面的左中右
大容器
1.创建一个大容器来容纳绿色 红色 黄色三个区域
在homepage.vue页面中创建一个大容器
<template>
<div>
<header>
<h1>大数据可视化--vue3.0与echarts</h1>
</header>
<!-- 大容器 -->
<section class=“container”>
</section>
</div>
</template>
创建容器样式
<style lang="less">
header{
height: 1rem;
width: 100%;
/* 设置一个半透明淡蓝色 */
background-color: rgba(0, 0, 255, .2);
/* 把标题文字样式设置 */
h1{
font-size: .375rem;
color:#fff;
text-align: center;
line-height: 1rem;
}
}
// 主体容器样式
.container{
// 这里就不需要设置使用rem了 使用rem那么页面就会根据html根结点大小改变而改变了
min-width: 1200px;
max-width: 2048px;
margin: 0 auto;
// 盒子上10px 左右10px 下0的外边距
padding: .125rem .125rem 0;
// 测试完成看到样式就删除掉
height: 500px;
background-color: gray;
}
</style>
左中右
接下来我们可以创建左中右这三个部分。那么他们的占比分别是3 5 3 这个时候我们可以使用flex布局来分割他们所占的区块大小
1.创建左中右三个页面容器
<template>
<div>
<header>
<h1>大数据可视化--vue3.0与echarts</h1>
</header>
<!-- 大容器 -->
<section class='container'>
<!-- 左容器 -->
<section class='itemLeft'>1</section>
<!-- 中容器 -->
<section class='itemCenter'>2</section>
<!-- 右容器 -->
<section class='itemRight'>3</section>
</section>
</div>
</template>
2.设置样式
<style lang="less">
header{
height: 1rem;
width: 100%;
/* 设置一个半透明淡蓝色 */
background-color: rgba(0, 0, 255, .2);
/* 把标题文字样式设置 */
h1{
font-size: .375rem;
color:#fff;
text-align: center;
line-height: 1rem;
}
}
// 主体容器样式
.container{
// 这里就不需要设置使用rem了
min-width: 1200px;
max-width: 2048px;
margin: 0 auto;
// 盒子上10px 左右10px 下0的外边距
padding: .125rem .125rem 0;
display: flex;//父容器设置flex布局才能在子元素使用
// 设置左中右的占比 但是不要忘了在父容器要设置flex
.itemLeft,.itemRight{
flex: 3;
}
.itemConter{
flex: 5;
}
}
</style>
运行之后会发现 页面的左和右占比是页面各的3份。而中间是占比5份
左右图表展示区块容器样式
大家会发现我们要展示的4个区域的容器效果是一样的。所以我们可以剥离成一个组件 然后重复调用即可。并且在其中放置slot槽口 后期方便向容器内插入图表
创建容器组件
在components文件夹下创建 itemPage.vue
<template>
<div>
容器组件
</div>
</template>
<script>
export default {
}
</script>
<style>
</style>
编写样式与插槽
<template>
<div class='item'>
<!-- 设置插槽 -->
<slot/>
</div>
</template>
<script>
export default {
}
</script>
<style>
.item{
/* 高度410px */
height: 5.125rem;
border: 1px solid blue;
/* 外边距20px */
margin: .25rem;
background-color: rgba(13, 130, 255, 0.851);
}
</style>
在views下的homePage中引用调用使用
<template>
<div>
<header>
<h1>大数据可视化--vue3.0与echarts</h1>
</header>
<!-- 大容器 -->
<section class='container'>
<!-- 左容器 -->
<section class='itemLeft'>
<!-- 使用组件 -->
<ItemPage/>
<ItemPage/>
</section>
<!-- 中容器 -->
<section class='itemCenter'>2</section>
<!-- 右容器 -->
<section class='itemRight'>
<!-- 使用组件 -->
<ItemPage/>
<ItemPage/>
</section>
</section>
</div>
</template>
<script>
// 引用组件
import ItemPage from "@/components/itemPage.vue"
export default {
components:{
ItemPage
}
}
</script>
运行之后大家会发现左右区块就展现出4个容器
左右每个区块内容插入容器槽口
我们一共4个图标 使用一个公共的组件容器 所以我们编写这4个不同图表的组件并且 分别显示
1.创建4个组件 在components下 itemOne.vue等等 一共4个
然后在4个文件中分别设置相关内容与样式(每个图表的标题不一样要修改)
<template>
<div>
<h2>图表1</h2>
<div class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
export default {
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
在homePage.vue中引用调用使用这4个组件
<template>
<div>
<header>
<h1>大数据可视化--vue3.0与echarts</h1>
</header>
<!-- 大容器 -->
<section class='container'>
<!-- 左容器 -->
<section class='itemLeft'>
<!-- 使用组件 -->
<ItemPage><itemOne/></ItemPage>
<ItemPage><itemTwo/></ItemPage>
</section>
<!-- 中容器 -->
<section class='itemCenter'>2</section>
<!-- 右容器 -->
<section class='itemRight'>
<!-- 使用组件 -->
<ItemPage><itemThree/></ItemPage>
<ItemPage><itemFour/></ItemPage>
</section>
</section>
</div>
</template>
<script>
// 引用组件
import ItemPage from "@/components/itemPage.vue"
// 左右4个小组件的引用
import itemOne from "@/components/itemOne.vue"
import itemTwo from "@/components/itemTwo.vue"
import itemThree from "@/components/itemThree.vue"
import itemFour from "@/components/itemFour.vue"
export default {
components:{
ItemPage,itemOne,itemTwo,itemThree,itemFour
}
}
</script>
中间地图区域容器样式
在views文件夹下的 homePage。vue 中设置中间区域容器样式
.itemCenter{
// 高度840px
height: 10.5rem;
border: 1px solid blue;
// 内边距10px
padding: 0.125rem;
// 外边距20px
margin: 0.25rem;
}
47.图表前期准备
全局设置Echarts与axios
Charts 全局引用
1.下载 npm install --save echarts
2.0的写法
在vue2.0中使用如下写法吧echarts挂载在vue实例上 但是这招在3.0行不通了
在main.js中进行引用和调用
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 引用
import 'lib-flexible/flexible.js'
// 引用echarts
import * as echarts from "echarts"
Vue.prototype.$echarts=echarts;
createApp(App).use(store).use(router).mount('#app')
vue3中使用Provide/Inject依赖注入,将替代vue2中在原型链上挂载一些属性
在app.vue中使用provider来给后代们提供数据
<script>
// 1.引用proivde
import {provide} from "vue"
// 2.引用echarts
import * as echarts from "echarts"
export default {
setup() {
provide("echarts",echarts)//第一个参数是名字 第二个参数是你传递的内容
},
}
</script>
在想使用的组件中使用inject来接受
在views下的homePage.vue测试
// 引用inject
import {inject} from 'vue'
export default {
components:{
ItemPage,itemOne,itemTwo,itemThree,itemFour
},
setup(){
// 测试使用echarts
let $echarts= inject("echarts")
console.log($echarts)
}
}
大家在console中可以看到可以正常使用了
axios全局引用
axios使用于上面相同方式
1.下载 npm install --save axios
2.在app.vue中使用provider来给后代们提供数据
<script>
// 1.引用proivde
import {provide} from "vue"
// 2.引用echarts
import * as echarts from "echarts"
// 引用axios
import axios from 'axios'
export default {
setup() {
provide("echarts",echarts)//第一个参数是名字 第二个参数是你传递的内容
provide("axios",axios)//第一个参数是名字 第二个参数是你传递的内容
},
}
</script>
在想使用的组件中使用inject来接受
在views下的homePage.vue测试
// 引用inject
import {inject} from 'vue'
export default {
components:{
ItemPage,itemOne,itemTwo,itemThree,itemFour
},
setup(){
// 测试使用echarts
let $echarts= inject("echarts")
let $http= inject("axios")
console.log($echarts)
console.log($http)
}
}
48.后台接口创建express介绍
49.后台路由创建
1.创建一个文件夹 server 在其中创建index.js与router文件夹容来容纳代码
2.在router下创建4个文件分别容纳 对应的接口
// 存放路由的文件
var express=require("express");
var router=express.Router()
// 设置路由
router.get("/data",function(req,res){
res.send({msg:"第一个接口"})
})
// 暴露路由
module.exports=router
3.在index.js下引用使用刚才创建的内容
var express=require("express");
var app=express();
// 引用路由文件
var chartOne=require("./router/one.js");
var chartTwo=require("./router/two.js");
var chartThree=require("./router/three.js");
var chartFour=require("./router/four.js");
// 中间件中使用路由
app.use("/one",chartOne)
app.use("/two",chartTwo)
app.use("/three",chartThree)
app.use("/four",chartFour)
// 请求是localhost:3000/user/路由文件中的地址
app.listen(3000)
50.api接口数据创建
1.在server文件夹下创建mock文件夹用来容纳数据(数据可以从代码中获取)
2.引用并且把数据返回给前台
var express=require("express");
var router=express.Router()
// 引用数据
let data=require("../mock/one.json")
router.get("/data",function(req,res){
// 数据返回给前台
res.send({msg:"第1个接口",data})
})
module.exports=router
50-1.解决跨域
var express=require("express");
var app=express();
app.use(function(req,res,next){
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE,OPTIONS');
// 千万不要网%%¥¥¥###
// 千万不要网
// 千万不要网
next();
})
51.图表1基本设置销售总量
1.在components文件夹下的 itemOne.vue中 设置图表1
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
// 1引用inject获取全局echarts
import {inject,onMounted} from "vue"
export default {
setup() {
// 2得到echarts对象
let $echarts= inject("echarts")
//3.需要获取到element,所以是onMounted 别忘了上面引用
onMounted(() => {
// 4.初始化echarts 别忘了给上面echarts容器添加id
let myChart = $echarts.init(document.getElementById("chartDom"));
// 5.绘制图表
myChart.setOption({
})
})
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
2.我们要完成的横向柱状图
所以在设置echarts配置的时候。给xAxis 的type设置value数值轴。给yAxis设置 catehory类目轴
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
// 1引用inject获取全局echarts
import {inject,onMounted} from "vue"
export default {
setup() {
// 2得到echarts对象
let $echarts= inject("echarts")
//3.需要获取到element,所以是onMounted 别忘了上面引用
onMounted(() => {
// 4.初始化echarts 别忘了给上面echarts容器添加id
let myChart = $echarts.init(document.getElementById("chartDom"));
// 5.绘制图表
myChart.setOption({
xAxis:{
type:"value"
},
yAxios:{
type:"category"
},
series:[
{
type:"bar"
}
]
})
})
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
3 接下来我们需要图表展示的数据(后台提供)
设置axios请求
在组件内容请求数据
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
import {inject,onMounted} from "vue"
export default {
setup() {
// let $echarts= inject("echarts")
// 引用axios
let $http= inject("axios")
// 设置数据请求方法 不要忘了return
async function getState(){
let chartData=await $http({url:"http://localhost:3000/one/data"})
console.log(chartData)
}
onMounted(() => {
// let myChart = $echarts.init(document.getElementById("chartDom"));
// myChart.setOption({
// xAxis:{
// type:"value"
// },
// yAxios:{
// type:"category"
// },
// series:[
// {
// type:"bar"
// }
// ]
// })
// 测试数据请求的数据 但是先要把上面的注释掉否则会报错
getState()
})
return {
getState
}
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
设置请求基准路径
后续我们右很多的请求 或者后期请求地址改变的时候我们在一个个组件的修改非常的麻烦 所以我们可以设置请求基准路径方便修改
1.在app.vue中设置
<script>
// 1.引用proivde
import {provide} from "vue"
// 2.引用echarts
import * as echarts from "echarts"
// 引用axios
import axios from 'axios'
// 设置请求基准路径
axios.defaults.baseURL="http://localhost:3000/"
export default {
setup() {
provide("echarts",echarts)//第一个参数是名字 第二个参数是你传递的内容
provide("axios",axios)//第一个参数是名字 第二个参数是你传递的内容
},
}
</script>
2.在需要请求的地方只需要写请求的路由地址即可
async function getState(){
let chartData=await $http({url:"chartDataOne"})
console.log(chartData)
}
52.处理数据
我们请求来的数据事一个数组对象 那么我们需要把x轴的数据于y轴的数据取出来变成两个数组方便echarts使用
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
// 1.引用reactive
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
// let $echarts= inject("echarts")
let $http= inject("axios")
async function getState(){
// 3.吧请求过来的值传递给变量接收方便使用
data=await $http({url:"chartDataOne"})
}
// 2.创建接受请求的数据于接受x轴的数据于y轴的数据 别忘了return
let data=reactive({})
let xdata=reactive([])
let ydata=reactive([])
// 4.创建处理数据的方法
function setData(){
console.log("data",data)
// 便利数据并且去除对应的值
xdata=data.data.data.chartData.map(v=>v.title)
ydata=data.data.data.chartData.map(v=>v.num)
console.log("x",xdata)
console.log("y",ydata)
}
onMounted(() => {
// let myChart = $echarts.init(document.getElementById("chartDom"));
// myChart.setOption({
// xAxis:{
// type:"value"
// },
// yAxios:{
// type:"category"
// },
// series:[
// {
// type:"bar"
// }
// ]
// })
// 5在请求成功之后调用处理数据的方法
getState().then(()=>{
// 测试下处理的数据
setData()
})
})
return {
getState,data,xdata,ydata,setData
}
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
动态展示图表
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
// 1.打开echarts的注释
let $echarts= inject("echarts")
let $http= inject("axios")
async function getState(){
data=await $http({url:"chartDataOne"})
}
let data=reactive({})
let xdata=reactive([])
let ydata=reactive([])
function setData(){
console.log("data",data)
xdata=data.data.data.chartData.map(v=>v.title)//名字在y轴展示
ydata=data.data.data.chartData.map(v=>v.num)//数据在x轴展示
console.log("x",xdata)
console.log("y",ydata)
}
onMounted(() => {
getState().then(()=>{
setData()
// 2.吧图表展示放到数据请求成功当中 并且传入对应数据
let myChart = $echarts.init(document.getElementById("chartDom"));
myChart.setOption({
xAxis:{
type:"value"
},
yAxis:{
type:"category",
// 2.插入数据
data:xdata
},
series:[
{
data:ydata,
type:"bar"
}
]
})
})
})
return {
getState,data,xdata,ydata,setData
}
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
添加echarts
echart图表本身是提供了一个resize的函数的。是当浏览器发生resize事件的时候,让其触发echart的resize事件,重绘canvas。
用window.onresize = myChart.resize; 可以完成自适应,就是把window的onresize事件赋值为echart的resize事件
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
async function getState(){
data=await $http({url:"chartDataOne"})
}
let data=reactive({})
let xdata=reactive([])
let ydata=reactive([])
function setData(){
console.log("data",data)
xdata=data.data.data.chartData.map(v=>v.title)
ydata=data.data.data.chartData.map(v=>v.num)
console.log("x",xdata)
console.log("y",ydata)
}
onMounted(() => {
getState().then(()=>{
setData()
let myChart = $echarts.init(document.getElementById("chartDom"));
myChart.setOption({
xAxis:{
type:"value"
},
yAxis:{
type:"category",
data:xdata
},
series:[
{
data:ydata,
type:"bar"
}
]
})
// 让echarts根据浏览器大小改变动态该改变
window.onresize = function () {//自适应大小
myChart.resize();
};
})
})
return {
getState,data,xdata,ydata,setData
}
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
53.图表一样式修改
柱状图圆角与线段渐变色设置
在components下的itemOne.vue
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
async function getState(){
data=await $http({url:"chartDataOne"})
}
let data=reactive({})
let xdata=reactive([])
let ydata=reactive([])
function setData(){
console.log("data",data)
xdata=data.data.data.chartData.map(v=>v.title)
ydata=data.data.data.chartData.map(v=>v.num)
console.log("x",xdata)
console.log("y",ydata)
}
onMounted(() => {
getState().then(()=>{
setData()
let myChart = $echarts.init(document.getElementById("chartDom"));
myChart.setOption({
xAxis:{
type:"value"
},
yAxis:{
type:"category",
data:xdata
},
series:[
{
data:ydata,
type:"bar",
// 设置柱状图区域样式
itemStyle: {
normal: {
// 如果传递数组,则需要传递四个元素,依次表示 左上,右上,右下、左下
barBorderRadius: [0,20,20,0],
// color:"red"如果写死值那么是一个固定的颜色
// 我们需要设置渐变色使用
// new echarts.graphic.LinearGradient(a,b,c,d,arr)来进行设置
// a ,b,c,d为0,1
// a:1 arr中的颜色右到左
// c:1 arr中的颜色左到右
// b:1 arr中的颜色下到上
// d:1 arr中的颜色上到下
color:new $echarts.graphic.LinearGradient(0,0,1,0,[
{
offset:0,
color:'#005eaa'
},
{
offset:0.5,
color:'#339ca8'
},
{
offset:1,
color:'#cda819'
}
])
}
}
},
]
})
window.onresize = function () {
myChart.resize();
};
})
})
return {
getState,data,xdata,ydata,setData
}
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
background-color: gray;
}
</style>
柱状图的柱状的位置与上面显示文字
<template>
<div>
<h2>图表1</h2>
<div id="chartDom" class="chart">
容纳后期的图表
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
async function getState(){
data=await $http({url:"chartDataOne"})
}
let data=reactive({})
let xdata=reactive([])
let ydata=reactive([])
function setData(){
console.log("data",data)
xdata=data.data.data.chartData.map(v=>v.title)
ydata=data.data.data.chartData.map(v=>v.num)
console.log("x",xdata)
console.log("y",ydata)
}
onMounted(() => {
getState().then(()=>{
setData()
let myChart = $echarts.init(document.getElementById("chartDom"));
myChart.setOption({
xAxis:{
// 设置坐标轴上文字颜色
axisLine:{
lineStyle:{
color:"#fff"
}
},
type:"value"
},
yAxis:{
// 设置坐标轴上文字颜色
axisLine:{
lineStyle:{
color:"#fff"
}
},
type:"category",
data:xdata
},
// 配置图标的位置 不包含坐标轴中的文字
grid:{
top:'3%',
left:'1%',
bottom:'3%',
right:'6%',
containLabel:true // 包含坐标轴中的文字
},
series:[
{
data:ydata,
type:"bar",
// 设置图形上的文字
label:{
show:true, // 显示数值
position:'right',//位置
textStyle:{
color:'#fff'
}
},
itemStyle: {
normal: {
barBorderRadius: [0,20,20,0],
// 我们需要设置渐变色使用
// new echarts.graphic.LinearGradient(a,b,c,d,arr)来进行设置
// a ,b,c,d为0,1
// a:1 arr中的颜色右到左
// c:1 arr中的颜色左到右
// b:1 arr中的颜色下到上
// d:1 arr中的颜色上到下
color:new $echarts.graphic.LinearGradient(0,0,1,0,[
{
offset:0,
color:'#005eaa'
},
{
offset:0.5,
color:'#339ca8'
},
{
offset:1,
color:'#cda819'
}
])
}
},
},
]
})
})
})
return {
getState,data,xdata,ydata,setData
}
}
}
</script>
<style scoped>
h2{
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart{
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
54.图表2 地图展示
如果要展示地图那么需要中国地图的矢量数据与省份数据 在public中的map文件夹已经提供了
由于数据实在我们本地 所以 我们在启动项目的时候可以直接在浏览器上输入
http://localhost:8080/map/china.json即可看到数据
我们在components文件夹下创建一个mapPage.vue组件用来容纳地图。同时在views下的homePage.vue中引用调用并且在页面中间的div中使用
<template>
<div class="map">
map
</div>
</template>
<script>
export default {
}
</script>
<style lang="less">
.map{
width: 100%;
height: 100%;
}
</style>
获取地图数据
因为我们在项目中app.vue中 设置了 请求基准路径
axios.defaults.baseURL="http://localhost:3000/"
所以我们不能在使用全局的axiso 否则会使用基准路径完成请求
我们单独引用axios进行数据的请求
<template>
<div class="map">
map
</div>
</template>
<script>
// 1.引用
import axios from "axios"
import {onMounted,reactive} from "vue"
export default {
setup(){
// 2.设置请求 并且创建变量接收获取来的数据 不要忘了报漏
let mapData=reactive({})
async function getState(){
mapData=await axios.get("http://localhost:8080/map/china.json")
}
onMounted(()=>{
// 3发送请求
getState().then(()=>{
console.log("map",mapData)
})
})
return {
mapData
}
}
}
</script>
<style lang="less">
.map{
width: 100%;
height: 100%;
}
</style>
当然我们也可以直接引用数据不用请求
import china from 'map/json/china.json' //本地路径
就可以不用上面的请求使用
设置地图
echarts.registerMap(名字,数据)
<template>
<div class="map" id='map'>
map
</div>
</template>
<script>
import axios from "axios"
// 1.引用
import {onMounted,reactive,inject} from "vue"
export default {
setup(){
// 2.得到echarts
let $echarts= inject("echarts")
let mapData=reactive({})
async function getState(){
mapData=await axios.get("http://localhost:8080/map/china.json")
}
onMounted(()=>{
getState().then(()=>{
console.log("map",mapData)
// 3.设置地图
$echarts.registerMap('china', mapData.data);
var chart = $echarts.init(document.getElementById('map'));
chart.setOption({
geo: {
map: 'china'
}
});
})
})
return {
mapData
}
}
}
</script>
<style lang="less">
.map{
width: 100%;
height: 100%;
}
</style>
55.设置地图样式
<template>
<div class="map" id='map'>
map
</div>
</template>
<script>
import axios from "axios"
import {onMounted,reactive,inject} from "vue"
export default {
setup(){
let $echarts= inject("echarts")
let mapData=reactive({})
async function getState(){
mapData=await axios.get("http://localhost:8080/map/china.json")
}
onMounted(()=>{
getState().then(()=>{
console.log("map",mapData)
$echarts.registerMap('china', mapData.data);
var chart = $echarts.init(document.getElementById('map'));
chart.setOption({
geo: {
map: 'china',
itemStyle:{//地图区域的多边形 图形样式
areaColor:"#0099ff",//地图区域的颜色。
borderColor:"#00ffff",//图形的描边颜色。
shadowColor: 'rgba(230,130, 70, 0.5)',//橙色
shadowBlur: 30,//图形阴影的模糊大小
emphasis: {//高亮状态下的多边形和标签样式。
focus: 'self'//在高亮图形时,是否淡出其它数据的图形已达到聚焦的效果self'self' 只聚焦(不淡出)当前高亮的数据的图形。
}
}
},
});
})
})
return {
mapData
}
}
}
</script>
56.在地图上设置散点标记图
<template>
<div class="map" id="map">map</div>
</template>
<script>
import axios from "axios";
import { onMounted, reactive, inject } from "vue";
export default {
setup() {
let $echarts = inject("echarts");
let mapData = reactive({});
async function getState() {
mapData = await axios.get("http://localhost:8080/map/china.json");
}
onMounted(() => {
getState().then(() => {
console.log("map", mapData);
$echarts.registerMap("china", mapData.data);
var chart = $echarts.init(document.getElementById("map"));
chart.setOption({
geo: {
map: "china",
itemStyle: {
//地图区域的多边形 图形样式
areaColor: "#0099ff", //地图区域的颜色。
borderColor: "#00ffff", //图形的描边颜色。
shadowColor: "rgba(230,130, 70, 0.5)", //橙色
shadowBlur: 30, //图形阴影的模糊大小
emphasis: {
//高亮状态下的多边形和标签样式。
focus: "self", //在高亮图形时,是否淡出其它数据的图形已达到聚焦的效果self'self' 只聚焦(不淡出)当前高亮的数据的图形。
},
},
},
series: [
{
type: "scatter",//类型散点图
itemStyle: {//散点图的颜色
color:"red",
},
name: "所在城市销售额",
coordinateSystem: "geo",//该系列使用的坐标系 geo使用地理坐标系
data: [
{ name: "北京", value: [116.46, 39.92, 4367] },
{ name: "上海", value: [121.48, 31.22, 8675] },
{ name: "深圳", value: [114.07, 22.62, 2461] },
{ name: "广州", value: [113.23, 23.16, 187] },
{ name: "西安", value: [108.45, 34, 3421] },
],
},
],
// tooltip: {
// trigger: "item",
// },
// visualMap: {
// type: "continuous", // 连续型
// min: 100, // 值域最小值,必须参数
// max: 5000, // 值域最大值,必须参数
// calculable: true, // 是否启用滑动空间
// inRange: {
// color: ["#50a3ba", "#eac736", "#d94e5d"], // 指定数值从低到高时的颜色变化
// },
// textStyle: {
// color: "#fff", // 值域控件的文本颜色
// },
// },
});
});
});
return {
mapData,
};
},
};
</script>
<style lang="less">
.map {
width: 100%;
height: 100%;
}
</style>
57.设置提示框组件的视觉映射效果(地图左下角效果)
<template>
<div class="map" id="map">map</div>
</template>
<script>
import axios from "axios";
import { onMounted, reactive, inject } from "vue";
export default {
setup() {
let $echarts = inject("echarts");
let mapData = reactive({});
async function getState() {
mapData = await axios.get("http://localhost:8080/map/china.json");
}
onMounted(() => {
getState().then(() => {
console.log("map", mapData);
$echarts.registerMap("china", mapData.data);
var chart = $echarts.init(document.getElementById("map"));
chart.setOption({
geo: {
map: "china",
itemStyle: {
areaColor: "#0099ff",
borderColor: "#00ffff",
shadowColor: "rgba(230,130, 70, 0.5)",
shadowBlur: 30,
emphasis: {
focus: "self",
},
},
},
series: [
{
type: "scatter",
itemStyle: {
color:"red",
},
name: "所在城市销售额",
coordinateSystem: "geo",
data: [
{ name: "北京", value: [116.46, 39.92, 4367] },
{ name: "上海", value: [121.48, 31.22, 8675] },
{ name: "深圳", value: [114.07, 22.62, 2461] },
{ name: "广州", value: [113.23, 23.16, 187] },
{ name: "西安", value: [108.45, 34, 3421] },
],
},
],
tooltip: {//提示框组件。
trigger: "item",
},
visualMap: {//是视觉映射组件就是地图左下角的选择器
type: "continuous", // 连续型
min: 100, // 值域最小值,必须参数
max: 5000, // 值域最大值,必须参数
calculable: true, // 是否启用滑动空间
inRange: {
color: ["#50a3ba", "#eac736", "#d94e5d"], // 指定数值从低到高时的颜色变化
},
textStyle: {
color: "#fff", // 值域控件的文本颜色
},
},
});
});
});
return {
mapData,
};
},
};
</script>
<style lang="less">
.map {
width: 100%;
height: 100%;
}
</style>
设置标题
<template>
<div class="map" id="map">map</div>
</template>
<script>
import axios from "axios";
import { onMounted, reactive, inject } from "vue";
export default {
setup() {
let $echarts = inject("echarts");
let mapData = reactive({});
async function getState() {
mapData = await axios.get("http://localhost:8080/map/china.json");
}
onMounted(() => {
getState().then(() => {
console.log("map", mapData);
$echarts.registerMap("china", mapData.data);
var chart = $echarts.init(document.getElementById("map"));
chart.setOption({
title:{
text:"城市销售量",
left:"45%",
textStyle:{
color:"#fff",
fontSize:20,
textShadowBlur:10,//文字本身的阴影长度。
textShadowColor :"#33ffff",
}
},
geo: {
map: "china",
itemStyle: {
areaColor: "#0099ff",
borderColor: "#00ffff",
shadowColor: "rgba(230,130, 70, 0.5)",
shadowBlur: 30,
emphasis: {
focus: "self",
},
},
},
series: [
{
type: "scatter",
itemStyle: {
color:"red",
},
name: "所在城市销售额",
coordinateSystem: "geo",
data: [
{ name: "北京", value: [116.46, 39.92, 4367] },
{ name: "上海", value: [121.48, 31.22, 8675] },
{ name: "深圳", value: [114.07, 22.62, 2461] },
{ name: "广州", value: [113.23, 23.16, 187] },
{ name: "西安", value: [108.45, 34, 3421] },
],
},
],
tooltip: {
trigger: "item",
},
visualMap: {
type: "continuous",
min: 100,
max: 5000,
calculable: true,
inRange: {
color: ["#50a3ba", "#eac736", "#d94e5d"],
},
textStyle: {
color: "#fff",
},
},
});
});
});
return {
mapData,
};
},
};
</script>
<style lang="less">
.map {
width: 100%;
height: 100%;
}
</style>
58.图表3 产品库存统计分析图
获取数据
在components下的itemThree.vue
<template>
<div>
<h2>图表1</h2>
<div id="chartDomb" class="chart">
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
// 1.设置echarts设置axios 创建接受请求的变量
let $echarts= inject("echarts")
let $http= inject("axios")
let data=reactive({})
// 2.获取数据
async function getState(){
data=await $http({url:"three/data"})
}
return{
getState,data
}
}
}
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
动态生成图表
<template>
<div>
<h2>图表1</h2>
<div id="chartDomb" class="chart">
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
let data=reactive({})
async function getState(){
data=await $http({url:"three/data"})
}
// 1.在dom加载完毕后动态展示图表
onMounted(()=>{
// 2.发送请求
getState().then(()=>{
console.log("饼状图",data.data.data)
// 初始化echarts
let myChart = $echarts.init(document.getElementById("chartDomb"));
myChart.setOption({
legend: {//设置图例
top: 'bottom'//放到最下面
},
series: [
{
// name: 'Nightingale Chart',
type: 'pie',//饼图
radius: [10, 100],//饼图的半径数组的第一项是内半径,第二项是外半径
center: ['50%', '45%'],//饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标。
roseType: 'area',//设置成玫瑰图
itemStyle: {
borderRadius: 10//用于指定饼图扇形区块的内外圆角半径,
},
data: data.data.data.chartData//数据
}
]
})
})
return{
getState,data
}
})
}
}
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
59.类别分析图样式修改
<template>
<div>
<h2>图表1</h2>
<div id="chartDomb" class="chart">
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
let data=reactive({})
async function getState(){
data=await $http({url:"three/data"})
}
onMounted(()=>{
getState().then(()=>{
console.log("饼状图",data.data)
let myChart = $echarts.init(document.getElementById("chartDomb"));
myChart.setOption({
legend: {
top: 'bottom'
},
series: [
{
type: 'pie',
radius: [10, 100],
center: ['50%', '45%'],
roseType: 'area',
itemStyle: {
borderRadius: 10
},
data: data.data.data.chartData
}
],
// 设置饼状图的颜色
color:['#c12e34', '#e6b600', '#0098d9','#2b821d','#005eaa','#339ca8'],
//提示框,鼠标悬浮交互时的信息提示
tooltip : {
show: true,//默认值true,可选为:true(显示) | false(隐藏)
borderRadius: 10,//提示边框圆角,单位px,默认为4
},
})
})
return{
getState,data
}
})
}
}
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
60.图表4 产品月销图
数据获取
在components文件夹下的itemTwo.vue中进行设置
<template>
<div>
<h2>图表1</h2>
<div id="chartDomb" class="chart">
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
// 1.设置echarts设置axios 创建接受请求的变量
let $echarts= inject("echarts")
let $http= inject("axios")
let data=reactive({})
// 2.获取数据
async function getState(){
data=await $http({url:"two/data"})
}
return{
getState,data
}
}
}
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
动态生成基本折线图
<template>
<div>
<h2>图表1</h2>
<div id="chartDomc" class="chart">
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
let data=reactive({})
async function getState(){
data=await $http({url:"two/data"})
}
// 1.在dom加载完毕后动态展示图表
onMounted(()=>{
// 2.发送请求
getState().then(()=>{
console.log("折线图",data.data)
// 初始化echarts
let myChart = $echarts.init(document.getElementById("chartDomc"));
myChart.setOption({
// 设置x轴内容
xAxis: [
{
type: "category",
boundaryGap: false,//折线图与y轴距离false 没有距离
data: data.data.data.chartData.day,
},
],
// 设置y轴内容
yAxis: [
{
type: "value",
},
],
series: [
// 设置服饰的折线图
{
name: "服饰",
type: "line",
data:data.data.data.chartData.num.Chemicals
},
{
name: "数码",
type: "line",
data:data.data.data.chartData.num.Clothes
},
{
name: "家电",
type: "line",
data:data.data.data.chartData.num.Electrical
},
{
name: "家居",
type: "line",
data:data.data.data.chartData.num.digit
},
{
name: "日化",
type: "line",
data:data.data.data.chartData.num.gear
},
]
})
})
return{
getState,data
}
})
}
}
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
61.折线图样式设置
<template>
<div>
<h2>图表1</h2>
<div id="chartDomc" class="chart">
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
let data=reactive({})
async function getState(){
data=await $http({url:"two/data"})
}
onMounted(()=>{
getState().then(()=>{
console.log("折线图",data.data)
let myChart = $echarts.init(document.getElementById("chartDomc"));
myChart.setOption({
xAxis: [
{
type: "category",
boundaryGap: false,
data: data.data.data.chartData.day,
},
],
yAxis: [
{
type: "value",
},
],
series: [
{
name: "服饰",
type: "line",
data:data.data.data.chartData.num.Chemicals,
stack: "Total",//数据堆叠
smooth: true,//折线图平滑效果 变成曲线图
showSymbol: false,// 隐藏所有数据点
areaStyle: {//设置填充区域的样式
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(128, 255, 165)",
},
{
offset: 1,
color: "rgb(1, 191, 236)",
},
]),
},
lineStyle: { // 设置线段样式
width: 0,
},
emphasis: {//设置高亮的图形样式和标签样式
focus: "series",//只显示选中的内容高亮
},
},
{
name: "数码",
type: "line",
data:data.data.data.chartData.num.Clothes,
stack: "Total",//数据堆叠
smooth: true,//折线图平滑效果 变成曲线图
showSymbol: false,// 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(0, 221, 255)",
},
{
offset: 1,
color: "rgb(77, 119, 255)",
},
]),
},
lineStyle: { // 设置线段样式
width: 0,
},
emphasis: {//设置高亮的图形样式和标签样式
focus: "series",//只显示选中的内容高亮
},
},
{
name: "家电",
type: "line",
data:data.data.data.chartData.num.Electrical,
stack: "Total",//数据堆叠
smooth: true,//折线图平滑效果 变成曲线图
showSymbol: false,// 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(55, 162, 255)",
},
{
offset: 1,
color: "rgb(116, 21, 219)",
},
]),
},
lineStyle: { // 设置线段样式
width: 0,
},
emphasis: {//设置高亮的图形样式和标签样式
focus: "series",//只显示选中的内容高亮
},
},
{
name: "家居",
type: "line",
data:data.data.data.chartData.num.digit,
stack: "Total",//数据堆叠
smooth: true,//折线图平滑效果 变成曲线图
showSymbol: false,// 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(255, 0, 135)",
},
{
offset: 1,
color: "rgb(135, 0, 157)",
},
]),
},
lineStyle: { // 设置线段样式
width: 0,
},
emphasis: {//设置高亮的图形样式和标签样式
focus: "series",//只显示选中的内容高亮
},
},
{
name: "日化",
type: "line",
data:data.data.data.chartData.num.gear,
stack: "Total",//数据堆叠
smooth: true,//折线图平滑效果 变成曲线图
showSymbol: false,// 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(255, 191, 0)",
},
{
offset: 1,
color: "rgb(224, 62, 76)",
},
]),
},
lineStyle: { // 设置线段样式
width: 0,
},
emphasis: {//设置高亮的图形样式和标签样式
focus: "series",//只显示选中的内容高亮
},
},
]
})
})
return{
getState,data
}
})
}
}
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
62.优化
设置提示框等信息
<template>
<div>
<h2>图表1</h2>
<div id="chartDomc" class="chart"></div>
</div>
</template>
<script>
import { inject, onMounted, reactive } from "vue";
export default {
setup() {
let $echarts = inject("echarts");
let $http = inject("axios");
let data = reactive({});
async function getState() {
data = await $http({ url: "two/data" });
}
onMounted(() => {
getState().then(() => {
console.log("折线图", data.data);
let myChart = $echarts.init(document.getElementById("chartDomc"));
myChart.setOption({
tooltip: { //提示框组件
trigger: "axis",//触发类型。坐标轴触发
axisPointer: {//坐标轴指示器配置项
type: "cross",//指示器类型 十字准星指示器
label: {//坐标轴指示器的文本标签
backgroundColor: "#e6b600",//文本标签的背景颜色就是x轴y轴上的内容
},
},
},
legend: {
data: ["服饰", "数码", "家电", "家居", "日化"],
},
// toolbox: {//下载
// feature: {
// saveAsImage: {},
// },
// },
grid: {//组件离容器的距离
left: "1%",
right: "4%",
bottom: "3%",
containLabel: true,//grid 区域是否包含坐标轴的刻度标签
},
xAxis: [
{
// 设置坐标轴上文字颜色
axisLine:{
lineStyle:{
color:"#fff"
}
},
type: "category",
boundaryGap: false,
data: data.data.data.chartData.day,
},
],
yAxis: [
{
// 设置坐标轴上文字颜色
axisLine:{
lineStyle:{
color:"#fff"
}
},
type: "value",
},
],
series: [
{
name: "服饰",
type: "line",
data: data.data.data.chartData.num.Chemicals,
stack: "Total", //数据堆叠
smooth: true, //折线图平滑效果 变成曲线图
showSymbol: false, // 隐藏所有数据点
areaStyle: {
//设置填充区域的样式
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(128, 255, 165)",
},
{
offset: 1,
color: "rgb(1, 191, 236)",
},
]),
},
lineStyle: {
// 设置线段样式
width: 0,
},
emphasis: {
//设置高亮的图形样式和标签样式
focus: "series", //只显示选中的内容高亮
},
},
{
name: "数码",
type: "line",
data: data.data.data.chartData.num.Clothes,
stack: "Total", //数据堆叠
smooth: true, //折线图平滑效果 变成曲线图
showSymbol: false, // 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(0, 221, 255)",
},
{
offset: 1,
color: "rgb(77, 119, 255)",
},
]),
},
lineStyle: {
// 设置线段样式
width: 0,
},
emphasis: {
//设置高亮的图形样式和标签样式
focus: "series", //只显示选中的内容高亮
},
},
{
name: "家电",
type: "line",
data: data.data.data.chartData.num.Electrical,
stack: "Total", //数据堆叠
smooth: true, //折线图平滑效果 变成曲线图
showSymbol: false, // 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(55, 162, 255)",
},
{
offset: 1,
color: "rgb(116, 21, 219)",
},
]),
},
lineStyle: {
// 设置线段样式
width: 0,
},
emphasis: {
//设置高亮的图形样式和标签样式
focus: "series", //只显示选中的内容高亮
},
},
{
name: "家居",
type: "line",
data: data.data.data.chartData.num.digit,
stack: "Total", //数据堆叠
smooth: true, //折线图平滑效果 变成曲线图
showSymbol: false, // 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(255, 0, 135)",
},
{
offset: 1,
color: "rgb(135, 0, 157)",
},
]),
},
lineStyle: {
// 设置线段样式
width: 0,
},
emphasis: {
//设置高亮的图形样式和标签样式
focus: "series", //只显示选中的内容高亮
},
},
{
name: "日化",
type: "line",
data: data.data.data.chartData.num.gear,
stack: "Total", //数据堆叠
smooth: true, //折线图平滑效果 变成曲线图
showSymbol: false, // 隐藏所有数据点
areaStyle: {
opacity: 0.8,
color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(255, 191, 0)",
},
{
offset: 1,
color: "rgb(224, 62, 76)",
},
]),
},
lineStyle: {
// 设置线段样式
width: 0,
},
emphasis: {
//设置高亮的图形样式和标签样式
focus: "series", //只显示选中的内容高亮
},
},
],
});
});
return {
getState,
data,
};
});
},
};
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
63.图表5 产品库存统计图
基本柱状图
<template>
<div>
<h2>图表1</h2>
<div id="chartDomd" class="chart">
</div>
</div>
</template>
<script>
import {inject,onMounted,reactive} from "vue"
export default {
setup() {
let $echarts= inject("echarts")
let $http= inject("axios")
let data=reactive({})
async function getState(){
data=await $http({url:"four/data"})
}
// 1.在dom加载完毕后动态展示图表
onMounted(()=>{
// 2.发送请求
getState().then(()=>{
console.log("柱状图",data.data)
// 初始化echarts
let myChart = $echarts.init(document.getElementById("chartDomd"));
myChart.setOption({
xAxis: {
type: "category",
data: data.data.data.chartData.day,
},
yAxis: {
type: "value",
},
series: [
{
name:"服饰",
type: "bar",
data:data.data.data.chartData.num.Chemicals,
}
]
})
})
return{
getState,data
}
})
}
}
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
64.完成堆叠效果
<template>
<div>
<h2>图表1</h2>
<div id="chartDomd" class="chart"></div>
</div>
</template>
<script>
import { inject, onMounted, reactive } from "vue";
export default {
setup() {
let $echarts = inject("echarts");
let $http = inject("axios");
let data = reactive({});
async function getState() {
data = await $http({ url: "four/data" });
}
onMounted(() => {
getState().then(() => {
console.log("柱状图", data.data);
let myChart = $echarts.init(document.getElementById("chartDomd"));
myChart.setOption({
xAxis: {
type: "category",
data: data.data.data.chartData.day,
},
yAxis: {
type: "value",
},
series: [
{
name: "服饰",
type: "bar",
data: data.data.data.chartData.num.Chemicals,
stack: "total",//数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置
},
{
name: "数码",
type: "bar",
data: data.data.data.chartData.num.Clothes,
stack: "total",//数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置
},
{
name: "家电",
type: "bar",
data: data.data.data.chartData.num.Electrical,
stack: "total",//数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置
},
{
name: "家居",
type: "bar",
data: data.data.data.chartData.num.digit,
stack: "total",//数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置
},
{
name: "日化",
type: "bar",
data: data.data.data.chartData.num.gear,
stack: "total",//数据堆叠,同个类目轴上系列配置相同的stack值可以堆叠放置
},
],
});
});
return {
getState,
data,
};
});
},
};
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
65.样式优化
<template>
<div>
<h2>图表1</h2>
<div id="chartDomd" class="chart"></div>
</div>
</template>
<script>
import { inject, onMounted, reactive } from "vue";
export default {
setup() {
let $echarts = inject("echarts");
let $http = inject("axios");
let data = reactive({});
async function getState() {
data = await $http({ url: "four/data" });
}
onMounted(() => {
getState().then(() => {
console.log("柱状图", data.data);
let myChart = $echarts.init(document.getElementById("chartDomd"));
myChart.setOption({
xAxis: {
// 设置坐标轴上文字颜色
axisLine:{
lineStyle:{
color:"#fff"
}
},
type: "category",
data: data.data.data.chartData.day,
},
yAxis: {
// 设置坐标轴上文字颜色
axisLine:{
lineStyle:{
color:"#fff"
}
},
type: "value",
},
tooltip: {
trigger: "axis",
axisPointer: {//设置鼠标选中样式为阴影
type: "shadow",
},
},
legend: {},//图例
grid: {//位置
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true,//设置包含坐标轴
},
series: [
{
name: "服饰",
type: "bar",
data: data.data.data.chartData.num.Chemicals,
stack: "total",
label: {
//图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
show: true,
},
emphasis: {
//高亮的图形样式和标签样式。
focus: "series", //聚焦当前高亮的数据所在的系列的所有图形。
},
},
{
name: "数码",
type: "bar",
data: data.data.data.chartData.num.Clothes,
stack: "total",
label: {
//图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
show: true,
},
emphasis: {
//高亮的图形样式和标签样式。
focus: "series", //聚焦当前高亮的数据所在的系列的所有图形。
},
},
{
name: "家电",
type: "bar",
data: data.data.data.chartData.num.Electrical,
stack: "total",
label: {
//图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
show: true,
},
emphasis: {
//高亮的图形样式和标签样式。
focus: "series", //聚焦当前高亮的数据所在的系列的所有图形。
},
},
{
name: "家居",
type: "bar",
data: data.data.data.chartData.num.digit,
stack: "total",
label: {
//图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
show: true,
},
emphasis: {
//高亮的图形样式和标签样式。
focus: "series", //聚焦当前高亮的数据所在的系列的所有图形。
},
},
{
name: "日化",
type: "bar",
data: data.data.data.chartData.num.gear,
stack: "total",
label: {
//图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。
show: true,
},
emphasis: {
//高亮的图形样式和标签样式。
focus: "series", //聚焦当前高亮的数据所在的系列的所有图形。
},
},
],
});
});
return {
getState,
data,
};
});
},
};
</script>
<style scoped>
h2 {
/* 48像素 */
height: 0.6rem;
color: #fff;
line-height: 0.6rem;
text-align: center;
font-size: 0.25rem;
}
.chart {
/* 高度360 */
height: 4.5rem;
/* background-color: gray; */
}
</style>
66.项目打包
vue项目中大家在运行的时候我们是需要用内置的devServer帮助我们自动项目 开发过程中没有问题
但是 我们所写的项目今后是需要上公网让用户访问的 所以我们需要把项目放在性能更好的服务器上运行
还有就是 我们所写的是.vue文件 浏览器不认识 没有办法直接解析
所以我们就绪要对当前项目 进行打包 就是把项目编译成 html css js 方便我们把项目放到服务器上也方便浏览器解析
打包流程
1.npm run build命令打包 但是会发现打包之后资源路径有问题
2.修改静态资源路径 publicPath
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? './'
: '/'
}
3.修改路由模式为hash
// 1.需要引入
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'
// 2.修改配置
const router = createRouter({
history: createWebHashHistory(process.env.BASE_URL),
routes
})
67.服务器购买与连接
在购买ECS服务器后,系统会创建一个ECS实例。每一个ECS实例对应一台已购买的云服务器。您可以通过电脑上自带的终端工具访问云服务器,进行应用部署和环境搭建。
- 在ECS实例列表页面,选择实例的所属地域。
- 找到目标实例,然后在操作列选择 【 更多 】 > 【 密码/密钥 】 > 【重置实例密码 】 ,然后在弹出的对话框设置ECS实例的登录密码
-
在弹出的页面,单击【立即重启】使新密码生效。
-
在ECS实例列表页面,复制ECS实例的公网IP地址。
-
连接远程桌面
(1)方式1 浏览器直接访问
即可连接
(2)远程桌面方式
在电脑的开始中搜索远程桌面
68.nginx服务器使用
Nginx是一个http服务器。是一个高性能的http服务器及反向代理服务器。官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
代理服务器
代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
注意
我们学习的vue的跨域 是基于脚手架内置服务器的 但是我们打包之后这个服务器就不帮助我们启动服务了 所以我们之前配置的跨域设置就作废了
使用
1.解压出nginx得到如下内容
2.打开conf文件夹 复制一份nginx.conf文件 并且修改名字(名字随便起) 这个文件就是nginx的配置文件
3.打开Powershell cd到当前nginx路径下 输入 ./nginx.exe -c ./conf/你复制的文件名.conf 启动
4.打开浏览器输入localhost:80即可启动
使用小扩展
记得如果修改服务器内容了 要停止之后在重新启动
打开Powershell cd到当前nginx路径下 输入 ./nginx.exe -c ./conf/你复制的文件名.conf -s stop 停止
69. 项目运行
1.把我们打包好的dist放到根路径下
2.修改我们的.conf文件
3.配置端口
4.在电脑浏览器尝试使用 你的公网ip加端口访问
如不行 重新启动(不要忘了先关闭nginx) 运行浏览器即可看见
70.后端上线
同前端方式