Commit 29872df4 authored by 吴永生#A02208's avatar 吴永生#A02208

Merge branch 'feat-20220705-customTemplate' of…

Merge branch 'feat-20220705-customTemplate' of http://120.77.149.83/sunyihao/bkunyun into feat-20220705-customTemplate
parents d94d3db3 c25862bb
...@@ -21,7 +21,7 @@ type projectListParams = { ...@@ -21,7 +21,7 @@ type projectListParams = {
}; };
// 查询当前用户可以看到的项目列表 // 查询当前用户可以看到的项目列表
const product = (params: projectListParams) => { const getProjectList = (params: projectListParams) => {
return request({ return request({
url: Api.API_PROJECT_LIST, url: Api.API_PROJECT_LIST,
method: "get", method: "get",
...@@ -246,7 +246,7 @@ const getworkFlowTaskInfo = (params: { jobId: string; taskId: string }) => { ...@@ -246,7 +246,7 @@ const getworkFlowTaskInfo = (params: { jobId: string; taskId: string }) => {
export { export {
current, current,
menu, menu,
product, getProjectList,
hpczone, hpczone,
addProject, addProject,
getProject, getProject,
......
import { useStores } from "@/store/index"; import { useStores } from "@/store/index";
import { elements } from "@/router"; import { elements } from "@/router";
import { current } from "@/api/demo_api"; import { current } from "@/api/demo_api";
import { product } from "@/api/project_api";
import localStorageKey from "@/utils/localStorageKey"; import localStorageKey from "@/utils/localStorageKey";
import NotFound from "@/views/404"; import NotFound from "@/views/404";
import useMyRequest from "@/hooks/useMyRequest"; import useMyRequest from "@/hooks/useMyRequest";
import { useEffect } from "react"; import { useEffect } from "react";
import { menu } from "@/api/routes_api"; import { menu } from "@/api/routes_api";
import {
setFileServerEndPointLocalStorage,
getFiletokenAccordingToId,
} from "@/views/Project/project";
const useMyRouter = () => { const useMyRouter = () => {
const { permissionStore, menuStore, currentProjectStore } = useStores(); const { permissionStore, menuStore } = useStores();
const userInfo = useMyRequest(current); const userInfo = useMyRequest(current);
const menuInfo = useMyRequest(menu); const menuInfo = useMyRequest(menu);
const productInfo = useMyRequest(product);
useEffect(() => { useEffect(() => {
userInfo.run(); userInfo.run();
menuInfo.run(); menuInfo.run();
productInfo.run({
product: "CADD",
});
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []); }, []);
...@@ -47,24 +38,8 @@ const useMyRouter = () => { ...@@ -47,24 +38,8 @@ const useMyRouter = () => {
permissionStore.initAllRoutes(); permissionStore.initAllRoutes();
} }
if (productInfo.res) {
let list = productInfo.data?.data;
if (list.length === 0) {
currentProjectStore.setProjectList([]);
currentProjectStore.changeProject({});
} else {
currentProjectStore.setProjectList(list);
currentProjectStore.changeProject(list[0]);
setFileServerEndPointLocalStorage(list[0].zoneId);
getFiletokenAccordingToId(list[0].id).then((res) => {
list[0].filetoken = res;
currentProjectStore.changeProject(list[0]);
});
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [userInfo.data, menuInfo.data, productInfo.data]); }, [userInfo.data, menuInfo.data]);
return permissionStore.allRoutes; return permissionStore.allRoutes;
}; };
......
import * as React from "react"; import * as React from "react";
import { ReactNode } from "react"; import { ReactNode, useEffect } from "react";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import ButtonComponent from "./Button"; import ButtonComponent from "./Button";
import tipsIcon from "@/assets/project/information-outline.svg"; import tipsIcon from "@/assets/project/information-outline.svg";
...@@ -28,7 +28,7 @@ const MyPopconfirm = (props: IMyPopconfirmProps) => { ...@@ -28,7 +28,7 @@ const MyPopconfirm = (props: IMyPopconfirmProps) => {
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null); const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
const handleClick = (event: React.MouseEvent<HTMLElement>) => { const handleClick = (event: React.MouseEvent<HTMLElement>) => {
console.log(123); event.nativeEvent.stopImmediatePropagation();
setAnchorEl(anchorEl ? null : event.currentTarget); setAnchorEl(anchorEl ? null : event.currentTarget);
}; };
...@@ -45,6 +45,12 @@ const MyPopconfirm = (props: IMyPopconfirmProps) => { ...@@ -45,6 +45,12 @@ const MyPopconfirm = (props: IMyPopconfirmProps) => {
onConfirm && onConfirm(); onConfirm && onConfirm();
}; };
useEffect(() => {
document.addEventListener("click", (e) => {
setAnchorEl(null);
});
}, []);
return ( return (
<div> <div>
<div aria-describedby={id} onClick={handleClick}> <div aria-describedby={id} onClick={handleClick}>
......
...@@ -11,22 +11,39 @@ type productInfo = { ...@@ -11,22 +11,39 @@ type productInfo = {
id?: string; id?: string;
name?: string; name?: string;
}; };
const sessionStorageCurrentProjectInfo = JSON.parse(
sessionStorage.getItem("currentProjectInfo") || "{}"
);
const sessionStorageCurrentProductInfo = JSON.parse(
sessionStorage.getItem("currentProductInfo") || "{}"
);
const sessionStorageProjectList = JSON.parse(
sessionStorage.getItem("projectList") || "[]"
);
class currentProject { class currentProject {
constructor() { constructor() {
makeAutoObservable(this); makeAutoObservable(this);
} }
// 选中的项目 // 选中的项目
currentProjectInfo: projectInfo = {}; currentProjectInfo: projectInfo = sessionStorageCurrentProjectInfo;
// 选中的产品下的项目列表 // 选中的产品下的项目列表
projectList: Array<projectInfo> = []; projectList: Array<projectInfo> = sessionStorageProjectList;
// 选中的产品 // 选中的产品
currentProductInfo: productInfo = {}; currentProductInfo: productInfo = sessionStorageCurrentProductInfo;
setProjectList = (list: Array<projectInfo>) => { setProjectList = (list: Array<projectInfo>) => {
this.projectList = list; this.projectList = list;
sessionStorage.setItem("projectList", JSON.stringify(list));
}; };
changeProject = (project: projectInfo) => { changeProject = (project: projectInfo) => {
this.currentProjectInfo = project; this.currentProjectInfo = project;
sessionStorage.setItem("currentProjectInfo", JSON.stringify(project));
};
changeProductInfo = (productInfo: productInfo) => {
this.currentProductInfo = productInfo;
sessionStorage.setItem("currentProductInfo", JSON.stringify(productInfo));
}; };
} }
......
import React, { useEffect } from "react"; import React, { useEffect, useState } from "react";
import { Outlet, useLocation, useNavigate } from "react-router-dom"; import { Outlet, useLocation, useNavigate } from "react-router-dom";
import cx from "classnames"; import cx from "classnames";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
...@@ -14,7 +14,12 @@ import Button from "@/components/mui/Button"; ...@@ -14,7 +14,12 @@ import Button from "@/components/mui/Button";
import logo from "@/assets/img/logo.svg"; import logo from "@/assets/img/logo.svg";
import MyPopover from "@/components/mui/MyPopover"; import MyPopover from "@/components/mui/MyPopover";
import TranSferList from "./components/TransferList"; import TranSferList from "./components/TransferList";
import { getProjectList } from "@/api/project_api";
import useMyRequest from "@/hooks/useMyRequest";
import {
setFileServerEndPointLocalStorage,
getFiletokenAccordingToId,
} from "@/views/Project/project";
import style from "./index.module.css"; import style from "./index.module.css";
const ConsoleLayout = observer(() => { const ConsoleLayout = observer(() => {
...@@ -28,6 +33,41 @@ const ConsoleLayout = observer(() => { ...@@ -28,6 +33,41 @@ const ConsoleLayout = observer(() => {
handleClose, handleClose,
} = useIndex(); } = useIndex();
const [currentProduct, setCurrentProduct] = useState<{
path: string;
name: string;
}>();
const { currentProjectStore } = useStores();
const { run: runGetProjectList } = useMyRequest(getProjectList, {
onSuccess: (res) => {
let list = res.data;
if (list.length === 0) {
currentProjectStore.setProjectList([]);
currentProjectStore.changeProject({});
navigate(currentProduct?.path as string);
} else {
currentProjectStore.setProjectList(list);
currentProjectStore.changeProject(list[0]);
setFileServerEndPointLocalStorage(list[0].zoneId);
getFiletokenAccordingToId(list[0].id).then((res) => {
list[0].filetoken = res;
currentProjectStore.changeProject(list[0]);
});
navigate(currentProduct?.path as string);
}
},
});
// 切换产品
const getProduct = (item: any) => {
currentProjectStore.changeProductInfo({ id: item.name, name: item.name });
setCurrentProduct(item);
runGetProjectList({
product: item.name,
});
};
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation(); const location = useLocation();
const { permissionStore, menuStore } = useStores(); const { permissionStore, menuStore } = useStores();
...@@ -86,7 +126,7 @@ const ConsoleLayout = observer(() => { ...@@ -86,7 +126,7 @@ const ConsoleLayout = observer(() => {
root: style.menuItemRoot, root: style.menuItemRoot,
}} }}
onClick={() => { onClick={() => {
navigate(item.path); getProduct(item);
handleClose(); handleClose();
}} }}
> >
......
...@@ -6,13 +6,21 @@ import style from "./index.module.css"; ...@@ -6,13 +6,21 @@ import style from "./index.module.css";
import { observer } from "mobx-react-lite"; import { observer } from "mobx-react-lite";
import { useStores } from "@/store/index"; import { useStores } from "@/store/index";
import classnames from "classnames"; import classnames from "classnames";
import { toJS } from "mobx";
const MenuLayout = observer(() => { const MenuLayout = observer(() => {
const { permissionStore } = useStores(); const { permissionStore, currentProjectStore } = useStores();
let pathname = new URL(window.location.href).pathname; let pathname = new URL(window.location.href).pathname;
const navigate = useNavigate(); const navigate = useNavigate();
const productInfo = toJS(currentProjectStore.currentProductInfo);
// 未选择产品时 直接跳转home页面
if (!productInfo.name) {
navigate("/home");
}
return ( return (
<Box className={style.container}> <Box className={style.container}>
<Box className={style.aside}> <Box className={style.aside}>
......
...@@ -97,7 +97,13 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -97,7 +97,13 @@ const ConfigForm = (props: ConfigFormProps) => {
const checkName = (name: string = "") => { const checkName = (name: string = "") => {
const reg = new RegExp(/^[a-zA-Z0-9\u4e00-\u9fa5-_]{3,30}$/); const reg = new RegExp(/^[a-zA-Z0-9\u4e00-\u9fa5-_]{3,30}$/);
if (reg.test(name)) { if (!name) {
setNameHelp({
error: true,
helperText: "任务名称不能为空",
});
return true;
} else if (reg.test(name)) {
setNameHelp({ setNameHelp({
error: false, error: false,
helperText: "", helperText: "",
......
...@@ -46,7 +46,7 @@ const ProjectSubmitWork = () => { ...@@ -46,7 +46,7 @@ const ProjectSubmitWork = () => {
// 前往工作台 // 前往工作台
const goToWorkbench = (toWorkbenchList = false) => { const goToWorkbench = (toWorkbenchList = false) => {
navigate("/product/cadd/projectWorkbench", { navigate("/product/cadd/projectWorkbench", {
state: { from: toWorkbenchList ? "submitWork" : "" }, state: { type: toWorkbenchList ? "workbenchList" : "" },
}); });
}; };
...@@ -97,14 +97,12 @@ const ProjectSubmitWork = () => { ...@@ -97,14 +97,12 @@ const ProjectSubmitWork = () => {
const checkResult = getCheckResult(parameter, value); const checkResult = getCheckResult(parameter, value);
parameter.error = checkResult.error; parameter.error = checkResult.error;
parameter.helperText = checkResult.helperText; parameter.helperText = checkResult.helperText;
} else {
return;
} }
if (getCheckResult(parameter, value).error === true) { if (getCheckResult(parameter, parameter.value).error === true) {
isCheck = false; isCheck = false;
} }
tack.isCheck = isCheck;
}); });
tack.isCheck = isCheck;
} else { } else {
return; return;
} }
......
import { IParameter } from "./interface" import { IParameter } from "./interface";
export const getCheckResult = (parameter: IParameter, value: string): { export const getCheckResult = (
error: boolean, parameter: IParameter,
helperText: string value: string
): {
error: boolean;
helperText: string;
} => { } => {
let error = false let error = false;
let helperText = '' let helperText = "";
// 表单校验 // 表单校验
if (parameter.required) { if (parameter.required) {
if (Array.isArray(value)) { if (Array.isArray(value)) {
if (value.length === 0) { if (value.length === 0) {
error = true error = true;
helperText = '该选项是必填项' helperText = "该选项是必填项";
} }
} else if (value === '' || value === null || value === undefined) { } else if (value === "" || value === null || value === undefined) {
error = true error = true;
helperText = '该选项是必填项' helperText = "该选项是必填项";
} }
} }
if (parameter.validators.length > 0) { if (parameter.validators.length > 0) {
parameter.validators.forEach((validator)=>{ parameter.validators.forEach((validator) => {
const reg = new RegExp(validator.regex) const reg = new RegExp(validator.regex);
if (!reg.test(value)) { if (!reg.test(value)) {
error = true error = true;
helperText = validator.message helperText = validator.message;
} }
}) });
} }
return { return {
error, error,
helperText helperText,
} };
} };
\ No newline at end of file
...@@ -84,17 +84,16 @@ const AddProject = (props: any) => { ...@@ -84,17 +84,16 @@ const AddProject = (props: any) => {
const handleClickOpen = () => { const handleClickOpen = () => {
DialogRef.current.handleClickOpen(); DialogRef.current.handleClickOpen();
initData() initData();
}; };
const initData = () => { const initData = () => {
setName('') setName("");
setDesc('') setDesc("");
if (zoneIdOptions.length > 0) { if (zoneIdOptions.length > 0) {
setZoneId(zoneIdOptions[0].id) setZoneId(zoneIdOptions[0].id);
} }
} };
const checkName = (name: string) => { const checkName = (name: string) => {
if (name) { if (name) {
......
...@@ -45,7 +45,6 @@ const CurrentProject = observer(() => { ...@@ -45,7 +45,6 @@ const CurrentProject = observer(() => {
const openAddProject = () => { const openAddProject = () => {
addProjectRef.current.handleClickOpen(); addProjectRef.current.handleClickOpen();
// setAddProjectOpen(true);
setProjectListOpen(false); setProjectListOpen(false);
}; };
...@@ -59,9 +58,12 @@ const CurrentProject = observer(() => { ...@@ -59,9 +58,12 @@ const CurrentProject = observer(() => {
<img src={logo} alt="" className={style.logo} /> <img src={logo} alt="" className={style.logo} />
<div className={style.info}> <div className={style.info}>
<div className={style.productName}> <div className={style.productName}>
{currentProjectStore.currentProductInfo.name || "CADD"} {currentProjectStore.currentProductInfo.name}
</div> </div>
<div className={style.projectName} title={currentProjectStore.currentProjectInfo.name}> <div
className={style.projectName}
title={currentProjectStore.currentProjectInfo.name}
>
{currentProjectStore.currentProjectInfo.name || "暂无项目"} {currentProjectStore.currentProjectInfo.name || "暂无项目"}
</div> </div>
</div> </div>
......
...@@ -6,10 +6,14 @@ ...@@ -6,10 +6,14 @@
* @FilePath: /bkunyun/src/views/Project/project.ts * @FilePath: /bkunyun/src/views/Project/project.ts
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
import { product, hpczone, getDataFileToken } from "@/api/project_api"; import {
getProjectList as getProjectListApi,
hpczone,
getDataFileToken,
} from "@/api/project_api";
export const getProjectList = async () => { export const getProjectList = async () => {
const res = await product({ product: "CADD" }); const res = await getProjectListApi({ product: "CADD" });
return res.data; return res.data;
}; };
......
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