• Echarts的相关问题记录与应用


    一、相关问题记录:

    1、对图表的div进行隐藏操作,使用hide()或display:none,重新展示时,会造成图表无法获取高度,导致图表的高宽不符合预期:

    解决方法:最后调用一下resize()函数, 例如: var myCharts =  echarts.init($('#id')[0]),   myCharts.setOption(option)   myCharts.resize();

    2、饼图的大小是有radius参数决定的。参数为字符串:百分比;

    ------------------------------------------------------------------------------------------------------------

    二、Echarts应用(集成到angularjs中):

    1、html:

    <div id="manage_space" class="view">
        <div class="data-show content">
            <div class="header">
                <div class="selectType">
                    <select data-ng-model="queryType"
                            data-ng-options="x for (x, y) in queryTypes"
                    >
                    </select>        
                </div>
                <span class="input-group-filters">
                        <input type="text" placeholder="输入关键词过滤" data-ng-model="keyword" />
                </span>
                <span>
                    <a class="btn btn-default btn-sm" data-ng-click="refresh()"><i class="fa fa-refresh"></i> 刷新</a>
                </span>
            </div>
            <div class="data-content">
                    <div class="loader" data-ng-if="loading">正在加载...</div>
                    <div class="nodata-p" data-ng-if="!loading && spaces.length == 0">
                        <div class="nodata-c">
                            <small class="text-muted">抱歉,暂无数据!</small>
                        </div>
                    </div>
                    <ol class="ns-list-group">
                        <li class="ns-list-group-item-title">
                            <div class="col-md-3">
                                <div>名称</div>
                            </div>
                            <div class="col-md-3">
                                <div>总大小</div>
                            </div>
                            <div class="col-md-2">
                                <div>预警值</div>
                            </div>
                            <div class="col-md-2">
                                <div>最小值</div>
                            </div>
                            <div class="col-md-2">
                                <div>已使用</div>
                            </div>
                            <div class="clearfix"></div>
                        </li>
                        <li class="ns-list-group-item" data-ng-repeat="space in spaces | filter : ifContain">
                            <div class="col-md-3">
                                <div><a data-ng-click="showChart(space)" href="javascript:;">{{space.name}}</a></div>
                            </div>
                            <div class="col-md-3">
                                <div>{{space.spaceInfo.capacityGigaBytes}} G</div>
                            </div>
                            <div class="col-md-2">
                                <div>{{space.spaceInfo.warningBytes}} G</div>
                            </div>
                            <div class="col-md-2">
                                <div>{{space.spaceInfo.blockBytes}} G</div>
                            </div>
                            <div class="col-md-2">
                                <div>{{space.spaceInfo.usedBytes}} G</div>
                            </div>
                            <div class="clearfix"></div>
                        </li>
                    </ol>
            </div>
        </div>
        <div id="h-handler" class="handler"></div>
        <div class="charts-show">
            <div class="selectType">
                <select data-ng-model="chart"
                        data-ng-options="x for (x, y) in myCharts"
                >
                </select>        
            </div>
            <div class="chart-title">
                <div class="barchart-icon" data-ng-if="chart=='bar'">
                    <span data-ng-if="queryType=='group'" class="group-title">工作组空间使用情况</span>
                    <span data-ng-if="queryType=='user'" class="user-title">用户空间使用情况</span>
                    <ol>
                        <li class="normal">正常</li>
                        <li class="warn">警告</li>
                        <li class="alerted">预警</li>
                        <li class="surplus">剩余</li>
                    </ol>
                </div>    
                <div class="piechart-icon" data-ng-if="chart=='pie'">
                    <span data-ng-if="queryType=='group'" class="group-title">工作组空间使用情况<br/><span>单位:GB</span></span>
                    <span data-ng-if="queryType=='user'" class="user-title">用户空间使用情况<br/><span>单位:GB</span></span>
                    <ol>
                        <li><span class="surpluspace">剩余</span>剩余空间</li>
                        <li><span class="usedspace">已用</span>已用空间</li>
                    </ol>
                </div>        
            </div>
            
            <div class="bar-show col-md-11" data-ng-show="chart=='bar'" bar-charts  data-source="baseunits"></div>
            <div class="pie-show" data-ng-show="chart=='pie'" pie-charts  data-source="baseunit" 
                     data-ng-repeat="baseunit in baseunits"></div>
        </div>
    </div>

    2、css

    #manage_space{
        margin-left: 2px;
        float: left;
    }
    #manage_space.view{
        display: inline;
    }
    #manage_space.view>.data-show {
        padding: 0;
        width: 50%;
        height:100%;
        float: left;
        border: 1px solid;
        border-bottom: 0px;
    }
    
    #manage_space.view>.handler {
        position: absolute;
        left: 50%;
        top: 0;
        bottom: 0;
        width: 3px;
        background-color: transparent;
    }
    
    #manage_space .charts-show{
        position: absolute;
        right: 0;
        width: 50%;
        left:50%;
        padding: 0;
        height:100%;
        top:0;
        margin-top: 10px;
        padding-left: 5px;
        overflow: auto;
    }
    
    
    #manage_space .header{
        margin-top: 10px;
        margin-bottom: 10px;
        border-bottom: 1px solid;
        padding-bottom: 5px;
    }
    
    #manage_space .selectType{
        float:left;
        margin-left:10px;
    }
    
    #manage_space .selectType select{
        padding-right: 30px;
        height:26px;
    }
    
    #manage_space .header .input-group-filters {
        display: inline-block;
        vertical-align: middle;
        margin-left: 50px;
        margin-top:-5px;
    }
    
    #manage_space .header span>a{
        margin-top: -2px;
    }
    
    #manage_space ol li{
        padding-top: 5px;
        padding-bottom: 5px;
    }
    
    #manage_space .ns-list-group-item-title div{
        font-weight:bold;
        text-align: center;
    }
    
    
    #manage_space.view>.content .ns-list-group-item {
        line-height: 2.0em;
        padding-top: 5px;
        padding-bottom: 5px;
        text-align: center;
        white-space: nowrap;
    }
    
    
    #manage_space .charts-show>.selectType{
        float: none;
        margin-left: 20px;
    }
    
    #manage_space .charts-show>.chart-title{
        float: none;
        margin-left: 20px;
        font-weight: bold;
        margin-top: 10px;
        font-size: 18px;
    }
    
    .barchart-icon .group-title;.barchart-icon .user-title{
        text-align: left;
        display: block;
        float: left;
    }
    
    .barchart-icon ol{
        float: right;
        list-style: none;
        font-weight: normal;
        font-size: 8px;
        
    }
    
    .barchart-icon ol li{
        padding:2px 10px;
        float: left;
        margin-right: 3px;
    }
    
    .barchart-icon .normal{
        background-color: #00FE69;
    }
    .barchart-icon .warn{
        background-color: #FEFE1F;
    }
    .barchart-icon .alerted{
        background-color: #FF0301;
    }
    .barchart-icon .surplus{
        background-color: #3B9BFD;
    }
    
    .piechart-icon{
        text-align: center;
        display: block;
    }
    
    .group-title>span , .user-title>span{
        font-weight: normal;
        font-size: 8px;
    }
    
    .piechart-icon ol{
        text-align: left;
        list-style: none;
        margin-top: -50px;
        font-weight: normal;
        font-size: 10px;
    }
    
    .piechart-icon ol li>span{
        margin-right: 10px;
        padding:0px 3px;
        font-size: 6px;
    }
    .piechart-icon .surpluspace{
        background: #C13530;
        color: #C13530;
        
    }
    .piechart-icon .usedspace{
        background: #2E4453;
        color: #2E4453;
    }
    
    #manage_space .bar-show{
        padding: 10px;
        height: 90%;
        position: absolute;
        text-align: center;
        margin-top: -20px;
    }
    #manage_space .pie-show{
        padding:5px 5px 10px 10px;
        float:left;
        height: 30%;
        width: 30%;    
        margin-top: -50px;
        margin-bottom: 20px;
    }
    View Code

    3、js

    nsiteConsoleApp.controller('ManageSpaceController',function($scope, 
            $rootScope, $filter, Proxy, Message){
        
        $scope.resetMenu('manage', 'space');
    
        var currentStationId = $scope.managedStationId;
        
        $scope.queryType = 'group';
        $scope.queryTypes = {
            '工作组' :'group',
            '用户    ' :'user'
        };
        $scope.chart = 'bar';
        $scope.myCharts = {
                "柱状图":'bar',
                "饼图":'pie'
        };
        $scope.$watch('queryType',function(newV,oldV,$scope){
            $scope.refresh();
        });
        $scope.$watch('keyword',function(newV,oldV,$scope){
            if(typeof(newV) == "undefined") return;
            $scope.baseunits = [];
            angular.forEach($scope.spaces,function(unit){
                if(unit.name.indexOf($scope.keyword) > -1){
                    $scope.baseunits.push(unit);
                }
            });
        });
        
        $scope.ifContain = function(unit){
            if($scope.keyword && $scope.keyword.length>0){
                return unit.name.indexOf($scope.keyword) > -1;
            }
            return true;
        };
        
        $scope.refresh = function(){
            $scope.loading = true;
            $scope.spaces = [];
            if($scope.queryType === 'group'){
            /*    Proxy.security_lo.Group.findByParentId({ parentId: currentStationId },
                        function success(resp) {
                            $scope.loading = false;
                            $scope.spaces = resp;
                            $scope.baseunits = resp;
                        });*/
                Proxy.security_lo.Group.queryAll({start:0, limit:1000},
                        function success(resp) {
                            $scope.loading = false;
                            $scope.spaces = [];
                            $(resp.items).each(function(i, group){
                                if(group.stationId = currentStationId ){
                                    $scope.spaces.push(group);
                                }
                            });
                            $scope.baseunits = $scope.spaces;
                        });
                
            }else{
                Proxy.security_lo.User.findByParentId({ parentId: currentStationId },
                        function success(resp) {
                            $scope.loading = false;
                            $scope.spaces = resp;
                            $scope.baseunits = resp;
                        });
            }
        };
        //$scope.refresh();
        
        //展示单条数据
        $scope.showChart= function(baseunit){
            if(baseunit.uniqueName){
                $scope.baseunits = [];
                $scope.baseunits.push(baseunit);
            }else{
                //获取组成员
                Proxy.Security.findUsersByGroupIds({
                    groupIds: [baseunit.id],
                }, function (resp) {
                    if(resp[0]){
                        $scope.baseunits = resp[0].users;    
                    }else{
                        Message.warn('此栏目下无用户!');
                    }
                });
            }
            
        }
    })
    .directive('barCharts',function(){
        return{
            restrict:'EA',
            scope:{
                source : '='
            },
            template:'<div>柱图</div>',
            controller:function($scope){
            },
            link:function(scope,element,attr){
                var chart = element.find('div')[0];
                var parent = element['context'];
                var width , height;
                width = parent.clientWidth || 600;
                height = parent.clientHeight || 400;
                chart.style.width = (width- 0) +'px';
                chart.style.height = (height- 0) + 'px';
                
                scope.option = {
                        title:{
                            text:''
                        },
                        tooltip:{
                            trigger:'axis',
                            axisPointer:{
                                type:'shadow'
                            }
                        },
                        legend:{
                        //    right:'right',
                        //    data:['正常','警告','预警','剩余']
                        },
                        xAxis:{
                            type:'value',
                            name:'(GB)'
                        },
                        yAxis:{
                            type: 'category',
                            axisLabel:{
                                rotate:0,
                                textStyle:{
                                    fontSize:8,
                                    fontWeight:'bold'
                                }
                            },
                            data: []
                        },
                        grid: {
                                left: '3%',
                                right: '7%',
                                bottom: '3%',
                                containLabel: true
                         },
                        series:[
                                {
                                name:'已使用',
                                type:'bar',
                                stack:'存储空间',
                                label:{
                                    normal:{
                                        show:false,
                                        position:'insideRight'
                                    }
                                },
                                barWidth:'50%',
                                data:[]
                                },
                                {
                                    name:'剩 余',
                                    type:'bar',
                                    stack:'存储空间',
                                    label:{
                                        normal:{
                                            show:false,
                                            position:'insideRight'
                                        }
                                    },
                                    itemStyle:{
                                        normal:{
                                            color:'#CBCBCB'    
                                        }
                                    },
                                    barWidth:'50%',
                                    data:[]
                                }
                        ]
                    };
                
                
                scope.$watch('source', function(newVal, oldVal, scope){
                    var baseunits = newVal;
                    if(typeof(baseunits) == "undefined") return;
                    chart.style.height = (height * (baseunits.length < 7 ? 7 : baseunits.length) / 10)+'px';
                    var barChart = echarts.init(chart);
                    //给图表赋值
                    scope.option.yAxis.data = [];
                    scope.option.series[0].data = [];
                    scope.option.series[1].data = [];
                    for (var int =  baseunits.length - 1 ; int >=0; int--) {
                        var baseunit = baseunits[int];
                        scope.option.yAxis.data.push(baseunit.name);
                        scope.option.series[0].data.push(
                                      {
                                          value: baseunit.spaceInfo.usedBytes,
                                          itemStyle:{
                                              normal:{
                                                  color: baseunit.spaceInfo.usedBytes*100 /baseunit.spaceInfo.capacityGigaBytes > 85 ?
                                                           '#FF0301': (baseunit.spaceInfo.usedBytes*100 /baseunit.spaceInfo.capacityGigaBytes < 70) ? 
                                                                   '#00FA67':'#CDCD19'
                                              }
                                          }
                                      }
                        );
                        scope.option.series[1].data.push((baseunit.spaceInfo.capacityGigaBytes - baseunit.spaceInfo.usedBytes)<0 ?
                                0:(baseunit.spaceInfo.capacityGigaBytes - baseunit.spaceInfo.usedBytes));
                    };
                    barChart.setOption(scope.option);
                    barChart.resize();
                });
            }
        };
    })
    .directive('pieCharts',function(){
        return{
            restrict:'EA',
            scope:{
                source : '='
            },
            template:'<div>饼图</div>',
            controller:function($scope){
            },
            link:function(scope,element,attr){
    
                var chart = element.find('div')[0];
                var parent = element['context'];
                var width , height;
                width = parent.clientWidth || 200;
                height = parent.clientHeight || 200;
                chart.style.width = (width - 0) +'px';
                chart.style.height = (height + 0) +'px';
                
                var pieChart = echarts.init(chart);
                scope.option = {
                           backgroudColor:'#F2F2F2',
                           title : {
                               text: '',
                               x:'center',
                               y:'bottom',
                               padding:[20,0,5,0],
                               textStyle:{
                                   fontSize:16
                               }
                           },
                           tooltip:{
                               trigger:'item',
                               formatter:'{a}<br/>{b} {c}({d}%)',
                               position:[-10, 10]
                           },
                           series:[
                                    {
                                        name:'空间使用',
                                        type:'pie',
                                        radius:'65%',
                                        center:['50%','60%'],
                                        label:{
                                            normal:{
                                                show : true,
                                                position : 'inside'
                                            }
                                        },
                                        data:[
                                            {
                                                value: 0 ,
                                                name:'已使用',itemStyle:{
                                                normal:{
                                                    color:'#324A5B'
                                                }
                                            }},
                                            {
                                                value: 0,
                                                name:'未使用',
                                                itemStyle:{
                                                normal:{
                                                    color:'#C13530'
                                                }
                                            }}
                                        ],
                                        itemStyle:{
                                            emphasis: {
                                                shadowBlur: 10,
                                                shadowOffsetX: 0,
                                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                                            }
                                        }
                                    }
                           ]
                        };
                
                scope.$watch('source', function(newVal, oldVal, scope){
                    var baseunit = newVal;
                    scope.option.title.text = baseunit.name;
                    scope.option.series[0].data[0].value = baseunit.spaceInfo.usedBytes;
                    scope.option.series[0].data[1].value = baseunit.spaceInfo.capacityGigaBytes - baseunit.spaceInfo.usedBytes;
                    pieChart.setOption(scope.option);
                    pieChart.resize();
                });
            }
        };
    })
    View Code

     4、主页:

    <!DOCTYPE html>
    <html lang="zh_CN" data-ng-app="nsiteConsoleApp">
        <head>
            <meta charset="UTF-8">
            <link rel="stylesheet" href="../3rd/font-awesome/css/font-awesome.min.css">
            <link rel="stylesheet" href="../3rd/bootstrap/css/bootstrap.min.css">
            <link rel="stylesheet" href="../3rd/bootstrap/css/bootstrap-theme.min.css">
            <link rel="stylesheet" href="css/manage/space.css">
            <script src="../3rd/echarts/echarts.js"></script>
            <script src="js/controllers/manage/space.js"</script>
                    <script src="../3rd/jquery/jquery.min.js"></script>
            <script src="../3rd/bootstrap/js/bootstrap.min.js"></script>
            <script src="../3rd/angular.min.js"></script>
    </script>
            <!--  -->
            <script src="../3rd/date-ui/date-ui.js"></script>
            <!--  -->
        </head>
        <body data-ng-controller="MainController">
            
            <header id="nv_header" data-ng-if="session.isLogged">
                <nav class="navbar navbar-inverse" role="navigation">
                </nav>
            </header>
            <nav id="nv_left" data-ng-if="session.isLogged">
            </nav>
            <article id="nv_content" data-ng-view data-ng-if="session.isLogged || isLogging"></article>
            <footer></footer>
        </body>
    
    </html>

    以上!

  • 相关阅读:
    python 适合的才是最好的
    [转]linux 同步IO: sync、fsync与fdatasync
    Java Metrics系统性能监控工具
    [转]mysql共享锁和排它锁
    基于空间数据库MongoDB实现全国电影票预定系统
    sharing-jdbc分库分表规则
    乐观锁更新失败处理小坑
    通过MessageFormat进行字符格式拼接,比String.format跟方便
    通过jvisualvm监控fullgc
    防止重复提交
  • 原文地址:https://www.cnblogs.com/liangblog/p/5842974.html
Copyright © 2020-2023  润新知