fota_uart.bin 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTAULÀa��Z¥Z¥�����þ2Z¥Z¥Ùfota_uart.luac:��þÿLuaS�“.+
  2. 
  3. xV�����������(w@@fota%Ÿ_uart.lua��������� ���@@€���O¹A€���€��Á€��,��lA��¬���€��¬Á�� uÆA�ÇAÁ��äA�&�€����uart_i¶»d��������������� uart_cbfun¼µsys taskInit��������0���;��ÑK��� ����@�@@�A€���À��$@€�A�CÁ@A�A€�$€� �€�ÀA��B�F@B��€�±¯$@€ÀA�ÀB�F@B����Æ@C�$@�€�‘Ó ��€� �€€� ��ÀC��D�A@�'$@�&�€����loginfo
  4. FOTA_UAÌRT%开机自动å�¯åЍ䏲å�£å�‡çÅŒº§æ¨¡å¼�zbuffcreate�������rýuartsetupuart_id�Â�����)Wonreceive uart_cbfun�������é;�syspublishUART_UPGRADE_STÃ÷ART���������� ���1���1�� �1���1���1���3���3���3���3���3��7ÿ�4���4���4���4���4���5���5���5��+¼�5���5���5���6���6���7���7���8��€��8���:���:���:���:���;���������&�_ENV uart_zbuffuart_fota_stat<ñeuart_rx_counteruart_fota_writMed�>���F�����������"����€�̺�� �@�$@���� ���@À�€@�FÀÀ�$@ø’��� ��@Á�€A�AÀ����$@€&�Ë7€� ���deluartcloseuart_i#d��������loginfo
  5. FOTA_UARTZ8"资æº�已清ç�†ï¼Œä¸²å�£å·²å…³hÆé—­�������������?���?���?��j'�@���@���@���A���A���C���C���C��…§�C���D���D���E���E���E���E���E���’�F���������� uart_zbuff_ENVua|rt_fota_state�I���a���� 1���…��Þõ�¢@����€&�€�…���Œ�@¤€� €€€ÀN逆€À�‡À@Á��A�¤@€…���Œ€A¤@�ïó†ÀÁ�‡�BÀ�����¤€€a@BÀ€Å��a¦Í€€É��Æ€À�Ç€ÂÁ�AÁ�€�Áè���ä@�Å�€@€úÆ@Ã�Ç€ÃÁº‹�ä@�Æ€À�Ç€ÂÁ�A�ä@€�ø&�€|����used� ������logwarnlòfota3uart_zbuff待处ç�†çš„æ•°†Yæ�®å¤ªå¤šäº†,强制清空delP¼uartrx��������info 收到æ=[•°æ�®累计syspublish
  6. UARÊÜT_FOTA(首次收到数æ�®ï¼Œå�‘]ö布å�‡çº§ä¿¡å�·����������1•e���J���J���J���K���O���O���O���O’���O���P���P���P���P���P���Q���QN€���Q���U���U���U���U���U���V���VrÕ���Y���Y���Y���Z���Z���Z���Z���Z#¶���Z���Z���Z���\���\���\���]���]¶4���]���]���^���^���^���^���^���_ç¡���a������id����1���len����1�¯¯��len���/������ uart_zbuff_E,ENVuart_rx_counteruart_fota_staïÊte�d���Ò�����ò������F@@�G€À��ÀH…��d@�E�€�d@€�F@@�G�Á��@�d@�F€x|A�GÀÁ����Á@�d@€F@@�G�Á��€�d@]c�F€A�GÀÁ��€�ÁÀ�d@€E��b����ÑŒ€E��L�Ã�d€�b@����€A��� @�€À\Êú�@�� € @€†Àù…��Œ€C¤€�Å�;��ÌÀÃä@�Ì�DAA�䀀â����÷Ì€+DAÁ�䀀â���Àõ��Æ€A�ÇÀÁA?;�A��€�ä@�Æ@E�ÇÀÅ䀀�â���@×€Æ�F�Ç@Æ�F�AÁ�ä@€@ñÆ€A�Ç�‡GÇ�AA�ä@€Å�€ä@€��$€�ï…�¶f��@�‰��†€A�‡ÀAÁ€��€�AÁ�…Ó¾�¤@€†@E�‡�HÅ��¤�F�A�GAÈ��«E�À��€@�dA€E�LÁÃdA�¢@dg��@€F�A�GÇ�A�ÁÁ���@€€Ž�dA�FF�GAƆ�F�Á �dA€FAE�GA1MɃ��dA�E€dA€�����€�ãâ�y¥���€C����Á� ��¨A €†B@�‡‚Ç8@Á �¤B�†BE�‡J¤Â€�¢B��@€ƒŸ§A�GAC��C
  7. �$C€F�CFFƒF��W~ �$C€CE�CIC��$C�€$C€��@Á��À€â���€� €ƒA�ÃAACëX��ƒ
  8. �$C€CE�CIC€�$C�F�C(¬FFƒF��Ã
  9. �$C€C@�ƒ@AÃ��$C�C¬œ€�K�CK$C€���€§òbA��À€†�ÙA�‡GÁA�‚ �¤A€†F�‡AFÆ�F�Þo �¤A€†AE�‡AIÃ��¤A�…€¤A€��ö•��@€@ÎF�A�GÁÁ�A�ÁÁ ��€�A.¨ �dA€FF�GAƆ�F�ÁA �dA€�Ë�"Ã��A���I�€A���I��A���I��F@@�G€½ŽÀ��À��d@�E�€�d@€�@Å&�€�2����/ô�������syswaitè������
  10. wai¬½tUntilUART_UPGRADE_STARTlog4sinfo
  11. FOTA_UART(å�‡çº§ä»»åŠ¡å·rû²å�¯åŠ¨ï¼Œç­‰å¾…æ•°æ�®...
  12. UART_µåFOTA等待数æ�®...used���Æt����querydel startsWith#FÂ4OTA endsWith
  13. �������fotaàã+检测到fota起始标记,进兕:¥FOTA状æ€�inituartwrite•uart_id #FOTA RDY
  14. errorFOTA*uåˆ�始化失败准备写入fot�a包 累计写入rundebug ÿöfota.run
  15. 出错了 #FOTA ERR
  16. n½finish�������d�������isDonÂèe校验过程出错已完æˆ�O6,1så�Žé‡�å�¯
  17. #FOTA OK
  18. rtosr±peboot 校验超时å�•包写典¥å®Œæˆ�等待下一个包 #FOíTA NEXT
  19. ����������ò�@à��e���h���h���h���h���i���i���m�ëC��m���m���m���n���n���n���n���n�;Ü��r���r���r���r���s���s���s���s�ß��s���u���u���u���u���u���u���u�÷��u���u���v���v���w���w���y���y� 0��z���z���z���{���{���{���}���}�S‰��}���}���}���}���}���}���}���}�¤W��~���������������������€�1 ��€���€���€���€���‚���‚���‚���‚�*X��‚���‚���„���„���„���„���„���…�ÞR��…���…���‰���Œ���Œ���Œ�������������������������������Ž���Ž���Ž�Ÿ‚��Ž�����������������������������ªï��������������’���’���”���”���”�Dƒ��”���”���”���”���”���•���•���•�(O��•���•���—���—���—���—���˜���˜�ÀP��™���™���š���›���›�������ž���ž�|×��ž���ž���Ÿ���Ÿ���Ÿ���Ÿ��� ��� �×e�� ���¡���¡���¢���¢���¢���¢���¢�CN��£���£���£���£���£���¤���¤���¤�“s��¤���¥���¥���¦���¦���©���©���ª�à ��ª���¬���¬���¬���¬���¬���®���®����®���®���°���°���°���°���°���±�Ël��±���±���±���²���³���³���³���³�ÙÓ��ž���·���·���¸���¸���¸���¸���¸�]9��¹���¹���¹���¹���¹���º���º���º�¸½��º���»���»���¼���½���¾���Á���Á�«€��Á���Á���Á���Á���Á���Â���Â���Â�tK��Â���Â���Å���É���Ê���Ê���Ë���Ë�cY��Ì���Ì���Ï���Ï���Ï���Ï���Ð���Ð�»œ��Ð���Ò��� ��� fota_state���ò��Ø}�used"���â���data+���R���resuñŠlta���â���isDonea���â���cachea
  20. ²���â���success†���Õ��� (for ind:£ex)‰���Á��� (for limit)‰���Á��� dw(for step)‰���Á���iŠ���À���sucƒc‘���À��� fotaDone‘���À������_±åENVinit_uart_fota uart_zbuffclW eanup_resourcesuart_fota_writed^©uart_fota_stateuart_rx_countersÉ���'���*���+���,���-���;���F���_Éa���I���Ò���Õ���Õ���Õ���Õ���Õ���„b��� uart_zbuff������uart_fotȦa_state������uart_rx_counterfÍ������uart_fota_writed������¤Šinit_uart_fota������cleanup_Ʀresources������uartUpgradeTas¤2k
  21. ���������_ENVZ¥Z¥ main.l©Tuac ��þ™LuaS�“
  22. 
  23. xV �����������(w@
  24. @main.lua�������è(��"���@@€À@��A�@A�A€�†�@�-Æ€@�$@�ÀA�"���@€ÀA��B�A@��¦$@�€B�ÀB�FÀA�G�Ã��@�$@€,���ø¡��‡ÀC��D�F€C�$@�@D�A€�$@�‚vÀC�ÀD�$@€�&�€����PROJECT
  25. fª�ota_testVERSION 001.000.001Ñyloginfomainwdtinit(#���æ>���systimerLoopStartfeed¸[$ ������print_versionsys tasBckInitrequire
  26. fota_uartrun�Gø�������N���T���������@�@@�^�A€��$@�À@��A�A@��€�ÆÀA�$@�‚ÍÀ@��A�A��$@��ü&�€� ���syÐLswaitè������loginfofot(£aversionVERSION8101fota teR„st������������P���P���P���P���iQ���Q���Q���Q���Q���Q���R���R����R���R���R���T����������_ENV"�� ]�"���#���'���'���'���'���'���'��²…�,���,���,���.���.���.���.���0��r��0���0���0���0���0���T���N���U��N�U���U���U���[���[���[���_���_��&6�_���_����������_ENVZ¥Z¥ exkplorer.htmlúD��þ« <!DOCTYPE hPtml>
  27. <html lang="zh-CN">
  28. <head�€>
  29. <meta charset="UTF-8">
  30. ã <meta name="viewport" contentq="width=device-width, initial-scrÂale=1.0">
  31. <title>LuatOS 文a件管�系统</title>
  32. <stOVyle>
  33. body {
  34. œ~ font-family: 'Microsoft YaHei'&þ, Arial, sans-serif;
  35. 0â background-color: #f5f5f5;
  36. íd margin: 0;
  37. v� padding: 20px;
  38. covÀlor: #333;
  39. }
  40. .¯Ücontainer {
  41. max-widOvth: 1200px;
  42. margin:|± auto;
  43. background: ›¯white;
  44. padding: 20pßþx;
  45. border-radius: 8çüpx;
  46. box-shadow: 0 0$¯ 10px rgba(0, 0, 0, 0.1);
  47. ¨¤ }
  48. .header {
  49. Á background: #2c3e50;
  50. ” color: white;
  51. ¢ó padding: 15px;
  52. bobnrder-radius: 5px;
  53. mÁ³argin-bottom: 20px;
  54. {˜ display: flex;
  55. juså~tify-content: space-between;
  56. ·— align-items: center;
  57. ª }
  58. .login-form {Å
  59. max-width: 400px; iÞ
  60. margin: 100px auto;)H
  61. padding: 40px;
  62. ±� background: white;
  63. .” border-radius: 8px;
  64. C box-shadow: 0 0 20px ¸xrgba(0, 0, 0, 0.1);
  65. }
  66. ˆ .form-group {
  67. <m margin-bottom: 15px;
  68. H }
  69. label {
  70. Á? display: block;
  71. maÔ8rgin-bottom: 5px;
  72. fµIont-weight: bold;
  73. }
  74. Us input[type="text"], input[Gtype="password"] {
  75. ¤0width: 100%;
  76. paddinÓ^g: 10px;
  77. border: 1pU°x solid #ddd;
  78. bordeÝÊr-radius: 4px;
  79. box-Wûsizing: border-box;
  80. }
  81. ýq button {
  82. baÓ9ckground-color: #3498db;
  83. ÃW color: white;
  84. W¥ border: none;
  85. padd>8ing: 10px 20px;
  86. borW~der-radius: 4px;
  87. cuÖrrsor: pointer;
  88. font~O-size: 16px;
  89. }
  90. á button:hover {
  91. bacõkground-color: #2980b9;
  92. ® }
  93. .file-list {
  94. �7 width: 100%;
  95. ¥”border-collapse: collapse;
  96. 0 margin-top: 20px;
  97. Ó$ }
  98. .file-list th, .fiªle-list td {
  99. paddin°ôg: 12px;
  100. text-aligniÌ: left;
  101. border-bott§om: 1px solid #ddd;
  102. }
  103. ìK .file-list th {
  104. M» background-color: #f8f9fa; 
  105. font-weight: bold; ªÊ
  106. }
  107. .file-list tŒr:hover {
  108. backgroun’¶d-color: #f5f5f5;
  109. }
  110. |† .download-btn {
  111. iŒ background-color: #27ae60;
  112. Q… color: white;
  113. Ž padding: 5px 10px;
  114. Ë text-decoration: none;
  115. �Ò border-radius: 3px;
  116. ’ð font-size: 12px;
  117. ê< }
  118. .download-btn:ho#Zver {
  119. background-coíqlor: #219a52;
  120. }
  121. �­ .delete-btn {
  122. bacÑ*kground-color: #e74c3c;
  123. :_ color: white;
  124. ›border: none;
  125. paddiXng: 5px 10px;
  126. borde]{r-radius: 3px;
  127. fontO-size: 12px;
  128. cursorê: pointer;
  129. }
  130. ."Udelete-btn:hover {
  131. õ«background-color: #c0392b;
  132. °$ }
  133. .breadcrumb {
  134. 7ç padding: 10px 0;
  135. ú margin-bottom: 20px;
  136. / }
  137. .breadcrumb a {E÷
  138. color: #3498db;
  139. ˜, text-decoration: noney';
  140. cursor: pointer; h�
  141. }
  142. .breadcrumb ’ha:hover {
  143. text-decoTýration: underline;
  144. }
  145. ³× .hidden {
  146. diœsplay: none;
  147. }
  148. Ó .error {
  149. color: #e�Ü74c3c;
  150. margin-top: ¼ 10px;
  151. }
  152. </style>
  153. Í®</head>
  154. <body>
  155. <div class="\"container">
  156. <!-- ç™»å½/ݕ页é�¢ -->
  157. <div id="lo-ginPage" class="login-form">
  158. '$ <h2>LuatOS 文件管ç�žy†ç³»ç»Ÿç™»å½•</h2>
  159. Õï<div class="form-group">
  160. õ <label for="username">ÈÍ用户å��:</label>
  161. ·€ <input type="text" id="usern•êame">
  162. </div>
  163. ŠÇ <div class="form-group"> ìß
  164. <label for="pas1+sword">密�:</label>
  165. '{ <input type="password" i_Ld="password">
  166. </divõP>
  167. <button onclick="Ò1login()">登录</button>
  168. 1© <div id="loginError" class§a="error hidden"></div>
  169. Ρ</div>
  170. <!-- 文件管Úäç�†é¡µé�¢ -->
  171. <div id="š¹filePage" class="hidden">
  172. üç <div class="header">
  173. V <h1>LuatOS 文件ç®5¸¡ç�†ç³»ç»Ÿ</h1>
  174. þP <div>
  175. <butHþton onclick="scanFiles()" style=ÝQ"margin-right: 10px;">扫æ��æ–‡äªÔ»¶</button>
  176. Xò <button onclick="logout()">退åéT‡ºç™»å½•</button>
  177. s· </div>
  178. </div>
  179. v
  180. <div class="breadcrž#umb" id="breadcrumb">
  181. Þ <a onclick="navigateTo('/#M')">根目录</a>
  182. %° <span> | </span>
  183. \’ <a onclick="navigateTo('/sdmˆ')">TF/SD目录</a>
  184. ˜e </div>
  185. <table cl5.ass="file-list">
  186. “° <thead>
  187. <iXtr>
  188. <thb >�称</th>
  189. üN <th>大å°�</th>
  190. ïG <th>æ“�作</th>
  191. óe </tr>
  192. 8F </thead>
  193. ÷ <tbody id="fileListBody">
  194. 6/ </tbody>
  195. üë </table>
  196. </div>
  197. ¾j </div>
  198. <script>
  199. ä let currentPath = '/';
  200. kù let isLoggedIn = false;
  201. ¶ function login() {
  202. ‘“ const username = documentJÈ.getElementById('username').valuÔGe;
  203. const password =‚ document.getElementById('password').value;
  204. fetch'µ('/login', {
  205. megëthod: 'POST',
  206. hÓÐeaders: {
  207. '‰DContent-Type': 'application/json´ñ',
  208. },
  209. }¸ credentials: 'include', M// ç¡®ä¿�å�‘é€�和接收cookies �
  210. body: JSON.striéÊngify({username: username, passwX;ord: password})
  211. }) A‰
  212. .then(response => {W
  213. // 打å�°æ‰€æœûO‰å“�应头,查看Cookie设置 ;®
  214. console.log('ç™tê»å½•å“�应头:', response.headerEns);
  215. return resp1onse.json();
  216. })
  217.  .then(data => {
  218. ƒœ console.log('登录å“úØ�应数æ�®:', data);
  219. Þ¤ if (data.success) {
  220. Ô» isLoggedIn = trueh;
  221. // 存储ðsession_id到localStorage作为åɈ¤‡ç”¨è®¤è¯�æ–¹å¼�
  222. ö if (data.session_id) {
  223. ñÙ localStorÏ×age.setItem('session_id', data.s°ìession_id);
  224. M' console.log('已存储Sessi·onID到localStorage:', data.sess )ion_id);
  225. } 09
  226. document.ge-ŒtElementById('loginPage').classL%úist.add('hidden');
  227. M¼ document.getElementById(Öª'filePage').classList.remove('hi1Ždden');
  228. loai2dFiles('/luadb');
  229. ¢ } else {
  230. ¡ document.getElementById('loginEëårror').textContent = data.messagÛ e || '登录失败';
  231. ˜c document.getElementByI�Žd('loginError').classList.remove­('hidden');
  232. }
  233. Tå })
  234. .catÂÊch(error => {
  235. cÇzonsole.error('登录请求错误LÄ:', error);
  236. docHGument.getElementById('loginError').textContent = '登录请求å¤óJ±è´¥';
  237. document&‘.getElementById('loginError').clrÇassList.remove('hidden');
  238. Ô1 });
  239. }
  240. ¹l function logout() {
  241. òQ fetch('/logout', {
  242. +s method: 'POST',
  243. Ò7 credentials: 'include' //H¦ ç¡®ä¿�å�‘é€�cookies
  244. qÈ })
  245. .then(() => { d8
  246. isLoggedIn = faklse;
  247. // 清除l1¼ocalStorage中的session_id
  248. Wf localStorage.remove8òItem('session_id');
  249. çÎ document.getElementById('fiy)lePage').classList.add('hidden')m;
  250. document.getE3`lementById('loginPage').classLisÁ_t.remove('hidden');
  251. âZ document.getElementById('usuername').value = '';
  252. þ³ document.getElementById('p)«assword').value = '';
  253. Vš document.getElementById('�ŒloginError').classList.add('hidd ¨en');
  254. });
  255. 2Ï}
  256. // 扫æ��文件函æ4:•°
  257. function scanFiles()rK {
  258. if (!isLoggedIn)}; return;
  259. // 获å�F–用户å��和密ç �用于URLå�‚æ²7•°è®¤è¯�
  260. const user”¦name = document.getElementById('UÂusername')?.value || 'admin';
  261. CC const password = docua¨ment.getElementById('password')?Ü`.value || '123456';
  262. ƒž // 构建带认è¯�å�‚æ•°çš„æ‰)?«æ��请求URL
  263. const¿ url = '/scan-files?username=' +Øï encodeURIComponent(username) + Xh
  264. '&passwoãÂrd=' + encodeURIComponent(passwo+^rd);
  265. console.log(Kj'å�‘é€�文件扫æ��请求,URL:×', url);
  266. // 显ç¤Íºæ‰«æ��æ��示
  267. alert9('开始扫æ��文件,请查看E?系统日志了解扫æ��进度..‡y.');
  268. fetch(url, {l$
  269. method: 'GET',ŸS
  270. credentials: 'Í@include'
  271. })
  272. ŠÄ .then(response => {
  273. ÌÃ if (!response.ok) {
  274. »? throw new Er¦mror('扫æ��请求错误: ' + res©ponse.status);
  275. /m}
  276. return responáåse.json();
  277. })
  278. Ú¡ .then(data => {
  279. Äù console.log('扫æ��å“�åÎ2º”:', data);
  280. ifX¼ (data && data.success) {
  281. {È alert('文件扫æª��完æˆ�ï¼�已扫æ��到 ' + data–.foundFiles + ' 个文件,显疹¤ºæ‰«æ��到的用户文件。');™b
  282. // é‡�æ–°ås Š è½½æ–‡ä»¶åˆ—è¡¨
  283. Ä´ loadFiles(currentPath);
  284. Ó } else {
  285. ë± alert('文件扫æ�Žœ�失败: ' + (data.message || 'æΜªçŸ¥é”™è¯¯'));
  286. § }
  287. })
  288. *.catch(error => {
  289. )’ console.error('扫æ��文件è¯Ô§·æ±‚错误:', error);
  290. Ë9 alert('扫æ��文件请求º½å¤±è´¥');
  291. });
  292. � }
  293. function loadFiü÷les(path) {
  294. if (!isŽLoggedIn) return;
  295. Cº // 准备请求头
  296. Ñ const headers = {
  297. %O 'Content-Type': 'applicationvÕ/json'
  298. };
  299. ]q // 由于传统认è¯�æ–¹å¼@�ä¸�å�¯é� ï¼Œæˆ‘们使用URLå�‚払°è®¤è¯�
  300. // 获å�–çf”¨æˆ·å��和密ç �用于URLå�‚æ•°Xæè®¤è¯�
  301. const userna¿­me = document.getElementById('us]äername')?.value || 'admin';
  302. Ç const password = docume'Õnt.getElementById('password')?.v‡‰alue || '123456';
  303. PR // 构建带认è¯�å�‚æ•°çš„URL ¡;
  304. const url = '/list?kfpath=' + encodeURIComponent(path�m) +
  305. '&u‹sername=' + encodeURIComponent(uÑLsername) +
  306. 8H '&password=' + encodeURIComp9onent(password);
  307. ³xconsole.log('使用URLå�‚数认èǯ�,请求URL:', url);
  308. ~ fetch(url, {
  309. L{ credentials: 'include', // ’Iç¡®ä¿�å�‘é€�cookies
  310. îL headers: headers
  311. RÓ })
  312. .then(responshÞe => {
  313. if (!resxCponse.ok) {
  314. ¼ throw new Error('网络å“�应é”À7™è¯¯: ' + response.status);
  315. œÓ }
  316. Óñreturn response.json();
  317. : })
  318. .then(data Žž=> {
  319. console.lo2�g('文件列表数æ�®:', data); Ûz
  320. // å�ªä½¿ç”¨æz�œ�务器返回的数æ�®
  321. ¶Ä if (data && data.succes¤üs && Array.isArray(data.files)) d_{
  322. displayFi9òles(data.files, path);
  323. 5| } else {
  324. ê // 如果数æ�®æ— æ•ˆï¼Œæ˜ää¾ç¤ºç©ºåˆ—表
  325. šR displayFiles([], path);
  326. ”; }
  327. Ä updateBreadcrumb(path);
  328. î })
  329. .catch(err†or => {
  330. console|".error('加载文件列表错误ƒ:', error);
  331. // LT�生错误时显示空列表
  332. ;G displayFiles([],co path);
  333. updateBwWreadcrumb(path);
  334. })Ü;
  335. }
  336. function&l displayFiles(files, path) {
  337. ¤É const tbody = documentS.getElementById('fileListBody');rÇ
  338. tbody.innerHTML = :1'';
  339. // ç¡®ä¿�fileÎds是数组
  340. if (!ArrNnay.isArray(files)) {
  341. Ã~ files = [];
  342. }ì
  343. console.log('显Œ示文件数é‡�:', files.length)]r;
  344. files.forEach(f“ile => {
  345. // ç¡®u³ä¿�文件对象有必è¦�的属怾N§
  346. const safeFilàCe = {
  347. name:5å file.name || "未知文件å��",äd
  348. size: fileñO.size || 0,
  349. (O isDirectory: file.isDirectory |¾Æ| false,
  350. pa0th: file.path || (path + '/' + (ëdfile.name || "未知文件å��"))_
  351. };
  352. Qï const row = document.cre�}ateElement('tr');
  353. Í let nameCell, actionCell;
  354. <¦ if (safeFile.isDširectory) {
  355. < nameCell = `<td><a href="#" oncÖÿlick="navigateTo('${encodeURICom>gponent(path + '/' + safeFile.nam¤Be)}')">${safeFile.name}/</a></tdøü>`;
  356. actionCu¼ell = '<td></td>';
  357. So } else {
  358. é nameCell = `<td>${safeFile.nam°¬e}</td>`;
  359. /ڊ/ 为下载链接添加URL�数v认�
  360. consxEt username = document.getElementCœById('username')?.value || 'admi>:n';
  361. const pš¶assword = document.getElementByIÍÊd('password')?.value || '123456'ÖK;
  362. const dow¹°nloadUrl = '/download?path=' + eËÒncodeURIComponent(safeFile.path)š +
  363. ·" '&username=' + encodÂ{eURIComponent(username) +
  364. ¿ø ôQ '&password=' + encodeURICompoŸ�nent(password);
  365. E¤ // 添加下载和删除æm^Œ‰é’®
  366. actioÝ4nCell = `<td>
  367. –¿ <a href="${downloadUrl}" «€class="download-btn" style="margo”in-right: 5px;">下载</a>
  368. †c <button claslªs="delete-btn" onclick="deleteFigŸle('${encodeURIComponent(safeFilÅÀe.path)}')">删除</button>
  369. â( </td>`;
  370. <j }
  371. rT ow.innerHTML = `
  372. Ù€ ${nameCell}
  373. rÔ <td>${formatSize(safeFile��.size)}</td>
  374. 0¨ ${actionCell}
  375. åü `;
  376. tbody.appenLÈdChild(row);
  377. });
  378. Lí }
  379. // 删除文‘Í件函数
  380. function deleµIteFile(filePath) {
  381. Üif (confirm('确定è¦�删除这äÉ ¸ªæ–‡ä»¶å�—?')) {
  382.   // 获å�–用户å��和密ç �M&用于URLå�‚数认è¯�
  383. É const username = documentJÈ.getElementById('username')?.valÝue || 'admin';
  384. È!const password = document.getEleK mentById('password')?.value || '"123456';
  385. // æšž„建带认è¯�å�‚数的删除请îI求URL
  386. const ur#Çl = '/delete?path=' + filePath +c
  387. '&î¾username=' + encodeURIComponent(Þéusername) +
  388. õ '&password=' + encodeURœ¢IComponent(password);
  389. ød console.log('使用URLåó©�‚数认è¯�进行删除æ“�作,¸9请求URL:', url);
  390. IQ fetch(url, {
  391. ÝÁ method: 'POST',
  392. …A credentials: 'inclu�åde'
  393. })
  394. :¤ .then(response => respoî¢nse.json())
  395. .th�Íen(data => {
  396. dá if (data.success) {
  397. ùV // 删除æˆ�功å�2–Žé‡�新加载文件列表
  398. ÎS loadFiles(curH“rentPath);
  399. ­à} else {
  400. ÔP alert('删除失败: ' + (datad.message || '未知错误'));
  401. Ѻ }
  402. tŽ })
  403. .catch<(error => {
  404. ÷­ alert('删除请求失败');
  405. ³y });
  406. M™}
  407. }
  408. functionÊt updateBreadcrumb(path) {
  409. …3 const breadcrumb = docume1nt.getElementById('breadcrumb');já
  410. // 先设置根çW›®å½•å’ŒTF/SD目录链接
  411. 00 breadcrumb.innerHTML = '<Vöa onclick="navigateTo(\'\')">æ ¹`Ö目录</a><span> | </span><a oncvZlick="navigateTo(\'/sd\')">TF/SD7W目录</a>';
  412. // çxt„¶å�Žæ·»åР当å‰�路径的层次?结构(如果ä¸�是根目录ï¼2m‰
  413. if (path !== '/' õâ&& path !== '/sd') {
  414. ¶ñ const parts = path.split('rÝ/').filter(p => p);
  415. üè let current = '';
  416. ¸ // 仅在é�žæ ¹ç›®å½•刨’Œé�žSD目录时添加分隔符 $k
  417. breadcrumb.inneƒ—rHTML += ' > ';
  418. Ç| parts.forEach((part, index) =àT> {
  419. currentþ" += '/' + part;
  420. iF if (index > 0) {
  421. „Ë breadcrumb.innerH‘TML += ' > ';
  422. Ê }
  423. breadc›(rumb.innerHTML += '<a onclick="näPavigateTo(\'' + current + '\')">Ý' + part + '</a>';
  424. ^ });
  425. }
  426. ç¥}
  427. function navigateTo|(path) {
  428. currentPatpeh = path;
  429. loadFiles–@(path);
  430. }
  431. fuÕÆnction formatSize(bytes) {
  432. ªâ if (bytes === 0) return æì'0 B';
  433. const k = 10ãõ24;
  434. const sizes = [˨'B', 'KB', 'MB', 'GB'];
  435. d¢ const i = Math.floor(Math.lÌog(bytes) / Math.log(k));
  436. > return parseFloat((bytes -/ Math.pow(k, i)).toFixed(2)) + ‘‚' ' + sizes[i];
  437. }
  438. ³º // æ ¼å¼�化日期函数å·êü²ç§»é™¤
  439. // å�¯åЍå�Žæwù£€æŸ¥è®¤è¯�状æ€�
  440. windo7Ÿw.onload = function() {
  441. èF fetch('/check-auth', {
  442. œo credentials: 'inclu�åde' // ç¡®ä¿�å�‘é€�cookies
  443. êª })
  444. .then(re[ sponse => response.json())
  445. Ÿ[ .then(data => {
  446. Äù if (data.authenticated)tä {
  447. isLogged?1In = true;
  448. ± document.getElementById('loginPa?•ge').classList.add('hidden');
  449. ÃY document.getEáïlementById('filePage').classListò.remove('hidden');
  450. ãU loadFiles('/luadb');
  451. ž }
  452. });v‹
  453. };
  454. </script>
  455. </body>
  456. </html>
  457. Z¥Z¥.airm2m_a@ÿll_crc#.bin���þ_
  458. é/¡9£™Å�ú*i÷–t~G0���������������������������a