使用 flex4 開發通用統計系統,釋出原始碼至github
1,關於flex4
很老的技術,我居然還再研究使用這個東西,自己想想都不敢相信。
技術存在總是有他的理由的。之所以想用flex4 開發一個通用統計系統,還是有幾個有點的:
a,元件比較全,比較全,基本上省去了自己開發
b,在區域網下一次獲取大量json資料並解析展示到flex裡面速度比html快,圖示效果比較好
c,開發系統一個人就夠了,瀏覽器相容比較好,只要安裝flash就行,尤其要做成產品給xp系統的使用那個IE相容性痛苦啊
當然也有缺點,技術學習成本不低,屬於不流行的沒落的技術。
但這個不影響做專案,專案的技術選型要合理,維護成本低,綜合考慮,而不是所有的全部用新技術,把自己玩死。
存在就有他的意義,不影響做專案,不影響掙錢。
2,系統設計原理
統計系統,設計的不是解決某一個統計問題,而是做一個統計的展示介面,把統計的sql都做xml配置起來。
系統展示介面展示效果:
其中系統的左側選單是menu.xml進行控制的
- <?xml version="1.0" encoding="utf-8"?>
- <!-- 定義左側選單: -->
- <menus>
- <menu label="使用者資料統計">
- <menu label="使用者註冊統計" module="/assets/flex/DataGrid.swf" id="stat-demo"/>
- <menu label="使用者登陸統計" module="/assets/flex/DataGrid.swf" id="stat-user-reg"/>
- </menu>
- <menu label="系統設定">
- <menu label="選單管理" module="/assets/flex/DataMenu.swf" />
- <menu label="資料管理" module="/assets/flex/DataCRUD.swf" />
- </menu>
- </menus>
通過配置不同的flash檔案可以展示不同的配置顯示。
通過擴充套件module可以擴充套件展示效果。
stat-user-reg.xml配置,顯示查詢資料
- <?xml version="1.0" encoding="UTF-8"?>
- <stats>
- <!-- 統計資料xml 按照id進行查詢。-->
- <stat id="stat-demo-1">
- <!-- 展示資料 -->
- <list>
- <column field="id" text="id"/>
- <column field="name" text="註冊姓名"/>
- <column field="sex" text="註冊性別"/>
- <column field="city" text="註冊城市"/>
- <column field="phone" text="註冊電話"/>
- </list>
- <sql><![CDATA[
- select id,`name`,sex,city,phone,address,qq,email from stat_demo_01 limit 10
- ]]></sql>
- </stat>
- </stats>
顯示效果如下:
目前已經完成資料顯示。但沒有資料查詢和分頁配置,繼續開發。
3,服務端程式碼
服務端,讀取xml中的sql語句和配置,拼接成json資料。
- /**
- * User: freewebsys.com
- */
- @Service("statBaseService")
- public class StatBaseServiceImpl implements StatBaseService {
- @Autowired
- private StatBaseDao statBaseDao;
- //讀取xml檔案返回Document。
- private Document xmlReader(String confXml) {
- try {
- SAXReader reader = new SAXReader();
- return reader.read(IOUtils.toInputStream(confXml));
- } catch (DocumentException e) {
- e.printStackTrace();
- return null;
- }
- }
- //主函式,負責迴圈處理節點。
- public String findStat(String confXml) {
- Document document = xmlReader(confXml);
- System.out.println(document);
- List<DefaultElement> list = document.selectNodes("/stats/stat");
- for (DefaultElement element : list) {
- mergeStatElement(element);
- }
- return document.asXML();
- }
- private DefaultElement mergeStatElement(DefaultElement element) {
- System.out.println(element);
- //處理查詢出所有列表顯示的元素。
- List<DefaultElement> columnList = element.selectNodes("list/column");
- //找到查詢sql。
- Node sqlNode = element.selectSingleNode("sql");
- String sql = sqlNode.getText();
- //獲取資料後將節點刪除。在客戶端不顯示。
- element.remove(sqlNode);
- System.out.println(sql);
- List<Map<String, Object>> list = statBaseDao.findStat(sql, null);
- JSONArray jsonArray = new JSONArray();
- for (Map<String, Object> tmpData : list) {
- JSONObject jsonObject = new JSONObject();
- for (DefaultElement column : columnList) {
- System.out.println(column);
- String columnName = column.attributeValue("field");
- Object objValue = tmpData.get(columnName);
- jsonObject.put(columnName, objValue);
- //將一行資料組織成物件,放到陣列裡面。
- }
- jsonArray.add(jsonObject);
- }
- DefaultElement elementData = new DefaultElement("data");
- elementData.add(new DefaultCDATA(jsonArray.toJSONString()));
- //增加data欄位,儲存json資料。
- element.add(elementData);
- return element;
- }
- //讀取配置檔案。
- public String readConfFile(String configName) {
- String basePath = StatBaseServiceImpl.class.getResource("/")
- .toString().replace("file:", "");
- try {
- return FileUtils.readFileToString(new File(basePath + configName), "utf-8");
- } catch (IOException e) {
- e.printStackTrace();
- return "";
- }
- }
- }
通過讀取xml配置檔案,將資料返回
- <?xml version="1.0" encoding="UTF-8"?>
- <stats>
- <!-- 統計資料xml 按照id進行查詢。-->
- <stat id="stat-demo-1">
- <!-- 展示資料 -->
- <list>
- <column field="id" text="id"/>
- <column field="name" text="註冊姓名"/>
- <column field="sex" text="註冊性別"/>
- <column field="city" text="註冊城市"/>
- <column field="phone" text="註冊電話"/>
- </list>
- <data><![CDATA[[{"city":"city_222","id":1,"name":"222","phone":"1222","sex":"1"},
- {"city":"city_33","id":2,"name":"33","phone":"233","sex":"0"},
- {"city":"city_33","id":3,"name":"33","phone":"333","sex":"1"},
- {"city":"city_45","id":4,"name":"45","phone":"445","sex":"0"},
- {"city":"city_6","id":5,"name":"6","phone":"56","sex":"1"},
- {"city":"city_7","id":6,"name":"7","phone":"67","sex":"0"},
- {"city":"city_8","id":7,"name":"8","phone":"78","sex":"1"},
- {"city":"city_9","id":8,"name":"9","phone":"89","sex":"0"},
- {"city":"city_9","id":9,"name":"9","phone":"99","sex":"1"},
- {"city":"city_11","id":10,"name":"11","phone":"1011","sex":"0"}]]]></data></stat>
- </stats>
資料包括配置的xml和返回的資料。
4,客戶端flex4程式碼
跟新xml返回的資料,動態生成AdvancedDataGridColumn,並新增到 AdvancedDataGrid裡面。
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx"
- width="100%" height="100%" initialize="initApp();">
- <fx:Style source="./assets/main.css" />
- <fx:Declarations>
- <mx:HTTPService id="moduleService" method="GET"
- resultFormat="e4x" result="resultHandler();"/>
- </fx:Declarations>
- <fx:Style>
- @namespace s "library://ns.adobe.com/flex/spark";
- @namespace mx "library://ns.adobe.com/flex/mx";
- mx|Text.headLabelStyle{fontSize:20;fontWeight:bold;}
- </fx:Style>
- <fx:Script>
- <![CDATA[
- import mx.collections.*;
- import mx.controls.*;
- import mx.controls.advancedDataGridClasses.*;
- import mx.utils.*;
- import spark.components.*;
- private function initApp():void{
- try {
- /* 刪除問號前面的所有內容,包括問號。 */
- var myPattern:RegExp = /.*\?/;
- var url:String = this.loaderInfo.url.toString();
- //Alert.show(this.loaderInfo.height+","+this.loaderInfo.width);
- dataGridGroup.width = this.loaderInfo.width;
- //dataGridGroup.height = this.loaderInfo.height;
- url = url.replace(myPattern, "");
- /* 建立一個形如name=value字串陣列 */
- var params:Array = url.split("&");
- /* 輸出陣列中的引數,找到moduleId,這個引數,其他引數類似。 */
- var moduleId:String = "";
- for (var key:String in params) {
- var value:String = String(params[key]);
- if(value.indexOf("moduleId=") >= 0){
- moduleId = value.replace("moduleId=","");
- break;
- }
- }
- //Alert.show(moduleId);
- //設定請求地址獲取模組引數配置。
- moduleService.url = "/stat/module/data.do?moduleId="+moduleId;
- moduleService.send();
- } catch (e:Error) {
- trace(e);
- }
- /* 顯示loaderInfo的一些有用的資訊 */
- trace("AS version: " + this.loaderInfo.actionScriptVersion);
- //trace("App height: " + this.loaderIno.height);
- //trace("App width: " + this.loaderInffo.width);
- trace("App bytes: " + this.loaderInfo.bytesTotal);
- }
- private function genWhere(dataXml:XML):HGroup{
- var hgroup:HGroup = new HGroup();
- //保證居中和左對齊。
- hgroup.verticalAlign="middle"
- hgroup.horizontalAlign = "left";
- //Alert.show(dataXml.where.column);
- for each(var objWhere:Object in dataXml.where.column){
- var field:String = objWhere.@field;
- var text:String = objWhere.@text;
- var inputLabel:spark.components.Label = new spark.components.Label();
- inputLabel.text = text;
- hgroup.addElement(inputLabel);
- var input:spark.components.TextInput = new spark.components.TextInput();
- input.id = field;
- hgroup.addElement(input);
- var sp:Spacer = new Spacer();
- sp.width = 10;
- hgroup.addElement(sp);
- }
- //如果存在where資料則增加查詢按鈕。
- if(dataXml.where.column.length() > 0){
- var search:spark.components.Button = new spark.components.Button();
- search.label = "查詢";
- hgroup.addElement(search);
- }
- return hgroup;
- }
- //動態生成 AdvancedDataGrid 資料表單.
- private function genAdvancedDataGrid(dataXml:XML):AdvancedDataGrid{
- //Alert.show(menuList.source.columns.column);
- //Alert.show(menuList.source.data);
- //格式化json資料。將資料轉換成陣列。放到DataGrid裡面。
- var tmpArray:Array = (JSON.parse(dataXml.data) as Array);
- //Alert.show(array.length());
- var dataArray:ArrayCollection = new ArrayCollection(tmpArray);
- //#######################設定列表顯示頂部標題.
- var columnArray:Array = new Array();
- for each(var objColumn:Object in dataXml.list.column){
- var dataField:String = objColumn.@field;
- var headerText:String = objColumn.@text;
- var width:String = objColumn.@width;
- //設定DataGridColun標題,和顯示屬性。
- var adColumn:AdvancedDataGridColumn = new AdvancedDataGridColumn(dataField);
- adColumn.headerText = headerText;
- if(width){
- adColumn.width = Number(width);
- }
- columnArray.push(adColumn);
- }
- //adg1.columns();
- //adg1.columnCount();
- //adg1.columns(columnArray);
- var adg:AdvancedDataGrid = new AdvancedDataGrid();
- adg.id = "adg-"+id;
- adg.dataProvider = dataArray;
- adg.columns = columnArray;
- adg.rowCount = tmpArray.length + 1;
- return adg;
- }
- //請求資料成功之後處理動態生成表格。
- private function resultHandler():void{
- for each(var obj:Object in moduleService.lastResult.stat){
- var dataXml:XML = obj as XML;
- //獲得模板id,標題.
- var id:String = dataXml.@id;
- var title:String = dataXml.@title;
- //設定
- var vgroup:VGroup = new VGroup();
- //設定內邊距15。
- vgroup.paddingTop = 15;
- vgroup.paddingLeft = 15;
- vgroup.paddingRight = 15;
- vgroup.paddingBottom = 15;
- //設定標題。
- var titleText:Text = new Text();
- titleText.text = title;
- titleText.styleName = "headLabelStyle";
- vgroup.addElement(titleText);
- var hgroup:HGroup = genWhere(dataXml);
- vgroup.addElement(hgroup);
- //生成高階表格。
- var adg:AdvancedDataGrid = genAdvancedDataGrid(dataXml);
- vgroup.addElement(adg);
- dataGridGroup.addElement(vgroup);
- }
- }
- ]]>
- </fx:Script>
- <!-- 設定如果超過高度滾動. -->
- <s:VGroup id="dataGridGroup" height="100%"/>
- </mx:Module>
5,後續&程式碼
這只是最簡單的應用,功能還需要完善。
程式碼已經放到github上面了。 https://github.com/freewebsys/flex4-stat
工程需要使用flahs builder 開啟。
這個也釋出到csdn上面了:
http://blog.csdn.net/freewebsys/article/details/39137035
相關文章
- 使用EasyUI開發銀行業績統計系統[4]-EasyUI表單UI行業
- Mac如何上傳專案原始碼至GitHubMac原始碼Github
- github釋出開源專案程式碼教程Github
- 開原始碼審計系統 Swallow 內測釋出原始碼
- 使用EasyUI開發銀行業績統計系統[21]-選單管理的Code OnUI行業
- [指令碼例項]——統計系統資訊指令碼指令碼
- Flutter手勢密碼外掛從開發到釋出至pub倉庫Flutter密碼
- 使用EasyUI開發銀行業績統計系統[11]-EasyUI樹形控制元件trUI行業控制元件
- vue外掛開發、文件書寫、github釋出、npm包釋出一波流VueGithubNPM
- 使用 Github Action 釋出 Flutter 外掛GithubFlutter
- 使用TortoiseGit下載GitHub原始碼Github原始碼
- Github上如何找開原始碼Github原始碼
- GitHub釋出改進開發工作流的新工具Github
- 在GitHub上的Android開原始碼SuperTextView的使用GithubAndroid原始碼TextView
- 開原始碼庫Github使用者超140萬原始碼Github
- 好用的統計系統piwik
- Github Action釋出Github
- 驚喜釋出:koahub原始碼交易平臺迅貓多使用者商城系統3.0[原始碼]原始碼
- 05.ElementUI原始碼學習:專案釋出配置(github pages&npm package)UI原始碼GithubNPMPackage
- iPhone iOS 9系統原始碼已被洩露至GitHub 越獄者或可找到新方法iPhoneiOS原始碼Github
- Java工作量統計系統Java
- Yii2 + AdminLET 開源通用後臺管理系統原始碼原始碼
- GitHub Copilot for Business 正式釋出,重新定義開發生產力Github
- 釋出aar到GithubGithub
- 使用 Github Actions 持續釋出 Flutter 應用GithubFlutter
- 大公司在github的開原始碼Github原始碼
- GitHub + VSTS 開原始碼雙向同步Github原始碼
- 教育直播APP原始碼開發系統APP原始碼
- 跨境商城系統開發原始碼部署原始碼
- 艾倍生系統開發原始碼部署原始碼
- 墨菲安全正式釋出 murphysec 開源專案!讓開發者更安全的使用開原始碼原始碼
- 遊戲直播原始碼直播系統開發與定製,全開源原始碼無加密終身使用權遊戲原始碼加密
- 使用 Github Action 進行前端自動化釋出Github前端
- FFmpeg開發筆記(六)如何訪問Github下載FFmpeg原始碼筆記Github原始碼
- 多端統一開發框架 Taro 1.0 正式釋出框架
- github原始碼管理工具——使用介紹Github原始碼
- 使用ant釋出系統
- 合約量化系統開發(原始碼搭建)原始碼