|
@@ -7,26 +7,33 @@ import {
|
|
|
Input,
|
|
|
Tooltip,
|
|
|
Empty,
|
|
|
+ Spin,
|
|
|
} from "antd";
|
|
|
import type { DescriptionsProps, MenuProps } from "antd";
|
|
|
import { PlusOutlined, SearchOutlined } from "@ant-design/icons";
|
|
|
import TableEdit from "@/components/TableEdit";
|
|
|
import ER from "./components/ER";
|
|
|
import AddTable from "./components/AddTable";
|
|
|
-import { useModel, history } from "umi";
|
|
|
+import { useModel, history, useRequest, useParams } from "umi";
|
|
|
+import { GetDataModelDetail } from "@/api";
|
|
|
import NoData from "@/assets/no-data.png";
|
|
|
-import { TableItemType } from "@/type";
|
|
|
+import { ProjectInfo, TableItemType } from "@/type";
|
|
|
import { useFullscreen } from "ahooks";
|
|
|
+import AddModel from "@/components/AddModel";
|
|
|
|
|
|
const { Content, Header } = Layout;
|
|
|
export default function index() {
|
|
|
const [active, setActive] = useState(0);
|
|
|
const [showNavigator, setShowNavigator] = useState(true);
|
|
|
const addTableRef = useRef<{ open: () => void }>();
|
|
|
- const { project, setProject, setPlayModeEnable, graph } = useModel("erModel");
|
|
|
+ const { project, setProject, setPlayModeEnable, exitPlayMode, graph } =
|
|
|
+ useModel("erModel");
|
|
|
const [searchKeyword, setSearchKeyword] = useState("");
|
|
|
- const [selectKey, setSelectKey] = useState<string>(project.tables?.[0]?.table?.id || '');
|
|
|
+ const [selectKey, setSelectKey] = useState<string>(
|
|
|
+ project.tables?.[0]?.table?.id || ""
|
|
|
+ );
|
|
|
const erRef = useRef<HTMLDivElement>(null);
|
|
|
+ const addModelRef = useRef<{ edit: (info: ProjectInfo) => void }>();
|
|
|
const [isFullscreen, { enterFullscreen, exitFullscreen }] =
|
|
|
useFullscreen(erRef);
|
|
|
|
|
@@ -34,37 +41,60 @@ export default function index() {
|
|
|
setPlayModeEnable(true);
|
|
|
}, [project]);
|
|
|
|
|
|
+ const params = useParams();
|
|
|
+
|
|
|
+ const { run, loading } = useRequest(GetDataModelDetail, {
|
|
|
+ manual: true,
|
|
|
+ onSuccess: (res) => {
|
|
|
+ console.log("模型详情:", res);
|
|
|
+ const result = res?.result;
|
|
|
+ if (result) {
|
|
|
+ setProject(
|
|
|
+ result,
|
|
|
+ false,
|
|
|
+ true
|
|
|
+ );
|
|
|
+ }
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (params?.id) {
|
|
|
+ run({ id: params.id });
|
|
|
+ }
|
|
|
+ }, []);
|
|
|
+
|
|
|
const descItems: DescriptionsProps["items"] = useMemo(() => {
|
|
|
return [
|
|
|
{
|
|
|
key: "1",
|
|
|
label: "模型名称",
|
|
|
- children: project?.name || '-',
|
|
|
+ children: project?.name || "-",
|
|
|
},
|
|
|
{
|
|
|
key: "2",
|
|
|
label: "创建用户",
|
|
|
- children: project?.createdBy || '-',
|
|
|
+ children: project?.createdBy || "-",
|
|
|
},
|
|
|
{
|
|
|
key: "3",
|
|
|
label: "创建时间",
|
|
|
- children: project?.createTime || '-',
|
|
|
+ children: project?.createTime || "-",
|
|
|
},
|
|
|
{
|
|
|
key: "4-1",
|
|
|
label: "更新用户",
|
|
|
- children: project?.updatedBy || '-',
|
|
|
+ children: project?.updatedBy || "-",
|
|
|
},
|
|
|
{
|
|
|
key: "4",
|
|
|
label: "更新时间",
|
|
|
- children: project?.updateTime || '-',
|
|
|
+ children: project?.updateTime || "-",
|
|
|
},
|
|
|
{
|
|
|
key: "5",
|
|
|
label: "发布状态",
|
|
|
- children: project?.publishStatus || '-',
|
|
|
+ children: project?.publishStatus || "-",
|
|
|
},
|
|
|
{
|
|
|
key: "6",
|
|
@@ -74,7 +104,7 @@ export default function index() {
|
|
|
{
|
|
|
key: "7",
|
|
|
label: "描述",
|
|
|
- children: project?.description || '-',
|
|
|
+ children: project?.description || "-",
|
|
|
},
|
|
|
];
|
|
|
}, [project]);
|
|
@@ -128,14 +158,16 @@ export default function index() {
|
|
|
|
|
|
const handleEnterFullscreen = () => {
|
|
|
enterFullscreen();
|
|
|
- }
|
|
|
+ };
|
|
|
const handleExitFullscreen = () => {
|
|
|
exitFullscreen();
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
const handleEnterEdit = () => {
|
|
|
- history.push(`/er/${project.id}`)
|
|
|
- }
|
|
|
+ exitPlayMode();
|
|
|
+ const enterpriseCode = sessionStorage.getItem("enterpriseCode");
|
|
|
+ history.push(`/er/${project.id}?enterpriseCode=${enterpriseCode}`);
|
|
|
+ };
|
|
|
|
|
|
const extra = (
|
|
|
<div className="flex gap-12px">
|
|
@@ -143,13 +175,13 @@ export default function index() {
|
|
|
<i className="iconfont icon-tongbu text-12px" />
|
|
|
一键同步
|
|
|
</a>
|
|
|
- <a>
|
|
|
+ <a onClick={() => project.id && addModelRef.current?.edit(project)}>
|
|
|
<i className="iconfont icon-bianji text-12px" />
|
|
|
- 修改
|
|
|
+ 基础信息
|
|
|
</a>
|
|
|
- <a onClick={() => handleEnterEdit}>
|
|
|
+ <a onClick={handleEnterEdit}>
|
|
|
<i className="iconfont icon-bianji text-12px" />
|
|
|
- 进入编辑
|
|
|
+ 模型编辑
|
|
|
</a>
|
|
|
<a>
|
|
|
<i className="iconfont icon-moban text-14px" />
|
|
@@ -159,36 +191,38 @@ export default function index() {
|
|
|
);
|
|
|
|
|
|
return (
|
|
|
- <Layout className="h-100vh flex flex-col bg-#fafafa p-12px">
|
|
|
- <Header
|
|
|
- className="shadow-sm"
|
|
|
- style={{
|
|
|
- backgroundColor: "#fff",
|
|
|
- padding: 16,
|
|
|
- height: "auto",
|
|
|
- borderRadius: 8,
|
|
|
- // boxShadow: "0 2px 4px rgba(0, 0, 0, 0.15)",
|
|
|
- marginBottom: 12,
|
|
|
- }}
|
|
|
- >
|
|
|
- <Descriptions
|
|
|
- title={
|
|
|
- <span>
|
|
|
- <svg className="iconfont w-14px h-14px m-r-4px">
|
|
|
- <use xlinkHref="#icon-shujumoxing" />
|
|
|
- </svg>
|
|
|
- 模型详情
|
|
|
- </span>
|
|
|
- }
|
|
|
- items={descItems}
|
|
|
- extra={extra}
|
|
|
- ></Descriptions>
|
|
|
- </Header>
|
|
|
+ <Spin spinning={loading}>
|
|
|
+ <AddModel ref={addModelRef} />
|
|
|
+ <Layout className="h-100vh flex flex-col bg-#fafafa p-12px">
|
|
|
+ <Header
|
|
|
+ className="shadow-sm"
|
|
|
+ style={{
|
|
|
+ backgroundColor: "#fff",
|
|
|
+ padding: 16,
|
|
|
+ height: "auto",
|
|
|
+ borderRadius: 8,
|
|
|
+ // boxShadow: "0 2px 4px rgba(0, 0, 0, 0.15)",
|
|
|
+ marginBottom: 12,
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Descriptions
|
|
|
+ title={
|
|
|
+ <span>
|
|
|
+ <svg className="iconfont w-14px h-14px m-r-4px">
|
|
|
+ <use xlinkHref="#icon-shujumoxing" />
|
|
|
+ </svg>
|
|
|
+ 模型详情
|
|
|
+ </span>
|
|
|
+ }
|
|
|
+ items={descItems}
|
|
|
+ extra={extra}
|
|
|
+ ></Descriptions>
|
|
|
+ </Header>
|
|
|
|
|
|
- <Content className="flex-1 overflow-auto flex gap-12px">
|
|
|
- <div className="left w-300px shrink-0 h-full shadow-sm bg-#fff rounded-8px">
|
|
|
- <div
|
|
|
- className="
|
|
|
+ <Content className="flex-1 overflow-auto flex gap-12px">
|
|
|
+ <div className="left w-300px shrink-0 h-full shadow-sm bg-#fff rounded-8px">
|
|
|
+ <div
|
|
|
+ className="
|
|
|
flex
|
|
|
justify-between
|
|
|
header-tit
|
|
@@ -200,99 +234,105 @@ export default function index() {
|
|
|
border-b-1px
|
|
|
border-b-#eee
|
|
|
border-b-solid"
|
|
|
- >
|
|
|
- <div>
|
|
|
- <svg className="iconfont w-14px h-14px m-r-4px">
|
|
|
- <use xlinkHref="#icon-biaoge" />
|
|
|
- </svg>
|
|
|
- <span>数据表</span>
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <Input
|
|
|
- placeholder="搜索"
|
|
|
- className="w-100px m-r-4px"
|
|
|
- suffix={<SearchOutlined />}
|
|
|
- value={searchKeyword}
|
|
|
- onChange={(e) => setSearchKeyword(e.target.value)}
|
|
|
- />
|
|
|
- <Tooltip title="添加数据表">
|
|
|
- <Button
|
|
|
- type="primary"
|
|
|
- icon={<PlusOutlined />}
|
|
|
- onClick={() => addTableRef.current?.open()}
|
|
|
- ></Button>
|
|
|
- </Tooltip>
|
|
|
+ >
|
|
|
+ <div>
|
|
|
+ <svg className="iconfont w-14px h-14px m-r-4px">
|
|
|
+ <use xlinkHref="#icon-biaoge" />
|
|
|
+ </svg>
|
|
|
+ <span>数据表</span>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <Input
|
|
|
+ placeholder="搜索"
|
|
|
+ className="w-100px m-r-4px"
|
|
|
+ suffix={<SearchOutlined />}
|
|
|
+ value={searchKeyword}
|
|
|
+ onChange={(e) => setSearchKeyword(e.target.value)}
|
|
|
+ />
|
|
|
+ <Tooltip title="添加数据表">
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ icon={<PlusOutlined />}
|
|
|
+ onClick={() => addTableRef.current?.open()}
|
|
|
+ ></Button>
|
|
|
+ </Tooltip>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+ <Menu
|
|
|
+ mode="inline"
|
|
|
+ items={tableData}
|
|
|
+ selectedKeys={[selectKey]}
|
|
|
+ onSelect={({ key }) => setSelectKey(key)}
|
|
|
+ />
|
|
|
+ {!tableData.length && (
|
|
|
+ <Empty image={NoData} description="点击+添加数据表!" />
|
|
|
+ )}
|
|
|
</div>
|
|
|
- <Menu
|
|
|
- mode="inline"
|
|
|
- items={tableData}
|
|
|
- selectedKeys={[selectKey]}
|
|
|
- onSelect={({ key }) => setSelectKey(key)}
|
|
|
- />
|
|
|
- {!tableData.length && (
|
|
|
- <Empty image={NoData} description="点击+添加数据表!" />
|
|
|
- )}
|
|
|
- </div>
|
|
|
- <div className="right flex-1 overflow-hidden h-full shadow-sm bg-#fff rounded-8px p-12px flex flex-col">
|
|
|
- <div className="head flex justify-between">
|
|
|
- <div className="left flex gap-8px">
|
|
|
- <Button
|
|
|
- type={active === 0 ? "primary" : "default"}
|
|
|
- onClick={() => setActive(0)}
|
|
|
- >
|
|
|
- ER图
|
|
|
- </Button>
|
|
|
- <Button
|
|
|
- type={active === 1 ? "primary" : "default"}
|
|
|
- onClick={() => setActive(1)}
|
|
|
- >
|
|
|
- 实体
|
|
|
- </Button>
|
|
|
+ <div className="right flex-1 overflow-hidden h-full shadow-sm bg-#fff rounded-8px p-12px flex flex-col">
|
|
|
+ <div className="head flex justify-between">
|
|
|
+ <div className="left flex gap-8px">
|
|
|
+ <Button
|
|
|
+ type={active === 0 ? "primary" : "default"}
|
|
|
+ onClick={() => setActive(0)}
|
|
|
+ >
|
|
|
+ ER图
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ type={active === 1 ? "primary" : "default"}
|
|
|
+ onClick={() => setActive(1)}
|
|
|
+ >
|
|
|
+ 实体
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ <div className="right flex gap-8px m-b-12px">
|
|
|
+ {active === 0 ? (
|
|
|
+ <>
|
|
|
+ <Input placeholder="搜索" suffix={<SearchOutlined />} />
|
|
|
+ <Button
|
|
|
+ type={showNavigator ? "primary" : "default"}
|
|
|
+ onClick={() => setShowNavigator(!showNavigator)}
|
|
|
+ icon={<i className="iconfont icon-xiaoditu text-14px" />}
|
|
|
+ >
|
|
|
+ 导航
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ type="primary"
|
|
|
+ icon={
|
|
|
+ <i className="iconfont icon-quanping_o text-14px" />
|
|
|
+ }
|
|
|
+ onClick={handleEnterFullscreen}
|
|
|
+ >
|
|
|
+ 全屏
|
|
|
+ </Button>
|
|
|
+ </>
|
|
|
+ ) : (
|
|
|
+ <>
|
|
|
+ <Input placeholder="搜索" suffix={<SearchOutlined />} />
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div className="right flex gap-8px m-b-12px">
|
|
|
+ <div className="content w-full flex-1 overflow-auto">
|
|
|
{active === 0 ? (
|
|
|
- <>
|
|
|
- <Input placeholder="搜索" suffix={<SearchOutlined />} />
|
|
|
- <Button
|
|
|
- type={showNavigator ? "primary" : "default"}
|
|
|
- onClick={() => setShowNavigator(!showNavigator)}
|
|
|
- icon={<i className="iconfont icon-xiaoditu text-14px" />}
|
|
|
- >
|
|
|
- 导航
|
|
|
- </Button>
|
|
|
- <Button
|
|
|
- type="primary"
|
|
|
- icon={<i className="iconfont icon-quanping_o text-14px" />}
|
|
|
- onClick={handleEnterFullscreen}
|
|
|
- >
|
|
|
- 全屏
|
|
|
- </Button>
|
|
|
- </>
|
|
|
+ <div
|
|
|
+ className="er w-full h-full bg-#ccc overflow-hidden"
|
|
|
+ ref={erRef}
|
|
|
+ >
|
|
|
+ <ER
|
|
|
+ showNavigator={showNavigator}
|
|
|
+ isFullScreen={isFullscreen}
|
|
|
+ onExitFullscreen={handleExitFullscreen}
|
|
|
+ onChangeShowNavigator={setShowNavigator}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
) : (
|
|
|
- <>
|
|
|
- <Input placeholder="搜索" suffix={<SearchOutlined />} />
|
|
|
- </>
|
|
|
+ <TableEdit data={currentTable?.tableColumnList || []} />
|
|
|
)}
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div className="content w-full flex-1 overflow-auto">
|
|
|
- {active === 0 ? (
|
|
|
- <div className="er w-full h-full bg-#ccc overflow-hidden" ref={erRef}>
|
|
|
- <ER
|
|
|
- showNavigator={showNavigator}
|
|
|
- isFullScreen={isFullscreen}
|
|
|
- onExitFullscreen={handleExitFullscreen}
|
|
|
- onChangeShowNavigator={setShowNavigator}
|
|
|
- />
|
|
|
- </div>
|
|
|
- ) : (
|
|
|
- <TableEdit data={currentTable?.tableColumnList || []} />
|
|
|
- )}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </Content>
|
|
|
- <AddTable ref={addTableRef} onChange={handleAddTable} />
|
|
|
- </Layout>
|
|
|
+ </Content>
|
|
|
+ <AddTable ref={addTableRef} onChange={handleAddTable} />
|
|
|
+ </Layout>
|
|
|
+ </Spin>
|
|
|
);
|
|
|
}
|