1. 程式人生 > >echarts 餅圖 結合thinkphp 的使用

echarts 餅圖 結合thinkphp 的使用

首先看看echars官網上餅圖用法的例項(如下圖):


然後來說說這個餅圖結合Thinkphp的用法。

思路是這樣的:

1.控制器先查詢出要的資料包括:legend裡data的資料,series裡data的資料。

2.把得到的資料處理成json資料,分配到檢視。

3.利用分配過來的資料,得到想要的餅圖。

具體程式碼如下:

控制器:

public function index(){

		//var_dump($res_es);

		$gno = M("auth_group")->count();
		$this->assign('gno',$gno);

		$uno = M("auth_user")->count();
		$this->assign('uno',$uno);




		$ino = M("info")->count();
		$this->assign('ino',$ino);

		$bcno = M("bike_company")->count();
		$this->assign('bcno',$bcno);


		$uid = $_SESSION['auth']['id'];
		//暫時先將超級管理員區別開
		if($uid!=1){


			//非管理員,根據行政級別進行過濾
			//echo "x";

			//根據行政級別,做相應的過濾
			$province = $_SESSION['auth']['province'];
			$city = $_SESSION['auth']['city'];
			$area = $_SESSION['auth']['area'];

			if($_SESSION['auth']['class']=='省級'){
				$sql .= " and province = '$province' ";
				$where["province"] = $_SESSION['auth']['province'];
			}
			if($_SESSION['auth']['class']=='市級'){
				$sql .= " and province = '$province' ";
				$sql .= " and city = '$city' ";
				$where["province"] = $_SESSION['auth']['province'];
				$where["city"] = $_SESSION['auth']['city'];
			}
			if($_SESSION['auth']['class']=='區級'){
				$this->assign('ibno',1);
				$this->assign('uno',1);
				$this->assign('gno',1);

				$sql_area_count = "SELECT COUNT(*) as count FROM dwz_info where area = '$area'";
				$count = M()->query($sql_area_count);
				$this->assign('ino',$count[0]['count']);

				$sql .= " and province = '$province' ";
				$sql .= " and city = '$city' ";
				$sql .= " and area = '$area' ";
				$where["province"] = $_SESSION['auth']['province'];
				$where["city"] = $_SESSION['auth']['city'];
				$where["area"] = $_SESSION['auth']['area'];
			}

			$res_es = $this->getbikes_pca($province,$city,$area);
			$buckets = $res_es['aggregations'][3]['buckets'];

			//var_dump($res_es['hits']['total']);
			foreach($buckets as $k => $v){
				//var_dump($v);
				$arr1[]=$v['key'];
				$temp['name']=$v['key'].'('.$v['doc_count'].')';
				$temp['value']=$v['doc_count'];
				$arr2[]=(object)$temp;
			}

			//var_dump($arr1);
			//var_dump($arr2);
			$str1 = json_encode($arr1);
			$str2 = json_encode($arr2);
			$this->assign('length',$length);
			$this->assign('str1',$str1);
			//var_dump($str2);
			$this->assign('str2',$str2);

			$this->assign('bno',$res_es['hits']['total']);
			$this->display();
		}else{

			$sql_area_count = 'SELECT COUNT(DISTINCT area) as count FROM dwz_info';
			$count = M()->query($sql_area_count);
			$this->assign('ibno',$count[0]['count']);
			//超級管理員暫時去資料庫獲取
			//echo "xx";

			$data=array();
			//獲取每家公司的單車數量
			$list = M("bike_company")->select();
			$this->assign('list1',$list);
			//var_dump($list);
			foreach($list as $k=>$v){
				$nm = $v['title'];
				//var_dump($nm);
				//模糊查詢相關的記錄情況
				//查詢的同時,將當前時刻的資料記錄到資料庫表
				$arr = explode('|',$v['keyword']);
				//var_dump($arr);
				//echo sizeof($arr);
				$condition = '' ;
				foreach($arr as $k=>$v){
					if($k < sizeof($arr)-1)
					{

						if($v=='ofo'){
							$condition .= " name like '$v' or ";
						}else{
							$condition .= " name like '$v%' or ";
						}

						/*if($v=='' or $v=='NULL' or $v=='null'){
                            $condition .= " name like '' or ";
                        }else{
                            $condition .= " name like '$v%' or ";
                        }*/

					}
					else
					{
						if($v=='ofo'){
							$condition .= " name like '$v' ";
						}else{
							$condition .= " name like '$v%' ";
						}
						/*
                        if($v=='' or $v=='NULL' or $v=='null'){
                            $condition .= " name like '' ";
                        }else{
                            $condition .= " name like '$v%' ";
                        }*/

					}
				}
				//var_dump($condition);
				//$name = $v['title'];
				$sql="select count(*) as numbers ,' $nm ' AS name  from dwz_bike where ".$condition;
				$Model = M();
				$res = $Model->query($sql);
				//var_dump($res);
				$data[]=$res;
			}
			//一定的時間記錄一次,做數量變化統計圖表


			//var_dump($data);
			$arr1=array();
			$arr2=array();
			$length=sizeof($data);
			$bnoo=0;
			foreach($data as $k => $v){
				//var_dump($v);
				$arr1[]=$v[0]['name'];
				$temp['name']=$v[0]['name'].'('.$v[0]['numbers'].')';
				$temp['value']=$v[0]['numbers'];
				$arr2[]=(object)$temp;
				$bnoo+=$v[0]['numbers'];
			}
			//$arr1[]='其他';

			//$temp['value']=$bno - $bnoo;
			//$temp['name']='其他'.'('.$temp['value'].')';
			//$arr2[]=(object)$temp;
			$bno = 0;
			//var_dump($arr2);
			foreach($arr2 as $k=>$v){
				$bno = $bno + $v->value;
			}
			$this->assign('bno',$bno);

			//var_dump($arr1);
			//var_dump($arr2);
			$str1 = json_encode($arr1);
			$str2 = json_encode($arr2);
			$this->assign('length',$length);
			$this->assign('str1',$str1);
			//var_dump($str2);
			$this->assign('str2',$str2);
			$this->assign('title','首頁');
			$this->display();

		}

檢視:
<extend name="Public:left" />
<block name="main">
<script src="https://cdn.bootcss.com/jquery/2.2.3/jquery.js"></script>
<script src="http://echarts.baidu.com/gallery/vendors/echarts/echarts-all-3.js"></script>

<div class="row tile_count">
            <div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
              <span class="count_top"><i class="fa fa-group"></i> 所有分組 </span>
              <div class="count">{$gno}</div>
              <!--<span class="count_bottom"><i class="green">4% </i> </span>-->
            </div>
            <div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
              <span class="count_top"><i class="fa fa-user"></i> 所有使用者 </span>
              <div class="count">{$uno}</div>
              <!--<span class="count_bottom"><i class="green"><i class="fa fa-sort-asc"></i>3% </i> From last Week</span>-->
            </div>
            <div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
              <span class="count_top"><i class="fa fa-pie-chart"></i> 所有區塊 </span>
              <div class="count">{$ibno}</div>
             <!--<span class="count_bottom"><i class="green"><i class="fa fa-sort-asc"></i>3% </i> From last Week</span>-->
            </div>
            <div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
              <span class="count_top"><i class="fa fa-sitemap"></i> 所有車位 </span>
              <div class="count">{$ino}</div>
             <!--<span class="count_bottom"><i class="green"><i class="fa fa-sort-asc"></i>3% </i> From last Week</span>-->
            </div>
            <div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
              <span class="count_top"><i class="fa fa-user-plus"></i> 所有車企 </span>
              <div class="count">{$bcno}</div>
             <!--<span class="count_bottom"><i class="green"><i class="fa fa-sort-asc"></i>3% </i> From last Week</span>-->
            </div>
            <div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
              <span class="count_top"><i class="fa fa-bicycle"></i> 所有車輛 </span>
              <div class="count">{$bno}</div>
              <!--<span class="count_bottom"><i class="green"><i class="fa fa-sort-asc"></i>3% </i> From last Week</span>-->
            </div>
          </div>

<div id="main" style="width: 100%;height:800px;"></div>

<!--可以隔一定時間記錄一次,然後顯示變化情況-->
 <!-- 為ECharts準備一個具備大小(寬高)的Dom -->
    <script type="text/javascript">
		
        // 基於準備好的dom,初始化echarts例項
        var myChart = echarts.init(document.getElementById('main'));
//var test = genData(50);
        
		var jstr1 = $.parseJSON('{$str1}');
		var jstr2 = $.parseJSON('{$str2}');
		

		option = {
			title : {
				text: '當前各個單車公司單車數量統計表',
				//subtext: '純屬虛構',
				x:'left'
			},
			tooltip : {
				trigger: 'item',
				formatter: "{a} <br/>{b} : {c} ({d}%)"
			},
			legend: {
				type: 'scroll',
				orient: 'vertical',
				right: 10,
				top: 20,
				bottom: 20,
				data: jstr1
			},
			series : [
				{
					name: '車企',
					type: 'pie',
					radius : '55%',
					center: ['40%', '50%'],
					data: jstr2,
					itemStyle: {
						emphasis: {
							shadowBlur: 10,
							shadowOffsetX: 0,
							shadowColor: 'rgba(0, 0, 0, 0.5)'
						}
					}
				}
			]
		};


        // 使用剛指定的配置項和資料顯示圖表。
        myChart.setOption(option);
		
		function realtime(){
			location.reload();
			console.log("realtime");
		}
		setInterval("realtime()",60000)
    </script>


</block>