• Signalr Vue Echarts绘制实时CPU使用率


    后端基于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
        },
         {
          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,
             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>
    View Code

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

    最后在终端运行 npm run dev 

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

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

  • 相关阅读:
    VFL语言简洁
    TETeLasr Cutting System 开机回零问题
    TETELaser Cutting System 不连续吹起的问题
    C语言 printf 格式化输出函数
    kbhit()
    电子齿轮 电子凸轮
    memset
    .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分
    pdf点击超链接后返回:alt+ 向左 /向右
    关于 char 、 wchar_t 、 TCHAR 、 _T() ||| 宏 _T 、 TEXT 、 _TEXT 、 L
  • 原文地址:https://www.cnblogs.com/liuxiaobo93/p/11244762.html
Copyright © 2020-2023  润新知