后端基于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. 黑马vue---40、结合Node手写JSONP服务器剖析JSONP原理

    黑马vue---40.结合Node手写JSONP服务器剖析JSONP原理 一.总结 一句话总结: 服务端可以返回js代码给script标签,那么标签会执行它,并且可带json字符串作为参数,这样就成功 ...

  2. HearthBuddy Ai 调试实战2 在使用海巨人的时候,少召唤了一个图腾(费用是对的)

    问题 游戏面板 8是青玉之爪13是海巨人17是恐狼前锋 64是萨满 66是圣骑士63,99,46,是微型木乃伊[其中99和46都是2血3攻,63是2血1攻]57是鱼人木乃伊 微型木乃伊 "L ...

  3. 高并发实时弹幕系统 并发数一定是可以进行控制的 每个需要异步处理开启的 Goroutine(Go 协程)都必须预先创建好固定的个数,如果不提前进行控制,那么 Goroutine 就随时存在爆发的可能。

    小结: 1.内存优化1.一个消息一定只有一块内存使用 Job 聚合消息,Comet 指针引用. 2.一个用户的内存尽量放到栈上内存创建在对应的用户 Goroutine(Go 程)中. 3.内存由自己控 ...

  4. web开发的三层架构

    Web层 接收客户端发送过来的数据,然后需要将数据传递给service层 Service层 业务逻辑层:业务:比如检验用户名的是否存在,如果不存在则需要把用户的数据存储在数据库中,如果存在,给web返 ...

  5. OOM异常的发生原因

    一,jvm内存区域 1,程序计数器 一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. 2,java栈 与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存 ...

  6. python包中__init__.py文件的作用

    python包中__init__.py文件的作用 __init__.py文件最常用的作用是标识一个文件夹是一个 python包. __init__.py文件的另一个作用是定义模糊导入时要导入的内容. ...

  7. win2008 r2下配置IIS7(ASP.net运行环境)

    一.常规配置: 1.先要设置应用程序池(ApplicationPool)为Classic.NETAppPool. 2.选中左侧的“应用程序池”,选中“Classic.NETAppPool”,单击右侧的 ...

  8. ES6深入浅出_汇总贴

    H:\BaiDu\ES6深入浅出-wjw ES 6 新特性一览:https://frankfang.github.io/es-6-tutorials/ 我用了两个月的时间才理解 let https:/ ...

  9. firewalld介绍

    (1).什么是firewalld? firewalld是提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具. (2).firewalld与iptables之间的关系 ...

  10. 从库因为sql错误导致主从同步被中断的问题解决

    从库因为sql错误导致主从同步被中断的问题解决:show slave status\G;看lasterror:看延迟多少秒,正常情况下是没有延迟的. 跳过错误的那条sql:SET GLOBAL SQL ...