$(document).ready(async function () { var apiBase = window.location.origin + '/seeyon/rest/fileUpload'; var rootFolders = []; var activeFolder = null; var currentFilePage = 1; var filePageSize = 10; var searchKeyword = null; // ========== 初始化:获取bizId → 获取folderId → 加载文件列表 ========== try { // 从URL参数或window对象获取bizId var urlParams = new URLSearchParams(window.location.search); var bizId = urlParams.get('bizId') || window._bizId || ''; // 缓存folderId var cachedFolderId = ''; // 如果有bizId,调接口获取folderId if (bizId) { cachedFolderId = await fetchFolderIdByBizId(bizId) || ''; } // 如果没有通过bizId获取到,尝试用URL中的folderId if (!cachedFolderId) { cachedFolderId = urlParams.get('folderId') || ''; } // 存储到全局变量供上传和OK()使用 window._currentFolderId = cachedFolderId; window._bizId = bizId; window._uploadedFiles = []; // 缓存本次上传成功的文件信息 // 加载文件列表 if (cachedFolderId) { activeFolder = { id: cachedFolderId, name: '指定文件夹' }; var files = await fetchFiles(cachedFolderId); renderFileList(files); } } catch (e) { console.error('初始化失败:', e); $('#file-list').html('
加载文件夹失败
'); } /** * 通过业务ID调后端接口获取网盘文件夹ID * @param {string} bizId - 业务ID(资产编号) * @returns {Promise} folderId */ async function fetchFolderIdByBizId(bizId) { if (!bizId) return null; try { var res = await $.ajax({ url: apiBase + '/folder/by-bizid?bizId=' + encodeURIComponent(bizId), type: 'GET', dataType: 'json' }); if (res.code === 0 && res.data) { var folderId = res.data.folderId || res.data.id || ''; console.log('[fileUploadBiz] 获取folderId:', folderId, 'bizId:', bizId); return folderId; } } catch (e) { console.error('[fileUploadBiz] 获取folderId失败:', e); } return null; } // ========== API 调用 ========== async function fetchFolders(folderId) { var res = await $.ajax({ url: apiBase + '/folder/children?folderId=' + folderId, type: 'GET', dataType: 'json' }); if (res.code === 0 && res.data) { return res.data.folders || []; } return []; } async function fetchFiles(folderId, pageNum, pageSize) { var res = await $.ajax({ url: apiBase + '/folder/children?folderId=' + folderId, type: 'GET', dataType: 'json' }); if (res.code === 0 && res.data) { return res.data.files || []; } return []; } async function searchFiles(keyword) { var res = await $.ajax({ url: apiBase + '/file/search?keyword=' + encodeURIComponent(keyword), type: 'GET', dataType: 'json' }); if (res.code === 0 && res.data) { return Array.isArray(res.data) ? res.data : (res.data.files || []); } return []; } // ========== 左侧文件夹树 ========== function renderSidebar() { var sidebar = $('#sideBar'); sidebar.empty(); rootFolders.forEach(function (folder) { var categoryEl = $( '
' + '
' + (folder.name || '文件夹') + '
' + '
' + '
' ); var folderList = categoryEl.find('.folder-list'); categoryEl.find('.category-title').click(async function () { if (!folder.loaded) { var subFolders = await fetchFolders(folder.id); subFolders.forEach(function (sub) { renderFolder(sub, folderList); }); folder.loaded = true; } folderList.slideToggle(); var icon = categoryEl.find('.icon'); icon.text(icon.text() === '▶' ? '▼' : '▶'); }); sidebar.append(categoryEl); }); } function renderFolder(node, container) { var subFolderList = $('
'); var paginationControls = $('
'); var page = 1; var pageSize = 10; var hasMore = true; var folderItem = $( '
' + (node.name || '文件夹') + '
' ); folderItem.click(async function (e) { e.stopPropagation(); activeFolder = node; // 高亮当前选中文件夹 $('.folder-item').removeClass('active'); folderItem.addClass('active'); subFolderList.toggle(); if (subFolderList.is(':visible') && !node.loaded) { await loadSubFolderPage(); node.loaded = true; } // 加载文件列表 var files = await fetchFiles(node.id); renderFileList(files); var icon = folderItem.find('.icon'); icon.text(icon.text() === '▶' ? '▼' : '▶'); }); async function loadSubFolderPage() { var subFolders = await fetchFolders(node.id); subFolderList.empty(); subFolders.forEach(function (sub) { renderFolder(sub, subFolderList); }); hasMore = false; // 简化:不分页子文件夹 renderFolderPagination(); } function renderFolderPagination() { paginationControls.empty(); var prevBtn = $(''); var nextBtn = $(''); var pageInfo = $('第 ' + page + ' 页'); prevBtn.prop('disabled', page === 1); nextBtn.prop('disabled', !hasMore); prevBtn.click(async function () { if (page > 1) { page--; await loadSubFolderPage(); } }); nextBtn.click(async function () { if (hasMore) { page++; await loadSubFolderPage(); } }); paginationControls.append(prevBtn, pageInfo, nextBtn); subFolderList.append(paginationControls); } container.append(folderItem); container.append(subFolderList); } // ========== 右侧文件列表 ========== function renderFileList(files) { var container = $('#file-list'); container.empty(); if (!files || files.length === 0) { container.html('
此文件夹为空
'); return; } files.forEach(function (f) { var ext = (f.extension || f.name.split('.').pop() || '').toUpperCase(); var isImage = /^(JPG|JPEG|PNG|GIF|BMP|WEBP|SVG|ICO)$/.test(ext); var isVideo = /^(MP4|AVI|MOV|WMV|FLV|MKV|WEBM)$/.test(ext); var previewUrl = f.previewUrl || f.preview_url || f.downloadUrl || f.download_url || ''; var thumbHtml = ''; if (isImage && previewUrl) { thumbHtml = '
'; } else if (isVideo) { thumbHtml = '
' + ext.substring(0, 4) + '
'; } else { thumbHtml = '
' + ext.substring(0, 4) + '
'; } var fileItem = $( '
' + '' + thumbHtml + '
' + '
' + (f.name || '文件') + '
' + '
' + formatSize(f.size) + '
' + '
' ); // 点击整行切换勾选 fileItem.click(function (e) { if (e.target.type !== 'checkbox') { var cb = $(this).find('input[type="checkbox"]'); cb.prop('checked', !cb.prop('checked')); } $(this).toggleClass('selected', $(this).find('input[type="checkbox"]').prop('checked')); }); container.append(fileItem); }); } function formatSize(bytes) { if (!bytes) return ''; bytes = parseInt(bytes); if (bytes < 1024) return bytes + ' B'; if (bytes < 1048576) return (bytes / 1024).toFixed(1) + ' KB'; if (bytes < 1073741824) return (bytes / 1048576).toFixed(1) + ' MB'; return (bytes / 1073741824).toFixed(1) + ' GB'; } // ========== 搜索 ========== $('#searchBtn').click(async function () { searchKeyword = $('#search').val().trim(); if (!searchKeyword) { // 清空搜索,重新加载当前文件夹 if (activeFolder) { var files = await fetchFiles(activeFolder.id); renderFileList(files); } return; } var files = await searchFiles(searchKeyword); renderFileList(files); }); $('#search').keyup(function (e) { if (e.key === 'Enter') $('#searchBtn').click(); }); // ========== 上传文件 ========== $('#uploadBtn').click(function () { var input = document.createElement('input'); input.type = 'file'; input.multiple = true; input.style.display = 'none'; input.addEventListener('change', async function () { var fileArr = Array.from(input.files); if (fileArr.length === 0) return; var folderId = window._currentFolderId || 0; for (var i = 0; i < fileArr.length; i++) { await uploadFile(fileArr[i], folderId); } // 上传完成后刷新文件列表(不刷新页面,保留缓存数据) var files = await fetchFiles(folderId); renderFileList(files); // 自动勾选刚上传的文件 window._uploadedFiles.forEach(function (uf) { var cb = document.querySelector('#file-list input[data-filekey="' + uf.fileKey + '"]'); if (cb && !cb.checked) { cb.checked = true; cb.closest('.file-item').classList.add('selected'); } }); input.remove(); }); document.body.appendChild(input); input.click(); }); async function uploadFile(file, folderId) { var formData = new FormData(); formData.append('file', file); formData.append('folderId', folderId || 0); formData.append('fileName', file.name); try { var res = await $.ajax({ url: apiBase + '/upload', type: 'POST', data: formData, processData: false, contentType: false }); if (res.code !== 0) { alert('上传失败:' + (res.message || '未知错误')); return false; } // 缓存上传成功的文件信息供OK()返回 if (res.data) { window._uploadedFiles.push({ fileKey: res.data.id || '', fileName: res.data.name || file.name }); } return true; } catch (e) { alert('上传失败:网络错误'); return false; } } });