const http = require('http');
const https = require('https');
const fs = require('fs');
const { URL } = require('url');
const path = require('path');// 下載文件函數
function downloadFile(url, savePath) {return new Promise((resolve, reject) => {try {console.log(`開始下載: ${url}`);console.log(`保存路徑: ${savePath}`);const parsedUrl = new URL(url);const protocol = parsedUrl.protocol === 'https:' ? https : http;// 創建保存目錄(如果不存在)const saveDir = path.dirname(savePath);fs.mkdirSync(saveDir, { recursive: true });const fileStream = fs.createWriteStream(savePath);const request = protocol.get(url, (response) => {if (response.statusCode !== 200) {reject(new Error(`HTTP錯誤,狀態碼: ${response.statusCode}`));return;}const totalBytes = parseInt(response.headers['content-length'], 10) || 0;let receivedBytes = 0;response.on('data', (chunk) => {receivedBytes += chunk.length;const progress = totalBytes > 0 ? (receivedBytes / totalBytes) * 100 : 0;console.log(`下載進度: ${progress.toFixed(2)}%`);});response.on('end', () => {fileStream.end();console.log('下載完成');resolve(savePath);});response.on('error', (error) => {console.error('響應流錯誤:', error);fileStream.destroy();reject(error);});// 將響應數據管道傳輸到文件流response.pipe(fileStream);});request.on('error', (error) => {console.error('請求錯誤:', error);fileStream.destroy();reject(error);});request.on('timeout', () => {console.error('請求超時');request.destroy();fileStream.destroy();reject(new Error('請求超時'));});// 設置超時時間(30秒)request.setTimeout(30000);request.end();} catch (error) {console.error('下載過程中發生異常:', error);reject(error);}});
}// 檢查更新并下載
async function checkAndDownloadUpdate() {try {console.log('檢測更新...');const updateUrl = "http://dade.dddxxxx.com/app/dade.zip";// 使用當前目錄下的downloads文件夾作為保存位置const savePath = path.join(__dirname, 'downloads', 'dade.zip');await downloadFile(updateUrl, savePath);console.log('更新下載成功!');// 這里可以添加下載完成后的處理邏輯,如解壓文件等} catch (error) {console.error('更新檢查或下載失敗:', error);// 可以在這里添加重試邏輯或通知用戶}
}// 立即執行一次檢查
checkAndDownloadUpdate();// 如果需要定時檢查,可以取消下面的注釋
// setInterval(checkAndDownloadUpdate, 60 * 60 * 1000); // 每小時檢查一次
完整代碼
const { app, BrowserWindow, Tray, Menu, nativeImage } = require('electron');
const path = require('path');
// 引入文件
const { start } = require(path.join(__dirname, 'electron/start.js'));
const { mysql } = require(path.join(__dirname, 'electron/mysql.js'));
const { setWin } = require(path.join(__dirname, 'electron/win.js'));
const { starts } = require(path.join(__dirname, 'electron/server.js'));
const { my } = require(path.join(__dirname, 'electron/my.js'));// 單實例檢查,如何打開過一個了,不用打開多個
const getTheLock = app.requestSingleInstanceLock();
if (!getTheLock) {app.quit();return;
}else{app.on('second-instance', (event, commandLine, workingDirectory) => {if (!win || win.isDestroyed()) {createWindow();} else {if (win.isMinimized()) {win.restore();}win.show();win.focus();}});
}let win;
// 定義窗口關閉事件的回調函數,方便后續移除
const handleWindowClose = (e) => {// 點擊關閉,隱藏所有窗口e.preventDefault();win.hide();
};
// 存放main.js的路徑
let electronPage = __dirnamefunction createWindow() {win = new BrowserWindow({width: 400,height: 550,autoHideMenuBar: true, // 自動隱藏菜單resizable: false, // 禁止窗口調整大小title:"AI智能APP",webPreferences: {nodeIntegration: true,contextIsolation: false,enableRemoteModule: true},});// 生產環境加載打包后的index.htmlwin.loadFile(path.join(__dirname, 'dist/index.html'));// 訪問服務,打包環境和開發環境都可以用// win.loadURL('http://127.0.0.1:8600/#/');// 監聽窗口關閉事件,阻止默認關閉行為win.on('close', handleWindowClose);// 啟動start(win,electronPage);// mysqlmysql(win,electronPage)// win窗口setWin()// 連接數據庫my(win,electronPage)}const http = require('http');
const https = require('https');
const fs = require('fs');
const { URL } = require('url');
// 監聽更新
function winUpdate(){// 每次執行完后重新設置定時器try {// 獲取當前時間并格式化為易讀的字符串// const now = new Date();// const timeString = now.toLocaleString();// console.log(`當前時間: ${timeString}`);// // 記錄內存使用情況(可選)// const memoryUsage = process.memoryUsage();// console.log(`內存使用: ${Math.round(memoryUsage.heapUsed / 1024 / 1024)} MB`);console.log('檢測更新...');checkAndDownloadUpdate()}catch(error) {console.error('定時任務出錯:', error);}finally {// 無論如何都繼續下一次執行// setTimeout(winUpdate, 1000);}
}
winUpdate()// 下載文件函數
function downloadFile(url, savePath) {return new Promise((resolve, reject) => {try {console.log(`開始下載: ${url}`);console.log(`保存路徑: ${savePath}`);const parsedUrl = new URL(url);const protocol = parsedUrl.protocol === 'https:' ? https : http;// 創建保存目錄(如果不存在)const saveDir = path.dirname(savePath);fs.mkdirSync(saveDir, { recursive: true });const fileStream = fs.createWriteStream(savePath);const request = protocol.get(url, (response) => {if (response.statusCode !== 200) {reject(new Error(`HTTP錯誤,狀態碼: ${response.statusCode}`));return;}const totalBytes = parseInt(response.headers['content-length'], 10) || 0;let receivedBytes = 0;response.on('data', (chunk) => {receivedBytes += chunk.length;const progress = totalBytes > 0 ? (receivedBytes / totalBytes) * 100 : 0;// console.log(`下載進度: ${progress.toFixed(2)}%`);});response.on('end', () => {fileStream.end();console.log('下載完成');resolve(savePath);});response.on('error', (error) => {console.error('響應流錯誤:', error);fileStream.destroy();reject(error);});// 將響應數據管道傳輸到文件流response.pipe(fileStream);});request.on('error', (error) => {console.error('請求錯誤:', error);fileStream.destroy();reject(error);});request.on('timeout', () => {console.error('請求超時');request.destroy();fileStream.destroy();reject(new Error('請求超時'));});// 設置超時時間(6分鐘)request.setTimeout(360000);request.end();} catch (error) {console.error('下載過程中發生異常:', error);reject(error);}});}// 檢查更新并下載
async function checkAndDownloadUpdate() {try {console.log('檢測更新...');const updateUrl = "http://dade.dddxxxx.com/app/dade.zip";// 使用當前目錄下的downloads文件夾作為保存位置const savePath = path.join(__dirname, '', 'dade.zip');await downloadFile(updateUrl, savePath);console.log('更新下載成功!');// 這里可以添加下載完成后的處理邏輯,如解壓文件等} catch (error) {console.error('更新檢查或下載失敗:', error);// 可以在這里添加重試邏輯或通知用戶}
}// 啟動
let tray;
app.whenReady().then(() => {createWindow();// 加入右下角// const icon = nativeImage.createFromPath('images/log.png');const icon = nativeImage.createFromPath(path.join(__dirname, 'images/log.png'));tray = new Tray(icon);const contextMenu = Menu.buildFromTemplate([{label: '打開窗口',click: () => {if (!win || win.isDestroyed()) {createWindow();} else {win.show();win.focus();}}},{label: '退出應用',click: () => {if (win &&!win.isDestroyed()) {// 移除關閉事件監聽器,避免阻止關閉win.removeListener('close', handleWindowClose);win.close();}app.quit();}}]);tray.setContextMenu(contextMenu);// 為托盤添加點擊事件監聽器tray.on('click', () => {if (!win || win.isDestroyed()) {createWindow();} else {win.show();win.focus();}});tray.setToolTip('沛基AI');tray.setTitle('沛基AI');// 其它console.log("啟動啦");app.on('activate', function () {if (BrowserWindow.getAllWindows().length === 0) createWindow();});
});// 窗口關閉事件
app.on('window-all-closed', function () {console.log("關閉啊");// 直接關閉// if (process.platform!== 'darwin') app.quit();
});