From 44480e71b27aa9d4cb8441f50c873f1b110e9691 Mon Sep 17 00:00:00 2001
From: hyb <kk_huangyangbo@163.com>
Date: Fri, 30 Jan 2026 07:20:06 +0000
Subject: [PATCH] fix: 修复部分已知问题

---
 测试组/脚本/Change_password/修改数据库的哈希密码和原始密码做桌面客户端源代码.py |  158 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 151 insertions(+), 7 deletions(-)

diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/Change_password/\344\277\256\346\224\271\346\225\260\346\215\256\345\272\223\347\232\204\345\223\210\345\270\214\345\257\206\347\240\201\345\222\214\345\216\237\345\247\213\345\257\206\347\240\201\345\201\232\346\241\214\351\235\242\345\256\242\346\210\267\347\253\257\346\272\220\344\273\243\347\240\201.py" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/Change_password/\344\277\256\346\224\271\346\225\260\346\215\256\345\272\223\347\232\204\345\223\210\345\270\214\345\257\206\347\240\201\345\222\214\345\216\237\345\247\213\345\257\206\347\240\201\345\201\232\346\241\214\351\235\242\345\256\242\346\210\267\347\253\257\346\272\220\344\273\243\347\240\201.py"
index e060b23..c0db169 100644
--- "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/Change_password/\344\277\256\346\224\271\346\225\260\346\215\256\345\272\223\347\232\204\345\223\210\345\270\214\345\257\206\347\240\201\345\222\214\345\216\237\345\247\213\345\257\206\347\240\201\345\201\232\346\241\214\351\235\242\345\256\242\346\210\267\347\253\257\346\272\220\344\273\243\347\240\201.py"
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/Change_password/\344\277\256\346\224\271\346\225\260\346\215\256\345\272\223\347\232\204\345\223\210\345\270\214\345\257\206\347\240\201\345\222\214\345\216\237\345\247\213\345\257\206\347\240\201\345\201\232\346\241\214\351\235\242\345\256\242\346\210\267\347\253\257\346\272\220\344\273\243\347\240\201.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,

--
Gitblit v1.9.1