Преглед изворни кода

feat: 日志以及异步任务进度完成

zhangjie пре 7 месеци
родитељ
комит
a228d8465b

+ 2 - 1
.gitignore

@@ -4,4 +4,5 @@ dist
 out
 *.local
 *.exe
-package-lock.json
+package-lock.json
+logs

+ 1 - 1
package.json

@@ -23,6 +23,7 @@
     "core-js": "^3.32.2",
     "crypto-js": "^4.2.0",
     "echarts": "^5.5.1",
+    "electron-log": "^5.2.0",
     "element-resize-detector": "^1.2.4",
     "ini-parser": "^0.0.2",
     "less": "^4.2.0",
@@ -61,7 +62,6 @@
     "electron": "^26.2.1",
     "electron-builder": "^24.6.4",
     "electron-devtools-installer": "^3.1.1",
-    "electron-log": "^4.2.4",
     "esbuild-loader": "^4.0.2",
     "node-loader": "^1.0.1",
     "ora": "^5.1.0",

+ 12 - 5
pnpm-lock.yaml

@@ -28,12 +28,13 @@ specifiers:
   electron: ^26.2.1
   electron-builder: ^24.6.4
   electron-devtools-installer: ^3.1.1
-  electron-log: ^4.2.4
+  electron-log: ^5.2.0
   element-resize-detector: ^1.2.4
   esbuild-loader: ^4.0.2
   ini-parser: ^0.0.2
   less: ^4.2.0
   lodash-es: ^4.17.21
+  mitt: ^3.0.1
   mockjs: ^1.1.0
   node-loader: ^1.0.1
   ora: ^5.1.0
@@ -68,10 +69,12 @@ dependencies:
   core-js: 3.38.1
   crypto-js: 4.2.0
   echarts: 5.5.1
+  electron-log: 5.2.0
   element-resize-detector: 1.2.4
   ini-parser: 0.0.2
   less: 4.2.0
   lodash-es: 4.17.21
+  mitt: 3.0.1
   mockjs: 1.1.0
   pinia: 2.2.2_typescript@5.5.4+vue@3.5.0
   pinia-plugin-persistedstate: 3.2.3_pinia@2.2.2
@@ -105,7 +108,6 @@ devDependencies:
   electron: 26.6.10
   electron-builder: 24.13.3_wzienukq3np7qiinasrzphe3ja
   electron-devtools-installer: 3.2.0
-  electron-log: 4.4.8
   esbuild-loader: 4.2.2_webpack@5.94.0
   node-loader: 1.0.3_webpack@5.94.0
   ora: 5.4.1
@@ -4551,9 +4553,10 @@ packages:
       unzip-crx-3: 0.2.0
     dev: true
 
-  /electron-log/4.4.8:
-    resolution: {integrity: sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA==}
-    dev: true
+  /electron-log/5.2.0:
+    resolution: {integrity: sha512-VjLkvaLmbP3AOGOh5Fob9M8bFU0mmeSAb5G2EoTBx+kQLf2XA/0byzjsVGBTHhikbT+m1AB27NEQUv9wX9nM8w==}
+    engines: {node: '>= 14'}
+    dev: false
 
   /electron-publish/24.13.1:
     resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==}
@@ -6220,6 +6223,10 @@ packages:
       yallist: 4.0.0
     dev: true
 
+  /mitt/3.0.1:
+    resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+    dev: false
+
   /mkdirp/0.5.6:
     resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
     hasBin: true

+ 63 - 46
src/main/index.ts

@@ -6,15 +6,32 @@ import installExtension, { VUEJS3_DEVTOOLS } from "electron-devtools-installer";
 import { exec } from "child_process";
 import process from "process";
 import IniParser from "ini-parser";
+import logger from "./logger";
 
 const isDev = process.env.NODE_ENV === "development";
 let win: BrowserWindow | null = null;
 let loadWin: any = null;
 const additionalData = { lockKey: "scanAdmin" };
 const gotTheLock = app.requestSingleInstanceLock(additionalData);
-console.log("gotTheLock", gotTheLock);
+logger.info(`gotTheLock:${gotTheLock}`);
 if (!gotTheLock) {
+  logger.info(`app quit => gotTheLock:${gotTheLock}`);
   app.quit();
+} else {
+  app.on("ready", async () => {
+    if (isDev) {
+      try {
+        await installExtension(VUEJS3_DEVTOOLS);
+      } catch (e: any) {
+        console.error("Vue Devtools failed to install:", e.toString());
+      }
+    }
+
+    logger.info(`app ready`);
+    registEvent();
+
+    createWin();
+  });
 }
 
 function createWin() {
@@ -97,24 +114,6 @@ function createLoadWin() {
 //       createLoadWin();
 //     });
 
-ipcMain.on("change-win-size", (event, args: string) => {
-  // const { width, height } = screen.getPrimaryDisplay().workAreaSize;
-  if (!win) return;
-  const windowBounds = win.getBounds();
-  const { width, height } =
-    screen.getDisplayMatching(windowBounds).workAreaSize;
-
-  let w = args === "big" ? width : 840;
-  let h = args === "big" ? height : 500;
-  if (args === "small") {
-    win.setMinimumSize(w, h);
-  }
-  win.setSize(w, h);
-  win.center();
-});
-ipcMain.on("window-min", () => {
-  win?.minimize();
-});
 const isRunning = (query: string, cb: Function) => {
   exec(
     "cmd /c chcp 65001>nul && tasklist /FO CSV",
@@ -127,6 +126,8 @@ const isRunning = (query: string, cb: Function) => {
 function watchClientIsRunning(times = 10) {
   setTimeout(() => {
     isRunning("client.exe", (status: boolean) => {
+      logger.info(`watchClientIsRunning times:${times},status:${status}`);
+
       if (status) {
         if (times > 0) {
           watchClientIsRunning(times--);
@@ -139,7 +140,7 @@ function watchClientIsRunning(times = 10) {
 }
 
 function startExe(exePath: string) {
-  console.log("主进程接收到的exe路径:", exePath);
+  logger.info("主进程接收到的exe路径:", exePath);
   let checkPath = exePath.includes(".exe ")
     ? exePath.split(".exe ")[0] + ".exe"
     : exePath;
@@ -150,6 +151,12 @@ function startExe(exePath: string) {
     //   win?.show();
     // });
     exec(exePath, (error, stdout, stderr) => {
+      if (error) {
+        logger.error(`client error:${error.toString()}`);
+        return;
+      }
+      logger.info(`client closed stdout:${stdout.toString()}`);
+      logger.info(`client closed stderr:${stderr.toString()}`);
       console.log("子进程关闭了!");
       watchClientIsRunning();
     });
@@ -158,31 +165,41 @@ function startExe(exePath: string) {
   }
 }
 
-ipcMain.on("startExe", (event, args: string) => {
-  startExe(args);
-});
-
-ipcMain.on("hide-app", () => {
-  win?.hide();
-});
-
-ipcMain.on("get-page-size-ini", (event: any) => {
-  const appPath = isDev ? process.cwd() : path.dirname(app.getPath("exe"));
-  const iniFilePath = path.resolve(appPath, "page_size.ini");
-  fs.readFile(iniFilePath, "utf8", (err: any, data: any) => {
-    if (err) dialog.showErrorBox("tip", `page_size.ini文件不存在!`);
-    const content = IniParser.parse(data);
-    event.sender.send("got-page-size-ini", content);
+function registEvent() {
+  ipcMain.on("change-win-size", (event, args: string) => {
+    // const { width, height } = screen.getPrimaryDisplay().workAreaSize;
+    if (!win) return;
+    const windowBounds = win.getBounds();
+    const { width, height } =
+      screen.getDisplayMatching(windowBounds).workAreaSize;
+
+    let w = args === "big" ? width : 840;
+    let h = args === "big" ? height : 500;
+    if (args === "small") {
+      win.setMinimumSize(w, h);
+    }
+    win.setSize(w, h);
+    win.center();
+  });
+  ipcMain.on("window-min", () => {
+    win?.minimize();
   });
-});
 
-app.on("ready", async () => {
-  if (isDev) {
-    try {
-      await installExtension(VUEJS3_DEVTOOLS);
-    } catch (e: any) {
-      console.error("Vue Devtools failed to install:", e.toString());
-    }
-  }
-  createWin();
-});
+  ipcMain.on("startExe", (event, args: string) => {
+    startExe(args);
+  });
+
+  ipcMain.on("hide-app", () => {
+    win?.hide();
+  });
+
+  ipcMain.on("get-page-size-ini", (event: any) => {
+    const appPath = isDev ? process.cwd() : path.dirname(app.getPath("exe"));
+    const iniFilePath = path.resolve(appPath, "page_size.ini");
+    fs.readFile(iniFilePath, "utf8", (err: any, data: any) => {
+      if (err) dialog.showErrorBox("tip", `page_size.ini文件不存在!`);
+      const content = IniParser.parse(data);
+      event.sender.send("got-page-size-ini", content);
+    });
+  });
+}

+ 15 - 0
src/main/logger.ts

@@ -0,0 +1,15 @@
+import log from "electron-log/main";
+import path from "node:path";
+
+export function getRootDir() {
+  return process.env.NODE_ENV === "development"
+    ? path.join(__dirname, "../")
+    : path.join(__dirname, "../../../");
+}
+
+log.initialize();
+log.transports.console.level = false;
+log.transports.file.resolvePathFn = () =>
+  path.join(getRootDir(), "logs/main.log");
+
+export default log;

+ 2 - 2
src/render/views/AbsentCheck/CheckAction.vue

@@ -108,9 +108,9 @@
   <!-- ExportTypeDialog -->
   <ExportTypeDialog ref="exportTypeDialogRef" @confirm="onExportConfirm" />
   <!-- ResetDialog -->
-  <ResetDialog ref="resetDialogRef" />
+  <ResetDialog ref="resetDialogRef" @finished="onSearch" />
   <!-- ImportTypeDialog -->
-  <ImportTypeDialog ref="importTypeDialogRef" />
+  <ImportTypeDialog ref="importTypeDialogRef" @finished="onSearch" />
   <!-- MoreExamNumberDialog -->
   <MoreExamNumberDialog
     ref="moreExamNumberDialogRef"

+ 13 - 1
src/render/views/AbsentCheck/ImportTypeDialog.vue

@@ -70,7 +70,11 @@
   </a-modal>
 
   <!-- TaskProgressDialog -->
-  <TaskProgressDialog ref="taskProgressDialogRef" :task="curExportTask" />
+  <TaskProgressDialog
+    ref="taskProgressDialogRef"
+    :task="curExportTask"
+    @finished="importFinished"
+  />
 </template>
 
 <script setup lang="ts">
@@ -99,6 +103,8 @@ defineOptions({
 const { visible, open, close } = useModal();
 defineExpose({ open, close });
 
+const emit = defineEmits(["finished"]);
+
 const userStore = useUserStore();
 
 const uploadUrl = "/api/admin/check/exam-status/import";
@@ -145,6 +151,12 @@ function uploadSuccessHandle(res: { taskId: string }) {
   };
   taskProgressDialogRef.value?.open();
 }
+
+function importFinished() {
+  message.success("导入成功!");
+  emit("finished");
+  close();
+}
 </script>
 
 <style lang="less" scoped>

+ 14 - 2
src/render/views/AbsentCheck/ResetDialog.vue

@@ -36,7 +36,11 @@
   </a-modal>
 
   <!-- TaskProgressDialog -->
-  <TaskProgressDialog ref="taskProgressDialogRef" :task="curExportTask" />
+  <TaskProgressDialog
+    ref="taskProgressDialogRef"
+    :task="curExportTask"
+    @finished="resetFinished"
+  />
 </template>
 
 <script setup lang="ts">
@@ -52,13 +56,15 @@ import { message } from "@qmth/ui";
 import TaskProgressDialog from "../ResultExport/TaskProgressDialog.vue";
 
 defineOptions({
-  name: "ImportTypeDialog",
+  name: "ResetDialog",
 });
 
 /* modal */
 const { visible, open, close } = useModal();
 defineExpose({ open, close });
 
+const emit = defineEmits(["finished"]);
+
 const userStore = useUserStore();
 
 const examNumberFillCount = ref<number>();
@@ -90,6 +96,12 @@ async function confirm() {
   taskProgressDialogRef.value?.open();
 }
 
+function resetFinished() {
+  message.success("重置成功!");
+  emit("finished");
+  close();
+}
+
 watch(
   () => visible.value,
   (val) => {

+ 5 - 1
src/render/views/ResultExport/StudentStatus.vue

@@ -41,7 +41,11 @@
   </ImportDialog>
 
   <!-- TaskProgressDialog -->
-  <TaskProgressDialog ref="taskProgressDialogRef" :task="curExportTask" />
+  <TaskProgressDialog
+    ref="taskProgressDialogRef"
+    :task="curExportTask"
+    @finished="getData"
+  />
 </template>
 
 <script setup lang="ts">

+ 1 - 1
src/render/views/ResultExport/TaskProgressDialog.vue

@@ -84,11 +84,11 @@ async function getProgress() {
   // 文件生成成功,开始下载
   if (result.status === "SUCCESS") {
     stop();
-    emit("finished");
     if (props.downloadHandle) {
       await props.downloadHandle();
     }
 
+    emit("finished");
     delayClose();
   }
 }