新增待办信息
This commit is contained in:
@@ -2,6 +2,7 @@ package com.jeesite.modules.app.utils;
|
|||||||
|
|
||||||
import java.nio.file.*;
|
import java.nio.file.*;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public class MyFileUtils {
|
public class MyFileUtils {
|
||||||
|
|
||||||
@@ -47,6 +48,38 @@ public class MyFileUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getFileName(String fileName){
|
||||||
|
if (Objects.isNull(fileName) || fileName.trim().isEmpty()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String pureFileName = fileName;
|
||||||
|
int lastSeparatorIndex = fileName.lastIndexOf(System.getProperty("file.separator"));
|
||||||
|
if (lastSeparatorIndex != -1) {
|
||||||
|
pureFileName = fileName.substring(lastSeparatorIndex + 1);
|
||||||
|
}
|
||||||
|
int lastDotIndex = pureFileName.lastIndexOf('.');
|
||||||
|
if (lastDotIndex <= 0) {
|
||||||
|
return pureFileName;
|
||||||
|
}
|
||||||
|
return pureFileName.substring(0, lastDotIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getFileName(String fileName,String ext){
|
||||||
|
String baseName = Objects.isNull(fileName) ? "" : fileName.trim();
|
||||||
|
if (Objects.isNull(ext) || ext.trim().isEmpty()) {
|
||||||
|
return baseName;
|
||||||
|
}
|
||||||
|
String standardExt = ext.trim();
|
||||||
|
if (standardExt.startsWith(".")) {
|
||||||
|
standardExt = standardExt.substring(1);
|
||||||
|
}
|
||||||
|
if (standardExt.isEmpty()) {
|
||||||
|
return baseName;
|
||||||
|
}
|
||||||
|
return baseName + "." + standardExt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getIcon(String ext) {
|
public static String getIcon(String ext) {
|
||||||
switch (ext) {
|
switch (ext) {
|
||||||
case "doc", "docx":
|
case "doc", "docx":
|
||||||
|
|||||||
@@ -49,7 +49,12 @@ import java.io.Serial;
|
|||||||
@Column(name = "is_delete", attrName = "isDelete", label = "是否删除", isUpdateForce = true),
|
@Column(name = "is_delete", attrName = "isDelete", label = "是否删除", isUpdateForce = true),
|
||||||
@Column(name = "update_time", attrName = "updateTime", label = "更新时间", isQuery = false, isUpdateForce = true),
|
@Column(name = "update_time", attrName = "updateTime", label = "更新时间", isQuery = false, isUpdateForce = true),
|
||||||
@Column(name = "svg_icon", attrName = "svgIcon", label = "文件夹标识"),
|
@Column(name = "svg_icon", attrName = "svgIcon", label = "文件夹标识"),
|
||||||
|
}, joinTable = {
|
||||||
|
@JoinTable(type = Type.LEFT_JOIN, entity = BizFolders.class, attrName = "this", alias = "b",
|
||||||
|
on = "a.folder_id = b.folder_id",
|
||||||
|
columns = {
|
||||||
|
@Column(name = "folder_name", attrName = "folderName", label = "文件夹名称"),
|
||||||
|
}),
|
||||||
}, orderBy = "a.create_time DESC"
|
}, orderBy = "a.create_time DESC"
|
||||||
)
|
)
|
||||||
@Data
|
@Data
|
||||||
@@ -75,6 +80,8 @@ public class BizMyfiles extends DataEntity<BizMyfiles> implements Serializable {
|
|||||||
private Date updateTime; // 更新时间
|
private Date updateTime; // 更新时间
|
||||||
private String svgIcon; //文件图标
|
private String svgIcon; //文件图标
|
||||||
|
|
||||||
|
private String folderName;
|
||||||
|
|
||||||
@ExcelFields({
|
@ExcelFields({
|
||||||
@ExcelField(title = "记录时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"),
|
@ExcelField(title = "记录时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"),
|
||||||
@ExcelField(title = "文件标识", attrName = "id", align = Align.CENTER, sort = 20),
|
@ExcelField(title = "文件标识", attrName = "id", align = Align.CENTER, sort = 20),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.jeesite.modules.app.utils.FileDownloadUtils;
|
|||||||
import com.jeesite.modules.app.utils.MyFileUtils;
|
import com.jeesite.modules.app.utils.MyFileUtils;
|
||||||
import com.jeesite.modules.app.utils.vId;
|
import com.jeesite.modules.app.utils.vId;
|
||||||
import com.jeesite.modules.biz.entity.BizMailAttachments;
|
import com.jeesite.modules.biz.entity.BizMailAttachments;
|
||||||
|
import com.jeesite.modules.file.entity.FileEntity;
|
||||||
import com.jeesite.modules.file.entity.FileUpload;
|
import com.jeesite.modules.file.entity.FileUpload;
|
||||||
import com.jeesite.modules.file.utils.FileUploadUtils;
|
import com.jeesite.modules.file.utils.FileUploadUtils;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
@@ -99,7 +100,7 @@ public class BizMyfilesController extends BaseController {
|
|||||||
for (FileUpload fileUpload : fileList) {
|
for (FileUpload fileUpload : fileList) {
|
||||||
bizMyfiles.setCreateTime(new Date());
|
bizMyfiles.setCreateTime(new Date());
|
||||||
bizMyfiles.setId(vId.getCid());
|
bizMyfiles.setId(vId.getCid());
|
||||||
bizMyfiles.setFileName(fileUpload.getFileName());
|
bizMyfiles.setFileName(MyFileUtils.getFileName(fileUpload.getFileName()));
|
||||||
bizMyfiles.setFilePath(FILE_PATH + fileUpload.getFileUrl());
|
bizMyfiles.setFilePath(FILE_PATH + fileUpload.getFileUrl());
|
||||||
bizMyfiles.setFileHash(fileUpload.getFileEntity().getFileMd5());
|
bizMyfiles.setFileHash(fileUpload.getFileEntity().getFileMd5());
|
||||||
bizMyfiles.setFileSize(MyFileUtils.formatFileSize(fileUpload.getFileEntity().getFileSize(), 2));
|
bizMyfiles.setFileSize(MyFileUtils.formatFileSize(fileUpload.getFileEntity().getFileSize(), 2));
|
||||||
@@ -107,7 +108,6 @@ public class BizMyfilesController extends BaseController {
|
|||||||
bizMyfiles.setMimeType(fileUpload.getFileEntity().getFileContentType());
|
bizMyfiles.setMimeType(fileUpload.getFileEntity().getFileContentType());
|
||||||
bizMyfiles.setSvgIcon(MyFileUtils.getIcon(fileUpload.getFileEntity().getFileExtension()));
|
bizMyfiles.setSvgIcon(MyFileUtils.getIcon(fileUpload.getFileEntity().getFileExtension()));
|
||||||
bizMyfilesService.save(bizMyfiles);
|
bizMyfilesService.save(bizMyfiles);
|
||||||
FileUploadUtils.deleteFileUpload(fileUpload.getId());
|
|
||||||
}
|
}
|
||||||
return renderResult(Global.TRUE, text("保存文件信息成功!"));
|
return renderResult(Global.TRUE, text("保存文件信息成功!"));
|
||||||
}
|
}
|
||||||
@@ -115,9 +115,7 @@ public class BizMyfilesController extends BaseController {
|
|||||||
@PostMapping(value = "edit")
|
@PostMapping(value = "edit")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String edit(@Validated BizMyfiles bizMyfiles) {
|
public String edit(@Validated BizMyfiles bizMyfiles) {
|
||||||
BizMyfiles myfiles = bizMyfilesService.get(bizMyfiles.getId());
|
bizMyfilesService.update(bizMyfiles);
|
||||||
myfiles.setFileName(bizMyfiles.getFileName() + "." + myfiles.getFileExt());
|
|
||||||
bizMyfilesService.update(myfiles);
|
|
||||||
return renderResult(Global.TRUE, text("修改文件名称成功!"));
|
return renderResult(Global.TRUE, text("修改文件名称成功!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +179,7 @@ public class BizMyfilesController extends BaseController {
|
|||||||
public void downloadFile(BizMyfiles bizMyfiles, HttpServletResponse response) {
|
public void downloadFile(BizMyfiles bizMyfiles, HttpServletResponse response) {
|
||||||
try {
|
try {
|
||||||
BizMyfiles myfiles = bizMyfilesService.get(bizMyfiles);
|
BizMyfiles myfiles = bizMyfilesService.get(bizMyfiles);
|
||||||
FileDownloadUtils.downloadFile(myfiles.getFilePath(), myfiles.getFileName(), response);
|
FileDownloadUtils.downloadFile(myfiles.getFilePath(), MyFileUtils.getFileName(myfiles.getFileName(), myfiles.getFileExt()), response);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.out.print(e.getMessage());
|
System.out.print(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -343,7 +343,6 @@
|
|||||||
<a-button type="primary" class="header-btn" @click="openUploadModal(true, ParamsFolders)" :disabled="UploadFile"><Icon icon="ant-design:cloud-upload-outlined" />上传文件</a-button>
|
<a-button type="primary" class="header-btn" @click="openUploadModal(true, ParamsFolders)" :disabled="UploadFile"><Icon icon="ant-design:cloud-upload-outlined" />上传文件</a-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="file-list-wrapper">
|
<div class="file-list-wrapper">
|
||||||
<div class="file-list">
|
<div class="file-list">
|
||||||
<Card
|
<Card
|
||||||
@@ -356,7 +355,6 @@
|
|||||||
<div class="file-card-header">
|
<div class="file-card-header">
|
||||||
<div class="file-name-wrap">
|
<div class="file-name-wrap">
|
||||||
<span class="file-card-icon"><Icon :icon="file.svgIcon" size="24" /></span>
|
<span class="file-card-icon"><Icon :icon="file.svgIcon" size="24" /></span>
|
||||||
<!-- 新增:文件编辑输入框切换逻辑 -->
|
|
||||||
<template v-if="editingInfo.id === file.id && editingInfo.type === 'file'">
|
<template v-if="editingInfo.id === file.id && editingInfo.type === 'file'">
|
||||||
<a-input
|
<a-input
|
||||||
:ref="el => fileEditInputRef[file.id] = el"
|
:ref="el => fileEditInputRef[file.id] = el"
|
||||||
@@ -380,8 +378,17 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="card-divider"></div>
|
<div class="card-divider"></div>
|
||||||
<div class="file-card-actions">
|
<div class="file-card-actions">
|
||||||
<a-button type="link" size="small" @click="downloadFiles(file)" ><Icon icon="ant-design:cloud-download-outlined"/></a-button>
|
<span class="folder-name-label" :title="file.folderName">
|
||||||
<a-button type="link" size="small" @click="deleteFiles(file)" danger><Icon icon="ant-design:delete-filled"/></a-button>
|
{{ file.folderName }}
|
||||||
|
</span>
|
||||||
|
<div class="action-buttons">
|
||||||
|
<a-button type="link" size="small" @click="downloadFiles(file)" >
|
||||||
|
<Icon icon="ant-design:cloud-download-outlined"/>
|
||||||
|
</a-button>
|
||||||
|
<a-button type="link" size="small" @click="deleteFiles(file)" danger>
|
||||||
|
<Icon icon="ant-design:delete-filled"/>
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
@@ -856,11 +863,12 @@ const handleDeleteFolder = async (folder: FolderNode) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Modal.confirm({
|
Modal.confirm({
|
||||||
title: '删除确认',
|
title: '温馨提示',
|
||||||
content: '您确定要删除当前文件夹吗?',
|
content: '您确定要删除当前目录吗?',
|
||||||
okText: '确认删除',
|
okText: '确认',
|
||||||
cancelText: '取消',
|
cancelText: '取消',
|
||||||
okType: 'danger',
|
okType: 'danger',
|
||||||
|
width: 420,
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const res = await bizFoldersDelete({ folderId: folder.id });
|
const res = await bizFoldersDelete({ folderId: folder.id });
|
||||||
@@ -872,9 +880,12 @@ const handleDeleteFolder = async (folder: FolderNode) => {
|
|||||||
fileList.value = [];
|
fileList.value = [];
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('删除文件夹失败:', error);
|
console.error('删除目录失败:', error);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
onCancel: () => {
|
||||||
|
message.info('已取消删除操作');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1034,10 +1045,11 @@ async function downloadFiles(myFiles: BizMyfiles) {
|
|||||||
async function deleteFiles(myFiles: BizMyfiles) {
|
async function deleteFiles(myFiles: BizMyfiles) {
|
||||||
Modal.confirm({
|
Modal.confirm({
|
||||||
title: '温馨提示',
|
title: '温馨提示',
|
||||||
content: '您确认删除当前文件吗?',
|
content: '您确认要删除当前文件吗?',
|
||||||
okText: '确认',
|
okText: '确认',
|
||||||
cancelText: '取消',
|
cancelText: '取消',
|
||||||
okType: 'danger',
|
okType: 'danger',
|
||||||
|
width: 420,
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const params = {
|
const params = {
|
||||||
@@ -1489,12 +1501,34 @@ onMounted(() => {
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 优化:重写file-card-actions样式 */
|
||||||
.file-card-actions {
|
.file-card-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 4px;
|
align-items: center;
|
||||||
|
justify-content: space-between; /* 左右分布 */
|
||||||
|
gap: 8px;
|
||||||
margin-top: auto;
|
margin-top: auto;
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
justify-content: flex-end;
|
padding: 0 4px;
|
||||||
|
width: 100%;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* folderName标签样式 */
|
||||||
|
.folder-name-label {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #668799;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
flex: 1;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 操作按钮容器 */
|
||||||
|
.action-buttons {
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1555,7 +1589,7 @@ onMounted(() => {
|
|||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.file-list {
|
.file-list {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: repeat(2, 1fr);
|
||||||
}
|
}
|
||||||
.sidebar {
|
.sidebar {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
@@ -1571,6 +1605,9 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 480px) {
|
@media (max-width: 480px) {
|
||||||
|
.file-list {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
.file-manager-container {
|
.file-manager-container {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: auto;
|
height: auto;
|
||||||
|
|||||||
Reference in New Issue
Block a user