CBoard框架使用总结七--添加首页图表
来源:互联网 发布:贴吧找图软件 编辑:程序博客网 时间:2024/06/03 05:09
文章内容
- 原理概括
- 数据库调整
- 前端实现
- 总结
1.原理概括
在实际运用中我们可能不希望首页空白,同时希望用户客户化的配置自己想显示的图表,于是有了文章下面将要谈及的内容。
首先,由于是用户级的设置,需要在数据库建立对应的配置表(比如dashboard_user_option),用于保存用户相关配置;
其次,需要用户主页布局配置功能界面,可以参考引用系统原有的“看板设计”功能;
最后,就是图表的渲染了,同样可以借鉴现有的看板的实现(webapp\org\cboard\controller\dashboard\dashboardViewCtrl.js),其次就是确定显示的位置了,由于现有前端框架使用的是adminLTE,基于angularJS路由机制实现功能界面的跳转,所以,首页的布局可以放在ui-view中,在切换功能时,实现可以进行覆盖;
2.数据库实现
数据库的调整主要是增加由于保存用户配置的数据库表;
示例:
然后就是基于Mybatis自动生成Dao层相关代码;
3.前端实现
3.1.主页图表显示
在主页中我们对图表有的功能进行了简化,比如导出功能,行参数等;
通过分析看板界面的实现,我们发现几个主要的函数:
var loadCharts = function(){}//获取图表配置并解析,调用loadWidget方法var loadWidget = function (reload)//遍历图表,调用buildRender方法绘制图表var buildRender = function (w, reload)//通过chartService服务实现各类图表绘制$scope.modalChart = function (widget)//图表弹窗显示
需要注意的是,图表配置的JSON格式,我们并未对原有格式进行调整
每一个widget对象还有两个比较重要的状态控制
widget.loading = true; widget.show = true;
分别用于加载框和隐藏控制
其次,是前端布局模板,同样可以借鉴看板功能(webapp\org\cboard\view\dashboard\layout\grid.html)
示例:
主页模板文件(webapp\starter\home-page.html)
<!-- Content Wrapper. Contains page content --><section class="content-header"></section><div id="inner-container" class="content"> <div class="row" ng-repeat="row in charts.rows track by $index" ng-style="{height:row.height+'px'}"> <div ng-repeat="widget in row.widgets track by $index"> <div ng-if="widget.show"> <dashboard-widget ng-show="widget.loading == false"></dashboard-widget> </div> <div ng-if="widget.loading || !widget.show" class="col-md-{{widget.width}}" style="height: 50px;"> <div class="box box-solid"> <div class="box-header"> <i class="fa fa-bar-chart-o"></i> <h3 class="box-title">{{widget.name}}</h3> <div class="box-tools pull-right"> <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i> </button> </div> </div> <div class="box-body" ng-style="{height:row.height?row.height:300+'px'}"> <i class="fa fa-spinner fa-spin"></i> {{"COMMON.LOADING" | translate}} </div> </div> </div> </div> </div></div>
将设计好的模板文件引入到ui-view(webapp\starter.html)中:
<!-- Content Wrapper. Contains page content --> <div class="content-wrapper" id="content-wrapper-id"> <div id="loading-bar-container"></div> <ui-view> <!-- Home Page --> <div ng-include="'starter/home-page.html'"></div> </ui-view> </div>
测试的话,可以复制dashboard_board表中的配置,下一节完成主页配置功能;
3.2.首页图表配置
好吧,也是copy代码。
配置界面模板:
webapp\org\cboard\view\config\board.html
webapp\org\cboard\view\config\board\grid\grid.html
配置界面控制器逻辑:
webapp\org\cboard\controller\config\boardCtrl.js
因为只是完成主页配置,保存设置之后的JSON配置,简化之后如下:
配置界面模板:
文件:webapp\org\cboard\view\config\homePage.html
<!-- Content Wrapper. Contains page content --><div id="inner-container" class="content"> <div class="row"> <div class="col-md-9"> <div class="box"> <div class="box-header with-border"> <h3 class="box-title">{{'HOME_PAGE.CONFIG.TITLE'|translate}}</h3> </div> <div class="box-body"> <div class="row"> <div class="col-md-12"> <div ng-include="'org/cboard/view/config/homePage/grid.html'"></div> </div> </div> <!-- /.box-body --> <div class="box-footer"> <div class="row"> <div class="col-md-12"> <div class="form-group"> <button type="submit" class="btn btn-danger pull-right" ng-click="cancel()">{{'COMMON.CANCEL'|translate}}</button> <button type="submit" class="btn btn-success pull-right" ng-click="saveOption()" style="margin-right: 5px">{{'COMMON.SAVE'|translate}} </button> </div> </div> </div> </div> <!-- /.box-footer--> </div> </div> </div> </div></div>
文件: webapp\org\cboard\view\config\homePage\grid.html
<div class="row"> <div class="form-group" style="margin: 5px 15px;"> <button type="submit" class="btn btn-success" ng-click="addRow()"> {{'CONFIG.DASHBOARD.ADD_ROW'|translate}} </button> </div></div><div dnd-list="curBoard.layout.rows" dnd-allowed-types="['r']"> <div class="dndPlaceholder row margin"> <div class="box sort-highlight" style="height: 130px"></div> </div> <div class="row margin" ng-repeat="row in curBoard.layout.rows"> <div ng-include="'org/cboard/view/config/board/grid/widget.html'"></div> </div></div><div class="row" ng-if="curBoard.layout.rows.length >= 3"> <div class="form-group" style="margin: 5px 15px;"> <button type="submit" class="btn btn-success" ng-click="addRow()"> {{'CONFIG.DASHBOARD.ADD_ROW'|translate}} </button> </div></div>
文件: webapp\org\cboard\controller\config\homePageCtrl.js
cBoard.controller('homePageCtrl', function ($rootScope, $scope, $http, ModalUtils, $filter, $uibModal, $timeout, dataService, $state, $window) { var translate = $filter('translate'); $scope.curBoard = {layout: {rows: []}}; var getCurBoard = function(){ $http.get("commons/getHomePageWidget.do").success(function(response){ if(response && response.optValue){ $scope.curBoard = angular.fromJson(response.optValue); } }); }; var getDatasetList = function () { $http.get("dashboard/getDatasetList.do") .then(function (response) { $scope.datasetList = response.data; return $http.get("dashboard/getWidgetList.do"); }) .then(function (response) { $scope.widgetList = response.data; $scope.widgetList = $scope.widgetList.map(function (w) { if (w.data.datasetId != null) { var dataset = _.find($scope.datasetList, function (ds) { return ds.id == w.data.datasetId; }); w.dataset = dataset == null ? 'Lost DataSet' : dataset.name; } else { w.dataset = "Query"; } return w; }); } ); }; $scope.widgetGroup = function (item) { return item.categoryName; }; $scope.addWidget = function (row) { var w = {}; w.name = '图表名称'; w.width = 12; w.widgetId = $scope.widgetList[0].id; row.widgets.push(w); }; $scope.addRow = function () { $scope.curBoard.layout.rows.push({type: 'widget', widgets: []}); }; $scope.addNode = function (node) { $scope.curBoard.layout.rows.push({node: node, type: 'widget', widgets: []}); }; $scope.saveOption = function(){ $http.post("commons/saveHomePageWidget.do",{json:angular.toJson($scope.curBoard)}).success(function(response){ if(response.status == 1){ window.location.replace('starter.html'); } else{ ModalUtils.alert(response.msg,"modal-warning", "sm"); } }); }; $scope.cancel = function(){ window.location.replace('starter.html'); }; getCurBoard(); getDatasetList();});
最后,配置路由规则,添加跳转功能按钮,则大功告成;
示例:
4.总结
其实,前面大部分的代码都是在理解原有实现的基础上,进行的copy和简化;
TIP:
其实,我在做的过程中遇到遇到一个棘手的问题:
现在前端功能界面的切换都是基于angularJS路由实现的,包括用户配置的看板,但是当这个数据量比较大时,会比较费时(虽然在有缓存的情况下,页面渲染是一个问题),于是,我们想加入TAB标签页来解决,但是,发现基于angularJS路由机制的TAB标签页供能并不容易实现,要不就放弃路由机制,希望大牛们不吝赐教!!!
- CBoard框架使用总结七--添加首页图表
- CBoard框架使用总结一
- CBoard框架使用总结二--扩展新的功能模块
- CBoard框架使用总结三--AdminLTE可扩展性分析
- CBoard框架使用总结五--扩展菜单配置功能
- CBoard框架使用总结五--角色权限控制
- CBoard框架数据集实现--DataProvider
- mui框架使用侧滑并在首页添加上拉加载功能出现的问题
- Android使用HttpUtils框架首页检查更新
- MPAndroidChart图表类框架的使用
- 数据可视化:常用图表使用总结
- java集合框架总结(七)
- 牛客网刷题知识点总结(七)java框架
- SQLITE3 使用总结(七)
- 使用redis对商城的首页添加缓存
- FusionCharts使用教程:为图表添加向下钻取链接
- android下图表工具graphview使用之添加坐标标签
- 实现首页框架的tab签,点击模块在首页添加tab签之后,同时显示其对应的页面
- 浅谈主键索引与唯一索引
- Linux内存管理
- Android学习
- 浅谈对JIT编译器的理解。
- 栈的基本操作
- CBoard框架使用总结七--添加首页图表
- 北京师范大学第十四届ACM决赛- K ACM Battle 爆搜
- 数据结构 幻方
- 正则表达式的匹配日常记录
- MyBatis中Like语句使用方式
- 手写实现二叉排序树
- 树的查找-->二叉排序树的查找算法全解
- java 定时任务
- 网络加载 转圈 最简单写法 dialog