hyb
2025-12-31 6cdcd01f77e11b72c323603e27ebdb85b15223c9
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
Ë
Q—2iVgãóê—ddlZddlZddlZddlZddlZddlmZddlZddl    Z    ddl
m
Z
ddl m Z m Z mZmZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+m,Z,e-edd    «r&ej\j_ej`«Z1n4ej\j_ej\jee3««Z1ej\jie1d
d «Z5ej\jie1d «Z6ej\jie1d «Z7dZ8dZ9dZ:dZ;dZ<Gd„d«Z=Gd„de,«Z>Gd„d«Z?Gd„de«Z@d„ZAeBdk(reA«yy)é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.168ircó"—eZdZdZd„Zd„Zd„Zy)ÚRedisRefresheruRedis缓存刷新器có—d|_y©N)Ú redis_client©Úselfs õuh:\项目\archive\测试组\脚本\Change_password\修改数据库的哈希密码和原始密码做桌面客户端.pyÚ__init__zRedisRefresher.__init__+s
€Ø ˆÕócó—    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+r4Úes   r,Ú connect_rediszRedisRefresher.connect_redis.s~€ð    ã Ø %§ ¡ ÜÜÜ'Ø!%ð    !,ó!ˆ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)r?Ú
config_getÚintÚgetÚrangeÚconnection_poolÚget_connectionÚ send_commandÚ read_responser;Úreleaser<r=)    r+ÚconfigÚdb_countÚ refreshed_dbsÚ
total_keysÚdb_indexÚ temp_clientÚ    key_countr>s             r,Úrefresh_all_redisz RedisRefresher.refresh_all_redisCs·€ð.    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-r?rV©r.r,r&r&(s„Ùò!òó*0Hr.r&c󄇗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_runningr&Úredis_refresher)r+r`rarbrcrdÚ    __class__s      €r,r-zDatabaseUpdater.__init__€sUø€Ü ‰ÑÔØ$ˆŒØ(ˆÔ؈Œ    Ø&ˆÔØ!2ˆÔ؈Œ ØˆÔØˆŒÜ-Ó/ˆÕr.c    ó    —        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)rcrau✅ u æ›´æ–°å®Œæˆï¼Œå…± u
 ä¸ªç”¨æˆ·u❌ u  æ›´æ–°å¤±è´¥r$édFz    utf-8-sig)ÚindexÚencodingu所有更新日志已保存至 u无任何更新记录生成u开始刷新Redis缓存...u运行过程中发生错误: )$ÚpdÚ
read_excelr`r<Ú error_signalÚemitÚfinished_signalÚuniqueÚtolistrdÚisinÚemptyreÚiterrowsÚ
log_signalÚProjectUpdaterÚappendÚlenÚ    enumeratergÚprojectÚupdate_databaserbrcrarfÚextendÚ updated_usersÚprogress_signalrGÚ    DataFrameÚto_csvÚDEFAULT_LOG_CSV_PATHrhrVr=)r+Údfr>Ú all_projectsÚ df_filteredÚ_Úrowr€r0r1ÚdatabaseÚuserr2ÚupdaterÚtotal_projectsÚiÚsuccessÚmessages                  r,Ú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)rgr*s r,ÚstopzDatabaseUpdater.stopÙs    €àˆr.có¦—    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#导出用户信息时发生错误: ) rer€rƒrsrtÚconnectÚcursorÚexport_user_inforaÚcloseÚexport_finished_signalr<r=)r+Ú project_namerÚuÚconnršr’r>s        r,r›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)rWrXrYrZr r=r{rGr„rursrr-r”r–r›Ú __classcell__©ris@r,r]r]vsKø„Ù=ñ˜C“€JÙ  “o€OÙ “l€OÙ˜c“?€LÙ'¨›_Ðõ
0òK(òZ öSr.r]cóJ—eZdZdZd d„Zd„Zd„Zd d„Zd„Zd„Z    d    „Z
de fd
„Z y) r|u单个项目更新器cót—||_||_||_||_||_||_g|_g|_yr()r€r0rÚdb_userÚ db_passwordr1rƒrf)r+r€r0rrŽr2r1s       r,r-zProjectUpdater.__init__s=€ØˆŒ ؈Œ    Ø ˆŒ ؈Œ Ø#ˆÔ؈Œ    ØˆÔ؈Õr.có◠   tjj|j|j|j
|j |jd¬«}|S#t$r
}Yd}~yd}~wwxYw)u建立数据库连接T)r0r1rŽr2rÚuse_pureN)    ÚmysqlÚ    connectorr™r0r1r¥r¦rr)r+r r>s   r,r™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  r,Úcheck_plain_text_columnz&ProjectUpdater.check_plain_text_columns8€ð    Ø 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šrcÚbase_sqlÚparamsÚ placeholderss      r,Ú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ó—    tjd¬«}tj|jd«|«j    d«}|rd}|j ||||f«yd}|j |||f«y#t $rYywxYw)u更新用户密码é
©Úroundsúutf-8zŽ
                    UPDATE sys_user
                    SET plain_text = %s, password = %s
                    WHERE id = %s
                z}
                    UPDATE sys_user
                    SET password = %s
                    WHERE id = %s
                TF)ÚbcryptÚgensaltÚhashpwÚencodeÚdecoder­r)    r+ršÚuser_idÚ
login_nameÚhas_plain_textraÚsaltÚhashedÚ
update_sqls             r,Úupdate_user_passwordz#ProjectUpdater.update_user_password9s”€ð    Ü—>‘>¨Ô,ˆDÜ—]‘] <×#6Ñ#6°wÓ#?ÀÓF×MÑMÈgÓVˆFñð
ð
—‘˜z¨L¸&À'Ð+JÔKðð
ð
—‘˜z¨F°GÐ+<Ô=àøÜò    Ùð    ús‚A#A=Á&A=Á=    B    ÂB    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    r,Ú get_role_namezProjectUpdater.get_role_nameSsN€ð    "ÙØ"à 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ÏNr[)Ú.0rŽs  r,ú    <genexpr>z2ProjectUpdater.export_user_info.<locals>.<genexpr>isèø€Òb°DÐRVÐW`ÓRa  Y¥Ñbùs‚

rÇÚnamerÏrÎ)õ    ç”¨æˆ·åu密码u姓名u 角色名称z [\\/*?:"<>|]Úú r‹z%Y%m%du测试环境账号密码_z.xlsx)ro)rƒÚosÚmakedirsÚDEFAULT_EXPORT_DIRrµÚsetrÑr}rHrqr…ÚreÚsubr€ÚreplacerÚnowÚstrftimeÚpathr¶Úto_excelr<)r+ršraÚrole_idsÚ role_name_maprÏÚ    role_nameÚ export_datarŽÚ    df_exportÚsafe_project_nameÚdate_strÚfilenameÚfilepaths              r,r›zProjectUpdater.export_user_info_sk€ð(    Ø×%Ò%Øô 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óè—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|ndtj|jd«tjd¬««jd«dœ«ŒÁ|j!«    |r|j«|r|j«y    y    #t"$r(Y|r|j«|r|j«yywxYw#|r|j«|r|j«wwxYw)
u!更新数据库中的用户密码NF)ÚidrÇr×rÏu    æœªæ›´æ–°rÀr½r¾)rku    æ•°æ®åº“u用户IDrØu 明文密码u 哈希密码T)r™rœršr¯r»rÌrƒr}rfr€rrÁrÃrÄrÂrÅÚcommitr) r+rcrar ršrÈÚusersÚuidrÇr×Úcurrent_role_idr’s             r,rzProjectUpdater.update_database‹sá€àˆØˆð3    Ø—<‘<“>ˆDÙØñZØ— ‘ ”ÙØ—
‘
• ððY—[‘[“]ˆFð"×9Ñ9¸&ÓAˆNð×,Ñ,¨V°[ÓAˆEáØñBØ— ‘ ”ÙØ—
‘
• ððA;@ò Ñ6Z  Ø×3Ñ3°F¸CÀÈ^Ð]iÓjâà×&Ñ&×-Ñ-Ø!Ø&0Ø $Ø#2ñ    /ôð×$Ñ$×+Ñ+Ø"&§,¡,Ø%)§]¡]Ø$'Ø%/Ù8F© ÈKÜ(.¯ © °l×6IÑ6IÈ'Ó6RÔTZ×TbÑTbÐjlÔTmÓ(n×(uÑ(uØ#ó)%ñ -õð ð0 K‰KŒMØñ
Ø— ‘ ”ÙØ—
‘
• ðøô ò    ØáØ— ‘ ”ÙØ—
‘
• ðð     ûñØ— ‘ ”ÙØ—
‘
• ðús5†F¿5FÂ!FÂ=B2FÆ    GÆG
ÇGÇG
Ç
'G1)iê r() rWrXrYrZr-r™r¯r»rÌrÑr›ÚDEFAULT_NEW_PASSWORDrr[r.r,r|r|þs6„Ùóò òóò.ò4
"ò*ðX+/Ð=Qô7r.r|cóR‡—eZdZdZˆfd„Zd„Zd„Zd„Zd„Zd„Z    d„Z
d    „Z d
„Z ˆxZ S) ÚPasswordUpdaterAppu主应用程序窗口cóP•—t‰|«d|_|j«yr()r_r-Úupdater_threadÚinit_ui)r+ris €r,r-zPasswordUpdaterApp.__init__Èsø€Ü ‰ÑÔØ"ˆÔØ  ‰ r.có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!数据库密码批量修改工具rni iXuExcel配置文件u    æµè§ˆ...uExcel文件路径:u新密码设置u
新密码:u 项目选择u 加载项目u 操作模式u3批量更新所有用户(排除ID为1的用户)u指定用户名更新Tu'输入用户名,多个用逗号分隔Fcól•—‰jj‰jj« «Sr()Úusernames_editÚ
setEnabledÚall_users_radioÚ    isCheckedr*s€r,ú<lambda>z,PasswordUpdaterApp.init_ui.<locals>.<lambda> s*ø€D×'Ñ'×2Ñ2°t×7KÑ7K×7UÑ7UÓ7WÐ3WÓX€r.cój•—‰jj‰jj««Sr()rýrþÚspecific_users_radiorr*s€r,rz,PasswordUpdaterApp.init_ui.<locals>.<lambda> s'ø€D×'Ñ'×2Ñ2°4×3LÑ3L×3VÑ3VÓ3XÓY€r.õ 开始更新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_projectsrrÿrÚ
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`                  r,rú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 Õ)r.cóv—tj|ddd«\}}|r|jj|«yy)u浏览Excel文件u选择Excel文件rÙzExcel Files (*.xlsx *.xls)N)rÚgetOpenFileNamer
ÚsetText)r+Ú    file_pathr‹s   r,r z$PasswordUpdaterApp.browse_excel_file4s?€ä"×2Ñ2Ø Ð% rÐ+Gó
‰ ˆ    1ñ Ø ×  Ñ  × (Ñ (¨Õ 3ð r.c    ó¢—|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文件不存在Nrku
已加载 u
 ä¸ªé¡¹ç›®u读取Excel文件失败: )r
ÚtextrÛräÚexistsrÚwarningrqrrrvrwrÚclearrÚ setCheckStaterÚ    UncheckedÚaddItemrr}r~r<r=)r+r`rˆÚprojectsr€Úitemr>s       r,rz PasswordUpdaterApp.load_projects<s€à×)Ñ)×.Ñ.Ó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) rr5u请至少选择一个项目NÚallrmu请输入要更新的用户名u,r±u请输入新密码F)#rIrÚcountr>Ú
checkStaterÚCheckedr}r6rr8rÿrrýÚstripráÚsplitr r]r
rùr{r™rr„rÚsetValueruÚon_update_finishedrsÚ
show_errorrrrþÚstart)    r+rdr‘r>rbrcÚ    usernamesr×ras             r,rzPasswordUpdaterApp.start_updateQsH€ðÐܐ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更新完成后的处理Trnz (u ç”¨æˆ·)N)rrþrrFrùrerr9rƒrr€r~ÚsetDatarÚUserRoler<)r+rr>s   r,rGz%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ð$@Ð r.cót—|jj«}|stj|dd«y|jstj|dd«y|D][}|j t j«}|jjd|›d«|jj|«Œ]y)r˜r5u请选择要导出的项目Nu没有可导出的数据u开始导出项目 u çš„用户信息...) rÚ selectedItemsrr8rùÚdatarrMrr}r›)r+Úselected_itemsr>ržs    r,r›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°Õ >ñ    ?r.cóh—tj|d|«|jjd«y)u显示错误信息r5TN)rÚcriticalrrþ)r+Ú    error_msgs  r,rHzPasswordUpdaterApp.show_error¤s&€ä×јT 8¨YÔ7Ø ‰×!Ñ! $Õ'r.cóΗ|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   r,Ú
closeEventzPasswordUpdaterApp.closeEvent©s˜€à × Ò  4×#6Ñ#6×#@Ñ#@Ô#BÜ×(Ñ(ؐnØEÜ—‘¤+§.¡.Ñ0Ü—‘ó    ˆE𜠟™Ò'Ø×#Ñ#×(Ñ(Ô*Ø×#Ñ#×(Ñ(Ô*Ø— ‘ •à— ‘ •à L‰LNr.)rWrXrYrZr-rúr rrrGr›rHr_r¡r¢s@r,r÷r÷Ås7ø„Ùôò
e*òN4òVò*3$òj 3ò?ò (ö
r.r÷có°—ttj«}t«}|j    «tj
|j ««y)u    ä¸»å‡½æ•°N)r ÚsysÚargvr÷ÚshowÚexitÚexec_)ÚappÚwindows  r,Úmainrh½s3€ä
”s—x‘xÓ
 €CÜ Ó !€FØ
‡KK„M܇HHˆSY‰Y‹[Õr.Ú__main__)CrarÛÚpandasrqrÁÚmysql.connectorr©rÚasyncioÚ    threadingrÚtypingrrrrrßÚPyQt5r    r
r ÚPyQt5.QtWidgetsr r rrrrrrrrrrrrrrrrrÚ PyQt5.QtCorerr r!ÚgetattrräÚdirnameÚ
executableÚBASE_DIRÚabspathÚ__file__r¶r    r‡rÝrõr³r6r7r8r&r]r|r÷rhrWr[r.r,ú<module>rxsXðÛ
Û    ÛÛ ÛÝ!ÛÛÝß,Ó,Û    ß*Ñ*÷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÷PDñDôNu˜ôuòpð ˆzÒÙ…Fðr.