feat: test
This commit is contained in:
parent
78d4a508b6
commit
6c9ba88a4e
|
@ -1,13 +1,13 @@
|
|||
import { resolve } from 'path'
|
||||
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
|
||||
import { defineConfig, externalizeDepsPlugin, bytecodePlugin } from 'electron-vite'
|
||||
import react from '@vitejs/plugin-react'
|
||||
|
||||
export default defineConfig({
|
||||
main: {
|
||||
plugins: [externalizeDepsPlugin()]
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin()]
|
||||
},
|
||||
preload: {
|
||||
plugins: [externalizeDepsPlugin()]
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin()]
|
||||
},
|
||||
renderer: {
|
||||
resolve: {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "cvpilot-desktop",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.3",
|
||||
"description": "An Electron application with React and TypeScript",
|
||||
"main": "./out/main/index.js",
|
||||
"author": "example.com",
|
||||
|
@ -12,7 +12,7 @@
|
|||
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false",
|
||||
"typecheck": "npm run typecheck:node && npm run typecheck:web",
|
||||
"start": "electron-vite preview",
|
||||
"dev": "electron-vite dev",
|
||||
"dev": "electron-vite dev --watch",
|
||||
"build": "npm run typecheck && electron-vite build",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"build:unpack": "npm run build && electron-builder --dir",
|
||||
|
|
|
@ -2,8 +2,9 @@ import { app, shell, BrowserWindow } from 'electron'
|
|||
import { join } from 'path'
|
||||
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
|
||||
import icon from '../../resources/icon.png?asset'
|
||||
import { setupSignals } from './ipc'
|
||||
import { setupIpcHandle } from './ipc'
|
||||
import './sqlite3'
|
||||
import { setupAutoUpdater } from './updater'
|
||||
|
||||
function createWindow(): void {
|
||||
// Create the browser window.
|
||||
|
@ -35,6 +36,9 @@ function createWindow(): void {
|
|||
} else {
|
||||
mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
|
||||
}
|
||||
|
||||
setupIpcHandle()
|
||||
setupAutoUpdater(mainWindow)
|
||||
}
|
||||
|
||||
// This method will be called when Electron has finished
|
||||
|
@ -51,8 +55,6 @@ app.whenReady().then(() => {
|
|||
optimizer.watchWindowShortcuts(window)
|
||||
})
|
||||
|
||||
setupSignals()
|
||||
|
||||
createWindow()
|
||||
|
||||
app.on('activate', function () {
|
||||
|
|
|
@ -1,8 +1,16 @@
|
|||
import { ipcMain } from 'electron'
|
||||
import { autoUpdater, ipcMain } from 'electron'
|
||||
|
||||
/**
|
||||
* ipc signals
|
||||
*/
|
||||
export const setupSignals = (): void => {
|
||||
export const setupIpcHandle = (): void => {
|
||||
ipcMain.on('ping', () => console.log('pong'))
|
||||
ipcMain.handle('check-for-updates', (event) => {
|
||||
console.log('检查更新')
|
||||
autoUpdater.checkForUpdates()
|
||||
})
|
||||
|
||||
ipcMain.handle('quit-and-install', () => {
|
||||
autoUpdater.quitAndInstall()
|
||||
})
|
||||
}
|
||||
|
|
|
@ -12,14 +12,19 @@ const initKnex = (): Knex =>
|
|||
useNullAsDefault: true
|
||||
})
|
||||
|
||||
// 创建一个表
|
||||
// 创建一个表,如果它不存在
|
||||
const createTable = async (db: Knex) => {
|
||||
await db.schema.createTable('users', (table) => {
|
||||
table.increments('id')
|
||||
table.string('name')
|
||||
table.integer('age')
|
||||
})
|
||||
console.log('Table created')
|
||||
const exists = await db.schema.hasTable('users')
|
||||
if (!exists) {
|
||||
await db.schema.createTable('users', (table) => {
|
||||
table.increments('id')
|
||||
table.string('name')
|
||||
table.integer('age')
|
||||
})
|
||||
console.log('Table created')
|
||||
} else {
|
||||
console.log('Table already exists')
|
||||
}
|
||||
}
|
||||
|
||||
// 插入数据
|
||||
|
|
38
src/main/updater.ts
Normal file
38
src/main/updater.ts
Normal file
|
@ -0,0 +1,38 @@
|
|||
import { app, BrowserWindow, ipcMain } from 'electron'
|
||||
import { autoUpdater } from 'electron-updater'
|
||||
|
||||
/**
|
||||
* 文档地址: https://www.electronjs.org/zh/docs/latest/api/auto-updater#event--before-quit-for-update
|
||||
*/
|
||||
export const setupAutoUpdater = (win: BrowserWindow) => {
|
||||
// 配置更新服务器地址
|
||||
const updateServerUrl = `http://192.168.1.7:5500/update/${process.platform}/${app.getVersion()}`
|
||||
console.log(app.getVersion())
|
||||
// 设置自动更新的 feed URL
|
||||
autoUpdater.setFeedURL({ provider: 'generic', url: updateServerUrl })
|
||||
|
||||
console.log(autoUpdater.getFeedURL())
|
||||
|
||||
autoUpdater.on('update-downloaded', (e) => {
|
||||
console.log(e)
|
||||
ipcMain.emit('update-ready', e)
|
||||
})
|
||||
|
||||
autoUpdater.on('update-not-available', () => {
|
||||
console.log('update-not-available')
|
||||
ipcMain.emit('update-not-available', '没有可用更新')
|
||||
})
|
||||
|
||||
autoUpdater.on('checking-for-update', () => {
|
||||
console.log('checking-for-update,开始检查更新')
|
||||
})
|
||||
|
||||
autoUpdater.on('update-available', () => {
|
||||
console.log('update-available,有可用更新')
|
||||
})
|
||||
|
||||
autoUpdater.on('error', (error) => {
|
||||
console.log('更新错误', error)
|
||||
win.webContents.send('update-error', { error, updateServerUrl })
|
||||
})
|
||||
}
|
6
src/preload/index.d.ts
vendored
6
src/preload/index.d.ts
vendored
|
@ -3,6 +3,10 @@ import { ElectronAPI } from '@electron-toolkit/preload'
|
|||
declare global {
|
||||
interface Window {
|
||||
electron: ElectronAPI
|
||||
api: unknown
|
||||
api: {
|
||||
checkUpdate
|
||||
confirmUpdate
|
||||
quitInstall
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
import { contextBridge } from 'electron'
|
||||
import { contextBridge, ipcRenderer } from 'electron'
|
||||
import { electronAPI } from '@electron-toolkit/preload'
|
||||
|
||||
// Custom APIs for renderer
|
||||
const api = {}
|
||||
const api = {
|
||||
checkUpdate: () => ipcRenderer.invoke('check-for-updates'),
|
||||
confirmUpdate: (version) => ipcRenderer.invoke('confirmUpdate', version),
|
||||
quitInstall: () => ipcRenderer.invoke('quit-and-install')
|
||||
}
|
||||
|
||||
// Use `contextBridge` APIs to expose Electron APIs to
|
||||
// renderer only if context isolation is enabled, otherwise
|
||||
|
|
|
@ -1,12 +1,36 @@
|
|||
import Versions from './components/Versions'
|
||||
import electronLogo from './assets/electron.svg'
|
||||
import { useEffect } from 'react'
|
||||
|
||||
function App(): JSX.Element {
|
||||
const ipcHandle = (): void => window.electron.ipcRenderer.send('ping')
|
||||
const updateHandle = () => window.api.checkUpdate()
|
||||
|
||||
useEffect(() => {
|
||||
window.electron.ipcRenderer.on('update-ready', (e, data) => {
|
||||
console.log(data)
|
||||
const response = confirm('新版本已下载,是否重启应用来安装更新?')
|
||||
if (response) window.api.quitInstall()
|
||||
})
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
window.electron.ipcRenderer.on('update-error', (e, data) => {
|
||||
// console.log(e)
|
||||
console.log(data)
|
||||
})
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
window.electron.ipcRenderer.on('update-not-available', (e, data) => {
|
||||
console.log(data)
|
||||
})
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<>
|
||||
<img alt="logo" className="logo" src={electronLogo} />
|
||||
<button onClick={updateHandle}>更新22</button>
|
||||
<div className="creator">Powered by electron-vite</div>
|
||||
<div className="text">
|
||||
Build an Electron app with <span className="react">React</span>
|
||||
|
|
|
@ -8,6 +8,7 @@ function Versions(): JSX.Element {
|
|||
<li className="electron-version">Electron v{versions.electron}</li>
|
||||
<li className="chrome-version">Chromium v{versions.chrome}</li>
|
||||
<li className="node-version">Node v{versions.node}</li>
|
||||
<li>{window.electron.process.platform}</li>
|
||||
</ul>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
import './assets/main.css'
|
||||
|
||||
import React from 'react'
|
||||
import ReactDOM from 'react-dom/client'
|
||||
import App from './App'
|
||||
|
||||
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>
|
||||
)
|
||||
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(<App />)
|
||||
|
|
Loading…
Reference in New Issue
Block a user