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,一经查实,立即删除!

相关文章

个人工作总结04(冲刺二)

今天是团队第二次冲刺阶段开始的第04天&#xff0c;我的工作总结如下&#xff1a; 一、昨天干了什么&#xff1f; 知识圈查询功能 基本实现数据库查询 (未完成) 二、今天准备做什么&#xff1f; 知识圈查询功能 基本实现数据库查询 三、遇到了什么困难&#xff1f; 数据库访问出…

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没有安装成功&#…

freecodecamp_为什么您一定要参与freeCodeCamp的一个研究小组

freecodecampby Frederick Ige弗雷德里克艾格(Frederick Ige) 为什么您一定要参与freeCodeCamp的一个研究小组 (Why you should definitely get involved with one of freeCodeCamp’s study groups) I’m writing this article in hopes of convincing you to take advantage…

C语言运行时数据结构

段&#xff08;Segment&#xff09;&#xff1a; 对象文件/可执行文件&#xff1a; SVr4 UNIX上被称为ELF&#xff08;起初"Extensible Linker Format", 现在"Executable and Linking Format"&#xff09;文件。BSD UNIX上被称为a.out。这些格式都具有段的…

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…

Hibernate包及相关工具包下载地址

Hibernate包及相关工具包下载地址&#xff1a; http://prdownloads.sourceforge.net/hibernate/ 这里包含所有hibernate各个版本的包下载&#xff0c;且提供了 Middlegen Hibernate及hibernate-extensions包的下载。这两个包是用于自动生成相就的JAVA和*.hb…

init(coder:)_2018年《 New Coder》调查:31,000人告诉我们他们如何学习编码并在工作中获得工作…

init(coder:)More than 31,000 people responded to our 2018 New Coder Survey, granting researchers an unprecedented glimpse into how adults are learning to code.超过31,000人对我们的2018年《新编码器调查》做出了回应&#xff0c;使研究人员对成年人如何学习编码有了…

Redis源码解析:21sentinel(二)定期发送消息、检测主观下线

六&#xff1a;定时发送消息 哨兵每隔一段时间&#xff0c;会向其所监控的所有实例发送一些命令&#xff0c;用于获取这些实例的状态。这些命令包括&#xff1a;”PING”、”INFO”和”PUBLISH”。 “PING”命令&#xff0c;主要用于哨兵探测实例是否活着。如果对方超过一段时间…

[SDOI2018]原题识别

题解&#xff1a; 。。感觉挺烦得 而且我都没有注意到树随机这件事情。。 就写个30分的莫队。。 #include <bits/stdc.h> using namespace std; #define rint register int #define IL inline #define rep(i,h,t) for (int ih;i<t;i) #define dep(i,t,h) for (int it;…

django app中扩展users表

app models中编写新的User1 # _*_ coding:utf-8 _*_2 from __future__ import unicode_literals34 from django.db import models5 from django.contrib.auth.models import AbstractUser # 继承user67 # Create your models here.8910 class UserProfile(AbstractUser):11 …

[bzoj2301] [HAOI2011]Problem b

Description 对于给出的n个询问&#xff0c;每次求有多少个数对(x,y)&#xff0c;满足a≤x≤b&#xff0c;c≤y≤d&#xff0c;且gcd(x,y) k&#xff0c;gcd(x,y)函数为x和y的最大公约数。 Input 第一行一个整数n&#xff0c;接下来n行每行五个整数&#xff0c;分别表示a、b、…

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

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

设置MYSQL允许用IP访问

mysql>use mysql;mysql>update user set host % where user root;mysql>flush privileges;mysql>select host,user from user where userroot;mysql>quit 转载于:https://www.cnblogs.com/vipstone/p/5541619.html

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

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

[BZOJ3203][SDOI2013]保护出题人(凸包+三分)

https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型&#xff0c;先把式子化到底再对应到几何图形中去。 1 #include<cstdio>2 #include<algorithm>3 #define rep(i,l,r) for (int i(l); i<(r); i)4 typedef long long ll;5 using names…

轻松创建nodejs服务器(1):一个简单nodejs服务器例子

这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下我们先来实现一个简单的例子&#xff0c;hello world。 似乎每种语言教程的第一节都会讲这个&#xff0c;我们也不例外。 首先我们先创建一个项…

谁是赢家_人工智能竞赛正在进行中。 这是赢家。

谁是赢家by Terren Peterson由Terren Peterson 人工智能竞赛正在进行中。 这是赢家。 (The race is on for artificial intelligence. Here’s who is winning.) On Saturday, Louisville, Kentucky hosted the 143rd running of the Kentucky Derby. It was a spectacle wher…

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

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

自动化脚本

自动化脚本工具: http://appium.io/slate/cn/master/?python#about-appium 查看app元素工具: uiautomatorviewer http://www.cnblogs.com/ITGirl00/p/4235466.html app 反编译原理 http://blog.csdn.net/jiangwei0910410003/article/details/47188679转载于:https://www.cnblo…

springmvc常用注解之@Controller和@RequestMapping

对于各种注解而言&#xff0c;排第一的当然是“Controller”,表明某类是一个controller。 “RequestMapping”请求路径映射&#xff0c;如果标注在某个controller的类级别上&#xff0c;则表明访问此类路径下的方法都要加上其配置的路径&#xff1b;最常用是标注在方法上&…