node webkit(nw.js) 设置自动更新

原理:把更新的文件放在服务器上,设置一个客户端版本号,每次打开客户端的时候,通过接口获取服务器上的版本,如果高于本地的版本就下载服务器上的代码,低于或等于就不更新

 

  1 <script>
  2         var http = require('http');
  3         var fs = require('fs');
  4         var request = require('request');
  5         var unzip = require('unzip2');
  6         var Driver = function () {
  7             this.timer = '';
  8             this.timer2 = '';
  9         };
 10         Driver.prototype = {
 11                 /* 读取本地版本 */
 12                 readFile: function () {
 13                     var self = this;
 14                     if (fs.existsSync('src/js/global.js')) {                
 15                         self.case1();
 16                     } else {
 17                         $.ajax({
 18                             type: 'post',
 19                             url: 'url(接口地址)',
 20                             dataType: 'jsonp',
 21                             contentType: "application/jsonp; charset=utf-8",
 22                             data: {'userId': 0,
 23                             },
 24                             success: function (data) {
 25                                 console.log("正在下载解压包...");
 26                                 if (data.code == 0) {
 27                                     if (data.result.update == 1) {
 28                                         var gx = document.getElementsByClassName('gx')[0];
 29                                         gx.style.display = "block";
 30                                         /* 下载地址 下载到的目录*/
 31                                         if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) {
 32                                             self.rmdirFile('upload/zip', function () {
 33 
 34                                                 self.rmdirFile('nsrc', function () {
 35 
 36                                                     self.createDir('upload/zip', function () {
 37                                                         console.log("创建下载zip目录成功...");
 38                                                         //创建下载zip的目录
 39                                                         self.downFile(data.result.url);
 40                                                     });
 41                                                 })
 42                                             })
 43                                         } else {
 44                                             self.createDir('upload/zip', function () {
 45                                                 console.log("创建下载zip目录成功...");
 46                                                 //创建下载zip的目录
 47                                                 self.downFile(data.result.url);
 48                                             });
 49                                         }
 50                                     } else {
 51                                         setTimeout(function () {
 52                                             window.location.href = "../src/Login/login.html";
 53                                         }, 2250);
 54                                     }
 55                                 }
 56                             },
 57                             error: function () {
 58 
 59                                 alert(data.msg);
 60 
 61                             }
 62 
 63                         });
 64 
 65                     }
 66                 },
 67                 /* 如果global没有被删除*/
 68                 case1: function () {
 69                     var self = this;
 70                     global.post('/system/checkVersion', {}, function (data) {
 71                         console.log("正在下载解压包...");
 72                         if (data.code == 0) {
 73                             if (data.result.update == 1) {
 74                                 var gx = document.getElementsByClassName('gx')[0];
 75                                 gx.style.display = "block";
 76                                 /* 下载地址 下载到的目录*/
 77                                 if (fs.existsSync('nsrc') || fs.existsSync('upload/zip')) {
 78                                     self.rmdirFile('upload/zip', function () {
 79 
 80                                         self.rmdirFile('nsrc', function () {
 81 
 82                                             self.createDir('upload/zip', function () {
 83                                                 console.log("创建下载zip目录成功...");
 84                                                 //创建下载zip的目录
 85                                                 self.downFile(data.result.url);
 86                                             });
 87                                         })
 88                                     })
 89                                 } else {
 90                                     self.createDir('upload/zip', function () {
 91                                         console.log("创建下载zip目录成功...");
 92                                         //创建下载zip的目录
 93                                         self.downFile(data.result.url);
 94                                     });
 95                                 }
 96                             } else {
 97                                 setTimeout(function () {
 98                                     window.location.href = "../src/Login/login.html";
 99                                 }, 2250);
100                             }
101                         } else {
102                             alert(data.msg);
103                         }
104                     });
105                 },
106                 /* 下载解压包 */
107                 downFile: function (url) {
108                     var self = this;
109                     self.download(url, 'upload/zip/nsrc.zip', function () {
110                         /* 下载完成创建解压目录 */
111                         clearInterval(self.timer);
112                         sc.style.width = 0;
113                         sj.innerHTML = '正在解压安装 2/2 '
114                         console.log('正在创建临时目录');
115                         self.createDir('nsrc', function () {
116                             self.unZip();
117                             console.log('正在解压...');
118                             /* 前端做的假进程 */
119                             setTimeout(function () {
120                                 var startC = parseInt(Math.floor(Math.random() * 3 + 1) * 10);
121                                 sc.style.width = startC + '%';
122                                 self.timer2 = setInterval(function () {
123                                     startC += startC + Math.floor(Math.random() * 3 + 1) * 0.2;
124                                     console.log('aaa');
125                                     if (startC >= 90) {
126                                         clearInterval(self.timer2);
127                                         startC = 90;
128                                     }
129                                     sc.style.width = startC + '%';
130                                 }, 500);
131                             }, 1000);
132 
133 
134                         });
135                         /*self.unZip();*/
136                     });
137                 },
138                 /* 下载完成创建交换目录 */
139                 createDir: function (v, callback) {
140                     var slef = this;
141                     /* 创建的新目录名是nsrc*/
142                     fs.mkdir(v, function (err) {
143                         if (!err) {
144                             console.log('创建目录成功...');
145                             callback && callback(err);
146                         } else {
147                             console.log("创建目录失败...");
148                         }
149                     })
150                 },
151                 /* 解压zip */
152                 unZip: function () {
153                     var self = this;
154                     /* 解压到nsrc中*/
155                     var extract = unzip.Extract({
156                         path: 'nsrc' //process.cwd()
157                     }); //获取根目录
158                     fs.createReadStream('upload/zip/nsrc.zip').pipe(extract);
159                     extract.on('error', function (err) {
160                         console.log(err);
161 
162                         console.log("解压失败");
163                     });
164                     extract.on('finish', function () {
165                         /* argv[1] 主模板的绝对路径 第一个命令行从 argv[2]这个位置开始 */
166                         /* 在此之前删除之前的src文件夹 */
167                         /* self.rmdirFile(process.cwd()+'\\'+'src', function () {
168                             console.log(1);
169                             /* 重命名文件夹 */
170                         /*self.reName(fs.readdirSync(process.cwd()+'\\'+'nsrc')[0]);*/
171 
172                         /*console.log('success')
173                         });*/
174 
175                     });
176 
177                     extract.on('close', function () {
178                         /* */
179                         console.log("解压成功");
180                         self.rmdirFile('src', function () {
181                             /*删除掉之前的src文件夹 解压 重命名新的文件夹*/
182                             self.copy();
183                         })
184 
185 
186                     });
187                     extract.on('end', function () {});
188                 },
189                 copy: function () {
190                     var self = this;
191                     fs.rename('nsrc/src', 'src', function (err) {
192                         /* 删除 nsrc 如果能删除  说明压缩的 还未压缩完 再次压缩*/
193                         if (fs.existsSync('nsrc')) {
194                             fs.rmdir('nsrc', function (err) {
195                                 if (err) {
196                                     console.log(err);
197                                     console.log("删除失败....");
198                                 } else {
199                                     console.log("删除成功...");
200                                     self.copy();
201                                 }
202                             });
203                         } else {
204                             self.rmdirFile('upload/zip', function () {
205                                 console.log("删除缓存成功...");
206                                 console.log("更新完成启动客户端...");
207                                 sc.style.width = 100 + '%';
208                                 setTimeout(function () {
209                                     window.location.href = "../src/Login/login.html";
210                                 }, 2250);
211                             });
212                         }
213 
214                     })
215                 },
216                 /* 重命名 */
217                 reName: function (filename) {
218                     var self = this;
219                     /*  在此之前删除之前的src文件夹 */
220                     fs.rename('nsrc', 'src', function (err) {
221                         if (err) {
222                             console.log("重命名失败...");
223                         } else {
224                             console.log("重命名成功...");
225                             self.rmdirFile('upload/zip', function () {
226                                 console.log("删除缓存成功...");
227                                 console.log("更新完成启动客户端...");
228                             });
229                         }
230                     });
231                 },
232                 /* 删除文件夹 */
233                 rmdirFile: function (paths, callback) {
234                     var self = this;
235                     var files = [];
236                     /* 判断目录存在 */
237                     /* d递归遍历*/
238                     if (fs.existsSync(paths)) {
239                         files = fs.readdirSync(paths); //同步请求
240                         files.forEach(function (files, index) {
241                             var curPath = paths + "/" + files; //遍历出每个一个目录
242                             //如果当前目录也是目录
243                             if (fs.statSync(curPath).isDirectory()) { //recurse
244                                 /* 递归遍历 */
245                                 self.rmdirFile(curPath);
246                             } else {
247                                 fs.unlinkSync(curPath); //删除文件
248                             }
249                         });
250                         fs.rmdirSync(paths); //删除空文件夹
251                         console.log("删除成功...");
252                     }
253                     callback && callback();
254 
255                 },
256                 /*---- 下载解压包 ----*/
257                 download: function (uri, filename, callback) {
258                     var self = this;
259                     request.head(uri, function (err, res, body) {
260                         console.log('content-type:', res.headers['content-type']);
261                         console.log('content-length:', res.headers['content-length']);
262                         self.timer = setInterval(function () {
263                             sc.style.width = (fs.statSync(filename).size / res.headers['content-length']) * 100 + '%';
264                         }, 500);
265                         request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
266                     });
267                 },
268             },
269             console.log("执行结束");
270     </script>

下面,改变我本地的 版本号!此时服务器上版本是1.1.1

打开后客户端:

下载完之后,看下global.js里面的源代码:

版本号发生了改变,此次更新成功!

注:我并非是将所要代码重新打包放到服务器,而是只把自己修改的部分打成zip(代码里可以看到我读取的是zip ),放在服务器上面,里面一定要包含存放版本号的文件,否则无法判断是否该更新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql8.0版1130_navicat premium连接mysql 8.0报错error 10061和error1130问题

昨天安装了最新版的mysql navicat premium, 但没来得及测试使用Navicat连接。今天上班时&#xff0c;使用Navicat premium连接mysql时&#xff0c;出现报错ERROR 2003 (HY000): Can’t connect to MySQL server on ‘1XX.XX.XX.XX’ (10061).起初以为是mysql没有安装成功&#…

Java挂起线程

2019独角兽企业重金招聘Python工程师标准>>> 不优雅的suspend import java.util.concurrent.TimeUnit;public class SuspendTest {static Object lock new Object();SuppressWarnings("deprecation")public static void main(String[] args) {Suspend s1…

华为p4用鸿蒙系统吗_华为p40pro是鸿蒙系统吗

华为的鸿蒙OS是一款“面向未来”的操作系统&#xff0c;一款基于微内核的面向全场景的分布式操作系统&#xff0c;此前mate30系列并没有搭载鸿蒙系统。那华为p40pro是鸿蒙系统吗&#xff1f;品牌型号&#xff1a;华为p40pro华为p40pro是鸿蒙系统吗&#xff1f;华为p40pro没有搭…

Web优化 --利用css sprites降低图片请求

sprites是鬼怪&#xff0c;小妖精&#xff0c;调皮鬼的意思&#xff0c;初听这个高端洋气的名字我被震慑住了&#xff0c;一步步掀开其面纱后发觉非常easy的东西。作用却非常大 什么是CSS Sprites CSS Sprites是指把网页中非常多小图片&#xff08;非常多图标文件&#xff09;做…

mysql取消mvvc机制_MySQL探秘(六):InnoDB一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。如果读取的行正在执行DELETE或UPDATE操作&#xff0c;这时读取操作不会因此去等待行上锁的释放。相反地&#xff0c;InnoDB会去读取行的一个快照。上图直观地…

APP应用 HTTP/1.0中keep-alive

在HTTP/1.0中keep-alive不是标准协议&#xff0c;客户端必须发送Connection:Keep-Alive来激活keep-alive连接。https://www.imooc.com/article/31231HTTP协议是无状态的协议&#xff0c;即每一次请求都是互相独立的。因此它的最初实现是&#xff0c;每一个http请求都会打开一个…

安装mysql8._安装MySQL8(附详细图文)

安装MySQL8(附详细图文)删除mysql服务&#xff1a;mysqld -remove mysql1、下载 mysql 8下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/2、配置 mysql 配置文件打开 mysql 8 的安装目录&#xff1a;my.ini注意设置自己对应的 mysql 安装目录 和数据存放目录[mysq…

win10安装windows live writer 错误:OnCatalogResult:0x80190194

到官网下载了一个在线安装程序&#xff0c;可是一运行就提示无法安装&#xff0c;显式错误“OnCatalogResult:0x80190194”&#xff0c;如下图所示 找到windows live安装程序的安装日志文件。具体位置是&#xff1a;C:\Users\All Users\Microsoft\WLSetup\Logs 需要下载安装文件…

TZOJ--5480: 孤衾易暖 // POJ--3735 Training little cats (矩阵快速幂)

5480: 孤衾易暖 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 描述 哇&#xff0c;好难&#xff0c;我要放弃了(扶我起来&#xff0c;我还能A 寒夜纵长&#xff0c;孤衾易暖&#xff0c;钟鼓渐清圆。 生活也许有些不如意的地方&#xff0c;但是没有什么是拥有一…

IntelliJ IDEA2017 修改缓存文件的路径

IDEA的缓存文件夹.IntelliJIdea2017.1&#xff0c;存放着IDEA的破解密码&#xff0c;各个项目的缓存&#xff0c;默认是在C盘的用户目录下&#xff0c;目前有1.5G大小。现在想要把它从C盘移出。 在IDEA的安装路径下中&#xff0c;进入bin目录后找到属性文件&#xff1a;idea.pr…

python字符串后面添加字符串_什么是字符串?怎样在Python中添加字符串?

字符串是一种表示文本的数据类型&#xff0c;字符串中的字符可以是ASCII字符、各种符号以及各种Unicode字符。Python中的字符串有如下三种表现方式。第1种方式&#xff1a;使用单引号包含字符。示例代码如下&#xff1a;a 123注意&#xff0c;单引号表示的字符串里不能包含单引…

surround360

1.读入配置文件2.创建底部和顶部投影线程3.将侧面图投影到球座标(1)load侧面相机图像(2)创建投影线程(3)等待线程结束4.渲染立体全景图(侧边)(1)计算重叠区域宽度(2)创建准备生成新视图的线程: 送入相邻两个相机的投影图,计算光流flowLtoR,flowRtoL, 保存在novelViewGenerators…

Docker安装java-Zookeeper进行操作

Docker安装Zookeeper下载Zookeeper镜像 docker pull zookeeper启动容器并添加映射 docker run --privilegedtrue -d --name zookeeper --publish 2181:2181 -d zookeeper:latest 查看容器是否启动 docker ps idea提供了一个Zookeeper插件&#xff0c;以供连接Zookeeper服务中心…

C# 装箱和拆箱

C#的值类型可以分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型。 1、那么值类型和引用类型能否相互转换呢? 答案是肯定的,C#通过装箱和拆箱来实现两者的相互转换。 (1)、装箱 ---把值类型强制转换成引用类型(object类型) (2)、拆箱 ---把引用类型强制转换成值…

node中的Stream-Readable和Writeable解读

在node中&#xff0c;只要涉及到文件IO的场景一般都会涉及到一个类&#xff0d;Stream。Stream是对IO设备的抽象表示&#xff0c;其在JAVA中也有涉及&#xff0c;主要体现在四个类&#xff0d;InputStream、Reader、OutputStream、Writer&#xff0c;其中InputStream和OutputSt…

SQL Server读写分离之发布订阅

一、发布 上面有多种发布方式&#xff0c;这里我选择事物发布&#xff0c;具体区别请自行百度。 点击下一步、然后继续选择需要发布的对象。 如果需要筛选发布的数据点击添加。 根据自己的计划选择发布的时间。 点击安全设置&#xff0c;设置代理信息。 最后单击完成系统会自动…

码农和程序员的几个重要区别!

如果一个企业老板大声嚷嚷说&#xff0c;“我要招个程序员”&#xff0c;那么十之八九指的是“码农”——一种纯粹为了钱而写代码的技术人员。这其实是一种非常狭隘和错误的做法&#xff0c;原因么&#xff0c;且听我一一道来。1、码农写代码&#xff0c;程序员写系统从本质上讲…

移动端工程架构与后端工程架构的思想摩擦之旅(1)

此文已由作者黎星授权网易云社区发布。欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验记资源投放后端工程的架构调整与优化 架构思考一直以来对软件工程架构有着极大的兴趣&#xff0c;无论是之前负责的移动端Android工程&#xff0c;亦或是现在转到后端开发后维…

logging记录日志

日志是一个系统的重要组成部分&#xff0c;用以记录用户操作、系统运行状态和错误信息。日志记录的好坏直接关系到系统出现问题时定位的速度。logging模块Python2.3版本开始成为Python标准库的一部分。 日志级别 在最简单的使用中&#xff0c;我们直接导入logging模块&#xff…

C#编程之接口

1.定义 接口是把公共方法和属性组合起来&#xff0c;以封装特定功能的一个集合。&#xff08;一旦定义了接口&#xff0c;就可以在类中实现它。这样类就可以支持接口所指定的所有属性和成员&#xff09; 注意1&#xff1a;接口不能单独存在。不能像实例化一个类那样实例化一个接…