From 15a7d115cbb8c13826dd1838e6e6063049863aee Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Mon, 9 Mar 2026 07:39:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=80=E5=85=B3=E6=88=BF=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- forge.config.ts | 7 ++ package-lock.json | 7 +- package.json | 1 - src/main/process/runTaskOperationService.ts | 15 ++++- src/main/scripts/common/checkLoginStatus.js | 2 + src/main/scripts/fg_trace.js | 37 +++++++++-- src/main/utils/checkLoginStatus.ts | 31 --------- src/main/utils/chrome/launchLocalChrome.ts | 2 +- src/renderer/api/typeMapping.ts | 44 ++----------- src/renderer/api/types.ts | 24 +++---- .../home/components/TaskOperationDialog.vue | 65 +++++++++++++------ tsconfig.app.json | 4 +- tsconfig.json | 3 +- 13 files changed, 119 insertions(+), 123 deletions(-) create mode 100644 src/main/scripts/common/checkLoginStatus.js delete mode 100644 src/main/utils/checkLoginStatus.ts diff --git a/forge.config.ts b/forge.config.ts index 6c8448b..ff10a7f 100644 --- a/forge.config.ts +++ b/forge.config.ts @@ -57,6 +57,13 @@ const config: ForgeConfig = { }), ], hooks: { + async packageAfterCopy(forgeConfig, buildPath, electronVersion, platform, arch) { + const src = path.join(__dirname, 'src/main/scripts'); + const dest = path.join(buildPath, 'resources', 'scripts'); + await fs.ensureDir(dest); + await fs.copy(src, dest); + }, + async prePackage() { const outDir = path.resolve(process.cwd(), 'out'); fs.rmSync(outDir, { recursive: true, force: true }); diff --git a/package-lock.json b/package-lock.json index f0d81b9..5296657 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "crypto": "^1.0.1", "crypto-js": "^4.2.0", "dexie": "^4.2.1", - "dotenv": "^17.2.3", "dotenv-cli": "^11.0.0", "electron-log": "^5.4.3", "electron-squirrel-startup": "^1.0.1", @@ -4957,9 +4956,9 @@ } }, "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", "license": "BSD-2-Clause", "engines": { "node": ">=12" diff --git a/package.json b/package.json index bfb3481..2858272 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "crypto": "^1.0.1", "crypto-js": "^4.2.0", "dexie": "^4.2.1", - "dotenv": "^17.2.3", "dotenv-cli": "^11.0.0", "electron-log": "^5.4.3", "electron-squirrel-startup": "^1.0.1", diff --git a/src/main/process/runTaskOperationService.ts b/src/main/process/runTaskOperationService.ts index d1c32d2..f3aa71a 100644 --- a/src/main/process/runTaskOperationService.ts +++ b/src/main/process/runTaskOperationService.ts @@ -1,9 +1,10 @@ -import { ipcMain } from 'electron'; +import { ipcMain, app } from 'electron'; import { IPC_EVENTS } from '@common/constants'; import { launchLocalChrome } from '@main/utils/chrome/launchLocalChrome' import { executeScriptService } from '@main/service/execute-script-service'; import path from 'path' +import log from 'electron-log'; export function runTaskOperationService() { const executeScriptServiceInstance = new executeScriptService(); @@ -19,7 +20,17 @@ export function runTaskOperationService() { */ await launchLocalChrome(options) - const result = await executeScriptServiceInstance.executeScript(path.join(__dirname, '../../scripts/fg_trace.js'), options) + + // 脚本路径处理 + let scriptPath = '' + if (app.isPackaged) { + scriptPath = path.join(process.resourcesPath, 'scripts/fg_trace.js') + } else { + scriptPath = path.join(process.cwd(), 'src/main/scripts/fg_trace.js') + } + + log.info(`Launching script with path: ${scriptPath}`); + const result = await executeScriptServiceInstance.executeScript(scriptPath, options) return { success: true, result }; } catch (error: any) { diff --git a/src/main/scripts/common/checkLoginStatus.js b/src/main/scripts/common/checkLoginStatus.js new file mode 100644 index 0000000..f6f6364 --- /dev/null +++ b/src/main/scripts/common/checkLoginStatus.js @@ -0,0 +1,2 @@ +import log from 'electron-log'; + diff --git a/src/main/scripts/fg_trace.js b/src/main/scripts/fg_trace.js index 0128f42..09f690e 100644 --- a/src/main/scripts/fg_trace.js +++ b/src/main/scripts/fg_trace.js @@ -1,9 +1,36 @@ import { chromium } from 'playwright'; -import { checkLoginStatus } from '@utils/checkLoginStatus'; -import dotenv from 'dotenv'; import log from 'electron-log'; -dotenv.config(); + +const checkLoginStatus = async (page) => { + try { + const currentUrl = await page.url(); + + log.info('current url==========>:', currentUrl); + + const loginPagePatterns = ['/login', '/signin', '/auth']; + const isLoginPage = loginPagePatterns.some(pattern => currentUrl.includes(pattern)); + + if(!isLoginPage) { + return true; + } + + // 检查页面内容中的关键字 + const pageContent = await page.content(); + const loginKeywords = ['退出', '房价房量管理']; + const hasLoginKeyword = loginKeywords.some(keyword => + pageContent.includes(keyword) + ); + + if (hasLoginKeyword) { + return true; + } + + return false; + } catch (error) { + return false; + } +} (async () => { const browser = await chromium.connectOverCDP('http://localhost:9222'); @@ -24,13 +51,13 @@ dotenv.config(); if(!isLogin) { await page.getByRole('textbox', { name: '请输入账号' }).dblclick(); await page.getByRole('textbox', { name: '请输入账号' }).click(); - await page.getByRole('textbox', { name: '请输入账号' }).fill(process.env.FZ_USERNAME, { delay: 80 + Math.random() * 120 }); + await page.getByRole('textbox', { name: '请输入账号' }).fill('hoteltmwq123', { delay: 80 + Math.random() * 120 }); await page.waitForTimeout(1000 + Math.random() * 1000); await page.getByRole('button', { name: '下一步' }).click(); const frame_1 = await page.frameLocator('#alibaba-login-box'); await page.locator('#alibaba-login-box').contentFrame().getByRole('textbox', { name: '请输入登录密码' }).dblclick(); - await page.locator('#alibaba-login-box').contentFrame().getByRole('textbox', { name: '请输入登录密码' }).fill(process.env.FZ_PASSWORD, { delay: 80 + Math.random() * 120 }); + await page.locator('#alibaba-login-box').contentFrame().getByRole('textbox', { name: '请输入登录密码' }).fill('Tmwq654321', { delay: 80 + Math.random() * 120 }); await page.waitForTimeout(1000 + Math.random() * 1000); await page.locator('#alibaba-login-box').contentFrame().getByRole('button', { name: '登录' }).click(); diff --git a/src/main/utils/checkLoginStatus.ts b/src/main/utils/checkLoginStatus.ts deleted file mode 100644 index 8eadde1..0000000 --- a/src/main/utils/checkLoginStatus.ts +++ /dev/null @@ -1,31 +0,0 @@ -import log from 'electron-log'; - -export const checkLoginStatus = async (page: any) => { - try { - const currentUrl = await page.url(); - - log.info('current url==========>:', currentUrl); - - const loginPagePatterns = ['/login', '/signin', '/auth']; - const isLoginPage = loginPagePatterns.some(pattern => currentUrl.includes(pattern)); - - if(!isLoginPage) { - return true; - } - - // 检查页面内容中的关键字 - const pageContent = await page.content(); - const loginKeywords = ['退出', '房价房量管理']; - const hasLoginKeyword = loginKeywords.some(keyword => - pageContent.includes(keyword) - ); - - if (hasLoginKeyword) { - return true; - } - - return false; - } catch (error) { - return false; - } -} \ No newline at end of file diff --git a/src/main/utils/chrome/launchLocalChrome.ts b/src/main/utils/chrome/launchLocalChrome.ts index 63ee08d..f302db9 100644 --- a/src/main/utils/chrome/launchLocalChrome.ts +++ b/src/main/utils/chrome/launchLocalChrome.ts @@ -11,7 +11,7 @@ export async function launchLocalChrome (options: any) { // 多账号隔离 // const profileDir = getProfileDir(accountId); - log.info(`Launching Chrome with user data dir: ${options}`); + // log.info(`Launching Chrome with user data dir: ${options}`); // 检查端口是否被占用 const portInUse = await isPortInUse(9222); diff --git a/src/renderer/api/typeMapping.ts b/src/renderer/api/typeMapping.ts index 6a8ae53..f72f156 100644 --- a/src/renderer/api/typeMapping.ts +++ b/src/renderer/api/typeMapping.ts @@ -4,15 +4,15 @@ import request from '@utils/request'; import * as API from './types'; -/** 新增房型映射 新增房型映射新增房型映射 POST /hotelStaff/typeMapping/add */ -export function hotelStaffTypeMappingAddUsingPost({ +/** 查询房型映射列表 查询房型映射列表查询房型映射列表 POST /hotelStaff/typeMapping/list */ +export function hotelStaffTypeMappingListUsingPost({ body, options, }: { body: API.RoomTypeMapping; options?: { [key: string]: unknown }; }) { - return request('/hotelStaff/typeMapping/add', { + return request('/hotelStaff/typeMapping/list', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -22,25 +22,7 @@ export function hotelStaffTypeMappingAddUsingPost({ }); } -/** 获取房型映射详细信息 获取房型映射详细信息获取房型映射详细信息 POST /hotelStaff/typeMapping/getInfo */ -export function hotelStaffTypeMappingGetInfoUsingPost({ - body, - options, -}: { - body: API.RoomTypeMapping; - options?: { [key: string]: unknown }; -}) { - return request('/hotelStaff/typeMapping/getInfo', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - -/** 查询房型映射列表 查询房型映射列表查询房型映射列表 POST /hotelStaff/typeMapping/pageList */ +/** 分页查询房型映射列表 查询房型映射列表查询房型映射列表 POST /hotelStaff/typeMapping/pageList */ export function hotelStaffTypeMappingPageListUsingPost({ body, options, @@ -58,24 +40,6 @@ export function hotelStaffTypeMappingPageListUsingPost({ }); } -/** 删除房型映射 删除房型映射删除房型映射 POST /hotelStaff/typeMapping/remove */ -export function hotelStaffTypeMappingRemoveUsingPost({ - body, - options, -}: { - body: API.RoomTypeMapping; - options?: { [key: string]: unknown }; -}) { - return request('/hotelStaff/typeMapping/remove', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - /** 修改房型映射 修改房型映射修改房型映射 POST /hotelStaff/typeMapping/update */ export function hotelStaffTypeMappingUpdateUsingPost({ body, diff --git a/src/renderer/api/types.ts b/src/renderer/api/types.ts index 76cca66..f41880a 100644 --- a/src/renderer/api/types.ts +++ b/src/renderer/api/types.ts @@ -40,22 +40,14 @@ export type HotelStaffPcUserUpdatePasswordUsingPostResponses = { 200: RBoolean; }; -export type HotelStaffTypeMappingAddUsingPostResponses = { - 200: RBoolean; -}; - -export type HotelStaffTypeMappingGetInfoUsingPostResponses = { - 200: RRoomTypeMapping; +export type HotelStaffTypeMappingListUsingPostResponses = { + 200: RListRoomTypeMapping; }; export type HotelStaffTypeMappingPageListUsingPostResponses = { 200: RPageRoomTypeMapping; }; -export type HotelStaffTypeMappingRemoveUsingPostResponses = { - 200: RBoolean; -}; - export type HotelStaffTypeMappingUpdateUsingPostResponses = { 200: RBoolean; }; @@ -148,6 +140,12 @@ export type RListPcConfigChannel = { data?: PcConfigChannel[]; }; +export type RListRoomTypeMapping = { + code?: number; + msg?: string; + data?: RoomTypeMapping[]; +}; + export type RoomTypeMapping = { /** 创建者创建人 */ createBy?: string; @@ -187,12 +185,6 @@ export type RPageRoomTypeMapping = { data?: PageRoomTypeMapping; }; -export type RRoomTypeMapping = { - code?: number; - msg?: string; - data?: RoomTypeMapping; -}; - export type UpdatePasswordForm = { /** 旧密码 */ oldPassword?: string; diff --git a/src/renderer/views/home/components/TaskOperationDialog.vue b/src/renderer/views/home/components/TaskOperationDialog.vue index 7ede35a..4414225 100644 --- a/src/renderer/views/home/components/TaskOperationDialog.vue +++ b/src/renderer/views/home/components/TaskOperationDialog.vue @@ -3,12 +3,11 @@ - - + - - + @@ -24,30 +23,37 @@