Commit a3f0b7c6 authored by chenshouchao's avatar chenshouchao

feat : 完成项目列表 新建文件夹联调

parent 7af8ea32
...@@ -16,91 +16,116 @@ let headers: any = { ...@@ -16,91 +16,116 @@ let headers: any = {
}; };
class CloudEController { class CloudEController {
// 新建文件夹
static JobFileNewFolder(url: any, filetoken: string, projectId: string) {
if (ApiUtils.getAuthorizationHeaders(headers)) {
url = url += urlToken(filetoken, projectId);
headers["Content-Type"] = "multipart/form-data";
return axios.post(
APIOPTION() + "/createdir" + url,
{},
{
headers: headers,
}
);
}
}
//文件 删除 //文件 删除
static JobOutFileDel(urls: any,filetoken: string) { static JobOutFileDel(urls: any, filetoken: string, projectId: string) {
if ( if (ApiUtils.getAuthorizationHeaders(headers)) {
ApiUtils.getAuthorizationHeaders(headers)
) {
headers["Cache-Control"] = "no-cache"; headers["Cache-Control"] = "no-cache";
headers["delfilepath"] = Base64.stringify(Utf8.parse(urls)); headers["delfilepath"] = Base64.stringify(Utf8.parse(urls));
let url = ""; let url = "";
if (getLoaclStorageOfKey("userinfo")) { if (getLoaclStorageOfKey("userinfo")) {
url += urlToken(filetoken); url += urlToken(filetoken, projectId);
} }
axios axios
.get(APIOPTION() + "/delete/" + url, { .get(APIOPTION() + "/delete/" + url, {
headers: headers, headers: headers,
}) })
.then(function (response) { .then(function (response) {
console.log(response) console.log(response);
}) })
.catch(function (error) { .catch(function (error) {
console.log(error) console.log(error);
}); });
} }
} }
// 文件列表 // 文件列表
static JobOutFileList( static JobOutFileList(
url: any, url: any,
showHide = false,
filetoken: string, filetoken: string,
projectId: string,
showHide = false,
items?: any items?: any
) { ) {
if (ApiUtils.getAuthorizationHeaders(headers)) { if (ApiUtils.getAuthorizationHeaders(headers)) {
headers["Cache-Control"] = "no-cache"; headers["Cache-Control"] = "no-cache";
// headers['parentName'] = '' // headers['parentName'] = ''
if (getLoaclStorageOfKey("userinfo")) { if (getLoaclStorageOfKey("userinfo")) {
url += urlToken(filetoken); url += urlToken(filetoken, projectId);
} }
axios return axios.get(
// 查看文件的接口为list(可查看隐藏文件) APIOPTION() + "/list" + url + "&showhidden=" + showHide,
.get(APIOPTION() + "/list" + url + "&showhidden=" + showHide, { {
headers: headers, headers: headers,
}) }
.then(function (response) { );
console.log(response); // axios
}) // // 查看文件的接口为list(可查看隐藏文件)
.catch(function (error) { // .get(APIOPTION() + "/list" + url + "&showhidden=" + showHide, {
console.log(error); // headers: headers,
}); // })
// .then(function (response) {
// console.log(response);
// })
// .catch(function (error) {
// console.log(error);
// });
} }
} }
// 文件移动 // 文件移动
static JobOutFileListMove(url: any, filetoken: string) { static JobOutFileListMove(url: any, filetoken: string, projectId: string) {
if ( if (ApiUtils.getAuthorizationHeaders(headers)) {
ApiUtils.getAuthorizationHeaders(headers)
) {
headers["Cache-Control"] = "no-cache"; headers["Cache-Control"] = "no-cache";
if (getLoaclStorageOfKey("userinfo")) { if (getLoaclStorageOfKey("userinfo")) {
url += urlToken(filetoken); url += urlToken(filetoken, projectId);
} }
axios return axios.get(APIOPTION() + "/download" + url, {
.get(APIOPTION() + "/download" + url, { headers: headers,
headers: headers, });
})
.then(function (response) { // axios
console.log(response) // .get(APIOPTION() + "/download" + url, {
}) // headers: headers,
.catch(function (error) { // })
console.log(error); // .then(function (response) {
}); // console.log(response);
// })
// .catch(function (error) {
// console.log(error);
// });
} }
} }
// // 全局搜索 文件名 // // 全局搜索 文件名
static JobSearchFileList(url: any, base: any, showHide = false, filetoken: string) { static JobSearchFileList(
if ( url: any,
ApiUtils.getAuthorizationHeaders(headers) base: any,
) { filetoken: string,
projectId: string,
showHide = false
) {
if (ApiUtils.getAuthorizationHeaders(headers)) {
headers["Cache-Control"] = "no-cache"; headers["Cache-Control"] = "no-cache";
if (getLoaclStorageOfKey("userinfo")) { if (getLoaclStorageOfKey("userinfo")) {
url = urlToken(filetoken) + "&q=" + url; url = urlToken(filetoken, projectId) + "&q=" + url;
} }
axios axios
.get(APIOPTION() + "/search" + base + url + "&showhidden=" + showHide, { .get(APIOPTION() + "/search" + base + url + "&showhidden=" + showHide, {
headers: headers, headers: headers,
}) })
.then(function (response) { .then(function (response) {
console.log(response) console.log(response);
}) })
.catch(function (error) { .catch(function (error) {
console.log(error); console.log(error);
...@@ -109,23 +134,29 @@ class CloudEController { ...@@ -109,23 +134,29 @@ class CloudEController {
} }
// 文件移动 // 文件移动
static JobFileMove(url: any, original_filepath: any, value: any, filetoken: string) { static JobFileMove(
url: any,
original_filepath: any,
value: any,
filetoken: string,
projectId: string
) {
if (ApiUtils.getAuthorizationHeaders(headers)) { if (ApiUtils.getAuthorizationHeaders(headers)) {
url = url += urlToken(filetoken) url = url += urlToken(filetoken, projectId);
headers['Content-Type'] = 'multipart/form-data'; headers["Content-Type"] = "multipart/form-data";
headers['originalfilepath'] = encodeURIComponent(original_filepath) headers["originalfilepath"] = encodeURIComponent(original_filepath);
let param = new FormData() let param = new FormData();
param.append('', value) param.append("", value);
axios axios
.post(APIOPTION() + '/rename' + url, param, { .post(APIOPTION() + "/rename" + url, param, {
headers: headers headers: headers,
})
.then(response => {
console.log(response)
}) })
.catch(error => { .then((response) => {
console.log(error) console.log(response);
}) })
.catch((error) => {
console.log(error);
});
} }
} }
} }
......
...@@ -103,33 +103,36 @@ const ZONEID = (params: string) => { ...@@ -103,33 +103,36 @@ const ZONEID = (params: string) => {
return currentRegion[params || "id"] || ""; return currentRegion[params || "id"] || "";
}; };
const urlToken = (filetoken: string, root?: string) => { const urlToken = (filetoken: string, projectId: string) => {
let token = getLoaclStorageOfKey("token_key").access_token; let token = getLoaclStorageOfKey("token_key").access_token;
let json = getLoaclStorageOfKey("current-region"); return `?username=${projectId}&token=${token}&filetoken=${encodeURIComponent(
const userInfo = getLoaclStorageOfKey("userinfo"); filetoken
if (json["location"] && json["location"] === "ON_PREMISE") { )}&share=false&project=true`;
return `?username=${ // let json = getLoaclStorageOfKey("current-region");
userInfo["name"] // const userInfo = getLoaclStorageOfKey("userinfo");
}&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=false`; // 之前的filetoken是: userInfo["shareFileAccessToken"] // if (json["location"] && json["location"] === "ON_PREMISE") {
} // return `?username=${
if (root && root === "home") { // userInfo["name"]
return `?username=${ // }&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=false`; // 之前的filetoken是: userInfo["shareFileAccessToken"]
userInfo["homeDirectoryMountPoint"] // }
}&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=false`; // if (root && root === "home") {
} // return `?username=${
// 是否共有文件系统 // userInfo["homeDirectoryMountPoint"]
if ( // }&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=false`;
localStorage.getItem("isShareFileSystem") && // }
localStorage.getItem("isShareFileSystem") === "true" // // 是否共有文件系统
) { // if (
return `?username=${ // localStorage.getItem("isShareFileSystem") &&
userInfo["shareDirectoryMountPoint"] // localStorage.getItem("isShareFileSystem") === "true"
}&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=true`; // ) {
} else { // return `?username=${
return `?username=${ // userInfo["shareDirectoryMountPoint"]
userInfo["homeDirectoryMountPoint"] // }&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=true`;
}&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=false`; // } else {
} // return `?username=${
// userInfo["homeDirectoryMountPoint"]
// }&token=${token}&filetoken=${encodeURIComponent(filetoken)}&share=false`;
// }
}; };
const getUuid = () => { const getUuid = () => {
......
...@@ -4,8 +4,10 @@ import { TextField } from "@mui/material"; ...@@ -4,8 +4,10 @@ import { TextField } from "@mui/material";
import MyDialog from "@/components/mui/MyDialog"; import MyDialog from "@/components/mui/MyDialog";
import { checkIsNumberLetterChinese } from "@/utils/util"; import { checkIsNumberLetterChinese } from "@/utils/util";
import { useMessage } from "@/components/MySnackbar"; import { useMessage } from "@/components/MySnackbar";
import CloudEController from "@/api/fileserver/CloudEController";
const AddFolder = (props: any) => { const AddFolder = (props: any) => {
const { list } = props; const { list, path, projectId, fileToken } = props;
const Message = useMessage(); const Message = useMessage();
let addFolderDialogRef: any = React.createRef(); let addFolderDialogRef: any = React.createRef();
...@@ -21,7 +23,18 @@ const AddFolder = (props: any) => { ...@@ -21,7 +23,18 @@ const AddFolder = (props: any) => {
const handleAddSubmit = () => { const handleAddSubmit = () => {
if (fileName && !fileNameCheck.error) { if (fileName && !fileNameCheck.error) {
const newFolderPath =
path === "/" ? `${path}${fileName}` : `${path}/${fileName}`;
// 请求接口 // 请求接口
CloudEController.JobFileNewFolder(
newFolderPath,
fileToken,
projectId
)?.then((res) => {
console.log(res);
Message.success("新建成功");
addFolderDialogRef.current.handleClose();
});
} else { } else {
Message.info(fileNameCheck.help || "请输入文件夹名称"); Message.info(fileNameCheck.help || "请输入文件夹名称");
} }
......
import React, { useState, useCallback, useEffect } from "react"; import React, { useState, useCallback, useEffect, useMemo } from "react";
import style from "./index.module.css"; import style from "./index.module.css";
import classnames from "classnames"; import classnames from "classnames";
...@@ -22,6 +22,7 @@ import useMyRequest from "@/hooks/useMyRequest"; ...@@ -22,6 +22,7 @@ import useMyRequest from "@/hooks/useMyRequest";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useStores } from "@/store"; import { useStores } from "@/store";
import CloudEController from "@/api/fileserver/CloudEController"; import CloudEController from "@/api/fileserver/CloudEController";
import { toJS } from "mobx";
// import TreeView from '@mui/lab/TreeView'; // import TreeView from '@mui/lab/TreeView';
// import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; // import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
// import ChevronRightIcon from '@mui/icons-material/ChevronRight'; // import ChevronRightIcon from '@mui/icons-material/ChevronRight';
...@@ -59,10 +60,18 @@ const ProjectData = observer(() => { ...@@ -59,10 +60,18 @@ const ProjectData = observer(() => {
const { currentProjectStore } = useStores(); const { currentProjectStore } = useStores();
// const [path, setPath] = useState("/ProjectData"); // const [path, setPath] = useState("/ProjectData");
const [path, setPath] = useState("/"); const [path, setPath] = useState("/");
const showPath = useMemo(() => {
if (path === "/") {
return "ProjectData";
}
return `ProjectData${path}`;
}, [path]);
const [activeTab, setActiveTab] = useState(1); const [activeTab, setActiveTab] = useState(1);
const [keyWord, setKeyWord] = useState(""); const [keyWord, setKeyWord] = useState("");
const [fileToken, setFileToken] = useState(""); const [fileToken, setFileToken] = useState("");
const [list, setList] = useState<any>([]);
const { run: getDataFileTokenRun } = useMyRequest(getDataFileToken, { const { run: getDataFileTokenRun } = useMyRequest(getDataFileToken, {
onSuccess: (res: any) => { onSuccess: (res: any) => {
console.log("res", res); console.log("res", res);
...@@ -70,17 +79,44 @@ const ProjectData = observer(() => { ...@@ -70,17 +79,44 @@ const ProjectData = observer(() => {
}, },
}); });
useEffect(() => { const projectId = useMemo(() => {
if (fileToken) { return toJS(currentProjectStore.currentProjectInfo.id);
CloudEController.JobOutFileList(path, false, fileToken); }, [currentProjectStore]);
// 老项目测试环境
// https://fileserver.cloudam.cn/list/?username=6c8928fa719940dc964cf17a029b36c5&token=d1b07aa2-0b29-48ca-ad28-bb41af3bcbb1&filetoken=%2FMm%2BLhFrOpEDp0neVeESSD%2F45aY%3D&share=false&showhidden=false // useEffect(() => {
// 新项目本地 // if (fileToken && projectId) {
// https://fileserver.cloudam.cn/list/?username=8e12a4fdde5549b0aa8b3051ff8c8f04&token=751cd163-fe95-45d0-8f7a-3d0d8b8bb442&filetoken=isZw%2B%2BzeJO3R34BEXTjmmovFOmA%3D&share=false&showhidden=false // CloudEController.JobOutFileList(path, fileToken, projectId, false)?.then(
// 老项目本地 // (res) => {
// https://fileserver.cloudam.cn/list/?username=6c8928fa719940dc964cf17a029b36c5&token=d1b07aa2-0b29-48ca-ad28-bb41af3bcbb1&filetoken=bUt%2Bn0YacgepFClLR4LNR0MxW0w%3D&share=false&showhidden=false // console.log(res);
// setList(res.data);
// }
// );
// }
// }, [fileToken, path, projectId]);
const getList = useCallback(() => {
if (fileToken && projectId) {
return CloudEController.JobOutFileList(
path,
fileToken,
projectId,
false
)?.then((res) => {
console.log(res);
if (Array.isArray(res.data)) {
setList(res.data);
} else {
setList([]);
}
});
} }
}, [fileToken, path]); }, [fileToken, path, projectId]);
useEffect(() => {
getList();
}, [getList]);
const handleRefresh = () => {
getList();
};
useEffect(() => { useEffect(() => {
getDataFileTokenRun({ getDataFileTokenRun({
...@@ -94,22 +130,6 @@ const ProjectData = observer(() => { ...@@ -94,22 +130,6 @@ const ProjectData = observer(() => {
const [selectIds, setSelectIds] = useState([]); const [selectIds, setSelectIds] = useState([]);
const [list, setList] = useState([
{
id: 123,
name: "name",
type: "directory",
mtime: new Date().getTime(),
},
{
id: 9999,
name: "name2",
type: "file",
size: 6,
mtime: new Date().getTime(),
},
]);
const versionsHeadCells = [ const versionsHeadCells = [
{ id: "checkbox" }, { id: "checkbox" },
{ id: "name", numeric: false, label: "名称", width: "25%" }, { id: "name", numeric: false, label: "名称", width: "25%" },
...@@ -123,10 +143,21 @@ const ProjectData = observer(() => { ...@@ -123,10 +143,21 @@ const ProjectData = observer(() => {
setSelectIds(e); setSelectIds(e);
}; };
const handleViewFolders = (item: any) => {
console.log("handleViewFolders");
console.log(item);
setPath(`${path}${item.name}`);
};
const hanleDeleteFile = (item: any) => {};
const renderName = (item: any) => { const renderName = (item: any) => {
if (item.type === "directory") { if (item.type === "directory") {
return ( return (
<span className={style.folderIconBox}> <span
className={style.folderIconBox}
onClick={() => handleViewFolders(item)}
>
<img className={style.folderIcon} src={folderIcon} alt="" /> <img className={style.folderIcon} src={folderIcon} alt="" />
{item.name} {item.name}
</span> </span>
...@@ -172,6 +203,7 @@ const ProjectData = observer(() => { ...@@ -172,6 +203,7 @@ const ProjectData = observer(() => {
variant="text" variant="text"
size="small" size="small"
color="error" color="error"
onClick={() => hanleDeleteFile(item)}
> >
删除 删除
</Button> </Button>
...@@ -246,7 +278,7 @@ const ProjectData = observer(() => { ...@@ -246,7 +278,7 @@ const ProjectData = observer(() => {
</div> </div>
</div> </div>
<div className={style.projectDataPathAndTabs}> <div className={style.projectDataPathAndTabs}>
<div className={style.projectDataPath}>{path}</div> <div className={style.projectDataPath}>{showPath}</div>
<div className={style.projectDataTabsAndBtton}> <div className={style.projectDataTabsAndBtton}>
<div className={style.projectDataTabs}> <div className={style.projectDataTabs}>
<div <div
...@@ -268,7 +300,11 @@ const ProjectData = observer(() => { ...@@ -268,7 +300,11 @@ const ProjectData = observer(() => {
数据集 数据集
</div> </div>
</div> </div>
<IconButton aria-label="refreshIcon" size="small"> <IconButton
aria-label="refreshIcon"
size="small"
onClick={handleRefresh}
>
<RefreshIcon /> <RefreshIcon />
</IconButton> </IconButton>
</div> </div>
...@@ -280,7 +316,7 @@ const ProjectData = observer(() => { ...@@ -280,7 +316,7 @@ const ProjectData = observer(() => {
}} }}
rowHover={true} rowHover={true}
stickyheader={true} stickyheader={true}
rows={list.map((item) => ({ rows={list.map((item: any) => ({
...item, ...item,
name: renderName(item), name: renderName(item),
size: renderSize(item), size: renderSize(item),
...@@ -319,7 +355,13 @@ const ProjectData = observer(() => { ...@@ -319,7 +355,13 @@ const ProjectData = observer(() => {
path={path} path={path}
list={list} list={list}
></UpLoaderFile> ></UpLoaderFile>
<AddFolder onRef={addFolderRef} list={list}></AddFolder> <AddFolder
onRef={addFolderRef}
list={list}
path={path}
fileToken={fileToken}
projectId={projectId}
></AddFolder>
<MoveFile onRef={moveFileRef} list={list}></MoveFile> <MoveFile onRef={moveFileRef} list={list}></MoveFile>
</div> </div>
</ThemeProvider> </ThemeProvider>
......
...@@ -10,33 +10,35 @@ import AddProject from "../AddProject"; ...@@ -10,33 +10,35 @@ import AddProject from "../AddProject";
const CurrentProject = observer(() => { const CurrentProject = observer(() => {
const { currentProjectStore } = useStores(); const { currentProjectStore } = useStores();
let addProjectRef: any = React.createRef(); // let addProjectRef: any = React.createRef();
const [open, setOpen] = useState(false); const [projectListOpen, setProjectListOpen] = useState(false);
const [addProjectOpen, setAddProjectOpen] = useState(false);
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null); const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
// 结合handleShowProjectList中的event.nativeEvent.stopImmediatePropagation();实现点击空白区域隐藏项目列表 // 结合handleShowProjectList中的event.nativeEvent.stopImmediatePropagation();实现点击空白区域隐藏项目列表
useEffect(()=>{ useEffect(() => {
document.addEventListener('click', (e) => { document.addEventListener("click", (e) => {
setOpen(false) setProjectListOpen(false);
}) });
}, []) }, []);
const handleShowProjectList = (event: React.MouseEvent<HTMLElement>) => { const handleShowProjectList = (event: React.MouseEvent<HTMLElement>) => {
event.nativeEvent.stopImmediatePropagation(); event.nativeEvent.stopImmediatePropagation();
setAnchorEl(event.currentTarget); setAnchorEl(event.currentTarget);
setOpen((previousOpen) => !previousOpen); setProjectListOpen((previousOpen) => !previousOpen);
}; };
const canBeOpen = open && Boolean(anchorEl); const canBeOpen = projectListOpen && Boolean(anchorEl);
const id = canBeOpen ? "spring-popper" : undefined; const id = canBeOpen ? "spring-popper" : undefined;
const handleChangeCurrentProject = (project: any) => { const handleChangeCurrentProject = (project: any) => {
currentProjectStore.changeProject(project); currentProjectStore.changeProject(project);
setOpen(!open); setProjectListOpen(!projectListOpen);
}; };
const openAddProject = () => { const openAddProject = () => {
addProjectRef.current.handleClickOpen() // addProjectRef.current.handleClickOpen();
setOpen(false) setAddProjectOpen(true);
} setProjectListOpen(false);
};
return ( return (
<div> <div>
...@@ -59,10 +61,10 @@ const CurrentProject = observer(() => { ...@@ -59,10 +61,10 @@ const CurrentProject = observer(() => {
style={{ fontSize: 12 }} style={{ fontSize: 12 }}
/> />
</div> </div>
<AddProject onRef={addProjectRef} /> <AddProject open={addProjectOpen} />
<Popper <Popper
id={id} id={id}
open={open} open={projectListOpen}
anchorEl={anchorEl} anchorEl={anchorEl}
placement="right-start" placement="right-start"
transition transition
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment