檔案管理系統是經過創建統一的標準以規範整個文件管理,包括規範各業務系統的文件管理的完整的檔案資源信息共享服務平臺,主要實現檔案流水化採集功能。爲企事業單位的檔案現代化管理,提供完整的解決方案,檔案管理系統既能夠自成系統,爲用戶提供完整的檔案管理和網絡查詢功能,也能夠與本單位的OA辦公自動化和DPM設計過程管理,或者與MIS信息管理系統相結合,造成更加完善的現代化信息管理網絡。傳統檔案館隨着社會的快速發展與變化,其內在形式上也發生了巨大變化,逐漸演變爲現代智慧檔案館。智慧檔案館以現代科技爲依託,充分結合現代物聯網技術與雲計算技術構建完善的城市智慧檔案,實現了現代社會全面管理的目標。本文以當前流行的 H5 技術爲主,爲現代智慧檔案館提供一套 WEB 解決方案。node
在本例中,將使用 HT UI 組件對頁面實現佈局;使用 RelativeLayout 相對佈局器將頁面分爲三個部分:left, top, center,使用 VBoxLayout 縱向佈局器將 LEFT 部分分爲 logo,editor,chart 三個部分json
Graph3dView 是 HT(www.hightopo.com) 組件中加載 3D 模型的拓撲組件,RelativeLayout 則是 HT 提供的 UI 解決方案,UI 組件中提供 HTView 組件來實現拓撲與 UI 的融合。網絡
// 初始化相對佈局器 var relativeLayout = new ht.ui.RelativeLayout(); // 初始化 3D 拓撲 var g3dView = new ht.graph3d.Graph3dView(); // 初始化 HTVIEW 組件, 並將 3D 拓撲放入其中 var htView = new ht.ui.HTView(g3dView); // 佈局器加載 HTVIEW 組件 relativeLayout.addView(htView, { width: 'match_parent', // 填滿 height: 'match_parent', // 填滿 marginTop: 64, // 爲 TOP 留下空間 marginLeft: 250 // 爲 LEFT 留下空間
});
左側的 EDITOR 部分使用 HT 的調色板組件(ht.widget.Palette), 將檔案袋添加到調色板上,並設置爲能夠拖拽:
佈局
var palette = new ht.widget.Palette(); // palette 面板是將圖元都分在「組」裏面,而後向「組」中添加圖元便可 var group = new ht.Group(); // 設置分組爲打開的狀態 group.setExpanded(true); // 設置組的說明 group.setName('基礎圖元'); palette.dm().add(group); // 添加子圖元 var childNode = new ht.Node(); childNode.setParent(group); childNode.setName(name); childNode.setImage(image); childNode.s({ 'draggable': true, // true 爲可拖拽 'image.stretch': 'centerUniform' // 圖片申展方式 }); palette.dm().add(childNode);
在上一步中咱們對調色板中的圖元屬性設置了可拖拽,此時能夠實現拖拽圖元的動畫。可是並不能直接將圖元拖拽到 3D 場景中,實現思路是:
1. 在拖拽時獲取拖拽的圖元信息
2. 拖拽到對應位置時顯示可擺放位置
3. 結束拖拽後在對應位置建立對應的 3D 模型
對應代碼實現以下:
拖拽時獲取圖元信息
動畫
g3dView.getView().addEventListener('dragover', function(e) { e.preventDefault(); var paletteNode = palette.dm().sm().ld();// 獲取 palette 上最後選中的節點 if (!paletteNode || !g3d.getDataAt(e)) return; // 獲取鼠標下的節點 var data = g3d.getDataAt(e); if (data.s('shape3d') === '檔案櫃.json') { // 記錄文件袋拖拽到的是哪一個檔案櫃 g3dView._focusData = data; } });
拖拽到對應位置時建立 3D 模型,在實際實現過程當中因爲很難準確地獲取到檔案櫃中每個能夠擺放檔案袋的座標位置,因此在本例中採用了預置的方法。具體原理就是在先建立一個正常不可見的檔案櫃模型,並在其中將檔案袋都擺放完整,在拖拽時,將此不可見的模型與將要擺放的模型重合,此時只需判斷鼠標所在的點下是否存在預置的模型存在就能夠知道該處是否能夠建立 3D 模型,實現效果以下:ui
g3dView.getView().addEventListener('dragover', function(e) { ... // 舊邏輯省略 // 拖拽下來的時候設置 全部的 displayName 爲 box 的節點 爲可見 (這樣拖拽才能獲取到預置模型) array.forEach(function(data) { data.s('3d.visible', true); }); var data = g3d.getDataAt(e); if (data.s('shape3d') === '檔案櫃.json') { // 記錄文件袋拖拽到的是哪一個檔案櫃 g3dView._focusData = data; // 將預置模型移動到拖拽的櫃子座標 shelf.p3(data.p3()); } if(data.getDisplayName() === 'box') { // 將對應座標下預置的檔案袋模型進行顯示 // 該屬性可修改模型的透明度,更多屬性可參考 HT 風格手冊 data.s('shape3d.opacity', 0.8); } ... }) g3dView.getView().addEventListener('drop', function(e) { // 獲取鼠標位置模型 var data = g3dView.getDataAt(e); if(!data) return; // 鼠標位置不是預置模型,直接跳過 if(data.getDisplayName() !== 'box') return; data.s('shape3d.opacity', 0); // 放手時候設置 全部的 displayName 爲 box 的節點 不可見 array.forEach(function(data) { data.s('3d.visible', false); }); var node = new ht.Node(); node.s('shape3d', url); // 檔案袋 3D 模型地址 node.r3([Math.PI/2, -Math.PI/2, 0]); // 旋轉檔案袋模型, 使其平放 node.p3(data.p3()); node.setParent(g3dView._focusData); node.setHost(g3dView._focusData); });
上面咱們已經實現了檔案袋拖拽至 3D 場景的效果,可是咱們能夠發現檔案袋模型遠小於櫃子,要將檔案袋擺放到正確的位置並非那麼容易。因此此時咱們能夠將須要操做的檔案櫃放大到正中間,其它模型進行虛化處理。
雲計算
// 3D 拓撲交互監聽 g3dView.mi(function(e){ if(e.kind === 'doubleClickData') { // 雙擊事件 var shape3d = e.data.s('shape3d'), parentShape3d = e.data.getParent() && e.data.getParent().s('shape3d'); if (shape3d && shape3d.indexOf('檔案櫃') > -1) { // 重點突出檔案櫃 showDetail(e.data); } else if (parentShape3d && parentShape3d.indexOf('檔案櫃') > -1) { showDetail(e.data.getParent()); } } }); showDetail = function(data) { // 保存進入虛化狀態前 視角 與 中心點 eyeBack = ht.Default.clone(graph3dView.getEye()); centerBack = ht.Default.clone(graph3dView.getCenter()); // 設置相機指向配置 var opt = {}; opt.animation = true; opt.ratio = 1; opt.direction = [1, 0.5, 0]; opt.center = [data.getX(), 100, data.getY()]; graph3dView.flyTo(data, opt); focusData = data; data.s('select.brightness', 1); dataModel.each(function (d) { if (d === focusData || (!d.s('3d.selectable') && d.getTag() !== 'wall') || d.getParent() === focusData || d.getDisplayName() === 'box') return; // 將拓撲中除了要操做的櫃子 與櫃子中檔案袋 以及牆外 透明度都設置爲 opacity (0~1) // 保存設置前配置, 還原用 if (!opacityMap[d.getId()]) { opacityMap[d.getId()] = { 'shape3d.opacity': d.s('shape3d.opacity'), 'shape3d.transparent': d.s('shape3d.transparent'), 'all.opacity': d.s('all.opacity'), 'all.transparent': d.s('all.transparent'), 'left.opacity': d.s('left.opacity'), 'left.transparent': d.s('left.transparent'), 'right.opacity': d.s('right.opacity'), 'right.transparent': d.s('right.transparent'), 'front.opacity': d.s('front.opacity'), 'front.transparent': d.s('front.transparent'), 'back.opacity': d.s('back.opacity'), 'back.transparent': d.s('back.transparent'), 'top.opacity': d.s('top.opacity'), 'top.transparent': d.s('top.transparent'), 'bottom.opacity': d.s('bottom.opacity'), 'bottom.transparent': d.s('bottom.transparent'), '3d.selectable': d.s('3d.selectable') } } // 透明度設置爲 opacity d.s({ 'shape3d.opacity': opacity, 'shape3d.transparent': true, 'all.opacity': opacity, 'all.transparent': true, 'left.opacity': opacity, 'left.transparent': true, 'right.opacity': opacity, 'right.transparent': true, 'front.opacity': opacity, 'front.transparent': true, 'back.opacity': opacity, 'back.transparent': true, 'top.opacity': opacity, 'top.transparent': true, 'bottom.opacity': opacity, 'bottom.transparent': true, '3d.selectable': false }); }); }
退出虛化模式,以監控 3D 拓撲的選中變化來實現url
g3dView.dm().ms(function(e) { var lastData = g3dView.sm().ld(); // 判斷是否進行虛化 if(focusData) { if(lastData === focusData || (lastData && lastData.getParetn() === focusData)) return; g3dView.setEye(eyeBack); g3dView.setCenter(centerBack); // 還原模型的原透明度 g3dView.dm().each(function (d) { if (d === focusData) return; d.s(opacityMap[d.getId()]); }); focusData.s('select.brightness', 0.7); focusData = null; eyeBack = null; centerBack = null; } });
在 HT 的組件中有提供快速查詢插件 QuickFinder ,這次咱們就運用該插件來實現簡單的檔案編號查詢
spa
// 初始化 輸入框 var textField = new ht.ui.TextField; textField.setIcon("imgs/search.json"); textField.setIconPosition("left"); // 初始化查詢器,條件:id var finder = new ht.QuickFinder(library.view.dm, "id"); // 輸入框點擊查詢按鈕時觸發 textField.on('p:value', function(e) { var dm = library.view.dm; var value = e.newValue; var datas = finder.find(value); // 查詢到對應的圖元時,咱們將第一個結果進行選中 if (datas && datas.size() > 0) { library.view.dm.sm().ss(datas.get(0)); } });
通過以上功能的實現,一個基礎的智慧檔案管理系統就成形了。固然作爲一個智慧管理系統,這些仍是遠遠不夠的,例如檔案動態監控、檔案室內人員走動監控、視頻監控、溫度監控、災害報警等等模塊都是後期能夠完善的地方。這裏只是簡單地爲你們提供了一個基於 HTML5 WEBGL 的 3D 解決方案。一樣原理,智能樓宇、智能機房、智能城市也能夠基於此來實現。插件