权限管理系统系列之序言
权限管理系统系列之WCF通信
之前写了两篇关于权限管理系统的博客了,由于这段时间有事比较忙就暂停了,今天继续编写权限管理系统之登陆和升级模块,登陆和升级也是每个系统之必须的模块,对于一个Winform程序,在登陆之前必须要先进行程序的升级,所以先介绍升级模块。
表结构如下:
插入数据表数据如下:
一般程序升级可能有好几种,比如说有根本版本号比较升级、根据DLL生成时间比较等等,而我介绍的是根据版本号进行升级。我们需要在服务端将DLL文件的 版本写入到数据表中,这样供每个客户端去比较版本号,就是每次打开客户端之前进行检测版本号,如果版本号相等则不升级,如果不相等则进行升级操作。
服务端实现逻辑如下:
1 /// <summary> 2 /// 更新客户端程序集信息 3 /// </summary> 4 public static void UpdateAssembleInfo() 5 { 6 DbHelper dbhelper = new DbHelper(AppServer.dbName); 7 string sql = "select * from t_fw_assemble_list t"; 8 DataTable dt = dbhelper.Query(sql); 9 DirectoryInfo dirInfo = new DirectoryInfo(application.StartupPath);10 FileVersionInfo fvi = null;11 string updateSql = "update t_fw_assemble_list set s_versionno= '{0}',t_timestamp=getdate() where s_type='{1}' and s_filename='{2}'";12 string fName = string.Empty;13 GetAllFiles(dirInfo);14 bool isAddLog = true;15 StreamReader sr = null;16 for (int i = 0; i < dt.Rows.Count; i++)17 {18 fName = dt.Rows[i]["S_FILENAME"].ToString();19 if (fileNameDic.ContainsKey(fName))20 {21 if (dt.Rows[i]["L_UPDATE"].ToString() == "2")22 {23 sr = new StreamReader(Application.StartupPath + "//" + fName);24 string fileContext = sr.ReadToEnd();25 sr.Close();26 sr.Dispose();27 sql = string.Format(updateSql, Common.Util.md5Encrypt.MD5EncryptDES(fileContext), dt.Rows[i]["S_TYPE"], fName);28 dbhelper.ExecuteSql(sql);29 isAddLog = false;30 }31 else32 {33 fvi = FileVersionInfo.GetVersionInfo(fileNameDic[fName]);34 if (!dt.Rows[i]["S_VERSIONNO"].ToString().Equals(fvi.FileVersion))35 {36 sql = string.Format(updateSql, fvi.FileVersion, dt.Rows[i]["S_TYPE"], fName);37 dbhelper.ExecuteSql(sql);38 isAddLog = false;39 }40 }41 if (!isAddLog)42 {43 isAddLog = AddLog();44 }45 }46 }47 }
以上代码主要是写入版本到数据库里,每次服务端启动首先执行这段代码。
服务端搞定我就来看看客户端了,客户端启动时调用以下方法实现:
1 bool isDownLoad = false; 2 if (args != null) 3 { 4 if (args.Length > 0) 5 { 6 for (int i = 0; i < args.Length; i++) 7 { 8 if (args[i] == "Update") 9 {10 isDownLoad = true;11 break;12 }13 }14 }15 }16 if (isDownLoad)17 {18 //启动主界面19 Application.Run(new LoginForm());20 }21 else22 {23 //更新客户端程序集24 if (UpdateAssembleData.UpdateAssembleInfo() > 0)25 {26 DownLoadForm dlf = new DownLoadForm();27 dlf.fileNameList = UpdateAssembleData.fileNameList;28 //启动下载程序界面29 Application.Run(dlf);30 }31 else32 {33 //启动主界面34 Application.Run(new LoginForm());35 }36 }
更新时会弹出升级窗体,上面会显示升级的DLL文件,以及文件升级的进度条,升级完成启动新的程序,升级过程的核心代码:
1 /// <summary> 2 /// 下载文件 3 /// </summary> 4 PRivate void DownLoadFile() 5 { 6 if (fileNameList.Count > 0) 7 { 8 //CallService service = new CallService("GetFile"); 9 int countLen = fileNameList.Count; 10 this.pbarDownLoad.Position = this.pbarDownLoad.Properties.Minimum; 11 double step = this.pbarDownLoad.Properties.Maximum / countLen; 12 string fName = string.Empty; 13 string upPath = Application.StartupPath + "//Update//"; 14 if (!Directory.Exists(upPath)) 15 { 16 Directory.CreateDirectory(upPath); 17 } 18 19 string sql = string.Empty; 20 FileStream fs; 21 bool isStartUpdate = false; 22 List<string> list = new List<string>(); 23 List<string> getList = new List<string>(); 24 //int fLen = 0; 25 long pageNum = 0; 26 for (int i = 0; i < countLen; i++) 27 { 28 bool isFirstPBLen = true; 29 isStartUpdate = false; 30 fName = fileNameList[i]; 31 IAsyncResult iart = this.lblDownLoad.BeginInvoke(new SetLabelText(AsyncLabel), new object[] { "正在下载文件 " + fName }); 32 this.lblDownLoad.EndInvoke(iart); 33 pageNum = 1; 34 list.Clear(); 35 list.Add(fName); 36 list.Add(pageNum.ToString ()); 37 38 //创建服务器下载的文件 39 string tmpPath = upPath + fName; 40 tmpPath = tmpPath.Substring(0, tmpPath.LastIndexOf('//')); 41 if (!Directory .Exists (tmpPath)) 42 { 43 Directory.CreateDirectory(tmpPath); 44 } 45 fs = new FileStream(upPath + fName, FileMode.Create, Fileaccess.Write); 46 47 while (true) 48 { 49 Result result = FileData.DoGetFile(list); 50 if (!result.success)//DoGetFile 51 { 52 Comm.WriteLogAndShowMessageBox.Error(result.msg, "Client.Win.DownLoadForm.DownLoadFile()出错:" + result.msg); 53 StartUpdateApp(isStartUpdate); 54 break; 55 } 56 else 57 { 58 getList = JSON.Json2Object<List<string>>(result.data); //service.GetResult<List<string>>(); 59 byte[] buffer = Convert.FromBase64String(getList[2]); 60 61 if (isFirstPBLen) 62 { 63 //初始化当前文件进度条 64 iart = this.pbarCurrDownLoad.BeginInvoke(new UpdateProcessBar(AsyncIni), new object[] { Convert.ToInt32 (getList[0]), this.pbarCurrDownLoad }); 65 this.pbarCurrDownLoad.EndInvoke(iart); 66 isFirstPBLen = false; 67 Thread.Sleep(100); 68 } 69 70 //接收服务器返回的二制数据 71 fs.Write(buffer, 0, buffer.Length); 72 pageNum ++; 73 list[1] = pageNum.T
新闻热点
疑难解答