修复部分已知问题;主要调整包依赖、语法错误

This commit is contained in:
fm453 2024-09-24 15:09:28 +08:00
parent 996ba6bd9d
commit 1c2184becb
76 changed files with 7632 additions and 22879 deletions

View File

@ -1,137 +1,144 @@
export const preloads = {
include: [
"vue",
"vue-router",
"pinia",
"axios",
"@vueuse/core",
"sortablejs",
"path-to-regexp",
"echarts",
"@wangeditor/editor",
"@wangeditor/editor-for-vue",
"vue-i18n",
"path-browserify",
"unocss",
"node",
"md5",
"sqlite3",
"element-plus/es/components/form/style/css",
"element-plus/es/components/form-item/style/css",
"element-plus/es/components/button/style/css",
"element-plus/es/components/input/style/css",
"element-plus/es/components/input-number/style/css",
"element-plus/es/components/switch/style/css",
"element-plus/es/components/upload/style/css",
"element-plus/es/components/menu/style/css",
"element-plus/es/components/col/style/css",
"element-plus/es/components/icon/style/css",
"element-plus/es/components/row/style/css",
"element-plus/es/components/tag/style/css",
"element-plus/es/components/dialog/style/css",
"element-plus/es/components/loading/style/css",
"element-plus/es/components/radio/style/css",
"element-plus/es/components/radio-group/style/css",
"element-plus/es/components/popover/style/css",
"element-plus/es/components/scrollbar/style/css",
"element-plus/es/components/tooltip/style/css",
"element-plus/es/components/dropdown/style/css",
"element-plus/es/components/dropdown-menu/style/css",
"element-plus/es/components/dropdown-item/style/css",
"element-plus/es/components/sub-menu/style/css",
"element-plus/es/components/menu-item/style/css",
"element-plus/es/components/divider/style/css",
"element-plus/es/components/card/style/css",
"element-plus/es/components/link/style/css",
"element-plus/es/components/breadcrumb/style/css",
"element-plus/es/components/breadcrumb-item/style/css",
"element-plus/es/components/table/style/css",
"element-plus/es/components/tree-select/style/css",
"element-plus/es/components/table-column/style/css",
"element-plus/es/components/select/style/css",
"element-plus/es/components/option/style/css",
"element-plus/es/components/pagination/style/css",
"element-plus/es/components/tree/style/css",
"element-plus/es/components/alert/style/css",
"element-plus/es/components/radio-button/style/css",
"element-plus/es/components/checkbox-group/style/css",
"element-plus/es/components/checkbox/style/css",
"element-plus/es/components/tabs/style/css",
"element-plus/es/components/tab-pane/style/css",
"element-plus/es/components/rate/style/css",
"element-plus/es/components/date-picker/style/css",
"element-plus/es/components/notification/style/css",
"element-plus/es/components/image/style/css",
"element-plus/es/components/statistic/style/css",
"element-plus/es/components/watermark/style/css",
"element-plus/es/components/config-provider/style/css",
"element-plus/es/components/text/style/css",
"element-plus/es/components/drawer/style/css",
"element-plus/es/components/color-picker/style/css",
"element-plus/es/components/backtop/style/css",
"element-plus/es/components/message-box/style/css",
"element-plus/es/components/container/style/css",
"element-plus/es/components/header/style/css",
"element-plus/es/components/aside/style/css",
"element-plus/es/components/main/style/css",
"element-plus/es/components/empty/style/css",
"element-plus/es/components/empty/style/css",
"element-plus/es",
"element-plus/es/components/base/style/css",
"element-plus/es/components/footer/style/css",
"element-plus/es/components/badge/style/css",
"element-plus/es/components/image-viewer/style/css",
"element-plus/es/components/space/style/css",
"element-plus/es/components/descriptions/style/css",
"element-plus/es/components/descriptions-item/style/css",
"element-plus/es/components/time-picker/style/css",
"element-plus/dist/locale/en.min",
"element-plus/dist/locale/zh-cn.min",
"mitt",
"screenfull",
"dayjs",
"driver.js",
"echarts/core",
"echarts/charts",
"echarts/components",
"echarts/features",
"echarts/renderers",
"echarts-liquidfill",
"pinia-plugin-persistedstate",
"qs",
"vuedraggable",
"@univerjs/core",
"@univerjs/data-validation",
"@univerjs/design",
"@univerjs/docs",
"@univerjs/docs-ui",
"@univerjs/docs",
"@univerjs/drawing-ui",
"@univerjs/drawing",
"@univerjs/engine-formula",
"@univerjs/engine-render",
"@univerjs/sheets",
"@univerjs/sheets-formula",
"@univerjs/sheets-ui",
"@univerjs/ui",
"@univerjs/facade",
"@univerjs/sheets-zen-editor",
"@univerjs/sheets-hyper-link",
"@univerjs/sheets-hyper-link-ui",
"@univerjs/drawing",
"@univerjs/drawing-ui",
"@univerjs/sheets-drawing",
"@univerjs/sheets-drawing-ui",
"@univerjs/find-replace",
"@univerjs/sheets-find-replace",
"@univerjs/sheets-filter",
"@univerjs/sheets-filter-ui",
"@univerjs/sheets-sort",
"@univerjs/sheets-sort-ui",
"@univerjs/data-validation",
"@univerjs/sheets-data-validation",
"@univerjs/sheets-conditional-formatting",
"@univerjs/sheets-conditional-formatting-ui",
"@univerjs/sheets-conditional-formatting",
"@univerjs/sheets-data-validation",
"@univerjs/sheets-drawing-ui",
"@univerjs/sheets-drawing",
"@univerjs/sheets-filter-ui",
"@univerjs/sheets-filter",
"@univerjs/sheets-find-replace",
"@univerjs/sheets-formula",
"@univerjs/sheets-hyper-link-ui",
"@univerjs/sheets-hyper-link",
"@univerjs/sheets-numfmt",
"@univerjs/sheets-sort-ui",
"@univerjs/sheets-sort",
"@univerjs/sheets-thread-comment-base",
"@univerjs/sheets-thread-comment",
"@univerjs/sheets-ui",
"@univerjs/sheets-zen-editor",
"@univerjs/sheets",
"@univerjs/thread-comment-ui",
"@univerjs/thread-comment",
"@univerjs/sheets-thread-comment-base",
"@univerjs/sheets-thread-comment"
"@univerjs/ui",
"@vueuse/core",
"@wangeditor/editor-for-vue",
"@wangeditor/editor",
"axios",
"color",
"dayjs",
"driver.js",
"echarts-liquidfill",
"echarts",
"echarts/charts",
"echarts/components",
"echarts/core",
"echarts/features",
"echarts/renderers",
"element-plus",
"element-plus/dist/locale/en.min",
"element-plus/dist/locale/zh-cn.min",
"element-plus/es",
"element-plus/es/components/alert/style/css",
"element-plus/es/components/aside/style/css",
"element-plus/es/components/backtop/style/css",
"element-plus/es/components/badge/style/css",
"element-plus/es/components/base/style/css",
"element-plus/es/components/breadcrumb-item/style/css",
"element-plus/es/components/breadcrumb/style/css",
"element-plus/es/components/button/style/css",
"element-plus/es/components/card/style/css",
"element-plus/es/components/checkbox-group/style/css",
"element-plus/es/components/checkbox/style/css",
"element-plus/es/components/col/style/css",
"element-plus/es/components/color-picker/style/css",
"element-plus/es/components/config-provider/style/css",
"element-plus/es/components/container/style/css",
"element-plus/es/components/date-picker/style/css",
"element-plus/es/components/descriptions-item/style/css",
"element-plus/es/components/descriptions/style/css",
"element-plus/es/components/dialog/style/css",
"element-plus/es/components/divider/style/css",
"element-plus/es/components/drawer/style/css",
"element-plus/es/components/dropdown-item/style/css",
"element-plus/es/components/dropdown-menu/style/css",
"element-plus/es/components/dropdown/style/css",
"element-plus/es/components/empty/style/css",
"element-plus/es/components/empty/style/css",
"element-plus/es/components/footer/style/css",
"element-plus/es/components/form-item/style/css",
"element-plus/es/components/form/style/css",
"element-plus/es/components/header/style/css",
"element-plus/es/components/icon/style/css",
"element-plus/es/components/image-viewer/style/css",
"element-plus/es/components/image/style/css",
"element-plus/es/components/input-number/style/css",
"element-plus/es/components/input/style/css",
"element-plus/es/components/link/style/css",
"element-plus/es/components/loading/style/css",
"element-plus/es/components/main/style/css",
"element-plus/es/components/menu-item/style/css",
"element-plus/es/components/menu/style/css",
"element-plus/es/components/message/style/css",
"element-plus/es/components/message-box/style/css",
"element-plus/es/components/notification/style/css",
"element-plus/es/components/option/style/css",
"element-plus/es/components/pagination/style/css",
"element-plus/es/components/popover/style/css",
"element-plus/es/components/progress/style/css",
"element-plus/es/components/radio-button/style/css",
"element-plus/es/components/radio-group/style/css",
"element-plus/es/components/radio/style/css",
"element-plus/es/components/rate/style/css",
"element-plus/es/components/row/style/css",
"element-plus/es/components/scrollbar/style/css",
"element-plus/es/components/select/style/css",
"element-plus/es/components/space/style/css",
"element-plus/es/components/statistic/style/css",
"element-plus/es/components/sub-menu/style/css",
"element-plus/es/components/switch/style/css",
"element-plus/es/components/tab-pane/style/css",
"element-plus/es/components/table-column/style/css",
"element-plus/es/components/table/style/css",
"element-plus/es/components/tabs/style/css",
"element-plus/es/components/tag/style/css",
"element-plus/es/components/text/style/css",
"element-plus/es/components/time-picker/style/css",
"element-plus/es/components/tooltip/style/css",
"element-plus/es/components/tree-select/style/css",
"element-plus/es/components/tree/style/css",
"element-plus/es/components/upload/style/css",
"element-plus/es/components/watermark/style/css",
"element-plus/es/locale/lang/zh-cn",
"element-plus/es/locale/lang/en",
"exceljs",
"md5",
"mitt",
"path-browserify",
"path-to-regexp",
"pinia-plugin-persistedstate",
"pinia",
"process",
"qs",
"screenfull",
"sortablejs",
"sqlite3",
"unocss",
"vue-i18n",
"vue-router",
"vue",
"vuedraggable",
],
}
};

View File

@ -69,7 +69,7 @@ export default (env = "production", type = "main") => {
}),
alias({
entries: [
{ find: "@main", replacement: path.join(__dirname, "../src/main") },
{find: "@main", replacement: path.join(__dirname, "../src/main")},
{
find: "@config",
replacement: path.join(__dirname, "..", "config"),

View File

@ -1,9 +1,10 @@
import { config } from "dotenv";
import { join } from "path";
import {config} from "dotenv";
import {join} from "path";
import minimist from "minimist";
const argv = minimist(process.argv.slice(2));
const rootResolve = (...pathSegments: string[]) => join(__dirname, "..", ...pathSegments);
const rootResolve = (...pathSegments: string[]) =>
join(__dirname, "..", ...pathSegments);
export const getEnv = () => argv["m"];

View File

@ -42,13 +42,13 @@ const config = getConfig();
const __APP_INFO__ = {
pkg: pkg,
buildTimestamp: Date.now(),
lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
};
const root = resolve("src/renderer");
const src = resolve("src");
// const theme: string = resolve("src/renderer/themes/default");
const theme: string = resolve("src/renderer/themes/geeker");
// const theme: string = resolve("src/renderer/themes/geeker");
const themeGeeker: string = resolve("src/renderer/themes/geeker");
const themeDefault: string = resolve("src/renderer/themes/default");
const mode = config && config.NODE_ENV;
@ -60,7 +60,7 @@ export default defineConfig({
__CONFIG__: config,
__ISWEB__: Number(config && config.target),
__APP_INFO__: JSON.stringify(__APP_INFO__),
'process.env': process.env,
"process.env": process.env,
},
resolve: {
alias: {
@ -72,7 +72,7 @@ export default defineConfig({
"@renderer": root,
"@src": src,
"@store": join(root, "/store/modules"),
"@theme": theme,
// "@theme": theme,
"@themeDefault": themeDefault,
"@themeGeeker": themeGeeker,
},
@ -148,7 +148,12 @@ export default defineConfig({
* TBD resolve("@theme/components")
*/
// dirs: ["src/components", join(theme, "/components"), join(theme, "/**/components")],
dirs: ["src/components", join(themeDefault, "/components"), join(themeDefault, "/**/components"),"src/**/components"],
dirs: [
"src/components",
join(themeDefault, "/components"),
join(themeDefault, "/**/components"),
"src/**/components",
],
// 指定自动导入组件TS类型声明文件路径 (false:关闭自动生成)
// dts: false,
dts: "fixTypes/components.d.ts",
@ -159,11 +164,14 @@ export default defineConfig({
}),
createSvgIconsPlugin({
// 指定需要缓存的图标文件夹
iconDirs: [join(themeDefault, "assets/icons"),join(themeGeeker, "assets/icons"),"@renderer/assets/icons"],
iconDirs: [
join(themeDefault, "assets/icons"),
join(themeGeeker, "assets/icons"),
"@renderer/assets/icons",
],
// 指定symbolId格式
symbolId: "icon-[dir]-[name]",
}),
],
optimizeDeps: preloads,
});

38
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,38 @@
{
"version": "0.2.0",
"compounds": [
{
"name": "Main + renderer",
"configurations": [
"Main",
"Renderer"
],
"stopAll": true
}
],
"configurations": [
{
"name": "Renderer",
"port": 9222,
"request": "attach",
"type": "chrome",
"webRoot": "${workspaceFolder}"
},
{
"name": "Main",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
"windows": {
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
},
"args": [
".",
"--remote-debugging-port=9222"
],
"outputCapture": "std",
"console": "integratedTerminal"
}
]
}

26
.vscode/settings.json vendored
View File

@ -6,25 +6,47 @@
"**/CVS": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
"**/node_modules": true
"**/node_modules": false
},
"npm.packageManager": "yarn",
"workbench.editor.highlightModifiedTabs": true,
"cSpell.words": [
"backtop",
"cfonts",
"clsx",
"csstype",
"datas",
"echarts",
"exceljs",
"geeker",
"Hiluker",
"iconfont",
"iconify",
"Ikaros",
"ISWEB",
"liquidfill",
"listr",
"mydb",
"napi",
"notheme",
"nprogress",
"numfmt",
"persistedstate",
"pinia",
"portfinder",
"regedit",
"rowid",
"screenfull",
"sockjs",
"sortablejs",
"stompjs",
"univer",
"univerjs",
"unocss",
"unplugin",
"vuedraggable",
"vueuse",
"wangeditor"
"wangeditor",
"webstomp"
]
}

View File

@ -1,3 +1,7 @@
# 2024.09.21
- 更新开发包到最新。
# 2024.09.16
- 添加sqlite3使用用法演示放在home/index页面

View File

@ -1,6 +1,10 @@
{
"asar": false,
"extraFiles": [],
"extraFiles": [
"sqlite3.db",
"src/main/db/sqlite.db",
"debug.txt"
],
"publish": [
{
"provider": "generic",

View File

@ -1,7 +1,7 @@
export default {
build: {
cleanConsole: true,
hotPublishConfigName:"updater",
hotPublishConfigName: "updater",
},
dev: {
removeElectronJunk: true,

1
debug.txt Normal file
View File

@ -0,0 +1 @@
添加此文件内容无所谓可以没有文件名为debug就行

View File

@ -1,12 +1,12 @@
/// <reference types="vite/client" />
declare module '*.vue' {
import type { DefineComponent } from 'vue'
import type {DefineComponent} from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}
interface Window {
interface window {
// expose in the `electron/preload/index.ts`
ipcRenderer: import('electron').IpcRenderer
}

17076
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
{
"name": "hi-sass-frame-front",
"title": "Hi-sass系统框架",
"version": "0.0.1",
"version": "0.0.2",
"main": "./dist/electron/main/main.js",
"author": "fm453 <https://gitea.hiluker.com/fm453/hi-sass-frame>",
"homepage": "https://gitea.hiluker.com/fm453/hi-sass-frame",
@ -9,7 +9,7 @@
"description": "基于https://gitee.com/Zh-Sky/electron-vite-template.git项目进行改造升级内置组件electron31+vite5+vue3添加引入elementUi2.7.5。框架思路借鉴有来开源的https://gitee.com/youlaiorg/vue3-element-admin.git项目。",
"license": "MIT",
"scripts": {
"dev": "cross-env tsx .electron-vite/dev-runner.ts -m dev",
"dev": "cross-env tsx .electron-vite/dev-runner.ts -m prod",
"build": "cross-env BUILD_TARGET=clean tsx .electron-vite/build.ts -m prod && electron-builder -c build.json",
"build:win32": "cross-env BUILD_TARGET=clean tsx .electron-vite/build.ts -w prod && electron-builder -c build.json --win --ia32",
"build:win64": "cross-env BUILD_TARGET=clean tsx .electron-vite/build.ts -w prod && electron-builder -c build.json --win --x64",
@ -23,51 +23,51 @@
"postinstall": "electron-builder install-app-deps"
},
"dependencies": {
"@grpc/grpc-js": "^1.11.1",
"@univerjs/core": "^0.2.8",
"@univerjs/data-validation": "^0.2.8",
"@univerjs/design": "^0.2.8",
"@univerjs/docs": "^0.2.8",
"@univerjs/docs-hyper-link": "^0.2.9",
"@univerjs/docs-ui": "^0.2.8",
"@univerjs/drawing": "^0.2.8",
"@univerjs/drawing-ui": "^0.2.8",
"@univerjs/engine-formula": "^0.2.8",
"@univerjs/engine-numfmt": "^0.2.8",
"@univerjs/engine-render": "^0.2.8",
"@univerjs/facade": "^0.2.8",
"@univerjs/find-replace": "^0.2.8",
"@univerjs/network": "^0.2.9",
"@univerjs/rpc": "^0.2.9",
"@univerjs/sheets": "^0.2.8",
"@univerjs/sheets-conditional-formatting": "^0.2.8",
"@univerjs/sheets-conditional-formatting-ui": "^0.2.8",
"@univerjs/sheets-crosshair-highlight": "^0.2.9",
"@univerjs/sheets-data-validation": "^0.2.8",
"@univerjs/sheets-drawing": "^0.2.8",
"@univerjs/sheets-drawing-ui": "^0.2.8",
"@univerjs/sheets-filter": "^0.2.8",
"@univerjs/sheets-filter-ui": "^0.2.8",
"@univerjs/sheets-find-replace": "^0.2.8",
"@univerjs/sheets-formula": "^0.2.8",
"@univerjs/sheets-hyper-link": "^0.2.8",
"@univerjs/sheets-hyper-link-ui": "^0.2.8",
"@univerjs/sheets-numfmt": "^0.2.8",
"@univerjs/sheets-sort": "^0.2.8",
"@univerjs/sheets-sort-ui": "^0.2.8",
"@univerjs/sheets-thread-comment": "^0.2.8",
"@univerjs/sheets-thread-comment-base": "^0.2.8",
"@univerjs/sheets-ui": "^0.2.8",
"@univerjs/sheets-zen-editor": "^0.2.8",
"@univerjs/thread-comment": "^0.2.8",
"@univerjs/thread-comment-ui": "^0.2.8",
"@univerjs/ui": "^0.2.8",
"@grpc/grpc-js": "1.9.14",
"@univerjs/core": "^0.2.15",
"@univerjs/data-validation": "^0.2.15",
"@univerjs/design": "^0.2.15",
"@univerjs/docs": "^0.2.15",
"@univerjs/docs-hyper-link": "^0.2.15",
"@univerjs/docs-ui": "^0.2.15",
"@univerjs/drawing": "^0.2.15",
"@univerjs/drawing-ui": "^0.2.15",
"@univerjs/engine-formula": "^0.2.15",
"@univerjs/engine-numfmt": "^0.2.15",
"@univerjs/engine-render": "^0.2.15",
"@univerjs/facade": "^0.2.15",
"@univerjs/find-replace": "^0.2.15",
"@univerjs/network": "^0.2.15",
"@univerjs/rpc": "^0.2.15",
"@univerjs/sheets": "^0.2.15",
"@univerjs/sheets-conditional-formatting": "^0.2.15",
"@univerjs/sheets-conditional-formatting-ui": "^0.2.15",
"@univerjs/sheets-crosshair-highlight": "^0.2.15",
"@univerjs/sheets-data-validation": "^0.2.15",
"@univerjs/sheets-drawing": "^0.2.15",
"@univerjs/sheets-drawing-ui": "^0.2.15",
"@univerjs/sheets-filter": "^0.2.15",
"@univerjs/sheets-filter-ui": "^0.2.15",
"@univerjs/sheets-find-replace": "^0.2.15",
"@univerjs/sheets-formula": "^0.2.15",
"@univerjs/sheets-hyper-link": "^0.2.15",
"@univerjs/sheets-hyper-link-ui": "^0.2.15",
"@univerjs/sheets-numfmt": "^0.2.15",
"@univerjs/sheets-sort": "^0.2.15",
"@univerjs/sheets-sort-ui": "^0.2.15",
"@univerjs/sheets-thread-comment": "^0.2.15",
"@univerjs/sheets-thread-comment-base": "^0.2.15",
"@univerjs/sheets-ui": "^0.2.15",
"@univerjs/sheets-zen-editor": "^0.2.15",
"@univerjs/telemetry": "^0.2.15",
"@univerjs/thread-comment": "^0.2.15",
"@univerjs/thread-comment-ui": "^0.2.15",
"@univerjs/ui": "^0.2.15",
"@univerjs/vite-plugin": "^0.5.0",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"animate.css": "^4.1.1",
"axios": "^1.7.4",
"clsx": "^2.1.1",
"axios": "^1.7.7",
"color": "^4.2.3",
"csstype": "^3.1.3",
"date-fns": "^3.6.0",
@ -75,43 +75,44 @@
"driver.js": "^1.3.1",
"echarts": "^5.5.1",
"echarts-liquidfill": "^3.1.0",
"electron-log": "^5.1.7",
"electron-updater": "^6.2.1",
"electron-log": "^5.2.0",
"electron-updater": "^6.3.7",
"electron_updater_node_cli": "^0.3.3",
"electron_updater_node_core": "^0.3.3",
"element-plus": "^2.8.0",
"element-plus": "^2.8.3",
"exceljs": "^4.4.0",
"express": "^4.19.2",
"express": "^4.21.0",
"express-ws": "^5.0.2",
"glob": "^11.0.0",
"md5": "^2.3.0",
"nprogress": "^0.2.0",
"path-browserify": "^1.0.1",
"pinia": "^2.2.2",
"pinia-plugin-persistedstate": "^3.2.3",
"regedit": "^5.1.3",
"rxjs": "^7.8.1",
"sass": "1.79.3",
"screenfull": "^6.0.2",
"semver": "^7.6.3",
"sockjs-client": "^1.6.1",
"sortablejs": "^1.15.3",
"sqlite3": "^5.1.7",
"stompjs": "^2.3.3",
"unocss": "^0.62.3",
"unocss": "^0.62.4",
"uuid": "^10.0.0",
"vue": "^3.4.21",
"vue": "^3.5.7",
"vue-i18n": "9.14.0",
"vue-router": "^4.4.3",
"vue-router": "^4.4.5",
"vuedraggable": "^2.24.3",
"webstomp-client": "^1.2.6",
"ws": "^8.18.0"
},
"devDependencies": {
"@iconify-json/ep": "^1.1.16",
"@iconify-json/ep": "^1.2.0",
"@npmcli/move-file": "1.1.2",
"@rollup/plugin-alias": "^5.1.0",
"@rollup/plugin-commonjs": "^26.0.1",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-replace": "^5.0.7",
"@rollup/plugin-typescript": "^11.1.6",
"@types/adm-zip": "^0.5.5",
"@types/color": "^3.0.6",
@ -120,7 +121,7 @@
"@types/fs-extra": "^11.0.4",
"@types/lodash": "^4.17.7",
"@types/minimist": "^1.2.5",
"@types/node": "^22.5.4",
"@types/node": "^22.5.5",
"@types/nprogress": "^0.2.3",
"@types/path-browserify": "^1.0.3",
"@types/semver": "^7.5.8",
@ -128,47 +129,55 @@
"@types/sortablejs": "^1.15.8",
"@types/stompjs": "^2.3.9",
"@types/uuid": "^10.0.0",
"@vitejs/plugin-vue": "^5.1.2",
"@vitejs/plugin-vue": "^5.1.4",
"@vitejs/plugin-vue-jsx": "^4.0.1",
"@vue/compiler-sfc": "^3.4.38",
"adm-zip": "^0.5.15",
"@vue/compiler-sfc": "^3.5.7",
"adm-zip": "^0.5.16",
"are-we-there-yet": "3.0.1",
"bufferutil": "^4.0.8",
"cfonts": "^3.3.0",
"chalk": "5.3.0",
"clsx": "^2.1.1",
"cross-env": "^7.0.3",
"del": "^7.1.0",
"dotenv": "^16.4.5",
"electron": "^32.0.2",
"electron": "^32.1.2",
"electron-builder": "^24.13.3",
"electron-builder-squirrel-windows": "^24.13.3",
"electron-devtools-vendor": "^3.0.0",
"esbuild": "^0.23.1",
"extract-zip": "^2.0.1",
"fs-extra": "^11.2.0",
"inquirer": "^10.1.8",
"inquirer": "^10.2.2",
"javascript-obfuscator": "^4.1.1",
"listr2": "^8.2.4",
"minimist": "^1.2.8",
"path-to-regexp": "^7.1.0",
"npmlog": "6.0.2",
"path-to-regexp": "^8.1.0",
"portfinder": "^1.0.32",
"postcss": "^8.4.41",
"postcss": "^8.4.47",
"postcss-html": "^1.7.0",
"postcss-scss": "^4.0.9",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"rollup": "^4.21.0",
"resolve-url": "0.2.1",
"rollup": "^4.22.4",
"rollup-plugin-esbuild": "^6.1.1",
"rollup-plugin-obfuscator": "^1.1.0",
"sass": "^1.77.8",
"tslib": "^2.6.3",
"tsx": "^4.17.0",
"typescript": "^5.5.4",
"unplugin-auto-import": "^0.17.6",
"rxjs": "^7.8.1",
"sass-embedded": "^1.79.3",
"source-map-resolve": "0.5.3",
"source-map-url": "0.4.1",
"sourcemap-codec": "1.4.8",
"tslib": "^2.7.0",
"tsx": "^4.19.1",
"typescript": "^5.6.2",
"unplugin-auto-import": "^0.17.8",
"unplugin-icons": "^0.18.5",
"unplugin-vue-components": "^0.26.0",
"vite": "^5.4.1",
"vite-plugin-pwa": "^0.20.5",
"vite": "^5.4.7",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-vue-devtools": "^7.3.0"
"vite-plugin-vue-devtools": "^7.4.5"
},
"engines": {
"node": ">=18.0.0"

5707
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

BIN
sqlite3.db Normal file

Binary file not shown.

View File

@ -14,13 +14,13 @@ export const BrowserDemoUrl: string = "https://www.hiluker.cn";
export const StorageKey: string = "Hi_sass_tester_453";
// # 远程服务
const RemotePort = 3000;
const RemoteApi = "/api/v1/";
const RemotePort: number = 3000;
const RemoteApi: string = "/api/v1/";
// # 线上接口地址
const RemoteApiUrl = "http://api.frame.sass.hiluker.cn";
const RemoteApiUrl: string = "http://api.frame.sass.hiluker.cn";
// # 开发接口地址
// const REMOTE_API_URL = "http://127.0.0.1:8989";
const RemoteServer = false;
// const REMOTE_API_URL:string = "http://127.0.0.1:8989";
const RemoteServer: boolean = false;
export default {
GwLink,
@ -29,5 +29,5 @@ export default {
DisableF12,
HilukerLink,
StorageKey,
RemoteApi
}
RemoteApi,
};

View File

@ -139,19 +139,30 @@ export const preloadPath = isDev
* /tray.html
* src/renderer/public/tray.html
*/
export const trayURL = getUrl(
"/tray.html",
`${staticPath.__static}/tray.html`
);
export const trayURL = getUrl("/tray.html", `${staticPath.__static}/tray.html`);
/**
*
*/
export const trayIconPath = isDev
? join(staticPath.__static, "trayIcon", "trayIcon.png")
: join(app.getAppPath(), "dist", "electron", "renderer", "trayIcon", "trayIcon.png");
: join(
app.getAppPath(),
"dist",
"electron",
"renderer",
"trayIcon",
"trayIcon.png"
);
export const trayTransparentIconPath = isDev
? join(staticPath.__static, "trayIcon", "transparent.png")
: join(app.getAppPath(), "dist", "electron", "renderer", "trayIcon", "transparent.png");
: join(
app.getAppPath(),
"dist",
"electron",
"renderer",
"trayIcon",
"transparent.png"
);
export const lib = staticPath.__lib;
export const common = staticPath.__common;

View File

@ -1,30 +1,30 @@
import {SqliteDb} from './sqliteDb';
import {SqliteDb} from "./sqliteDb.js";
const db = new SqliteDb();
export async function run(sql, params) {
try {
return await db.run(sql, params);
} catch (err) {
throw err;
}
export async function run(sql: string, params: string[]) {
const db = new SqliteDb();
// console.log(sql,params);
return await db.run(sql, params).then((res) => {
return res;
});
}
export async function checkTable(tableName: string) {
return await db.table_exists('lorem').then((exists) => {
const db = new SqliteDb();
return await db.table_exists(tableName).then((exists) => {
return exists;
})
});
}
export function close() {
const db = new SqliteDb();
return db.close();
}
export default {
run,
checkTable,
close
}
close,
};
// const db = new SqliteDb;
// db.table_exists('lorem').then((exists) => {
// console.log('数据表lorem检查存在',exists);

Binary file not shown.

View File

@ -1,16 +1,29 @@
//sqlite相关操作
import {app} from "electron";
import path from "path";
import {Database} from "sqlite3";
import path from "path";
import * as fs from "node:fs";
const dataPath = path.join(app.getPath('userData'), 'db');
const dbPath = process.env.NODE_ENV === 'production' ? dataPath : 'src/main/db';
const isPackaged = app.isPackaged;//是否已打包
const basePath = isPackaged ? app.getPath("userData") : __dirname;
const dbPath = path.join(basePath, "datas");
//确保数据目录存在
if (!fs.existsSync(dbPath)) {
fs.mkdirSync(dbPath, {recursive: true});
}
const dbFile = path.join(dbPath, "sqlite.db");
const sourceFile = isPackaged ? path.resolve(app.getAppPath(), '../../src/main/db/sqlite.db') : path.join(__dirname, '../../../src/main/db/sqlite.db');
// console.log(app.getAppPath(),sourceFile)
// 如果数据库文件不存在,则从资源中复制它
if (!fs.existsSync(dbFile)) {
fs.copyFileSync(sourceFile, dbFile);
}
export class SqliteDb {
db;
constructor() {
this.db = new Database(dbPath + "/sqlite.db");
this.db = new Database(dbFile);
}
/**
@ -26,9 +39,12 @@ export class SqliteDb {
}
stmt.finalize();
this.db.each("SELECT rowid AS id, info FROM testSqlite", (err: any, row: any) => {
console.log(row.id + ": " + row.info);
});
this.db.each(
"SELECT rowid AS id, info FROM testSqlite",
(err: any, row: any) => {
if (!err) console.log(row.id + ": " + row.info);
}
);
});
this.db.close();
}
@ -42,15 +58,15 @@ export class SqliteDb {
let mydb = this.db;
return new Promise((resolve, reject) => {
mydb.get(sql, params, (err: any, row: any) => {
console.log('查表执行结果:', err, row)
console.log("查表执行结果:", err, row);
if (err) {
reject(err);
resolve(false);
} else {
resolve(true);
}
})
})
});
});
}
/**
@ -59,7 +75,7 @@ export class SqliteDb {
async run(sql: string, params: string[]) {
let promise = new Promise((resolve, reject) => {
this.db.get(sql, params, (err: any, row: any) => {
console.log('SQL语句执行结果', err, row)
console.log("SQL语句执行结果", err, row);
if (err) reject(err);
resolve(row);
});

View File

@ -30,12 +30,12 @@ export function useBrowserHandle(): Pick<
[IpcChannel.GetLastBrowserDemoTabData]: async (event) => {
// 拖出tab创建的窗口获取当前tab信息
if (lastDragView) {
let positionX = -1
let positionX = -1;
if (dragTabOffsetX) {
const currentWin = BrowserWindow.fromBrowserView(lastDragView)
const bound = currentWin.getBounds()
const {x, y} = screen.getCursorScreenPoint()
positionX = x - bound.x - dragTabOffsetX
const currentWin = BrowserWindow.fromBrowserView(lastDragView);
const bound = currentWin.getBounds();
const {x, y} = screen.getCursorScreenPoint();
positionX = x - bound.x - dragTabOffsetX;
}
return {
positionX,
@ -99,10 +99,8 @@ export function useBrowserHandle(): Pick<
);
currentView.webContents.loadURL(url);
},
[IpcChannel.BrowserTabMousedown]: async (event, {
offsetX
}) => {
dragTabOffsetX = offsetX
[IpcChannel.BrowserTabMousedown]: async (event, {offsetX}) => {
dragTabOffsetX = offsetX;
},
[IpcChannel.BrowserTabMousemove]: async (
event,
@ -148,16 +146,12 @@ export function useBrowserHandle(): Pick<
startScreenY = screenY;
// 设置拖拽的 tab 位置
const bound = movingWin.getBounds()
movingWin.webContents.send(
IpcChannel.BrowserViewTabPositionXUpdate,
{
const bound = movingWin.getBounds();
movingWin.webContents.send(IpcChannel.BrowserViewTabPositionXUpdate, {
dragTabOffsetX,
positionX: screenX - bound.x,
bvWebContentsId: currentView.webContents.id,
}
);
});
} else {
// 内部移动 movingWin = null
for (let i = 0; i < winList.length; i++) {
@ -222,7 +216,7 @@ export function useBrowserHandle(): Pick<
win?.close();
} else {
win?.setAlwaysOnTop(false);
win?.webContents?.send(IpcChannel.BrowserTabMouseup)
win?.webContents?.send(IpcChannel.BrowserTabMouseup);
}
});
useNewWindow = null;

View File

@ -1,10 +1,11 @@
import mydb from '../db';
import mydb from "../db";
import {IpcChannel} from "../ipc";
export function useDbHandle() {
return {
[IpcChannel.SqlRun]: async (event, args) => {
let sql = args.sql, params = args.params || [];
let sql = args.sql,
params = args.params || [];
try {
return await mydb.run(sql, params);
} catch (error) {
@ -12,5 +13,5 @@ export function useDbHandle() {
return false;
}
},
}
};
}

View File

@ -2,7 +2,10 @@ import {IpcChannel, IpcMainHandle} from "../ipc";
import {createLocalFile, loadLocalFile} from "../hook/dataFileHook";
export function useFileHandle(): Pick<IpcMainHandle, IpcChannel.FileRead | IpcChannel.FileWrite> {
export function useFileHandle(): Pick<
IpcMainHandle,
IpcChannel.FileRead | IpcChannel.FileWrite
> {
return {
[IpcChannel.FileRead]: (event, args) => {
// console.log(args);
@ -14,12 +17,14 @@ export function useFileHandle(): Pick<IpcMainHandle, IpcChannel.FileRead | IpcCh
// console.log(args);
let filename = args.filename,
data = args.data;
return createLocalFile(filename, data).then((r) => {
return createLocalFile(filename, data)
.then((r) => {
return r;
}).catch(err => {
})
.catch((err) => {
// console.log(err);
return false;
});
},
}
};
}

View File

@ -1,10 +1,10 @@
import {dialog, BrowserWindow, app} from "electron";
import {app, BrowserWindow, dialog} from "electron";
import {IsUseSysTitle} from "../config/const";
import {winURL, staticPaths} from "../config/staticPath";
import {staticPaths, winURL} from "../config/staticPath";
import DownloadFile from "../services/downloadFile";
import {otherWindowConfig} from "../config/windowsConfig";
import {IpcChannel} from "../ipc";
import {showOnMyComputer, hideOnMyComputer, checkIsShowOnMyComputer} from "../services/regeditUtils"
import {checkIsShowOnMyComputer, hideOnMyComputer, showOnMyComputer,} from "../services/regeditUtils";
import {openDevTools} from "../hook/devToolHook";
export function useMainHandle() {
@ -51,7 +51,7 @@ export function useMainHandle() {
},
[IpcChannel.OpenErrorbox]: (_event, arg) => {
dialog.showErrorBox(arg.title, arg.message)
dialog.showErrorBox(arg.title, arg.message);
},
[IpcChannel.StartDownload]: (event, downloadUrl) => {
@ -67,7 +67,7 @@ export function useMainHandle() {
});
// 开发模式下自动开启devtools
if (process.env.NODE_ENV === "development") {
openDevTools(ChildWin)
openDevTools(ChildWin);
}
ChildWin.loadURL(winURL + `#${arg.url}`);
ChildWin.once("ready-to-show", () => {
@ -91,14 +91,14 @@ export function useMainHandle() {
});
},
[IpcChannel.CheckShowOnMyComputer]: async () => {
return await checkIsShowOnMyComputer()
return await checkIsShowOnMyComputer();
},
[IpcChannel.SetShowOnMyComputer]: async (event, bool) => {
if (bool) {
return await showOnMyComputer()
return await showOnMyComputer();
} else {
return await hideOnMyComputer()
}
}
return await hideOnMyComputer();
}
},
};
}

View File

@ -3,12 +3,20 @@ import {IpcChannel, IpcMainHandle} from "../ipc";
import {openPrintDemoWindow} from "../hook/printHook";
export function usePrintHandle(): Pick<IpcMainHandle, IpcChannel.GetPrinters | IpcChannel.PrintHandlePrint | IpcChannel.OpenPrintDemoWindow> {
export function usePrintHandle(): Pick<
IpcMainHandle,
| IpcChannel.GetPrinters
| IpcChannel.PrintHandlePrint
| IpcChannel.OpenPrintDemoWindow
> {
return {
[IpcChannel.GetPrinters]: async (event) => {
return await event.sender.getPrintersAsync();
},
[IpcChannel.PrintHandlePrint]: async (event, options: WebContentsPrintOptions) => {
[IpcChannel.PrintHandlePrint]: async (
event,
options: WebContentsPrintOptions
) => {
return new Promise((resolve) => {
event.sender.print(
options,
@ -20,6 +28,6 @@ export function usePrintHandle(): Pick<IpcMainHandle, IpcChannel.GetPrinters | I
},
[IpcChannel.OpenPrintDemoWindow]: () => {
openPrintDemoWindow();
}
}
},
};
}

View File

@ -1,9 +1,15 @@
import {dialog} from "electron";
import Server from "../server";
import WsServer from "../server/wsServer";
import {IpcMainHandle, IpcChannel} from "../ipc";
import {IpcChannel, IpcMainHandle} from "../ipc";
export function useServerHandle(): Pick<IpcMainHandle, IpcChannel.StartServer | IpcChannel.StopServer | IpcChannel.StartWsServer | IpcChannel.StopWsServer> {
export function useServerHandle(): Pick<
IpcMainHandle,
| IpcChannel.StartServer
| IpcChannel.StopServer
| IpcChannel.StartWsServer
| IpcChannel.StopWsServer
> {
return {
[IpcChannel.StartServer]: async () => {
try {
@ -11,7 +17,7 @@ export function useServerHandle(): Pick<IpcMainHandle, IpcChannel.StartServer |
return serverStatus;
} catch (error) {
dialog.showErrorBox("错误", error);
return ""
return "";
}
},
[IpcChannel.StopServer]: async () => {
@ -20,7 +26,7 @@ export function useServerHandle(): Pick<IpcMainHandle, IpcChannel.StartServer |
return serverStatus;
} catch (error) {
dialog.showErrorBox("错误", error);
return ""
return "";
}
},
[IpcChannel.StartWsServer]: async () => {
@ -29,7 +35,7 @@ export function useServerHandle(): Pick<IpcMainHandle, IpcChannel.StartServer |
return serverStatus;
} catch (error) {
dialog.showErrorBox("错误", error);
return ""
return "";
}
},
[IpcChannel.StopWsServer]: async () => {
@ -38,8 +44,8 @@ export function useServerHandle(): Pick<IpcMainHandle, IpcChannel.StartServer |
return serverStatus;
} catch (error) {
dialog.showErrorBox("错误", error);
return ""
return "";
}
},
}
};
}

View File

@ -1,13 +1,19 @@
import {BrowserWindow, app} from "electron";
import {app, BrowserWindow} from "electron";
import {updater} from "../services/HotUpdater";
import {updater as updaterTest} from "../services/HotUpdaterTest";
import Update from "../services/checkUpdate";
import {UpdateStatus} from "electron_updater_node_core";
import {IpcMainHandle, IpcChannel} from "../ipc";
import {IpcChannel, IpcMainHandle} from "../ipc";
const ALL_UPDATER = new Update();
export function useUpdateHandle(): Pick<IpcMainHandle, IpcChannel.CheckUpdate | IpcChannel.ConfirmUpdate | IpcChannel.HotUpdate | IpcChannel.HotUpdateTest> {
export function useUpdateHandle(): Pick<
IpcMainHandle,
| IpcChannel.CheckUpdate
| IpcChannel.ConfirmUpdate
| IpcChannel.HotUpdate
| IpcChannel.HotUpdateTest
> {
return {
[IpcChannel.CheckUpdate]: (event) => {
ALL_UPDATER.checkUpdate(BrowserWindow.fromWebContents(event.sender));
@ -16,7 +22,7 @@ export function useUpdateHandle(): Pick<IpcMainHandle, IpcChannel.CheckUpdate |
ALL_UPDATER.quitAndInstall();
},
[IpcChannel.HotUpdate]: (event) => {
updater(BrowserWindow.fromWebContents(event.sender))
updater(BrowserWindow.fromWebContents(event.sender));
},
[IpcChannel.HotUpdateTest]: async (event, arg) => {
console.log("hot-update-test");
@ -35,6 +41,6 @@ export function useUpdateHandle(): Pick<IpcMainHandle, IpcChannel.CheckUpdate |
// 更新出错
console.error("更新出错");
}
}
}
},
};
}

View File

@ -1,6 +1,6 @@
import {BrowserView, BrowserWindow} from "electron";
import {IpcChannel} from "../ipc";
import {IsUseSysTitle, BrowserDemoUrl} from "../config/const";
import {BrowserDemoUrl, IsUseSysTitle} from "../config/const";
import {otherWindowConfig} from "../config/windowsConfig";
import {browserDemoURL} from "../config/staticPath";
import {openDevTools} from "./devToolHook";
@ -21,7 +21,7 @@ export function openBrowserDemoWindow() {
});
// // 开发模式下自动开启devtools
if (process.env.NODE_ENV === "development") {
openDevTools(win)
openDevTools(win);
}
win.loadURL(browserDemoURL);
win.on("ready-to-show", () => {
@ -50,14 +50,14 @@ export function createDefaultBrowserView(
width: true,
height: true,
});
bv.webContents.on('did-finish-load', () => {
console.log(bv.webContents.getURL())
})
bv.webContents.on("did-finish-load", () => {
console.log(bv.webContents.getURL());
});
bv.webContents.loadURL(defaultUrl);
bv.webContents.on("page-title-updated", (event, title) => {
const parentBw = BrowserWindow.fromBrowserView(bv);
if (parentBw) {
freshTabData(parentBw, bv, 1)
freshTabData(parentBw, bv, 1);
}
});
bv.webContents.on("destroyed", () => {
@ -71,7 +71,7 @@ export function createDefaultBrowserView(
createDefaultBrowserView(parentBw, details.url);
return {action: "deny"};
});
freshTabData(win, bv, 1)
freshTabData(win, bv, 1);
viewList.push(bv);
return bv;
}
@ -82,17 +82,21 @@ export function addBrowserView(win: BrowserWindow, view: BrowserView) {
win.show();
win.setAlwaysOnTop(true);
}
freshTabData(win, view, 1)
freshTabData(win, view, 1);
}
export function removeBrowserView(win: BrowserWindow, view: BrowserView) {
if (BrowserWindow.fromBrowserView(view) === win) {
win.removeBrowserView(view);
}
freshTabData(win, view, -1)
freshTabData(win, view, -1);
}
export function freshTabData(win: BrowserWindow, bv: BrowserView, status: -1 | 1) {
export function freshTabData(
win: BrowserWindow,
bv: BrowserView,
status: -1 | 1
) {
win.webContents.send(IpcChannel.BrowserViewTabDataUpdate, {
bvWebContentsId: bv.webContents.id,
title: bv.webContents.getTitle(),
@ -107,4 +111,4 @@ export const useHookBrowser = {
addBrowserView,
removeBrowserView,
freshTabData,
}
};

View File

@ -1,16 +1,17 @@
// 将数据以文件形式保存
import {app} from "electron";
import path from "path";
import * as fs from "node:fs";
//创建目录,测试中的表现:使用递归创建(允许多级目录),否则必须逐级创建
function checkFolder(folderPath) {
export function checkFolder(folderPath) {
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath, {recursive: true});
}
}
// const folderPath = path.join(app.getPath('userData'), '/datas/files');
let folderPath = path.join(__dirname, 'datas/files/');
const basePath = process.env.NODE_ENV === 'production' ? app.getPath('userData') : __dirname;
let folderPath = path.join(basePath, "datas/files/");
export function createLocalFile(fileName: string, data: any) {
checkFolder(folderPath);
@ -18,10 +19,13 @@ export function createLocalFile(fileName: string, data: any) {
const filePath = path.join(folderPath, fileName);
// 使用fs.writeFile (异步)创建文件,如果文件已存在则会被覆盖
return fs.promises.writeFile(filePath, data, {flag: 'w'}).then(() => {
return fs.promises
.writeFile(filePath, data, {flag: "w"})
.then(() => {
console.log(`文件已创建成功:${filePath}`);
return true;
}).catch((err) => {
})
.catch((err) => {
console.log(err);
return false;
});
@ -29,5 +33,5 @@ export function createLocalFile(fileName: string, data: any) {
export function loadLocalFile(fileName: string) {
const filePath = path.join(folderPath, fileName);
return fs.readFileSync(filePath, 'utf8');
return fs.readFileSync(filePath, "utf8");
}

View File

@ -2,8 +2,10 @@ import {BrowserWindow} from "electron";
export function openDevTools(win: BrowserWindow) {
let devtools = new BrowserWindow();
devtools.setMenu(null)
devtools.webContents.on('did-finish-load', () => devtools.setTitle(win.webContents.getTitle()))
devtools.setMenu(null);
devtools.webContents.on("did-finish-load", () =>
devtools.setTitle(win.webContents.getTitle())
);
win.webContents.setDevToolsWebContents(devtools.webContents);
win.webContents.openDevTools({
mode: "detach",

View File

@ -1,17 +1,17 @@
import {globalShortcut} from 'electron'
import {DisableF12} from "../config/const"
import {globalShortcut} from "electron";
import {DisableF12} from "../config/const";
const disableF12 = () => {
if (process.env.NODE_ENV === 'production' || DisableF12) {
if (process.env.NODE_ENV === "production" || DisableF12) {
// 在生产环境下或者设置禁用了F12键的情况下禁止响应F12键
globalShortcut.register('f12', () => {
console.log('OS用户试图启动控制台')
})
globalShortcut.register('CmdOrCtrl+I', () => {
console.log('MAC用户试图启动控制台')
})
globalShortcut.register("f12", () => {
console.log("OS用户试图启动控制台");
});
// globalShortcut.register('CmdOrCtrl+I', () => {
// console.log('MAC用户试图启动控制台')
// })
}
}
};
export default {
disableF12
}
disableF12,
};

View File

@ -1,10 +1,9 @@
import {WebContents, app, dialog} from "electron";
import type {
Details,
RenderProcessGoneDetails,
Event,
BrowserWindow,
} from "electron";
import type {BrowserWindow, Details, Event, RenderProcessGoneDetails,} from "electron";
import {app, crashReporter, dialog, WebContents} from "electron";
import renderLog from "electron-log/renderer";
//TBD: crashReporter是测试的
export interface UseProcessExceptionReturn {
/**
@ -41,6 +40,7 @@ export const useProcessException = (): UseProcessExceptionReturn => {
) => void
) => {
app.on("render-process-gone", (event, webContents, details) => {
renderLog.error("child-process-gone", JSON.stringify(event), JSON.stringify(details));
if (listener) {
listener(event, webContents, details);
return;
@ -69,6 +69,9 @@ export const useProcessException = (): UseProcessExceptionReturn => {
break;
default:
message.title = "提示";
message.buttons = ["确定", "退出"];
message.message = "出现未知问题,反馈给开发者?";
break;
}
dialog
@ -90,6 +93,9 @@ export const useProcessException = (): UseProcessExceptionReturn => {
listener?: (event: Event, details: Details) => void
) => {
app.on("child-process-gone", (event, details) => {
crashReporter.start({submitURL: ''})
renderLog.error("child-process-gone", JSON.stringify(event), JSON.stringify(details));
if (listener) {
listener(event, details);
return;
@ -119,6 +125,9 @@ export const useProcessException = (): UseProcessExceptionReturn => {
break;
default:
message.title = "提示";
message.buttons = ["确定", "退出"];
message.message = "出现未知问题,反馈给开发者?";
break;
}
dialog

View File

@ -1,30 +1,30 @@
import {app, globalShortcut} from "electron";
import {globalShortcut} from "electron";
const hotkeysHook = function (mainWindow) {
mainWindow.on('focus', () => {
mainWindow.on("focus", () => {
// mac下快捷键失效的问题
if (process.platform === 'darwin') {
let contents = mainWindow.webContents
globalShortcut.register('CmdOrCtrl+C', () => {
console.log('注册复制快捷键成功')
contents.copy()
})
globalShortcut.register('CommandOrControl+V', () => {
console.log('注册粘贴快捷键成功')
contents.paste()
})
globalShortcut.register('CommandOrControl+X', () => {
console.log('注册剪切快捷键成功')
contents.cut()
})
globalShortcut.register('CommandOrControl+A', () => {
console.log('注册全选快捷键成功')
contents.selectAll()
})
if (process.platform === "darwin") {
let contents = mainWindow.webContents;
globalShortcut.register("CmdOrCtrl+C", () => {
console.log("注册复制快捷键成功");
contents.copy();
});
globalShortcut.register("CommandOrControl+V", () => {
console.log("注册粘贴快捷键成功");
contents.paste();
});
globalShortcut.register("CommandOrControl+X", () => {
console.log("注册剪切快捷键成功");
contents.cut();
});
globalShortcut.register("CommandOrControl+A", () => {
console.log("注册全选快捷键成功");
contents.selectAll();
});
}
})
mainWindow.on('blur', () => {
globalShortcut.unregisterAll() // 注销键盘事件
})
}
});
mainWindow.on("blur", () => {
globalShortcut.unregisterAll(); // 注销键盘事件
});
};
export default hotkeysHook;

View File

@ -1,7 +1,7 @@
// 这里是定义菜单的地方,详情请查看 https://electronjs.org/zh/docs/api/menu
import {dialog, BrowserWindow} from "electron";
import type {MenuItemConstructorOptions, MenuItem} from "electron"
import packageInfo from '../../../package.json';
import type {MenuItem, MenuItemConstructorOptions} from "electron";
import {BrowserWindow, dialog} from "electron";
import packageInfo from "../../../package.json";
import * as diyConst from "../config/const";
function platform() {
@ -14,26 +14,28 @@ const release = process.getSystemVersion();
const arch = process.arch;
function info() {
dialog.showMessageBox({
title: '关于',
type: 'info',
dialog
.showMessageBox({
title: "关于",
type: "info",
message: `${packageInfo.title}`,
detail: `版本信息:${packageInfo.version}\n引擎版本${process.versions.v8}\n当前系统${type} ${arch} ${release}`,
noLink: true,
buttons: ["官网", '确定']
}).then(r => {
buttons: ["官网", "确定"],
})
.then((r) => {
console.log(r);
if (r.response === 0) {
const win = new BrowserWindow({width: 800, height: 600})
const win = new BrowserWindow({width: 800, height: 600});
// Load a remote URL
win.loadURL(diyConst.GwLink);
// Or load a local HTML file
// win.loadFile('index.html')
}
})
});
}
const menu: Array<(MenuItemConstructorOptions) | (MenuItem)> = [
const menu: Array<MenuItemConstructorOptions | MenuItem> = [
{
label: "设置",
submenu: [
@ -50,43 +52,44 @@ const menu: Array<(MenuItemConstructorOptions) | (MenuItem)> = [
],
},
{
label: '编辑',
submenu: [{
label: '撤销',
accelerator: 'CmdOrCtrl+Z',
role: 'undo'
label: "编辑",
submenu: [
{
label: "撤销",
accelerator: "CmdOrCtrl+Z",
role: "undo",
},
{
label: '重做',
accelerator: 'Shift+CmdOrCtrl+Z',
role: 'redo'
label: "重做",
accelerator: "Shift+CmdOrCtrl+Z",
role: "redo",
},
{
label: '剪切',
accelerator: 'CmdOrCtrl+X',
role: 'cut'
label: "剪切",
accelerator: "CmdOrCtrl+X",
role: "cut",
},
{
label: '复制',
accelerator: 'CmdOrCtrl+C',
role: 'copy'
label: "复制",
accelerator: "CmdOrCtrl+C",
role: "copy",
},
{
label: '粘贴',
accelerator: 'CmdOrCtrl+V',
role: 'paste'
}
]
label: "粘贴",
accelerator: "CmdOrCtrl+V",
role: "paste",
},
],
},
{
label: "帮助",
submenu: [
{
label: "关于",
click: info
click: info,
},
],
},
];
export default menu
export default menu;

View File

@ -17,7 +17,7 @@ export function openPrintDemoWindow() {
});
// 开发模式下自动开启devtools
if (process.env.NODE_ENV === "development") {
openDevTools(win)
openDevTools(win);
}
win.loadURL(printURL);
win.on("ready-to-show", () => {

View File

@ -1,7 +1,7 @@
//定义系统托盘
import {dialog, BrowserWindow, Menu} from "electron";
import type {MenuItemConstructorOptions, MenuItem} from "electron"
import packageInfo from '../../../package.json';
import type {MenuItem, MenuItemConstructorOptions} from "electron";
import {BrowserWindow, dialog, Menu} from "electron";
import packageInfo from "../../../package.json";
import * as diyConst from "../config/const";
import {trayURL} from "../config/staticPath";
@ -15,29 +15,31 @@ const release = process.getSystemVersion();
const arch = process.arch;
function info() {
dialog.showMessageBox({
title: '关于',
type: 'info',
dialog
.showMessageBox({
title: "关于",
type: "info",
message: `${packageInfo.title}`,
detail: `版本信息:${packageInfo.version}\n引擎版本${process.versions.v8}\n当前系统${type} ${arch} ${release}`,
noLink: true,
buttons: ["官网", '确定']
}).then(r => {
buttons: ["官网", "确定"],
})
.then((r) => {
console.log(r);
if (r.response === 0) {
const win = new BrowserWindow({width: 800, height: 600})
const win = new BrowserWindow({width: 800, height: 600});
// Load a remote URL
win.loadURL(diyConst.GwLink);
// Or load a local HTML file
// win.loadFile('index.html')
}
})
});
}
export function sleep(ms: number) {
return new Promise(resolve => {
setTimeout(resolve, ms)
})
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
export function createTrayWindow() {
@ -51,34 +53,34 @@ export function createTrayWindow() {
frame: false,
hiddenInMissionControl: true,
skipTaskbar: true,
visualEffectState: 'active',
vibrancy: 'menu'
})
win.loadURL(trayURL)
visualEffectState: "active",
vibrancy: "menu",
});
win.loadURL(trayURL);
win.on('blur', async () => {
let opacity = 1
win.on("blur", async () => {
let opacity = 1;
while (opacity > 0) {
await sleep(10)
opacity -= 0.1
win.setOpacity(opacity)
await sleep(10);
opacity -= 0.1;
win.setOpacity(opacity);
}
win.hide()
})
win.hide();
});
win.on('show', async () => {
let opacity = 0
win.on("show", async () => {
let opacity = 0;
while (opacity < 1) {
await sleep(10)
opacity += 0.2
win.setOpacity(opacity)
await sleep(10);
opacity += 0.2;
win.setOpacity(opacity);
}
win.focus()
})
return win
win.focus();
});
return win;
}
const menu: Array<(MenuItemConstructorOptions) | (MenuItem)> = [
const menu: Array<MenuItemConstructorOptions | MenuItem> = [
{
label: "快速重启",
accelerator: "F5",
@ -86,43 +88,44 @@ const menu: Array<(MenuItemConstructorOptions) | (MenuItem)> = [
},
{
label: '编辑',
submenu: [{
label: '撤销',
accelerator: 'CmdOrCtrl+Z',
role: 'undo'
label: "编辑",
submenu: [
{
label: "撤销",
accelerator: "CmdOrCtrl+Z",
role: "undo",
},
{
label: '重做',
accelerator: 'Shift+CmdOrCtrl+Z',
role: 'redo'
label: "重做",
accelerator: "Shift+CmdOrCtrl+Z",
role: "redo",
},
{
label: '剪切',
accelerator: 'CmdOrCtrl+X',
role: 'cut'
label: "剪切",
accelerator: "CmdOrCtrl+X",
role: "cut",
},
{
label: '复制',
accelerator: 'CmdOrCtrl+C',
role: 'copy'
label: "复制",
accelerator: "CmdOrCtrl+C",
role: "copy",
},
{
label: '粘贴',
accelerator: 'CmdOrCtrl+V',
role: 'paste'
}
]
label: "粘贴",
accelerator: "CmdOrCtrl+V",
role: "paste",
},
],
},
{
label: "关于我们",
click: info
click: info,
},
{
label: "退出",
accelerator: "CmdOrCtrl+F4",
role: "close",
}
},
];
export default Menu.buildFromTemplate(menu)
export default Menu.buildFromTemplate(menu);

View File

@ -1,33 +1,42 @@
'use strict'
"use strict";
import {app, session} from 'electron'
import InitWindow from './services/windowManager'
import disableButton from './hook/disableButtonHook'
import {initTray} from './services/trayManager'
import {app, crashReporter, session} from "electron";
import InitWindow from "./services/windowManager";
import disableButton from "./hook/disableButtonHook";
import {initTray} from "./services/trayManager";
import domains from "./config/domains";
import server from "./server";
import mainLog from "electron-log/main";
// 初始化日志系统
mainLog.initialize();
// 记录信息
if (!app.isPackaged) mainLog.info('应用启动');
//捕获崩溃报告
crashReporter.start({uploadToServer: false, ignoreSystemCrashHandler: false});
function onAppReady() {
new InitWindow().initWindow()
initTray()
disableButton.disableF12()
if (process.env.NODE_ENV === 'development') {
new InitWindow().initWindow();
initTray();
disableButton.disableF12();
if (process.env.NODE_ENV === "development") {
const {VUEJS_DEVTOOLS} = require("electron-devtools-vendor");
session.defaultSession.loadExtension(VUEJS_DEVTOOLS, {
session.defaultSession
.loadExtension(VUEJS_DEVTOOLS, {
allowFileAccess: true,
}).then(r => {
console.log('已安装: vue-devtools');
})
.then((r) => {
console.log("已安装: vue-devtools");
});
//添加启动内置服务器
server.StartServer().then((r) => {
console.log('内置服务器已启动');
})
console.log("内置服务器已启动");
});
}
}
app.whenReady().then(onAppReady)
app.whenReady().then(onAppReady);
//禁止程序多开;需要单例锁的时候用
// const gotTheLock = app.requestSingleInstanceLock()
@ -36,44 +45,64 @@ app.whenReady().then(onAppReady)
// app.quit()
// }
//命令行开关
// 由于9.x版本问题需要加入该配置关闭跨域问题
app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors')
// app.commandLine.appendSwitch("disable-features", "OutOfBlinkCors");
//远程调试端口 TBD
// app.commandLine.appendSwitch("remote-debugging-port", '8888');
//输出日志 TBD
// app.commandLine.appendSwitch("enable-logging","file");
app.on('window-all-closed', () => {
app.on("window-all-closed", () => {
// 所有平台均为所有窗口关闭就退出软件
app.quit()
})
app.on('browser-window-created', () => {
console.log('window-created')
})
app.quit();
});
app.on("browser-window-created", () => {
console.log("window-created");
});
/**
*
* WebView前先检查内容来源
*/
app.on('web-contents-created', (event, contents) => {
contents.on('will-attach-webview', (event, webPreferences, params) => {
app.on("web-contents-created", (event, contents) => {
contents.on("will-attach-webview", (event, webPreferences, params) => {
let isSafe = 0;
domains.some((d) => {
// 验证正在加载的 URL
if (!params.src.startsWith(d)) {
isSafe -= 1;
}
})
});
if (isSafe < 0) {
mainLog.log("main/index.ts提示 非安全访问")
// 禁用 Node.js 集成
// webPreferences.nodeIntegration = false;
// event.preventDefault()
// 如果未使用,则删除预加载脚本或验证其位置是否合法
// delete webPreferences.preload
}
})
})
});
});
if (process.defaultApp) {
if (process.argv.length >= 2) {
app.removeAsDefaultProtocolClient('Hi-sass-frame')
console.log('由于框架特殊性,开发环境下无法使用')
app.removeAsDefaultProtocolClient("Hi-sass-frame");
console.log("由于框架特殊性,开发环境下无法使用");
}
} else {
app.setAsDefaultProtocolClient('Hi-sass-frame')
app.setAsDefaultProtocolClient("Hi-sass-frame");
}
//监听记录主程序错误
process.on('uncaughtException', (error) => {
mainLog.error(error);
// 发送崩溃报告或者保存日志
});
app.on('render-process-gone', (event, webContents, details) => {
mainLog.warn("app:render-process-gone,", JSON.stringify(event), JSON.stringify(webContents), JSON.stringify(details));
});
app.on('child-process-gone', (event, details) => {
mainLog.warn('app:child-process-gone', JSON.stringify(event), JSON.stringify(details));
});

View File

@ -1,10 +1,13 @@
/* eslint-disable prefer-promise-reject-errors */
import appExp from "./server";
import { BuiltInServerPort } from "../config/const";
import { createServer, Server } from "http";
import {BuiltInServerPort} from "../config/const";
import {createServer, Server} from "http";
const port = BuiltInServerPort;
class SingleServer {
server: Server;
constructor(app: any) {
app.set("port", port);
this.server = createServer(app);
@ -14,7 +17,7 @@ class SingleServer {
socket.setTimeout(1000);
});
}
server: Server;
startServer() {
return new Promise((resolve: (value: string) => void, reject) => {
try {
@ -37,6 +40,7 @@ class SingleServer {
}
});
}
stopServer() {
return new Promise((resolve: (value: string) => void, reject) => {
this.server.close((err) => {

View File

@ -1,8 +1,11 @@
import express from 'express'
const app = express()
const router = express.Router();
import express from "express";
import config from "../config/const";
// 引入mock
import mocks from "../../renderer/mock/index";
import {lowerCase} from "lodash";
const app = express();
const router = express.Router();
const BaseApi = process.env.REMOTE_API ?? config.RemoteApi;
@ -17,13 +20,12 @@ const cors = (req, res, next) => {
res.header("Access-Control-Allow-Credentials", true);
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("Content-Type", "application/json;charset=utf-8")
res.header("Content-Type", "application/json;charset=utf-8");
if (req.method.toLowerCase() === 'options')
if (req.method.toLowerCase() === "options")
res.sendStatus(200); //让options尝试请求快速结束
else
next();
}
else next();
};
//添加空路由占位符,后期动态添加路由用
// const arr = ["GET","POST","DELETE","PUT","HEAD","OPTIONS"];
@ -35,23 +37,19 @@ const cors = (req, res, next) => {
// });
//示范
app.get('/message', (req, res) => {
res.send('这是来自node服务端的信息')
})
app.get("/message", (req, res) => {
res.send("这是来自node服务端的信息");
});
app.post('/message', (req, res) => {
app.post("/message", (req, res) => {
if (req) {
res.send(req + '--来自node')
res.send(req + "--来自node");
}
})
// 引入mock
import mocks from "../../renderer/mock/index";
import {lowerCase} from "lodash";
});
for (let i in mocks) {
let mocker = mocks[i];
mocker.forEach(mock => {
mocker.forEach((mock) => {
// console.log(BaseApi+mock.url);
let api = BaseApi + mock.url;
let callback = function (req, res) {
@ -63,19 +61,19 @@ for (let i in mocks) {
// console.log(data)
res.send(data);
} else {
let data = mock.body
let data = mock.body;
res.send(data);
}
}
};
/**
* ["GET","POST","DELETE","PUT","HEAD","OPTIONS",];
*/
let methods = mock.method;
methods.some((method) => {
let m = lowerCase(method);
router[m](api, callback)
router[m](api, callback);
});
});
}
app.use("/", cors, router);
export default app
export default app;

View File

@ -1,9 +1,9 @@
import express from 'express';
import express from "express";
import expressWs from "express-ws";
const router = express.Router();
const app = express();
expressWs(app);//混入功能使router支持ws方法
expressWs(app); //混入功能使router支持ws方法
const wsClients = [];
/**
@ -17,20 +17,19 @@ const cors = (req, res, next) => {
res.header("Access-Control-Allow-Credentials", true);
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("Content-Type", "application/json;charset=utf-8")
res.header("Content-Type", "application/json;charset=utf-8");
if (req.method.toLowerCase() === 'options')
if (req.method.toLowerCase() === "options")
res.sendStatus(200); //让options尝试请求快速结束
else
next();
}
else next();
};
/**
* client的command请求
* @param cmd
*/
function get(cmd) {
console.log(cmd)
console.log(cmd);
}
/**
@ -39,7 +38,7 @@ function get(cmd) {
* @param cb
*/
function send(msg: string, cb) {
cb.send(msg)
cb.send(msg);
}
/**
@ -50,11 +49,11 @@ function callback(ws, req, next) {
console.log("client connect to server successful!", req, next);
// 保存客户端标识
wsClients.push(ws);
ws.on('connect', () => {
ws.send('hello, I am wss');
ws.on("connect", () => {
ws.send("hello, I am wss");
});
// 创建message监听
ws.on('message', (msg) => {
ws.on("message", (msg) => {
// 直接将消息打印出来
console.log("receive client msg :", msg);
//处理接收的消息
@ -66,7 +65,7 @@ function callback(ws, req, next) {
console.log("client is closed", msg);
for (var index = 0; index < wsClients.length; index++) {
if (wsClients[index] === this) {
wsClients.splice(index, 1)
wsClients.splice(index, 1);
}
}
});
@ -78,7 +77,7 @@ function callback(ws, req, next) {
/**
*
*/
router.ws('/*', callback);
router.ws("/*", callback);
app.use('/ws', cors, router);
app.use("/ws", cors, router);
export default app;

View File

@ -6,19 +6,24 @@ import expressWs from "express-ws";
/**
* http服务器
*/
import { createServer, Server } from "http";
import {createServer, Server} from "http";
import app from "./wsRouters";
/**
* WS服务
*/
const port = 8888;
class WsServer {
server: Server;
constructor(app: any) {
app.set("port", port);
this.server = createServer(app);
expressWs(app, this.server, { wsOptions: { maxPayload: 5 * 1024 * 1024 * 1024, } })
expressWs(app, this.server, {
wsOptions: {maxPayload: 5 * 1024 * 1024 * 1024},
});
}
server: Server;
startServer() {
return new Promise((resolve: (value: string) => void, reject) => {
try {
@ -41,6 +46,7 @@ class WsServer {
}
});
}
stopServer() {
return new Promise((resolve: (value: string) => void, reject) => {
this.server.close((err) => {
@ -60,7 +66,6 @@ class WsServer {
}
}
import app from "./wsRouters";
const myServer = new WsServer(app);
export default {
StartServer() {

View File

@ -1,14 +1,14 @@
import {app, BrowserWindow} from "electron";
import {UpdateInfo, UpdateJson, UpdateStatus, UpdateElectron} from "electron_updater_node_core"
import {dirname, join} from "path";
import {UpdateElectron, UpdateInfo, UpdateJson, UpdateStatus} from "electron_updater_node_core"
import {join} from "path";
import {version} from '../../../package.json'
import {Readable} from "stream";
import axios from 'axios'
const request = axios.create()
import updateConfig from "../../../updateConfig.json";
import {IpcChannel, winContentSend} from "../ipc";
const request = axios.create()
/**
*
*

View File

@ -1,82 +1,82 @@
import {ProgressInfo, autoUpdater} from 'electron-updater'
import {BrowserWindow} from 'electron'
import {autoUpdater, ProgressInfo} from "electron-updater";
import {BrowserWindow} from "electron";
import {IpcChannel, winContentSend} from "../ipc";
/**
* -1 0 1 2 3 4
**/
class Update {
public mainWindow: BrowserWindow
public mainWindow: BrowserWindow;
constructor() {
// 设置url
autoUpdater.setFeedURL('http://127.0.0.1:25565/')
autoUpdater.setFeedURL("http://127.0.0.1:25565/");
// 当更新发生错误的时候触发。
autoUpdater.on('error', (err) => {
console.log('更新出现错误', err.message)
if (err.message.includes('sha512 checksum mismatch')) {
this.Message(this.mainWindow, -1, 'sha512校验失败')
autoUpdater.on("error", (err) => {
console.log("更新出现错误", err.message);
if (err.message.includes("sha512 checksum mismatch")) {
this.Message(this.mainWindow, -1, "sha512校验失败");
} else {
this.Message(this.mainWindow, -1, '错误信息请看主进程控制台')
this.Message(this.mainWindow, -1, "错误信息请看主进程控制台");
}
})
});
// 当开始检查更新的时候触发
autoUpdater.on('checking-for-update', () => {
console.log('开始检查更新')
this.Message(this.mainWindow, 0)
})
autoUpdater.on("checking-for-update", () => {
console.log("开始检查更新");
this.Message(this.mainWindow, 0);
});
// 发现可更新数据时
autoUpdater.on('update-available', () => {
console.log('有更新')
this.Message(this.mainWindow, 1)
})
autoUpdater.on("update-available", () => {
console.log("有更新");
this.Message(this.mainWindow, 1);
});
// 没有可更新数据时
autoUpdater.on('update-not-available', () => {
console.log('没有更新')
this.Message(this.mainWindow, 2)
})
autoUpdater.on("update-not-available", () => {
console.log("没有更新");
this.Message(this.mainWindow, 2);
});
// 下载监听
autoUpdater.on('download-progress', (progressObj) => {
this.Message(this.mainWindow, 3, progressObj)
})
autoUpdater.on("download-progress", (progressObj) => {
this.Message(this.mainWindow, 3, progressObj);
});
// 下载完成
autoUpdater.on('update-downloaded', () => {
console.log('下载完成')
this.Message(this.mainWindow, 4)
})
autoUpdater.on("update-downloaded", () => {
console.log("下载完成");
this.Message(this.mainWindow, 4);
});
}
// 负责向渲染进程发送信息
Message(mainWindow: BrowserWindow, type: number, data: string | ProgressInfo = "") {
Message(
mainWindow: BrowserWindow,
type: number,
data: string | ProgressInfo = ""
) {
const senddata = {
state: type,
msg: data
}
winContentSend(mainWindow.webContents, IpcChannel.UpdateMsg, senddata)
msg: data,
};
winContentSend(mainWindow.webContents, IpcChannel.UpdateMsg, senddata);
}
// 执行自动更新检查
checkUpdate(mainWindow: BrowserWindow) {
this.mainWindow = mainWindow
autoUpdater.checkForUpdates().catch(err => {
console.log('网络连接问题', err)
})
this.mainWindow = mainWindow;
autoUpdater.checkForUpdates().catch((err) => {
console.log("网络连接问题", err);
});
}
// 退出并安装
quitAndInstall() {
autoUpdater.quitAndInstall()
autoUpdater.quitAndInstall();
}
}
export default Update
export default Update;

View File

@ -17,10 +17,10 @@ const ipcMainHandle: IpcMainHandle = {
...usePrintHandle(),
...useServerHandle(),
...useUpdateHandle(),
}
};
export function installIpcMain() {
Object.entries(ipcMainHandle).forEach(([ipcChannelName, ipcListener]) => {
ipcMain.handle(ipcChannelName, ipcListener)
})
ipcMain.handle(ipcChannelName, ipcListener);
});
}

View File

@ -1,13 +1,22 @@
import {installIpcMain} from "./ipcMain";
import {IsUseSysTitle, openDevTools, UseStartupChart} from "../config/const";
import menuconfig from "../hook/menuHook";
import {app, BrowserWindow, Menu, dialog} from "electron";
import {winURL, loadingURL} from "../config/staticPath";
import {app, BrowserWindow, Menu} from "electron";
import {loadingURL, winURL} from "../config/staticPath";
import {mainWindowConfig} from "../config/windowsConfig";
import hotkeysHook from "../hook/hotkeysHook";
import {useProcessException} from "../hook/exceptionHook";
import {openDevTools as openDevToolsFunc} from "../hook/devToolHook";
import path from "path";
import * as fs from "node:fs";
const sourceFile = app.isPackaged ? path.resolve(app.getAppPath(), '../../debug.txt') : path.join(__dirname, '../../../debug.txt');
let isDebug = false;
if (fs.existsSync(sourceFile)) {
isDebug = true;
}
class MainInit {
public winURL: string = "";
public shartURL: string = "";
@ -18,7 +27,7 @@ class MainInit {
this.winURL = winURL;
this.shartURL = loadingURL;
// 开发环境或者设置了打开开发者模式时
if (process.env.NODE_ENV === "development" || openDevTools) {
if (process.env.NODE_ENV === "development" || openDevTools || isDebug) {
menuconfig.push({
label: "开发者设置",
submenu: [
@ -34,7 +43,6 @@ class MainInit {
installIpcMain();
}
// 主窗口函数
createMainWindow() {
this.mainWindow = new BrowserWindow({
titleBarStyle: IsUseSysTitle ? "default" : "hidden",
@ -52,7 +60,7 @@ class MainInit {
this.mainWindow.once("ready-to-show", () => {
this.mainWindow.show();
// 开发模式下自动开启devtools
if (process.env.NODE_ENV === "development") {
if (process.env.NODE_ENV === "development" || isDebug) {
openDevToolsFunc(this.mainWindow);
}
if (UseStartupChart) this.loadWindow.destroy();

View File

@ -9,7 +9,9 @@ contextBridge.exposeInMainWorld("ipcRenderer", {
once: (channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void) =>
ipcRenderer.once(channel, listener),
invoke: (channel: string, args: any) => ipcRenderer.invoke(channel, args),
removeAllListeners: (channel: string) => ipcRenderer.removeAllListeners(channel)
removeAllListeners: (channel: string) => ipcRenderer.removeAllListeners(channel),
removeListener: (channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void) =>
ipcRenderer.removeListener(channel, listener)
});
function platform() {
@ -24,6 +26,7 @@ contextBridge.exposeInMainWorld("systemInfo", {
platform: platform(),
release: release,
arch: arch,
vue: () => pkg.dependencies.vue,
node: () => process.versions.node,
chrome: () => process.versions.chrome,
electron: () => process.versions.electron

View File

@ -6,11 +6,9 @@
</template>
<script setup lang="ts">
import { computed } from "vue";
import { i18n } from "./i18n";
import TitleBar from "./components/common/TitleBar.vue";
const i18nt = computed(() => i18n.global.messages.value[i18n.global.locale.value].$el);
</script>
<style></style>
<style>
</style>

View File

@ -1,4 +1,5 @@
import request from "@/utils/request";
import {MenuTypeEnum} from "@themeDefault/enums/MenuTypeEnum";
// 菜单基础URL
const MENU_BASE_URL = "/api/v1/menus";
@ -101,8 +102,6 @@ class MenuAPI {
export default MenuAPI;
import { MenuTypeEnum } from "@theme/enums/MenuTypeEnum";
/** 菜单查询参数 */
export interface MenuQuery {
/** 搜索关键字 */

View File

@ -26,17 +26,19 @@ let tips = ref(
{name: t("about.language"), value: t("about.languageValue")},
{name: t("about.currentPagePath"), value: path},
{name: t("about.currentPageName"), value: name},
{name: t("about.appVersion"), value: pkgInfo.version},
{
name: t("about.vueVersion"),
value:
process.env.NODE_ENV === "development"
? pkg.version
? systemInfo.vue()
: "不可见",
},
{
name: t("about.electronVersion"),
value: systemInfo.electron() || "未获取",
},
{name: t("about.chromeV8Version"), value: systemInfo.chrome() || "未获取"},
{
name: t("about.nodeVersion"),
value: systemInfo.node() || "未获取",

View File

@ -24,11 +24,11 @@
</template>
<script lang="ts" setup>
import {onUnmounted, ref, watch, Ref} from "vue";
import {IpcChannel, invoke, vueListen} from "@/utils/ipcRenderer";
import {ref, Ref, watch} from "vue";
import {invoke, IpcChannel, vueListen} from "@/utils/ipcRenderer";
// const process = window.process;
const platform = process.platform;
const process = window.process;
const platform = window.systemInfo.platform;
const shell = window.shell;
const props = defineProps({
modelValue: Boolean,

View File

@ -1,5 +1,6 @@
import type { App } from 'vue'
import { nextTick } from "vue"
import type {App} from 'vue';
import {nextTick} from "vue";
export const errorHandler = (App: App<Element>) => {
App.config.errorHandler = (err, vm, info) => {
nextTick(() => {
@ -16,5 +17,4 @@ export const errorHandler = (App: App<Element>) => {
}
}).then(r =>{})
}
}

View File

@ -76,6 +76,7 @@ declare global {
const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
const provide: typeof import('vue')['provide']
const reactify: typeof import('@vueuse/core')['reactify']
@ -183,6 +184,7 @@ declare global {
const useGamepad: typeof import('@vueuse/core')['useGamepad']
const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
const useI18n: typeof import('vue-i18n')['useI18n']
const useId: typeof import('vue')['useId']
const useIdle: typeof import('@vueuse/core')['useIdle']
const useImage: typeof import('@vueuse/core')['useImage']
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
@ -199,6 +201,7 @@ declare global {
const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
const useMemoize: typeof import('@vueuse/core')['useMemoize']
const useMemory: typeof import('@vueuse/core')['useMemory']
const useModel: typeof import('vue')['useModel']
const useMounted: typeof import('@vueuse/core')['useMounted']
const useMouse: typeof import('@vueuse/core')['useMouse']
const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
@ -244,6 +247,7 @@ declare global {
const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
const useSupported: typeof import('@vueuse/core')['useSupported']
const useSwipe: typeof import('@vueuse/core')['useSwipe']
const useTemplateRef: typeof import('vue')['useTemplateRef']
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
@ -297,7 +301,8 @@ declare global {
import('vue')
}
// for vue template auto import
import { UnwrapRef } from 'vue'
import {UnwrapRef} from 'vue'
declare module 'vue' {
interface GlobalComponents {}
interface ComponentCustomProperties {
@ -367,6 +372,7 @@ declare module 'vue' {
readonly onStartTyping: UnwrapRef<typeof import('@vueuse/core')['onStartTyping']>
readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
readonly onWatcherCleanup: UnwrapRef<typeof import('vue')['onWatcherCleanup']>
readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']>
readonly provide: UnwrapRef<typeof import('vue')['provide']>
readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']>
@ -474,6 +480,7 @@ declare module 'vue' {
readonly useGamepad: UnwrapRef<typeof import('@vueuse/core')['useGamepad']>
readonly useGeolocation: UnwrapRef<typeof import('@vueuse/core')['useGeolocation']>
readonly useI18n: UnwrapRef<typeof import('vue-i18n')['useI18n']>
readonly useId: UnwrapRef<typeof import('vue')['useId']>
readonly useIdle: UnwrapRef<typeof import('@vueuse/core')['useIdle']>
readonly useImage: UnwrapRef<typeof import('@vueuse/core')['useImage']>
readonly useInfiniteScroll: UnwrapRef<typeof import('@vueuse/core')['useInfiniteScroll']>
@ -490,6 +497,7 @@ declare module 'vue' {
readonly useMediaQuery: UnwrapRef<typeof import('@vueuse/core')['useMediaQuery']>
readonly useMemoize: UnwrapRef<typeof import('@vueuse/core')['useMemoize']>
readonly useMemory: UnwrapRef<typeof import('@vueuse/core')['useMemory']>
readonly useModel: UnwrapRef<typeof import('vue')['useModel']>
readonly useMounted: UnwrapRef<typeof import('@vueuse/core')['useMounted']>
readonly useMouse: UnwrapRef<typeof import('@vueuse/core')['useMouse']>
readonly useMouseInElement: UnwrapRef<typeof import('@vueuse/core')['useMouseInElement']>
@ -535,6 +543,7 @@ declare module 'vue' {
readonly useStyleTag: UnwrapRef<typeof import('@vueuse/core')['useStyleTag']>
readonly useSupported: UnwrapRef<typeof import('@vueuse/core')['useSupported']>
readonly useSwipe: UnwrapRef<typeof import('@vueuse/core')['useSwipe']>
readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
readonly useTemplateRefsList: UnwrapRef<typeof import('@vueuse/core')['useTemplateRefsList']>
readonly useTextDirection: UnwrapRef<typeof import('@vueuse/core')['useTextDirection']>
readonly useTextSelection: UnwrapRef<typeof import('@vueuse/core')['useTextSelection']>

View File

@ -17,8 +17,10 @@ export const lang = {
languageValue: "中文简体",
currentPagePath: "当前页面路径:",
currentPageName: "当前页面名称:",
appVersion: "软件版本:",
vueVersion: "Vue版本",
electronVersion: "Electron版本",
chromeV8Version: "V8版本",
nodeVersion: "Node版本",
systemPlatform: "系统平台:",
systemVersion: "系统版本:",

View File

@ -3,7 +3,6 @@
<head>
<meta charset="UTF-8"/>
<link href="/favicon.ico" rel="icon"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Hi-Sass-Frame</title>
</head>
@ -11,7 +10,7 @@
<body>
<div id="app"></div>
<script>
localStorage.setItem("_LOCAL_THEME_", 'notheme')
localStorage.setItem("_LOCAL_THEME_", 'default')
const _LOCAL_THEME_ = localStorage.getItem("_LOCAL_THEME_"); //notheme,default,……
let jsFile;
switch (_LOCAL_THEME_) {
@ -31,7 +30,7 @@
}
function importModule() {
var script = document.createElement('script');
let script = document.createElement('script');
script.type = 'module';
script.src = jsFile; // 模块文件路径
document.body.appendChild(script);

View File

@ -9,8 +9,8 @@ import {useStoreUser} from "@store/user"
* whiteList needLogin
* 便
*/
// const whiteList = ["/", '/login', '/landing', '/dashboard'] // 不重定向白名单
const whiteList = ["/", '/login'] // 不重定向白名单
const whiteList = ["/", '/login', '/landing', '/dashboard'] // 不重定向白名单
// const whiteList = ["/", '/login'] // 不重定向白名单
// const needLogin = ['/LandingPage']; //需要登陆的页面,未写相关功能,暂不应用
const useInterceptor = function () {

View File

@ -1,6 +1,7 @@
import {createApp} from "vue";
import App from "./App.vue";
import "@themeGeeker/styles/var.scss";
// reset style sheet
import "@themeGeeker/styles/reset.scss";
// CSS common style sheet

View File

@ -15,4 +15,6 @@ import {i18n} from "@/i18n";
const i18nt = computed(() => i18n.global.messages.value[i18n.global.locale.value].$el);
</script>
<style></style>
<style>
</style>

View File

@ -27,8 +27,8 @@ const paths = {
}
},
"/dashboard": {
path: "/dashboard",
"/": {
path: "/",
component: () => import("@/themes/_single/views/LandingPage.vue"),
// 用于 keep-alive 功能,需要与 SFC 中自动推导或显式声明的组件名称一致
// 参考文档: https://cn.vuejs.org/guide/built-ins/keep-alive.html#include-exclude

View File

@ -16,10 +16,10 @@
</template>
<script setup lang="ts">
import { useAppStore, useSettingsStore } from "@themeDefault/store";
import {useAppStore, useSettingsStore} from "@themeDefault/store";
import defaultSettings from "@themeDefault/settings";
import { ThemeEnum } from "@themeDefault/enums/ThemeEnum";
import { SizeEnum } from "@themeDefault/enums/SizeEnum";
import {ThemeEnum} from "@themeDefault/enums/ThemeEnum";
import {SizeEnum} from "@themeDefault/enums/SizeEnum";
const appStore = useAppStore();
const settingsStore = useSettingsStore();
@ -35,3 +35,7 @@ const fontColor = computed(() => {
: "rgba(0, 0, 0, .15)";
});
</script>
<style lang="scss">
//@import "styles/variables.scss";
//@import "styles/variables.module.scss";
</style>

View File

@ -1,3 +1,4 @@
@import "./variables.scss";
/* stylelint-disable property-no-unknown */
:export {
sidebar-width: $sidebar-width;

View File

@ -5,7 +5,6 @@
src="https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5"
width="100%"
height="100%"
frameborder="0"
></iframe>
</div>
</template>

View File

@ -5,7 +5,6 @@
src="http://vapi.youlai.tech/doc.html"
width="100%"
height="100%"
frameborder="0"
></iframe>
</div>
</template>

View File

@ -5,7 +5,6 @@
src="http://vapi.youlai.tech/swagger-ui.html"
width="100%"
height="100%"
frameborder="0"
></iframe>
</div>
</template>

View File

@ -15,20 +15,20 @@ function message() {
<div class="wscn-http404-container">
<div class="wscn-http404">
<div class="pic-404">
<img class="pic-404__parent" src="@/assets/images/404.png" alt="404" />
<img alt="404" class="pic-404__parent" src="@themeDefault/assets/images/404.png"/>
<img
class="pic-404__child left"
src="@/assets/images/404_cloud.png"
src="@themeDefault/assets/images/404_cloud.png"
alt="404"
/>
<img
class="pic-404__child mid"
src="@/assets/images/404_cloud.png"
src="@themeDefault/assets/images/404_cloud.png"
alt="404"
/>
<img
class="pic-404__child right"
src="@/assets/images/404_cloud.png"
src="@themeDefault/assets/images/404_cloud.png"
alt="404"
/>
</div>

View File

@ -24,7 +24,7 @@
"title": "数据大屏",
"isLink": "",
"isHide": false,
"isFull": true,
"isFull": false,
"isAffix": false,
"isKeepAlive": true
}
@ -1025,6 +1025,72 @@
"isAffix": false,
"isKeepAlive": true
}
},
{
"name": "/function",
"path": "/function",
"component": "Layout",
"redirect": "/Layout",
"meta": {
"icon": "Menu",
"title": "功能演示",
"hidden": false,
"alwaysShow": false,
"params": null
},
"children": [
{
"path": "icon-demo",
"component": "demo/icons",
"name": "IconDemo",
"meta": {
"title": "Icons",
"icon": "Notification",
"hidden": false,
"keepAlive": true,
"alwaysShow": false,
"params": null
}
},
{
"path": "x/function/websocket",
"component": "demo/websocket",
"name": "/function/websocket",
"meta": {
"title": "Websocket",
"icon": "Loading",
"hidden": false,
"keepAlive": true,
"alwaysShow": false,
"params": null
}
},
{
"path": "/sheet/univer",
"component": "@themeDefault/views/demo/sheet",
"name": "/sheet/univer",
"meta": {
"title": "univer表格",
"icon": "Histogram",
"hidden": false,
"keepAlive": true,
"alwaysShow": false,
"params": null
}
},
{
"path": "other/:id",
"component": "demo/other",
"name": "Other/:id",
"meta": {
"title": "敬请期待...",
"icon": "Grid",
"hidden": false,
"alwaysShow": false,
"params": null
}
}
]
}
],
"msg": "成功"

View File

@ -1,10 +1,11 @@
import { createRouter, createWebHashHistory, createWebHistory } from "vue-router";
import { useUserStore } from "@themeGeeker/stores/modules/user";
import { useAuthStore } from "@themeGeeker/stores/modules/auth";
import { LOGIN_URL, ROUTER_WHITE_LIST } from "@themeGeeker/config";
import { initDynamicRouter } from "@themeGeeker/routers/modules/dynamicRouter";
import { staticRouter, errorRouter } from "@themeGeeker/routers/modules/staticRouter";
import {createRouter, createWebHashHistory, createWebHistory} from "vue-router";
import {useUserStore} from "@themeGeeker/stores/modules/user";
import {useAuthStore} from "@themeGeeker/stores/modules/auth";
import {LOGIN_URL, ROUTER_WHITE_LIST} from "@themeGeeker/config";
import {initDynamicRouter} from "@themeGeeker/routers/modules/dynamicRouter";
import {errorRouter, staticRouter} from "@themeGeeker/routers/modules/staticRouter";
import NProgress from "@themeGeeker/config/nprogress";
import Performance from '@/tools/performance'
// const mode = import.meta.env.VITE_ROUTER_MODE;
const mode = process.env.VITE_ROUTER_MODE;
@ -43,7 +44,7 @@ const router = createRouter({
router.beforeEach(async (to, from, next) => {
const userStore = useUserStore();
const authStore = useAuthStore();
let end = Performance.startExecute(`${from.path} => ${to.path} 路由耗时`); /// 路由性能监控
// 1.NProgress 开始
NProgress.start();
@ -75,6 +76,7 @@ router.beforeEach(async (to, from, next) => {
// 8.正常访问页面
next();
end();
});
/**

View File

@ -5,7 +5,7 @@
</template>
<script setup lang="ts" name="cure">
import { ECOption } from "@themeGeeker/components/ECharts/config";
import {ECOption} from "@themeGeeker/components/ECharts/config";
import ECharts from "@themeGeeker/components/ECharts/index.vue";
const curveData = [
@ -84,7 +84,6 @@ const option: ECOption = {
color: "#a1a1a1",
fontSize: 14,
formatter: function (name: string) {
undefined;
return name.length > 8 ? name.slice(0, 8) + "..." : name;
}
},

View File

@ -5,7 +5,7 @@
background-repeat: no-repeat;
background-attachment: fixed;
background-position: center;
background-size: 100% 100%;
//background-size: 100% 100%;
background-size: cover;
.dataScreen-content {
position: fixed;

View File

@ -6,7 +6,6 @@
<script lang="ts" name="home" setup>
//
import {invoke, IpcChannel} from "@/utils/ipcRenderer";
//
// const testdata = ""+Date.now();
// console.log("",testdata);
@ -18,11 +17,11 @@ import {invoke, IpcChannel} from "@/utils/ipcRenderer";
// });
//sqlite
const sql = "SELECT name FROM sqlite_master WHERE type='table' AND name=?";
const params = ['testSqlite'];
invoke(IpcChannel.SqlRun, {sql: sql, params: params}).then((r) => {
console.log('sqlite数据库操作结果', r);
})
// const sql = "SELECT name FROM sqlite_master WHERE type='table' AND name=?";
// const params = ['testSqlite'];
// invoke(IpcChannel.SqlRun, {sql: sql, params: params}).then((r) => {
// console.log('sqlite', r);
// })
</script>
<style scoped lang="scss">

View File

@ -1,6 +1,6 @@
<template>
<div class="card content-box">
<iframe src="https://www.hiluker.cn/" frameborder="0" class="full-iframe"></iframe>
<iframe class="full-iframe" src="https://www.hiluker.cn/"></iframe>
</div>
</template>

View File

@ -2,8 +2,8 @@
height: 100%;
min-height: 550px;
background-color: #eeeeee;
background-image: url("@/assets/images/login_bg.svg");
background-size: 100% 100%;
background-image: url("../../assets/images/login_bg.svg");
//background-size: 100% 100%;
background-size: cover;
.login-box {
position: relative;

View File

@ -1,4 +1,4 @@
import { ipcRenderer, shell } from "electron";
import {ipcRenderer, shell} from "electron";
interface AnyObject {
[key: string]: any;
@ -12,6 +12,7 @@ interface memoryInfo {
declare global {
interface Window {
pkgInfo: any;
performance: {
memory: memoryInfo;
};
@ -22,6 +23,9 @@ declare global {
arch: string;
nodeVersion: string;
electronVersion: string;
node: () => void;
electron: () => void;
chrome: () => void;
};
shell: typeof shell;
crash: {

View File

@ -111,16 +111,16 @@ import {ProgressInfo} from "electron-updater";
const storeTemplate = useStoreTest();
//
// const testdata = ""+Date.now();
// console.log("",testdata);
// invoke(IpcChannel.FileWrite,{filename:"test-453.txt",data:testdata}).then((r) => {
// console.log('',r);
// invoke(IpcChannel.FileRead,{filename:"test-453.txt"}).then((r)=>{
// console.log("",r.data);
// })
// });
const testdata = "我是测试要添加的内容" + Date.now();
console.log("准备写入的内容:", testdata);
invoke(IpcChannel.FileWrite, {filename: "test-453.txt", data: testdata}).then((r) => {
console.log('文件添加结果:', r);
invoke(IpcChannel.FileRead, {filename: "test-453.txt"}).then((r) => {
console.log("文件读取结果:", r.data);
})
});
//sqlite
// sqlite
const sql = "SELECT name FROM sqlite_master WHERE type='table' AND name=?";
const params = ['testSqlite'];
let sqliteDemoRes: Ref<string> = ref("");
@ -196,8 +196,11 @@ function handleCurrentChange(val: number) {
elCPage.value = val;
}
/**
* 模拟进程崩溃
*/
function crash() {
process.crash();
window.crash.start();
}
function openNewWin() {

View File

@ -71,8 +71,9 @@
"lib": [
"esnext",
"dom"
]
],
// es2018
"jsx": "react"
},
"include": [
"src/**/*.ts",

5646
yarn.lock

File diff suppressed because it is too large Load Diff