
    9Yiw                        S SK JrJrJrJrJrJrJrJrJ	r	J
r
JrJrJrJrJr  S SKJr  S SKJr  S SKrS SKrS SKrS SKrS SKJr   S SKJrJrJrJr  Sr\" S
\"5      r#S r$S r%S#S jr&S r'\#RQ                  S5      \S 5       5       r)\#RQ                  S5      \S 5       5       r*\#RQ                  SS/S9\S 5       5       r+\#RQ                  SS/S9\S 5       5       r,\#RQ                  SS/S9\S 5       5       r-\#RQ                  SS/S9\S 5       5       r.\#RQ                  SS/S9\S  5       5       r/\#RQ                  S!5      \S" 5       5       r0g! \  a    Sr\!" S	5         GNf = f)$    )	Blueprintrender_templateredirecturl_forsession	send_fileafter_this_requestResponsejsonifyrequestaborthas_request_contextcurrent_appflashg)SessionData)login_requiredN)Path)get_latest_challengeget_challenge_by_nameupdate_challengeget_challenge_recordTFuE   数据库操作模块导入失败，将使用文件方式读取数据generate_file_opsc                 r    1 Skn[         R                  R                  U 5      S   R                  5       nX!;   $ )u$   检查文件是否为二进制文件>   .gz.so.bmp.dll.exe.gif.ico.jpg.pdf.png.tar.zip.jpeg.dylib   )ospathsplitextlower)filenamebinary_extensionsexts      R   /Users/yu22x/Desktop/ddd_副本131/ctf/app/routes/generator/file_operations_api.py_is_binary_filer2      s6    P
''

8
$Q
'
-
-
/C##    c                    U (       d  gSSK JnJn  U   UR                  5        HB  u  p4UR	                  S5      U :X  d  M  UR	                  SS5      nU(       d  M7  Us  sSSS5        $    SSS5         [        [        U 5      5      nU(       a  UR	                  S5      nU(       a  U$ g! , (       d  f       NE= f! [         a!  n[        S[        U5       35         SnAgSnAff = f)	u   
通过 challenge_id 从任务记录或数据库获取 category_id

Args:
    challenge_id: 题目ID
    
Returns:
    str: category_id，如果找不到则返回 'web'（默认）
webr)   )tasks_status_tasks_lockchallenge_idcategory_idNchallenge_typeu&   从数据库读取题目记录失败: )
tasksr6   r7   itemsgetr   int	Exceptionprintstr)	r8   r6   r7   task_idtaskr9   challenge_datar:   es	            r1   _get_category_id_from_challengerF      s      1	)//1MGxx'<7"hh}e<;&& 
1 
A-c,.?@+//0@AN%%
 ' 
  A6s1vh?@@ 	As5   )B) B)B)(B)34B: )
B7:
C%C  C%c           	         [         (       d  S[        SSS.5      S44$ U (       a  [        [        U 5      5      nO
[	        5       nU(       d  S[        SSS.5      S44$ [        [        S5      (       as  [        R                  (       a^  UR                  S	5      [        R                  R                  :w  a0  [        R                  R                  S
:w  a  S[        SSS.5      S44$ OS[        SSS.5      S44$ UR                  S5      nU(       a  [        U5      OSnX1S'   UR                  S5      n[        [        5      R                  R                  R                  R                  nU(       d  S[        SSS.5      S44$ UnUR                  S5      (       d2  [         R"                  R%                  U5      (       d  ['        XT-  5      nO [         R"                  R)                  U5      (       d  [        U5      nUR*                  nUS-  U-  S-  U-  n	U	R)                  5       (       aL  ['        U	R-                  U5      5      n
['        U	5      n SSKJn  U" USU
05        [3        SU SU SU
 35        OS[        SSU SU	 S3S.5      S44$ X4$ [        U5      nS['        UR6                  5      ;   a   UR6                  nSn[9        U5       H  u  nnUS:X  d  M  Un  O   Ub  US -   [;        U5      :  a  XS!-      S:X  av  US"   nUS-  U-  S-  U-  n	U	R)                  5       (       aN  ['        U	R-                  U5      5      n
['        U	5      n SSKJn  U" USU
05        [3        S#U SU SU
 35        X4$ X4$ X4$ ! [4         a"  n[3        S['        U5       35         SnAGNSnAff = f! [4         a#  n[3        S['        U5       35         SnAX4$ SnAff = f! [4         a#  n[3        S$['        U5       35         SnAX4$ SnAff = f)%u   
获取题目数据和输出目录的公共函数

Args:
    challenge_id: 题目ID，如果为None则获取最新题目

Returns:
    tuple: (challenge_data, output_dir, category_id) 或 (None, error_response)
Nerroru   数据库操作不可用statusmessage  u   未找到题目数据  useruser_idadminu   您没有权限查看此题目i  u   请先登录i  idr5   r9   
output_diru   输出目录未设置/ge10outputr   )r   u   已更新题目 u    的 output_dir: z -> u#   更新数据库 output_dir 失败:    输出目录不存在: u   （已尝试新路径: u   ）   r)   u   已迁移题目 u   检查路径格式时出错: )HAS_DB_OPERATIONSr   r   r>   r   hasattrr   rN   r=   rQ   rolerF   r   __file__parent
startswithr*   r+   isabsrA   existsnamerelative_toapp.models.database.operationsr   r@   r?   parts	enumeratelen)r8   rD   challenge_id_intr9   rR   project_rootoriginal_output_dirold_output_pathchallenge_dir_namenew_output_dirnew_output_dir_strr   rE   output_pathrd   
ge10_indexiparts                     r1   _get_challenge_and_output_dirrr   ?   sz    g=WXY[^___-c,.?@-/g=TUVX[\\\ q&affi(AFFII5!&&++:P'WAa"bcehiii g^LMsSSS &))$/GW12BC]bK %0=!  ##L1J>((//66==Lg=TUVX[\\\ %  %%bggmmJ.G.G23
 	 77>>*%%23,11 &.<xGJ\\  ""!$^%?%?%M!N^,JFK !1LBT3UV()9(::KL_K``dewdxyz 'WCZ[eZff}  M  ~N  NQ  BR  #S  T  VY  Z  Z  ZH %%C :&S**++@#))!
(/GAtv~%&
  0
 )j1ns5z.I!^,8-22Y*)5)>)Lx)WZl)l)002214^5O5OP\5]1^.),^)<JV [ 01ALRdCe f %(89I8JJ[\o[ppt  vH  uI  'J  !K %%>%%>%%S  F;CF8DEEFF $- V %(KCPQF8&T U U
 %%V @5c!fX>?? %%	@s[   %N  7#O A3O %N/  
N,
N''N,/
O9OO OO 
P)PPc                    SSSSSS.nU (       d  U$ SSK nU R                  S5      nU Ha  nUR                  S	5      (       d  M  US
S R                  5       nUR	                  SSU5      nUR	                  SSU5      nU(       d  M]  XQS'     O   [        U5       GHX  u  pdSU;   d  M  SU;   d  M  SU;   d  M  US
-   [        U5      :  Ga(  X6S
-      nUR                  S5       Vs/ s H  oR                  5       PM     n	nU	 Vs/ s H  o(       d  M  UPM     n	n[        U	5      S:  a  U	S   (       a!  U	S   R                  S5      (       d  U	S   US'   U	S   (       a!  U	S   R                  S5      (       d  U	S   US'   [        U	5      S:  a+  U	S   (       a!  U	S   R                  S5      (       d  U	S   US'   [        U	5      S:  a+  U	S   (       a!  U	S   R                  S5      (       d  U	S   US'     O   US   S:X  a  Sn
SnU H  nUR                  5       R                  S5      (       a  SnM+  U(       a&  UR                  5       R                  S5      (       a  SnU(       d  Ma  UR                  5       R                  S5      (       d  M  U
S-  n
M     U
S
::  a  SUS'   OU
S::  a  SUS'   OSUS'   U H9  nSUR                  5       ;   d  S U;   d  M  S!U;   a  S"US#'   M,  S$U;   d  M4  S%US#'   M;     U$ s  snf s  snf )&u!   从 writeup 中提取基本信息u   未命名题目 u   中等u	   1-2小时)ra   description
difficultyflag_formatestimated_timer   N
z# rW   z\s*-\s*[Ww]riteup\s*$u   \s*的?解题思路\s*$ra   u	   题目名u   题目描述|   :r)   ru      rx   rv   Fu   ## 知识点Tz##)	z1.z2.z3.z4.z5.z6.z7.z8.z9.u   简单u   困难flagFLAGu   动态zDASCTF{dynamic_flag}rw   u   静态zDASCTF{static_flag})resplitr^   stripsubre   rf   r-   )writeupinfor   lineslinetitlerp   	data_lineprd   knowledge_countin_knowledge_sections               r1   _extract_info_from_writeupr      s    "%D MM$E ??4  HNN$EFF3R?EFF5r5AEu$V  U#$>T#9cTk1us5z!!a%L	,5OOC,@A,@q,@A$)/EqQE/u:?Qxa(;(;C(@(@',QxVQxa(;(;C(@(@.3Ah]+5zA~%(58;N;Ns;S;S16q-.5zA~%(58;N;Ns;S;S-21X\*' $, LX%$Dzz|&&~66'+$#

(?(?(E(E',$##

(?(?@v(w(w1$  a!)D!!)D!)D TZZ\!Vt^4&<]#T!&;]#  Kc B/s   $K3
K8K8z/file-contentc                      [         R                  R                  SS5      n [         R                  R                  S5      nU (       d  [        SSS.5      S4$ [	        U5      u  p#Uc  U$ UnU R                  5       R                  S	5      R                  S
S5      n[        U5      nXe-  n UR                  5       nUR                  5       nUR                  U5        UR                  5       (       d  [        SSS.5      S4$ UR                  5       (       a  [        SSSS.5      $ [        UR                   5      nU(       a  [        SSSU 3S.5      $  [#        USSSS9 n	U	R%                  5       n
SSS5        [        SSSW
S.5      $ ! [        [        4 a    [        SSS.5      S4s $ f = f! , (       d  f       ND= f! [&         a&  n[        SS[)        U5       3S.5      S4s SnA$ SnAff = f! [&         aR  n[+        S[)        U5       35        [,        R.                  " 5         [        SS[)        U5       3S.5      S4s SnA$ SnAff = f)u   获取文件内容r+   rt   r8   rH      未提供文件路径rI     NrS   ..   非法路径   文件不存在rM   successT)rJ   is_directorycontentu   [二进制文件] )rJ   	is_binaryr   rutf-8ignore)encodingerrorsF)rJ   r   r   r   u   读取文件失败: rL   u   获取文件内容失败: )r   argsr=   r   rr   r   lstripreplacer   resolverb   
ValueErrorOSErrorr`   is_dirr2   ra   openreadr?   rA   r@   	traceback	print_exc)	file_pathr8   rD   resultrR   
clean_pathrn   target_filer   fr   rE   s               r1   get_file_contentr   
  s   ULL$$VR0	||''7!2    "?|!L!M
 __&--c2::4D
 :&!.	%--/K%--/K##K0 !!##!,    # $   $K$4$45	#!/
|<  	k3Ja&&( K #" %"	  I G$ 	!)   	B KJ  	!1#a&:   	  *3q6(343CF8<
   	s   AG3 G3 *A G3 +1F	 $G3 #G3 %-G3 G   F/1G  	 F,)G3 +F,,G3 /
F=9G   
G0
G+%G0&G3 +G00G3 3
I=AI
I
Iz/file-downloadc                      [         R                  R                  SS5      n [         R                  R                  S5      nU (       d  [        SSS.5      S4$ [	        U5      u  p#Uc  U$ UnU R                  5       R                  S	5      R                  S
S5      n[        U5      nXe-  n UR                  5       nUR                  5       nUR                  U5        UR                  5       (       d  [        SSS.5      S4$ UR                  5       (       a  [        SSS.5      S4$ [        [!        U5      SUR"                  SS9$ ! [        [        4 a    [        SSS.5      S4s $ f = f! [$         aR  n['        S[!        U5       35        [(        R*                  " 5         [        SS[!        U5       3S.5      S4s SnA$ SnAff = f)u   下载单个文件r+   rt   r8   rH   r   rI   r   NrS   r   r   r   rM   u   无法下载目录Tzapplication/octet-streamas_attachmentdownload_namemimetypeu   下载文件失败: rL   )r   r   r=   r   rr   r   r   r   r   r   rb   r   r   r`   r   r   rA   ra   r?   r@   r   r   )	r   r8   rD   r   rR   r   rn   r   rE   s	            r1   download_filer   e  s   ALL$$VR0	||''7!2    "?|!L!M
 __&--c2::4D
 :&!.	%--/K%--/K##K0 !!##!,    !/    %**/	
 	
+ G$ 	!)   	8  $SVH-.-c!fX6
   	s\   AE+ E+ *A E+ +1E $E+ $E+ &E+  E(%E+ 'E((E+ +
G5AG<GGz/file-createPOST)methodsc                  v    [         R                  " 5       n U R                  S5      nU R                  SS5      nU R                  SS5      nU R                  S5      =(       d    [         R                  R                  S5      nU(       d  [	        SSSSS	.5      S
4$ [        U5      u  pVUc  U$ Un[        U5      nU(       a4  UR                  5       R                  S5      R                  SS5      n	X-  n
OUn
 U
R                  5       n
UR                  5       nU
R                  U5        U
R                  SSS9  X-  nUR                  5       (       a#  U(       a  SOS SU S3n[	        SSUUS	.5      S
4$ U(       a  UR                  SSS9  SU S3nOUR!                  SSS9  SU S3n[	        SSUS.5      $ ! [        [        4 a    [	        SSS.5      S
4s $ f = f! ["         aO  n[%        S['        U5       35        [(        R*                  " 5         [	        S['        U5      S.5      S4s SnA$ SnAff = f)u   创建文件或文件夹ra   r+   rt   r   Fr8   rH   u   缺少名称参数)r   rJ   rH   rK   r   NrS   r   r   r   rH   Tparentsexist_oku	   文件夹u   文件 
    已存在
   文件夹 u    创建成功r   r      文件 r   )r   rJ   rK   u   创建失败: rL   )r   get_jsonr=   r   r   rr   r   r   r   r   r   rb   r   r   mkdirr`   
write_textr?   r@   rA   r   r   )datara   parent_pathr   r8   rD   r   rR   rn   r   
parent_dirnew_path	error_msgrK   rE   s                  r1   create_file_or_folderr     sc   @A!xxhhvr*xx6xx/S7<<3C3CN3S !-/	 
   "?|!L!M
:& $**,33C8@@rJJ$1J$J	M#++-J%--/K"";/ 	5$??*6;HEQtfJWI !"$	 
   NN4$N7"4&6GW5v]3G
  	- G$ 	Mu~FGLL	M6  As1vh'(53q6:;S@@AsX   BG G .A
G 91F9 *AG 6AG 9 GG GG 
H8)AH3-H83H8z/file-deleteDELETEc                      [         R                  " 5       n U R                  S5      nU R                  SS5      nU R                  S5      =(       d    [         R                  R                  S5      nU(       d  [	        SSS.5      S4$ [        U5      u  pEUc  U$ Un[        U5      nUR                  5       R                  S	5      R                  S
S5      nXx-  n	 U	R                  5       n	UR                  5       nU	R                  U5        U	R                  5       (       d  [	        SSS.5      S4$ SSKn
U(       a"  U
R!                  U	5        SU	R"                   S3nO U	R%                  5         SU	R"                   S3n[	        SUS.5      $ ! [        [        4 a    [	        SSS.5      S4s $ f = f! [&         aO  n[)        S[+        U5       35        [,        R.                  " 5         [	        S[+        U5      S.5      S4s SnA$ SnAff = f)u   删除文件或文件夹r+   r   Fr8      缺少路径参数r   r   NrS   r   rt   r   u   文件或文件夹不存在rM   r   r   u    删除成功r   Tr   rK   u   删除失败: rL   )r   r   r=   r   r   rr   r   r   r   r   r   rb   r   r   r`   shutilrmtreera   unlinkr?   r@   rA   r   r   )r   r   r   r8   rD   r   rR   rn   r   r   r   rK   rE   s                r1   delete_file_or_folderr     s   ,A!HHV$	xx6xx/S7<<3C3CN3Su7KLMsRR "?|!L!M
:& __&--c2::4D
!.	M%--/K%--/K##K0 !!##u7TUVX[[[ 	MM+&";#3#3"4MBG  0 01?G4G<== G$ 	Mu~FGLL	M   As1vh'(53q6:;S@@AsW   BF2 F2 A F2 1F $F2 1AF2  F/,F2 .F//F2 2
H<AH HHz/file-writec                      [         R                  " 5       n U R                  S5      nU R                  SS5      nU R                  S5      =(       d    [         R                  R                  S5      nU(       d  [	        SSS.5      S4$ [        U5      u  pEUc  U$ Un[        U5      nUR                  5       R                  S
5      R                  SS5      nXx-  n	 U	R                  5       n	UR                  5       nU	R                  U5        U	R                  R                  SSS9  U	R!                  USS9  [	        SSS.5      $ ! [        [        4 a    [	        SSS.5      S4s $ f = f! ["         aO  n
[%        S['        U
5       35        [(        R*                  " 5         [	        S['        U
5      S.5      S4s S	n
A
$ S	n
A
ff = f)u   写入文件内容r+   r   rt   r8   Fr   r   r   NrS   r   r   Tr   r   r   u   文件保存成功r   u   写入文件失败: rL   )r   r   r=   r   r   rr   r   r   r   r   r   rb   r   r   r]   r   r   r?   r@   rA   r   r   )r   r   r   r8   rD   r   rR   rn   r   r   rE   s              r1   write_file_contentr   $  s   &A!HHV$	((9b)xx/S7<<3C3CN3Su7KLMsRR "?|!L!M
:& __&--c2::4D
!.	M%--/K%--/K##K0
 	   = 	w944HIJJ G$ 	Mu~FGLL	M  A$SVH-.53q6:;S@@AsP   BE* E* A E* 1E 7E*  E'$E* &E''E* *
G4AF>8G>Gz/file-uploadc            	          SSK Jn   SSKnSSKnSSKn S[
        R                  ;  a  [        SSS.5      S4$ [
        R                  S   n[
        R                  R                  S	S
5      n[
        R                  R                  SS5      R                  5       S:H  n[
        R                  R                  S5      =(       d    [
        R                  R                  S5      nUR                  S
:X  a  [        SSS.5      S4$ [        U5      u  pUc  U	$ U	n
[        U
5      nU(       a4  UR                  5       R!                  S5      R#                  SS
5      nX-  nOUn UR%                  5       nUR%                  5       nUR'                  U5        UR-                  SSS9  U " UR                  5      nX-  nU(       a  UR/                  S5      (       a  USU 3-  nUR1                  [3        U5      5         UR/                  S5      (       a-  UR5                  US5       nUR7                  U5        SSS5        OBUR/                  S5      (       a,  UR9                  US5       nUR7                  U5        SSS5        UR;                  5         [        SSU S3S.5      $ UR?                  5       (       a  [        SSU S3S.5      S4$ UR1                  [3        U5      5        URA                  5       n[        SU[3        UR'                  U5      5      URB                  URD                  S.SU S 3S!.5      $ ! [(        [*        4 a    [        SSS.5      S4s $ f = f! , (       d  f       N= f! , (       d  f       N= f! [<         a,  nUR?                  5       (       a  UR;                  5         UeSnAff = f! [<         aO  n[G        S"[3        U5       35        [H        RJ                  " 5         [        S[3        U5      S.5      S#4s SnA$ SnAff = f)$u*   上传文件，支持压缩包自动解压r   )secure_filenameNfileFu   请选择文件r   r   r+   rt   extractfalsetruer8   rS   r   r   Tr   )r&   z.rarz.7zr%   r   _r&   r   )r%   r   zr:*u
   压缩包 u    上传并解压成功r   r   r   )ra   r+   sizemodifiedu    上传成功)r   r   rK   u   上传文件失败: rL   )&werkzeug.utilsr   zipfiletarfiler   r   filesr   formr=   r-   r   r.   rr   r   r   r   r   r   rb   r   r   r   endswithsaverA   ZipFile
extractallr   r   r?   r`   statst_sizest_mtimer@   r   r   )r   r   r   r   r   r   r   r8   rD   r   rR   rn   r   save_dirsafe_filenamer   	temp_pathzip_reftar_refrE   r   s                        r1   upload_filer   P  s    /UA&u7HIJCOO}}V$ll&&vr2,,""9g6<<>&H||''7[7<<;K;KN;[==Bu7HIJCOO "?|!L!M
:& $**,33C8@@rJJ"/H"H	M'')H%--/K  - 	td3'6,	 }--.TUU Q}o#66IIIc)n% ))&11 C8G**84 98"++O<< i77**84 8   "#!+M?:PQ    !!5W]OS];^_`beeeIIc)n%>>#D)	 5 5k BC LL $	 %]O=A	 	 	Q G$ 	Mu~FGLL	M 98 87  ##%%$$&.  A$SVH-.53q6:;S@@As   #N4 CN4 N4 A
N4 1L3 A%N4 5(M; M/1M;  M*2)M; (N4 A-N4 3 MN4 MN4 
M'#M; *
M84M; ;
N1'N,,N11N4 4
P>APPPz/download_allGETc                    ^  [        S5        [        R                  R                  S5      n [	        U 5      u  pUc  U$ Un[        U5      S-  nSnUR                  5       (       aA  [        USSS9 nUR                  5       nSSS5        [        W5      nUR                  S	S5      nS
SK
n	[        R                  " SSS9mTR                  5         U	R                  TR                  SS SU5        [         U4S j5       n
[#        TR                  SU S3SS9$ ! , (       d  f       N= f! [$         aQ  n[        S['        U5       35        [(        R*                  " 5         [-        SS['        U5       305      S4s SnA$ SnAff = f)u:   下载完整题目包（包含writeup、exp、源代码）u   
=== 下载完整题目包 ===r8   Nz
writeup.mdu   题目r   r   r   ra   r   r&   F)suffixdeletezipc                    >  [         R                  " TR                  5        U $ ! [         a"  n[	        S[        U5       35         S nAU $ S nAff = f)Nu   删除临时文件失败: )r*   removera   r?   r@   rA   )responserE   temp_zips     r1   remove_file!download_all.<locals>.remove_file  sM    =		(--( O  =23q6(;<<O=s    % 
AAATz_complete.zipzapplication/zipr   u   下载完整题目包失败: rH   u   下载失败: rL   )r@   r   r   r=   rr   r   r`   r   r   r   r   tempfileNamedTemporaryFileclosemake_archivera   r	   r   r?   rA   r   r   r   )r8   rD   r   rR   writeup_filechallenge_namer   writeup_contentchallenge_infor   r   rE   r   s               @r1   download_allr    s}   2B/0 ||''7 "?|!L!M
 J',6!  lC':a"#&&( ;7HN+//AN 	..fUK 	HMM#2.zB 
	 
	 MM+,M:&	
 	
- ;::  B-c!fX67>#a&!:;<cAABs<   ;D) 2D) 1DBD) 
D&"D) )
F3AE?9F?Fz/project-structurec                    ^	  SSK n U R                  [        5      nUR                  S 5        [        R
                  R                  S5      nUR                  SU 35        [        U5      u  p4Uc  U$ UnUR                  SU 35        [        U5      nUR                  5       (       d  [        SU 35        [        SSS	.5      S
4$ SU	4S jjm	T	" U5      nUR                  S[        U5       35        [        SUS.5      $ ! [         aX  nWR                  S[        U5       35        [         R"                  " 5         [        SS[        U5       3S	.5      S4s SnA$ SnAff = f)u   获取项目结构r   Nr8   u"   接收到的 challenge_id 参数: u    从输出目录构建文件树: rV   rH   u   输出目录不存在rI   rM   c           	      D  > / n [        U R                  5       5       H  nUR                  R                  S5      (       a  M%  U(       a)  [        R
                  R                  XR                  5      OUR                  nUR                  5       (       a*  T" X45      nUR                  UR                  SUUS.5        M  UR                  5       nUR                  UR                  SUUR                  UR                  S.5        M     [        US S9$ ! [         a     Nf = f)u3   递归构建文件树（与知识库格式相同）.	directory)ra   typer+   childrenr   )ra   r  r+   r   r   c                 8    U S   S:H  U S   R                  5       4$ )Nr  r   ra   )r-   )xs    r1   <lambda>;get_project_structure.<locals>.build_tree.<locals>.<lambda>'  s    &	V0CQvY__EV/Wr3   )key)sortediterdirra   r^   r*   r+   joinr   appendr   r   r   PermissionError)r+   relative_pathr<   itemitem_rel_pathr  r   
build_trees          r1   r  )get_project_structure.<locals>.build_tree  s    E"4<<>2Dyy++C00 N[BGGLL		$JaeajajM{{}}#-d#B$(II$/$1(0	&   $yy{$(II$*$1$(LL(,& # 36 %%WXX # s   DD 
DDu   构建的文件树数量: T)r   treeu   获取项目结构时出错: rL   )rt   )logging	getLogger__name__debugr   r   r=   rr   r   r`   r@   r   rf   r?   rH   rA   r   r   )
r  loggerr8   rD   r   rR   rn   r  rE   r  s
            @r1   get_project_structurer    sw   K""8,)* ||''79,HI "?|!L!M
7
|DE:&!!##+K=9:!2   	YB +&1#d)=>
  	
  4SVH=>6s1vh?
   	s,   A.D 2AD :D 
E#AEE#E#)N)1flaskr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   app.models.sessionr   app.services.auth.decoratorsr   r*   r   r   jsonpathlibr   rc   r   r   r   r   rY   ImportErrorr@   r  bp_file_opsr2   rF   rr   r   router   r   r   r   r   r   r  r   r3   r1   <module>r(     s   w  w  w  w  w * 7 	    S C  C
 +X6$"Hq&fUp ?#W  $Wr #$C  %CJ >F84BA  5BAH >H:6.A  7.A` =6(3(A  4(AT >F84\A  5\A| ?UG44B  54Bl '(M  )My  S	
QRSs   E E E 