Skip to content

Commit 9434062

Browse files
committed
优化
- 优化 Sentry日志上报,仅上报**异常**,ERROR级别日志不上报 - 优化 main.py,重构结构、提取常量并新增文档注释 - 优化 window.py,重构结构、提取常量并新增文档注释 - 优化 tray.py,重构结构、提取常量并新增文档注释 - 优化 app/tools 目录,重构结构并提取常量 - 优化 button_draw_utils.py,新增函数文档注释 - 优化 config.py,新增通知与音量常量配置 - 优化 roll_call.py,提取重复代码至**UI工具类** - 优化 lottery.py,提取重复代码至**UI工具类** - 新增 app/common/ui/ui_utils.py,创建通用**UI工具类** - 新增 RollCallController,封装点名**业务逻辑** - 新增 LotteryController,封装抽奖**业务逻辑** - 新增 RollCallUIInterface,预留**自定义界面接口** - 新增 LotteryUIInterface,预留**自定义界面接口** - 优化 VoiceCacheManager,移除**内存缓存**,只保留磁盘缓存 - 优化 TTSHandler,整合**系统音量控制**逻辑 - 优化 edge_tts_worker.py,移除冗余注释,简化**代码结构** - 优化 font_manager.py,重构字体加载逻辑,提取**常量映射** - 优化 personalised.py,简化图标与主题函数,移除**重复代码**
1 parent ee78ac7 commit 9434062

21 files changed

Lines changed: 3928 additions & 3276 deletions

CHANGELOG/v2.2.1/CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,25 @@ v2.0 - Koharu(小鸟游星野) release 4
88
## 💡 功能优化
99

1010
- 优化 Sentry错误上报,过滤**第三方库**无效错误
11+
- 优化 Sentry日志上报,仅上报**异常**,ERROR级别日志不上报
12+
- 优化 main.py,重构结构、提取常量并新增文档注释
13+
- 优化 window.py,重构结构、提取常量并新增文档注释
14+
- 优化 tray.py,重构结构、提取常量并新增文档注释
15+
- 优化 app/tools 目录,重构结构并提取常量
16+
- 优化 button_draw_utils.py,新增函数文档注释
17+
- 优化 config.py,新增通知与音量常量配置
18+
- 优化 roll_call.py,提取重复代码至**UI工具类**
19+
- 优化 lottery.py,提取重复代码至**UI工具类**
20+
- 新增 app/common/ui/ui_utils.py,创建通用**UI工具类**
21+
- 新增 RollCallController,封装点名**业务逻辑**
22+
- 新增 LotteryController,封装抽奖**业务逻辑**
23+
- 新增 RollCallUIInterface,预留**自定义界面接口**
24+
- 新增 LotteryUIInterface,预留**自定义界面接口**
25+
- 优化 VoiceCacheManager,移除**内存缓存**,只保留磁盘缓存
26+
- 优化 TTSHandler,整合**系统音量控制**逻辑
27+
- 优化 edge_tts_worker.py,移除冗余注释,简化**代码结构**
28+
- 优化 font_manager.py,重构字体加载逻辑,提取**常量映射**
29+
- 优化 personalised.py,简化图标与主题函数,移除**重复代码**
1130

1231
## 🐛 修复问题
1332

app/common/lottery/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# ==================================================
2+
# 抽奖模块
3+
# ==================================================
4+
from .lottery_utils import LotteryUtils, LotteryController, LotteryUIInterface
5+
6+
__all__ = ["LotteryUtils", "LotteryController", "LotteryUIInterface"]

app/common/lottery/lottery_utils.py

Lines changed: 236 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# ==================================================
2-
# 点名工具类
2+
# 抽奖工具类
33
# ==================================================
44
import json
55
from random import SystemRandom
@@ -21,7 +21,6 @@
2121
)
2222
from app.tools.path_utils import get_data_path, open_file
2323
from app.tools.settings_access import readme_settings_async, get_safe_font_size
24-
2524
from app.Language.obtain_language import get_any_position_value
2625

2726
system_random = SystemRandom()
@@ -630,3 +629,238 @@ def update_start_button_state(button, total_count):
630629
button.setEnabled(False)
631630
else:
632631
button.setEnabled(True)
632+
633+
634+
class LotteryController:
635+
"""抽奖控制器类,封装抽奖业务逻辑"""
636+
637+
def __init__(self):
638+
self.tts_handler = None
639+
self.is_animating = False
640+
self.final_selected_students = None
641+
self.final_pool_name = None
642+
self.final_selected_students_dict = None
643+
self.final_group_filter = None
644+
self.final_gender_filter = None
645+
self.current_count = 1
646+
self.ui_interface = None
647+
648+
def set_tts_handler(self, tts_handler):
649+
"""设置 TTS 处理器
650+
651+
Args:
652+
tts_handler: TTS 处理器实例
653+
"""
654+
self.tts_handler = tts_handler
655+
656+
def set_ui_interface(self, ui_interface):
657+
"""设置 UI 接口
658+
659+
Args:
660+
ui_interface: UI 接口实例
661+
"""
662+
self.ui_interface = ui_interface
663+
664+
def draw_random_prizes(self, pool_name: str, current_count: int):
665+
"""
666+
按权重抽取奖品
667+
668+
Args:
669+
pool_name: 奖池名称
670+
current_count: 当前抽取数量
671+
672+
Returns:
673+
dict: 包含抽取结果的字典
674+
"""
675+
result = LotteryUtils.draw_random_prizes(pool_name, current_count)
676+
677+
self.final_selected_students = result.get("selected_prizes") or result.get(
678+
"selected_students"
679+
)
680+
self.final_pool_name = result["pool_name"]
681+
self.final_selected_students_dict = result.get(
682+
"selected_prizes_dict"
683+
) or result.get("selected_students_dict")
684+
685+
return result
686+
687+
def draw_random_students(
688+
self,
689+
class_name,
690+
group_index,
691+
group_filter,
692+
gender_index,
693+
gender_filter,
694+
current_count,
695+
half_repeat,
696+
pool_name=None,
697+
prize_list=None,
698+
):
699+
"""
700+
抽取随机学生
701+
702+
Args:
703+
class_name: 班级名称
704+
group_index: 小组索引
705+
group_filter: 小组过滤器
706+
gender_index: 性别索引
707+
gender_filter: 性别过滤器
708+
current_count: 当前抽取数量
709+
half_repeat: 半重复设置
710+
pool_name: 奖池名称(用于抽奖模式下应用内幕设置)
711+
prize_list: 奖品列表(用于提高指定该奖品的学生的权重)
712+
713+
Returns:
714+
dict: 包含抽取结果的字典
715+
"""
716+
result = LotteryUtils.draw_random_students(
717+
class_name,
718+
group_index,
719+
group_filter,
720+
gender_index,
721+
gender_filter,
722+
current_count,
723+
half_repeat,
724+
pool_name,
725+
prize_list,
726+
)
727+
728+
return result
729+
730+
def get_prize_total_count(self, pool_name: str) -> int:
731+
"""
732+
获取奖池奖品总数
733+
734+
Args:
735+
pool_name: 奖池名称
736+
737+
Returns:
738+
int: 奖品总数
739+
"""
740+
return LotteryUtils.get_prize_total_count(pool_name)
741+
742+
def update_prize_many_count_label_text(self, pool_name: str, display_mode=None):
743+
"""
744+
生成奖品总数/剩余显示文本
745+
746+
Args:
747+
pool_name: 奖池名称
748+
display_mode: 显示模式
749+
750+
Returns:
751+
tuple: (总数, 剩余数, 格式化文本)
752+
"""
753+
return LotteryUtils.update_prize_many_count_label_text(pool_name, display_mode)
754+
755+
def play_voice_result(self, pool_name, selected_students):
756+
"""
757+
播放语音结果
758+
759+
Args:
760+
pool_name: 奖池名称
761+
selected_students: 选中的学生列表
762+
"""
763+
if not self.tts_handler:
764+
return
765+
766+
try:
767+
from app.tools.settings_access import readme_settings_async
768+
769+
voice_settings = {
770+
"voice_volume": readme_settings_async(
771+
"basic_voice_settings", "volume_size"
772+
),
773+
"voice_speed": readme_settings_async(
774+
"basic_voice_settings", "speech_rate"
775+
),
776+
"system_voice_name": readme_settings_async(
777+
"basic_voice_settings", "system_voice_name"
778+
),
779+
}
780+
781+
prize_names = [prize[1] for prize in selected_students]
782+
783+
voice_engine = readme_settings_async("basic_voice_settings", "voice_engine")
784+
engine_type = 1 if voice_engine == "Edge TTS" else 0
785+
786+
edge_tts_voice_name = readme_settings_async(
787+
"basic_voice_settings", "edge_tts_voice_name"
788+
)
789+
790+
self.tts_handler.voice_play(
791+
config=voice_settings,
792+
student_names=prize_names,
793+
engine_type=engine_type,
794+
voice_name=edge_tts_voice_name,
795+
class_name=pool_name,
796+
)
797+
except Exception as e:
798+
from loguru import logger
799+
800+
logger.exception(f"播放语音失败: {e}", exc_info=True)
801+
802+
def reset_drawn_prize_record(self, pool_name):
803+
"""
804+
重置已抽取奖品记录
805+
806+
Args:
807+
pool_name: 奖池名称
808+
"""
809+
from app.tools.config import reset_drawn_prize_record
810+
811+
reset_drawn_prize_record(None, pool_name)
812+
813+
def update_start_button_state(self, button, total_count):
814+
"""
815+
根据总奖数更新开始按钮的状态
816+
817+
Args:
818+
button: 开始按钮对象
819+
total_count: 总奖数
820+
"""
821+
LotteryUtils.update_start_button_state(button, total_count)
822+
823+
824+
class LotteryUIInterface:
825+
"""抽奖界面接口,用于自定义界面实现
826+
827+
自定义界面需要继承此类并实现所有抽象方法
828+
"""
829+
830+
def on_draw_start(self):
831+
"""开始抽取时的回调"""
832+
pass
833+
834+
def on_draw_stop(self):
835+
"""停止抽取时的回调"""
836+
pass
837+
838+
def on_draw_result(self, selected_prizes, pool_name):
839+
"""抽取结果时的回调
840+
841+
Args:
842+
selected_prizes: 选中的奖品列表
843+
pool_name: 奖池名称
844+
"""
845+
pass
846+
847+
def on_count_changed(self, total_count, remaining_count):
848+
"""奖数变化时的回调
849+
850+
Args:
851+
total_count: 总奖数
852+
remaining_count: 剩余奖数
853+
"""
854+
pass
855+
856+
def on_reset(self):
857+
"""重置时的回调"""
858+
pass
859+
860+
def on_error(self, error_message):
861+
"""错误发生时的回调
862+
863+
Args:
864+
error_message: 错误信息
865+
"""
866+
pass

app/common/roll_call/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# ==================================================
2+
# 点名模块
3+
# ==================================================
4+
from .roll_call_utils import RollCallUtils, RollCallController, RollCallUIInterface
5+
6+
__all__ = ["RollCallUtils", "RollCallController", "RollCallUIInterface"]

0 commit comments

Comments
 (0)