目的程序員
不少作應用程序的朋友都作過爲應用程序進行版本升級的功能,這個功能自己很是簡單,可是各位有沒有考慮過這個問題:假如我須要維護多個應用程序的時候(>2)。每一個應用程序的升級工做將變得很繁瑣。咱們須要有一套通用的更新機制,只須要爲須要升級的應用程序進行簡單的配置,就能夠爲之進行版本升級控制,而不須要單獨給每一個應用程序寫升級的功能從而達到一勞永逸的目的。web
組成sql
那麼通用更新的組件應該如何來設計,它至少須要如下兩個模塊構成:數據庫
1.客戶端模塊
1.1 負責發送版本驗證請求
1.2 負責下載程序所需的更新文件(若是須要更新) json
2.服務端模塊
2.1 負責新增/維護被受權的應用程序基礎信息
2.2 負責發佈應用程序新版本信息及文件
2.3 負責驗證應用程序版本,並返回驗證結果(若是須要更新則返回服務器地址,文件路徑等等數據,以xml/json形式均可以)
服務器
開始構造app
首先是服務端的建立,服務端是一個web應用程序。首先建立它的數據庫spa
1.數據庫表設計設計
1.1 應用程序基礎信息表(EP_Update_Program)code
字段名 | 說明 | 字段類型 |
Id | 自增加序列號 | bigint |
ProgramCode | 應用程序惟一標識碼 | varchar(50) |
ProgramName | 應用程序名稱 | varchar(50) |
FtpAddress | FTP服務器路徑 | varchar(50) |
FtpUserName | FTP服務器用戶名 | varchar(50) |
FtpPassword | FTP服務器密碼 | varchar(50) |
FtpPort | FTP服務器端口 | varchar(50) |
1.2 應用程序版本信息表(EP_Update_Version)
字段名 | 說明 | 字段類型 |
Id | 自增加序列號 | bigint |
ProgramCode | 應用程序惟一標識碼 | varchar(50) |
ProgramVersion | 應用程序版本自定義標識碼 | varchar(50) |
UpdateContent | 本次版本更新內容 | varchar(500) |
UpdateTime | 版本更新時間 | datetime |
Publisher | 版本發佈人 | varchar(50) |
1.3 應用程序更新文件路徑表(EP_Update_FilePath)
字段名 | 說明 | 字段類型 |
Id | 自增加序列號 | bigint |
VersionId | 應用程序版本編號 | varchar(50) |
FilePath | 服務器文件路徑(FTP根目錄開始) | varchar(100) |
SavePath | 本地文件保存路徑(應用程序根目錄開始) | varchar(100) |
2.注意事項
如上,一個簡陋的服務端數據庫表就設計好了,它能知足最基本的管理/控制/發佈應用程序版本信息及文件的數據管理需求(若有其它需求可對數據表自行擴展)。值得咱們注意的細節就是應用程序跨版本升級。什麼是跨版本升級???
應用程序本地版本爲v1.0, 服務器上該程序的最新版本爲v1.2 (假設版本跨度步長爲0.1)。那麼本地與服務器的版本就相差了兩個版本(v1.1和v1.2),這個時候應用程序發送版本驗證請求,服務端應該同時返回v1.1和v1.2兩個版本的文件,而且要過濾掉版本重複的文件,重複的文件以最新版本爲準。
舉個例子:
v1.1 更新的文件爲 a.exe | b.dll | c.xml
v1.2 更新的文件爲 a.exe | c.dll | c.xml
服務端返回結果應該爲:
v1.1 的 b.dll
v1.2 的 a.exe | c.dll | c.xml (a.exe和c.xml與v1.1版本中的文件重複,因此要過濾之,以最新版本的文件爲準)
SQL主要實現代碼:
select ver.ProgramVersion,ff.FilePath,ff.SavePath from EP_Update_FilePath as ff inner join EP_Update_Version on ff.VersionId=ver.Id where exists(select max(f.Id) as VersionId from EP_Update_Program as p
inner join EP_Update_Version as v on p.ProgramCode=v.Progra,Code and v.Id > @VersionId
inner join EP_Update_FilePath as f on f.VersionId=v.Id where p.ProgramCode=@ProgramCode
group by f.FilePath having ff.Id=max(f.Id))
上述SQL查詢出了該應用程序本次升級所須要的文件列表。在服務端中以xml/json的方式進行組織並返回給應用程序。
服務端運行效果圖
其他添加應用程序基礎信息,發佈版本等基礎性操做數據庫的代碼我就不貼了,直接上效果圖:
服務端的建立工做完成了,接下來是客戶端的建立
首先客戶端在本地具備本身的版本配置文件:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <appSettings> 4 <add key="Program_Code" value="應用程序惟一標識碼" /> 5 <add key="Program_Title" value="應用程序名稱" /> 6 <add key="Program_InvokeName" value="主程序exe名稱" /> 7 <add key="Program_LocalVersion" value="本地版本" /> 8 </appSettings> 9 </configuration>
通用更新組件的客戶端應該被設置爲啓動程序。由更新組件客戶端來調用主程序而不是直接打開主程序。把它放在與主程序同級的文件目錄,並配置主程序的exe名稱。
啓動的時候調用web服務,傳入本身的程序惟一標識碼和本地版本,由服務器返回xml/json數據並解析之,根據結果來決定是否須要下載文件或者直接啓動
客戶端運行效果圖:
一樣的調用web服務和下載文件的基礎性代碼我就不貼出來了,直接附上效果圖:
到這裏,通用更新組件的服務端與客戶端就搭建好了。只須要作一下簡單的配置,就能爲應用程序提供版本升級服務,極大的方便簡化了程序員作版本升級的工做。
QQ 3045568793 山雞 WPF技術交流羣 372754241
歡迎交流 !!!