Files
vvveb-cms/__pycache__/main.cpython-313.pyc

71 lines
28 KiB
Plaintext
Raw Normal View History

2026-05-26 11:53:28 +08:00
<EFBFBD>
<00>j$S<00><01>L<00>SrSSKJr SSKrSSKrSSKrSSKJrJr SSKJ r SSK
J r SSK r SSK r SSKJrJrJrJrJrJrJr SSKJr SS KJrJrJr \"\5r\ "\5R>r \ S
- r!\ S - S - S - r"SCSjr#SDSjr$SESjr%SESjr&SFSjr'SGSjr(SHSjr)SFSjr*SISJSjjr+SKSjr,SLSjr-SMSNSjjr.\R_S5SOSj5r0\R_S5SDSj5r1\R_S5SPSj5r2\R_S S!/S"9SOS#j5r3\R_S$S!/S"9SQS%j5r4\R_S$S&/S"9SQS'j5r5\R_S S(/S"9SRS)j5r6\R_S*S!/S"9SQS+j5r7\R_S*S&/S"9SQS,j5r8\R_S*S-/S"9SQS.j5r9\R_S/S!/S"9SQS0j5r:\R_S1S!/S"9SQS2j5r;\R_S3S(/S"9SQS4j5r<\R_S5S!/S"9SQS6j5r=\R_S7S-/S"9SSS8j5r>\R_S/S(/S"9STS9j5r?\R_S:S(/S"9SUS;j5r@\R_S<5SVS=j5rA\S>:Xa \!R<>S?S@9 \R<>S?SASB9 gg)Wu,VvvebJS 網頁管理器 — Flask 主程式.<2E>)<01> annotationsN)<02>datetime<6D>timezone)<01>Path)<01>Any)<07>Flask<73>Response<73>abort<72>jsonify<66>render_template<74>request<73>send_from_directory)<01>secure_filename)<03> save_upload<61>
list_media<EFBFBD> delete_media<69>websites<65>static<69>Vvvebjsznew-page-blank-template.htmlc<01><><00>UR5R5n[R"SSU[RS9n[R"SSU5n[R"SSU5nU=(d S$)u將文字轉成 URL-safe slug.z[^\w\s-]<5D>)<01>flagsz[\s_-]+<2B>-z^-+|-+$<24>untitled)<05>lower<65>strip<69>re<72>sub<75>UNICODE)<01>texts <20>main.py<70>slugifyr"s]<00><00> <0F>:<3A>:<3A><<3C> <1D> <1D> <1F>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>+<2B>r<EFBFBD>4<EFBFBD>r<EFBFBD>z<EFBFBD>z<EFBFBD> :<3A>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>*<2A>c<EFBFBD>4<EFBFBD> (<28>D<EFBFBD> <0A>6<EFBFBD>6<EFBFBD>*<2A>b<EFBFBD>$<24> '<27>D<EFBFBD> <0F> <1D>:<3A><1D>c<01>h<00>[R"[R5R S5$)N<>%Y-%m-%dT%H:%M:%S)r<00>nowr<00>utc<74>strftime<6D>r#r!<00>_now_isor*&s!<00><00> <13><<3C><<3C><08> <0C> <0C> %<25> .<2E> .<2E>/B<> C<>Cr#c<01><00>[U- $<00>N)<01> WEBSITES_DIR<49><01>slugs r!<00> _project_dirr0*s <00><00> <17>$<24> <1E>r#c<01><00>[U5S- $)N<> project.json<6F>r0r.s r!<00>_project_json_pathr4.s<00><00> <17><04> <1D><0E> .<2E>.r#c<01><><00>[U5nUR5(a%[R"UR SS95nU$UUS[ 5S.$)u4讀取專案設定,若不存在則回傳預設值.<2E>utf-8<><01>encodingr<00><04>namer/<00> description<6F>
created_at)r4<00>exists<74>json<6F>loads<64> read_textr*)r/<00>path<74>datas r!<00> _load_projectrC2sM<00><00> <1D>d<EFBFBD> #<23>D<EFBFBD> <0B>{<7B>{<7B>}<7D>}<7D>#<23>z<EFBFBD>z<EFBFBD>$<24>.<2E>.<2E>'<27>.<2E>*J<>K<><04><13> <0B><14><14><19><1E>j<EFBFBD>  <06>r#c<01>b<00>[U5nUR[R"USSS9SS9 g)NF<4E>)<02> ensure_ascii<69>indentr6r7)r4<00>
write_textr><00>dumps)r/rBrAs r!<00> _save_projectrJ@s)<00><00> <1D>d<EFBFBD> #<23>D<EFBFBD><08>O<EFBFBD>O<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>%<25><01>B<>W<EFBFBD>O<EFBFBD>Ur#c<01><>^<01>[U5mTR5(d/$[U4SjTRS555$)uV列出專案目錄下所有 .html 頁面(包含子資料夾)並回傳相對路徑.c3<01><>># <00>UHAnURS:wdM[URT55RSS5v<00> MC g7f)r2<00>\<5C>/N)r:<00>str<74> relative_to<74>replace)<03>.0<EFBFBD>p<>proj_dirs <20>r!<00> <genexpr><3E>_list_pages.<locals>.<genexpr>KsD<00><><00><00><06>)<29>A<EFBFBD> <0C>6<EFBFBD>6<EFBFBD>^<5E> #<23> 8<><03>A<EFBFBD>M<EFBFBD>M<EFBFBD>(<28> #<23>$<24>,<2C>,<2C>T<EFBFBD>3<EFBFBD>7<>7<>)<29>s
<00>A <01>1A <01>*.html)r0r=<00>sorted<65>rglob<6F>r/rTs @r!<00> _list_pagesr[EsB<00><><00><1B>D<EFBFBD>!<21>H<EFBFBD> <13>?<3F>?<3F> <1C> <1C><11> <09> <11><06><19><1E><1E><08>)<29><06> <06>r#c<01>~<00>[U5n[U5n[U5n[UR S55nU(aE[ SU55n[ R"U[RS9RS5nO#[URS[555n0UEU[U5UUS.E$)NrWc3<01>T# <00>UHoR5Rv<00> M g7fr,)<02>stat<61>st_mtime)rR<00>fs r!rU<00>#_project_summary.<locals>.<genexpr>Xs<00><00><00>=<3D>*<2A>Q<EFBFBD>v<EFBFBD>v<EFBFBD>x<EFBFBD>(<28>(<28>*<2A>s<00>&()<01>tzr%r<)r/<00>
page_count<EFBFBD>pages<65> last_modified)rCr[r0<00>listrY<00>maxr<00> fromtimestamprr'r(rO<00>getr*<00>len)r/rBrdrT<00>
html_files<EFBFBD>last_mod<6F> last_mod_strs r!<00>_project_summaryrnRs<><00><00> <18><14> <1E>D<EFBFBD> <17><04> <1D>E<EFBFBD><1B>D<EFBFBD>!<21>H<EFBFBD><15>h<EFBFBD>n<EFBFBD>n<EFBFBD>X<EFBFBD>.<2E>/<2F>J<EFBFBD><11><16>=<3D>*<2A>=<3D>=<3D><08><1F>-<2D>-<2D>h<EFBFBD>8<EFBFBD><<3C><<3C>H<>Q<>Q<>Re<52>f<> <0C><1A>4<EFBFBD>8<EFBFBD>8<EFBFBD>L<EFBFBD>(<28>*<2A>=<3D>><3E> <0C> <06>
<0E> <06><14><19>%<25>j<EFBFBD><16>%<25>  <06>r#c<01><><00>[U5R5n[U5RnU(aI[ [U55R S5R SS5nX5- U- R5nOX4- R5n[ U5R[ U55(dgURR5S:wagU$)uR驗證並回傳安全的檔案路徑,支援子資料夾(防止路徑遍歷).<2E>/\<5C>..rN<>.html)
r0<00>resolverr:rO<00>lstriprQ<00>
startswith<EFBFBD>suffixr)r/<00>filename<6D>folderrT<00> safe_filename<6D> safe_folder<65>targets r!<00>_sanitize_file_pathr|es<><00><00><1B>D<EFBFBD>!<21>)<29>)<29>+<2B>H<EFBFBD><18><18>N<EFBFBD>'<27>'<27>M<EFBFBD> <0A><19>$<24>v<EFBFBD>,<2C>'<27>.<2E>.<2E>u<EFBFBD>5<>=<3D>=<3D>d<EFBFBD>B<EFBFBD>G<> <0B><1A>(<28>=<3D>8<>A<>A<>C<><06><1A>*<2A>3<>3<>5<><06> <0E>v<EFBFBD>;<3B> !<21> !<21>#<23>h<EFBFBD>-<2D> 0<> 0<><13> <0A>}<7D>}<7D><1A><1A><1C><07>'<27><13> <11>Mr#c<01>.<00>[U5R5nURS5RSS5nX#- R5n[ U5R [ U55(dgUR R5S:wagU$)u=驗證並回傳安全的相對路徑(支援子資料夾).rprqrNrr)r0rsrtrQrOrurvr)r/<00>rel_pathrT<00>cleanr{s r!<00>_sanitize_rel_pathr<68>usz<00><00><1B>D<EFBFBD>!<21>)<29>)<29>+<2B>H<EFBFBD> <14>O<EFBFBD>O<EFBFBD>E<EFBFBD> "<22> *<2A> *<2A>4<EFBFBD><12> 4<>E<EFBFBD><16><1E> '<27> '<27> )<29>F<EFBFBD> <0E>v<EFBFBD>;<3B> !<21> !<21>#<23>h<EFBFBD>-<2D> 0<> 0<><13> <0A>}<7D>}<7D><1A><1A><1C><07>'<27><13> <11>Mr#c<01><><00>[R5(a[R"[U5 gUR SSS9 g)u'複製空白範本或建立最小 HTML.zL<!DOCTYPE html><html><head><title>My Page</title></head><body></body></html>r6r7N)<05>BLANK_TEMPLATEr=<00>shutil<69>copyrH)<01>dests r!<00>_copy_blank_templater<65><00>s6<00><00><15><1C><1C><1E><1E><0E> <0B> <0B>N<EFBFBD>D<EFBFBD>)<29> <0C><0F><0F> Z<><1C> <18>
r#c<01>L^^^<03>[U5mSSUUU4SjjjmST"TS50$)uE遞歸建構專案的頁面樹狀結構根據資料夾結構。rc <01><>><03>/nUT :<3A>aU$[UR5Vs/sHo3RPM sn5nUGHnUR S5(aMX- nUR 5(aAT "XaS-5nUR SUURSS5R5US.5 MvUR5(dM<>URR5S:XdM<>[URT
55RSS 5nUR S
U[U5RRSS5R5S .5 GM U$s snf![a Us$f=f) N<>.<2E>rxr<00> )<04>typer:<00>title<6C>childrenrrrMrN<00>file)r<>r:r<>)rX<00>iterdirr:<00> Exceptionru<00>is_dir<69>appendrQr<><00>is_filervrrOrPr<00>stem) rx<00> current_depth<74>itemsrS<00>namesr:<00>fullr<6C><00>rel<65> max_depthrT<00> scan_folders <20><><EFBFBD>r!r<><00>$build_page_tree.<locals>.scan_folder<65>sI<00><><00>&(<28><05> <18>9<EFBFBD> $<24><18>L<EFBFBD> <19><1A>F<EFBFBD>N<EFBFBD>N<EFBFBD>,<<3C>=<3D>,<<3C>q<EFBFBD>F<EFBFBD>F<EFBFBD>,<<3C>=<3D>><3E>E<EFBFBD><1A>D<EFBFBD><13><EFBFBD><EFBFBD>s<EFBFBD>#<23>#<23><18><19>=<3D>D<EFBFBD><13>{<7B>{<7B>}<7D>}<7D>&<26>t<EFBFBD>Q<EFBFBD>-><3E>?<3F><08><15> <0C> <0C>$<24> <20>!<21>\<5C>\<5C>#<23>s<EFBFBD>3<>9<>9<>;<3B> (<28> <12><13> <16><1C><1C><1E><1E>D<EFBFBD>K<EFBFBD>K<EFBFBD>$5<>$5<>$7<>7<EFBFBD>$B<><19>$<24>*<2A>*<2A>8<EFBFBD>4<>5<>=<3D>=<3D>d<EFBFBD>C<EFBFBD>H<><03><15> <0C> <0C>"<22><1F>!<21>$<24>Z<EFBFBD>_<EFBFBD>_<EFBFBD>4<>4<>S<EFBFBD>#<23>><3E>D<>D<>F<><12><13><1A>&<15> <0C><>/><3E><><18> <19><18>L<EFBFBD> <19>s!<00>E+<00>E&<08>E+<00>&E+<00>+ E:<03>9E:<03>root)r)rxrr<><00>intr3)r/r<>rTr<>s `@@r!<00>build_page_treer<65><00>s+<00><><00><1B>D<EFBFBD>!<21>H<EFBFBD><15><15>< <13>K<EFBFBD><08>!<21>,<2C> -<2D>-r#rNc<01>.<00>SSKJnJn U"U"S55$)Nr<00><02>redirect<63>url_for<6F> dashboard)<03>flaskr<6B>r<>r<>s r!<00>indexr<78><00>s<00><00>'<27> <13>G<EFBFBD>K<EFBFBD>(<28> )<29>)r#z
/dashboardc<01>*<00>[[S55$)Nzdashboard.html)rOr r)r#r!r<>r<><00>s<00><00> <0E><EFBFBD>/<2F>0<> 1<>1r#z/editor/<slug>c <01><00>[U5nUR5(d [S5 [U5n[ U5n0nUHvnUR SS5n[ U5RR SS5R5nSU;aURSS5SOSnUUUUUS USU3S
.XF'Mx U(dUS - n [U 5 S S S S S US3S.US '[[SUU[R"USS9S95$)N<><4E>rrrrr<>rNr<>r<00>/sites/)r:r<>rxrwr<><00>url<72>
index.htmlr<6C><00>Indexz /index.html)r:r<>rwr<>r<>z editor.htmlF)rF)r/<00>project<63>
pages_json)r0r=r
r[rCrQrr<>r<><00>rsplitr<74>rOr r>rI)
r/rTrdr<><00> pages_objr~r:r<><00> folder_part<72>idx_paths
r!<00>editorr<72><00>s'<00><00><1B>D<EFBFBD>!<21>H<EFBFBD> <13>?<3F>?<3F> <1C> <1C> <0A>c<EFBFBD>
<EFBFBD> <17><04> <1D>E<EFBFBD><1B>D<EFBFBD>!<21>G<EFBFBD> "<22>I<EFBFBD><19><08><17><1F><1F><07><12>,<2C><04><13>H<EFBFBD>~<7E>"<22>"<22>*<2A>*<2A>3<EFBFBD><03>4<>:<3A>:<3A><<3C><04>03<30>t<EFBFBD> <0B>d<EFBFBD>k<EFBFBD>k<EFBFBD>#<23>q<EFBFBD>)<29>!<21>,<2C><12> <0B><18><19>!<21> <20><1C><1C>T<EFBFBD>F<EFBFBD>!<21>H<EFBFBD>:<3A>.<2E> 
<EFBFBD> <09><0F> <1A> <15><1B>l<EFBFBD>*<2A><08><1C>X<EFBFBD>&<26><1B><1C>$<24> <20><1C>T<EFBFBD>F<EFBFBD>+<2B>.<2E> 
<EFBFBD> <09>'<27><1A> <0F><EFBFBD><15> <11><17><17>:<3A>:<3A>i<EFBFBD>e<EFBFBD><<3C> <06> <07>r#z /api/projects<74>GET)<01>methodsc<01><><00>[RSS9 [[R55Vs/sH.oR 5(dM[ UR 5PM0 nn[U5$s snf)NT<4E><01>exist_ok)r-<00>mkdirrXr<>r<>rnr:r )<02>d<>projectss r!<00>api_list_projectsr<73><00>s^<00><00><10><16><16><04><16>%<25>28<32><1C>9M<39>9M<39>9O<39>2P<32>_<>2P<32>Q<EFBFBD>T\<5C>T\<5C>T^<5E>(<28> <20><11><16><16>(<28>2P<32>H<EFBFBD>_<> <12>8<EFBFBD> <1C><1C><>`s <00>A5<04>A5z/api/projects/<slug>/settingsc<01>
<00>[U5R5(d[SS05S4$[U5nUR S05nUR SU5UR SS5SSSS S
.n0UEUEn[U5$) N<>error<6F>專案不存在r<E59CA8><00>settingsr:r;rz#007bffz#6c757d)r<>r;<00>logo_url<72> favicon_url<72> primary_color<6F>secondary_color)r0r=r rCri)r/rBr<><00>defaults<74>mergeds r!<00>api_get_settingsr<73><00>s<><00><00> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <18><14> <1E>D<EFBFBD><13>x<EFBFBD>x<EFBFBD>
<EFBFBD>B<EFBFBD>'<27>H<EFBFBD><16><18><18>&<26>$<24>'<27><1B>x<EFBFBD>x<EFBFBD> <0A>r<EFBFBD>2<><18><1B>"<22>$<24> <06>H<EFBFBD>&<26><08> %<25>H<EFBFBD> %<25>F<EFBFBD> <12>6<EFBFBD>?<3F>r#<00>PUTc<01>F<00>[U5R5(d[SS05S4$[R"SS9=(d 0n[ U5nUR S05nURU5 X2S'[5US'[X5 [SUS.5$) Nr<4E>r<>r<>T<><01>forcer<65><00>
updated_at)<02>okr<6B>)
r0r=r r <00>get_jsonrCri<00>updater*rJ)r/<00>bodyrBr<>s r!<00>api_put_settingsr<73>s<><00><00> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<>"<22>+<2B>+<2B>$<24>7<>=<3D>2<EFBFBD>D<EFBFBD> <18><14> <1E>D<EFBFBD><13>x<EFBFBD>x<EFBFBD>
<EFBFBD>B<EFBFBD>'<27>H<EFBFBD> <0C>O<EFBFBD>O<EFBFBD>D<EFBFBD><19><1F><1A><14>!<21><1A>D<EFBFBD><1C><16><11>$<24><1D> <12>$<24>H<EFBFBD>5<> 6<>6r#<00>POSTc<01>B<00>[R"SS9=(d 0n[URSS55R 5nU(d[ SS05S4$[ U5n[U5nUnSnUR5(a.US U3n[U5nUS- nUR5(aM.URSSS
9 UU[URS S55[5S .n[X&5 [US - 5 [ [U55S4$)NTr<54>r:rr<>u名稱不能為空<E782BA><E7A9BA>r<>r<00><02>parentsr<73>r;r9r<><00><>)r r<>rOrirr r"r0r=r<>r*rJr<>rn)r<>r:r/rT<00> base_slug<75>counterrBs r!<00>api_create_projectr<74>s<00><00>"<22>+<2B>+<2B>$<24>7<>=<3D>2<EFBFBD>D<EFBFBD><13>D<EFBFBD>H<EFBFBD>H<EFBFBD>V<EFBFBD>R<EFBFBD>(<28>)<29>/<2F>/<2F>1<>D<EFBFBD> <0F><16><07>!5<>6<>7<><13><<3C><<3C> <12>4<EFBFBD>=<3D>D<EFBFBD><1B>D<EFBFBD>!<21>H<EFBFBD><14>I<EFBFBD><0F>G<EFBFBD>
<12>/<2F>/<2F>
<1B>
<1B><1B><1B>A<EFBFBD>g<EFBFBD>Y<EFBFBD>'<27><04><1F><04>%<25><08><0F>1<EFBFBD> <0C><07> <13>/<2F>/<2F>
<1B>
<1B>
 <0A>N<EFBFBD>N<EFBFBD>4<EFBFBD>$<24>N<EFBFBD>/<2F><14><14><1A>4<EFBFBD>8<EFBFBD>8<EFBFBD>M<EFBFBD>2<EFBFBD>6<>7<><1E>j<EFBFBD> <06>D<EFBFBD> <12>$<24><1D><18><18>L<EFBFBD>0<>1<> <12>#<23>D<EFBFBD>)<29> *<2A>C<EFBFBD> /<2F>/r#z/api/projects/<slug>c<01><><00>[U5R5(d[SS05S4$[[U55$<00>Nr<4E>r<>r<>)r0r=r rnr.s r!<00>api_get_projectr<74>.s=<00><00> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <12>#<23>D<EFBFBD>)<29> *<2A>*r#c<01><><00>[U5R5(d[SS05S4$[R"SS9=(d 0n[ U5nSU;a@[ US5R5(a[ US5R5US'SU;a[ US5US'[5US'[X5 [[U55$) Nr<4E>r<>r<>Tr<54>r:r;r<>) r0r=r r r<>rCrOrr*rJrn)r/r<>rBs r!<00>api_update_projectr<74>5s<><00><00> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<>"<22>+<2B>+<2B>$<24>7<>=<3D>2<EFBFBD>D<EFBFBD> <18><14> <1E>D<EFBFBD> <0A><14>~<7E>#<23>d<EFBFBD>6<EFBFBD>l<EFBFBD>+<2B>1<>1<>3<>3<><1A>4<EFBFBD><06><<3C>(<28>.<2E>.<2E>0<><04>V<EFBFBD> <0C><14><04><1C>!<21>$<24>}<7D>"5<>6<><04>]<5D><1B>!<21><1A>D<EFBFBD><1C><16><11>$<24><1D> <12>#<23>D<EFBFBD>)<29> *<2A>*r#<00>DELETEc<01><><00>[U5nUR5(d[SS05S4$[R"U5 [SS05$)Nr<4E>r<>r<>r<>T)r0r=r r<><00>rmtreerZs r!<00>api_delete_projectr<74>DsJ<00><00><1B>D<EFBFBD>!<21>H<EFBFBD> <13>?<3F>?<3F> <1C> <1C><16><07>!2<>3<>4<>c<EFBFBD>9<>9<>
<EFBFBD>M<EFBFBD>M<EFBFBD>(<28><1B> <12>D<EFBFBD>$<24><<3C> <20> r#z/api/projects/<slug>/pagesc<01><><00>[U5R5(d[SS05S4$[[U55$r<>)r0r=r r[r.s r!<00>api_list_pagesr<73>Ms<<00><00> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <12>;<3B>t<EFBFBD>$<24> %<25>%r#z/api/projects/<slug>/pages-treec<01><><00>[U5R5(d[SS05S4$[USS9n[U5$)Nr<4E>r<>r<><00>)r<>)r0r=r r<>)r/<00>trees r!<00>api_pages_treer<65>TsB<00><00> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <1A>4<EFBFBD>1<EFBFBD> -<2D>D<EFBFBD> <12>4<EFBFBD>=<3D>r#z!/api/projects/<slug>/media/uploadc<01>V<00>[U5nUR5(d[SS05S4$S[R;a[SS05S4$[RSnUR
S:Xa[SS05S4$[ UR
5n[X5n[URS 5[5(aUS RS
U5US '[URS 5[5(aUS RS
U5US '[S US .5$)Nr<4E>r<>r<>r<>u缺少檔案 (file)r<>ru 檔名為空r<E7A9BA>z{slug}<7D>thumbT)r<>r<>) r0r=r r <00>filesrwrr<00>
isinstancerirOrQ)r/rTr`rw<00>metas r!<00>api_media_uploadr<64>\s<00><00><1B>D<EFBFBD>!<21>H<EFBFBD> <13>?<3F>?<3F> <1C> <1C><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <0A>W<EFBFBD>]<5D>]<5D>"<22><16><07>!6<>7<>8<>#<23>=<3D>=<3D><0F> <0A> <0A>f<EFBFBD><1D>A<EFBFBD><08>z<EFBFBD>z<EFBFBD>R<EFBFBD><17><16><07><1E>0<>1<>3<EFBFBD>6<>6<><1E>q<EFBFBD>z<EFBFBD>z<EFBFBD>*<2A>H<EFBFBD> <16>x<EFBFBD> #<23>D<EFBFBD><11>$<24>(<28>(<28>5<EFBFBD>/<2F>3<EFBFBD>'<27>'<27><1A>5<EFBFBD>k<EFBFBD>)<29>)<29>(<28>D<EFBFBD>9<><04>U<EFBFBD> <0B><11>$<24>(<28>(<28>7<EFBFBD>#<23>S<EFBFBD>)<29>)<29><1C>W<EFBFBD> <0A>-<2D>-<2D>h<EFBFBD><04>=<3D><04>W<EFBFBD> <0A> <12>$<24><04>-<2D> .<2E>.r#z/api/projects/<slug>/media/listc<01><><00>[U5nUR5(d[SS05S4$[U5nUH'nSU;dM SU;dMSUSUSSUS3US 'M) [U5$)
Nr<EFBFBD>r<>r<>rw<00>dater<65>z/media/images/rNr<>)r0r=r r)r/rTr<><00>its r!<00>api_media_listr<74>qs<><00><00><1B>D<EFBFBD>!<21>H<EFBFBD> <13>?<3F>?<3F> <1C> <1C><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <16>x<EFBFBD> <20>E<EFBFBD><13><02> <15><12> <1B><06>"<22> <0C>!<21>$<24><16>~<7E>b<EFBFBD><16>j<EFBFBD>\<5C><11>2<EFBFBD>j<EFBFBD>><3E>BR<42>S<>B<EFBFBD>u<EFBFBD>I<EFBFBD><14> <13>5<EFBFBD>><3E>r#z*/api/projects/<slug>/media/<path:rel_path>c<01><><00>[U5nUR5(d[SS05S4$[X!5nU(d[SS05S4$[SS05$)Nr<4E>r<>r<>u刪除失敗或檔案不存在r<E59CA8>r<>T)r0r=r r)r/r~rTr<>s r!<00>api_media_deleter<65>~sa<00><00><1B>D<EFBFBD>!<21>H<EFBFBD> <13>?<3F>?<3F> <1C> <1C><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <15>h<EFBFBD> )<29>B<EFBFBD> <0A><16><07>!A<>B<>C<>S<EFBFBD>H<>H<> <12>D<EFBFBD>$<24><<3C> <20> r#c<01><><00>[U5R5(d[SS05S4$[R"SS9=(d 0n[ UR SS55R5nU(d[SS05S 4$[U5n[U5US
3- nUR5(a[SS 05S 4$[U5 [S US
305S4$)Nr<4E>r<>r<>Tr<54>r:ru頁面名稱不能為空r<E7A9BA>rr<00>頁面已存在<E5AD98><E59CA8><00>pager<65>)
r0r=r r r<>rOrirr"r<>)r/r<><00> page_name<6D> page_slug<75> page_paths r!<00>api_create_pager<65><00>s<><00><00> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<>"<22>+<2B>+<2B>$<24>7<>=<3D>2<EFBFBD>D<EFBFBD><18><14><18><18>&<26>"<22>-<2D>.<2E>4<>4<>6<>I<EFBFBD> <14><16><07>!;<3B><<3C>=<3D>s<EFBFBD>B<>B<><17> <09>"<22>I<EFBFBD><1C>T<EFBFBD>"<22> <09>{<7B>%<25>%8<>8<>I<EFBFBD><10><17><17><19><19><16><07>!2<>3<>4<>c<EFBFBD>9<>9<><18><19>#<23> <12>F<EFBFBD>y<EFBFBD>k<EFBFBD><15>/<2F>0<> 1<>3<EFBFBD> 6<>6r#z /api/savec<01><><00>[R(a [R"SS9=(d 0nUnOX[[R5nUR 5VVs0sH"up4U[ U[5(aUSOU_M$ nnn[URSS55R5nU(d.[RRSS5R5nU(d[SS05S4$[U5R5(d[SS 05S
4$[RRS S5R5nUS :XGa<>[URS S55R5n[URSS55R5n[URSS55R5n [URSS55R5n
[URSS55R5R5n U S:Hn U(aU(d[SS05S4$[!XW5n [#XXU
5nU bUc[SS05S4$U R5(d[SS05S
4$UR5(aX<>:wa[SS05S4$UR$R'SSS9 U (a[(R*"X<>5 SnOU R-U5 Sn[U5nUR/U5n[U5R1SS5R1SS5n[SSU[U5R1SS5U =(d* UR2R1SS5R55US US[U5R1[7S!5S53S".5$US#:Xa<>[URS S55R5nU(d[SS$05S4$UR5S%:Xa[SS&05S4$[#XW5nUc[SS05S4$UR5(d[SS'05S
4$UR95 [SSS(S).5$[URS*S55R5nU(Ga[URSS55R5=(d S+n[URSS55R5n[;[URS S,55R55R<nUR?S5(dUS- n[#UUU5nUc[SS05S4$UR5(a[SS-05S4$UR$R'SSS9 [@S.- S/- U- nUR5(a-URC5(a[(R*"UU5 O [EU5 [U5nUR/U5n[U5R1SS5R1SS5n[SUU[U5R1SS5S US[U5R1[7S!5S53S0.5$[URS S55R5n[URS1S55R5nU(aU(d[SS205S4$[!UU5nUc[SS305S4$UR$R'SSS9 URGUS4S59 [S[UR/[U555R1SS5S6.5$s snnf)7uI接受 vvvebjs 的儲存或新增頁面請求,寫入對應專案目錄.Tr<54>rr/rr<>u缺少專案識別碼 (slug)r<>r<>r<><00>action<6F>renamer<65><00>newfiler<65>rx<00> duplicate<74>trueu缺少參數 file 或 newfileu不合法的頁面名稱u來源頁面不存在u目標頁面已存在r<E59CA8>r<>u頁面複製成功u頁面重新命名成功rMrNrrrr<>r<><00>\)<07>successr<73><00>messagerr<>r:r<><00>deleteu缺少參數 filer<65>u無法刪除主頁 index.htmlu頁面不存在u頁面已成功刪除)rr<>r<00>startTemplateUrlzNew Pagez untitled.htmlr<6C>rr)r<>r:r<>r<>r<><00>htmlu缺少必要參數 file / htmlu不合法的檔案路徑r6r7)r<><00>saved)$r <00>is_jsonr<6E><00>dict<63>formr<6D>r<>rfrOrir<00>argsr r0r=rr<>r|<00>parentr<74>r<>r<>rrPrQr<>r<><00>chr<68>unlinkrr:<00>endswith<74>BASE_DIRr<52>r<>rH)<1A>rawr<77>r<00>k<>vr/rr<>r<00> new_title<6C>
new_folder<EFBFBD> duplicate_str<74> is_duplicate<74>old_path<74>new_path<74>msgrTr~r<><00> safe_path<74>start_template_urlr<6C>rxrw<00>template_sourcer s r!<00>api_saver#<00>s<00><00><0F><EFBFBD><EFBFBD>%<25>.<2E>.<2E>T<EFBFBD>:<3A>@<40>b<EFBFBD><03>"<22><04><13>G<EFBFBD>L<EFBFBD>L<EFBFBD>!<21><04>DH<44>J<EFBFBD>J<EFBFBD>L<EFBFBD>Q<>L<EFBFBD>D<EFBFBD>A<EFBFBD><01>J<EFBFBD>q<EFBFBD>$<24>/<2F>/<2F>A<EFBFBD>a<EFBFBD>D<EFBFBD>Q<EFBFBD>6<>L<EFBFBD><04>Q<><13>D<EFBFBD>H<EFBFBD>H<EFBFBD>V<EFBFBD>R<EFBFBD>(<28>)<29>/<2F>/<2F>1<>D<EFBFBD> <0F><16>|<7C>|<7C><1F><1F><06><02>+<2B>1<>1<>3<><04> <0F><16><07>!?<3F>@<40>A<>3<EFBFBD>F<>F<> <17><04> <1D> $<24> $<24> &<26> &<26><16><07>!2<>3<>4<>c<EFBFBD>9<>9<> <14>\<5C>\<5C> <1D> <1D>h<EFBFBD><02> +<2B> 1<> 1<> 3<>F<EFBFBD><0E><18><19><12>4<EFBFBD>8<EFBFBD>8<EFBFBD>F<EFBFBD>B<EFBFBD>'<27>(<28>.<2E>.<2E>0<><04><15>d<EFBFBD>h<EFBFBD>h<EFBFBD>y<EFBFBD>"<22>-<2D>.<2E>4<>4<>6<><07><17><04><08><08><17>"<22>-<2D>.<2E>4<>4<>6<> <09><18><14><18><18>(<28>B<EFBFBD>/<2F>0<>6<>6<>8<>
<EFBFBD><1B>D<EFBFBD>H<EFBFBD>H<EFBFBD>[<5B>"<22>5<>6<><<3C><<3C>><3E>D<>D<>F<> <0A>%<25><16>/<2F> <0C><13>7<EFBFBD><1A>G<EFBFBD>%D<>E<>F<><03>K<> K<>%<25>d<EFBFBD>1<><08>&<26>t<EFBFBD>j<EFBFBD>A<><08> <13> <1B>x<EFBFBD>/<2F><1A>G<EFBFBD>%?<3F>@<40>A<>3<EFBFBD>F<> F<><17><EFBFBD><EFBFBD> <20> <20><1A>G<EFBFBD>%<<3C>=<3D>><3E><03>C<> C<> <13>?<3F>?<3F> <1C> <1C><18>!5<><1A>G<EFBFBD>%<<3C>=<3D>><3E><03>C<> C<> <11><0F><0F><1D><1D>d<EFBFBD>T<EFBFBD><1D>:<3A> <17> <12>K<EFBFBD>K<EFBFBD><08> +<2B>&<26>C<EFBFBD> <14>O<EFBFBD>O<EFBFBD>H<EFBFBD> %<25>,<2C>C<EFBFBD> <20><04>%<25><08><1B>'<27>'<27><08>1<><08><17><08>M<EFBFBD>)<29>)<29>$<24><03>4<><<3C><<3C>W<EFBFBD>b<EFBFBD>I<> <09><16><1B><16><1A><1A>8<EFBFBD>}<7D>,<2C>,<2C>T<EFBFBD>3<EFBFBD>7<><1E>I<>(<28>-<2D>-<2D>"7<>"7<><03>S<EFBFBD>"A<>"G<>"G<>"I<><1D><1C>T<EFBFBD>F<EFBFBD>!<21>C<EFBFBD><08>M<EFBFBD>$9<>$9<>#<23>b<EFBFBD>'<27>3<EFBFBD>$G<>#H<>I<>
<EFBFBD> <0B> <0B>
<10>8<EFBFBD> <1B><12>4<EFBFBD>8<EFBFBD>8<EFBFBD>F<EFBFBD>B<EFBFBD>'<27>(<28>.<2E>.<2E>0<><04><13><1A>G<EFBFBD>%8<>9<>:<3A>C<EFBFBD>?<3F> ?<3F> <0F>:<3A>:<3A><<3C><<3C> '<27><1A>G<EFBFBD>%D<>E<>F<><03>K<> K<>'<27><04>3<> <09> <14> <1C><1A>G<EFBFBD>%?<3F>@<40>A<>3<EFBFBD>F<> F<><18><1F><1F>!<21>!<21><1A>G<EFBFBD>%6<>7<>8<>#<23>=<3D> =<3D><11><18><18><1A><16><1B><16>.<2E>
<EFBFBD> <0B> <0B><1D>T<EFBFBD>X<EFBFBD>X<EFBFBD>&8<>"<22>=<3D>><3E>D<>D<>F<><16><19><13>D<EFBFBD>H<EFBFBD>H<EFBFBD>W<EFBFBD>b<EFBFBD>)<29>*<2A>0<>0<>2<>@<40>j<EFBFBD><05><14>T<EFBFBD>X<EFBFBD>X<EFBFBD>h<EFBFBD><02>+<2B>,<2C>2<>2<>4<><06><17><03>D<EFBFBD>H<EFBFBD>H<EFBFBD>V<EFBFBD>_<EFBFBD>=<3D>><3E>D<>D<>F<>G<>L<>L<><08><17> <20> <20><17>)<29>)<29> <14><07> <1F>H<EFBFBD>'<27><04>h<EFBFBD><06>?<3F> <09> <14> <1C><1A>G<EFBFBD>%?<3F>@<40>A<>3<EFBFBD>F<> F<> <14> <1B> <1B> <1D> <1D><1A>G<EFBFBD>%6<>7<>8<>#<23>=<3D> =<3D> <12><18><18><1E><1E>t<EFBFBD>d<EFBFBD><1E>;<3B>#<23>X<EFBFBD>-<2D> <09>9<><N<>N<><0F> <1A> !<21> !<21> #<23> #<23><0F>(?<3F>(?<3F>(A<>(A<> <12>K<EFBFBD>K<EFBFBD><0F><19> 3<> <20><19> +<2B> <20><04>%<25><08><1C>(<28>(<28><18>2<><08><17><08>M<EFBFBD>)<29>)<29>$<24><03>4<><<3C><<3C>W<EFBFBD>b<EFBFBD>I<> <09><16><16><1D><1A><17><08>M<EFBFBD>)<29>)<29>$<24><03>4<><1C>T<EFBFBD>F<EFBFBD>!<21>C<EFBFBD><08>M<EFBFBD>$9<>$9<>#<23>b<EFBFBD>'<27>3<EFBFBD>$G<>#H<>I<> 
<EFBFBD> <0B> <0B><13>4<EFBFBD>8<EFBFBD>8<EFBFBD>F<EFBFBD>B<EFBFBD>'<27>(<28>.<2E>.<2E>0<>H<EFBFBD><13>D<EFBFBD>H<EFBFBD>H<EFBFBD>V<EFBFBD>R<EFBFBD>(<28>)<29>/<2F>/<2F>1<>D<EFBFBD> <13>4<EFBFBD><16><07>!A<>B<>C<>S<EFBFBD>H<>H<>"<22>4<EFBFBD><18>2<>I<EFBFBD><10><18><16><07>!;<3B><<3C>=<3D>s<EFBFBD>B<>B<> <0A><14><14><1A><1A>4<EFBFBD>$<24><1A>7<> <0A><18><18><14><07><18>0<> <12>$<24><13>Y<EFBFBD>-B<>-B<><<3C>PT<50>CU<43>-V<>)W<>)_<>)_<>`d<>fi<66>)j<>k<> l<>l<><6C>YRs<00>")_&z/sites/<slug>/<path:filename>c<01>n<00>[U5nUR5(d [S5 [X!5$)Nr<4E>)r0r=r
r)r/rwrTs r!<00>serve_site_filer%1s+<00><00><1B>D<EFBFBD>!<21>H<EFBFBD> <13>?<3F>?<3F> <1C> <1C> <0A>c<EFBFBD>
<EFBFBD> <1E>x<EFBFBD> 2<>2r#<00>__main__Tr<54>i<>)<02>debug<75>port)r rO<00>returnrO)r)rO)r/rOr)r)r/rOr)<00>dict[str, Any])r/rOrBr*r)<00>None)r/rOr)z list[str])r)r/rOrwrOrxrOr)<00> Path | None)r/rOr~rOr)r,)r<>rr)r+)<01>)r/rOr<>r<>r)r*)r)r )r/rOr)rO)r/rOr)<00>tuple[Response, int] | Response)r)<00>tuple[Response, int])r/rOr~rOr)r.)r/rOr)r/)r)r.)r/rOrwrOr)r )D<>__doc__<5F>
__future__rr>rr<>rr<00>pathlibr<00>typingr<00>os<6F>uuidr<64>rr r
r r r r<00>werkzeug.utilsr<00>utils.media_managerrrr<00>__name__<5F>app<70>__file__rrr-r<>r"r*r0r4rCrJr[rnr|r<>r<>r<><00>router<65>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r#r%r<><00>runr)r#r!<00><module>r=sO<00><01>2<>"<22> <0B> <09> <0A>'<27><18><16> <09> <0B>`<60>`<60>`<60>*<2A>E<>E<> <0B>H<EFBFBD>o<EFBFBD><03> <10><08>><3E> <20> <20><08><17>*<2A>$<24> <0C><19>H<EFBFBD>$<24>y<EFBFBD>0<>3Q<33>Q<><0E>
<1E>D<01><1F>/<2F> <06>V<01>
<06><06>& <12> <12>
<EFBFBD>".<2E>N<05><19><19>3<EFBFBD><1E>*<2A><10>*<2A>
<05><19><19><<3C><18>2<><19>2<><05><19><19> <1B><1C>%<07><1D>%<07>T<05><19><19>?<3F>U<EFBFBD>G<EFBFBD><19>,<2C><1D>-<2D><1D> <05><19><19> *<2A>U<EFBFBD>G<EFBFBD><19><<3C><1B>=<3D><1B>$<05><19><19> *<2A>U<EFBFBD>G<EFBFBD><19><<3C>
7<>=<3D>
7<><05><19><19>?<3F>V<EFBFBD>H<EFBFBD><19>-<2D>0<>.<2E>0<>6<05><19><19> !<21>E<EFBFBD>7<EFBFBD><19>3<>+<2B>4<>+<2B> <05><19><19> !<21>E<EFBFBD>7<EFBFBD><19>3<> +<2B>4<> +<2B><05><19><19> !<21>H<EFBFBD>:<3A><19>6<>!<21>7<>!<21><05><19><19> '<27>%<25><17><19>9<>&<26>:<3A>&<26> <05><19><19> ,<2C>u<EFBFBD>g<EFBFBD><19>><3E><19>?<3F><19><05><19><19> .<2E><16><08><19>A<>/<2F>B<01>/<2F>(<05><19><19> ,<2C>u<EFBFBD>g<EFBFBD><19>><3E> <1A>?<3F> <1A><05><19><19> 7<>(<28><1A><19>L<>!<21>M<01>!<21><05><19><19> '<27>&<26><18><19>:<3A> 7<>;<3B> 7<><05><19><19>;<3B><16><08><19>)<29>Sm<01>*<2A>Sm<01>n<05><19><19> *<2A>+<2B>3<>,<2C>3<> <0C>z<EFBFBD><19><10><16><16><04><16>%<25><07>G<EFBFBD>G<EFBFBD>$<24>T<EFBFBD>G<EFBFBD>"<22>r#