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.pswp.cn/news/395870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395870.shtml
英文地址,請注明出處:http://en.pswp.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;最常用是標注在方法上&…