1
1
mirror of https://github.com/KenanZhu/AutoLibrary.git synced 2026-06-18 15:33:03 +08:00

Compare commits

...

2 Commits

Author SHA1 Message Date
KenanZhu 189fddfb6a fix(LibReserve): more fast operations of reserve 2025-11-28 14:46:17 +08:00
KenanZhu c2d53a8b78 chore(*): refactor the project structure 2025-11-25 08:48:18 +08:00
30 changed files with 136 additions and 51 deletions
+6 -6
View File
@@ -8,10 +8,10 @@ build/
dist/ dist/
model/*.onnx model/*.onnx
driver/*.exe driver/*.exe
gui/configs/*.json src/gui/configs/*.json
gui/translators/qtbase_zh_CN.qm src/gui/translators/qtbase_zh_CN.qm
gui/AutoLibraryResources.py src/gui/AutoLibraryResources.py
gui/AutoLibraryResource.py src/gui/AutoLibraryResource.py
gui/Ui_ALMainWindow.py src/gui/Ui_ALMainWindow.py
gui/Ui_ALConfigWidget.py src/gui/Ui_ALConfigWidget.py
Main.spec Main.spec
+1 -2
View File
@@ -1,6 +1,5 @@
# AutoLibrary # AutoLibrary
请访问[AutoLibrary 网站](http://autolibrary.cv) 请访问[AutoLibrary 网站](http://autolibrary.cv)\
Please access the [AutoLibrary Website](http://autolibrary.cv) Please access the [AutoLibrary Website](http://autolibrary.cv)
BIN
View File
Binary file not shown.
View File
+1 -1
View File
@@ -9,7 +9,7 @@ See the LICENSE file for details.
""" """
import queue import queue
from MsgBase import MsgBase from base.MsgBase import MsgBase
class LibOperator(MsgBase): class LibOperator(MsgBase):
View File
+8
View File
@@ -0,0 +1,8 @@
"""
Base module for the AutoLibrary project.
Here are the classes and modules in this package:
- MsgBase: Base class for messages.\
- LibOperator: Base class for library operators.
"""
@@ -18,12 +18,12 @@ from PySide6.QtWidgets import (
) )
from PySide6.QtGui import QCloseEvent from PySide6.QtGui import QCloseEvent
from .Ui_ALConfigWidget import Ui_ALConfigWidget from gui.Ui_ALConfigWidget import Ui_ALConfigWidget
from .SeatMapWidget import SeatMapWidget from gui.SeatMapWidget import SeatMapWidget
from .SeatMapTable import seats_maps from gui.SeatMapTable import seats_maps
from ConfigReader import ConfigReader from utils.ConfigReader import ConfigReader
from ConfigWriter import ConfigWriter from utils.ConfigWriter import ConfigWriter
class ALConfigWidget(QWidget, Ui_ALConfigWidget): class ALConfigWidget(QWidget, Ui_ALConfigWidget):
@@ -27,8 +27,8 @@ from .ALConfigWidget import ALConfigWidget
from . import AutoLibraryResource from . import AutoLibraryResource
from AutoLib import AutoLib from operators.AutoLib import AutoLib
from ConfigReader import ConfigReader from utils.ConfigReader import ConfigReader
class AutoLibWorker(QThread): class AutoLibWorker(QThread):
@@ -18,7 +18,7 @@ from PySide6.QtWidgets import (
from PySide6.QtGui import ( from PySide6.QtGui import (
QPainter, QWheelEvent, QCloseEvent QPainter, QWheelEvent, QCloseEvent
) )
from .SeatFrame import SeatFrame from gui.SeatFrame import SeatFrame
class SeatMapWidget(QWidget): class SeatMapWidget(QWidget):

Before

Width:  |  Height:  |  Size: 785 KiB

After

Width:  |  Height:  |  Size: 785 KiB

+7 -7
View File
@@ -16,14 +16,14 @@ from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.service import Service
from MsgBase import MsgBase from base.MsgBase import MsgBase
from LibChecker import LibChecker from operators.LibChecker import LibChecker
from LibLogin import LibLogin from operators.LibLogin import LibLogin
from LibLogout import LibLogout from operators.LibLogout import LibLogout
from LibReserve import LibReserve from operators.LibReserve import LibReserve
from LibCheckin import LibCheckin from operators.LibCheckin import LibCheckin
from ConfigReader import ConfigReader from utils.ConfigReader import ConfigReader
class AutoLib(MsgBase): class AutoLib(MsgBase):
@@ -16,7 +16,7 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from LibOperator import LibOperator from base.LibOperator import LibOperator
class LibChecker(LibOperator): class LibChecker(LibOperator):
@@ -16,7 +16,7 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from LibOperator import LibOperator from base.LibOperator import LibOperator
class LibCheckin(LibOperator): class LibCheckin(LibOperator):
@@ -16,7 +16,7 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from LibOperator import LibOperator from base.LibOperator import LibOperator
class LibCheckout(LibOperator): class LibCheckout(LibOperator):
+1 -1
View File
@@ -17,7 +17,7 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from LibOperator import LibOperator from base.LibOperator import LibOperator
class LibLogin(LibOperator): class LibLogin(LibOperator):
+1 -1
View File
@@ -13,7 +13,7 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from LibOperator import LibOperator from base.LibOperator import LibOperator
class LibLogout(LibOperator): class LibLogout(LibOperator):
+1 -1
View File
@@ -10,7 +10,7 @@ See the LICENSE file for details.
import os import os
import queue import queue
from LibOperator import LibOperator from base.LibOperator import LibOperator
class LibRenew(LibOperator): class LibRenew(LibOperator):
+80 -21
View File
@@ -16,7 +16,7 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from LibOperator import LibOperator from base.LibOperator import LibOperator
class LibReserve(LibOperator): class LibReserve(LibOperator):
@@ -324,11 +324,52 @@ class LibReserve(LibOperator):
return False return False
def __clickElementByJS(
self,
trigger_locator_id: str,
option_query_selector: str,
fail_msg: str,
success_msg: str,
) -> bool:
script = f"""
try {{
var trigger = document.getElementById('{trigger_locator_id}');
if (trigger) {{
trigger.click();
var option = document.querySelector("{option_query_selector}");
if (option) {{
option.click();
return true;
}}
return false;
}}
return false;
}} catch (e) {{
return false;
}}
"""
result = self.__driver.execute_script(script)
time.sleep(0.1)
if result:
self._showTrace(success_msg)
else:
self._showTrace(fail_msg)
return result
def __selectDate( def __selectDate(
self, self,
date_str: str date_str: str
) -> bool: ) -> bool:
if self.__clickElementByJS(
trigger_locator_id="onDate_select",
option_query_selector=f"p#options_onDate a[value='{date_str}']",
success_msg=f"日期 {date_str} 选择成功 !",
fail_msg=f"选择日期失败 ! : {date_str} 不可用"
):
return True
return self.__clickElement( return self.__clickElement(
trigger_locator=(By.ID, "onDate_select"), trigger_locator=(By.ID, "onDate_select"),
option_locator=(By.XPATH, f"//p[@id='options_onDate']/a[@value='{date_str}']"), option_locator=(By.XPATH, f"//p[@id='options_onDate']/a[@value='{date_str}']"),
@@ -342,12 +383,20 @@ class LibReserve(LibOperator):
place: str place: str
) -> bool: ) -> bool:
actual_place = "1" if place == "图书馆" else "1" place = "1" # the library only have this place :)
display_place = "图书馆"
if self.__clickElementByJS(
trigger_locator_id="display_building",
option_query_selector=f"p#options_building a[value='{place}']",
success_msg=f"预约场所 {display_place} 选择成功 !",
fail_msg=f"选择预约场所失败 ! : {display_place} 不可用"
):
return True
return self.__clickElement( return self.__clickElement(
trigger_locator=(By.ID, "display_building"), trigger_locator=(By.ID, "display_building"),
option_locator=(By.XPATH, f"//p[@id='options_building']/a[@value='{actual_place}']"), option_locator=(By.XPATH, f"//p[@id='options_building']/a[@value='{place}']"),
success_msg=f"预约场所 {place} 选择成功 !", success_msg=f"预约场所 {display_place} 选择成功 !",
fail_msg=f"选择预约场所失败 ! : {place} 不可用" fail_msg=f"选择预约场所失败 ! : {display_place} 不可用"
) )
@@ -357,6 +406,13 @@ class LibReserve(LibOperator):
) -> bool: ) -> bool:
display_floor = self.__floor_map.get(floor) display_floor = self.__floor_map.get(floor)
if self.__clickElementByJS(
trigger_locator_id="floor_select",
option_query_selector=f"p#options_floor a[value='{floor}']",
success_msg=f"楼层 {display_floor} 选择成功 !",
fail_msg=f"选择楼层失败 ! : {display_floor} 不可用"
):
return True
return self.__clickElement( return self.__clickElement(
trigger_locator=(By.ID, "floor_select"), trigger_locator=(By.ID, "floor_select"),
option_locator=(By.XPATH, f"//p[@id='options_floor']/a[@value='{floor}']"), option_locator=(By.XPATH, f"//p[@id='options_floor']/a[@value='{floor}']"),
@@ -371,12 +427,24 @@ class LibReserve(LibOperator):
) -> bool: ) -> bool:
display_room = self.__room_map.get(room) display_room = self.__room_map.get(room)
return self.__clickElement( # find room
trigger_locator=(By.ID, f"room_{room}"), try:
option_locator=None, WebDriverWait(self.__driver, 2).until(
success_msg=f"房间 {display_room} 选择成功 !", EC.element_to_be_clickable((By.ID, "findRoom"))
fail_msg=f"选择房间失败 ! : {display_room} 不可用" ).click()
) except:
self._showTrace("加载房间/区域失败 !")
return False
# select room
try:
WebDriverWait(self.__driver, 2).until(
EC.element_to_be_clickable((By.ID, f"room_{room}"))
).click()
self._showTrace(f"房间 {display_room} 选择成功 !")
return True
except:
self._showTrace(f"选择房间失败 ! : {display_room} 不可用")
return False
def __selectSeat( def __selectSeat(
@@ -572,22 +640,13 @@ class LibReserve(LibOperator):
except: except:
self._showTrace(f"加载预约选座页面失败 !") self._showTrace(f"加载预约选座页面失败 !")
return False return False
# date, place, floor # date, place, floor, room
if not self.__selectDate(reserve_info["date"]): if not self.__selectDate(reserve_info["date"]):
return False return False
if not self.__selectPlace(reserve_info["place"]): if not self.__selectPlace(reserve_info["place"]):
return False return False
if not self.__selectFloor(reserve_info["floor"]): if not self.__selectFloor(reserve_info["floor"]):
return False return False
# room find
try:
WebDriverWait(self.__driver, 2).until(
EC.element_to_be_clickable((By.ID, "findRoom"))
).click()
except:
self._showTrace("加载房间/区域失败 !")
return False
# room
if not self.__selectRoom(reserve_info["room"]): if not self.__selectRoom(reserve_info["room"]):
return False return False
else: else:
+12
View File
@@ -0,0 +1,12 @@
"""
Operators module for the AutoLibrary project.
Here are the classes and modules in this package:
- AutoLib: AutoLibrary operator.
- LibLogin: Library operator for logging in.
- LibLogout: Library operator for logging out.
- LibReserve: Library operator for reserving seat.
- LibCheckin: Library operator for checking in seat.
- LibCheckout: Library operator for checking out seat.
- LibRenew: Library operator for renewing seat.
"""
+7
View File
@@ -0,0 +1,7 @@
"""
Utils module for the AutoLibrary project.
Here are the classes and modules in this package:
- ConfigReader: Configuration reader class for the AutoLibrary project.
- ConfigWriter: Configuration writer class for the AutoLibrary project.
"""