hyb
2026-01-09 4cb426cb3ae31e772a09d4ade5b2f0242aaeefa0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
Ë
ï—2i&iãó^—ddlZddlZddlZddlZddlmZddlmZddlm    Z    m
Z
m Z m Z ddl Z ddlmZmZmZddlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%ddl&m'Z'm(Z(m)Z)e*edd    «r&ejVjYejZ«Z.n4ejVjYejVj_e0««Z.ejVjce.d
d «Z2ejVjce.d «Z3ejVjce.d «Z4dZ5dZ6dZ7dZ8dZ9    ddl:m;Z;dZ?dZ@dZAdZBdZCe;eCeBeAe@e?¬«ZDd„ZEGd„d«ZFGd„de)«ZGGd„d «ZHGd!„d"e«ZId#„ZJeKd$k(reJ«yy#e<$re=d«ej|d«YŒvwxYw)%éN)ÚError)Údatetime)ÚListÚDictÚAnyÚOptional)Ú    QtWidgetsÚQtCoreÚQtGui)Ú QApplicationÚ QMainWindowÚQWidgetÚ QVBoxLayoutÚ QHBoxLayoutÚQLabelÚ    QLineEditÚ QPushButtonÚ    QTextEditÚ QListWidgetÚQListWidgetItemÚ    QCheckBoxÚ QFileDialogÚ QMessageBoxÚ QProgressBarÚ    QGroupBoxÚ QRadioButtonÚ QButtonGroupÚ
QTabWidget)ÚQtÚ
pyqtSignalÚQThreadÚfrozenFÚdbExcelu数据库信息.xlsxu更新日志.csvu用户信息导出z
Baoyi@1341éz 192.168.6.168ir)ÚPasswordHasheru0请安装argon2-cffi库: pip install argon2-cffié é@éié)Ú    time_costÚ memory_costÚ parallelismÚhash_lenÚsalt_lencó,—tj|«S)u使用Argon2编码密码)Ú argon2_hasherÚhash)Ú raw_passwords õŒh:\项目\archive\测试组\脚本\Change_password\修改数据库的哈希密码和原始密码做桌面客户端源代码(argon2id).pyÚencode_passwordr4<s€ä × Ñ ˜lÓ +Ð+ócó"—eZdZdZd„Zd„Zd„Zy)ÚRedisRefresheruRedis缓存刷新器có—d|_y©N)Ú redis_client©Úselfs r3Ú__init__zRedisRefresher.__init__Ds
€Ø ˆÕr5có—    ddl}|jtttd¬«|_|j
j «y#t$rtd«Yyt$r!}tdt|«›«Yd}~yd}~wwxYw)u连接Redis服务器rNT)ÚhostÚportÚpasswordÚdecode_responsesu@错误: æœªå®‰è£…redis库,请使用 'pip install redis' å®‰è£…Fu连接Redis失败: ) ÚredisÚRedisÚ
REDIS_HOSTÚ
REDIS_PORTÚREDIS_PASSWORDr:ÚpingÚ ImportErrorÚprintÚ    ExceptionÚstr)r<rCÚes   r3Ú connect_rediszRedisRefresher.connect_redisGs~€ð    ã Ø %§ ¡ ÜÜÜ'Ø!%ð    !,ó!ˆDÔ ð × Ñ × "Ñ "Ô $ØøÜò    Ü ÐTÔ UÙÜò    Ü Ð'¬¨A« xÐ0Ô 1Üûð    ús‚AAÁBÁBÁ%BÂBc
óH—    |js|j«sy    |jjd«}t|j    dd««}d}d}t |«D]Ñ}    |jj j«}|jd|«|j«|jd«|j«}|dkDr=|jd«|j«|dz }||z }td    |›d
|›d «|jj j|«ŒÓdd|›d|›d fS#d}YŒôxYw#t$r%}td |›d t|«›«Yd}~Œd}~wwxYw#t$r}ddt|«›fcYd}~Sd}~wwxYw)u刷新所有Redis数据库)Fu无法连接Redis服务器ڠ   databasesérÚSELECTÚDBSIZEÚFLUSHDBr$u已刷新数据库 u : æ¸…除了 u ä¸ªé”®u刷新数据库 u  æ—¶å‡ºé”™: NTu 成功刷新 u ä¸ªRedis数据库,共清除 Fu"刷新Redis缓存时发生错误: )r:rNÚ
config_getÚintÚgetÚrangeÚconnection_poolÚget_connectionÚ send_commandÚ read_responserJÚreleaserKrL)    r<ÚconfigÚdb_countÚ refreshed_dbsÚ
total_keysÚdb_indexÚ temp_clientÚ    key_countrMs             r3Úrefresh_all_redisz RedisRefresher.refresh_all_redis\s·€ð.    HØ×$Ò$Ø×)Ñ)Ô+Ø>ð à×*Ñ*×5Ñ5°kÓBÜ˜vŸz™z¨+°rÓ:Ó;ð
ˆM؈Jô" (›Oò ðà"&×"3Ñ"3×"CÑ"C×"RÑ"RÓ"TKØ×,Ñ,¨X°xÔ@Ø×-Ñ-Ô/ð ×,Ñ,¨XÔ6Ø +× 9Ñ 9Ó ;Ià  1’}à#×0Ñ0°Ô;Ø#×1Ñ1Ô3Ø%¨Ñ*˜ Ø" iÑ/˜
ÜР3°H°:¸\È)ÈÐT[Ð\Ô]à×%Ñ%×5Ñ5×=Ñ=¸kÕJð' ð2˜=¨¨Ð7VÐWaÐVbÐbiÐjÐjÐ jøðC à’ûô6!òÜÐ,¨X¨J°lÄ3ÀqÃ6À(ÐKÔLÝûðûô ò    HØÐ>¼sÀ1»v¸hÐGÐGÕ Gûð    Hús_‚E> 6EÁE>Á)CE Ä7 E>ÅE
ÅE>Å     E;ÅE6Å0E>Å6E;Å;E>Å>    F!ÆFÆF!ÆF!N)Ú__name__Ú
__module__Ú __qualname__Ú__doc__r=rNre©r5r3r7r7As„Ùò!òó*0Hr5r7c󄇗eZdZdZee«Zee«Ze«Z    ee«Z
ee«Z dˆfd„    Z d„Z d„Zd„ZˆxZS)ÚDatabaseUpdateru3数据库更新器类,运行在单独的线程中có°•—t‰|«||_||_||_||_||_g|_g|_d|_    t«|_ y)NT) Úsuperr=Ú
excel_pathÚ new_passwordÚmodeÚ user_filterÚselected_projectsÚupdatersÚ log_recordsÚ
is_runningr7Úredis_refresher)r<rorprqrrrsÚ    __class__s      €r3r=zDatabaseUpdater.__init__™sUø€Ü ‰ÑÔØ$ˆŒØ(ˆÔ؈Œ    Ø&ˆÔØ!2ˆÔ؈Œ ØˆÔØˆŒÜ-Ó/ˆÕr5c    ó    —        tj|j«}|dj«j«}|s7|jj d«    |j j «y|jr"||dj|j«}n|}|jr7|jj d«    |j j «yg|_ |j«D]`\}}|dd\}}}    }
} } |jj d|›d|
›d    |    ›«t|||
| | |    «} |jj!| «Œbt#|j«}t%|j«D]2\}} |j&sn |jj d
| j(›«| j+|j,d k(r |j.nd|j0¬ «}|re|j2j5| j2«|jj d | j(›dt#| j6«›d«n)|jj d| j(›d«|j8j t;|dzdz|z ««Œ5|j2rXtj<|j2«j?t@dd¬«|jj dt@›«n|jj d«|jj d«|jBjE«\}}|r|jj d |›«n|jj d|›«|j j «y#t$rB}|jj d|›«Yd}~|j j «yd}~wwxYw#t$r1}|jj dtG|«›«Yd}~Œžd}~wwxYw#|j j «wxYw)u主运行方法u读取Excel文件失败:Nõ项目u$Excel æ–‡ä»¶ä¸­æœªæ‰¾åˆ°ä»»ä½•项目u*筛选后无有效项目,请检查输入éu准备处理项目:u | æ•°æ®åº“:u  | ç«¯å£ï¼šu正在处理项目: Úspecific)rrrpu✅ u æ›´æ–°å®Œæˆï¼Œå…± u
 ä¸ªç”¨æˆ·u❌ u  æ›´æ–°å¤±è´¥r$édFz    utf-8-sig)ÚindexÚencodingu所有更新日志已保存至 u无任何更新记录生成u开始刷新Redis缓存...u运行过程中发生错误: )$ÚpdÚ
read_excelrorKÚ error_signalÚemitÚfinished_signalÚuniqueÚtolistrsÚisinÚemptyrtÚiterrowsÚ
log_signalÚProjectUpdaterÚappendÚlenÚ    enumeratervÚprojectÚupdate_databaserqrrrpruÚextendÚ updated_usersÚprogress_signalrVÚ    DataFrameÚto_csvÚDEFAULT_LOG_CSV_PATHrwrerL)r<ÚdfrMÚ all_projectsÚ df_filteredÚ_Úrowrr?r@ÚdatabaseÚuserrAÚupdaterÚtotal_projectsÚiÚsuccessÚmessages                  r3ÚrunzDatabaseUpdater.run¥sù€ðI    (ð Ü—]‘] 4§?¡?Ó3ð ˜h™<×.Ñ.Ó0×7Ñ7Ó9ˆLÙØ×!Ñ!×&Ñ&Ð'MÔNØðz ×  Ñ  × %Ñ %Õ 'ðu×%Ò%Ø   H¡×!2Ñ!2°4×3IÑ3IÓ!JÑK‘ ࠐ à× Ò Ø×!Ñ!×&Ñ&Ð'SÔTØðf ×  Ñ  × %Ñ %Õ 'ðaˆDŒMØ%×.Ñ.Ó0ò .‘3Ø@CÀBÀQÀÑ=˜˜t X¨t°XØ—‘×$Ñ$Ð'<¸W¸IÀ_ÐU]ÐT^Ð^jÐkoÐjpÐ%qÔrÜ(¨°$¸À$ÈÐRVÓWØ— ‘ ×$Ñ$ WÕ-ð     .ô! §¡Ó/ˆNÜ'¨¯ © Ó6ó O‘
7Ø—’Úà—‘×$Ñ$Ð';¸G¿O¹OÐ;LÐ%MÔNð"×1Ñ1Ø48·I±IÀÒ4K × 0Ò 0ÐQUØ!%×!2Ñ!2ð2óñ
Ø×$Ñ$×+Ñ+¨G×,?Ñ,?Ô@Ø—O‘O×(Ñ(¨4°·±Ð/@Ð@TÔUXÐY`×YnÑYnÓUoÐTpÐpzÐ){Õ|à—O‘O×(Ñ(¨4°·±Ð/@À Ð)NÔOð×$Ñ$×)Ñ)¬#¨q°1©u¸©m¸nÑ.LÓ*MÖNð' Oð,×ÒÜ— ‘ ˜T×-Ñ-Ó.×5Ñ5Ô6JÐRWÐbmÐ5ÔnØ—‘×$Ñ$Ð'FÔG[ÐF\Ð%]Õ^à—‘×$Ñ$Ð%BÔCð O‰O×  Ñ  Ð!=Ô >Ø#×3Ñ3×EÑEÓGÑ ˆGWÙØ—‘×$Ñ$ t¨G¨9Ð%5Õ6à—‘×$Ñ$ t¨G¨9Ð%5Ô6ð
×  Ñ  × %Ñ %Õ 'øôKò Ø×!Ñ!×&Ñ&Ð)CÀAÀ3Ð'GÔHÛðF ×  Ñ  × %Ñ %Õ 'ûðK ûôDò    MØ × Ñ × "Ñ "Ð%BÄ3ÀqÃ6À(Ð#K× LÑ Lûð    Mûð ×  Ñ  × %Ñ %Õ 'úsZƒO¢>P(Á<AP(Ã/KP(Ï    P%Ï#P ÐP(РP%Ð%P(Ð(    Q"Ð1'QÑQ%ÑQ"Ñ"Q%Ñ%Rcó—d|_y)u 停止运行FN)rvr;s r3ÚstopzDatabaseUpdater.stopòs    €àˆr5có¦—    d}|jD]}|j|k(sŒ|}n|r |js |jj    d|›d«y|j «}|rŽ|j «}|j||j«}|j«|j«|r |jj    d|›d«y|jj    d|›d«y|jj    d|›d«y#t$r1}|jj    dt|«›«Yd}~yd}~wwxYw)    õ导出用户信息Nu项目 u æ²¡æœ‰å¯å¯¼å‡ºçš„用户信息u çš„用户信息导出完成u çš„用户信息导出失败u无法连接到项目 u  çš„æ•°æ®åº“u#导出用户信息时发生错误: ) rtrr’r‚rƒÚconnectÚcursorÚexport_user_inforpÚcloseÚexport_finished_signalrKrL)r<Ú project_nameržÚuÚconnr©r¡rMs        r3rªz DatabaseUpdater.export_user_infoös:€ð    SàˆGØ—]‘]ò Ø—9‘9  Ó,ؐGÙð ñ
 '×"7Ò"7Ø×!Ñ!×&Ñ&¨°°Ð>]Ð'^Ô_Øð—?‘?Ó$ˆDÙØŸ™›Ø!×2Ñ2°6¸4×;LÑ;LÓMØ— ‘ ”Ø—
‘
” áØ×/Ñ/×4Ñ4°w¸|¸nÐLhÐ5iÕjà×%Ñ%×*Ñ*¨W°\°NÐB^Ð+_Õ`à×!Ñ!×&Ñ&Ð)?À ¸~È]Ð'[Õ\øäò    SØ × Ñ × "Ñ "Ð%HÌÈQËÈÐ#Q× RÑ Rûð    Sús/‚ D£2DÁA?DÃDÃ6DÄ    EÄ'E Å E)NN)rfrgrhrir rLrŠrVr“r„r‚r¬r=r£r¥rªÚ __classcell__©rxs@r3rlrlsKø„Ù=ñ˜C“€JÙ  “o€OÙ “l€OÙ˜c“?€LÙ'¨›_Ðõ
0òK(òZ öSr5rlcóJ—eZdZdZd d„Zd„Zd„Zd d„Zd„Zd„Z    d    „Z
de fd
„Z y) r‹u单个项目更新器cót—||_||_||_||_||_||_g|_g|_yr9)rr?rœÚdb_userÚ db_passwordr@r’ru)r<rr?rœrrAr@s       r3r=zProjectUpdater.__init__s=€ØˆŒ ؈Œ    Ø ˆŒ ؈Œ Ø#ˆÔ؈Œ    ØˆÔ؈Õr5có◠   tjj|j|j|j
|j |jd¬«}|S#t$r
}Yd}~yd}~wwxYw)u建立数据库连接T)r?r@rrArœÚuse_pureN)    ÚmysqlÚ    connectorr¨r?r@r´rµrœr)r<r¯rMs   r3r¨zProjectUpdater.connect$sb€ð     Ü—?‘?×*Ñ*Ø—Y‘YØ—Y‘YØ—\‘\Ø×)Ñ)ØŸ™Øð +óˆDðˆKøÜò    Üûð    ús‚AAÁ    A.Á)A.cóh—    |jd«|j«duS#t$rYywxYw)u$检查是否存在 plain_text å­—段z,SHOW COLUMNS FROM sys_user LIKE 'plain_text'NF©ÚexecuteÚfetchoner)r<r©s  r3Úcheck_plain_text_columnz&ProjectUpdater.check_plain_text_column3s8€ð    Ø N‰NÐIÔ JØ—?‘?Ó$¨DÐ0Ð 0øÜò    Ùð    ús ‚"%¥    1°1Ncó—    d}tg}t|t«r:|r8djdgt    |«z«}|d|›dz }|j |«|j ||«|j«S#t$rgcYSwxYw)u!获取需要更新的用户列表z‰
                SELECT id, login_name, name, current_role_id 
                FROM sys_user 
                WHERE id != %s
            ú,z%sz AND login_name IN (ú))    ÚPROTECTED_USER_IDÚ
isinstanceÚlistÚjoinrr‘r¼Úfetchallr)r<r©rrÚbase_sqlÚparamsÚ placeholderss      r3Úget_users_to_updatez"ProjectUpdater.get_users_to_update;s€ð    ðˆHô (Ð(ˆFô˜+¤tÔ,±Ø"Ÿx™x¨¨´°[Ó1AÑ(AÓB ØÐ2°<°.ÀÐBÑBØ— ‘ ˜kÔ*à N‰N˜8 VÔ ,Ø—?‘?Ó$Ð $øÜò    ØŠIð    ús‚A4A7Á7 BÂBc󚗠   t|«}|rd}|j||||f«yd}|j|||f«y#t$rYywxYw)u更新用户密码zŽ
                    UPDATE sys_user
                    SET plain_text = %s, password = %s
                    WHERE id = %s
                z}
                    UPDATE sys_user
                    SET password = %s
                    WHERE id = %s
                TF)r4r¼r)r<r©Úuser_idÚ
login_nameÚhas_plain_textrpÚhashedÚ
update_sqls        r3Úupdate_user_passwordz#ProjectUpdater.update_user_passwordRsj€ð    ä$ \Ó2ˆFñð
ð
—‘˜z¨L¸&À'Ð+JÔKðð
ð
—‘˜z¨F°GÐ+<Ô=àøÜò    Ùð    ús‚$>§>¾    A
Á    A
c󀗠   |sy|jd|f«|j«}|r|dSdS#t$rYywxYw)u æ ¹æ®è§’色ID获取角色名称õ    æ— è§’色z'SELECT name FROM sys_role WHERE id = %sru角色不存在u 获取失败r»)r<r©Úrole_idÚresults    r3Ú get_role_namezProjectUpdater.get_role_namelsN€ð    "ÙØ"à N‰NÐDÀwÀjÔ QØ—_‘_Ó&ˆFÙ &6˜!‘9Ð =Ð,=Ð =øÜò    "Ù!ð    "ús‚1…)1¯1±    =¼=c
óÖ—    |jsytjtd¬«t    t d„|jD«««}i}|D]}|j ||«}|||<Œg}|jD]1}|j|d||d|j|dd«d    œ«Œ3tj|«}    tjd
d |j«}
|
jd d «}
tj «j#d«} |
›d| ›d} tj$j't| «} |    j)| d¬«y#t*$rYywxYw)u导出用户信息到ExcelFT)Úexist_okc3ó2K—|]}|dsŒ    |d–—Œy­w)rÔNrj)Ú.0rs  r3ú    <genexpr>z2ProjectUpdater.export_user_info.<locals>.<genexpr>‚sèø€Òb°DÐRVÐW`ÓRa  Y¥Ñbùs‚

rÍÚnamerÔrÓ)õ    ç”¨æˆ·åu密码u姓名u 角色名称z [\\/*?:"<>|]Úú ršz%Y%m%du测试环境账号密码_z.xlsx)r~)r’ÚosÚmakedirsÚDEFAULT_EXPORT_DIRrÄÚsetrÖrŒrWr€r”ÚreÚsubrÚreplacerÚnowÚstrftimeÚpathrÅÚto_excelrK)r<r©rpÚrole_idsÚ role_name_maprÔÚ    role_nameÚ export_datarÚ    df_exportÚsafe_project_nameÚdate_strÚfilenameÚfilepaths              r3rªzProjectUpdater.export_user_infoxsk€ð(    Ø×%Ò%Øô K‰KÔ*°TÕ :ôœCÑb¸D×<NÑ<NÔbÓbÓcˆHðˆMØ#ò 3Ø ×.Ñ.¨v°wÓ?    Ø)2 ˜gÒ&ð 3ð
ˆKØ×*Ñ*ò Ø×"Ñ"Ø!% lÑ!3Ø*Ø" 6™lØ$1×$5Ñ$5°d¸9±oÀ{Ó$Sñ    $õð ôŸ ™  [Ó1ˆIô!#§¡ ¸¸D¿L¹LÓ IÐ Ø 1× 9Ñ 9¸#¸sÓ CÐ Ü—|‘|“~×.Ñ.¨xÓ8ˆHØ+Ð,Ð,EÀhÀZÈuÐUˆHÜ—w‘w—|‘|Ô$6¸ÓAˆHà × Ñ ˜x¨uÐ Ô 5Øøäò    Ùð    ús‚ EE EÅ    E(Å'E(c ón—d}d}    |j«}|s'    |r|j«|r|j«yy|j«}|j|«}|j    ||«}|s'    |r|j«|r|j«yy|D]‚\}}}    }
|j |||||«} | sŒ |j j|||    |
dœ«|jj|j|j|||r|ndt|«dœ«Œ„|j«    |r|j«|r|j«yy#t$r(Y|r|j«|r|j«yywxYw#|r|j«|r|j«wwxYw)u!更新数据库中的用户密码NF)ÚidrÍrÜrÔu    æœªæ›´æ–°)rzu    æ•°æ®åº“u用户IDrÝu 明文密码u 哈希密码T)r¨r«r©r¾rÊrÑr’rŒrurrœr4Úcommitr) r<rrrpr¯r©rÎÚusersÚuidrÍrÜÚcurrent_role_idr¡s             r3rzProjectUpdater.update_database¤s´€àˆØˆð2    Ø—<‘<“>ˆDÙØñXØ— ‘ ”ÙØ—
‘
• ððW—[‘[“]ˆFð"×9Ñ9¸&ÓAˆNð×,Ñ,¨V°[ÓAˆEáØñ@Ø— ‘ ”ÙØ—
‘
• ðð?;@ò Ñ6Z  Ø×3Ñ3°F¸CÀÈ^Ð]iÓjâà×&Ñ&×-Ñ-Ø!Ø&0Ø $Ø#2ñ    /ôð×$Ñ$×+Ñ+Ø"&§,¡,Ø%)§]¡]Ø$'Ø%/Ù8F© ÈKÜ(7¸ Ó(Eñ -õð ð. K‰KŒMØñ
Ø— ‘ ”ÙØ—
‘
• ðøô ò    ØáØ— ‘ ”ÙØ—
‘
• ðð     ûñØ— ‘ ”ÙØ—
‘
• ðús5†E¿5EÂ!EÂ=A5EÅ    F
Å"F Æ    F
F Æ 'F4)iê r9) rfrgrhrir=r¨r¾rÊrÑrÖrªÚDEFAULT_NEW_PASSWORDrrjr5r3r‹r‹s6„Ùóò òóò.ò4
"ò*ðX+/Ð=Qô6r5r‹cóR‡—eZdZdZˆfd„Zd„Zd„Zd„Zd„Zd„Z    d„Z
d    „Z d
„Z ˆxZ S) ÚPasswordUpdaterAppu主应用程序窗口cóP•—t‰|«d|_|j«yr9)rnr=Úupdater_threadÚinit_ui)r<rxs €r3r=zPasswordUpdaterApp.__init__àsø€Ü ‰ÑÔØ"ˆÔØ  ‰ r5có8 ‡—‰jd«‰jdddd«t«}‰j|«t    |«}t «}|j |«t«}t    |«}td«}t|«}tt«‰_ td«}|jj‰j«|j t!d««|j ‰j«|j |«|j |«td«}    t|    «}
tt"«‰_‰j$j'tj(«|
j t!d    ««|
j ‰j$«|j |    «td
«} t    | «} t+«‰_td «‰_‰j.jj‰j0«| j ‰j,«| j ‰j.«|j | «td «} t    | «}t3d «‰_t3d«‰_‰j4j9d«t«‰_‰j:j=d«‰j:j?d«‰j4j@jˆfd„«‰j6j@jˆfd„«|j ‰j4«|j ‰j6«|j ‰j:«|j | «tC«‰_"|j ‰jD«td«‰_#‰jFjj‰jH«|j ‰jF«t«}t    |«}tK«‰_&‰jLjOd«|j t!d««|j ‰jL«t«}t    |«}t+«‰_(td«‰_)‰jRjj‰jT«|j t!d««|j ‰jP«|j ‰jR«|jW|d«|jW|d«|jW|d«y)u初始化用户界面u!数据库密码批量修改工具r}i iXuExcel配置文件u    æµè§ˆ...uExcel文件路径:u新密码设置u
新密码:u 项目选择u 加载项目u 操作模式u3批量更新所有用户(排除ID为1的用户)u指定用户名更新Tu'输入用户名,多个用逗号分隔Fcól•—‰jj‰jj« «Sr9)Úusernames_editÚ
setEnabledÚall_users_radioÚ    isCheckedr;s€r3ú<lambda>z,PasswordUpdaterApp.init_ui.<locals>.<lambda>#s*ø€D×'Ñ'×2Ñ2°t×7KÑ7K×7UÑ7UÓ7WÐ3WÓX€r5cój•—‰jj‰jj««Sr9)rrÚspecific_users_radiorr;s€r3rz,PasswordUpdaterApp.init_ui.<locals>.<lambda>%s'ø€D×'Ñ'×2Ñ2°4×3LÑ3L×3VÑ3VÓ3XÓY€r5õ 开始更新u 操作日志:u导出选中项目用户信息u已更新项目列表:u配置u日志u导出N),ÚsetWindowTitleÚ setGeometryrÚsetCentralWidgetrrÚ    addWidgetrrrÚDEFAULT_EXCEL_PATHÚexcel_path_editrÚclickedr¨Úbrowse_excel_filerrúÚ password_editÚ setEchoModeÚPasswordrÚ projects_listÚload_projects_btnÚ load_projectsrrrÚ
setCheckedrÚsetPlaceholderTextrÚtoggledrÚ progress_barÚ    start_btnÚ start_updaterÚlog_textÚ setReadOnlyÚ export_listÚ
export_btnrªÚaddTab)r<Úcentral_widgetÚlayoutÚtabsÚ
config_tabÚ config_layoutÚ excel_groupÚ excel_layoutÚexcel_browse_btnÚpassword_groupÚpassword_layoutÚprojects_groupÚprojects_layoutÚ
mode_groupÚ mode_layoutÚlog_tabÚ
log_layoutÚ
export_tabÚ export_layouts`                  r3rÿzPasswordUpdaterApp.init_uiås[ø€à ×ÑÐ?Ô@Ø ×ј˜c 3¨Ô,ô!›ˆØ ×јnÔ-ܘ^Ó,ˆô‹|ˆØ×јÔô“Yˆ
Ü# JÓ/ˆ ô Ð 3Ó4ˆ Ü" ;Ó/ˆ Ü(Ô);Ó<ˆÔÜ& {Ó3ÐØ× Ñ ×(Ñ(¨×)?Ñ)?Ô@Ø×ÑœvÐ&:Ó;Ô<Ø×јt×3Ñ3Ô4Ø×ÑÐ/Ô0Ø×Ñ  Ô,ô#Ð#4Ó5ˆÜ% nÓ5ˆÜ&Ô';Ó<ˆÔØ ×Ñ×&Ñ&¤y×'9Ñ'9Ô:Ø×!Ñ!¤&¨Ó"6Ô7Ø×!Ñ! $×"4Ñ"4Ô5Ø×Ñ Ô/ô# >Ó2ˆÜ% nÓ5ˆÜ(›]ˆÔÜ!,¨^Ó!<ˆÔØ ×Ñ×&Ñ&×.Ñ.¨t×/AÑ/AÔBØ×!Ñ! $×"4Ñ"4Ô5Ø×!Ñ! $×"8Ñ"8Ô9Ø×Ñ Ô/ô˜~Ó.ˆ
Ü! *Ó-ˆ Ü+Ð,aÓbˆÔÜ$0Ð1HÓ$IˆÔ!Ø ×Ñ×'Ñ'¨Ô-ô(›kˆÔØ ×Ñ×.Ñ.Ð/XÔYØ ×Ñ×&Ñ& uÔ-ð     ×Ñ×$Ñ$×,Ñ,Û Xô    Zà ×!Ñ!×)Ñ)×1Ñ1Û Yô    [ð    ×јd×2Ñ2Ô3Ø×јd×7Ñ7Ô8Ø×јd×1Ñ1Ô2Ø×Ñ 
Ô+ô)›NˆÔØ×Ñ × 1Ñ 1Ô2ô% ^Ó4ˆŒØ ‰×Ñ×&Ñ& t×'8Ñ'8Ô9Ø×Ñ §¡Ô/ô“)ˆÜ  Ó)ˆ
Ü!› ˆŒ Ø  ‰ ×!Ñ! $Ô'Ø×ÑœV OÓ4Ô5Ø×јTŸ]™]Ô+ô“Yˆ
Ü# JÓ/ˆ Ü&›=ˆÔÜ%Ð&FÓGˆŒØ ‰×Ñ×'Ñ'¨×(=Ñ(=Ô>Ø×ѤÐ'?Ó @ÔAØ×Ñ × 0Ñ 0Ô1Ø×Ñ §¡Ô0ð      ‰ J Ô)Ø  ‰ G˜XÔ&Ø  ‰ J Õ)r5cóv—tj|ddd«\}}|r|jj|«yy)u浏览Excel文件u选择Excel文件rÞzExcel Files (*.xlsx *.xls)N)rÚgetOpenFileNamerÚsetText)r<Ú    file_pathršs   r3rz$PasswordUpdaterApp.browse_excel_fileLs?€ä"×2Ñ2Ø Ð% rÐ+Gó
‰ ˆ    1ñ Ø ×  Ñ  × (Ñ (¨Õ 3ð r5c    ó¢—|jj«}tjj    |«st j |dd«y    tj|«}|dj«j«}|jj«|D]G}t|«}|jtj «|jj#|«ŒI|j$j'dt)|«›d«y#t*$r-}t j |ddt-|«›«Yd}~yd}~wwxYw)u加载项目列表õ错误uExcel文件不存在Nrzu
已加载 u
 ä¸ªé¡¹ç›®u读取Excel文件失败: )rÚtextràréÚexistsrÚwarningr€rr…r†rÚclearrÚ setCheckStaterÚ    UncheckedÚaddItemrrŒrrKrL)r<ror—ÚprojectsrÚitemrMs       r3rz PasswordUpdaterApp.load_projectsTs€à×)Ñ)×.Ñ.Ó0ˆ
܏w‰w~‰~˜jÔ)Ü × Ñ   hÐ0FÔ GØ ð     VÜ—‘˜zÓ*ˆBؘ(‘|×*Ñ*Ó,×3Ñ3Ó5ˆHà × Ñ × $Ñ $Ô &Ø#ò 1Ü& wÓ/Ø×"Ñ"¤2§<¡<Ô0Ø×"Ñ"×*Ñ*¨4Õ0ð 1ð
M‰M×  Ñ   :¬c°(«m¨_¸JÐ!GÕ HøÜò    VÜ × Ñ   hÐ2KÌCÐPQËFÈ8Ð0T× UÑ Uûð    VúsÁCDÄ    EÄ!#E    Å    EcóÈ—g}t|jj««D]^}|jj|«}|j    «t
j k(sŒ@|j|j««Œ`|stj|dd«y|jj«rd}d}n€d}|jj«j«}|stj|dd«y|jdd«j!d«Dcgc]}|j«‘Œ}}|j"j«}|stj|dd    «yt%|j&j«||||«|_|j(j*j-|j.j«|j(j0j-|j2j4«|j(j6j-|j8«|j(j:j-|j<«|j(j>j-|j.j«|j@jCd
«|j(jE«ycc}w) r    r:u请至少选择一个项目NÚallr|u请输入要更新的用户名u,rÀu请输入新密码F)#rXrÚcountrCÚ
checkStaterÚCheckedrŒr;rr=rrrÚstripræÚsplitrrlrrþrŠr¨rr“rÚsetValuer„Úon_update_finishedr‚Ú
show_errorr¬rrÚstart)    r<rsr rCrqrrÚ    usernamesrÜrps             r3rzPasswordUpdaterApp.start_updateisH€ðÐܐt×)Ñ)×/Ñ/Ó1Ó2ò    6ˆAØ×%Ñ%×*Ñ*¨1Ó-ˆD؏‰Ó ¤B§J¡JÓ.Ø!×(Ñ(¨¯©«Õ5ð    6ñ
!Ü × Ñ   hÐ0MÔ NØ ð × Ñ × )Ñ )Ô +؈D؉KàˆDØ×+Ñ+×0Ñ0Ó2×8Ñ8Ó:ˆIÙÜ×#Ñ# D¨(Ð4TÔUØØ4=×4EÑ4EÀeÈSÓ4Q×4WÑ4WÐX[Ó4\Ö]¨D˜4Ÿ:™:<Ð]ˆKÐ]ð×)Ñ)×.Ñ.Ó0ˆ ÙÜ × Ñ   hÐ0DÔ EØ ô.Ø ×  Ñ  × %Ñ %Ó 'Ø Ø Ø Ø ó 
ˆÔð     ×Ñ×&Ñ&×.Ñ.¨t¯}©}×/CÑ/CÔDØ ×Ñ×+Ñ+×3Ñ3°D×4EÑ4E×4NÑ4NÔOØ ×Ñ×+Ñ+×3Ñ3°D×4KÑ4KÔLØ ×Ñ×(Ñ(×0Ñ0°·±ÔAØ ×Ñ×2Ñ2×:Ñ:¸4¿=¹=×;OÑ;OÔPð     ‰×!Ñ! %Ô(ð     ×Ñ×!Ñ!Õ#ùò9^sÄ'Kcó"—|jjd«|jjd«|jrÍ|jj
r¶|j j«|jj
D]‚}|jsŒt|j›dt|j«›d«}|jtj|j«|j j|«Œ„yyy)u更新完成后的处理Tr}z (u ç”¨æˆ·)N)rrrrKrþrtr r>r’rrrÚsetDatarÚUserRolerA)r<ržrCs   r3rLz%PasswordUpdaterApp.on_update_finishedžsӀà ‰×!Ñ! $Ô'Ø ×Ñ×"Ñ" 3Ô'ð × Ò  4×#6Ñ#6×#?Ò#?Ø × Ñ × "Ñ "Ô $Ø×.Ñ.×7Ñ7ò 3Ø×(Ó(Ü*¨g¯o©oÐ->¸bÄÀW×EZÑEZÓA[Ð@\Ð\dÐ+eÓfDØ—L‘L¤§¡¨g¯o©oÔ>Ø×$Ñ$×,Ñ,¨TÕ2ñ     3ð$@Ð r5cót—|jj«}|stj|dd«y|jstj|dd«y|D][}|j t j«}|jjd|›d«|jj|«Œ]y)r§r:u请选择要导出的项目Nu没有可导出的数据u开始导出项目 u çš„用户信息...) r Ú selectedItemsrr=rþÚdatarrRrrŒrª)r<Úselected_itemsrCr­s    r3rªz#PasswordUpdaterApp.export_user_info¬s €à×)Ñ)×7Ñ7Ó9ˆÙÜ × Ñ   hÐ0MÔ NØ à×"Ò"Ü × Ñ   hÐ0JÔ KØ à"ò    ?ˆDØŸ9™9¤R§[¡[Ó1ˆLØ M‰M×  Ñ  Ð#6°|°nÐDWÐ!XÔ YØ × Ñ × 0Ñ 0°Õ >ñ    ?r5cóh—tj|d|«|jjd«y)u显示错误信息r:TN)rÚcriticalrr)r<Ú    error_msgs  r3rMzPasswordUpdaterApp.show_error¼s&€ä×јT 8¨YÔ7Ø ‰×!Ñ! $Õ'r5cóΗ|jrÉ|jj«r¯tj|ddtjtj
ztj
«}|tjk(rE|jj «|jj«|j«y|j«y|j«y)u关闭应用程序事件u 确认退出u3更新操作正在进行中,确定要退出吗?N)
rþÚ    isRunningrÚquestionÚYesÚNor¥ÚwaitÚacceptÚignore)r<ÚeventÚreplys   r3Ú
closeEventzPasswordUpdaterApp.closeEventÁs˜€à × Ò  4×#6Ñ#6×#@Ñ#@Ô#BÜ×(Ñ(ؐnØEÜ—‘¤+§.¡.Ñ0Ü—‘ó    ˆE𜠟™Ò'Ø×#Ñ#×(Ñ(Ô*Ø×#Ñ#×(Ñ(Ô*Ø— ‘ •à— ‘ •à L‰LNr5)rfrgrhrir=rÿrrrrLrªrMrdr°r±s@r3rürüÝs7ø„Ùôò
e*òN4òVò*3$òj 3ò?ò (ö
r5rücó°—ttj«}t«}|j    «tj
|j ««y)u    ä¸»å‡½æ•°N)r ÚsysÚargvrüÚshowÚexitÚexec_)ÚappÚwindows  r3ÚmainrmÕs3€ä
”s—x‘xÓ
 €CÜ Ó !€FØ
‡KK„M܇HHˆSY‰Y‹[Õr5Ú__main__)LrfràÚpandasr€Úmysql.connectorr¸rrÚtypingrrrrräÚPyQt5r    r
r ÚPyQt5.QtWidgetsr r rrrrrrrrrrrrrrrrrÚ PyQt5.QtCorerr r!ÚgetattrréÚdirnameÚ
executableÚBASE_DIRÚabspathÚ__file__rÅrr–rârúrÂrErFrGÚargon2r%rIrJriÚ SALT_LENGTHÚ HASH_LENGTHÚ PARALLELISMÚMEMORYÚ
ITERATIONSr0r4r7rlr‹rürmrfrjr5r3ú<module>rsºðÛ
Û    ÛÛÝ!Ýß,Ó,Û    ß*Ñ*÷P÷P÷P÷P÷PñP÷1Ñ0ñ ˆ3˜%Ô àw‰w‰˜sŸ~™~Ó.Hðw‰w‰˜rŸw™wŸ™¨xÓ8Ó9€Hð—W‘W—\‘\ (¨IÐ7MÓNÐØ—w‘w—|‘| HÐ.@ÓAÐØ—W‘W—\‘\ (Ð,@ÓAÐØ#ÐØÐð€
Ø €
Ø€ðÝ%ð € Ø€ Ø€ Ø    €Ø €
ñØØØØ Ø ô € ò,÷
KHñKHô\ESgôES÷PCñCôLu˜ôuòpð ˆzÒÙ…FðøðmòÙ    Ð
<Ô=Ø €C‡HHˆQ†KðúsÄ/F
Æ
F,Æ+F,