瀏覽代碼

feat: api测试

zhangjie 1 年之前
父節點
當前提交
85ff145fa5

+ 1 - 0
.husky/pre-commit

@@ -2,3 +2,4 @@
 . "$(dirname "$0")/_/husky.sh"
 
 npm run lint-staged
+npm run typecheck

+ 5 - 3
electron/main/index.ts

@@ -1,7 +1,8 @@
-import { app, shell, BrowserWindow, ipcMain } from 'electron';
+import { app, shell, BrowserWindow } from 'electron';
 import { join } from 'path';
 import { electronApp, optimizer, is } from '@electron-toolkit/utils';
 import icon from '../../resources/icon.png?asset';
+import useElectron from './useElectron';
 
 function createWindow(): void {
   // Create the browser window.
@@ -49,8 +50,9 @@ app.whenReady().then(() => {
     optimizer.watchWindowShortcuts(window);
   });
 
-  // IPC test
-  ipcMain.on('ping', () => console.log('pong'));
+  // use electron
+  useElectron();
+  // use node
 
   createWindow();
 

+ 12 - 0
electron/main/useElectron.ts

@@ -0,0 +1,12 @@
+import { dialog, ipcMain } from 'electron';
+
+function handleDialogSelectFile(
+  event: Electron.IpcMainInvokeEvent,
+  config: Electron.OpenDialogOptions
+) {
+  return dialog.showOpenDialog(config);
+}
+
+export default function useElectron() {
+  ipcMain.handle('dialog:selectFile', handleDialogSelectFile);
+}

+ 15 - 0
electron/preload/apiElectron.ts

@@ -0,0 +1,15 @@
+import { ipcRenderer } from 'electron';
+
+function dialogSelectFile(
+  config: Electron.OpenDialogOptions
+): Promise<Electron.OpenDialogReturnValue> {
+  return ipcRenderer.invoke('dialog:selectFile', config);
+}
+
+const electronApi = {
+  dialogSelectFile,
+};
+
+export type ElectronApi = typeof electronApi;
+
+export default electronApi;

+ 9 - 0
electron/preload/apiNode.ts

@@ -0,0 +1,9 @@
+import { readFileSync } from 'node:fs';
+
+const nodeApi = {
+  readFileSync,
+};
+
+export type NodeApi = typeof nodeApi;
+
+export default nodeApi;

+ 4 - 3
electron/preload/index.d.ts

@@ -1,8 +1,9 @@
-import { ElectronAPI } from '@electron-toolkit/preload';
+import type { ElectronApi } from './apiElectron';
+import type { NodeApi } from './apiNode';
 
 declare global {
   interface Window {
-    electron: ElectronAPI;
-    api: unknown;
+    electron: ElectronApi;
+    node: NodeApi;
   }
 }

+ 6 - 8
electron/preload/index.ts

@@ -1,22 +1,20 @@
 import { contextBridge } from 'electron';
-import { electronAPI } from '@electron-toolkit/preload';
-
-// Custom APIs for renderer
-const api = {};
+import electronApi from './apiElectron';
+import nodeApi from './apiNode';
 
 // Use `contextBridge` APIs to expose Electron APIs to
 // renderer only if context isolation is enabled, otherwise
 // just add to the DOM global.
 if (process.contextIsolated) {
   try {
-    contextBridge.exposeInMainWorld('electron', electronAPI);
-    contextBridge.exposeInMainWorld('api', api);
+    contextBridge.exposeInMainWorld('electron', electronApi);
+    contextBridge.exposeInMainWorld('node', nodeApi);
   } catch (error) {
     console.error(error);
   }
 } else {
   // @ts-ignore (define in dts)
-  window.electron = electronAPI;
+  window.electron = electronApi;
   // @ts-ignore (define in dts)
-  window.api = api;
+  window.node = nodeApi;
 }

+ 3 - 3
index.html

@@ -3,11 +3,11 @@
 
 <head>
   <meta charset="UTF-8" />
-  <link rel="shortcut icon" type="image/x-icon"
-    href="https://unpkg.byted-static.com/latest/byted/arco-config/assets/favicon.ico">
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <meta http-equiv="Content-Security-Policy"
+    content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:" />
   <title>
-    arco-test
+    mark-tool
   </title>
 </head>
 

+ 3 - 2
package.json

@@ -6,8 +6,8 @@
   "author": "chulinice",
   "license": "MIT",
   "scripts": {
-    "start": "electron-vite preview",
-    "dev": "electron-vite dev",
+    "start": "electron-vite dev",
+    "dev": "electron-vite dev --watch",
     "format": "prettier --write .",
     "report": "cross-env REPORT=true npm run build",
     "preview": "npm run build && vite preview --host",
@@ -45,6 +45,7 @@
     "axios": "^0.24.0",
     "crypto-js": "^4.2.0",
     "dayjs": "^1.11.5",
+    "gm": "^1.25.0",
     "js-md5": "^0.8.3",
     "lodash": "^4.17.21",
     "mitt": "^3.0.0",

+ 29 - 7
pnpm-lock.yaml

@@ -45,6 +45,7 @@ specifiers:
   eslint-plugin-import: ^2.26.0
   eslint-plugin-prettier: ^4.2.1
   eslint-plugin-vue: ^9.20.1
+  gm: ^1.25.0
   husky: ^8.0.1
   js-md5: ^0.8.3
   less: ^4.1.3
@@ -81,6 +82,7 @@ dependencies:
   axios: 0.24.0
   crypto-js: 4.2.0
   dayjs: 1.11.11
+  gm: 1.25.0
   js-md5: 0.8.3
   lodash: 4.17.21
   mitt: 3.0.1
@@ -2392,6 +2394,14 @@ packages:
       is-string: 1.0.7
     dev: true
 
+  /array-parallel/0.1.3:
+    resolution: {integrity: sha512-TDPTwSWW5E4oiFiKmz6RGJ/a80Y91GuLgUYuLd49+XBS75tYo8PNgaT2K/OxuQYqkoI852MDGBorg9OcUSTQ8w==}
+    dev: false
+
+  /array-series/0.1.5:
+    resolution: {integrity: sha512-L0XlBwfx9QetHOsbLDrE/vh2t018w9462HM3iaFfxRiK83aJjAt/Ja3NMkOW7FICwWTlQBa3ZbL5FKhuQWkDrg==}
+    dev: false
+
   /array-union/2.1.0:
     resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
     engines: {node: '>=8'}
@@ -3104,6 +3114,13 @@ packages:
       cross-spawn: 7.0.3
     dev: true
 
+  /cross-spawn/4.0.2:
+    resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==}
+    dependencies:
+      lru-cache: 4.1.5
+      which: 1.3.1
+    dev: false
+
   /cross-spawn/5.1.0:
     resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==}
     dependencies:
@@ -3241,7 +3258,6 @@ packages:
         optional: true
     dependencies:
       ms: 2.1.3
-    dev: true
 
   /debug/4.3.4:
     resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
@@ -5015,6 +5031,18 @@ packages:
       slash: 3.0.0
     dev: true
 
+  /gm/1.25.0:
+    resolution: {integrity: sha512-4kKdWXTtgQ4biIo7hZA396HT062nDVVHPjQcurNZ3o/voYN+o5FUC5kOwuORbpExp3XbTJ3SU7iRipiIhQtovw==}
+    engines: {node: '>=14'}
+    dependencies:
+      array-parallel: 0.1.3
+      array-series: 0.1.5
+      cross-spawn: 4.0.2
+      debug: 3.2.7
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /gopd/1.0.1:
     resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
     dependencies:
@@ -5687,7 +5715,6 @@ packages:
 
   /isexe/2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-    dev: true
 
   /isurl/1.0.0:
     resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
@@ -6058,7 +6085,6 @@ packages:
     dependencies:
       pseudomap: 1.0.2
       yallist: 2.1.2
-    dev: true
 
   /lru-cache/5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@@ -6330,7 +6356,6 @@ packages:
 
   /ms/2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-    dev: true
 
   /muggle-string/0.3.1:
     resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==}
@@ -6964,7 +6989,6 @@ packages:
 
   /pseudomap/1.0.2:
     resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
-    dev: true
 
   /pump/3.0.0:
     resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
@@ -8430,7 +8454,6 @@ packages:
     hasBin: true
     dependencies:
       isexe: 2.0.0
-    dev: true
 
   /which/2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
@@ -8488,7 +8511,6 @@ packages:
 
   /yallist/2.1.2:
     resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
-    dev: true
 
   /yallist/3.1.1:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}

+ 1 - 1
src/hooks/sms.ts

@@ -7,7 +7,7 @@ export default function useSms(name = 'sms') {
   const isFetchingCode = ref(false);
   const codeContent = ref('获取验证码');
   const nameWaitTime = ref('');
-  let tSetT: NodeJS.Timer | null = null;
+  let tSetT: NodeJS.Timeout | null = null;
 
   function setWaitingTime(wt: string) {
     nameWaitTime.value = wt;

+ 1 - 0
src/router/constants.ts

@@ -9,5 +9,6 @@ export const DEFAULT_ROUTE_NAME = 'Workplace';
 export const WHITE_LIST = [
   NOT_FOUND,
   { name: 'Login' },
+  { name: 'TestPage' },
   { name: HOME_PAGE_ROUTE },
 ];

+ 1 - 1
src/router/index.ts

@@ -13,7 +13,7 @@ const router = createRouter({
   routes: [
     {
       path: '/',
-      redirect: { name: 'Login' },
+      redirect: { name: 'TestPage' },
     },
     ...appRoutes,
     ...appExternalRoutes,

+ 9 - 0
src/router/routes/modules/login.ts

@@ -13,6 +13,15 @@ const LOGIN: AppRouteRecordRaw = {
         requiresAuth: false,
       },
     },
+    {
+      path: 'test-page',
+      name: 'TestPage',
+      component: () => import('@/views/login/test-page/index.vue'),
+      meta: {
+        title: '功能测试',
+        requiresAuth: false,
+      },
+    },
   ],
 };
 

+ 23 - 0
src/views/login/test-page/index.vue

@@ -0,0 +1,23 @@
+<template>
+  <div>
+    <h1>TestPage1</h1>
+    <a-button type="primary" @click="toOpenFile">打开文件</a-button>
+  </div>
+</template>
+
+<script setup lang="ts">
+  defineOptions({
+    name: 'TestPage',
+  });
+
+  async function toOpenFile() {
+    const res = await window.electron.dialogSelectFile({
+      title: '选择文件',
+      filters: [{ name: 'Images', extensions: ['jpg', 'png'] }],
+    });
+    console.log(res);
+
+    const info = window.node.readFileSync(res.filePaths[0]);
+    console.log(info);
+  }
+</script>

+ 9 - 0
src/views/track/index.vue

@@ -0,0 +1,9 @@
+<template>
+  <div></div>
+</template>
+
+<script setup lang="ts">
+  defineOptions({
+    name: 'TrackImg',
+  });
+</script>

+ 9 - 0
src/views/track/readme.md

@@ -0,0 +1,9 @@
+# 计划
+
+- sqlite3
+- model/db
+- api
+- page view set
+- gm-imagemagic
+- task build
+- process manange

+ 1 - 0
tsconfig.node.json

@@ -7,6 +7,7 @@
   ],
   "compilerOptions": {
     "composite": true,
+    "noUnusedParameters": false,
     "types": [
       "electron-vite/node"
     ]

+ 1 - 1
tsconfig.web.json

@@ -23,9 +23,9 @@
   },
   "include": [
     "src/env.d.ts",
+    "electron/preload/index.d.ts",
     "src/**/*",
     "src/**/*.vue",
-    "electron/preload/*.d.ts"
   ],
   "exclude": [
     "node_modules",