修复代码质量问题(Bug #20, #1, #2)

修复的Bug:
- Bug #20: 删除重复函数定义 (update_admin_username重复定义)
- Bug #1: 删除类型转换冗余 (APIBrowseResult->BrowseResult无意义转换)
- Bug #2: 统一时区处理

主要改进:
1. 删除重复函数:
   - 删除app.py:1023处重复的update_admin_username函数定义
   - 避免函数覆盖导致的潜在问题

2. 删除冗余类型转换:
   - APIBrowseResult和BrowseResult字段完全相同
   - 删除run_task中的冗余转换代码
   - 提升性能,减少维护成本

3. 统一时区处理:
   - 新增BEIJING_TZ常量和get_beijing_now()辅助函数
   - 替换所有分散的beijing_tz创建为统一函数调用
   - 删除重复的datetime/pytz导入
   - 涉及6处代码统一:
     * log_to_client - 日志时间戳
     * take_screenshot_for_account - 截图文件名
     * get_screenshots - 文件修改时间
     * run_scheduled_task - 定时任务星期检查
     * check_user_schedules - 用户定时任务检查
     * get_server_info_api - 服务器运行时长

影响:
- 提升代码质量和可维护性
- 统一时区处理,避免时间混淆
- 减少内存占用和CPU开销

受影响文件:
- app.py (所有修复)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-11 14:25:08 +08:00
parent 6a905909d9
commit 4d3e4a09fd

58
app.py
View File

@@ -45,6 +45,13 @@ from app_security import (
from app_utils import verify_and_consume_captcha from app_utils import verify_and_consume_captcha
# ========== 时区辅助函数 (Bug #2 fix) ==========
BEIJING_TZ = pytz.timezone('Asia/Shanghai')
def get_beijing_now():
"""获取北京时间的当前时间(统一时区处理)"""
return datetime.now(BEIJING_TZ)
# ========== 初始化配置 ========== # ========== 初始化配置 ==========
config = get_config() config = get_config()
@@ -312,8 +319,7 @@ def admin_required(f):
def log_to_client(message, user_id=None, account_id=None): def log_to_client(message, user_id=None, account_id=None):
"""发送日志到Web客户端(用户隔离)""" """发送日志到Web客户端(用户隔离)"""
beijing_tz = timezone(timedelta(hours=8)) timestamp = get_beijing_now().strftime('%H:%M:%S')
timestamp = datetime.now(beijing_tz).strftime('%H:%M:%S')
log_data = { log_data = {
'timestamp': timestamp, 'timestamp': timestamp,
'message': message, 'message': message,
@@ -1019,23 +1025,6 @@ def update_admin_username():
return jsonify({"error": "修改失败,用户名可能已存在"}), 400 return jsonify({"error": "修改失败,用户名可能已存在"}), 400
def update_admin_username():
"""修改管理员用户名"""
data = request.json
new_username = data.get('new_username', '').strip()
if not new_username:
return jsonify({"error": "用户名不能为空"}), 400
old_username = session.get('admin_username')
if database.update_admin_username(old_username, new_username):
session['admin_username'] = new_username
return jsonify({"success": True})
return jsonify({"error": "用户名已存在"}), 400
# ==================== 密码重置API ==================== # ==================== 密码重置API ====================
# 管理员直接重置用户密码 # 管理员直接重置用户密码
@@ -1645,13 +1634,7 @@ def run_task(user_id, account_id, browse_type, enable_screenshot=True, source="m
browse_type=browse_type, browse_type=browse_type,
should_stop_callback=should_stop should_stop_callback=should_stop
) )
# 转换结果类型以兼容后续代码 # APIBrowseResult和BrowseResult字段完全相同无需转换
result = BrowseResult(
success=result.success,
total_items=result.total_items,
total_attachments=result.total_attachments,
error_message=result.error_message
)
api_browser.close() api_browser.close()
else: else:
# API 登录失败 # API 登录失败
@@ -1984,9 +1967,7 @@ def take_screenshot_for_account(user_id, account_id, browse_type="应读", sourc
time.sleep(2) time.sleep(2)
# 生成截图文件名 # 生成截图文件名
beijing_tz = pytz.timezone('Asia/Shanghai') timestamp = get_beijing_now().strftime('%Y%m%d_%H%M%S')
now_beijing = datetime.now(beijing_tz)
timestamp = now_beijing.strftime('%Y%m%d_%H%M%S')
user_info = database.get_user_by_id(user_id) user_info = database.get_user_by_id(user_id)
username_prefix = user_info['username'] if user_info else f"user{user_id}" username_prefix = user_info['username'] if user_info else f"user{user_id}"
@@ -2116,8 +2097,7 @@ def get_screenshots():
filepath = os.path.join(SCREENSHOTS_DIR, filename) filepath = os.path.join(SCREENSHOTS_DIR, filename)
stat = os.stat(filepath) stat = os.stat(filepath)
# 转换为北京时间 # 转换为北京时间
beijing_tz = pytz.timezone('Asia/Shanghai') created_time = datetime.fromtimestamp(stat.st_mtime, tz=BEIJING_TZ)
created_time = datetime.fromtimestamp(stat.st_mtime, tz=beijing_tz)
# 解析文件名获取显示名称 # 解析文件名获取显示名称
# 文件名格式用户名_登录账号_浏览类型_时间.jpg # 文件名格式用户名_登录账号_浏览类型_时间.jpg
parts = filename.rsplit('.', 1)[0].split('_', 1) # 移除扩展名并分割 parts = filename.rsplit('.', 1)[0].split('_', 1) # 移除扩展名并分割
@@ -2605,7 +2585,6 @@ def test_proxy_api():
def get_server_info_api(): def get_server_info_api():
"""获取服务器信息""" """获取服务器信息"""
import psutil import psutil
import datetime
# CPU使用率 # CPU使用率
cpu_percent = psutil.cpu_percent(interval=1) cpu_percent = psutil.cpu_percent(interval=1)
@@ -2623,8 +2602,8 @@ def get_server_info_api():
disk_percent = disk.percent disk_percent = disk.percent
# 运行时长 # 运行时长
boot_time = datetime.datetime.fromtimestamp(psutil.boot_time()) boot_time = datetime.fromtimestamp(psutil.boot_time(), tz=BEIJING_TZ)
uptime_delta = datetime.datetime.now() - boot_time uptime_delta = get_beijing_now() - boot_time
days = uptime_delta.days days = uptime_delta.days
hours = uptime_delta.seconds // 3600 hours = uptime_delta.seconds // 3600
uptime = f"{days}{hours}小时" uptime = f"{days}{hours}小时"
@@ -2807,17 +2786,13 @@ def run_scheduled_task(skip_weekday_check=False):
skip_weekday_check: 是否跳过星期检查立即执行时为True skip_weekday_check: 是否跳过星期检查立即执行时为True
""" """
try: try:
from datetime import datetime
import pytz
config = database.get_system_config() config = database.get_system_config()
browse_type = config.get('schedule_browse_type', '应读') browse_type = config.get('schedule_browse_type', '应读')
# 检查今天是否在允许执行的星期列表中(立即执行时跳过此检查) # 检查今天是否在允许执行的星期列表中(立即执行时跳过此检查)
if not skip_weekday_check: if not skip_weekday_check:
# 获取北京时间的星期几 (1=周一, 7=周日) # 获取北京时间的星期几 (1=周一, 7=周日)
beijing_tz = pytz.timezone('Asia/Shanghai') now_beijing = get_beijing_now()
now_beijing = datetime.now(beijing_tz)
current_weekday = now_beijing.isoweekday() # 1-7 current_weekday = now_beijing.isoweekday() # 1-7
# 获取配置的星期列表 # 获取配置的星期列表
@@ -3001,9 +2976,7 @@ def scheduled_task_worker():
"""检查并执行用户定时任务""" """检查并执行用户定时任务"""
import json import json
try: try:
from datetime import datetime now = get_beijing_now()
beijing_tz = pytz.timezone('Asia/Shanghai')
now = datetime.now(beijing_tz)
current_time = now.strftime('%H:%M') current_time = now.strftime('%H:%M')
current_weekday = now.isoweekday() current_weekday = now.isoweekday()
@@ -3168,7 +3141,6 @@ def scheduled_task_worker():
Returns: Returns:
UTC时间字符串格式为 HH:MM UTC时间字符串格式为 HH:MM
""" """
from datetime import datetime, timedelta
# 解析CST时间 # 解析CST时间
hour, minute = map(int, cst_time_str.split(':')) hour, minute = map(int, cst_time_str.split(':'))
# CST是UTC+8所以UTC时间 = CST时间 - 8小时 # CST是UTC+8所以UTC时间 = CST时间 - 8小时