后端基于Asp.net webapi,前端Vue,前后端分离,该demo仅做演示,实现的细节可以自己优化

Echarts:4.2.1  可参考 官网

Jquery:3.4.1

Signalr:2.4.1 可参考 官网

Vue:2.5.2

效果:

1.创建Web API项目

使用nuget导入signalr和Microsoft.Owin.Cors

2.在Hubs下创建Signalr hub class

    public class CPUHelper
{
public static string GetPercentProcessor()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
var cpuTimes = searcher.Get()
.Cast<ManagementObject>()
.Select(mo => new
{
Name = mo["Name"],
Usage = mo["PercentProcessorTime"]
}
)
.ToList(); var query = cpuTimes.Where(x => x.Name.ToString() == "_Total").Select(x => x.Usage);
return query.SingleOrDefault().ToString();
}
} public class CpuHub : Hub
{
public void Notify()
{
var res = CPUHelper.GetPercentProcessor();
Clients.All.getPercentProcessor(res);
}
}

3.在App_Start下创建Startup类

[assembly: OwinStartup(typeof(WebSignalr.App_Start.Startup))]
namespace WebSignalr.App_Start
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 允许跨域
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
}

4.运行站点访问http://localhost:57577/signalr/hubs 可以看到自动生成的客户端代理js代码(端口号可能不一致)

5.创建vue项目,打开vscode,打开新建的项目文件夹,打开终端

运行 npm install -g vue-cli 初始化vue

运行 vue init webpack projectName 创建vue项目,完成后

运行 cd projectName 转到项目目录,执行 npm run dev 成功后访问 localhost:8080 预览

运行 npm install echarts -S 引入echats包

运行 npm i signalr jquery -S 引入Jquery 和 signalr

完成后结果如下

6.修改main.js如下

import Vue from 'vue'
import App from './App'
import echarts from 'echarts'
/* eslint-disable */
import $ from 'jquery'
import 'signalr' Vue.config.productionTip = false
Vue.prototype.$echarts = echarts /* eslint-disable no-new */
new Vue({
el: '#app',
components: { App },
template: '<App/>'
})

7.在components文件夹下创建charts文件夹,并创建文件DynamicCharts.vue

<template>
<div :id='id' :style='style'></div>
</template>
<script>
export default {
name: 'Chart',
data () {
return {
chart: ''
};
},
props: {
id: {
type: String
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '300px'
},
option: {
type: Object,
default () {
return {
title: {
text: 'test'
},
legend: {
data: 'tag'
},
xAxis: {
data: []
},
yAxis: [
{
type: 'value'
}
],
series: [
{
name: 'tag',
type: 'line',
data: []
}
]
};
}
}
},
computed: {
style () {
return {
height: this.height,
width: this.width
};
}
},
mounted () {
this.init();
},
methods: {
init () {
window.addEventListener('resize', this.chart.resize);
this.chart = this.$echarts.init(document.getElementById(this.id));
this.chart.setOption(this.option);
}
},
watch: {
option: {
handler: function (val, oldval) {
if (this.chart) {
if (val) {
this.chart.setOption(val);
} else {
this.chart.setOption(oldval);
}
} else {
this.init();
}
},
deep: true
}
}
};
</script>

8.修改App.vue,引入Chart组件

<template>
<div id='app'>
<Chart id='test' :option='option'></Chart>
</div>
</template>
<script>
import Chart from './components/charts/DynamicCharts';
export default {
name: 'App',
components: {
Chart
},
data () {
return {
option: {
title: {
text: 'CPU使用率'
},
xAxis: [
{
type: 'category',
boundaryGap: false,
data: []
}
],
yAxis: [
{
type: 'value',
max: 100,
axisLabel: {
formatter: '{value} %'
}
}
],
series: [
{
type: 'line',
data: []
}
]
}
};
},
mounted () {
console.log('init');
this.init();
this.connect();
},
methods: {
init () {
var signalR = $.signalR;
var $this = this;
$.hubConnection.prototype.createHubProxies = function () {
var proxies = {};
this.starting(function () {
$this.registerHubProxies(proxies, true);
this._registerSubscribedHubs();
}).disconnected(function () {
$this.registerHubProxies(proxies, false);
});
proxies['cpuHub'] = this.createHubProxy('cpuHub');
proxies['cpuHub'].client = {};
proxies['cpuHub'].server = {
notify: function () {
return proxies['cpuHub'].invoke.apply(
proxies['cpuHub'],
$.merge(['Notify'], $.makeArray(arguments))
);
}
};
return proxies;
};
signalR.hub = $.hubConnection('http://localhost: 57577/signalr', {
useDefaultPath: false
});
$.extend(signalR, signalR.hub.createHubProxies());
},
initdata () {
for (let i = 0; i < 60; i++) {
this.option.series[0].data.push(this.rnd(30, 80));
}
},
connect () {
var cpu = $.connection.cpuHub;
var that = this.option.series[0].data;
cpu.client.getCPUPercent = (pers) => {
if (that.length >= 30) {
that.shift();
}
that.push(pers);
};
$.connection.hub.start().done(function () {
window.setInterval(function () {
cpu.server.send(20);
}, 2000);
});
},
rnd (n, m) {
var random = Math.floor(Math.random() * (m - n + 1) + n);
return random;
},
makeProxyCallback (hub, callback) {
return function () {
callback.apply(hub, $.makeArray(arguments));
};
},
registerHubProxies (instance, shouldSubscribe) {
var key, hub, memberKey, memberValue, subscriptionMethod;
for (key in instance) {
if (instance.hasOwnProperty(key)) {
hub = instance[key];
if (!hub.hubName) {
// Not a client hub
continue;
}
if (shouldSubscribe) {
// We want to subscribe to the hub events
subscriptionMethod = hub.on;
} else {
// We want to unsubscribe from the hub events
subscriptionMethod = hub.off;
}
// Loop through all members on the hub and find client hub functions to subscribe/unsubscribe
for (memberKey in hub.client) {
if (hub.client.hasOwnProperty(memberKey)) {
memberValue = hub.client[memberKey];
if (!$.isFunction(memberValue)) {
// Not a client hub function
continue;
}
// Use the actual user-provided callback as the 'identity' value for the registration.
subscriptionMethod.call(
hub,
memberKey,
this.makeProxyCallback(hub, memberValue),
memberValue
);
}
}
}
}
}
}
};
</script> <style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

注:其中关于访问服务端signalr代码完全拷贝于第4步生成的js代码,仅仅需要修改hubConnection地址

最后在终端运行 npm run dev

本文地址:https://www.cnblogs.com/liuxiaobo93/p/11244762.html

如果遇到任何问题,欢迎留言讨论

Signalr Vue Echarts绘制实时CPU使用率的更多相关文章

  1. Linux性能优化从入门到实战:04 CPU篇:CPU使用率

      CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00 ...

  2. 用ECharts绘制Prometheus图表,实现类似Grafana的自定义Dashboard

      大家一般都是用Grafana自定义Dashboard来监控Prometheus数据的,作者这次尝试用ECharts来绘制Prometheus数据图表,一方面可以减少依赖,另一方面可以将监控界面灵活 ...

  3. 使用WPF动态显示CPU使用率

    基于WPF的开源图表控件有很多,大多数都是静态图表,如果需要绘制CPU使用率这样的动态数据就显得力不从心,微软开源的DynamicDataDisplay控件弥补了这个不足,为了做个备忘,我用它来实时绘 ...

  4. WPF 动态模拟CPU 使用率曲线图

    原文:WPF 动态模拟CPU 使用率曲线图      在工作中经常会遇到需要将一组数据绘制成曲线图的情况,最简单的方法是将数据导入Excel,然后使用绘图功能手动生成曲线图.但是如果基础数据频繁更改, ...

  5. CPU使用率终于正常了——记一次订餐系统事故处理

    引子 经过漫长的等待,儿子终于出生了.欣喜之余,就是各种手足无措,顾此失彼了.因为不懂,心里总是慌慌的,有点小毛病,恨不得一步就到医院. 婆媳育儿观念的差异,让心乱如麻的我,又成了风箱里的老鼠,两个不 ...

  6. Linux平台Cpu使用率的计算

    proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的 ...

  7. CPU使用率

    CPU使用率 事故回放 当时的情况是那个样子的: 1,正值饭点,客户电话说系统慢,几乎无法完成订单调度,有时还显示内存不足.当时心里的第一个声音就是,服务器配置太低了,远程一看,2核4G内存,cpu平 ...

  8. 查看uCOS-II的CPU使用率

    代码模板: void main(void) { OSInit(); /* 安装uCOS-II的任务切换向量 */ /* 创建用户起始任务TaskStart */ OSStart(); } void T ...

  9. 查看线程linux cpu使用率

    Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算 转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-] proc文件系统 p ...

随机推荐

  1. FIREDAC返回多结果集

    FIREDAC返回多结果集 以前使用ADO, 如果SQL返回的结果集有多个 可以通过NextRecordset来依次获取 代码移植到FireDAC, 对于多结果集处理差不多, 但是还是有一些不一样的地 ...

  2. Infralution.Localization.Wpf

    WPF Localization Using RESX Files Once you have downloaded the source code and built it, add a refer ...

  3. centos7 设置 防火墙 开机自启

    CentOS 7.0默认使用的是firewall作为防火墙,之前版本是使用iptables. 1.设置firewall开机启动 systemctl enable firewalld 2.禁止firew ...

  4. TransitionDrawable

    ayerDrawable的一个子类,TransitionDrawable只管理两层的Drawable!两层!两层! 并且提供了透明度变化的动画,可以控制一层Drawable过度到另一层Drawable ...

  5. 5G 与 MEC 边缘计算

    目录 文章目录 目录 前言 参考文献 通信网络 核心网演进之路 早古时期 2G 网络架构 3G 网络架构 4G 网络架构 5G 5G 网络的需求 5G 网络架构的设计原则 5G 网络的逻辑架构 5G ...

  6. Qt编写自定义控件24-图片轮播控件

    一.前言 上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成, ...

  7. linux简单命令6---挂载

  8. 修改Eclipse启动时的选择工作空间

    对于eclipse的默认的工作空间,如果不需要正常切换workspace的用户很方便,打开eclipse便自动进入默认的工作空间.而如果用户经常在多个workspace之间切换的话,启动eclipse ...

  9. c++后台开发面试常见知识点总结(一)c++基础

    指针和引用的区别 extern,const,static,volatile关键字 #define 和const的区别 关于typedef和#define; C++程序中内存使用情况分析(堆和栈的区别) ...

  10. shell 入门学习

    目录 shell 入门学习 注释 执行与启动 变量 语法 调试 title: shell 入门学习 date: 2019/7/16 15:47:49 toc: true --- shell 入门学习 ...