update to v1.2.0 进一步优化了“文件”功能

This commit is contained in:
kohgylw 2023-12-29 14:20:44 +08:00
parent 5efffe09e8
commit a7d0d72b82
14 changed files with 75 additions and 26 deletions

View File

@ -1,4 +1,4 @@
kiftd项目 计划表-2023-12-23 by 青阳龙野
kiftd项目 计划表-2023-12-29 by 青阳龙野
已完成 v1.0.17
--------------
@ -210,6 +210,8 @@ test.auth.xxx=ucd
【待实现】完善移动“m”权限的安全性当仅有“m”权限时用户可执行“复制”操作若同时具备删除“d”权限才可以进行“剪切”操作。
注:这是为了防止使用者先将某个文件从一个原本不具备删除权限的文件夹内移动的一个具备删除权限的文件夹内再将其删除的恶意操作。
【已完成】新增文件夹体积计算功能:当访问者打开文件夹的“详细信息...”模态框时,系统将实时统计该文件夹的内容总体积,之后将结果显示在该界面上供用户查看。
【已完成】进一步优化了“文件”功能:在图形界面下,可以通过点击表头对文件列表进行排序;此外还修复了几处执行文件导入导出操作时可能导致死锁的问题。
【已完成】进一步优化了图形界面下的“文件”功能:现在可以通过点击表头对文件列表进行排序了。
【已完成】进一步优化了图形界面下的“文件”功能:现在双击文件列表中的文件可以快速预览它了。
【已完成】修复了几处在执行文件导入导出操作时可能导致死锁的问题。
【待实现】新增导入账户设置:当执行“导入”操作时,可以使用指定账户来为它们设置“创建者”。
【待实现】优化剪切复制操作:如果执行粘贴时已剪切或复制的文件不再存在,那么在提示后自动清除剪切或复制的文件记录,将剪切或复制显示恢复到初始状态。

View File

@ -1,5 +1,6 @@
package kohgylw.kiftd.server.util;
import org.apache.commons.io.FileUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.*;
@ -62,8 +63,13 @@ public class FileBlockUtil {
Iterator<Path> listFiles = Files.newDirectoryStream(f.toPath()).iterator();
while (listFiles.hasNext()) {
File tempFile = listFiles.next().toFile();
if (!tempFile.getName().startsWith(".")) {
tempFile.delete();
if (tempFile.isFile()) {
if (!tempFile.getName().startsWith(".")) {
tempFile.delete();
}
}
if (tempFile.isDirectory()) {
FileUtils.deleteDirectory(tempFile);
}
}
} catch (IOException e) {

View File

@ -2,6 +2,7 @@ package kohgylw.kiftd.ui.module;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
@ -25,13 +26,14 @@ import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import kohgylw.kiftd.printer.Printer;
import kohgylw.kiftd.server.exception.FilesTotalOutOfLimitException;
import kohgylw.kiftd.server.exception.FoldersTotalOutOfLimitException;
import kohgylw.kiftd.server.model.Node;
import kohgylw.kiftd.server.util.ConfigureReader;
import kohgylw.kiftd.server.util.FileNodeUtil;
import kohgylw.kiftd.ui.util.FilesTable;
import kohgylw.kiftd.util.file_system_manager.FileSystemManager;
@ -265,7 +267,7 @@ public class FSViewer extends KiftdDynamicWindow {
}
}
});
// 文件列表的双击监听进入文件夹
// 文件列表的双击监听进入文件夹或快速预览文件
filesTable.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
@ -287,12 +289,54 @@ public class FSViewer extends KiftdDynamicWindow {
public void mouseClicked(MouseEvent e) {
disableAllButtons();
worker.execute(() -> {
Folder f = filesTable.getDoubleClickFolder(e);
if (f != null) {
try {
getFolderView(f.getFolderId());
} catch (Exception e1) {
Printer.instance.print(e.toString());
Object i = filesTable.getDoubleClickItem(e);
if (i != null) {
if (i instanceof Folder) {
// 如果双击文件夹则进入此文件夹
Folder f = (Folder) i;
try {
getFolderView(f.getFolderId());
} catch (Exception e1) {
Printer.instance.print(e.toString());
}
} else if (i instanceof Node) {
// 如果双击文件则将文件导出并打开
if (Desktop.isDesktopSupported()) {
// 如果支持本地桌面操作则继续
Node n = (Node) i;
String tempDir = ConfigureReader.instance().getTemporaryfilePath();
// 为要预留的文件创建一个唯一的文件夹
File previewDir = new File(tempDir, "preview_" + n.getFileId());
if (previewDir.isDirectory() || previewDir.mkdir()) {
// 如果有旧文件存留则先清理
File pfOld = new File(previewDir, n.getFileName());
if (!pfOld.isFile() || pfOld.delete()) {
// 将要预览的文件导出至此文件夹内
FSProgressDialog fsd = FSProgressDialog.getNewInstance();
Thread t = new Thread(() -> {
fsd.show();
});
t.start();
try {
boolean exportSuccess = FileSystemManager.getInstance().exportTo(
new String[0], new String[] { n.getFileId() }, previewDir, null);
fsd.close();
if (exportSuccess) {
// 如果导出成功将此文件设置为只读并以系统默认方式打开
File pf = new File(previewDir, n.getFileName());
if (pf.isFile() && pf.setReadOnly()) {
Desktop.getDesktop().open(pf);
}
}
} catch (Exception e1) {
fsd.close();
Printer.instance.print(e1.toString());
JOptionPane.showMessageDialog(window, "导出文件时失败,该操作已被中断,未能全部导出。", "错误",
JOptionPane.ERROR_MESSAGE);
}
}
}
}
}
}
enableAllButtons();
@ -321,14 +365,8 @@ public class FSViewer extends KiftdDynamicWindow {
enableAllButtons();
});
} catch (Exception e) {
Runnable refreshThread = new Runnable() {
@Override
public void run() {
refresh();
}
};
SwingUtilities.invokeLater(refreshThread);
Printer.instance.print(e.toString());
refresh();
}
}
}

View File

@ -285,21 +285,24 @@ public class FilesTable extends JTable {
/**
*
* <h2>获取被双击的文件夹</h2>
* <h2>获取被双击的项目</h2>
* <p>
* 该功能用于进入某一文件夹如果双击的是文件夹则返回其对象否则返回null
* 该功能用于获取被双击的元素可能是文件夹也可能是文件
* </p>
*
* @author 青阳龙野(kohgylw)
* @param e java.awt.event.MouseEvent 鼠标事件
* @return kohgylw.kiftd.util.file_system_manager.pojo.Folder 被双击的文件夹
* @param e awt鼠标事件
* @return Object 被双击的项目如果是文件夹则返回Folder对象如果是文件则返回Node对象如果非双击操作则返回null
*/
public Folder getDoubleClickFolder(MouseEvent e) {
public Object getDoubleClickItem(MouseEvent e) {
if (e.getClickCount() == 2) {
int row = rowAtPoint(e.getPoint());
if (row >= 0 && row < folders.size()) {
return folders.get(row);
}
if (row >= folders.size() && row < folders.size() + files.size()) {
return files.get(row - folders.size());
}
}
return null;
}

View File

@ -1,5 +1,5 @@
#Generated by Maven Integration for Eclipse
#Tue Dec 26 15:14:32 CST 2023
#Fri Dec 29 14:14:55 CST 2023
m2e.projectLocation=/Users/kohgylw/Programs/java_workspace/kiftd
m2e.projectName=kiftd
groupId=kohgylw