$(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;
}
}
});