refactor: extract common tab functionality to BaseTab and add decorators

- Add BaseTab base class for common tab initialization and logging
- Add constants module for shared GUI constants
- Move CheckboxTreeview to separate widget file
- Add admin_only and require_session decorators to utils.py
- Refactor DataExtractionTab and MaterialValidationTab to inherit BaseTab
- Remove duplicate _update_log method from tab classes

Co-Authored-By: Claude (glm-5) <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-02-26 21:17:37 +08:00
parent 3a9c6f0978
commit 18f784f067
8 changed files with 648 additions and 294 deletions

View File

@@ -6,6 +6,8 @@ GUI 工具模块
提供 GUI 相关的工具类和函数。
"""
import functools
class RealtimeOutput:
"""实时输出流,每次写入立即回调通知"""
@@ -37,3 +39,91 @@ class RealtimeOutput:
def isatty(self):
"""返回 False表示不是终端"""
return False
def admin_only(func):
"""
管理员权限装饰器
用于标记需要管理员权限的方法。如果当前用户不是管理员,
方法将不执行任何操作并返回 None。
Usage:
@admin_only
def some_admin_function(self):
# 只有管理员才能执行的代码
pass
Note:
- 被装饰的方法必须属于一个有 session_manager 属性的对象
- session_manager 必须有 is_admin() 方法
Returns:
如果是管理员,返回原函数的结果;否则返回 None
"""
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
# 尝试从 self 获取 session_manager
session_manager = getattr(self, 'session_manager', None)
# 如果没有 session_manager尝试从 main_window 获取
if session_manager is None:
main_window = getattr(self, 'main_window', None)
if main_window:
session_manager = getattr(main_window, 'session_manager', None)
# 检查是否为管理员
if session_manager and hasattr(session_manager, 'is_admin'):
if session_manager.is_admin():
return func(self, *args, **kwargs)
# 非管理员,记录日志并返回 None
logger = getattr(self, 'logger', None)
if logger:
logger.debug(f"权限拒绝: {func.__name__} 需要管理员权限")
return None
return wrapper
def require_session(func):
"""
会话验证装饰器
确保方法执行时有有效的会话。如果会话无效,
方法将不执行任何操作并返回 None。
Usage:
@require_session
def some_function(self):
# 需要有效会话才能执行的代码
pass
Returns:
如果有有效会话,返回原函数的结果;否则返回 None
"""
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
# 尝试从 self 获取 session_manager
session_manager = getattr(self, 'session_manager', None)
# 如果没有 session_manager尝试从 main_window 获取
if session_manager is None:
main_window = getattr(self, 'main_window', None)
if main_window:
session_manager = getattr(main_window, 'session_manager', None)
# 检查会话是否有效
if session_manager and hasattr(session_manager, 'is_authenticated'):
if session_manager.is_authenticated():
return func(self, *args, **kwargs)
# 会话无效,记录日志并返回 None
logger = getattr(self, 'logger', None)
if logger:
logger.warning(f"会话无效: {func.__name__} 需要有效会话")
return None
return wrapper