一、相关问题记录:
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;
}
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();
});
}
};
})
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>
以上!