當前位置:首頁 » 網頁前端 » web流程引擎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

web流程引擎

發布時間: 2022-12-14 11:27:18

『壹』 求 web 3d 引擎的工作原理

插件就是和網頁上顯示flash差不多的,是一個需要選擇載入的小軟體而已,並不那麼神秘,它具有收集和偵別功能。

web3d引擎的原理更是簡單,它也是一種普通的網路技術,只是呈現方式不同而已。

找本相關的書看一下吧,不要被它們顯示的時候那種表象迷惑,好像很難,其實,它們和其它網路技術及顯示原理都是一樣的。

『貳』 webpack 基本流程

Webpack 函數的核⼼邏輯是:根據配置⽣成編譯器實例 compiler,然後處理參數,執⾏ WebpackOptionsApply().process,根據參數載入不同內部插件。在有回調函數的情況下,根據是否是 watch 模式來決定要執⾏ compiler.watch 還是 compiler.run。

Webpack 引擎基於插件系統搭建⽽成,不同的插件各司其職,在 Webpack ⼯作流程的某⼀個或多個時間點上,對構建流程的某個⽅⾯進⾏處理。
⼀個 Webpack 插件是⼀個包含 apply ⽅法的 JavaScript 對象。這個 apply ⽅法的執⾏邏輯,通常是注冊 Webpack ⼯作流程中某⼀⽣命周期 Hook,並添加對應 Hook 中該插件的實際處理函數。

『叄』 有基於Java的好用的Web快速開發平台嗎網上找了一些不太好用。最好能提供在線使用的網址,謝謝!

可以使用我公司的WebBuilder開發平台,可以在http://www.putdb.com上在線使用、評估和免費下載。

給您介紹一下該產品:

WebBuilder是一款跨平台、資料庫和瀏覽器的Web可視化應用開發和部署平台。

使用WebBuilder可開發ERP、OA、CRM、HR、MIS以及電信、銀行、政府、企業等各行業的行業應用系統,幫助信息化管理系統的快速構建。

WebBuilder幫助提高應用系統的開發效率,並降低成本。完善的基礎架構,具有應用系統必須的完整功能,使系統的開發僅需致力於業務的開發。

應用開發:提供可視化的WebBuilder集成開發環境,幫助應用系統的快速開發,支持使用Eclipse等開發工具的開發和調試,可以在您原有使用的技術框架上混合使用。

應用部署:使用基於Web的資源管理器進行應用的部署,支持Java,.Net,PHP等大部分Web應用的部署。

自定義的應用描述語言:基於XML的Web應用描述語言,屏蔽不同平台、資料庫和瀏覽器之間的差異。

完整的組件框架:提供應用開發所需的經過封裝的前後台組件、開發框架以及應用模塊,集成封裝了大量Ext、Dhtml、FusionCharts、標准HTML和JS組件以及包括數據訪問、流程引擎、計劃任務、系統調度等框架在內的Java後台組件。

使用WebBuilder可快速開發出功能強大的各種企業級應用系統,也可以基於應用系統平台做深度的二次開發。

『肆』 開源流程引擎Camunda技術架構

Camunda是一個基於Java的框架,支持用於工作流和流程自動化的BPMN、用於案例管理的CMMN和用於業務決策管理的DMN。

本篇文章我們僅考慮BPMN流程引擎,先不涉及CMMN和DMN引擎。就流程引擎而言,Camunda是一個靈活的工作流框架,它的核心是一個在Java虛擬機內部運行的原生BPMN 2.0流程引擎,因此它可以嵌入到任何Java應用程序或運行時容器中。Camunda與Java EE 集成,並可以與Spring Framework和Spring Boot完美匹配。

Camunda BPMS到底包括哪些功能,我們拿官方的一張架構圖進行解讀分析。

1.從BPM應用維度看

Camunda分為流程設計和流程運行兩個階段,見圖中最下方的藍色大箭頭,Model和Execute,按照這兩個階段,Camunda劃分為兩大部分功能,對應設計階段的功能有 Modeler,對應運行階段的功能有Engine、TaskList、Cockpit、Admin。

2.從BPM功能維度看

Camunda包括了流程設計器(Modeler)、流程引擎(Engine)、API介面(REST/Java API)、任務列表(TaskList)、流程管理控制台(Cockpit)、系統管理工具(Admin)。在Camunda商業產品中還包括了流程監控預警工具(Optimize)、流程協同設計工具(Cawemo)。這里重點先說一下Camunda流程設計器,支持兩種模式,一種是富客戶端的流程建模工具Camunda Modeler,需要在客戶端安裝;另一種是基於瀏覽器的流程設計器bpmn.io,這兩款軟體均開源。

3.從BPM角色維度看

Camunda分為業務分析師、流程開發工程師、最終用戶、流程管理員、系統管理員這幾個角色,每個角色對應BPMS不同的功能。業務分析師、流程開發工程師使用流程設計器(Modeler)進行流程建模,最終用戶使用任務列表(TaskList)進行流程發起和審批,流程管理員使用流程管理控制台(Cockpit)進行流程管理,比如流程暫停恢復、流程異常干預等,系統管理員使用系統管理工具(Admin)進行系統管理,比如組織用戶管理、許可權管理等。

1.支持與Spring框架集成

Camunda支持與spring框架集成,把 camunda-engine-spring框架引入到項目的maven模塊內,它可以與Spring 3、4或5版本一起使用,具體集成過程後面有文章單獨介紹。

2.支持與spring boot集成

後面文章專題介紹

3.支持與CDI and Java EE 集成

CDI (Context and Dependency Injection)是 Java EE6的標准和依賴注入,Camunda通過camunda-engine-cdi模塊集成可利用camunda引擎的配置和cdi的可擴展性。

4.支持與Runtime Container 集成

支持與tomcat、JBoss等常見的運行容器集成。

Camunda BPM是一個靈活的框架,支持嵌入式、分布式、集群等多種部署模式。

1.嵌入式部署

流程引擎以Jar包方式添加到應用程序中,通過這種方式,可以在應用程序生命周期中輕松啟動和停止流程引擎。

2.基於web容器啟動,多應用共享

流程引擎在運行時容器(Servlet容器、應用程序伺服器等)中啟動,流程引擎作為容器服務提供,可以由容器內部署的所有應用程序共享。這種方式在實際應用場景中不多見。

3.獨立部署,多應用共享

在這種情況下,流程引擎獨立部署,通過網路提供服務,網路上運行的不同應用程序可以通過遠程通信通道與進程引擎交互,遠程訪問流程引擎的最簡單方法是使用內置的REST服務介面。在企業級流程中心部署架構中,這是一種最常見的部署模式,在現在的微服務部署架構中,也可以採取這種方式。

4.集群部署

為了提供擴展或故障轉移功能,流程引擎可以分布到集群中的不同節點,每個流程引擎實例都必須連接到共享資料庫。Camunda BPM不提供現成的負載平衡功能,可以採用nginx等第三方負載均衡軟體實現。

本文介紹了第三方庫及其在Camunda中的使用。對於Camunda的每個組件,都列出了第三方庫。對於每個庫,都解釋了該庫是必需的依賴項還是可選的依賴項。必需的依賴是Camunda提供核心功能所依賴的庫。在下面的列表中標記為(Required Dependency)。可選的依賴項是可以與Camunda集成的庫。在下面的列表中標記為(可選依賴項)。

以下是Camunda7.15版本依賴得第三方類庫:

1、Process Engine

流程引擎依賴於以下第三方類庫:

MyBatis mapping framework (Required Dependency) for object-relational mapping.

Joda Time (Required Dependency) for parsing date formats.

Java Uuid Generator (JUG) (Optional Dependency) Id Generator. See the documentation on Id-Generators

SLF4J (Required Dependency) Logging Facade

此外,流程引擎還可以集成:

Apache Commons Email (Optional Dependency) for mail task support.

Spring Framework Spring-Beans (Optional Dependency) for configuration using camunda.cfg.xml.

Spring Framework Spring-Core (Optional Dependency) for configuration using camunda.cfg.xml.

Spring Framework Spring-ASM (Optional Dependency) for configuration using camunda.cfg.xml.

Groovy (Optional Dependency) for groovy script task support.

Jython (Optional Dependency) for Python script task support.

JRuby (Optional Dependency) for Ruby script task support.

Freemarker (Optional Dependency) for freemarker template engine support.

Apache Velocity (Optional Dependency) for apache velocity template engine support.

SAXON (Optional Dependency) for XSLT and XQuery template engine support.

2、REST API

REST API依賴於以下第三方庫:

Jackson JAX-RS (Required Dependency) provider for JSON content type

Apache Commons FileUpload (Required Dependency)

此外,當使用Apache Tomcat時:

RESTEasy (Required Dependency)

3、Spring Support

Spring支持可以與以下第三方庫集成:

Apache Commons DBCP (Optional Dependency)

Spring Framework Spring-Beans (Optional Dependency)

Spring Framework Spring-Core (Optional Dependency)

Spring Framework Spring-ASM (Optional Dependency)

Spring Framework Spring-Context (Optional Dependency)

Spring Framework Spring-JDBC (Optional Dependency)

Spring Framework Spring-ORM (Optional Dependency)

Spring Framework Spring-TX (Optional Dependency)

4、Camunda Spin

Camunda Spin依賴於以下第三方庫:

Jackson Json (Required Dependency) for Json Dataformat Support

此外,Camunda Spin可以與以下庫集成:

Jayway Json Path (Optional Dependency) for Json Path Support

5、Camunda Connect

Camunda Connect依賴於以下第三方庫:

Apache Http Components (Required Dependency) for REST and SOAP support.

1、支持的Java開發環境

• Java版本: 8 / 9 / 10 / 11 / 12 / 13 / 14

• Springboot版本: 2.3.x.RELEASE

2、支持的Java運行環境

• Oracle JDK 8 / 9 / 10 / 11 / 12 / 13 / 14

• IBM JDK 8 (with J9 JVM)

• OpenJDK 8 / 9 / 10 / 11 / 12 / 13 / 14

3、支持的資料庫軟體

• Mysql 5.6 / 5.7

• MariaDB 10.0 / 10.2 / 10.3

• Oracle 11g / 12c / 18c / 19c

• IBM DB2 10.5 / 11.1

• PostgreSQL 9.4 / 9.6 / 10.4 / 10.7 / 11.1 / 11.2 / 12.2

• Microsoft SQL Server 2012/2014/2016/2017

• H2 1.4

4、支持的應用伺服器

• Apache Tomcat 7.0 / 8.0 / 9.0

• JBoss EAP 6.4 / 7.0 / 7.1 / 7.2

• Wildfly Application Server 10.1+

• IBM WebSphere Application Server 8.5 / 9.0 企業版

• Oracle WebLogic Server 12c (12R2) 企業版

5、支持的瀏覽器

• Google Chrome

• Mozilla Firefox

• Microsoft Edge

6、流程設計器支持的操作系統

• Windows 7 / 10

• Mac OS X 10.11

• Ubuntu LTS

『伍』 從零打造一個Web地圖引擎

說到地圖,大家一定很熟悉,平時應該都使用過網路地圖、高德地圖、騰訊地圖等,如果涉及到地圖相關的開發需求,也有很多選擇,比如前面的幾個地圖都會提供一套 js API ,此外也有一些開源地圖框架可以使用,比如 OpenLayers 、 Leaflet 等。

那麼大家有沒有想過這些地圖是怎麼渲染出來的呢,為什麼根據一個經緯度就能顯示對應的地圖呢,不知道沒關系,本文會帶各位從零實現一個簡單的地圖引擎,來幫助大家了解 GIS 基礎知識及 Web 地圖的實現原理。

首先我們去高德地圖上選個經緯度,作為我們後期的地圖中心點,打開 高德坐標拾取 工具,隨便選擇一個點:

筆者選擇了杭州的雷峰塔,經緯度為: [120.148732,30.231006] 。

地圖瓦片我們使用高德的在線瓦片,地址如下:

目前各大地圖廠商的瓦片服務遵循的規則是有不同的:

谷歌和 TMS 的瓦片區別可以通過該地址可視化的查看: 地圖瓦片 。

雖然規范不同,但原理基本是一致的,都是把地球投影成一個巨大的正方形世界平面圖,然後按照四叉樹進行分層切割,比如第一層,只有一張瓦片,顯示整個世界的信息,所以基本只能看到洲和海的名稱和邊界線,第二層,切割成四張瓦片,顯示信息稍微多了一點,以此類推,就像一個金字塔一樣,底層解析度最高,顯示的細節最多,瓦片數也最多,頂層解析度最低,顯示的信息很少,瓦片數量相對也最少:

每一層的瓦片數量計算公式:

十八層就需要 68719476736 張瓦片,所以一套地圖瓦片整體數量是非常龐大的。

瓦片切好以後,通過行列號和縮放層級來保存,所以可以看到瓦片地址中有三個變數: x 、 y 、 z

通過這三個變數就可以定位到一張瓦片,比如下面這個地址,行號為 109280 ,列號為 53979 ,縮放層級為 17 :

對應的瓦片為:

關於瓦片的更多信息可以閱讀 瓦片地圖原理 。

高德地圖使用的是 GCJ-02坐標系 ,也稱火星坐標系,由中國國家測繪局在02年發布,是在GPS坐標( WGS-84 坐標系)基礎上經加密後而來,也就是增加了非線性的偏移,讓你摸不準真實位置,為了國家安全,國內地圖服務商都需要使用 GCJ-02坐標系 。

WGS-84 坐標系是國際通用的標准, EPSG 編號為 EPSG:4326 ,通常GPS設備獲取到的原始經緯度和國外的地圖廠商使用的都是 WGS-84 坐標系。

這兩種坐標系都是地理坐標系,球面坐標,單位為 度 ,這種坐標方便在地球上定位,但是不方便展示和進行面積距離計算,我們印象中的地圖都是平面的,所以就有了另外一種平面坐標系,平面坐標系是通過投影的方式從地理坐標系中轉換過來,所以也稱為投影坐標系,通常單位為 米 ,投影坐標系根據投影方式的不同存在多種,在 Web 開發的場景里通常使用的是 Web墨卡托投影 ,編號為 EPSG:3857 ,它基於 墨卡托投影 ,把 WGS-84 坐標系投影成正方形:

這是通過舍棄了南北 85.051129緯度 以上的地區實現的,因為它是正方形,所以一個大的正方形可以很方便的被分割為更小的正方形。

坐標系更詳細的信息可參考 GIS之坐標系統 , EPSG:3857 的詳細信息可參考 EPSG:3857 。

上一節里我們簡單介紹了一下坐標系,按照 Web 地圖的標准,我們的地圖引擎也選擇支持 EPSG:3857 投影,但是我們通過高德工具獲取到的是火星坐標系的經緯度坐標,所以第一步要把經緯度坐標轉換為 Web墨卡托 投影坐標,這里為了簡單,先直接把火星坐標當做 WGS-84 坐標,後面再來看這個問題。

轉換方法網上一搜就有:

3857 坐標有了,它的單位是 米 ,那麼怎麼轉換成瓦片的行列號呢,這就涉及到 解析度 的概念了,即地圖上一像素代表實際多少米,解析度如果能從地圖廠商的文檔里獲取是最好的,如果找不到,也可以簡單計算一下(如果使用計算出來的也不行,那就只能求助搜索引擎了),我們知道地球半徑是 6378137 米, 3857 坐標系把地球當做正圓球體來處理,所以可以算出地球周長,投影是貼著地球赤道的:

所以投影成正方形的世界平面圖後的邊長代表的就是地球的周長,前面我們也知道了每一層級的瓦片數量的計算方式,而一張瓦片的大小一般是 256*256 像素,所以用地球周長除以展開後的世界平面圖的邊長就知道了地圖上每像素代表實際多少米:

地球周長算出來是 40075016.68557849 ,可以看到 OpenLayers 就是這么計算的:

3857 坐標的單位是 米 ,那麼把坐標除以解析度就可以得到對應的像素坐標,再除以 256 ,就可以得到瓦片的行列號:

函數如下:

接下來我們把層級固定為 17 ,那麼解析度 resolution 就是 1.194328566955879 ,雷峰塔的經緯度轉成 3857 的坐標為: [13374895.665697495, 3533278.205310311] ,使用上面的函數計算出來行列號為: [43744, 11556] ,我們把這幾個數據代入瓦片的地址里進行訪問:

一片空白,這是為啥呢,其實是因為原點不一樣, 4326 和 3857 坐標系的原點在赤道和本初子午線相交點,非洲邊上的海里,而瓦片的原點在左上角:

再來看下圖會更容易理解:

3857 坐標系的原點相當於在世界平面圖的中間,向右為 x 軸正方向,向上為 y 軸正方向,而瓦片地圖的原點在左上角,所以我們需要根據圖上【綠色虛線】的距離計算出【橙色實線】的距離,這也很簡單,水平坐標就是水平綠色虛線的長度加上世界平面圖的一半,垂直坐標就是世界平面圖的一半減去垂直綠色虛線的長度,世界平面圖的一半也就是地球周長的一半,修改 getTileRowAndCol 函數:

這次計算出來的瓦片行列號為 [109280, 53979] ,代入瓦片地址:

結果如下:

可以看到雷峰塔出來了。

我們現在能根據一個經緯度找到對應的瓦片,但是這還不夠,我們的目標是要能在瀏覽器上顯示出來,這就需要解決兩個問題,一個是載入多少塊瓦片,二是計算每一塊瓦片的顯示位置。

渲染瓦片我們使用 canvas 畫布,模板如下:

地圖畫布容器 map 的大小我們很容易獲取:

地圖中心點我們設在畫布中間,另外中心點的經緯度 center 和縮放層級 zoom 因為都是我們自己設定的,所以也是已知的,那麼我們可以計算出中心坐標對應的瓦片:

縮放層級還是設為 17 ,中心點還是使用雷峰塔的經緯度,那麼對應的瓦片行列號前面我們已經計算過了,為 [109280, 53979] 。

中心坐標對應的瓦片行列號知道了,那麼該瓦片左上角在世界平面圖中的像素位置我們也就知道了:

計算出來為 [27975680, 13818624] 。這個坐標怎麼轉換到屏幕上呢,請看下圖:

中心經緯度的瓦片我們計算出來了,瓦片左上角的像素坐標也知道了,然後我們再計算出中心經緯度本身對應的像素坐標,那麼和瓦片左上角的差值就可以計算出來,最後我們把畫布的原點移動到畫布中間(畫布默認原點為左上角,x軸正方向向右,y軸正方向向下),也就是把中心經緯度作為坐標原點,那麼中心瓦片的顯示位置就是這個差值。

補充一下將經緯度轉換成像素的方法:

計算中心經緯度對應的像素坐標:

計算差值:

最後通過 canvas 來把中心瓦片渲染出來:

這里先來看看 getTileUrl 方法的實現:

這里隨機了四個子域: webrd01 、 webrd02 、 webrd03 、 webrd04 ,這是因為瀏覽器對於同一域名同時請求的資源是有數量限制的,而當地圖層級變大後需要載入的瓦片數量會比較多,那麼均勻分散到各個子域下去請求可以更快的渲染出所有瓦片,減少排隊等待時間,基本所有地圖廠商的瓦片服務地址都支持多個子域。

為了方便看到中心點的位置,我們再額外渲染兩條中心輔助線,效果如下:

可以看到中心點確實是雷峰塔,當然這只是渲染了中心瓦片,我們要的是瓦片鋪滿整個畫布,對於其他瓦片我們都可以根據中心瓦片計算出來,比如中心瓦片左邊的一塊,它的計算如下:

所以我們只要計算出中心瓦片四個方向各需要幾塊瓦片,然後用一個雙重循環即可計算出畫布需要的所有瓦片,計算需要的瓦片數量很簡單,請看下圖:

畫布寬高的一半減去中心瓦片占據的空間即可得到該方向剩餘的空間,然後除以瓦片的尺寸就知道需要幾塊瓦片了:

我們把中心瓦片作為原點,坐標為 [0, 0] ,來個雙重循環掃描一遍即可渲染出所有瓦片:

效果如下:

很完美。

拖動可以這么考慮,前面已經實現了渲染指定經緯度的瓦片,當我們按住進行拖動時,可以知道滑鼠滑動的距離,然後把該距離,也就是像素轉換成經緯度的數值,最後我們再更新當前中心點的經緯度,並清空畫布,調用之前的方法重新渲染,不停重繪造成是在移動的視覺假象。

監聽滑鼠相關事件:

在 onMousemove 方法里計算拖動後的中心經緯度及重新渲染畫布:

movementX 和 movementY 屬性能獲取本次和上一次滑鼠事件中的移動值,兼容性不是很好,不過自己計算該值也很簡單,詳細請移步 MDN 。乘以當前解析度把 像素 換算成 米 ,然後把當前中心點經緯度也轉成 3857 的 米 坐標,偏移本次移動的距離,最後再轉回 4326 的經緯度坐標作為更新後的中心點即可。

為什麼 x 是減, y 是加呢,很簡單,我們滑鼠向右和向下移動時距離是正的,相應的地圖會向右或向下移動, 4326 坐標系向右和向上為正方向,那麼地圖向右移動時,中心點顯然是相對來說是向左移了,因為向右為正方向,所以中心點經度方向就是減少了,所以是減去移動的距離,而地圖向下移動,中心點相對來說是向上移了,因為向上為正方向,所以中心點緯度方向就是增加了,所以加上移動的距離。

更新完中心經緯度,然後清空畫布重新繪制:

效果如下:

可以看到已經凌亂了,這是為啥呢,其實是因為圖片載入是一個非同步的過程,我們滑鼠移動過程中,會不斷的計算出要載入的瓦片進行載入,但是可能上一批瓦片還沒載入完成,滑鼠已經移動到新的位置了,又計算出一批新的瓦片進行載入,此時上一批瓦片可能載入完成並渲染出來了,但是這些瓦片有些可能已經被移除畫布,不需要顯示,有些可能還在畫布內,但是使用的還是之前的位置,渲染出來也是不對的,同時新的一批瓦片可能也載入完成並渲染出來,自然導致了最終顯示的錯亂。

知道原因就簡單了,首先我們加個緩存對象,因為在拖動過程中,很多瓦片只是位置變了,不需要重新載入,同一個瓦片載入一次,後續只更新它的位置即可;另外再設置一個對象來記錄當前畫布上應該顯示的瓦片,防止不應該出現的瓦片渲染出來:

因為需要記錄瓦片的位置、載入狀態等信息,我們創建一個瓦片類:

然後修改之前的雙重循環渲染瓦片的邏輯:

效果如下:

可以看到,拖動已經正常了,當然,上述實現還是很粗糙的,需要優化的地方很多,比如:

1.一般會先排個序,優先載入中心瓦片

2.緩存的瓦片越來越多肯定也會影響性能,所以還需要一些清除策略

這些問題有興趣的可以自行思考。

拖動是實時更新中心點經緯度,那麼縮放自然更新縮放層級就行了:

效果如下:

功能是有了,不過效果很一般,因為我們平常使用的地圖縮放都是有一個放大或縮小的過渡動畫,而這個是直接空白然後重新渲染,不仔細看都不知道是放大還是縮小。

所以我們不妨加個過渡效果,當我們滑鼠滾動後,先將畫布放大或縮小,動畫結束後再根據最終的縮放值來渲染需要的瓦片。

畫布默認縮放值為 1 ,放大則在此基礎上乘以 2 倍,縮小則除以 2 ,然後動畫到目標值,動畫期間設置畫布的縮放值及清空畫布,重新繪制畫布上的已有瓦片,達到放大或縮小的視覺效果,動畫結束後再調用 renderTiles 重新渲染最終縮放值需要的瓦片。

效果如下:

雖然效果還是一般,不過至少能看出來是在放大還是縮小。

前面還遺留了一個小問題,即我們把高德工具上選出的經緯度直接當做 4326 經緯度,前面也講過,它們之間是存在偏移的,比如手機 GPS 獲取到的經緯度一般都是 84 坐標,直接在高德地圖顯示,會發現和你實際位置不一樣,所以就需要進行一個轉換,有一些工具可以幫你做些事情,比如 Gcoord 、 coordtransform 等。

上述效果看著比較一般,其實只要在上面的基礎上稍微加一點瓦片的淡出動畫,效果就會好很多,目前一般都是使用 canvas 來渲染 2D 地圖,如果自己實現動畫不太方便,也有一些強大的 canvas 庫可以選擇,筆者最後使用 Konva.js 庫重做了一版,加入了瓦片淡出動畫,最終效果如下:

另外只要搞清楚各個地圖的瓦片規則,就能稍加修改支持更多的地圖瓦片:

具體實現限於篇幅不再展開,有興趣的可以閱讀本文源碼。

本文詳細的介紹了一個簡單的 web 地圖開發過程,上述實現原理僅是筆者的個人思路,不代表 openlayers 等框架的原理,因為筆者也是 GIS 的初學者,所以難免會有問題,或更好的實現,歡迎指出。

在線 demo : https://wanglin2.github.io/web_map_demo/

完整源碼: https://github.com/wanglin2/web_map_demo

『陸』 如何在web中使用activiti和sql server

一、按照如下方式新建一個web工程

之所以要用maven,主要是為了解決各種依賴項的問題,用maven來管理依賴項還是很方便的。

用Eclipse創建Maven結構的web項目的時候選擇了Artifact
Id為maven-artchetype-webapp,由於這個catalog比較老,用的servlet還是2.3的,而一般現在都是用3.0,在
Project Facets裡面修改Dynamic web mole為3.0的時候就會出現Cannot change version of
project facet Dynamic web mole to 3.0,如圖:

解決這個問題的步驟如下:

1. 把Servlet改成3.0,打開項目的web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="schele-console" version="3.0">

2. 修改項目的設置,在Navigator下打開項目.settings目錄下的org.eclipse.jdt.core.prefs

把1.5改成1.8

eclipse.preferences.version=1

org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled

org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8

org.eclipse.jdt.core.compiler.compliance=1.8

org.eclipse.jdt.core.compiler.problem.assertIdentifier=error

org.eclipse.jdt.core.compiler.problem.enumIdentifier=error

org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning

org.eclipse.jdt.core.compiler.source=1.8

3. 打開org.eclipse.wst.common.project.facet.core.xml

把java改為1.8, 把jst.web改為3.0;

<?xml version="1.0" encoding="UTF-8"?>

<faceted-project>

<fixed facet="wst.jsdt.web"/>

<installed facet="jst.web" version="3.0"/>

<installed facet="wst.jsdt.web" version="1.0"/>

<installed facet="java" version="1.8"/>

</faceted-project>

二、解決報錯The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

可以使用如下步驟來解決。

1、右擊web工程-》屬性或Build Path-》Java Build Path->Libraries-> Add Libray...->Server Runtime -》Tomcat Server

2、切換到Java Build Path界面中的Orader and Export,選擇Tomcat。

三、修改項目的pom.xml文件,添加activiti相關依賴項

相關依賴項如下:

<dependency>

<groupId>org.activiti</groupId>

<artifactId>activiti-engine</artifactId>

<version>${activiti-version}</version>

</dependency>

<dependency>

<groupId>org.activiti</groupId>

<artifactId>activiti-spring</artifactId>

<version>${activiti-version}</version>

</dependency>

<dependency>

<groupId>org.codehaus.groovy</groupId>

<artifactId>groovy-all</artifactId>

<version>2.4.3</version>

</dependency>

<dependency>

<groupId>com.h2database</groupId>

<artifactId>h2</artifactId>

<version>1.3.168</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>1.7.6</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-jdk14</artifactId>

<version>1.7.6</version>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.11</version>
</dependency>

其中activiti-version的定義如下:

<properties>

<activiti-version>5.18.0</activiti-version>
</properties>

其實這些內容我都是從Activiti工程的pom文件中拷貝過來的。

四、添加activiti需要的配置文件

在activiti的userguide(http://activiti.org/userguide/index.html#_configuration )中有說。

如果我們使用如下語句來創建一個流程引擎實例

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()

那麼實際上他是到該項目的classpath路徑下去找一個名為
activiti.cfg.xml的配置文件,然後根據該配置文件的設置,通過spring的方式來創建一個processEngine。而且是去找其中
的那個名字是default的processEngine。

所以我們可以在該項目的src/main/resources 目錄下創建一個名為 activiti.cfg.xml的文件,然後將如下內容復制進去。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.">

</bean>
</beans>

五、創建sql server資料庫

通過sql server management studio 創建一個資料庫,比如名字叫做 activiti

六、在maven中添加sql server jdbc依賴項

在maven倉庫中是沒有sql server 的jdbc jar包的,可以按照如下步驟操作

Download the JDBC driver for Microsoft SQL Server

Visit the MSDN site for SQL Server and download the latest version of the JDBC driver for your operating system.
Unzip the package
Open a command prompt and switch into the expanded directory where the jar file is located.
Execute the following command. Be sure to modify the jar file name and version as necessary:

1

mvn install:install-file -Dfile=sqljdbc4.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0

You should see something similar to this:

[INFO] Scanning for projects...

[INFO]

[INFO] ------------------------------------------------------------------------

[INFO] Building Maven Stub Project (No POM) 1

[INFO] ------------------------------------------------------------------------

[INFO]

[INFO] --- maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-pom ---

[INFO] Installing /Users/claude/installers/JDBC/sqljdbc_4.0/enu/sqljdbc4.jar to /Users/claude/.m2/repository/com/microsoft/sqlserver/sqljdbc4/4.0/sqljdbc4-4.0.jar

[INFO] Installing /var/folders/c6//T/mvninstall1874482299687761721.pom to /Users/claude/.m2/repository/com/microsoft/sqlserver/sqljdbc4/4.0/sqljdbc4-4.0.pom

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 1.208s

[INFO] Finished at: Tue Mar 13 14:07:31 EDT 2012

[INFO] Final Memory: 3M/81M

[INFO] ------------------------------------------------------------------------

Modify your POM

Include the new dependency by modifying your project』s pom.xml. Add the following dependency:

1

2

3

4

5

<dependency>

<groupId>com.microsoft.sqlserver</groupId>

<artifactId>sqljdbc4</artifactId>

<version>4.0</version>

</dependency>

Save the pom.xml file and build the project to make sure no errors exist.

七、讓activiti連接sql server資料庫

修改第四節中的activiti.cfg.xml文件,將 processEngineConfiguration的內容改成下文這樣:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.">

<property name="databaseSchemaUpdate" value="true"/>

<property name="jdbcUrl" value="jdbc:sqlserver://localhost:1433;databaseName=activiti2 " />

<property name="jdbcDriver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />

<property name="jdbcUsername" value="sa" />

<property name="jdbcPassword" value="sa123" />
</bean>

八、在代碼中使用activiti的api

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

if(processEngine != null)

{

out.println("<h1> Hello !" + processEngine.getName() + "</h1>");

IdentityService identityService = processEngine.getIdentityService();

List<String> keys = identityService.getUserInfoKeys("Kermit");

for(String key: keys)

{

out.println(String.format("<h1> key = %s, value = %s </h1>", key, identityService.getUserInfo("Kermit", key)));

}

}

以上在調用 ProcessEngines.getDefaultProcessEngine(); 的時候,實際上背後就會去調用搜索classPath目錄下的activiti.cfg.xml文件,然後通過其中的配置來創建processEngine對象。

九、在eclipse中調試activiti項目
在eclipse中調試web項目,其實他是把相關的資料生成到如下路徑:
<eclipse workspace dir>\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MavenWeb

如果發現某項配置修改之後,調試的時候沒有生效,那可以試著clean一下, Project ->clean...,然後重新生成即可。

『柒』 Spring 的Web Flow 和 工作流有什麼區別

Snaker工作流引擎本著輕量、簡單、靈巧理念設計。
一、輕量:
1、可以不依賴主流的ioc、orm框架獨立運行(使用JDBC+Dbutils)
2、整個jar佔用170K
二、簡單:
1、流程組件簡單。
2、表設計簡單(目前只有7張表)
3、上手簡單,只需要根據實際的項目環境配置snaker.properties/snaker.xml兩個文件即可
三、靈巧:
1、擴展性:暴露較多的可擴展介面,甚至是核心的流程組件(只需在snaker.xml中增加bean的配置即可)。
2、數據持久層面支持jdbc+dbutils、mybatis、hibernate、springjdbc。目前支持的資料庫有oracle、mysql、sqlserver。
當然,基於以上三點設計肯定會損失流程引擎的一些特性。所以Snaker目前主要針對中小型項目需要增加工作流特性的系統。

『捌』 什麼情況下,需要使用工作流引擎

流程無處不在,當我們需要把管理的細節做好節點控制,以及管理時間提醒,節點提醒,完成審批的時候,都是需要的,所以工作流引擎是無時無刻不需要的,因為他跟管理是同步的,但是管理的成本和價值是同步的,如果需要管控的細節,那麼對應的就展示對應的細節,如果粗獷管理,會導致管理漏洞,但是管控大而全,就又會增加管理成本,導致管控的細節是否是跟價值呈現成正比。

流程組件應用場景——可視化流程配置、流程組件應用場景——流程審批方式多、流程組件應用場景——流程審批動作豐富、流程組件應用場景——流程審批通知方式多樣化、流程組件應用場景——流程運行情況監控和統計

『玖』 2.簡述web搜索引擎基本結構由哪三部分組成,以及各部分的作用

一個搜索引擎由搜索器 、索引器 、檢索器 和用戶介面 四個部分組成。搜索器的功能是在互聯網 中漫遊,發現和搜集信息。索引器的功能是理解搜索器所搜索的信息,從中抽取出索引項,用於表示文檔 以及生成文檔庫的索引表。檢索器的功能是根據用戶的查詢在索引庫中快速檢出文檔,進行文檔與查詢的相關度評價,對將要輸出的結果進行排序,並實現某種用戶相關性反饋機制。用戶介面的作用是輸入用戶查詢、顯示查詢結果、提供用戶相關性反饋機制。

『拾』 vue集成流程設計引擎

相關閱讀: 開源流程引擎選擇

教程: bpmnjs教程

bpmn-js 是 BPMN 2.0 渲染工具包和 Web 模型。bpmn-js 正在努力成為 Camunda BPM 的一部分。bpmn-js 使用 Web 建模工具可以很方便的構建 BPMN 圖表,可以把 BPMN 圖表嵌入到你的項目中,容易擴展。bpmn-js是基於原生js開發,支持集成到vue、react等開源框架中。

官方網站

mxGraph是一個強大的JavaScript流程圖前端庫,可以快速創建互動式圖表和圖表應用程序,國內外著名的ProcessOne和draw.io都是使用該庫創建的強大的在線流程圖繪制網站. 由於mxGraph是一個開放的js繪圖開發框架,我們可以開發出很炫的樣式,或者完全按照項目需求定製。

官方網站