ZaiZai il y a 1 an
Parent
commit
3ef39fce4b

+ 3 - 31
README.md

@@ -1,34 +1,6 @@
 # local_archive_app
 
-An Electron application with Vue
 
-## Recommended IDE Setup
-
-- [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)
-
-## Project Setup
-
-### Install
-
-```bash
-$ npm install
-```
-
-### Development
-
-```bash
-$ npm run dev
-```
-
-### Build
-
-```bash
-# For windows
-$ npm run build:win
-
-# For macOS
-$ npm run build:mac
-
-# For Linux
-$ npm run build:linux
-```
+Linux: $XDG_CACHE_HOME 或 ~/.cache/electron/
+MacOS: ~/Library/Caches/electron/
+Windows: %LOCALAPPDATA%/electron/Cache 或 ~/AppData/Local/electron/Cache/

+ 6 - 2
electron-builder.yml

@@ -1,5 +1,5 @@
-appId: com.electron.app
-productName: local_archive_app
+appId: com.local.archive.app
+productName: 档案脱机存档
 directories:
   buildResources: build
 files:
@@ -42,3 +42,7 @@ publish:
   url: https://example.com/auto-updates
 electronDownload:
   mirror: https://npmmirror.com/mirrors/electron/
+fileAssociations:
+    ext: hczc
+    role: Editor
+    icon: build/icon.png

+ 50 - 48
package.json

@@ -1,50 +1,52 @@
 {
-  "name": "local_archive_app",
-  "version": "1.0.0",
-  "description": "An Electron application with Vue",
-  "main": "./out/main/index.js",
-  "author": "example.com",
-  "scripts": {
-    "start": "electron-vite preview",
-    "dev": "electron-vite dev",
-    "build": "electron-vite build",
-    "postinstall": "electron-builder install-app-deps",
-    "build:unpack": "npm run build && electron-builder --dir",
-    "build:win": "npm run build && electron-builder --win",
-    "build:mac": "npm run build && electron-builder --mac",
-    "build:linux": "npm run build && electron-builder --linux"
-  },
-  "dependencies": {
-    "@electron-toolkit/preload": "^3.0.0",
-    "@electron-toolkit/utils": "^3.0.0",
-    "electron-updater": "^6.1.7"
-  },
-  "devDependencies": {
-    "@electron-toolkit/eslint-config": "^1.0.1",
-    "@iconify-json/iconoir": "^1.1.41",
-    "@iconify-json/ri": "^1.1.19",
-    "@rushstack/eslint-patch": "^1.6.1",
-    "@unocss/eslint-config": "^0.58.5",
-    "@vitejs/plugin-vue": "^5.0.3",
-    "@vue/compiler-sfc": "^3.4.19",
-    "axios": "^1.6.7",
-    "bignumber.js": "^9.1.2",
-    "dayjs": "^1.11.10",
-    "echarts": "^5.5.0",
-    "electron": "^28.2.0",
-    "electron-builder": "^24.9.1",
-    "electron-vite": "^2.0.0",
-    "element-plus": "^2.5.6",
-    "eslint": "^8.56.0",
-    "eslint-plugin-vue": "^9.21.1",
-    "hc-vue3-ui": "^3.1.2",
-    "js-fast-way": "^0.4.4",
-    "sass": "^1.71.0",
-    "split.js": "^1.6.5",
-    "unocss": "^0.58.5",
-    "unocss-preset-extra": "^0.5.3",
-    "vite": "^5.0.12",
-    "vue": "^3.4.15",
-    "vue-router": "^4.2.5"
-  }
+    "name": "local_archive_app",
+    "version": "1.0.0",
+    "productName": "档案脱机存档",
+    "main": "./out/main/index.js",
+    "scripts": {
+        "start": "electron-vite preview",
+        "dev": "electron-vite dev",
+        "build": "electron-vite build",
+        "postinstall": "electron-builder install-app-deps",
+        "build:unpack": "npm run build && electron-builder --dir",
+        "build:win": "npm run build && electron-builder --win",
+        "build:mac": "npm run build && electron-builder --mac",
+        "build:linux": "npm run build && electron-builder --linux"
+    },
+    "dependencies": {
+        "@electron-toolkit/preload": "^3.0.0",
+        "@electron-toolkit/utils": "^3.0.0",
+        "@electron/remote": "^2.1.2",
+        "electron-updater": "^6.1.7"
+    },
+    "devDependencies": {
+        "@electron-toolkit/eslint-config": "^1.0.1",
+        "@electron/get": "^3.0.0",
+        "@iconify-json/iconoir": "^1.1.41",
+        "@iconify-json/ri": "^1.1.19",
+        "@rushstack/eslint-patch": "^1.6.1",
+        "@unocss/eslint-config": "^0.58.5",
+        "@vitejs/plugin-vue": "^5.0.3",
+        "@vue/compiler-sfc": "^3.4.19",
+        "axios": "^1.6.7",
+        "bignumber.js": "^9.1.2",
+        "compressing": "^1.10.0",
+        "dayjs": "^1.11.10",
+        "echarts": "^5.5.0",
+        "electron": "^28.2.3",
+        "electron-builder": "^24.9.1",
+        "electron-vite": "^2.0.0",
+        "element-plus": "^2.5.6",
+        "eslint": "^8.56.0",
+        "eslint-plugin-vue": "^9.21.1",
+        "hc-vue3-ui": "^3.1.2",
+        "js-fast-way": "^0.4.4",
+        "sass": "^1.71.0",
+        "split.js": "^1.6.5",
+        "unocss": "^0.58.5",
+        "unocss-preset-extra": "^0.5.3",
+        "vite": "^5.0.12",
+        "vue": "^3.4.15",
+        "vue-router": "^4.2.5"
+    }
 }

+ 26 - 4
src/main/index.js

@@ -1,13 +1,15 @@
 import { join } from 'path'
-import { BrowserWindow, app, ipcMain, shell } from 'electron'
+import { BrowserWindow, app, dialog, ipcMain, shell } from 'electron'
 import { electronApp, is, optimizer } from '@electron-toolkit/utils'
 import icon from '../../resources/icon.png?asset'
 
 function createWindow() {
+
     // Create the browser window.
     const mainWindow = new BrowserWindow({
         width: 900,
         height: 670,
+        center: true,
         show: false,
         autoHideMenuBar: true,
         ...(process.platform === 'linux' ? { icon } : {}),
@@ -40,7 +42,7 @@ function createWindow() {
 // Some APIs can only be used after this event occurs.
 app.whenReady().then(() => {
     // Set app user model id for windows
-    electronApp.setAppUserModelId('com.electron')
+    electronApp.setAppUserModelId('com.local.archive.app')
 
     // Default open or close DevTools by F12 in development
     // and ignore CommandOrControl + R in production.
@@ -49,8 +51,27 @@ app.whenReady().then(() => {
         optimizer.watchWindowShortcuts(window)
     })
 
-    // IPC test
-    ipcMain.on('ping', () => console.log('pong'))
+    // Open file
+    app.on('open-file', (event, url) => {
+        event.preventDefault()
+        process.argv.push(url)
+        BrowserWindow.getFocusedWindow().webContents.send('open-file', { msg: url })
+    })
+
+    // IPC dialog
+    ipcMain.handle('showOpenDialog', async (event, options) => {
+        return new Promise((resolve) => {
+            dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), options).then(result => {
+                if (result.canceled) {
+                    resolve({ code: 0 })
+                } else {
+                    resolve({ code: 200, paths: result.filePaths })
+                }
+            }).catch(err => {
+                resolve({ code: 300, msg: err.message })
+            })
+        })
+    })
 
     createWindow()
 
@@ -70,5 +91,6 @@ app.on('window-all-closed', () => {
     }
 })
 
+
 // In this file you can include the rest of your app"s specific main process
 // code. You can also put them in separate files and require them here.

+ 7 - 1
src/preload/index.js

@@ -1,8 +1,14 @@
+import os from 'os'
+import fs from 'fs'
 import { contextBridge } from 'electron'
 import { electronAPI } from '@electron-toolkit/preload'
 
 // Custom APIs for renderer
-const api = {}
+const api = {
+    fs,
+    homedir: os.homedir(),
+    platform: process.platform,
+}
 
 // Use `contextBridge` APIs to expose Electron APIs to
 // renderer only if context isolation is enabled, otherwise

+ 7 - 0
src/renderer/src/config/index.js

@@ -0,0 +1,7 @@
+//主要配置
+export default {
+    title: '档案脱机存档', // 系统名称
+    key: 'local_archive_app', // 配置主键,目前用于存储
+    homePath: window.api.homedir + '/.hc-archive/', // 系统根目录
+    configPath: window.api.homedir + '/.hc-archive/config.json',
+}

+ 6 - 0
src/renderer/src/layout/index.vue

@@ -5,7 +5,13 @@
 </template>
 
 <script setup>
+import { nextTick } from 'vue'
 
+nextTick(() => {
+    window.electron.ipcRenderer.on('open-file', (event, arg) => {
+        console.log('receive ipc', arg)
+    })
+})
 </script>
 
 <style lang="scss" scoped>

+ 12 - 4
src/renderer/src/router/index.js

@@ -1,5 +1,7 @@
 import * as vueRouter from 'vue-router'
 import baseData from './routers'
+import config from '~src/config/index'
+import { exists_file } from '~src/utils/tools'
 
 //设置路由数据
 const router = vueRouter.createRouter({
@@ -8,15 +10,21 @@ const router = vueRouter.createRouter({
 })
 
 //路由拦截
-router.beforeResolve(() => {
-    return true
+router.beforeResolve((to) => {
+    //判断是否存在配置文件
+    if (!exists_file(config.configPath) && to.path !== '/init') {
+        return '/init'
+    } else {
+        return true
+    }
 })
 
 router.afterEach((to) => {
+    let pageTitle = to.meta['title'], title = config.title
     if (to.path !== '/') {
-        window.document.title = to.meta['title']
+        window.document.title = pageTitle ? `${pageTitle} - ${title}` : title
     } else {
-        window.document.title = ''
+        window.document.title = title
     }
     window.scrollTo(0, 0)
 })

+ 10 - 0
src/renderer/src/router/routers.js

@@ -4,6 +4,16 @@ import Layout from '~src/layout/index.vue'
 export default [
     {
         path: '/',
+        redirect: '/index',
+    },
+    {
+        path: '/init',
+        name: 'init',
+        meta: { title: '初始配置' },
+        component: () => import('~src/views/init.vue'),
+    },
+    {
+        path: '/index',
         name: 'index',
         redirect: '/home',
         meta: { title: '首页' },

+ 2 - 0
src/renderer/src/styles/app/main.scss

@@ -1,5 +1,7 @@
 html, body, #app {
     height: 100%;
+    color: #1A1A1A;
+    overflow: hidden;
     background-color: #F1F5F8;
 }
 

+ 45 - 0
src/renderer/src/utils/tools.js

@@ -1,4 +1,49 @@
+import config from '~src/config/index'
+
 //设置系统名称
 export const setAppName = (name) => {
     window.document.title = name
 }
+
+//显示打开文件对话框
+export const showOpenDialog = async (options) => {
+    return await window.electron.ipcRenderer.invoke('showOpenDialog', options)
+}
+
+//判断文件或目录是否存在
+export const exists_file = (file) => {
+    if (file) {
+        return window.api.fs.existsSync(file)
+    } else {
+        return false
+    }
+}
+
+//读取本地文件
+export const read_file = (file) => {
+    if (!exists_file(file)) {
+        return ''
+    } else {
+        try {
+            return window.api.fs.readFileSync(file, 'utf-8')
+        } catch (e) {
+            return ''
+        }
+    }
+}
+
+//读取配置文件
+export const read_config_file = () => {
+    const configFile = read_file(config.configPath)
+    if (configFile) {
+        let content = {}
+        try {
+            content = JSON.parse(configFile)
+        } catch (e) {
+            content = {}
+        }
+        return content
+    } else {
+        return {}
+    }
+}

+ 12 - 1
src/renderer/src/views/home.vue

@@ -5,7 +5,18 @@
 </template>
 
 <script setup>
-const ipcHandle = () => window.electron.ipcRenderer.send('ping')
+import { nextTick } from 'vue'
+
+const ipcHandle = () => {
+    window.electron.ipcRenderer.send('ping')
+    console.log('send ipc')
+}
+
+nextTick(() => {
+    window.electron.ipcRenderer.on('open-file', (event, arg) => {
+        console.log('receive ipc', arg)
+    })
+})
 </script>
 
 <style lang="scss" scoped>

+ 60 - 0
src/renderer/src/views/init.vue

@@ -0,0 +1,60 @@
+<template>
+    <div class="relative h-full w-full p-5">
+        <hc-new-card title="档案脱机存档 - 初始配置" scrollbar>
+            <template #extra>
+                <el-button hc-btn type="primary">确认保存</el-button>
+            </template>
+            <el-alert
+                title="数据通常会非常大,请选择一个大容量的存储位置,不建议存在C盘下,请谨慎选择,保存后将不允许修改"
+                type="error" effect="dark" :closable="false"
+            />
+            <el-form ref="formRef" class="mt-4" :model="formModel" :rules="formRules" label-position="left" label-width="auto">
+                <el-form-item label="数据存储位置:" prop="dataPath">
+                    <el-input v-model="formModel.dataPath">
+                        <template #append>
+                            <el-button @click="dataPathClick">选择位置</el-button>
+                        </template>
+                    </el-input>
+                </el-form-item>
+            </el-form>
+        </hc-new-card>
+    </div>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue'
+import { read_config_file, showOpenDialog } from '../utils/tools'
+
+//基础表单
+const formRef = ref(null)
+const formModel = ref({})
+const formRules = {
+    dataPath: {
+        required: true,
+        trigger: 'blur',
+        message: '请选择或输入数据存储位置',
+    },
+}
+
+onMounted(() => {
+    formModel.value = read_config_file()
+})
+
+//选择数据存储位置
+const dataPathClick = async () => {
+    const { code, paths } = await showOpenDialog({
+        title: '选择数据存储位置',
+        buttonLabel: '确认选择',
+        multiSelections: false,
+        properties: ['openDirectory', 'createDirectory'],
+        message: '请选择一个大容量的存储位置',
+    })
+    if (code === 200) {
+        formModel.value.dataPath = paths[0]
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 192 - 15
yarn.lock

@@ -333,6 +333,14 @@
     ajv "^6.12.0"
     ajv-keywords "^3.4.1"
 
+"@eggjs/yauzl@^2.11.0":
+  version "2.11.0"
+  resolved "http://39.108.216.210:9000/@eggjs/yauzl/-/yauzl-2.11.0.tgz#b8e4413f50fc7c51451f770f152de4c1137aa99b"
+  integrity sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==
+  dependencies:
+    buffer-crc32 "~0.2.3"
+    fd-slicer2 "^1.2.0"
+
 "@electron-toolkit/eslint-config@^1.0.1":
   version "1.0.2"
   resolved "http://39.108.216.210:9000/@electron-toolkit/eslint-config/-/eslint-config-1.0.2.tgz#176f4c7c6f6f030199863e6b767d5caebfda14dd"
@@ -372,6 +380,21 @@
   optionalDependencies:
     global-agent "^3.0.0"
 
+"@electron/get@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/@electron/get/-/get-3.0.0.tgz#2b0c794b98902d0bc5218546872c1379bef68aa2"
+  integrity sha512-hLv4BYFiyrNRI+U0Mm2X7RxCCdJLkDUn8GCEp9QJzbLpZRko+UaLlCjOMkj6TEtirNLPyBA7y1SeGfnpOB21aQ==
+  dependencies:
+    debug "^4.1.1"
+    env-paths "^2.2.0"
+    fs-extra "^8.1.0"
+    got "^11.8.5"
+    progress "^2.0.3"
+    semver "^6.2.0"
+    sumchecker "^3.0.1"
+  optionalDependencies:
+    global-agent "^3.0.0"
+
 "@electron/notarize@2.1.0":
   version "2.1.0"
   resolved "http://39.108.216.210:9000/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3"
@@ -393,6 +416,11 @@
     minimist "^1.2.6"
     plist "^3.0.5"
 
+"@electron/remote@^2.1.2":
+  version "2.1.2"
+  resolved "http://39.108.216.210:9000/@electron/remote/-/remote-2.1.2.tgz#52a97c8faa5b769155b649ef262f2f8c851776e6"
+  integrity sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==
+
 "@electron/universal@1.4.1":
   version "1.4.1"
   resolved "http://39.108.216.210:9000/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785"
@@ -1522,6 +1550,14 @@ binary-extensions@^2.0.0:
   resolved "http://39.108.216.210:9000/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
   integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
 
+bl@^1.0.0:
+  version "1.2.3"
+  resolved "http://39.108.216.210:9000/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
+  integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
+  dependencies:
+    readable-stream "^2.3.5"
+    safe-buffer "^5.1.1"
+
 bluebird-lst@^1.0.9:
   version "1.0.9"
   resolved "http://39.108.216.210:9000/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c"
@@ -1576,6 +1612,19 @@ browserslist@^4.22.2:
     node-releases "^2.0.14"
     update-browserslist-db "^1.0.13"
 
+buffer-alloc-unsafe@^1.1.0:
+  version "1.1.0"
+  resolved "http://39.108.216.210:9000/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+  integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+  version "1.2.0"
+  resolved "http://39.108.216.210:9000/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
 buffer-crc32@~0.2.3:
   version "0.2.13"
   resolved "http://39.108.216.210:9000/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -1586,6 +1635,11 @@ buffer-equal@^1.0.0:
   resolved "http://39.108.216.210:9000/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90"
   integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==
 
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "http://39.108.216.210:9000/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+  integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==
+
 buffer-from@^1.0.0:
   version "1.1.2"
   resolved "http://39.108.216.210:9000/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
@@ -1779,6 +1833,21 @@ compare-version@^0.1.2:
   resolved "http://39.108.216.210:9000/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
   integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==
 
+compressing@^1.10.0:
+  version "1.10.0"
+  resolved "http://39.108.216.210:9000/compressing/-/compressing-1.10.0.tgz#bca0f734736b5bb05c3a176fef8d60d7f5f322da"
+  integrity sha512-k2vpbZLaJoHe9euyUZjYYE8vOrbR19aU3HcWIYw5EBXiUs34ygfDVnXU+ubI41JXMriHutnoiu0ZFdwCkH6jPA==
+  dependencies:
+    "@eggjs/yauzl" "^2.11.0"
+    flushwritable "^1.0.0"
+    get-ready "^1.0.0"
+    iconv-lite "^0.5.0"
+    mkdirp "^0.5.1"
+    pump "^3.0.0"
+    streamifier "^0.1.1"
+    tar-stream "^1.5.2"
+    yazl "^2.4.2"
+
 concat-map@0.0.1:
   version "0.0.1"
   resolved "http://39.108.216.210:9000/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -1807,6 +1876,11 @@ core-util-is@1.0.2:
   resolved "http://39.108.216.210:9000/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
 
+core-util-is@~1.0.0:
+  version "1.0.3"
+  resolved "http://39.108.216.210:9000/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
 crc@^3.8.0:
   version "3.8.0"
   resolved "http://39.108.216.210:9000/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
@@ -2054,7 +2128,7 @@ electron-vite@^2.0.0:
     magic-string "^0.30.5"
     picocolors "^1.0.0"
 
-electron@^28.2.0:
+electron@^28.2.3:
   version "28.2.3"
   resolved "http://39.108.216.210:9000/electron/-/electron-28.2.3.tgz#d26821bcfda7ee445b4b75231da4b057a7ce6e7b"
   integrity sha512-he9nGphZo03ejDjYBXpmFVw0KBKogXvR2tYxE4dyYvnfw42uaFIBFrwGeenvqoEOfheJfcI0u4rFG6h3QxDwnA==
@@ -2094,7 +2168,7 @@ emoji-regex@^9.2.2:
   resolved "http://39.108.216.210:9000/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
   integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
 
-end-of-stream@^1.1.0:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   version "1.4.4"
   resolved "http://39.108.216.210:9000/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
   integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -2354,6 +2428,13 @@ fastq@^1.6.0:
   dependencies:
     reusify "^1.0.4"
 
+fd-slicer2@^1.2.0:
+  version "1.2.0"
+  resolved "http://39.108.216.210:9000/fd-slicer2/-/fd-slicer2-1.2.0.tgz#a2c54a540639bbcd4702480821771341277ca20e"
+  integrity sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==
+  dependencies:
+    pend "^1.2.0"
+
 fd-slicer@~1.1.0:
   version "1.1.0"
   resolved "http://39.108.216.210:9000/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
@@ -2404,6 +2485,11 @@ flatted@^3.2.9:
   resolved "http://39.108.216.210:9000/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf"
   integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
 
+flushwritable@^1.0.0:
+  version "1.0.0"
+  resolved "http://39.108.216.210:9000/flushwritable/-/flushwritable-1.0.0.tgz#3e328d8fde412ad47e738e3be750b4d290043498"
+  integrity sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==
+
 follow-redirects@^1.15.4:
   version "1.15.5"
   resolved "http://39.108.216.210:9000/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020"
@@ -2426,6 +2512,11 @@ form-data@^4.0.0:
     combined-stream "^1.0.8"
     mime-types "^2.1.12"
 
+fs-constants@^1.0.0:
+  version "1.0.0"
+  resolved "http://39.108.216.210:9000/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+  integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
 fs-extra@^10.0.0, fs-extra@^10.1.0:
   version "10.1.0"
   resolved "http://39.108.216.210:9000/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
@@ -2497,6 +2588,11 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
     has-symbols "^1.0.3"
     hasown "^2.0.0"
 
+get-ready@^1.0.0:
+  version "1.0.0"
+  resolved "http://39.108.216.210:9000/get-ready/-/get-ready-1.0.0.tgz#f91817f1e9adecfea13a562adfc8de883ab34782"
+  integrity sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==
+
 get-stream@^5.1.0:
   version "5.2.0"
   resolved "http://39.108.216.210:9000/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
@@ -2719,6 +2815,13 @@ iconv-corefoundation@^1.1.7:
     cli-truncate "^2.1.0"
     node-addon-api "^1.6.3"
 
+iconv-lite@^0.5.0:
+  version "0.5.2"
+  resolved "http://39.108.216.210:9000/iconv-lite/-/iconv-lite-0.5.2.tgz#af6d628dccfb463b7364d97f715e4b74b8c8c2b8"
+  integrity sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
 iconv-lite@^0.6.2:
   version "0.6.3"
   resolved "http://39.108.216.210:9000/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
@@ -2762,7 +2865,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2:
+inherits@2, inherits@~2.0.3:
   version "2.0.4"
   resolved "http://39.108.216.210:9000/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -2813,6 +2916,11 @@ is-stream@^2.0.0:
   resolved "http://39.108.216.210:9000/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
   integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
 
+isarray@~1.0.0:
+  version "1.0.0"
+  resolved "http://39.108.216.210:9000/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
 isbinaryfile@^4.0.8:
   version "4.0.10"
   resolved "http://39.108.216.210:9000/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3"
@@ -3139,6 +3247,13 @@ minizlib@^2.1.1:
     minipass "^3.0.0"
     yallist "^4.0.0"
 
+mkdirp@^0.5.1:
+  version "0.5.6"
+  resolved "http://39.108.216.210:9000/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+  integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+  dependencies:
+    minimist "^1.2.6"
+
 mkdirp@^1.0.3:
   version "1.0.4"
   resolved "http://39.108.216.210:9000/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
@@ -3317,7 +3432,7 @@ pathe@^1.1.0, pathe@^1.1.2:
   resolved "http://39.108.216.210:9000/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec"
   integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
 
-pend@~1.2.0:
+pend@^1.2.0, pend@~1.2.0:
   version "1.2.0"
   resolved "http://39.108.216.210:9000/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
   integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
@@ -3337,14 +3452,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
   resolved "http://39.108.216.210:9000/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
-pinia@^2.1.7:
-  version "2.1.7"
-  resolved "http://39.108.216.210:9000/pinia/-/pinia-2.1.7.tgz#4cf5420d9324ca00b7b4984d3fbf693222115bbc"
-  integrity sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==
-  dependencies:
-    "@vue/devtools-api" "^6.5.0"
-    vue-demi ">=0.14.5"
-
 pkg-types@^1.0.3:
   version "1.0.3"
   resolved "http://39.108.216.210:9000/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868"
@@ -3385,6 +3492,11 @@ prelude-ls@^1.2.1:
   resolved "http://39.108.216.210:9000/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
   integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
 
+process-nextick-args@~2.0.0:
+  version "2.0.1"
+  resolved "http://39.108.216.210:9000/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
 progress@^2.0.3:
   version "2.0.3"
   resolved "http://39.108.216.210:9000/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -3438,6 +3550,19 @@ read-config-file@6.3.2:
     json5 "^2.2.0"
     lazy-val "^1.0.4"
 
+readable-stream@^2.3.0, readable-stream@^2.3.5:
+  version "2.3.8"
+  resolved "http://39.108.216.210:9000/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+  integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
 readdirp@~3.6.0:
   version "3.6.0"
   resolved "http://39.108.216.210:9000/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -3525,7 +3650,17 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-"safer-buffer@>= 2.1.2 < 3.0.0":
+safe-buffer@^5.1.1:
+  version "5.2.1"
+  resolved "http://39.108.216.210:9000/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "http://39.108.216.210:9000/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
   version "2.1.2"
   resolved "http://39.108.216.210:9000/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -3665,6 +3800,11 @@ stat-mode@^1.0.0:
   resolved "http://39.108.216.210:9000/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465"
   integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==
 
+streamifier@^0.1.1:
+  version "0.1.1"
+  resolved "http://39.108.216.210:9000/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f"
+  integrity sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==
+
 "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
   version "4.2.3"
   resolved "http://39.108.216.210:9000/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
@@ -3683,6 +3823,13 @@ string-width@^5.0.1, string-width@^5.1.2:
     emoji-regex "^9.2.2"
     strip-ansi "^7.0.1"
 
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "http://39.108.216.210:9000/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+  dependencies:
+    safe-buffer "~5.1.0"
+
 "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   version "6.0.1"
   resolved "http://39.108.216.210:9000/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -3736,6 +3883,19 @@ synckit@^0.9.0:
     "@pkgr/core" "^0.1.0"
     tslib "^2.6.2"
 
+tar-stream@^1.5.2:
+  version "1.6.2"
+  resolved "http://39.108.216.210:9000/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+  integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+  dependencies:
+    bl "^1.0.0"
+    buffer-alloc "^1.2.0"
+    end-of-stream "^1.0.0"
+    fs-constants "^1.0.0"
+    readable-stream "^2.3.0"
+    to-buffer "^1.1.1"
+    xtend "^4.0.0"
+
 tar@^6.1.12:
   version "6.2.0"
   resolved "http://39.108.216.210:9000/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73"
@@ -3780,6 +3940,11 @@ tmp@^0.2.0:
   dependencies:
     rimraf "^3.0.0"
 
+to-buffer@^1.1.1:
+  version "1.1.1"
+  resolved "http://39.108.216.210:9000/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+  integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "http://39.108.216.210:9000/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -3922,7 +4087,7 @@ utf8-byte-length@^1.0.1:
   resolved "http://39.108.216.210:9000/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
   integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==
 
-util-deprecate@^1.0.2:
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "http://39.108.216.210:9000/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
@@ -3947,7 +4112,7 @@ vite@^5.0.12:
   optionalDependencies:
     fsevents "~2.3.3"
 
-vue-demi@*, vue-demi@>=0.14.5:
+vue-demi@*:
   version "0.14.7"
   resolved "http://39.108.216.210:9000/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2"
   integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==
@@ -4023,6 +4188,11 @@ xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1:
   resolved "http://39.108.216.210:9000/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"
   integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
 
+xtend@^4.0.0:
+  version "4.0.2"
+  resolved "http://39.108.216.210:9000/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
 y18n@^5.0.5:
   version "5.0.8"
   resolved "http://39.108.216.210:9000/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
@@ -4064,6 +4234,13 @@ yauzl@^2.10.0:
     buffer-crc32 "~0.2.3"
     fd-slicer "~1.1.0"
 
+yazl@^2.4.2:
+  version "2.5.1"
+  resolved "http://39.108.216.210:9000/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
+  integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
+  dependencies:
+    buffer-crc32 "~0.2.3"
+
 yocto-queue@^0.1.0:
   version "0.1.0"
   resolved "http://39.108.216.210:9000/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"