U
    Òä(j¿/  ã                   @   sx   d dl mZmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlZd dlZd dlZd dlZd dlZi Zdd„ ZdS )é    )ÚrequestÚjsonify)Úget_db)Úget_user_id_from_tokenÚgenerate_tokenÚadmin_required)Úerror_responseÚbuild_search_conditionsNc                 C   sj  | j ddgddd„ ƒ}| j ddgddd	„ ƒ}| j d
dgdtdd„ ƒƒ}| j ddgdtdd„ ƒƒ}| j dddgdtdd„ ƒƒ}| j ddgdtdd„ ƒƒ}| j ddgdtdd„ ƒƒ}| j ddgdtdd„ ƒƒ}| j ddgdtdd„ ƒƒ}	| j ddgdtd d!„ ƒƒ}
| j dd"gdtd#d$„ ƒƒ}| j d%dgdtd&d'„ ƒƒ}| j d%dgdtd(d)„ ƒƒ}d S )*Nz/api/admin/captchaÚGET)Úmethodsc                  S   s^   t t ¡ ƒ} t dd¡}t dd¡}|› d|› d}|| }|tj ¡ dœt| < t| |dœƒS )Né   é	   z + z = ?)ÚanswerZ
created_at)Ú
captcha_idÚquestion)	ÚstrÚuuidÚuuid4ÚrandomÚrandintÚdatetimeÚnowÚcaptcha_storer   )r   Znum1Znum2r   r   © r   ú:D:\Project\Python Project\BangBang\backend\routes\admin.pyÚget_captcha   s    þ
þz*register_admin_routes.<locals>.get_captchaz/api/admin/loginÚPOSTc               
   S   s€  t j} |  d¡}|  d¡}|  d¡}|  d¡}|r6|s>tdƒS |tkrNtdƒS t|ƒt| d krjtdƒS t|= tƒ }| ¡ }zòz¼| 	d	|f¡ | 
¡ }|sªtd
ƒW W ¢ÊS t | d¡|d  d¡¡r,t d¡}tj ¡ tjdd }	| 	d|d ||	 d¡f¡ | ¡  tdd|d|d idœƒW W ¢HS td
ƒW W ¢:S W n0 tk
rl }
 z| ¡  |
‚W 5 d }
~
X Y nX W 5 | ¡  X d S )NÚusernameÚpasswordr   Úcaptchau   è¯·è¾“å…¥éªŒè¯ç u   éªŒè¯ç å·²è¿‡æœŸï¼Œè¯·åˆ·æ–°r   u   éªŒè¯ç é”™è¯¯ú,SELECT * FROM admin_users WHERE username = ?u   ç”¨æˆ·åæˆ–å¯†ç é”™è¯¯úutf-8é    é   )ÚdayszIINSERT INTO admin_sessions (admin_id, token, expires_at) VALUES (?, ?, ?)Úidz%Y-%m-%d %H:%M:%STu   ç™»å½•æˆåŠŸ)ÚsuccessÚmessageÚtokenÚadmin)r   ÚjsonÚgetr   r   Úintr   ÚcursorÚcloseÚexecuteÚfetchoneÚbcryptÚcheckpwÚencodeÚsecretsÚtoken_urlsafer   r   Ú	timedeltaÚstrftimeÚcommitr   Ú	ExceptionÚrollback)Údatar   r   r   r   Úconnr-   r)   r(   Ú
expires_atÚer   r   r   Úadmin_login    sL    




þ
üz*register_admin_routes.<locals>.admin_loginz/api/admin/mec                   S   s   t ddtjd idœƒS )NTr   )r&   r)   )r   r   r)   r   r   r   r   Úget_admin_meR   s    z+register_admin_routes.<locals>.get_admin_mez/api/admin/logoutc               
   S   sž   t j d¡} | r|  d¡r|  d¡d }tƒ }| ¡ }zNz| d|f¡ | 	¡  W n. t
k
r€ } z| ¡  |‚W 5 d }~X Y nX W 5 | ¡  X tdddœƒS )	NÚAuthorizationzBearer ú r   z*DELETE FROM admin_sessions WHERE token = ?Tu   é€€å‡ºæˆåŠŸ©r&   r'   )r   Úheadersr+   Ú
startswithÚsplitr   r-   r.   r/   r8   r9   r:   r   )Úauth_headerr(   r<   r-   r>   r   r   r   Úadmin_logoutW   s    
z+register_admin_routes.<locals>.admin_logoutz/api/admin/passwordÚPUTc               
   S   s  t j} |  d¡}|  d¡}|r"|s*tdƒS tƒ }| ¡ }zÌz–| dd¡ | ¡ }|sbtdƒW W ¢¦S t	 
| d¡|d  d¡¡rÀt	 | d¡t	 ¡ ¡}| d	|d
f¡ | ¡  tdddœƒW W ¢HS tdƒW W ¢:S W n0 tk
r  } z| ¡  |‚W 5 d }~X Y nX W 5 | ¡  X d S )NÚold_passwordÚnew_passwordu   è¯·è¾“å…¥æ—§å¯†ç å’Œæ–°å¯†ç r    )r)   u   ç®¡ç†å‘˜ä¸å­˜åœ¨r!   r   z6UPDATE admin_users SET password = ? WHERE username = ?r)   Tu   å¯†ç ä¿®æ”¹æˆåŠŸrC   u   æ—§å¯†ç é”™è¯¯)r   r*   r+   r   r   r-   r.   r/   r0   r1   r2   r3   ZhashpwZgensaltr8   r   r9   r:   )r;   rJ   rK   r<   r-   r)   Zhashed_passwordr>   r   r   r   Úadmin_change_passwordi   s,    

z4register_admin_routes.<locals>.admin_change_passwordz/api/admin/newsc                  S   s    t tj dd¡ƒ} t tj dd¡ƒ}| d | }tƒ }| ¡ }zR| d¡ | ¡ d }| d||f¡ | 	¡ }dd	„ |D ƒ}t
||| |d
œƒW ¢S | ¡  X d S )NÚpager   Úlimité
   z4SELECT COUNT(*) FROM news WHERE status = "published"r   z§
                SELECT * FROM news WHERE status = "published" 
                ORDER BY sort_order ASC, created_at DESC 
                LIMIT ? OFFSET ?
            c                 S   s   g | ]}t |ƒ‘qS r   )Údict)Ú.0Úrowr   r   r   Ú
<listcomp>   s     zAregister_admin_routes.<locals>.get_admin_news.<locals>.<listcomp>©ÚitemsÚtotalrM   rN   )r,   r   Úargsr+   r   r-   r.   r/   r0   Úfetchallr   )rM   rN   Úoffsetr<   r-   rV   ÚrowsrU   r   r   r   Úget_admin_news‰   s    
üz-register_admin_routes.<locals>.get_admin_newsz/api/admin/news/<int:news_id>c                 S   sT   t ƒ }| ¡ }z6| d| f¡ | ¡ }|s6tdƒW ¢S tt|ƒƒW ¢S | ¡  X d S )NzSELECT * FROM news WHERE id = ?u   èµ„è®¯ä¸å­˜åœ¨)r   r-   r.   r/   r0   r   r   rP   )Znews_idr<   r-   rR   r   r   r   Úget_admin_news_item£   s    z2register_admin_routes.<locals>.get_admin_news_itemz/api/admin/usersc                  S   s,  t j d¡} tt j dd¡ƒ}tt j dd¡ƒ}|d | }tƒ }| ¡ }zÒd}d}g }g }	| rždd	g}
t|
| ƒ\}}|rž||7 }||7 }| |¡ |	 |¡ | 	||	¡ | 
¡ d
 }|d7 }| ||g¡ | 	||¡ | ¡ }g }|D ]}t|ƒ}d|d< | |¡ qèt||||dœƒW ¢S | ¡  X d S )NÚsearchrM   r   rN   rO   z,SELECT * FROM users WHERE deleted_at IS NULLz3SELECT COUNT(*) FROM users WHERE deleted_at IS NULLÚphoneÚnicknamer   z* ORDER BY created_at DESC LIMIT ? OFFSET ?ú******r   rT   )r   rW   r+   r,   r   r-   r.   r	   Úextendr/   r0   rX   rP   Úappendr   )r]   rM   rN   rY   r<   r-   ÚqueryÚcount_queryÚparamsÚcount_paramsÚsearch_fieldsÚsearch_condÚsearch_paramsrV   rZ   rU   rR   Úuserr   r   r   Úget_admin_users³   s@    

z.register_admin_routes.<locals>.get_admin_usersz/api/admin/users/<int:user_id>c                 S   s`   t ƒ }| ¡ }zB| d| f¡ | ¡ }|s6tdƒW ¢S t|ƒ}d|d< t|ƒW ¢S | ¡  X d S )Nú7SELECT * FROM users WHERE id = ? AND deleted_at IS NULLu   ç”¨æˆ·ä¸å­˜åœ¨r`   r   )r   r-   r.   r/   r0   r   rP   r   )Úuser_idr<   r-   rR   rj   r   r   r   Úget_admin_userß   s    z-register_admin_routes.<locals>.get_admin_userc           	   
   S   s6  t j}tƒ }| ¡ }zzÚg }g }d|krB| d¡ | |d ¡ d|krb| d¡ | |d ¡ d|kr‚| d¡ | |d ¡ |s”tdƒW W ¢–S | | ¡ | dd	 |¡› d
|¡ | 	¡  | d| f¡ | 
¡ }t|ƒ}d|d< t|ƒW W ¢6S  tk
r" } z| ¡  |‚W 5 d }~X Y nX W 5 | ¡  X d S )NÚenabledzenabled = ?r_   znickname = ?Úgenderz
gender = ?u   æ²¡æœ‰éœ€è¦æ›´æ–°çš„å­—æ®µzUPDATE users SET z, z$ WHERE id = ? AND deleted_at IS NULLrl   r`   r   )r   r*   r   r-   r.   rb   r   r/   Újoinr8   r0   rP   r   r9   r:   )	rm   r;   r<   r-   Úupdate_fieldsÚupdate_valuesÚupdated_userrj   r>   r   r   r   Úupdate_admin_userñ   s:    



z0register_admin_routes.<locals>.update_admin_userÚDELETEc              
   S   s|   t ƒ }| ¡ }z^z*| d| f¡ | ¡  tdddœƒW W ¢4S  tk
rh } z| ¡  |‚W 5 d }~X Y nX W 5 | ¡  X d S )Nz:UPDATE users SET deleted_at = datetime('now') WHERE id = ?Tu   åˆ é™¤æˆåŠŸrC   )r   r-   r.   r/   r8   r   r9   r:   )rm   r<   r-   r>   r   r   r   Údelete_admin_user  s    z0register_admin_routes.<locals>.delete_admin_userz/api/admin/sms/configc                  S   s(   ddl m}  | ƒ }d|d< td|dœƒS )Nr   )Úget_sms_configr`   Úaliyun_sms_access_key_secretT)r&   r;   )Ú	utils.smsrx   r   )rx   Úconfigr   r   r   rx   (  s    z-register_admin_routes.<locals>.get_sms_configc               
   S   sø   t j} tƒ }| ¡ }zÔz ddddddg}|D ]n}|| kr,|dkrN| | dkrNq,| d|f¡ | ¡ }|r‚| d	t| | ƒ|f¡ q,| d
|t| | ƒf¡ q,| ¡  t	dddœƒW W ¢4S  t
k
rä } z| ¡  |‚W 5 d }~X Y nX W 5 | ¡  X d S )NÚuse_real_smsZaliyun_sms_access_key_idry   Zaliyun_sms_sign_nameZaliyun_sms_template_codeZaliyun_sms_region_idr`   z1SELECT id FROM system_config WHERE config_key = ?z>UPDATE system_config SET config_value = ? WHERE config_key = ?zBINSERT INTO system_config (config_key, config_value) VALUES (?, ?)Tu   é…ç½®æ›´æ–°æˆåŠŸrC   )r   r*   r   r-   r.   r/   r0   r   r8   r   r9   r:   )r;   r<   r-   Zconfig_keysÚkeyrR   r>   r   r   r   Úupdate_sms_config0  s4    ú	z0register_admin_routes.<locals>.update_sms_config)Úrouter   )Úappr   r?   r@   rH   rL   r[   r\   rk   rn   ru   rw   rx   r~   r   r   r   Úregister_admin_routes   sJ    

1*%r   )Úflaskr   r   Zutils.databaser   Z
utils.authr   r   r   Zutils.helpersr   r	   r1   r   r   r   r4   r   r   r   r   r   r   Ú<module>   s   