| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500 |
- ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTAULÀa��Z¥Z¥�����þ2Z¥Z¥Ùfota_uart.luac:��þÿLuaS�“.+
- 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
- FOTA_UAÌRT%开机自动å�¯åЍ䏲å�£å�‡çÅŒº§æ¨¡å¼�zbuffcreate�������rýuartsetupuart_id�Â�����)Wonreceiveuart_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���:���:���:���:���;���������&�_ENVuart_zbuffuart_fota_stat<ñeuart_rx_counteruart_fota_writMed�>���F�����������"����€�̺���@�$@���� ���@À�€@�FÀÀ�$@ø’��� ��@Á�€A�AÀ����$@€&�Ë7€� ���deluartcloseuart_i#d��������loginfo
- 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
- 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
- �$C€F�CFFƒF��W~ �$C€CE�CIC��$C�€$C€��@Á��À€â���€� €ƒA�ÃAACëX��ƒ
- �$C€CE�CIC€�$C�F�C(¬FFƒF��Ã
- �$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è������
- wai¬½tUntilUART_UPGRADE_STARTlog4sinfo
- FOTA_UART(å�‡çº§ä»»åŠ¡å·rû²å�¯åŠ¨ï¼Œç‰å¾…æ•°æ�®...
- UART_µåFOTAç‰å¾…æ•°æ�®...used���Æt����querydelstartsWith#FÂ4OTA endsWith
- �������fotaàã+检测到fotaèµ·å§‹æ ‡è®°,进兕:¥FOTA状æ€�inituartwrite•uart_id#FOTA RDY
- errorFOTA*u�始化失败准备写入fot�a包
累计写入rundebug ÿöfota.run
- 出错了#FOTA ERR
- n½finish�������d�������isDonÂèeæ ¡éªŒè¿‡ç¨‹å‡ºé”™å·²å®Œæˆ�O6,1så�Žé‡�å�¯
- #FOTA OK
- rtosr±peboot
æ ¡éªŒè¶…æ—¶å�•包写典¥å®Œæˆ�ç‰å¾…下一个包#FOíTA NEXT
- ����������ò�@à��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
- ²���â���success†���Õ���(for ind:£ex)‰���Á���(for limit)‰���Á���dw(for step)‰���Á���iŠ���À���sucƒc‘���À��� fotaDone‘���À������_±åENVinit_uart_fotauart_zbuffclWeanup_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
- ���������_ENVZ¥Z¥ main.l©Tuac ��þ™LuaS�“
- xV �����������(w@
- @main.lua�������è(��"���@@€À@��A�@A�A€�†�@�-Æ€@�$@�ÀA�"���@€ÀA��B�A@��¦$@�€B�ÀB�FÀA�G�Ã��@�$@€,���ø¡��‡ÀC��D�F€C�$@�@D�A€�$@�‚vÀC�ÀD�$@€�&�€����PROJECT
- fª�ota_testVERSION001.000.001Ñyloginfomainwdtinit(#���æ>���systimerLoopStartfeed¸[$������print_versionsys tasBckInitrequire
- 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>
- <html lang="zh-CN">
- <head�€>
- <meta charset="UTF-8">
- ã <meta name="viewport" contentq="width=device-width, initial-scrÂale=1.0">
- <title>LuatOS 文a件管�系统</title>
- <stOVyle>
- body {
- œ~ font-family: 'Microsoft YaHei'&þ, Arial, sans-serif;
- 0â background-color: #f5f5f5;
- íd margin: 0;
- v� padding: 20px;
- covÀlor: #333;
- }
- .¯Ücontainer {
- max-widOvth: 1200px;
- margin:|± auto;
- background: ›¯white;
- padding: 20pßþx;
- border-radius: 8çüpx;
- box-shadow: 0 0$¯ 10px rgba(0, 0, 0, 0.1);
- ¨¤ }
- .header {
- Á background: #2c3e50;
-
” color: white;
- ¢ó padding: 15px;
- bobnrder-radius: 5px;
- mÁ³argin-bottom: 20px;
- {˜ display: flex;
- juså~tify-content: space-between;
- ·— align-items: center;
- ª }
- .login-form {Å
- max-width: 400px;
iÞ
- margin: 100px auto;)H
- padding: 40px;
- ±� background: white;
- .” border-radius: 8px;
- C box-shadow: 0 0 20px ¸xrgba(0, 0, 0, 0.1);
- }
- ˆ .form-group {
- <m margin-bottom: 15px;
- H }
- label {
- Á? display: block;
- maÔ8rgin-bottom: 5px;
- fµIont-weight: bold;
- }
- Us input[type="text"], input[Gtype="password"] {
- ¤0width: 100%;
- paddinÓ^g: 10px;
- border: 1pU°x solid #ddd;
- bordeÝÊr-radius: 4px;
- box-Wûsizing: border-box;
- }
- ýq button {
- baÓ9ckground-color: #3498db;
- ÃW color: white;
- W¥ border: none;
- padd>8ing: 10px 20px;
- borW~der-radius: 4px;
- cuÖrrsor: pointer;
- font~O-size: 16px;
- }
- á button:hover {
- bacõkground-color: #2980b9;
- ® }
- .file-list {
- �7 width: 100%;
- ¥”border-collapse: collapse;
- 0 margin-top: 20px;
- Ó$ }
- .file-list th, .fiªle-list td {
- paddin°ôg: 12px;
- text-aligniÌ: left;
- border-bott§om: 1px solid #ddd;
- }
- ìK .file-list th {
- M» background-color: #f8f9fa;
- font-weight: bold;
ªÊ
- }
- .file-list tŒr:hover {
- backgroun’¶d-color: #f5f5f5;
- }
- |† .download-btn {
- iŒ background-color: #27ae60;
- Q… color: white;
- Ž padding: 5px 10px;
- Ë text-decoration: none;
- �Ò border-radius: 3px;
- ’ð font-size: 12px;
- ê< }
- .download-btn:ho#Zver {
- background-coíqlor: #219a52;
- }
- � .delete-btn {
- bacÑ*kground-color: #e74c3c;
- :_ color: white;
- ›border: none;
- paddiXng: 5px 10px;
- borde]{r-radius: 3px;
- fontO-size: 12px;
- cursorê: pointer;
- }
- ."Udelete-btn:hover {
- õ«background-color: #c0392b;
- °$ }
- .breadcrumb {
- 7ç padding: 10px 0;
- ú margin-bottom: 20px;
- / }
- .breadcrumb a {E÷
- color: #3498db;
- ˜, text-decoration: noney';
- cursor: pointer;
h�
- }
- .breadcrumb ’ha:hover {
- text-decoTýration: underline;
- }
- ³× .hidden {
- diœsplay: none;
- }
-
- Ó .error {
- color: #e�Ü74c3c;
- margin-top: ¼
10px;
- }
- </style>
- Í®</head>
- <body>
- <div class="\"container">
- <!-- ç™»å½/ݕ页é�¢ -->
- <div id="lo-ginPage" class="login-form">
- '$ <h2>LuatOS 文件管ç�žy†ç³»ç»Ÿç™»å½•</h2>
- Õï<div class="form-group">
- õ <label for="username">ÈÍ用户å��:</label>
- ·€ <input type="text" id="usern•êame">
- </div>
- ŠÇ <div class="form-group">
ìß
- <label for="pas1+sword">密ç �:</label>
- '{ <input type="password" i_Ld="password">
- </divõP>
- <button onclick="Ò1login()">登录</button>
- 1© <div id="loginError" class§a="error hidden"></div>
- Ρ</div>
- <!-- 文件管Úäç�†é¡µé�¢ -->
- <div id="š¹filePage" class="hidden">
- üç <div class="header">
- V <h1>LuatOS 文件ç®5¸¡ç�†ç³»ç»Ÿ</h1>
- þP <div>
- <butHþton onclick="scanFiles()" style=ÝQ"margin-right: 10px;">扫æ��æ–‡äªÔ»¶</button>
- Xò <button onclick="logout()">退åéT‡ºç™»å½•</button>
- s· </div>
- </div>
-
v
- <div class="breadcrž#umb" id="breadcrumb">
- Þ <a onclick="navigateTo('/#M')">æ ¹ç›®å½•</a>
- %° <span> | </span>
- \’ <a onclick="navigateTo('/sdmˆ')">TF/SD目录</a>
- ˜e </div>
- <table cl5.ass="file-list">
- “° <thead>
- <iXtr>
- <thb>�称</th>
- üN <th>大å°�</th>
- ïG <th>æ“�作</th>
- óe </tr>
- 8F </thead>
- ÷ <tbody id="fileListBody">
- 6/ </tbody>
- üë </table>
- </div>
- ¾j </div>
- <script>
- ä let currentPath = '/';
- kù let isLoggedIn = false;
- ¶ function login() {
- ‘“ const username = documentJÈ.getElementById('username').valuÔGe;
- const password =‚ document.getElementById('password').value;
- fetch'µ('/login', {
- megëthod: 'POST',
- hÓÐeaders: {
- '‰DContent-Type': 'application/json´ñ',
- },
- }¸ credentials: 'include', M// ç¡®ä¿�å�‘é€�和接收cookies
�
- body: JSON.striéÊngify({username: username, passwX;ord: password})
- })
A‰
- .then(response => {W
- // 打å�°æ‰€æœûO‰å“�应头,查看Cookie设置
;®
- console.log('ç™tê»å½•å“�应头:', response.headerEns);
- return resp1onse.json();
- })
- .then(data => {
- ƒœ console.log('登录å“úØ�应数æ�®:', data);
- Þ¤ if (data.success) {
- Ô» isLoggedIn = trueh;
- // å˜å‚¨ðsession_id到localStorage作为åɈ¤‡ç”¨è®¤è¯�æ–¹å¼�
- ö if (data.session_id) {
- ñÙ localStorÏ×age.setItem('session_id', data.s°ìession_id);
- M' console.log('å·²å˜å‚¨Sessi·onID到localStorage:', data.sess )ion_id);
- }
09
- document.ge-ŒtElementById('loginPage').classL%úist.add('hidden');
- M¼ document.getElementById(Öª'filePage').classList.remove('hi1Ždden');
- loai2dFiles('/luadb');
- ¢ } else {
- ¡ document.getElementById('loginEëårror').textContent = data.messagÛ e || '登录失败';
- ˜c document.getElementByI�Žd('loginError').classList.remove('hidden');
- }
- Tå })
- .catÂÊch(error => {
- cÇzonsole.error('登录请求错误LÄ:', error);
- docHGument.getElementById('loginError').textContent = '登录请求å¤óJ±è´¥';
- document&‘.getElementById('loginError').clrÇassList.remove('hidden');
- Ô1 });
- }
- ¹l function logout() {
- òQ fetch('/logout', {
- +s method: 'POST',
- Ò7 credentials: 'include' //H¦ ç¡®ä¿�å�‘é€�cookies
- qÈ })
- .then(() => {
d8
- isLoggedIn = faklse;
- // 清除l1¼ocalStorageä¸çš„session_id
- Wf localStorage.remove8òItem('session_id');
- çÎ document.getElementById('fiy)lePage').classList.add('hidden')m;
- document.getE3`lementById('loginPage').classLisÁ_t.remove('hidden');
- âZ document.getElementById('usuername').value = '';
- þ³ document.getElementById('p)«assword').value = '';
- Vš document.getElementById('�ŒloginError').classList.add('hidd ¨en');
- });
- 2Ï}
- // 扫æ��文件函æ4:•°
- function scanFiles()rK {
- if (!isLoggedIn)}; return;
- // 获å�F–用户å��和密ç �用于URLå�‚æ²7•°è®¤è¯�
- const user”¦name = document.getElementById('UÂusername')?.value || 'admin';
- CC const password = docua¨ment.getElementById('password')?Ü`.value || '123456';
- ƒž // 构建带认è¯�å�‚æ•°çš„æ‰)?«æ��请求URL
- const¿ url = '/scan-files?username=' +Øï encodeURIComponent(username) +
Xh
- '&passwoãÂrd=' + encodeURIComponent(passwo+^rd);
- console.log(Kj'å�‘é€�文件扫æ��请求,URL:×', url);
- // 显ç¤Íºæ‰«æ��æ��示
- alert9('开始扫æ��文件,请查看E?系统日志了解扫æ��进度..‡y.');
- fetch(url, {l$
- method: 'GET',ŸS
- credentials: 'Í@include'
- })
- ŠÄ .then(response => {
- ÌÃ if (!response.ok) {
- »? throw new Er¦mror('扫æ��请求错误: ' + res©ponse.status);
- /m}
- return responáåse.json();
- })
- Ú¡ .then(data => {
- Äù console.log('扫æ��å“�åÎ2º”:', data);
- ifX¼ (data && data.success) {
- {È alert('文件扫æª��完æˆ�ï¼�已扫æ��到 ' + data–.foundFiles + ' 个文件,显疹¤ºæ‰«æ��到的用户文件。');™b
- // é‡�æ–°ås Š è½½æ–‡ä»¶åˆ—è¡¨
- Ä´ loadFiles(currentPath);
- Ó } else {
- ë± alert('文件扫æ�Žœ�失败: ' + (data.message || 'æÎœªçŸ¥é”™è¯¯'));
- § }
- })
- *.catch(error => {
- )’ console.error('扫æ��文件è¯Ô§·æ±‚错误:', error);
- Ë9 alert('扫æ��文件请求º½å¤±è´¥');
- });
- � }
- function loadFiü÷les(path) {
- if (!isŽLoggedIn) return;
- Cº // 准备请求头
- Ñ const headers = {
- %O 'Content-Type': 'applicationvÕ/json'
- };
- ]q // ç”±äºŽä¼ ç»Ÿè®¤è¯�æ–¹å¼@�ä¸�å�¯é� ,我们使用URLå�‚払°è®¤è¯�
- // 获å�–çf”¨æˆ·å��和密ç �用于URLå�‚æ•°Xæè®¤è¯�
- const userna¿me = document.getElementById('us]äername')?.value || 'admin';
- Ç const password = docume'Õnt.getElementById('password')?.v‡‰alue || '123456';
- PR // 构建带认��数的URL
¡;
- const url = '/list?kfpath=' + encodeURIComponent(path�m) +
- '&u‹sername=' + encodeURIComponent(uÑLsername) +
- 8H '&password=' + encodeURIComp9onent(password);
- ³xconsole.log('使用URLå�‚数认èǯ�,请求URL:', url);
- ~ fetch(url, {
- L{ credentials: 'include', // ’Iç¡®ä¿�å�‘é€�cookies
- îL headers: headers
- RÓ })
- .then(responshÞe => {
- if (!resxCponse.ok) {
- ¼ throw new Error('网络å“�应é”À7™è¯¯: ' + response.status);
- œÓ }
- Óñreturn response.json();
- : })
- .then(data Žž=> {
- console.lo2�g('文件列表数�:', data);
Ûz
- // å�ªä½¿ç”¨æz�œ�务器返回的数æ�®
- ¶Ä if (data && data.succes¤üs && Array.isArray(data.files)) d_{
- displayFi9òles(data.files, path);
- 5| } else {
- ê // 如果数æ�®æ— 效,æ˜ää¾ç¤ºç©ºåˆ—表
- šR displayFiles([], path);
- ”; }
- Ä updateBreadcrumb(path);
- î })
- .catch(err†or => {
- console|".error('åŠ è½½æ–‡ä»¶åˆ—è¡¨é”™è¯¯ƒ:', error);
- // LT�生错误时显示空列表
- ;G displayFiles([],co path);
- updateBwWreadcrumb(path);
- })Ü;
- }
- function&l displayFiles(files, path) {
- ¤É const tbody = documentS.getElementById('fileListBody');rÇ
- tbody.innerHTML = :1'';
- // ç¡®ä¿�fileÎds是数组
- if (!ArrNnay.isArray(files)) {
- Ã~ files = [];
- }ì
- console.log('显Œç¤ºæ–‡ä»¶æ•°é‡�:', files.length)]r;
- files.forEach(f“ile => {
- // ç¡®u³ä¿�文件对象有必è¦�的属怾N§
- const safeFilàCe = {
- name:5å file.name || "未知文件å��",äd
- size: fileñO.size || 0,
- (O isDirectory: file.isDirectory |¾Æ| false,
- pa0th: file.path || (path + '/' + (ëdfile.name || "未知文件å��"))_
- };
- Qï const row = document.cre�}ateElement('tr');
- Í let nameCell, actionCell;
- <¦ if (safeFile.isDširectory) {
- < nameCell = `<td><a href="#" oncÖÿlick="navigateTo('${encodeURICom>gponent(path + '/' + safeFile.nam¤Be)}')">${safeFile.name}/</a></tdøü>`;
- actionCu¼ell = '<td></td>';
- So } else {
- é nameCell = `<td>${safeFile.nam°¬e}</td>`;
- /ÚŠ/ ä¸ºä¸‹è½½é“¾æŽ¥æ·»åŠ URLå�‚æ•°v认è¯�
- consxEt username = document.getElementCœById('username')?.value || 'admi>:n';
- const pš¶assword = document.getElementByIÍÊd('password')?.value || '123456'ÖK;
- const dow¹°nloadUrl = '/download?path=' + eËÒncodeURIComponent(safeFile.path)š +
- ·" '&username=' + encodÂ{eURIComponent(username) +
- ¿ø ôQ '&password=' + encodeURICompoŸ�nent(password);
- E¤ // æ·»åŠ ä¸‹è½½å’Œåˆ é™¤æm^Œ‰é’®
- actioÝ4nCell = `<td>
- –¿ <a href="${downloadUrl}" «€class="download-btn" style="margo”in-right: 5px;">下载</a>
- †c <button claslªs="delete-btn" onclick="deleteFigŸle('${encodeURIComponent(safeFilÅÀe.path)}')">åˆ é™¤</button>
- â( </td>`;
- <j }
- rTow.innerHTML = `
- Ù€ ${nameCell}
- rÔ <td>${formatSize(safeFile��.size)}</td>
- 0¨ ${actionCell}
- åü `;
- tbody.appenLÈdChild(row);
- });
- Lí }
- // åˆ é™¤æ–‡‘Í件函数
- function deleµIteFile(filePath) {
- Üif (confirm('确定è¦�åˆ é™¤è¿™äÉ
¸ªæ–‡ä»¶å�—?')) {
- // 获å�–用户å��和密ç �M&用于URLå�‚数认è¯�
- É const username = documentJÈ.getElementById('username')?.valÝue || 'admin';
- È!const password = document.getEleKmentById('password')?.value || '"123456';
- // æšž„建带认è¯�å�‚æ•°çš„åˆ é™¤è¯·îI求URL
- const ur#Çl = '/delete?path=' + filePath +c
- '&î¾username=' + encodeURIComponent(Þéusername) +
- õ '&password=' + encodeURœ¢IComponent(password);
- ød console.log('使用URLåó©�‚数认è¯�è¿›è¡Œåˆ é™¤æ“�作,¸9请求URL:', url);
- IQ fetch(url, {
- ÝÁ method: 'POST',
- …A credentials: 'inclu�åde'
- })
- :¤ .then(response => respoî¢nse.json())
- .th�Íen(data => {
- dá if (data.success) {
- ùV // åˆ é™¤æˆ�功å�2–Žé‡�æ–°åŠ è½½æ–‡ä»¶åˆ—è¡¨
- ÎS loadFiles(curH“rentPath);
- à} else {
- ÔP alert('åˆ é™¤å¤±è´¥: ' + (datad.message || '未知错误'));
- Ѻ }
- tŽ })
- .catch<(error => {
- ÷ alert('åˆ é™¤è¯·æ±‚å¤±è´¥');
- ³y });
- M™}
- }
- functionÊt updateBreadcrumb(path) {
- …3 const breadcrumb = docume1nt.getElementById('breadcrumb');já
- // å…ˆè®¾ç½®æ ¹çW›®å½•å’ŒTF/SD目录链接
- 00 breadcrumb.innerHTML = '<Vöa onclick="navigateTo(\'\')">æ ¹`Ö目录</a><span> | </span><a oncvZlick="navigateTo(\'/sd\')">TF/SD7W目录</a>';
- // çxt„¶å�Žæ·»åР当å‰�路径的层次?结构(如果ä¸�æ˜¯æ ¹ç›®å½•ï¼2m‰
- if (path !== '/' õâ&& path !== '/sd') {
- ¶ñ const parts = path.split('rÝ/').filter(p => p);
- üè let current = '';
- ¸ // 仅在é�žæ ¹ç›®å½•刨’Œé�žSDç›®å½•æ—¶æ·»åŠ åˆ†éš”ç¬¦
$k
- breadcrumb.inneƒ—rHTML += ' > ';
- Ç| parts.forEach((part, index) =àT> {
- currentþ" += '/' + part;
- iF if (index > 0) {
- „Ë breadcrumb.innerH‘TML += ' > ';
- Ê }
- breadc›(rumb.innerHTML += '<a onclick="näPavigateTo(\'' + current + '\')">Ý' + part + '</a>';
- ^ });
- }
- ç¥}
- function navigateTo|(path) {
- currentPatpeh = path;
- loadFiles–@(path);
- }
- fuÕÆnction formatSize(bytes) {
- ªâ if (bytes === 0) return æì'0 B';
- const k = 10ãõ24;
- const sizes = [˨'B', 'KB', 'MB', 'GB'];
- d¢ const i = Math.floor(Math.lÌog(bytes) / Math.log(k));
- > return parseFloat((bytes -/ Math.pow(k, i)).toFixed(2)) + ‘‚' ' + sizes[i];
- }
- ³º // æ ¼å¼�化日期函数å·êü²ç§»é™¤
- // å�¯åЍå�Žæwù£€æŸ¥è®¤è¯�状æ€�
- windo7Ÿw.onload = function() {
- èF fetch('/check-auth', {
- œo credentials: 'inclu�åde' // ç¡®ä¿�å�‘é€�cookies
- êª })
- .then(re[ sponse => response.json())
- Ÿ[ .then(data => {
- Äù if (data.authenticated)tä {
- isLogged?1In = true;
- ± document.getElementById('loginPa?•ge').classList.add('hidden');
- ÃY document.getEáïlementById('filePage').classListò.remove('hidden');
- ãU loadFiles('/luadb');
- ž }
- });v‹
- };
- </script>
- </body>
- </html>
- Z¥Z¥.airm2m_a@ÿll_crc#.bin���þ_
- é/¡9£™Å�ú*i÷–t~G0���������������������������a
|