From 879ee40f82b92caa3a0282164550caebd33afa8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E7=BB=A7=E9=BE=99?= <1006325823@qq.com> Date: Wed, 9 Apr 2025 17:43:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=88=86=E9=A1=B5=E5=92=8C?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=88=86=E6=9E=90=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E8=A1=A8=E6=A0=BC=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + electron-builder-config.json | 22 + main.js | 43 ++ package-lock.json | 1083 ++++++++++++++++++++++++++++++++-- package.json | 24 +- preload.js | 12 + src/App.js | 123 +++- src/components/DataView.js | 17 +- src/components/Toolbar.js | 11 +- src/services/ExcelService.js | 590 +++++++++++++----- src/styles/index.css | 66 ++- 11 files changed, 1764 insertions(+), 230 deletions(-) create mode 100644 electron-builder-config.json diff --git a/.gitignore b/.gitignore index 3c3629e..2466fe2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ node_modules +build +dist +release diff --git a/electron-builder-config.json b/electron-builder-config.json new file mode 100644 index 0000000..0be59ca --- /dev/null +++ b/electron-builder-config.json @@ -0,0 +1,22 @@ +{ + "appId": "com.datatools.app", + "productName": "DataTools", + "files": [ + "build/**/*", + "node_modules/**/*", + "main.js", + "preload.js" + ], + "directories": { + "buildResources": "assets", + "output": "release" + }, + "win": { + "target": "dir" + }, + "npmRebuild": false, + "asar": false, + "extraMetadata": { + "main": "main.js" + } +} diff --git a/main.js b/main.js index 4c5e1b2..d4dad57 100644 --- a/main.js +++ b/main.js @@ -29,6 +29,9 @@ function createWindow() { preload: path.join(__dirname, 'preload.js') } }); + + // 将mainWindow设为全局变量,以便其他模块可以访问 + global.mainWindow = mainWindow; // 加载应用 const loadAppUrl = () => { @@ -236,6 +239,46 @@ app.whenReady().then(() => { } }); + // 注册clear-all-data事件处理器 + ipcMain.removeHandler('clear-all-data'); // 先移除已有的处理器 + ipcMain.handle('clear-all-data', async () => { + try { + console.log('处理清除数据请求...'); + return new Promise((resolve, reject) => { + db.serialize(() => { + db.run('DELETE FROM projects', function(err) { + if (err) { + console.error('清除项目数据失败:', err); + reject({ success: false, error: err.message }); + return; + } + + db.run('DELETE FROM tree_structure', function(err) { + if (err) { + console.error('清除树状结构数据失败:', err); + reject({ success: false, error: err.message }); + return; + } + + // 重置自增ID + db.run('DELETE FROM sqlite_sequence WHERE name IN (\'projects\', \'tree_structure\')', function(err) { + if (err) { + console.error('重置自增ID失败:', err); + // 不影响主要功能,继续执行 + } + + resolve({ success: true, message: '所有数据已清除' }); + }); + }); + }); + }); + }); + } catch (error) { + console.error('清除数据错误:', error); + return { success: false, error: error.message }; + } + }); + app.on('activate', () => { // 在macOS上,当点击dock图标并且没有其他窗口打开时,通常在应用程序中重新创建一个窗口 if (BrowserWindow.getAllWindows().length === 0) { diff --git a/package-lock.json b/package-lock.json index 896021e..f64a9d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,8 @@ "cross-env": "^7.0.3", "electron": "^27.3.8", "electron-builder": "^24.6.3", + "electron-packager": "^17.1.2", + "electron-rebuild": "^3.2.9", "react-scripts": "5.0.1" } }, @@ -2795,7 +2797,7 @@ "version": "1.1.3", "resolved": "https://repo.huaweicloud.com/repository/npm/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "optional": true + "devOptional": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", @@ -4997,7 +4999,7 @@ "version": "1.1.1", "resolved": "https://repo.huaweicloud.com/repository/npm/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true + "devOptional": true }, "node_modules/accepts": { "version": "1.3.8", @@ -5111,7 +5113,7 @@ "version": "4.6.0", "resolved": "https://repo.huaweicloud.com/repository/npm/agentkeepalive/-/agentkeepalive-4.6.0.tgz", "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "optional": true, + "devOptional": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -5123,7 +5125,7 @@ "version": "3.1.0", "resolved": "https://repo.huaweicloud.com/repository/npm/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "optional": true, + "devOptional": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5420,7 +5422,7 @@ "version": "2.0.0", "resolved": "https://repo.huaweicloud.com/repository/npm/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "optional": true + "devOptional": true }, "node_modules/archiver": { "version": "5.3.2", @@ -5496,7 +5498,7 @@ "resolved": "https://repo.huaweicloud.com/repository/npm/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "deprecated": "This package is no longer supported.", - "optional": true, + "devOptional": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -5783,6 +5785,15 @@ "node": ">= 4.0.0" } }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/autoprefixer": { "version": "10.4.21", "resolved": "https://repo.huaweicloud.com/repository/npm/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -6845,11 +6856,35 @@ "version": "2.2.0", "resolved": "https://repo.huaweicloud.com/repository/npm/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "optional": true, + "devOptional": true, "engines": { "node": ">=6" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://repo.huaweicloud.com/repository/npm/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -6881,6 +6916,15 @@ "node": ">=12" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://repo.huaweicloud.com/repository/npm/clone-response/-/clone-response-1.0.3.tgz", @@ -7016,7 +7060,7 @@ "version": "1.1.3", "resolved": "https://repo.huaweicloud.com/repository/npm/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "optional": true, + "devOptional": true, "bin": { "color-support": "bin.js" } @@ -7228,6 +7272,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/config-file-ts/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://repo.huaweicloud.com/repository/npm/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -7247,7 +7304,7 @@ "version": "1.1.0", "resolved": "https://repo.huaweicloud.com/repository/npm/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "optional": true + "devOptional": true }, "node_modules/content-disposition": { "version": "0.5.4", @@ -7420,6 +7477,30 @@ "node": ">= 8" } }, + "node_modules/cross-spawn-windows-exe": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", + "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.1.0", + "is-wsl": "^2.2.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://repo.huaweicloud.com/repository/npm/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -7996,6 +8077,18 @@ "node": ">= 10" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://repo.huaweicloud.com/repository/npm/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -8061,7 +8154,7 @@ "version": "1.0.0", "resolved": "https://repo.huaweicloud.com/repository/npm/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "optional": true + "devOptional": true }, "node_modules/depd": { "version": "2.0.0", @@ -8575,6 +8668,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/electron-packager": { + "version": "17.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/electron-packager/-/electron-packager-17.1.2.tgz", + "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==", + "deprecated": "Please use @electron/packager moving forward. There is no API change, just a package name change", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^2.0.0", + "@electron/notarize": "^1.2.3", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^1.3.2", + "cross-spawn-windows-exe": "^1.2.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^3.0.1", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 14.17.5" + }, + "funding": { + "url": "https://github.com/electron/electron-packager?sponsor=1" + } + }, + "node_modules/electron-packager/node_modules/@electron/notarize": { + "version": "1.2.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-packager/node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-packager/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/electron-publish": { "version": "24.13.1", "resolved": "https://repo.huaweicloud.com/repository/npm/electron-publish/-/electron-publish-24.13.1.tgz", @@ -8604,6 +8774,302 @@ "node": ">=12" } }, + "node_modules/electron-rebuild": { + "version": "3.2.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/electron-rebuild/-/electron-rebuild-3.2.9.tgz", + "integrity": "sha512-FkEZNFViUem3P0RLYbZkUjC8LUFIK+wKq09GHoOITSJjfDAVQv964hwaNseTTWt58sITQX3/5fHNYcTefqaCWw==", + "deprecated": "Please use @electron/rebuild moving forward. There is no API change, just a package name change", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "lzma-native": "^8.0.5", + "node-abi": "^3.0.0", + "node-api-version": "^0.1.4", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/src/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/electron-rebuild/node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/electron-rebuild/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/electron-rebuild/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/electron-rebuild/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/electron-rebuild/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/electron-rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-rebuild/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-rebuild/node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/electron-rebuild/node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/electron-rebuild/node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/electron-rebuild/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/electron-rebuild/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-rebuild/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-rebuild/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/electron-rebuild/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/electron-rebuild/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.128", "resolved": "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", @@ -9735,6 +10201,12 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "dev": true + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://repo.huaweicloud.com/repository/npm/express/-/express-4.21.2.tgz", @@ -10003,6 +10475,32 @@ "minimatch": "^5.0.1" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://repo.huaweicloud.com/repository/npm/filesize/-/filesize-8.0.7.tgz", @@ -10107,6 +10605,33 @@ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, + "node_modules/flora-colossus": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/flora-colossus/-/flora-colossus-2.0.0.tgz", + "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/flora-colossus/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://repo.huaweicloud.com/repository/npm/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -10477,12 +11002,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/galactus": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/galactus/-/galactus-1.0.0.tgz", + "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/galactus/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://repo.huaweicloud.com/repository/npm/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "deprecated": "This package is no longer supported.", - "optional": true, + "devOptional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -10545,6 +11098,36 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, + "node_modules/get-package-info": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-package-info/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/get-package-info/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://repo.huaweicloud.com/repository/npm/get-package-type/-/get-package-type-0.1.0.tgz", @@ -10930,7 +11513,7 @@ "version": "2.0.1", "resolved": "https://repo.huaweicloud.com/repository/npm/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "optional": true + "devOptional": true }, "node_modules/hasown": { "version": "2.0.2", @@ -11262,7 +11845,7 @@ "version": "1.2.1", "resolved": "https://repo.huaweicloud.com/repository/npm/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "optional": true, + "devOptional": true, "dependencies": { "ms": "^2.0.0" } @@ -11426,7 +12009,7 @@ "version": "4.0.0", "resolved": "https://repo.huaweicloud.com/repository/npm/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "optional": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -11435,7 +12018,7 @@ "version": "1.0.4", "resolved": "https://repo.huaweicloud.com/repository/npm/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "optional": true + "devOptional": true }, "node_modules/inflight": { "version": "1.0.6", @@ -11475,7 +12058,7 @@ "version": "9.0.5", "resolved": "https://repo.huaweicloud.com/repository/npm/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "optional": true, + "devOptional": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -11737,11 +12320,20 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://repo.huaweicloud.com/repository/npm/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "optional": true + "devOptional": true }, "node_modules/is-map": { "version": "2.0.3", @@ -11951,6 +12543,18 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://repo.huaweicloud.com/repository/npm/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -13172,7 +13776,7 @@ "version": "1.1.0", "resolved": "https://repo.huaweicloud.com/repository/npm/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "optional": true + "devOptional": true }, "node_modules/jsdom": { "version": "16.7.0", @@ -13429,6 +14033,15 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://repo.huaweicloud.com/repository/npm/keyv/-/keyv-4.5.4.tgz", @@ -13592,6 +14205,42 @@ "resolved": "https://repo.huaweicloud.com/repository/npm/listenercount/-/listenercount-1.0.1.tgz", "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://repo.huaweicloud.com/repository/npm/loader-runner/-/loader-runner-4.3.0.tgz", @@ -13659,6 +14308,13 @@ "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true + }, "node_modules/lodash.groupby": { "version": "4.6.0", "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.groupby/-/lodash.groupby-4.6.0.tgz", @@ -13723,6 +14379,22 @@ "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://repo.huaweicloud.com/repository/npm/loose-envify/-/loose-envify-1.4.0.tgz", @@ -13764,6 +14436,30 @@ "node": ">=10" } }, + "node_modules/lzma-native": { + "version": "8.0.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/lzma-native/-/lzma-native-8.0.6.tgz", + "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.1.0", + "node-gyp-build": "^4.2.1", + "readable-stream": "^3.6.0" + }, + "bin": { + "lzmajs": "bin/lzmajs" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/lzma-native/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://repo.huaweicloud.com/repository/npm/magic-string/-/magic-string-0.25.9.tgz", @@ -14053,7 +14749,7 @@ "version": "1.0.2", "resolved": "https://repo.huaweicloud.com/repository/npm/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "optional": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -14082,7 +14778,7 @@ "version": "1.0.5", "resolved": "https://repo.huaweicloud.com/repository/npm/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "optional": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -14094,7 +14790,7 @@ "version": "1.2.4", "resolved": "https://repo.huaweicloud.com/repository/npm/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "optional": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -14106,7 +14802,7 @@ "version": "1.0.3", "resolved": "https://repo.huaweicloud.com/repository/npm/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "optional": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -14261,6 +14957,27 @@ "dev": true, "optional": true }, + "node_modules/node-api-version": { + "version": "0.1.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/node-api-version/-/node-api-version-0.1.4.tgz", + "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://repo.huaweicloud.com/repository/npm/node-forge/-/node-forge-1.3.1.tgz", @@ -14294,6 +15011,17 @@ "node": ">= 10.12.0" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/semver": { "version": "7.7.1", "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-7.7.1.tgz", @@ -14333,6 +15061,33 @@ "node": ">=6" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-path/-/normalize-path-3.0.0.tgz", @@ -14379,7 +15134,7 @@ "resolved": "https://repo.huaweicloud.com/repository/npm/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "deprecated": "This package is no longer supported.", - "optional": true, + "devOptional": true, "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -14637,6 +15392,29 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://repo.huaweicloud.com/repository/npm/own-keys/-/own-keys-1.0.1.tgz", @@ -14694,7 +15472,7 @@ "version": "4.0.0", "resolved": "https://repo.huaweicloud.com/repository/npm/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "optional": true, + "devOptional": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -14769,6 +15547,18 @@ "node": ">=6" } }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", + "dev": true, + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-5.2.0.tgz", @@ -16467,7 +17257,7 @@ "version": "1.0.1", "resolved": "https://repo.huaweicloud.com/repository/npm/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "optional": true + "devOptional": true }, "node_modules/promise-retry": { "version": "2.0.1", @@ -17276,6 +18066,18 @@ "node": ">=0.10.0" } }, + "node_modules/rcedit": { + "version": "3.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", + "dev": true, + "dependencies": { + "cross-spawn-windows-exe": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://repo.huaweicloud.com/repository/npm/react/-/react-18.3.1.tgz", @@ -17581,6 +18383,112 @@ "node": ">=10" } }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-3.6.2.tgz", @@ -17960,6 +18868,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://repo.huaweicloud.com/repository/npm/retry/-/retry-0.12.0.tgz", @@ -18557,7 +19478,7 @@ "version": "2.0.0", "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "optional": true + "devOptional": true }, "node_modules/set-function-length": { "version": "1.2.2", @@ -18828,7 +19749,7 @@ "version": "4.2.0", "resolved": "https://repo.huaweicloud.com/repository/npm/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, + "devOptional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -18849,7 +19770,7 @@ "version": "2.8.4", "resolved": "https://repo.huaweicloud.com/repository/npm/socks/-/socks-2.8.4.tgz", "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "optional": true, + "devOptional": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -18950,6 +19871,38 @@ "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://repo.huaweicloud.com/repository/npm/spdy/-/spdy-4.0.2.tgz", @@ -18984,7 +19937,7 @@ "version": "1.1.3", "resolved": "https://repo.huaweicloud.com/repository/npm/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "optional": true + "devOptional": true }, "node_modules/sqlite3": { "version": "5.1.7", @@ -19437,6 +20390,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/style-loader": { "version": "3.3.4", "resolved": "https://repo.huaweicloud.com/repository/npm/style-loader/-/style-loader-3.3.4.tgz", @@ -20264,6 +21238,27 @@ "tree-kill": "cli.js" } }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://repo.huaweicloud.com/repository/npm/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -20486,16 +21481,17 @@ } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://repo.huaweicloud.com/repository/npm/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "4.9.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { @@ -20803,6 +21799,16 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://repo.huaweicloud.com/repository/npm/vary/-/vary-1.1.2.tgz", @@ -20880,6 +21886,15 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://repo.huaweicloud.com/repository/npm/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -21281,7 +22296,7 @@ "version": "1.1.5", "resolved": "https://repo.huaweicloud.com/repository/npm/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "optional": true, + "devOptional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } diff --git a/package.json b/package.json index abc743b..3ecf220 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "dev": "concurrently \"npm run start\" \"cross-env BROWSER=none npm run react-start\"", "react-start": "react-scripts start", "react-build": "react-scripts build", - "build": "electron-builder", + "rebuild": "electron-rebuild", + "build": "electron-builder --publish never", + "package": "npm run react-build && npm run rebuild && npm run build", "test": "react-scripts test", "eject": "react-scripts eject" }, @@ -32,26 +34,36 @@ "preload.js" ], "directories": { - "buildResources": "assets" + "buildResources": "assets", + "output": "release" }, "win": { - "target": "nsis" - } + "target": "nsis", + "sign": null + }, + "npmRebuild": false, + "extraMetadata": { + "main": "main.js" + }, + "asar": true, + "forceCodeSigning": false }, "dependencies": { "antd": "^5.7.1", - "sqlite3": "^5.1.6", "electron-is-dev": "^2.0.0", "exceljs": "^4.3.0", "fs-extra": "^11.1.1", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "sqlite3": "^5.1.6" }, "devDependencies": { "concurrently": "^8.2.0", "cross-env": "^7.0.3", "electron": "^27.3.8", "electron-builder": "^24.6.3", + "electron-packager": "^17.1.2", + "electron-rebuild": "^3.2.9", "react-scripts": "5.0.1" }, "browserslist": { diff --git a/preload.js b/preload.js index fa29b60..6b27f92 100644 --- a/preload.js +++ b/preload.js @@ -10,7 +10,19 @@ contextBridge.exposeInMainWorld('electronAPI', { getTreeStructure: () => ipcRenderer.invoke('get-tree-structure'), filterProjects: (filters) => ipcRenderer.invoke('filter-projects', filters), updateProject: (project) => ipcRenderer.invoke('update-project', project), + deleteProject: (projectId) => ipcRenderer.invoke('delete-project', projectId), // Excel处理 importExcel: (filePath) => ipcRenderer.invoke('import-excel', filePath), + + // 数据清除 + clearAllData: () => ipcRenderer.invoke('clear-all-data'), + + // 事件监听 + onImportProgress: (callback) => { + // 移除之前的监听器,避免重复 + ipcRenderer.removeAllListeners('import-progress'); + // 添加新的监听器 + ipcRenderer.on('import-progress', (event, data) => callback(data)); + } }); diff --git a/src/App.js b/src/App.js index 98e3ef9..32b409d 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { ConfigProvider, theme, Switch, Space } from 'antd'; +import { ConfigProvider, theme, Switch, Space, Modal, Progress, message } from 'antd'; import zhCN from 'antd/locale/zh_CN'; import dayjs from 'dayjs'; import 'dayjs/locale/zh-cn'; @@ -12,7 +12,6 @@ dayjs.locale('zh-cn'); import Toolbar from './components/Toolbar'; import TreeView from './components/TreeView'; import DataView from './components/DataView'; -import AnalysisView from './components/AnalysisView'; import ProjectDetailForm from './components/ProjectDetailForm'; function App() { @@ -206,23 +205,125 @@ function App() { if (filePath) { setLoading(true); + // 创建进度对话框 + const progressModal = Modal.info({ + title: '导入Excel', + content: ( +
+

正在准备导入...

+ +
+ ), + icon: null, + okButtonProps: { style: { display: 'none' } }, + maskClosable: false, + closable: false, + }); + + // 监听导入进度 + window.electronAPI.onImportProgress((data) => { + // 更新进度条和消息 + const progressBar = document.getElementById('import-progress-bar'); + const progressMessage = document.getElementById('import-progress-message'); + + if (progressBar && progressMessage) { + // 更新进度条 + const antProgress = progressBar.querySelector('.ant-progress-bg'); + if (antProgress) { + antProgress.style.width = `${data.progress}%`; + antProgress.setAttribute('aria-valuenow', data.progress); + } + + // 更新文本 + progressMessage.textContent = data.message; + + // 如果导入完成,关闭对话框并重新加载数据 + if (data.status === 'complete') { + setTimeout(() => { + progressModal.destroy(); + message.success('Excel导入成功'); + // 重新加载数据 + loadData(); + setLoading(false); + }, 1000); + } else if (data.status === 'error') { + setTimeout(() => { + progressModal.destroy(); + message.error(`导入失败: ${data.message}`); + setLoading(false); + }, 1000); + } + } + }); + // 导入Excel文件 const result = await window.electronAPI.importExcel(filePath); - if (result.success) { - // 导入成功,重新加载数据 - loadData(); - } else { + // 如果导入失败且没有进度事件处理,则显示错误消息 + if (!result.success) { + progressModal.destroy(); + message.error(`导入失败: ${result.error}`); console.error('导入Excel文件失败:', result.error); + setLoading(false); } } } catch (error) { console.error('导入Excel文件失败:', error); - } finally { + message.error(`导入失败: ${error.message}`); setLoading(false); } }; + // 处理清除数据 + const handleClearData = async () => { + // 显示确认对话框 + Modal.confirm({ + title: '确认清除数据', + content: '此操作将清除所有项目数据,无法恢复。确定要继续吗?', + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk: async () => { + setLoading(true); + try { + // 调用API清除数据 + const result = await window.electronAPI.clearAllData(); + + if (result.success) { + // 清除成功,重置状态 + setProjects([]); + setTreeData([]); + setSelectedNode(null); + setSelectedProjects([]); + setActiveFilter(null); + setSearchText(''); + + // 显示成功提示 + Modal.success({ + title: '操作成功', + content: '所有数据已清除' + }); + } else { + // 显示错误提示 + Modal.error({ + title: '操作失败', + content: result.error || '清除数据时发生错误' + }); + } + } catch (error) { + console.error('清除数据失败:', error); + // 显示错误提示 + Modal.error({ + title: '操作失败', + content: '清除数据时发生错误' + }); + } finally { + setLoading(false); + } + } + }); + }; + return ( {/* 树状结构区 */} @@ -259,11 +361,6 @@ function App() { searchText={searchText} loading={loading} /> - - {/* 分析结果区 */} - selectedProjects.includes(p.id))} - /> {/* 项目详情表单 */} { + // 如果进度文本过长,只显示前15个字符加省略号 + if (text && text.length > 15) { + return {text.substring(0, 15)}...; + } + return text; + }, }, { title: '当前工程状态', @@ -115,21 +122,19 @@ const DataView = ({ selectedRowKeys: selectedProjects, onChange: onSelect, }} - pagination={{ - pageSize: 20, - showSizeChanger: true, - showTotal: (total) => `共 ${total} 条数据`, - }} + pagination={false} scroll={{ y: 'calc(100vh - 150px)', x: 'max-content' }} size="small" + bordered onRow={(record) => ({ onClick: () => onClick(record), // 点击行时调用传入的onClick函数 style: { cursor: 'pointer' } // 鼠标悬停时显示指针样式 })} + style={{ margin: '10px' }} /> )} ); }; -export default DataView; \ No newline at end of file +export default DataView; diff --git a/src/components/Toolbar.js b/src/components/Toolbar.js index eae3548..e7adab1 100644 --- a/src/components/Toolbar.js +++ b/src/components/Toolbar.js @@ -5,10 +5,11 @@ import { WarningOutlined, SearchOutlined, ImportOutlined, - SettingOutlined + SettingOutlined, + ClearOutlined } from '@ant-design/icons'; -const Toolbar = ({ activeFilter, onFilterChange, onImportExcel }) => { +const Toolbar = ({ activeFilter, onFilterChange, onImportExcel, onClearData }) => { // 显示"正在开发中"的提示 const showDevelopingMessage = () => { Modal.info({ @@ -48,6 +49,12 @@ const Toolbar = ({ activeFilter, onFilterChange, onImportExcel }) => { icon: , title: '设置', onClick: showDevelopingMessage + }, + { + key: 'clear', + icon: , + title: '清除数据', + onClick: onClearData } ]; diff --git a/src/services/ExcelService.js b/src/services/ExcelService.js index 8c27a23..0c2b502 100644 --- a/src/services/ExcelService.js +++ b/src/services/ExcelService.js @@ -20,12 +20,22 @@ class ExcelService { throw new Error('文件路径不能为空'); } + // 发送开始导入进度事件 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'reading', + progress: 0, + message: '正在读取Excel文件...' + }); + } + const workbook = new ExcelJS.Workbook(); await workbook.xlsx.readFile(filePath); // 读取第一个工作表 const worksheet = workbook.getWorksheet(1); const data = []; + const totalRows = worksheet.rowCount - 1; // 减去表头行 // 读取表头 const headers = []; @@ -33,7 +43,17 @@ class ExcelService { headers[colNumber - 1] = cell.value; }); + // 发送读取表头完成进度事件 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'reading', + progress: 10, + message: '表头读取完成,正在读取数据...' + }); + } + // 读取数据 + let processedRows = 0; worksheet.eachRow((row, rowNumber) => { if (rowNumber > 1) { // 跳过表头 const rowData = {}; @@ -41,12 +61,64 @@ class ExcelService { rowData[headers[colNumber - 1]] = cell.value; }); data.push(rowData); + + // 计算并发送进度 + processedRows++; + if (processedRows % 10 === 0 || processedRows === totalRows) { // 每10行或最后一行发送一次进度 + const progress = Math.floor(10 + (processedRows / totalRows) * 40); // 10%-50%的进度 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'reading', + progress: progress, + message: `正在读取数据...${processedRows}/${totalRows}` + }); + } + } } }); + // 发送数据读取完成进度事件 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'saving', + progress: 50, + message: `数据读取完成,正在保存到数据库...` + }); + } + // 将数据保存到数据库(这里可以根据实际需求修改) if (data.length > 0 && this.db) { - this.saveDataToDatabase(data); + await this.saveDataToDatabase(data); + + // 发送数据保存完成进度事件 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'building', + progress: 70, + message: `数据保存完成,正在构建树状结构...` + }); + } + + // 构建树状结构 + await this.buildTreeStructure(data); + + // 发送导入完成进度事件 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'complete', + progress: 100, + message: `导入完成,共导入 ${data.length} 条数据` + }); + } + } else { + // 如果没有数据,直接发送完成事件 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'complete', + progress: 100, + message: `导入完成,没有数据需要导入` + }); + } } return { @@ -56,6 +128,16 @@ class ExcelService { }; } catch (error) { console.error('Excel导入错误:', error); + + // 发送导入错误进度事件 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'error', + progress: 0, + message: `导入失败: ${error.message}` + }); + } + return { success: false, error: error.message @@ -65,187 +147,373 @@ class ExcelService { // 将数据保存到数据库 saveDataToDatabase(data) { - // 清空现有数据 - this.db.run('DELETE FROM projects', (err) => { - if (err) { - console.error('清空项目数据失败:', err); - return; - } - - // 插入新数据 - const stmt = this.db.prepare(` - INSERT INTO projects ( - unit, - project_number, - safety_code, - major_project_name, - sub_project_name, - construction_scope, - project_scale, - safety_director, - construction_unit, - supervision_unit, - construction_company, - project_location, - actual_start_time, - planned_completion_time, - current_progress, - current_status, - participants_count, - new_team_count, - new_person_count, - leader_info, - next_week_plan, - next_week_condition, - is_schedule_tight, - has_off_book_matters, - current_risk_level, - risk_judgment_reason, - risk_tips, - completion_time, - next_review_time, - remarks - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `); - - // 开始事务 - this.db.serialize(() => { - this.db.run('BEGIN TRANSACTION'); - - for (const row of data) { - stmt.run( - row['单位'] || null, - row['项目编号'] || null, - row['安全编码'] || null, - row['大项工程名称'] || null, - row['单项工程名称'] || null, - row['在施工程作业范围'] || null, - row['工程规模'] || null, - row['安全总监'] || null, - row['建设单位'] || null, - row['监理单位'] || null, - row['施工单位'] || null, - row['工程位置'] || null, - row['实际开工时间'] || null, - row['计划竣工时间'] || null, - row['当前工程进度'] || null, - row['当前工程状态'] || null, - row['参建人数'] || 0, - row['新班组进场数量'] || 0, - row['新人进场数量'] || 0, - row['带班人姓名、电话'] || null, - row['下周作业计划'] || null, - row['下周8+2工况内容'] || null, - row['工期是否紧张'] === '是' ? 1 : 0, - row['是否存在"账外事"'] === '是' ? 1 : 0, - row['当前风险等级'] || null, - row['当前风险判断理由'] || null, - row['隐患提示/工作要求'] || null, - row['完成时间'] || null, - row['下次梳理时间'] || null, - row['备注'] || null - ); + return new Promise((resolve, reject) => { + // 清空现有数据 + this.db.run('DELETE FROM projects', (err) => { + if (err) { + console.error('清空项目数据失败:', err); + reject(err); + return; } - this.db.run('COMMIT', (err) => { - if (err) { - console.error('提交事务失败:', err); - this.db.run('ROLLBACK'); - } else { - console.log(`成功导入 ${data.length} 条数据到数据库`); - // 构建树状结构 - this.buildTreeStructure(data); + // 插入新数据 + const stmt = this.db.prepare(` + INSERT INTO projects ( + unit, + project_number, + safety_code, + major_project_name, + sub_project_name, + construction_scope, + project_scale, + safety_director, + construction_unit, + supervision_unit, + construction_company, + project_location, + actual_start_time, + planned_completion_time, + current_progress, + current_status, + participants_count, + new_team_count, + new_person_count, + leader_info, + next_week_plan, + next_week_condition, + is_schedule_tight, + has_off_book_matters, + current_risk_level, + risk_judgment_reason, + risk_tips, + completion_time, + next_review_time, + remarks + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `); + + // 开始事务 + this.db.serialize(() => { + this.db.run('BEGIN TRANSACTION'); + + // 发送进度更新 + let processedRows = 0; + const totalRows = data.length; + + for (const row of data) { + // 处理字段值,确保所有字段都能正确导入 + const getValue = (fieldName, defaultValue = null) => { + // 检查字段是否存在,并处理空值 + const value = row[fieldName]; + if (value === undefined || value === null || value === '') { + return defaultValue; + } + return value; + }; + + // 处理布尔值字段 + const getBooleanValue = (fieldName) => { + const value = row[fieldName]; + if (value === '是' || value === 'true' || value === true || value === 1) { + return 1; + } + return 0; + }; + + // 处理数字字段 + const getNumberValue = (fieldName, defaultValue = 0) => { + const value = row[fieldName]; + if (value === undefined || value === null || value === '') { + return defaultValue; + } + // 尝试将值转换为数字 + const num = Number(value); + return isNaN(num) ? defaultValue : num; + }; + + // 使用处理函数获取字段值 + stmt.run( + getValue('单位'), + getValue('项目编号'), + getValue('安全编码'), + getValue('大项工程名称'), + getValue('单项工程名称'), + getValue('在施工程作业范围'), + getValue('工程规模'), + getValue('安全总监'), + getValue('建设单位'), + getValue('监理单位'), + getValue('施工单位'), + getValue('工程位置'), + getValue('实际开工时间'), + getValue('计划竣工时间'), + getValue('当前工程进度'), + getValue('当前工程状态'), + getNumberValue('参建人数'), + getNumberValue('新班组进场数量'), + getNumberValue('新人进场数量'), + getValue('带班人姓名、电话'), + getValue('下周作业计划'), + getValue('下周8+2工况内容'), + getBooleanValue('工期是否紧张'), + getBooleanValue('是否存在"账外事"'), + getValue('当前风险等级'), + getValue('当前风险判断理由'), + getValue('隐患提示/工作要求'), + getValue('完成时间'), + getValue('下次梳理时间'), + getValue('备注') + ); + + // 更新进度 + processedRows++; + if (processedRows % 10 === 0 || processedRows === totalRows) { + const progress = Math.floor(50 + (processedRows / totalRows) * 20); // 50%-70%的进度 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'saving', + progress: progress, + message: `正在保存数据到数据库...${processedRows}/${totalRows}` + }); + } + } } + + this.db.run('COMMIT', (err) => { + if (err) { + console.error('提交事务失败:', err); + this.db.run('ROLLBACK'); + reject(err); + } else { + console.log(`成功导入 ${data.length} 条数据到数据库`); + resolve(); + } + }); }); + + // 完成后关闭准备好的语句 + stmt.finalize(); }); - - // 完成后关闭准备好的语句 - stmt.finalize(); }); } // 构建树状结构 buildTreeStructure(data) { - // 清空现有树状结构 - this.db.run('DELETE FROM tree_structure', (err) => { - if (err) { - console.error('清空树状结构失败:', err); - return; - } - - // 创建总部节点 - const headquarters = '总部'; - const insertHeadquarters = this.db.prepare(` - INSERT INTO tree_structure ( - headquarters, - unit, - construction_unit, - parent_id, - node_level - ) VALUES (?, ?, ?, ?, ?) - `); - - // 插入总部节点 - insertHeadquarters.run(headquarters, null, null, null, 1, function(err) { + return new Promise((resolve, reject) => { + // 清空现有树状结构 + this.db.run('DELETE FROM tree_structure', (err) => { if (err) { - console.error('插入总部节点失败:', err); + console.error('清空树状结构失败:', err); + reject(err); return; } - const headquartersId = this.lastID; - console.log(`创建总部节点成功, ID: ${headquartersId}`); + // 使用Promise和事务来确保操作的原子性和顺序性 + const headquarters = '总部'; - // 单位映射 - const unitMap = {}; - - // 遍历数据,构建树状结构 - for (const row of data) { - const unit = row['单位']; - const constructionUnit = row['建设单位']; + // 开始事务 + this.db.run('BEGIN TRANSACTION', (err) => { + if (err) { + console.error('开始事务失败:', err); + reject(err); + return; + } - // 检查单位是否为空 - if (!unit) continue; + // 发送进度更新 - 开始创建树状结构 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'building', + progress: 75, + message: `正在创建总部节点...` + }); + } - // 如果单位不存在,则创建单位节点 - if (!unitMap[unit]) { - insertHeadquarters.run(headquarters, unit, null, headquartersId, 2, function(err) { + // 插入总部节点 + this.db.run( + `INSERT INTO tree_structure (headquarters, unit, construction_unit, parent_id, node_level) + VALUES (?, ?, ?, ?, ?)`, + [headquarters, null, null, null, 1], + (err) => { if (err) { - console.error(`创建单位节点失败: ${unit}`, err); + console.error('插入总部节点失败:', err); + this.db.run('ROLLBACK'); + reject(err); return; } - const unitId = this.lastID; - unitMap[unit] = { id: unitId, constructionUnits: {} }; - console.log(`创建单位节点: ${unit}, ID: ${unitId}`); - - // 如果建设单位不为空且不存在,则添加建设单位节点 - if (constructionUnit && !unitMap[unit].constructionUnits[constructionUnit]) { - insertHeadquarters.run(headquarters, unit, constructionUnit, unitId, 3, function(err) { - if (err) { - console.error(`创建建设单位节点失败: ${constructionUnit}`, err); - } else { - unitMap[unit].constructionUnits[constructionUnit] = true; - console.log(`创建建设单位节点: ${constructionUnit}, 父节点: ${unit}`); - } - }); - } - }); - } else if (constructionUnit && !unitMap[unit].constructionUnits[constructionUnit]) { - // 如果单位已存在但建设单位不存在,则添加建设单位节点 - insertHeadquarters.run(headquarters, unit, constructionUnit, unitMap[unit].id, 3, function(err) { - if (err) { - console.error(`创建建设单位节点失败: ${constructionUnit}`, err); - } else { - unitMap[unit].constructionUnits[constructionUnit] = true; - console.log(`创建建设单位节点: ${constructionUnit}, 父节点: ${unit}`); - } - }); - } - } - - // 完成后关闭准备好的语句 - insertHeadquarters.finalize(); - console.log('树状结构构建完成'); + // 获取总部节点ID + this.db.get('SELECT last_insert_rowid() as id', (err, row) => { + if (err) { + console.error('获取总部节点ID失败:', err); + this.db.run('ROLLBACK'); + reject(err); + return; + } + + const headquartersId = row.id; + console.log(`创建总部节点成功, ID: ${headquartersId}`); + + // 单位映射 + const unitMap = {}; + + // 首先处理所有单位节点 + const uniqueUnits = [...new Set(data.filter(row => row['单位']).map(row => row['单位']))]; + + // 发送进度更新 - 开始创建单位节点 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'building', + progress: 80, + message: `正在创建单位节点...` + }); + } + + const processUnits = () => { + return new Promise((resolve, reject) => { + let unitProcessed = 0; + + if (uniqueUnits.length === 0) { + resolve(); + return; + } + + uniqueUnits.forEach(unit => { + this.db.run( + `INSERT INTO tree_structure (headquarters, unit, construction_unit, parent_id, node_level) + VALUES (?, ?, ?, ?, ?)`, + [headquarters, unit, null, headquartersId, 2], + function(err) { + if (err) { + console.error(`创建单位节点失败: ${unit}`, err); + reject(err); + return; + } + + const unitId = this.lastID; + unitMap[unit] = { id: unitId, constructionUnits: {} }; + console.log(`创建单位节点: ${unit}, ID: ${unitId}`); + + unitProcessed++; + + // 更新进度 + if (unitProcessed % 5 === 0 || unitProcessed === uniqueUnits.length) { + const progress = Math.floor(80 + (unitProcessed / uniqueUnits.length) * 10); // 80%-90%的进度 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'building', + progress: progress, + message: `正在创建单位节点...${unitProcessed}/${uniqueUnits.length}` + }); + } + } + + if (unitProcessed === uniqueUnits.length) { + resolve(); + } + } + ); + }); + }); + }; + + // 然后处理所有建设单位节点 + const processConstructionUnits = () => { + return new Promise((resolve, reject) => { + // 收集所有有效的建设单位数据 + const constructionUnitData = []; + + data.forEach(row => { + const unit = row['单位']; + const constructionUnit = row['建设单位']; + + if (unit && constructionUnit && unitMap[unit] && + !unitMap[unit].constructionUnits[constructionUnit]) { + constructionUnitData.push({ + unit, + constructionUnit, + unitId: unitMap[unit].id + }); + unitMap[unit].constructionUnits[constructionUnit] = true; + } + }); + + // 发送进度更新 - 开始创建建设单位节点 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'building', + progress: 90, + message: `正在创建建设单位节点...` + }); + } + + if (constructionUnitData.length === 0) { + resolve(); + return; + } + + let processed = 0; + + constructionUnitData.forEach(item => { + this.db.run( + `INSERT INTO tree_structure (headquarters, unit, construction_unit, parent_id, node_level) + VALUES (?, ?, ?, ?, ?)`, + [headquarters, item.unit, item.constructionUnit, item.unitId, 3], + function(err) { + if (err) { + console.error(`创建建设单位节点失败: ${item.constructionUnit}`, err); + // 不中断整个过程,继续处理其他节点 + } else { + console.log(`创建建设单位节点: ${item.constructionUnit}, 父节点: ${item.unit}`); + } + + processed++; + + // 更新进度 + if (processed % 10 === 0 || processed === constructionUnitData.length) { + const progress = Math.floor(90 + (processed / constructionUnitData.length) * 10); // 90%-100%的进度 + if (global.mainWindow) { + global.mainWindow.webContents.send('import-progress', { + status: 'building', + progress: progress, + message: `正在创建建设单位节点...${processed}/${constructionUnitData.length}` + }); + } + } + + if (processed === constructionUnitData.length) { + resolve(); + } + } + ); + }); + }); + }; + + // 按顺序执行:先处理单位,再处理建设单位 + processUnits() + .then(() => processConstructionUnits()) + .then(() => { + // 提交事务 + this.db.run('COMMIT', (err) => { + if (err) { + console.error('提交事务失败:', err); + this.db.run('ROLLBACK'); + reject(err); + } else { + console.log('树状结构构建完成'); + resolve(); + } + }); + }) + .catch(err => { + console.error('构建树状结构失败:', err); + this.db.run('ROLLBACK'); + reject(err); + }); + }); + } + ); + }); }); }); } diff --git a/src/styles/index.css b/src/styles/index.css index f0449fb..5959bb2 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -55,14 +55,6 @@ code { overflow-y: auto; } -.analysis-view { - width: 300px; - background-color: var(--vscode-sidebar-bg); - border-left: 1px solid var(--vscode-sidebar-border); - overflow-y: auto; - padding: 10px; -} - /* 工具栏图标样式 */ .toolbar-icon { width: 32px; @@ -163,3 +155,61 @@ code { border-color: #40a9ff !important; color: white !important; } + +/* 自定义滚动条样式 */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--vscode-sidebar-bg); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: #555; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #777; +} + +/* 表格滚动条样式 */ +.ant-table-body::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.ant-table-body::-webkit-scrollbar-track { + background: var(--vscode-sidebar-bg); + border-radius: 4px; +} + +.ant-table-body::-webkit-scrollbar-thumb { + background: #555; + border-radius: 4px; +} + +.ant-table-body::-webkit-scrollbar-thumb:hover { + background: #777; +} + +/* 树状结构滚动条样式 */ +.tree-view::-webkit-scrollbar { + width: 8px; +} + +.tree-view::-webkit-scrollbar-track { + background: var(--vscode-sidebar-bg); +} + +.tree-view::-webkit-scrollbar-thumb { + background: #555; + border-radius: 4px; +} + +.tree-view::-webkit-scrollbar-thumb:hover { + background: #777; +}