hyb
2026-01-30 7657e1b2fa251a2ea372710ad75cb395a3c0e374
测试组/脚本/Change_password/修改数据库的哈希密码和原始密码做桌面客户端源代码.py
@@ -9,12 +9,40 @@
from datetime import datetime
from typing import List, Dict, Any, Optional
import re
import locale
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
                             QLabel, QLineEdit, QPushButton, QTextEdit, QListWidget,
                             QListWidgetItem, QCheckBox, QFileDialog, QMessageBox, QProgressBar,
                             QGroupBox, QRadioButton, QButtonGroup, QTabWidget)
from PyQt5.QtCore import Qt, pyqtSignal, QThread
# 【重要】在程序最开始就设置环境变量,避免任何pandas操作之前出现本地化问题
# 强制设置为C语言环境,这是最安全的通用设置
os.environ['LANG'] = 'C'
os.environ['LC_ALL'] = 'C'
os.environ['LC_CTYPE'] = 'C'
os.environ['LC_NUMERIC'] = 'C'
os.environ['LC_TIME'] = 'C'
os.environ['LC_COLLATE'] = 'C'
os.environ['LC_MONETARY'] = 'C'
os.environ['LC_MESSAGES'] = 'C'
os.environ['LC_PAPER'] = 'C'
os.environ['LC_NAME'] = 'C'
os.environ['LC_ADDRESS'] = 'C'
os.environ['LC_TELEPHONE'] = 'C'
os.environ['LC_MEASUREMENT'] = 'C'
os.environ['LC_IDENTIFICATION'] = 'C'
os.environ['PANDAS_USAGE_STATS'] = 'False'
# 尝试设置locale,但如果失败也不影响,因为已经设置了环境变量
try:
    locale.setlocale(locale.LC_ALL, 'C')
except Exception:
    pass
# 不再设置pandas选项,避免因版本差异导致的错误
# 只保留必要的环境变量设置,确保本地化不会出现问题
# 判断是否是打包后的可执行文件
if getattr(sys, 'frozen', False):
@@ -30,6 +58,90 @@
DEFAULT_EXPORT_DIR = os.path.join(BASE_DIR, '用户信息导出')
DEFAULT_NEW_PASSWORD = 'Baoyi@1341'
PROTECTED_USER_ID = 1
# Redis配置
REDIS_HOST = '192.168.6.168'
REDIS_PORT = 6002
REDIS_PASSWORD = None
class RedisRefresher:
    """Redis缓存刷新器"""
    def __init__(self):
        self.redis_client = None
    def connect_redis(self):
        """连接Redis服务器"""
        try:
            # 尝试导入redis库
            import redis
            self.redis_client = redis.Redis(
                host=REDIS_HOST,
                port=REDIS_PORT,
                password=REDIS_PASSWORD,
                decode_responses=True
            )
            # 测试连接
            self.redis_client.ping()
            return True
        except ImportError:
            print("错误: 未安装redis库,请使用 'pip install redis' 安装")
            return False
        except Exception as e:
            print(f"连接Redis失败: {str(e)}")
            return False
    def refresh_all_redis(self):
        """刷新所有Redis数据库"""
        try:
            if not self.redis_client:
                if not self.connect_redis():
                    return False, "无法连接Redis服务器"
            # 获取所有数据库数量
            try:
                # 尝试获取配置信息
                config = self.redis_client.config_get('databases')
                db_count = int(config.get('databases', 16))
            except:
                # 如果无法获取配置,默认使用16个数据库
                db_count = 16
            refreshed_dbs = 0
            total_keys = 0
            # 遍历所有数据库并刷新
            for db_index in range(db_count):
                try:
                    # 创建一个临时Redis客户端来操作指定数据库
                    import redis
                    temp_client = redis.Redis(
                        host=REDIS_HOST,
                        port=REDIS_PORT,
                        password=REDIS_PASSWORD,
                        db=db_index,
                        decode_responses=True
                    )
                    # 获取当前数据库的key数量
                    key_count = temp_client.dbsize()
                    if key_count > 0:
                        # 清空当前数据库
                        temp_client.flushdb()
                        refreshed_dbs += 1
                        total_keys += key_count
                        print(f"已刷新数据库 {db_index}: 清除了 {key_count} 个键")
                except Exception as e:
                    print(f"刷新数据库 {db_index} 时出错: {str(e)}")
                    continue
            return True, f"成功刷新 {refreshed_dbs} 个Redis数据库,共清除 {total_keys} 个键"
        except Exception as e:
            return False, f"刷新Redis缓存时发生错误: {str(e)}"
class DatabaseUpdater(QThread):
@@ -52,10 +164,19 @@
        self.updaters = []
        self.log_records = []
        self.is_running = True
        self.redis_refresher = RedisRefresher()
    def run(self):
        """主运行方法"""
        try:
            # 保存日志时可能会出现本地化问题,这里临时设置环境变量
            original_lang = os.environ.get('LANG')
            original_lc_all = os.environ.get('LC_ALL')
            # 强制设置为C语言环境,避免pandas本地化问题
            os.environ['LANG'] = 'C'
            os.environ['LC_ALL'] = 'C'
            # 读取 Excel 数据
            try:
                df = pd.read_excel(self.excel_path)
@@ -82,9 +203,9 @@
            # 创建数据库更新器实例
            self.updaters = []
            for _, row in df_filtered.iterrows():
                project, host, database, user, password = row[:5]
                self.log_signal.emit(f"准备处理项目:{project} | 数据库:{database}")
                updater = ProjectUpdater(project, host, database, user, password)
                project, host, port, database, user, password = row[:6]
                self.log_signal.emit(f"准备处理项目:{project} | 数据库:{database} | 端口:{port}")
                updater = ProjectUpdater(project, host, database, user, password, port)
                self.updaters.append(updater)
            # 执行更新任务
@@ -112,10 +233,32 @@
            # 保存日志
            if self.log_records:
                pd.DataFrame(self.log_records).to_csv(DEFAULT_LOG_CSV_PATH, index=False, encoding='utf-8-sig')
                self.log_signal.emit(f"所有更新日志已保存至 {DEFAULT_LOG_CSV_PATH}")
                try:
                    pd.DataFrame(self.log_records).to_csv(DEFAULT_LOG_CSV_PATH, index=False, encoding='utf-8-sig')
                    self.log_signal.emit(f"所有更新日志已保存至 {DEFAULT_LOG_CSV_PATH}")
                except Exception as e:
                    self.log_signal.emit(f"保存日志失败:{str(e)}")
            else:
                self.log_signal.emit("无任何更新记录生成")
            # 恢复原始环境变量
            if original_lang:
                os.environ['LANG'] = original_lang
            else:
                os.environ.pop('LANG', None)
            if original_lc_all:
                os.environ['LC_ALL'] = original_lc_all
            else:
                os.environ.pop('LC_ALL', None)
            # 数据库更新完成后,自动刷新Redis缓存
            self.log_signal.emit("开始刷新Redis缓存...")
            success, message = self.redis_refresher.refresh_all_redis()
            if success:
                self.log_signal.emit(f"✅ {message}")
            else:
                self.log_signal.emit(f"❌ {message}")
        except Exception as e:
            self.error_signal.emit(f"运行过程中发生错误: {str(e)}")
@@ -162,12 +305,13 @@
class ProjectUpdater:
    """单个项目更新器"""
    def __init__(self, project, host, database, user, password):
    def __init__(self, project, host, database, user, password, port=3306):
        self.project = project
        self.host = host
        self.database = database
        self.db_user = user
        self.db_password = password
        self.port = port
        self.updated_users = []
        self.log_records = []
@@ -176,7 +320,7 @@
        try:
            conn = mysql.connector.connect(
                host=self.host,
                port=3306,
                port=self.port,
                user=self.db_user,
                password=self.db_password,
                database=self.database,