IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 软件在线升级系统设计 -> 正文阅读

[系统运维]软件在线升级系统设计

需求描述

一直用Qt开发PC版本的程序,常用的方法都是打包发布。目前开发的程序比较复杂,涉及到上百个独立的进程以及4000多个相关文件,采用原来的打包发布就变得很麻烦,第一改动比较频繁,打包次数过多;第二安装包过大,用户那边更新也很麻烦;第三,更新文件的维护也麻烦。所以,支持在线升级,就变得很重要,通过两个版本的迭代设计,设计了一款通用在线升级系统,目前来看效果还是相当不错。

效果图

使用流程:

  1. 将程序的第一个版本打包成一个安装包,其中包括升级客户端程序;
  2. 需要更新的时候,将文件更新到服务器中,并提交更新,可以在版本信息中,提交升级说明;
  3. 客户端点击检查升级,会获取此次需要更新的文件以及缺失的文件,并从服务器上下载;
  4. 客户端不仅能够用于升级,也可用于安装文件的恢复。

客户端在线升级
服务端提交文件更新
服务端文件管理

设计要点

  1. 需要一个有公网地址的云服务器,用作升级服务器;
  2. 文件的更新检查通过MD5值来校验;
  3. 文件的更新类型分为两种。一种是覆盖更新,覆盖原有文件;一种是跳过更新,如果文件存在则跳过,不存在则增加,主要是针对于用户的一些配置文件;
  4. 文件的下载通过sftp协议;
  5. 需要更新的文件,需要拷贝到云服务器上;
  6. 服务端,点击检查修改以后,将当前目录下所有的文件都进行MD5值检查并与数据库中的MD5进行比较,如果数据库中不存在则为新增,MD5值不一致则为文件已修改,通过提交按钮,服务端更新数据库中的文件信息以及版本号自动累加;
  7. 客户端首先获取本地数据库中的版本信息,并从服务端获取本地版本与最新版本之间需要更新的文件信息,并更新本地数据库;
  8. 客户端依据最新的本地数据库,比对校验本地文件的MD5值,从而生成文件更新列表;
  9. 客户端依次从服务端下载更新文件;
  10. 完成系统的升级;
  11. 此系统也存在一些不足,升级前没有对原有文件进行备份,不能回退版本。

核心代码

//文件的MD5值计算
QString CDBOper::FileMD5(const QString &filePath)
{
    QString MD5;
    QFile file(filePath);
    if(file.open(QIODevice::ReadOnly))
    {
        QByteArray str;
        str = QCryptographicHash::hash(file.readAll(),QCryptographicHash::Md5);
        MD5.append(str.toHex());
    }
    return MD5;
}

//文件的递归检查
int CCheckPage::FindFile(const QString &_filePath)
{
    QDir dir(_filePath);   //QDir的路径一定要是全路径,相对路径会有错误
    if(!dir.exists())
        return -1;

    //取到所有的文件和文件名,去掉.和..文件夹
    dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
    dir.setSorting(QDir::DirsFirst);
    //将其转化为一个list
    QFileInfoList list = dir.entryInfoList();
    if(list.size()<1)
        return -1;

    int i = 0;
    //采用递归算法
    do {
        QFileInfo fileInfo = list.at(i);
        bool bisDir = fileInfo.isDir();
        if(bisDir)
        {
            FindFile(fileInfo.filePath());
        }
        else
        {
            QString fileName = fileInfo.filePath().mid(m_prefLen);
            QString md5 = m_dbOper->FileMD5(fileInfo.filePath());
            QString md50 = m_dbOper->FileExits(fileName);
            if(md50.isEmpty())
            {
                json_object obj;
                obj.insert("status", "add");
                obj.insert("name", fileName);
                obj.insert("type", fileInfo.suffix());
                obj.insert("install", m_dbOper->FileInstall(fileName));
                obj.insert("md5", md5);
                m_array.append(obj);
            }
            else if(md5 != md50)
            {
                json_object obj;
                obj.insert("status", "changed");
                obj.insert("name", fileName);
                obj.insert("type", fileInfo.suffix());
                obj.insert("install", m_dbOper->FileInstall(fileName));
                obj.insert("md5", md5);
                m_array.append(obj);
            }
        }

        ++i;
    }while(i<list.size());

    return 0;
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:37:43  更:2022-03-17 22:41:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 1:17:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码