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

Compare commits

...

6 Commits

14 changed files with 120 additions and 81 deletions
+9 -8
View File
@@ -4,10 +4,11 @@
![AutoLibrary Logo](./src/gui/icons/AutoLibrary_128x128.ico)
[![GitHub stars](https://img.shields.io/github/stars/KenanZhu/AutoLibrary.svg?style=social&label=Star)](https://github.com/KenanZhu/AutoLibrary)
![License](https://img.shields.io/github/license/KenanZhu/AutoLibrary)
![Issue](https://img.shields.io/github/issues/KenanZhu/AutoLibrary)
![Release](https://img.shields.io/github/v/release/KenanZhu/AutoLibrary)
![Download](https://img.shields.io/github/downloads/KenanZhu/AutoLibrary/total)
[![Build](https://img.shields.io/github/actions/workflow/status/KenanZhu/AutoLibrary/release.yml)](https://github.com/KenanZhu/AutoLibrary/actions/workflows/release.yml)
[![Release](https://img.shields.io/github/v/release/KenanZhu/AutoLibrary)](https://github.com/KenanZhu/AutoLibrary/releases)
![Downloads](https://img.shields.io/github/downloads/KenanZhu/AutoLibrary/total)
了解更多请访问 [_AutoLibrary 网站_](http://autolibrary.cv)
@@ -23,9 +24,9 @@
*1,2,3 的具体操作方法和注意事项请访问我们的 [帮助手册](https://autolibrary.cv/docs/manual_lists.html)*
### 特点
### 注意事项
#### 关于预约等操作的注意事项
#### 关于预约等操作
工具会自动处理登录过程的验证码识别过程,正常情况下单次识别准确率在 90% 以上,如遇验证码识别错误,大概率是校园网网络环境不佳导致的。
@@ -34,11 +35,11 @@
> [!NOTE]
> 工具仅作为正常的预约,签到和续约的图书馆辅助工具,请勿干扰图书馆的正常运行(如故意预约多个座位,或同时预约大量的用户等,对此影响图书馆正常运行本工具概不负责,请在善用工具方便自己的情况下尽量不用影响其他同学的使用)。
#### 关于批量操作的注意事项
#### 关于批量操作
批量操作时,建议将需要操作的用户分成多个组,每个组的用户数量不要超过 4 人(即一整张桌子的数量),否则会影响操作效率,大量用户同时预约会一定程度上增加图书馆服务器的压力,影响正常使用。根据需要在用户管理界面中可以勾选本次操作是否跳过该用户,以提高运行效率。
#### 关于定时任务的注意事项
#### 关于定时任务
定时任务会在指定的时间自动运行,运行时会根据当前预约信息进行操作。一般情况下不建议设置两个运行开始时间比较接近的定时任务,否则后一个任务会等待前一个任务完成后才会运行,按照队列的顺序执行。
@@ -97,7 +98,7 @@ def classification(self, img: bytes):
#### 后续会有哪些功能?
当前 v1.0.0 版本的功能对于正常使用已经足够,不过后续会着重考虑完善 2-4 人预约时的使用体验,暂时有以下构想:
当前版本的功能对于正常使用已经足够,不过后续会着重考虑完善 2-4 人预约时的使用体验,暂时有以下构想:
1. 2-4 人一起预约时,往往会偏向于预约并排或对面的整个空座位,这时候工具会按照一定策略查询搜索符合条件的座位,并预约并排或对面的整个座位,而不是各自独立预约。
2. 预约时会考虑到组内用户的预约时间是否冲突,若冲突则会提示用户是否继续预约,若用户选择继续预约,则会按需要调整预约时间,再进行预约。
+1 -1
View File
@@ -60,7 +60,7 @@ class ALAboutDialog(QDialog, Ui_ALAboutDialog):
def generateAboutText(
self
):
) -> str:
os_info = self.getOSInfo()
about_text = f"""
+1 -1
View File
@@ -104,7 +104,7 @@
<number>0</number>
</property>
<item>
<widget class="QFrame" name="frame">
<widget class="QFrame" name="AboutInfoSpaceFrame">
<property name="minimumSize">
<size>
<width>56</width>
+8 -8
View File
@@ -86,16 +86,16 @@
<number>5</number>
</property>
<property name="leftMargin">
<number>5</number>
<number>3</number>
</property>
<property name="topMargin">
<number>5</number>
<number>3</number>
</property>
<property name="rightMargin">
<number>5</number>
<number>3</number>
</property>
<property name="bottomMargin">
<number>5</number>
<number>3</number>
</property>
<item>
<layout class="QHBoxLayout" name="TimerTypeSelectLayout">
@@ -135,16 +135,16 @@
</property>
<layout class="QGridLayout" name="TaskConfigLayout">
<property name="leftMargin">
<number>5</number>
<number>3</number>
</property>
<property name="topMargin">
<number>5</number>
<number>3</number>
</property>
<property name="rightMargin">
<number>5</number>
<number>3</number>
</property>
<property name="bottomMargin">
<number>5</number>
<number>3</number>
</property>
<property name="spacing">
<number>5</number>
+2 -2
View File
@@ -33,7 +33,7 @@ from utils.ConfigWriter import ConfigWriter
class ALConfigWidget(QWidget, Ui_ALConfigWidget):
configWidgetCloseSingal = Signal(dict)
configWidgetIsClosed = Signal(dict)
def __init__(
self,
@@ -126,7 +126,7 @@ class ALConfigWidget(QWidget, Ui_ALConfigWidget):
event: QCloseEvent
):
self.configWidgetCloseSingal.emit(self.__config_paths)
self.configWidgetIsClosed.emit(self.__config_paths)
super().closeEvent(event)
+46 -13
View File
@@ -94,19 +94,19 @@
</property>
<layout class="QVBoxLayout" name="UserListLayout">
<property name="spacing">
<number>0</number>
<number>5</number>
</property>
<property name="leftMargin">
<number>5</number>
<number>3</number>
</property>
<property name="topMargin">
<number>5</number>
<number>3</number>
</property>
<property name="rightMargin">
<number>5</number>
<number>3</number>
</property>
<property name="bottomMargin">
<number>5</number>
<number>3</number>
</property>
<item>
<widget class="QTreeWidget" name="UserTreeWidget">
@@ -178,6 +178,9 @@
</item>
<item>
<layout class="QHBoxLayout" name="UserListControlLayout">
<property name="spacing">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="DelUserButton">
<property name="minimumSize">
@@ -309,7 +312,7 @@
<item row="2" column="1">
<layout class="QHBoxLayout" name="PasswordLayout">
<property name="spacing">
<number>0</number>
<number>5</number>
</property>
<item>
<widget class="QLineEdit" name="PasswordEdit">
@@ -546,7 +549,7 @@
<item row="4" column="4">
<layout class="QHBoxLayout" name="SeatIDLayout">
<property name="spacing">
<number>0</number>
<number>5</number>
</property>
<item>
<widget class="QLineEdit" name="SeatIDEdit">
@@ -703,7 +706,7 @@
<item row="10" column="4">
<layout class="QHBoxLayout" name="EndTimeDiffLayout">
<property name="spacing">
<number>0</number>
<number>5</number>
</property>
<item>
<widget class="QSpinBox" name="MaxEndTimeDiffSpinBox">
@@ -899,7 +902,7 @@
<item row="7" column="4">
<layout class="QHBoxLayout" name="BeginTimeDiffLayout">
<property name="spacing">
<number>0</number>
<number>5</number>
</property>
<item>
<widget class="QSpinBox" name="MaxBeginTimeDiffSpinBox">
@@ -1049,7 +1052,7 @@
<item row="15" column="4">
<layout class="QHBoxLayout" name="RenewTimeDiffLayout">
<property name="spacing">
<number>0</number>
<number>5</number>
</property>
<item>
<widget class="QSpinBox" name="MaxRenewTimeDiffSpinBox">
@@ -1092,7 +1095,7 @@
</layout>
</item>
<item row="15" column="1">
<widget class="QLabel" name="label">
<widget class="QLabel" name="MaxRenewTimeDiffLabel">
<property name="minimumSize">
<size>
<width>80</width>
@@ -1153,10 +1156,10 @@
<property name="rightMargin">
<number>3</number>
</property>
<property name="horizontalSpacing">
<property name="bottomMargin">
<number>3</number>
</property>
<property name="verticalSpacing">
<property name="spacing">
<number>5</number>
</property>
<item row="0" column="0" colspan="2">
@@ -1649,6 +1652,21 @@
<string>当前配置</string>
</property>
<layout class="QGridLayout" name="CurrentConfigLayout">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<property name="spacing">
<number>5</number>
</property>
<item row="1" column="0">
<widget class="QLineEdit" name="CurrentRunConfigEdit">
<property name="minimumSize">
@@ -1775,6 +1793,21 @@
<string>导出路径</string>
</property>
<layout class="QGridLayout" name="ExportConfigLayout">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<property name="spacing">
<number>5</number>
</property>
<item row="3" column="0">
<widget class="QLineEdit" name="ExportUserConfigEdit">
<property name="minimumSize">
+8 -8
View File
@@ -241,7 +241,7 @@ class ALMainWindow(QMainWindow, Ui_ALMainWindow):
self.__output_queue,
self.__config_paths
)
self.__current_timer_task_thread.finishedSignal_TimerWorker.connect(self.onTimerTaskFinished)
self.__current_timer_task_thread.TimerTaskWorkerIsFinished.connect(self.onTimerTaskFinished)
self.__current_timer_task_thread.start()
except queue.Empty:
self.__is_running_timer_task = False
@@ -306,7 +306,7 @@ class ALMainWindow(QMainWindow, Ui_ALMainWindow):
):
if self.__alConfigWidget:
self.__alConfigWidget.configWidgetCloseSingal.disconnect(self.onConfigWidgetClosed)
self.__alConfigWidget.configWidgetIsClosed.disconnect(self.onConfigWidgetClosed)
self.__alConfigWidget.deleteLater()
self.__alConfigWidget = None
self.setControlButtons(True, None, None)
@@ -328,7 +328,7 @@ class ALMainWindow(QMainWindow, Ui_ALMainWindow):
):
self.__current_timer_task_thread.wait(1000)
self.__current_timer_task_thread.finishedSignal_TimerWorker.disconnect(self.onTimerTaskFinished)
self.__current_timer_task_thread.TimerTaskWorkerIsFinished.disconnect(self.onTimerTaskFinished)
self.__current_timer_task_thread.deleteLater()
self.__current_timer_task_thread = None
self.setControlButtons(None, False, True)
@@ -369,7 +369,7 @@ class ALMainWindow(QMainWindow, Ui_ALMainWindow):
self,
self.__config_paths
)
self.__alConfigWidget.configWidgetCloseSingal.connect(self.onConfigWidgetClosed)
self.__alConfigWidget.configWidgetIsClosed.connect(self.onConfigWidgetClosed)
self.__alConfigWidget.show()
self.__alConfigWidget.raise_()
self.__alConfigWidget.activateWindow()
@@ -387,8 +387,8 @@ class ALMainWindow(QMainWindow, Ui_ALMainWindow):
self.__output_queue,
self.__config_paths
)
self.__auto_lib_thread.finishedSignal.connect(self.onStopButtonClicked)
self.__auto_lib_thread.finishedWithErrorSignal.connect(self.onStopButtonClicked)
self.__auto_lib_thread.AutoLibWorkerIsFinished.connect(self.onStopButtonClicked)
self.__auto_lib_thread.AutoLibWorkerFinishedWithError.connect(self.onStopButtonClicked)
self.__auto_lib_thread.start()
@Slot()
@@ -400,8 +400,8 @@ class ALMainWindow(QMainWindow, Ui_ALMainWindow):
self.showTrace("正在停止操作......")
self.__auto_lib_thread.wait(2000)
self.showTrace("操作已停止")
self.__auto_lib_thread.finishedSignal.disconnect(self.onStopButtonClicked)
self.__auto_lib_thread.finishedWithErrorSignal.disconnect(self.onStopButtonClicked)
self.__auto_lib_thread.AutoLibWorkerIsFinished.disconnect(self.onStopButtonClicked)
self.__auto_lib_thread.AutoLibWorkerFinishedWithError.disconnect(self.onStopButtonClicked)
self.__auto_lib_thread.deleteLater()
self.__auto_lib_thread = None
self.setControlButtons(None, False, True)
+5 -7
View File
@@ -34,13 +34,13 @@
<number>5</number>
</property>
<property name="leftMargin">
<number>3</number>
<number>5</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>3</number>
<number>5</number>
</property>
<property name="bottomMargin">
<number>0</number>
@@ -156,11 +156,9 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(10, 170, 10);
font: 12pt &quot;Microsoft YaHei UI&quot;;
color: rgb(255, 255, 255);
font: 9pt &quot;Segoe UI&quot;;
font: 700 9pt &quot;Microsoft YaHei UI&quot;;</string>
<string notr="true">background-color: #0AAA0A;
color: #FFFFFF;
font: 700 9pt;</string>
</property>
<property name="text">
<string>启动脚本</string>
+11 -11
View File
@@ -22,8 +22,8 @@ from utils.ConfigReader import ConfigReader
class AutoLibWorker(QThread, MsgBase):
finishedSignal = Signal()
finishedWithErrorSignal = Signal()
AutoLibWorkerIsFinished = Signal()
AutoLibWorkerFinishedWithError = Signal()
def __init__(
self,
@@ -116,17 +116,17 @@ class AutoLibWorker(QThread, MsgBase):
)
except Exception as e:
self._showTrace(f"AutoLibrary 运行时发生异常 : {e}")
self.finishedWithErrorSignal.emit()
self.AutoLibWorkerFinishedWithError.emit()
return
if auto_lib:
auto_lib.close()
self._showTrace("AutoLibrary 运行结束")
self.finishedSignal.emit()
self.AutoLibWorkerIsFinished.emit()
class TimerTaskWorker(AutoLibWorker):
finishedSignal_TimerWorker = Signal(bool, dict)
TimerTaskWorkerIsFinished = Signal(bool, dict)
def __init__(
self,
@@ -139,8 +139,8 @@ class TimerTaskWorker(AutoLibWorker):
super().__init__(input_queue, output_queue, config_paths)
self.__timer_task = timer_task
self.finishedSignal.connect(self.onTimerTaskIsFinished)
self.finishedWithErrorSignal.connect(self.onTimerTaskIsError)
self.AutoLibWorkerIsFinished.connect(self.onTimerTaskIsFinished)
self.AutoLibWorkerFinishedWithError.connect(self.onTimerTaskIsError)
def run(
self
@@ -149,18 +149,18 @@ class TimerTaskWorker(AutoLibWorker):
self._showTrace(f"定时任务 {self.__timer_task['name']} 开始运行")
super().run()
@Slot(dict)
@Slot()
def onTimerTaskIsError(
self
):
self._showTrace(f"定时任务 {self.__timer_task['name']} 运行时发生异常")
self.finishedSignal_TimerWorker.emit(True, self.__timer_task)
self.TimerTaskWorkerIsFinished.emit(True, self.__timer_task)
@Slot(dict)
@Slot()
def onTimerTaskIsFinished(
self
):
self._showTrace(f"定时任务 {self.__timer_task['name']} 运行结束")
self.finishedSignal_TimerWorker.emit(False, self.__timer_task)
self.TimerTaskWorkerIsFinished.emit(False, self.__timer_task)
+12 -11
View File
@@ -40,18 +40,19 @@ class ALSeatFrame(QFrame):
self.setLineWidth(2)
self.setStyleSheet("""
QFrame {
background-color: #4196EB;
border: 2px solid #4196EB;
background-color: #2294FF;
border: 2px solid #2294FF;
border-radius: 5px;
}
QLabel {
color: #F0F0F0;
color: #FFFFFF;
font-weight: bold;
}
""")
self.label = QLabel(self.__seat_number, self)
self.label.setAlignment(Qt.AlignCenter)
self.label.setGeometry(0, 0, 60, 40)
self.setCursor(Qt.CursorShape.PointingHandCursor)
self.Label = QLabel(self.__seat_number, self)
self.Label.setAlignment(Qt.AlignCenter)
self.Label.setGeometry(0, 0, 60, 40)
def mousePressEvent(
self,
@@ -77,24 +78,24 @@ class ALSeatFrame(QFrame):
self.setStyleSheet("""
QFrame {
background-color: #4CAF50;
border: 2px solid #388E3C;
border: 2px solid #4CAF50;
border-radius: 5px;
color: white;
}
QLabel {
color: #F0F0F0;
color: #FFFFFF;
font-weight: bold;
}
""")
else:
self.setStyleSheet("""
QFrame {
background-color: #4196EB;
border: 2px solid #4196EB;
background-color: #2294FF;
border: 2px solid #2294FF;
border-radius: 5px;
}
QLabel {
color: #F0F0F0;
color: #FFFFFF;
font-weight: bold;
}
""")
+6
View File
@@ -67,6 +67,8 @@ class ALSeatMapWidget(QWidget):
self.setWindowTitle(f"选择楼层座位 - AutoLibrary")
self.SeatMapWidgetMainLayout = QVBoxLayout(self)
self.SeatMapWidgetMainLayout.setContentsMargins(5, 5, 5, 5)
self.SeatMapWidgetMainLayout.setSpacing(5)
self.TitleLabel = QLabel(f"楼层座位分布图: {self.__floor}-{self.__room}")
self.TitleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.TitleLabel.setStyleSheet("font-size: 16px; font-weight: bold; margin: 10px;")
@@ -99,9 +101,13 @@ class ALSeatMapWidget(QWidget):
self.ConfirmButton = QPushButton("确认")
self.ConfirmButton.setFixedSize(80, 25)
self.ConfirmButton.setAutoDefault(True)
self.ConfirmButton.setDefault(True)
self.CancelButton = QPushButton("取消")
self.CancelButton.setFixedSize(80, 25)
self.SeatMapWidgetControlLayout = QHBoxLayout()
self.SeatMapWidgetControlLayout.setContentsMargins(0, 0, 0, 0)
self.SeatMapWidgetControlLayout.setSpacing(5)
self.SeatMapWidgetControlLayout.setAlignment(Qt.AlignmentFlag.AlignRight)
self.SeatMapWidgetControlLayout.addWidget(self.CancelButton)
self.SeatMapWidgetControlLayout.addWidget(self.ConfirmButton)
+5 -5
View File
@@ -71,7 +71,7 @@ class TimerTaskItemWidget(QWidget):
ExecuteTimeStr = self.__timer_task["execute_time"].strftime("%Y-%m-%d %H:%M:%S")
ExecuteTimeLabel = QLabel(f"执行时间: {ExecuteTimeStr}")
ExecuteTimeLabel.setStyleSheet("color: gray;")
ExecuteTimeLabel.setStyleSheet("color: #969696;")
ExecuteTimeLabel.setFixedHeight(20)
self.TaskInfoLayout.addWidget(ExecuteTimeLabel)
@@ -93,15 +93,15 @@ class TimerTaskItemWidget(QWidget):
TaskStatusColor = "#4CAF50"
case TimerTaskStatus.ERROR:
TaskStatusText = "执行失败"
TaskStatusColor = "#FF5722"
TaskStatusColor = "#DC0000"
case TimerTaskStatus.OUTDATED:
TaskStatusText = "已过期"
TaskStatusColor = "#FF5722"
TaskStatusColor = "#DC0000"
TaskStatusLabel = QLabel(TaskStatusText)
TaskStatusLabel.setStyleSheet(f"""
QLabel {{
background-color: {TaskStatusColor};
color: white;
color: #FFFFFF;
border-radius: 5px;
font-weight: bold;
}}
@@ -116,7 +116,7 @@ class TimerTaskItemWidget(QWidget):
TaskModeLabel.setStyleSheet(f"""
QLabel {{
background-color: {TaskModeColor};
color: white;
color: #FFFFFF;
border-radius: 5px;
font-weight: bold;
}}
+1 -1
View File
@@ -153,7 +153,7 @@
</property>
<property name="styleSheet">
<string notr="true">QLabel {
color: #FF5722
color: #DC0000
}</string>
</property>
<property name="text">
+3 -3
View File
@@ -5,11 +5,11 @@
workflow process. Do not edit manually.
This file is auto-generated during the workflow process.
Last updated: 2026-01-17 17:51:55 UTC
Last updated: 2026-01-17 18:18:12 UTC
"""
AL_VERSION = "1.0.3"
AL_TAG = "v1.0.3"
AL_VERSION = "1.0.4"
AL_TAG = "v1.0.4"
AL_COMMIT_SHA = "local"
AL_COMMIT_DATE = "null" # time zone : UTC
AL_BUILD_DATE = "null" # time zone : UTC