首页 > 学院 > 开发设计 > 正文

权限管理系统系列之登录、升级模块

2019-11-17 02:41:44
字体:
来源:转载
供稿:网友

权限管理系统系列之登录、升级模块

目录

权限管理系统系列之序言

权限管理系统系列之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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表