软件在线升级系统设计

article/2025/8/29 22:17:30

需求描述

一直用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);//将其转化为一个listQFileInfoList 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;
}

http://chatgpt.dhexx.cn/article/vaWTP1Ej.shtml

相关文章

Nginx在线升级

1、查看当前nginx版本&#xff0c;nginx -v&#xff08;小写v&#xff09; 2、下载最新版本nginx包&#xff0c;nginx-1.23.1.tar.gz 3、解压tar -zxvf nginx-1.23.1.tar.gz 4、进入解压目录cd nginx-1.23.1.tar.gz 5、查看nginx当前配置&#xff0c;nginx -V注意这里是大写…

在线升级:OTA升级的原理和实现方式

目录 1、OTA 在线升级 2、实现方式 3、操作方式 3.1、后台式升级 3.2、非后台式式更新 4、STM32 的在线升级 4.1、划分 Flash 区域 4.2、实操1 - Flash空间地址的划分 4.3、实操2 - 设置工程 4.4、实操3 - 接收固件更新包 4.5、实操4 - 拷贝程序至Flash 4.6、实操5 - 跳转至 Ap…

halcon 彩色图转灰度图

read_image (Image, jiao1.bmp) //读取图像 get_image_size (Image, Width, Height) //获取宽高 dev_close_window () //关闭图形窗口 rgb1_to_gray (Image, GrayImage) //彩色图转灰度图 dev_open_window (0, 0, Width, Height, black, WindowHandle) //打开图形窗口 d…

Python中使用PIL快速实现灰度图

效果 原图 效果图 实现 新建文件夹grayImage&#xff0c;在此文件夹下新建gray.py from PIL import Image imgImage.open(1111.jpg) imgimg.convert(L) img.save(灰度图.jpg) 其中1111.jpg是原图&#xff0c;将其放在同目录下。 运行即可。 源码以及资源下载 https://do…

计算机灰度分析,计算机中的256级灰度图像

【建议1】使用GltraEdit软件观察字符“((Z20享有声望的学校联盟)”的内部代码. 以下说法正确 A. 字符“(”的内部代码占用两个字节 B. 字符“ Lian”的代码值的二进制表示形式是11010001 10101010 C. 图片中有5个ASCⅡ字符,其中字符“ 2”的代码值的十六进制表示为32 D. 字符“…

C++-灰度图上色GrayToColor

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 场景需求 最近有客户提出&#xff0c;想要将解包裹图像转化为有颜色的图像&#xff0c;具备更佳的视觉效果。解包裹图是一个floa…

灰度图与二值化

图像处理的灰度化和二值化 在图像处理中&#xff0c;用RGB三个分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即红、绿、蓝三原色来表示真彩色&#xff0c;R分量&#xff0c;G分量&#xff0c;B分量的…

opencv学习5:cvtColor RGB图像转灰度图像原理

简介 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定&#xff0c;而每个分量有255中值可取&#xff0c;这样一个像素点可以有1600多万&#xff08;255*255*255&#xff09;的颜色的变化范围。而灰度图像是R、G、…

Matplotlib显示灰度图

引言 matplotlib中的imshow()函数不能自动显示灰度图像&#xff0c;这一点应该是众所周知的&#xff0c;需要调用cmap“gray"以进行设置&#xff0c;但是cmap"gray"实际上并不是如opencv中的imshow函数一样将单通道图显示为灰度图&#xff0c;私以为是引入了灰度…

python显示灰度图像,Python读取图像并显示灰度图的实现

python读取图像 原图: import cv2 # 利用opencv读取图像 import numpy as np # 利用matplotlib显示图像 import matplotlib.pyplot as plt img cv2.imread("./lena.png") #读取图像 # 显示图像 plt.imshow(img) plt.axis(off) plt.show() 效果&#xff1a; 问&#…

OpenCV灰度图

什么是灰度图&#xff1a; 百度百科 什么是灰度图 #include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std;int main(int argc, char** argv) {Mat src Mat(4,4,CV_8UC3,Scalar(28,128,228));cout << src << en…

RGB图像转化为灰度图原理

RGB图像转化为灰度图原理 1 原理 利用MATLAB对RGB图像进行读取&#xff1a; imgimread(蒙娜丽莎.jpg);可以知道存储RGB图像数据为 256 256 3 u i n t 8 256\times256 \times3\quad uint8 2562563uint8&#xff0c;其中 256 256 256\times256 256256表示长和宽的像素个数&…

彩色图像转换灰度图像

数字图像 现在我们所接触到的图像绝大多数都是数字图像&#xff0c;图像数字化后&#xff0c;每个像素点就可以看作是一个小方格&#xff0c;每个小方格里面存储的就是图像的像素信息。如果把一副数字图像抽象出来&#xff0c;就是一个二维矩阵&#xff08;灰度图&#xff09;或…

Python灰度图像彩色化

1️⃣作业要求 给定一幅灰度图像&#xff0c;使用任意方法将其变成一幅彩色图像&#xff0c;并尽量使得添加的色彩显得较为真实。 2️⃣核心代码 这里我们是直接调用了eccv16和siggraph17的模型&#xff0c;运行程序时会自动下载这两个model文件&#xff0c;然后经过对图像的…

matlab 绘制灰度图

matlab 将矩阵中不同数值所对应的区域用 不同深度的灰度图画出来&#xff0c;不显示坐标轴标签&#xff0c;并设置在画布上全屏显示。 if 1close allrng (7)mask_allrand(256,256)*10;mask_allround(mod(mask_all,2));mask_allsort(mask_all);mask_all(1:100,1:50)0;mask_all(…

matlab读取一幅灰度图,Matlab处理灰度图

作业2&#xff1a;通过图像分析的方法对如下图像进行分析&#xff0c;获取颗粒特性参数。具体参数包括图像中的颗粒个数&#xff0c;颗粒面积&#xff0c;颗粒等效直径&#xff0c;非球形颗粒的长/短轴&#xff0c;非球形颗粒的方位。 图1 待处理颗粒图像 步骤&#xff1a; (1)…

python灰度图

任务描述 背景   真彩色图像和灰度图像是数字图像的两种常见类型&#xff0c;如下图所示&#xff0c;左图是真彩色图像&#xff0c;右图是灰度图像。    在真彩色图像中&#xff0c;像素颜色是 RGB 颜色&#xff0c;每个颜色包含 R、G、B 三个颜色分量。而在灰度图像中&…

图像处理--灰度图

灰度图 灰度图&#xff0c;Gray Scale Image 或是Grey Scale Image&#xff0c;又称灰阶图。把白色与黑色之间按对数关系分为若干等级&#xff0c;称为灰度。灰度分为256阶。 灰度图定义 什么叫灰度图&#xff1f;任何颜色都有红、绿、蓝三原色组成&#xff0c;假如原来某点…

OpenCV(三)彩色图灰度化、通道分离、单通道反差处理(灰度图)、多通道反差处理(彩色图)

目录 一、彩色图灰度化 1、主要函数cvtColor()介绍 2、代码 3、效果 二、通道分离 1、向量介绍 2、总代码 3、效果 三、单通道(灰度图)反差处理 1、单通道向量访问 2、代码 3、效果 四、多通道(彩色图)反差处理&#xff08;彩色图的反差处理&#xff09; 1、多…

灰度图与RGB图

1.灰度图 灰度图就是单通道图像&#xff0c;而单通道图是指维度数为2的图像。 而灰度就是没有色彩&#xff0c;RGB色彩分量全部相等&#xff08;可将这点与下文的RGB图进行对比&#xff09;。那么灰度图的每个像素点就只有一个值表示颜色&#xff0c;像素值的范围就是[0~255]。…