使用efwplusScript開發Winform程序【像小程序那樣開發PC軟件】
一、前言
本人從事多年醫療管理軟件的開發,在醫院大多數的軟件都還是CS程序,BS程序很少,對於使用者來說CS的操作體驗確實比BS的要好。
1、CS的缺點就是升級麻煩,每次有新版本都需要所有客戶端操作升級。有沒有辦法像BS程序那樣刷新一下頁面就是最新程序?
2、還有就是企業軟件項目個性化需求都特別多,特別是界面上的每一個項目可能要求都不太一樣,比如表單錄入一個項目一個版本是很正常的現象,那有沒有辦法把界面層的開發單獨出來,采用配置的方式了?
3、另外就是現在的開發模式,如果在現場修改問題太麻煩了,改完代碼後得編譯、發布、升級客戶才能看到最新效果,特別懷念以前存儲過程的方式,只要往數據庫提交最新的SQL,客戶立馬看到效果。所有界面開發能不能做到像存儲過程這樣,在運行的程序中直接打開程序代碼修改完保存,界面修改過來?
最後,琢磨出使用腳本語言來開發Winform程序,這樣上面三個問題就完美解決了,這就是efwplusScript。
二、efwplusScript介紹
上圖就是采用efwplusScript開發的一個簡單增刪改查的實例,雖然看上去像網頁,其實還是Winform程序,點擊地址欄的刷新按鈕,頁面實時顯示最新內容,無需升級操作。頁面上的所有功能沒有一句C#代碼,都是采用腳本語言開發。下圖顯示編寫腳本的主界面。
可視化設計界面
如上圖,直接使用efwplusStudio.exe這個工具就可以開發Winform界面程序。支持新建雲軟件項目,新建界面,可視化設計界面,編寫腳本代碼,還可以直接運行調試等。
三、efwplusStudio.exe開發工具說明
1、腳本資源
Config:配置當前程序有多少個雲軟件
WinAssembly:依賴的程序集
WinScript:雲軟件的腳本文件
2、代碼編輯器,編寫python代碼、XML代碼和界面設計
3、本地雲軟件,列出所有雲軟件,雙擊界面節點可以打開對應頁面。
4、跟蹤調試,顯示調試日誌
四、efwplusClient.exe客戶端說明
efwplusClient有點像一個自定義的瀏覽器,支持打開網頁和Winform程序,相當於BS和CS混合展示的客戶端程序。
除了通過地址打開頁面,efwplusClient還整合了管理軟件的權限功能,點擊左上角的菜單按鈕,會彈出登錄界面,登錄後會根據用戶權限加載對應功能菜單。
efwplusClient整合的功能包括:
1、組織機構,包括機構信息、科室維護、人員信息
2、用戶權限,包括用戶維護、系統菜單、角色權限
3、其他設置,包括系統參數、報表管理、消息管理、字典管理、圖標管理
人員信息
圖標管理
字典管理
五、快速開始(Hello實例)
1、新建雲軟件
2、查看Config/CloudSoftConfig.xml
<?xml version="1.0" encoding="utf-8"?> <cloudsoftList> <cloudsoftClient name="Login" path="WinScript/Login/config.xml" title="登錄權限" version="1.0" /> <cloudsoftClient name="BasicSetting" path="WinScript/BasicSetting/config.xml" title="基礎模塊" version="1.0" /> <cloudsoftClient name="Hello" path="WinScript/Hello/config.xml" title="Hello" version="1.0" /> <cloudsoftClient name="BooksDemo" path="WinScript/BooksDemo1.0/config.xml" title="書籍示例" version="1.0" /> <cloudsoftClient name="Test" path="WinScript/Test/config.xml" title="測試" version="1.0" /> </cloudsoftList>
3、查看WinScript/Hello/config.xml
<?xml version="1.0" encoding="utf-8"?> <configuration> <cloudsoft name="Hello" title="Hello" version="1.0" author="kakake"> <baseinfo> <data key="introduction" value="軟件介紹" /> <data key="updaterecord" value="更新記錄" /> </baseinfo> <controllerList> <WinformController ControllerName="Controller01" DllName="efwplusWinform.dll" TypeName="EFWCoreLib.WinformFrame.Controller.WinformController" DefaultViewName="View01" ScriptFile="WinScript\Hello\controller\Controller01.py"> <WinformView Name="View01" DllName="efwplusWinform.dll" ViewTypeName="EFWCoreLib.CoreFrame.Business.BaseFormBusiness" ViewFile="WinScript\Hello\view\View01.xml" Memo="" /> </WinformController> </controllerList> <AssemblyList> </AssemblyList> <fileList> <file path="efwplusClient\WinScript\Hello\cloudsoft.py" /> <file path="efwplusClient\WinScript\Hello\config.xml" /> <file path="efwplusClient\WinScript\Hello\__init__.py" /> <file path="efwplusClient\WinScript\Hello\controller\Controller01.py" /> <file path="efwplusClient\WinScript\Hello\controller\__init__.py" /> <file path="efwplusClient\WinScript\Hello\model\Model01.py" /> <file path="efwplusClient\WinScript\Hello\model\__init__.py" /> <file path="efwplusClient\WinScript\Hello\view\View01.py" /> <file path="efwplusClient\WinScript\Hello\view\View01.xml" /> <file path="efwplusClient\WinScript\Hello\view\__init__.py" /> </fileList> </cloudsoft> </configuration>
4、查看WinScript/Hello/controller/Controller01.py
# -*- coding: UTF-8 -*- __author__ = ‘kakake‘ global trace #日誌顯示開始加載腳本 trace.printlog(‘begin load Controller01.py‘,True) import sys sys.path.append("WinScript/Hello") #將trace設置為跨文件的全局變量 import cloudsoft as soft soft.set_trace(trace) #導入自己的模塊 from model.Model01 import Model01 from view.View01 import View01 #導入常用的模塊 import json from datetime import datetime #入口函數 def main(_controller): try: trace.printlog(‘call main‘) view01 = View01(_controller) # 有幾個界面類就要實例化幾個 controller01 = Controller01(_controller,view01) # 先實列化控制器類,然後在把對象傳給界面類,這樣界面就可以直接調用控制器中的方法 return 0; except Exception,ex: return ex; #控制器類 ############################################################## class Controller01(object): def __init__(self, _controller,_view01): self.controller=_controller self.view01=_view01 self.rview01=_controller.RenderList[‘View01‘] #註冊事件 self.rview01.initload(self.viewload) self.rview01.bind(‘btnHello‘, ‘click‘, self.Hello) #界面初始化加載 def viewload(self): pass def Hello(self,sender,e): self.rview01.msgbox(‘Hello World!‘,‘提示‘,‘ok‘,‘info‘) trace.printlog(‘hello world‘) ############################################################## #日誌顯示腳本加載完成 trace.printlog(‘end load Controller01.py‘)View Code
5、查看WinScript/Hello/view/View01.xml和View01.py
<?xml version="1.0" encoding="utf-8"?> <viewform> <winform size="880,500" tabindex="0" text="Hello World" name="View01" visible="false" width="880"> <panel type="panelEx" dock="fill" location="0,0" name="PanelEx1" size="864,461" tabindex="0" width="864"> <button type="buttonX" text="Hello World" location="371,113" name="btnHello" size="95,23" tabindex="0" width="95" /> </panel> </winform> </viewform>View Code
# -*- coding: UTF-8 -*- __author__ = ‘kakake‘ import sys import cloudsoft as soft trace=soft.get_trace() #日誌開始加載腳本 trace.printlog(‘begin load View01.py‘) # 界面類 ############################################################## class View01(object): def __init__(self, _controller): self.view = _controller.RenderList[‘View01‘] ############################################################## #日誌顯示腳本加載完成 trace.printlog(‘end load View01.py‘)View Code
6、查看WinScript/Hello/model/Model01.py
# -*- coding: UTF-8 -*- __author__ = ‘kakake‘ import sys import cloudsoft as soft trace=soft.get_trace() #日誌開始加載腳本 trace.printlog(‘begin load Model01.py‘) #實體類 ############################################################## class Model01(object): def __init__(self): pass ############################################################## #日誌顯示腳本加載完成 trace.printlog(‘end load Model01.py‘)View Code
六、efwplusScript實現原理
1、雲軟件
.net開發是以dll程序集為最終程序文件,而efwplusScript開發為一個雲軟件。
一個雲軟件中包括controller、model、view各種代碼文件,efwplusClient是按雲軟件為單位運行的。這些雲軟件配置在Config/CloudSoftConfig.xml文件中。
雲軟件的代碼結構也是采用MVC模式,分為Controller、Model和View,config.xml為雲軟件配置文件,cloudsoft.py存放全局數據和函數。
雲軟件有多個入口,每個controller.py文件都可以是程序入口,一般的程序都只有一個入口函數。
2、可視化界面設計
3、數據庫操作
4、調用efwplus微服務
5、調用RESTful API
efwplusScript程序下載:加QQ群399651389中共享文件中獲取。
源代碼獲取:https://gitee.com/kakake/efwplusScript
程序安裝教程:
1、還原數據庫CloudSoftDB.bak(SqlServer2012,備份數據庫群文件中獲取),然後在efwplusServer\Config\EntLib.config文件中修改數據庫連接字符串。
2、啟動服務端程序efwplusServer\efwplusBase.exe(以管理員運行,第一次打開程序會提示自動獲取授權碼)
3、配置完以上,就可以啟動efwplusClient\efwplusClient.exe和efwplusStudio.exe
使用efwplusScript開發Winform程序【像小程序那樣開發PC軟件】