Browse Source

feat: 首页文件夹解析

liaojiaxing 5 months ago
parent
commit
5cdd6660a7

+ 18 - 13
apps/er-designer/src/components/AddModel.tsx

@@ -6,23 +6,25 @@ import { ProjectInfo } from "@/type";
 import { DEFAULT_SETTING } from "@/constants";
 
 export default React.forwardRef(function AddModel(
-  props: { onChange?: (id: string) => void },
+  props: { onChange?: (val: string | ProjectInfo) => void },
   ref
 ) {
   const [open, setOpen] = React.useState(false);
   const [form] = Form.useForm();
   const type = React.useRef<TableType>();
-  const isAdd = useRef(true);
+  const editInfo = useRef<ProjectInfo>();
+  const folderRef = useRef<string>();
   React.useImperativeHandle(ref, () => {
     return {
-      open: (tableType: TableType) => {
-        isAdd.current = true;
+      open: (tableType: TableType, folder?: string) => {
+        folderRef.current = folder;
+        editInfo.current = undefined;
         type.current = tableType;
         setOpen(true);
         form.resetFields();
       },
       edit: (info: ProjectInfo) => {
-        isAdd.current = false;
+        editInfo.current = info;
         form.setFieldsValue(info);
         setOpen(true);
       },
@@ -31,20 +33,23 @@ export default React.forwardRef(function AddModel(
 
   const handleSubmit = () => {
     form.validateFields().then(async (values) => {
-      console.log(values, message);
-      if (isAdd.current) {
-        const res = await SaveDataModel({
+      if (editInfo.current) {
+        const params = {
+          ...editInfo.current,
           ...values,
-          type: type.current,
-          setting: JSON.stringify(DEFAULT_SETTING),
-        });
-        message.success("创建成功");
-        props.onChange?.(res?.result);
+        };
+        // 编辑
+        await SaveDataModel(params);
+        message.success("编辑成功");
+        props.onChange?.(params);
         setOpen(false);
       } else {
+        // 新增
         const res = await SaveDataModel({
           ...values,
+          directory: folderRef.current,
           type: type.current,
+          setting: JSON.stringify(DEFAULT_SETTING),
         });
         message.success("创建成功");
         props.onChange?.(res?.result);

+ 0 - 418
apps/er-designer/src/components/NodeAttrs.tsx

@@ -1,418 +0,0 @@
-import { Cell } from "@antv/x6";
-import { Select, Form, Input, Divider, AutoComplete } from "antd";
-import { useEffect, useState } from "react";
-import {
-  ListLangBySearchKey,
-  GetAllPage,
-  GetAllTablesAndViews,
-  GetAllWfScene,
-  GetAllWorkflows,
-} from "@/api";
-import { useRequest } from "umi";
-import SelectModal from "./SelectModal";
-import { CorrelationType } from "@/enum";
-
-interface LanItem {
-  en: string;
-  key: string;
-  ["zh-CN"]: string;
-}
-export default function NodeAttrs({
-  cell,
-  onChange,
-}: {
-  cell?: Cell;
-  onChange?: (data: any) => void;
-}) {
-  const defaultModel = {
-    "zh-CN": "",
-    en: "",
-    langText: "",
-    desc: "",
-    linkType: CorrelationType.scene,
-    linkValue: {
-      value: undefined,
-      label: undefined,
-    },
-    remember: "",
-    recordTime: "",
-    recordUser: "",
-    recordConent: "",
-  };
-
-  const [lanOptions, setLanOptions] = useState<any[]>([]);
-  const [formModel, setFormModel] = useState(cell?.data?.attrs || defaultModel);
-
-  useEffect(() => {
-    if(cell) {
-      setFormModel(cell?.data?.attrs || defaultModel);
-    }
-  }, [cell]);
-
-  const { run } = useRequest(ListLangBySearchKey, {
-    manual: true,
-    onSuccess(data, params) {
-      setLanOptions(
-        (data.result || []).map((item: LanItem) => ({
-          ...item,
-          label: `${item.en || ""}[zh-CN:${item["zh-CN"]}]`,
-          value: item[params[0].searchLan],
-        }))
-      );
-    },
-  });
-
-  useEffect(() => {
-    onChange?.(formModel);
-  }, [formModel]);
-
-  const handleSearch = (serchKey: string, searchLan: "en" | "zh-CN") => {
-    run({
-      maxCount: 10,
-      searchKey: serchKey,
-      searchLan,
-    });
-  };
-
-  const handleChange = (key: string, value: any) => {
-    setFormModel({
-      ...formModel,
-      langText: "",
-      [key]: value,
-    });
-  };
-
-  const handleSelectLang = (option: LanItem) => {
-    setFormModel(() => {
-      return {
-        ...formModel,
-        langText: option.key,
-        en: option?.en,
-        ["zh-CN"]: option?.["zh-CN"],
-      };
-    });
-  };
-
-  return (
-    <div>
-      <Divider style={{ margin: "0" }}>基本</Divider>
-      <section className="px-16px">
-        <Form.Item
-          label="中文"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-          layout="vertical"
-        >
-          <AutoComplete
-            allowClear
-            placeholder="请输入"
-            options={lanOptions}
-            onSearch={(val) => handleSearch(val, "zh-CN")}
-            value={formModel["zh-CN"]}
-            onChange={(val) => handleChange("zh-CN", val)}
-            onSelect={(_val, opt) => handleSelectLang(opt)}
-            disabled={!cell}
-          />
-        </Form.Item>
-        <Form.Item
-          label="English"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-          layout="vertical"
-        >
-          <AutoComplete
-            allowClear
-            style={{ width: "100%" }}
-            placeholder="请输入"
-            options={lanOptions}
-            onSearch={(val) => handleSearch(val, "en")}
-            value={formModel.en}
-            onChange={(val) => handleChange("en", val)}
-            onSelect={(_val, opt) => handleSelectLang(opt)}
-            disabled={!cell}
-          />
-        </Form.Item>
-        <Form.Item
-          label="节点描述"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-        >
-          <Input.TextArea
-            placeholder="请输入"
-            value={formModel.desc}
-            onChange={(e) => handleChange("desc", e.target.value)}
-            disabled={!cell}
-          />
-        </Form.Item>
-        <Form.Item
-          label="关联类型"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-        >
-          <Select
-            placeholder="请选择"
-            disabled={!cell}
-            options={[
-              { value: CorrelationType.scene, label: "场景" },
-              { value: CorrelationType.flow, label: "流程" },
-              { value: CorrelationType.page, label: "页面" },
-              { value: CorrelationType.table, label: "数据表" },
-              { value: CorrelationType.view, label: "视图" },
-            ]}
-            value={formModel.linkType}
-            onChange={(val) => {
-              setFormModel({
-                ...formModel,
-                linkType: val,
-                linkValue: {
-                  label: undefined,
-                  value: undefined,
-                },
-              });
-            }}
-          />
-        </Form.Item>
-        <Form.Item
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-        >
-          {formModel.linkType === CorrelationType.scene && (
-            <SelectModal
-              key="1"
-              value={formModel.linkValue}
-              api={GetAllWfScene}
-              disabled={!cell}
-              onSuccess={(data) => {
-                return data?.result?.model || [];
-              }}
-              columns={[
-                { title: "名称", dataIndex: "name" },
-                { title: "描述", dataIndex: "memo" },
-              ]}
-              onChange={(rows) => {
-                const item = rows[0];
-                item &&
-                  handleChange("linkValue", {
-                    value: item.id,
-                    label: item.name,
-                  });
-              }}
-              defaultParams={[
-                {
-                  currentPage: 1,
-                  pageSize: 10,
-                  orderByProperty: "Id",
-                  Ascending: false,
-                  filters: [
-                    {
-                      name: "EnterpriseId",
-                    },
-                  ],
-                },
-              ]}
-            />
-          )}
-          {formModel.linkType === CorrelationType.flow && (
-            <SelectModal
-              key="2"
-              value={formModel.linkValue}
-              api={GetAllWorkflows}
-              disabled={!cell}
-              onSuccess={(data) => {
-                return data?.result || [];
-              }}
-              columns={[
-                { title: "名称", dataIndex: "name" },
-                { title: "描述", dataIndex: "memo" },
-              ]}
-              onChange={(rows) => {
-                const item = rows[0];
-                item &&
-                  handleChange("linkValue", {
-                    value: item.id,
-                    label: item.name,
-                  });
-              }}
-              defaultParams={[
-                {
-                  currentPage: 1,
-                  pageSize: 10,
-                  orderByProperty: "Id",
-                  Ascending: false,
-                  filters: [
-                    {
-                      name: "EnterpriseId",
-                    },
-                  ],
-                },
-              ]}
-            />
-          )}
-          {formModel.linkType === CorrelationType.page && (
-            <SelectModal
-              key="3"
-              value={formModel.linkValue}
-              api={GetAllPage}
-              disabled={!cell}
-              onSuccess={(data) => {
-                return data?.result || [];
-              }}
-              columns={[
-                {
-                  title: "名称",
-                  dataIndex: "name",
-                  render: (_val, record) => (
-                    <span>
-                      {record.name}({record.fileName})
-                    </span>
-                  ),
-                },
-                { title: "描述", dataIndex: "description" },
-              ]}
-              onChange={(rows) => {
-                const item = rows[0];
-                item &&
-                  handleChange("linkValue", {
-                    value: item.id,
-                    label: item.name,
-                  });
-              }}
-            />
-          )}
-          {formModel.linkType === CorrelationType.table && (
-            <SelectModal
-              key="4"
-              value={formModel.linkValue}
-              api={GetAllTablesAndViews}
-              disabled={!cell}
-              onSuccess={(data) => {
-                return data?.result?.appBusinessTables || [];
-              }}
-              columns={[
-                {
-                  title: "名称",
-                  dataIndex: "name",
-                  render: (val, record) => (
-                    <span>
-                      {record.name}({record.schemaName})
-                    </span>
-                  ),
-                },
-                { title: "描述", dataIndex: "description" },
-              ]}
-              onChange={(rows) => {
-                const item = rows[0];
-                item &&
-                  handleChange("linkValue", {
-                    value: item.id,
-                    label: item.name,
-                  });
-              }}
-            />
-          )}
-          {formModel.linkType === CorrelationType.view && (
-            <SelectModal
-              key="5"
-              value={formModel.linkValue}
-              api={GetAllTablesAndViews}
-              disabled={!cell}
-              onSuccess={(data) => {
-                return data?.result?.bpmViewTables || [];
-              }}
-              columns={[
-                {
-                  title: "名称",
-                  dataIndex: "name",
-                  render: (val, record) => (
-                    <span>
-                      {record.name}({record.schemaName})
-                    </span>
-                  ),
-                },
-                { title: "描述", dataIndex: "description" },
-              ]}
-              onChange={(rows) => {
-                const item = rows[0];
-                item &&
-                  handleChange("linkValue", {
-                    value: item.id,
-                    label: item.name,
-                  });
-              }}
-            />
-          )}
-        </Form.Item>
-      </section>
-      <Divider style={{ margin: "0" }}>需求</Divider>
-      <section className="px-16px">
-        <Form.Item
-          label="参与人"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-        >
-          <Input
-            placeholder="请输入"
-            value={formModel.remember}
-            onChange={(e) => handleChange("remember", e.target.value)}
-            disabled={!cell}
-          />
-        </Form.Item>
-        <Form.Item
-          label="记录时间"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-        >
-          <Input
-            placeholder="请输入"
-            value={formModel.recordTime}
-            onChange={(e) => handleChange("recordTime", e.target.value)}
-            disabled={!cell}
-          />
-        </Form.Item>
-        <Form.Item
-          label="记录人"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-        >
-          <Input.TextArea
-            placeholder="请输入"
-            value={formModel.recordUser}
-            onChange={(e) => handleChange("recordUser", e.target.value)}
-            disabled={!cell}
-          />
-        </Form.Item>
-        <Form.Item
-          label="内容"
-          labelCol={{ span: 10 }}
-          labelAlign="left"
-          className="mb-8px"
-          colon={false}
-        >
-          <Input.TextArea
-            rows={5}
-            placeholder="请输入"
-            value={formModel.recordConent}
-            onChange={(e) => handleChange("recordConent", e.target.value)}
-            disabled={!cell}
-          />
-        </Form.Item>
-      </section>
-    </div>
-  );
-}

+ 1 - 1
apps/er-designer/src/components/TableNode.tsx

@@ -166,7 +166,7 @@ function TableNode({ node, graph }: { node: Node; graph: Graph }) {
               <span className="m-r-4px">
                 <i className="iconfont icon-key-fill color-#efc553 m-r--4px" />
                 <span className="text-12px color-#f15359">P</span>
-                <span className="text-12px color-#8dafd1">F</span>
+                {/* <span className="text-12px color-#8dafd1">F</span> */}
               </span>
             ) : (
               <span>

+ 6 - 0
apps/er-designer/src/global.less

@@ -0,0 +1,6 @@
+.icon {
+  width: 1em; height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}

+ 2 - 2
apps/er-designer/src/pages/detail/index.tsx

@@ -222,7 +222,7 @@ export default function index() {
 
   return (
     <Spin spinning={loading}>
-      <AddModel ref={addModelRef} />
+      <AddModel ref={addModelRef} onChange={(info) => { typeof info === 'object' && setProject(info)}}/>
       <Layout className="h-100vh flex flex-col bg-#fafafa p-12px">
         <Header
           className="shadow-sm"
@@ -475,7 +475,7 @@ export default function index() {
             </div>
           </div>
         </Content>
-        <AddTable ref={addTableRef} onChange={handleAddTable} />
+        <AddTable ref={addTableRef} onChange={handleAddTable}/>
       </Layout>
     </Spin>
   );

+ 51 - 20
apps/er-designer/src/pages/er/components/ColumnItem.tsx

@@ -1,4 +1,4 @@
-import React from "react";
+import React, { useMemo, useState } from "react";
 import { HolderOutlined } from "@ant-design/icons";
 import {
   Button,
@@ -16,6 +16,7 @@ import { DATA_TYPE_OPTIONS } from "@/constants";
 import { useSortable } from "@dnd-kit/sortable";
 import { CSS } from "@dnd-kit/utilities";
 import LangInput from "@/components/LangInput";
+import { DataType } from "@/enum";
 
 export default function ColumnItem({
   column,
@@ -34,6 +35,7 @@ export default function ColumnItem({
         easing: "cubic-bezier(0.25, 1, 0.5, 1)",
       },
     });
+  const [code, setCode] = useState(column.schemaName);
 
   const [open, setOpen] = React.useState(false);
 
@@ -42,15 +44,25 @@ export default function ColumnItem({
     transition,
   };
 
-  const validMsg = (val?: string) => {
-    if (!val) return "编码不能为空";
-    if (val.length >= 50) {
+  const validCodeErrMsg = useMemo(() => {
+    setOpen(true);
+    if (!code) return "编码不能为空";
+    if (code.length >= 50) {
       return "编码长度不能超过50";
     }
     const regex = /^[a-z][a-z0-9_]*$/;
-    if (!regex.test(val)) return "编码只能包含字母和数字, 必须小写字母开头!";
+    if (!regex.test(code)) return "编码只能包含字母和数字, 必须小写字母开头!";
     setOpen(false);
     return false;
+  }, [code]);
+
+  const handleSetCode = () => {
+    if (code && !validCodeErrMsg) {
+      onChange("schemaName", code);
+    }
+    if (!code) {
+      setCode(column.schemaName);
+    }
   };
 
   return (
@@ -69,20 +81,19 @@ export default function ColumnItem({
       />
       <Tooltip title="字段编码">
         <Popover
-          title={
-            <span className="text-red">{validMsg(column.schemaName)}</span>
-          }
+          title={<span className="text-red">{validCodeErrMsg}</span>}
           open={open}
-          onOpenChange={(o) => setOpen(o && !!validMsg(column.schemaName))}
-          trigger={['focus']}
+          onOpenChange={(o) => setOpen(o && !!validCodeErrMsg)}
+          trigger={["focus"]}
         >
           <Input
             placeholder="编码"
-            defaultValue={column.schemaName}
+            defaultValue={code}
             className="flex-1"
             disabled={column.isPreDefined}
-            onChange={(e) => onChange("schemaName", e.target.value)}
-            status={validMsg(column.schemaName) ? "error" : ''}
+            onChange={(e) => setCode(e.target.value)}
+            onBlur={handleSetCode}
+            status={validCodeErrMsg ? "error" : ""}
           />
         </Popover>
       </Tooltip>
@@ -181,32 +192,52 @@ export default function ColumnItem({
                   </Form.Item>
                 </Col>
               </Row>
-              <Row gutter={8}>
+              {column.type === DataType.Nvarchar && (
+                <Row gutter={8}>
+                  <Col span={12}>
+                    <Form.Item label="长度">
+                      <InputNumber
+                        placeholder="请输入"
+                        min={0}
+                        className="w-full"
+                        disabled={column.isPreDefined}
+                        value={column.maxLength}
+                        onChange={(num) => onChange("maxLength", num)}
+                      />
+                    </Form.Item>
+                  </Col>
+                </Row>
+              )}
+              {column.type === DataType.Decimal && (
+                <Row gutter={8}>
                 <Col span={12}>
-                  <Form.Item label="长度">
+                  <Form.Item label="长度">
                     <InputNumber
                       placeholder="请输入"
                       min={0}
+                      step={1}
                       className="w-full"
                       disabled={column.isPreDefined}
-                      value={column.maxLength}
-                      onChange={(num) => onChange("maxLength", num)}
+                      value={column.precision}
+                      onChange={(num) => onChange("precision", num)}
                     />
                   </Form.Item>
                 </Col>
                 <Col span={12}>
-                  <Form.Item label="精度">
+                  <Form.Item label="小数位数">
                     <InputNumber
                       placeholder="请输入"
                       min={0}
+                      step={1}
                       className="w-full"
                       disabled={column.isPreDefined}
-                      value={column.precision}
-                      onChange={(num) => onChange("precision", num)}
+                      value={column.scale}
+                      onChange={(num) => onChange("scale", num)}
                     />
                   </Form.Item>
                 </Col>
               </Row>
+              )}
               <Row>
                 <Col span={24}>
                   <Form.Item label="描述">

+ 100 - 153
apps/er-designer/src/pages/home/All.tsx

@@ -24,12 +24,14 @@ import {
   MoreOutlined,
   PlusOutlined,
 } from "@ant-design/icons";
-import { GetDataModelList } from "@/api";
+import { GetDataModelList, SaveDataModel } from "@/api";
 import ProjectCard from "./ProjectCard";
 import DragItem from "./DragItem";
 import DropItem from "./DropItem";
 import { TableType } from "@/enum";
 import AddModel from "@/components/AddModel";
+import { uuid } from "@/utils";
+import { ProjectInfo } from "@/type";
 
 type BreadcrumbItem = {
   title: React.ReactNode;
@@ -47,6 +49,7 @@ export default function All({
   type: TableType;
 }) {
   const [display, setDisplay] = useState("card");
+  // 文件夹数据
   const [folderData, setFolderData] = useState<any[]>([]);
   const [dataSource, setDataSource] = useState<any[]>([]);
   const [total, setTotal] = useState(0);
@@ -54,12 +57,12 @@ export default function All({
   const [currentPage, setCurrentPage] = useState(1);
   const [pageSize, setPageSize] = useState(12);
   const [open, setOpen] = useState(false);
-  const currentFolder = useRef("root");
+  const [currentFolder, setCurrentFolder] = useState("");
   const { confirm } = Modal;
-  const moveSource = useRef<{ id: string; type: string }>();
-  const [folderList, setFolderList] = useState<any[]>([]);
+  const moveSource = useRef<{ data: any; type: string }>();
+
   const [selectFolder, setSelectFolder] = useState("");
-  const addModelRef = useRef<{ open: (type: TableType) => void }>();
+  const addModelRef = useRef<{ open: (type: TableType, folder: string) => void }>();
 
   const { loading, run, refresh } = useRequest(GetDataModelList, {
     defaultParams: [
@@ -72,37 +75,41 @@ export default function All({
     onSuccess: (res) => {
       const result = res?.result || {};
       setDataSource(result);
-      // setFolderData(result?.folders || []);
+      // 创建文件夹数据
+      const list = new Set((result || [])
+        .map((item: ProjectInfo) => item.directory)
+        .filter((name: string) => name));
+
+      setFolderData(
+        [...list].map((item) => {
+          return {
+            id: uuid(),
+            name: item,
+          };
+        })
+      );
       setTotal(result.length || 0);
     },
   });
 
-  // const { refresh: refreshFolderAll } = useRequest(GetAllFolders, {
-  //   onSuccess: (res) => {
-  //     setFolderList(res?.result || []);
-  //   },
-  // });
-
   useEffect(() => {
     updateKey && getData(1, pageSize);
   }, [updateKey]);
 
   useEffect(() => {
-    onChangeCurrentFolder(currentFolder.current);
-  }, [currentFolder.current]);
+    onChangeCurrentFolder(currentFolder);
+  }, [currentFolder]);
 
   // 面包屑点击
   const handleBreadcrumbClick = (index: number) => {
     const folderItem = breadcrumbDataRef.current[index];
-    if (currentFolder.current === folderItem.id) return;
-    currentFolder.current = folderItem.id;
+    setCurrentFolder(folderItem.name);
 
     const newData = breadcrumbDataRef.current.slice(0, index + 1);
     setBreadcrumbData(newData);
     breadcrumbDataRef.current = newData;
-
-    updateCurrentFolderAndGetData(folderItem.id);
   };
+
   const defultData = [
     {
       title: (
@@ -110,6 +117,7 @@ export default function All({
           <a>{type === TableType.BusinessTable ? "业务模型" : "流程模型"}</a>
         </span>
       ),
+      name: "",
       index: 0,
       id: "root",
       onClick: () => {
@@ -118,9 +126,10 @@ export default function All({
     },
   ];
 
+  type BreadcrumbItemType = BreadcrumbItem & { name: string };
   const [breadcrumbData, setBreadcrumbData] =
-    useState<BreadcrumbItem[]>(defultData);
-  const breadcrumbDataRef = useRef<BreadcrumbItem[]>(breadcrumbData);
+    useState<BreadcrumbItemType[]>(defultData);
+  const breadcrumbDataRef = useRef<BreadcrumbItemType[]>(breadcrumbData);
 
   const getData = (page: number, pageSize: number) => {
     setCurrentPage(page);
@@ -129,7 +138,7 @@ export default function All({
       name: searchName,
       folder: "",
       type,
-    },);
+    });
   };
 
   const FolderIcon = function () {
@@ -142,12 +151,12 @@ export default function All({
 
   const root = {
     id: "root",
-    name: "我的文件",
+    name: "",
     key: "root",
     title: (
       <span>
-        我的文件
-        {currentFolder.current === "root" ? (
+        {type === TableType.BusinessTable ? "业务模型" : "流程模型"}
+        {currentFolder === "" ? (
           <span className="text-12px color-#999">(当前)</span>
         ) : null}
       </span>
@@ -160,14 +169,14 @@ export default function All({
   // 构建文件夹树
   const folderTreeData = useMemo((): TreeDataNode[] => {
     return [
-      folderList.map((item) => {
+      folderData.map((item) => {
         return {
           ...item,
           key: item.id,
           title: (
             <span>
               {item.name}
-              {currentFolder.current === item.id ? (
+              {currentFolder === item.name ? (
                 <span className="text-12px color-#999">(当前)</span>
               ) : null}
             </span>
@@ -176,10 +185,10 @@ export default function All({
         };
       }, root),
     ] as unknown as TreeDataNode[];
-  }, [folderList, currentFolder.current]);
+  }, [folderData, currentFolder]);
 
-  const contextMenu: MenuProps["items"] = [
-    {
+  const contextMenu: MenuProps["items"] = useMemo(() => {
+    const folder = {
       key: "1",
       label: <span className="ml-4px">文件夹</span>,
       icon: <FolderIcon />,
@@ -198,30 +207,32 @@ export default function All({
             />
           ),
           onOk: async () => {
-            // await AddFolder({
-            //   parentId: currentFolder.current,
-            //   name,
-            // });
-            message.success("添加成功");
-            refresh();
+            // 添加文件夹
+            setFolderData([...folderData, { id: uuid(), name }]);
           },
         });
       },
-    },
-    {
+    };
+    const model = {
       key: "2",
       label: <span className="ml-4px">添加模型</span>,
       onClick: async () => {
-        addModelRef.current?.open(type);
+        addModelRef.current?.open(type, currentFolder);
       },
-    },
-  ];
+      icon: (
+        <svg className="iconfont w-14px h-14px m-r-4px">
+          <use xlinkHref="#icon-shujumoxing" />
+        </svg>
+      ),
+    };
 
-  // 更新当前文件夹并获取数据
-  const updateCurrentFolderAndGetData = (folderId: string) => {
-    currentFolder.current = folderId;
-    getData(1, pageSize);
-  };
+    return !currentFolder ? [folder, model] : [model];
+  }, [currentFolder]);
+
+  // 计算模型数据
+  const getDataSource = useMemo(() => {
+    return dataSource.filter((item) => item.directory === currentFolder);
+  }, [dataSource, currentFolder]);
 
   // 打开文件夹
   const handleOpenFolder = (folderItem: { id: string; name: string }) => {
@@ -233,6 +244,7 @@ export default function All({
             <a>{folderItem.name}</a>
           </span>
         ),
+        name: folderItem.name,
         index: breadcrumbData.length,
         id: folderItem.id,
         onClick: () => {
@@ -242,7 +254,7 @@ export default function All({
     ];
     setBreadcrumbData(newData);
     breadcrumbDataRef.current = newData;
-    updateCurrentFolderAndGetData(folderItem.id);
+    setCurrentFolder(folderItem.name);
   };
 
   // 搜索文件
@@ -251,50 +263,59 @@ export default function All({
     getData(1, pageSize);
   };
 
-  const handleOpenFolderModal = (id: string, type: "folder" | "chart") => {
+  const handleOpenFolderModal = (data: any, type: "folder" | "model") => {
     moveSource.current = {
-      id,
+      data,
       type,
     };
     setOpen(true);
   };
 
-  const setMoveSource = (id: string, type: "folder" | "chart") => {
+  const setMoveSource = (data: any, type: "folder" | "model") => {
     moveSource.current = {
-      id,
+      data,
       type,
     };
     setOpen(false);
   };
 
-  const handleAddChange = (id: string) => {
+  const handleAddChange = (id: any) => {
     refresh();
     const { origin, pathname } = window.location;
     const enterpriseCode = sessionStorage.getItem("enterpriseCode");
     window.open(
       `${origin}${pathname}#/detail/${id}?enterpriseCode=${enterpriseCode}`
     );
-  }
+  };
 
-  const handleMove = (targetFolderId: string) => {
-    if (!moveSource.current || targetFolderId === moveSource.current?.id)
+  const handleMove = (targetFolder: string) => {
+    if (
+      !moveSource.current ||
+      targetFolder === moveSource.current?.data?.directory
+    ) {
       return;
-    // Move({
-    //   fileType: moveSource.current.type,
-    //   fileId: moveSource.current.id,
-    //   targetFolderId,
-    // }).then(() => {
-    //   message.success("移动成功");
-    //   refresh();
-    //   setOpen(false);
-    // });
-    if (moveSource.current?.type === "folder") {
-      // refreshFolderAll();
+    }
+    if (moveSource.current?.type === "model") {
+      const newData = {
+        ...moveSource.current.data,
+        directory: targetFolder,
+      };
+      SaveDataModel(newData).then((res) => {
+        setDataSource(
+          dataSource.map((item) => {
+            return item.id === newData.id ? newData : item;
+          })
+        );
+        message.success("移动成功");
+      });
     }
   };
 
-  const handleCopy = (targetFolderId: string) => {
-    if (!moveSource.current || targetFolderId === moveSource.current?.id)
+  const handleCopy = (targetFolder: string) => {
+    if (
+      !moveSource.current ||
+      targetFolder === moveSource.current?.data?.directory
+    )
       return;
     // Copy({
     //   fileType: moveSource.current.type,
@@ -324,13 +345,13 @@ export default function All({
       >
         <div className="flex justify-between items-center m-b-12px">
           <Breadcrumb items={breadcrumbData} />
-          <AddModel ref={addModelRef} onChange={handleAddChange}/>
+          <AddModel ref={addModelRef} onChange={handleAddChange} />
           <div className="right flex items-center gap-12px">
             <Button
               type="primary"
               icon={<PlusOutlined />}
               onClick={() => {
-                addModelRef.current?.open(type);
+                addModelRef.current?.open(type, currentFolder);
               }}
             >
               新建
@@ -367,7 +388,7 @@ export default function All({
           <div>
             {display === "card" ? (
               <>
-                {folderData.length ? (
+                {folderData.length && !currentFolder ? (
                   <>
                     <div className="flex gap-12px flex-wrap">
                       {folderData.map((item, index) => {
@@ -376,7 +397,7 @@ export default function All({
                             key={index}
                             title={item.name}
                             onDragStart={() => {
-                              setMoveSource(item.id, "folder");
+                              setMoveSource(item, "folder");
                             }}
                             onDragEnd={() => {
                               clearMoveSource();
@@ -384,7 +405,7 @@ export default function All({
                           >
                             <DropItem
                               onDrop={() => {
-                                handleMove(item.id);
+                                handleMove(item.name);
                               }}
                             >
                               <Card
@@ -408,80 +429,6 @@ export default function All({
                                           {item.name}
                                         </span>
                                       </span>
-                                      <Dropdown
-                                        menu={{
-                                          items: [
-                                            {
-                                              key: "1",
-                                              label: "重命名",
-                                              onClick: () => {
-                                                let name = item.name;
-                                                confirm({
-                                                  title: "重命名",
-                                                  centered: true,
-                                                  icon: <></>,
-                                                  content: (
-                                                    <Input
-                                                      defaultValue={name}
-                                                      onChange={(e) => {
-                                                        name = e.target.value;
-                                                      }}
-                                                    />
-                                                  ),
-                                                  onOk: async () => {
-                                                    // await EditFolder({
-                                                    //   id: item.id,
-                                                    //   name,
-                                                    // });
-                                                    // refresh();
-                                                    // refreshFolderAll;
-                                                    message.success(
-                                                      "重命名成功"
-                                                    );
-                                                  },
-                                                });
-                                              },
-                                            },
-                                            {
-                                              key: "2",
-                                              label: "移动/复制",
-                                              onClick: () => {
-                                                handleOpenFolderModal(
-                                                  item.id,
-                                                  "folder"
-                                                );
-                                              },
-                                            },
-                                            {
-                                              key: "3",
-                                              label: "删除",
-                                              onClick: () => {
-                                                confirm({
-                                                  title: "删除",
-                                                  content: "确定删除该文件夹?",
-                                                  centered: true,
-                                                  onOk: async () => {
-                                                    // await DeleteFolder({
-                                                    //   id: item.id,
-                                                    // });
-                                                    // message.success("删除成功");
-                                                    // refresh();
-                                                    // refreshFolderAll();
-                                                  },
-                                                });
-                                              },
-                                            },
-                                          ],
-                                          onClick: (e) => {
-                                            e.domEvent.stopPropagation();
-                                          },
-                                        }}
-                                      >
-                                        <MoreOutlined
-                                          className="hidden group-hover/item:inline-block"
-                                          onClick={(e) => e.stopPropagation()}
-                                        />
-                                      </Dropdown>
                                     </span>
                                   }
                                 />
@@ -494,7 +441,7 @@ export default function All({
                   </>
                 ) : null}
                 <Row gutter={[8, 16]}>
-                  {dataSource.map((item, index) => {
+                  {getDataSource.map((item, index) => {
                     return (
                       <Col
                         xs={12}
@@ -508,7 +455,7 @@ export default function All({
                         <DragItem
                           title={item.name}
                           onDragStart={() => {
-                            setMoveSource(item.id, "chart");
+                            setMoveSource(item, "model");
                           }}
                           onDragEnd={() => {
                             clearMoveSource();
@@ -519,7 +466,7 @@ export default function All({
                             onFresh={refresh}
                             onDelete={refresh}
                             onChangeLocation={() =>
-                              handleOpenFolderModal(item.id, "chart")
+                              handleOpenFolderModal(item.id, "model")
                             }
                           />
                         </DragItem>
@@ -542,7 +489,7 @@ export default function All({
                     hideOnSinglePage
                   />
                 </div>
-                {dataSource.length == 0 ? (
+                {getDataSource.length == 0 ? (
                   <Empty description="暂无数据" />
                 ) : null}
               </>
@@ -564,7 +511,7 @@ export default function All({
                     sorter: (a, b) => a.updateTime - b.updateTime,
                   },
                 ]}
-                dataSource={dataSource}
+                dataSource={getDataSource}
                 rowKey={"id"}
                 search={false}
                 pagination={{
@@ -600,7 +547,7 @@ export default function All({
               className="m-r-8px"
               type="primary"
               onClick={() => handleMove(selectFolder)}
-              disabled={selectFolder === currentFolder.current}
+              disabled={selectFolder === currentFolder}
             >
               移动
             </Button>
@@ -612,7 +559,7 @@ export default function All({
       >
         <div className="min-h-300px">
           <Tree
-            treeData={folderTreeData}
+            // treeData={folderTreeData}
             selectedKeys={[selectFolder]}
             onSelect={(keys) => setSelectFolder(keys[0] as string)}
             showIcon