diff --git a/packages/react-components/apps/base/edit/Edit.tsx b/packages/react-components/apps/base/edit/Edit.tsx
new file mode 100644
index 0000000..e69de29
diff --git a/packages/react-components/apps/base/edit/List.tsx b/packages/react-components/apps/base/edit/List.tsx
new file mode 100644
index 0000000..7f05504
--- /dev/null
+++ b/packages/react-components/apps/base/edit/List.tsx
@@ -0,0 +1,214 @@
+// @ts-nocheck
+import { Button, Input, message, Modal, Table } from 'antd';
+import { Fragment, useEffect, useMemo, useState } from 'react';
+import { useDemoStore } from '../store';
+import { useShallow } from 'zustand/react/shallow';
+import { Form } from 'antd';
+import { useNavigate } from 'react-router';
+import { EditOutlined, SettingOutlined, LinkOutlined, SaveOutlined, DeleteOutlined, LeftOutlined } from '@ant-design/icons';
+import clsx from 'clsx';
+import { isObjectNull } from '@/utils/is-null';
+import { CardBlank } from '@/components/card/CardBlank';
+
+const FormModal = () => {
+ const [form] = Form.useForm();
+ const demoStore = useDemoStore(
+ useShallow((state) => {
+ return {
+ showEdit: state.showEdit,
+ setShowEdit: state.setShowEdit,
+ formData: state.formData,
+ updateData: state.updateData,
+ setFormData: state.setFormData,
+ };
+ }),
+ );
+ useEffect(() => {
+ const open = demoStore.showEdit;
+ if (open) {
+ const isNull = isObjectNull(demoStore.formData);
+ if (isNull) {
+ form.setFieldsValue({});
+ } else form.setFieldsValue(demoStore.formData);
+ }
+ }, [demoStore.showEdit]);
+ const onFinish = async (values: any) => {
+ demoStore.updateData(values);
+ };
+ const onClose = () => {
+ demoStore.setShowEdit(false);
+ form.setFieldsValue({});
+ demoStore.setFormData({});
+ };
+ const isEdit = demoStore.formData.id;
+ return (
+ demoStore.setShowEdit(false)}
+ destroyOnClose
+ footer={false}
+ width={800}
+ onCancel={onClose}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+export const List = () => {
+ const navicate = useNavigate();
+ const demoStore = useDemoStore(
+ useShallow((state) => {
+ return {
+ setFormData: state.setFormData,
+ setShowEdit: state.setShowEdit,
+ list: state.list,
+ deleteData: state.deleteData,
+ getList: state.getList,
+ loading: state.loading,
+ updateData: state.updateData,
+ formData: state.formData,
+ };
+ }),
+ );
+ const [codeEdit, setCodeEdit] = useState(false);
+ const [code, setCode] = useState('');
+ useEffect(() => {
+ demoStore.getList();
+ }, []);
+
+ const onAdd = () => {
+ demoStore.setFormData({});
+ demoStore.setShowEdit(true);
+ };
+ return (
+
+
+
+
+ {demoStore.list.length > 0 &&
+ demoStore.list.map((item) => {
+ return (
+
+ {
+ setCode(item.code);
+ demoStore.setFormData(item);
+ setCodeEdit(true);
+ }}>
+
+
{
+ copy(item.code);
+ e.stopPropagation();
+ message.success('copy code success');
+ }}>
+ {item.title || '-'}
+
+
{item.description ? item.description : '-'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ })}
+
+ {demoStore.list.length == 0 && (
+
+ No Data
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ {
+ setCode(value);
+ }}
+ className='h-full max-h-full scrollbar'
+ style={{ overflow: 'auto' }}
+ />
+
+
+
+
+
+ );
+};
diff --git a/packages/react-components/apps/base/store/index.ts b/packages/react-components/apps/base/store/index.ts
new file mode 100644
index 0000000..08c035e
--- /dev/null
+++ b/packages/react-components/apps/base/store/index.ts
@@ -0,0 +1,70 @@
+import { create } from 'zustand';
+// @ts-ignore
+import { query } from '@/modules';
+import { message } from 'antd';
+type DemoStore = {
+ showEdit: boolean;
+ setShowEdit: (showEdit: boolean) => void;
+ formData: any;
+ setFormData: (formData: any) => void;
+ loading: boolean;
+ setLoading: (loading: boolean) => void;
+ list: any[];
+ getList: () => Promise;
+ updateData: (data: any) => Promise;
+ deleteData: (id: string) => Promise;
+};
+export const useDemoStore = create((set, get) => {
+ return {
+ showEdit: false,
+ setShowEdit: (showEdit) => set({ showEdit }),
+ formData: {},
+ setFormData: (formData) => set({ formData }),
+ loading: false,
+ setLoading: (loading) => set({ loading }),
+ list: [],
+ getList: async () => {
+ set({ loading: true });
+
+ const res = await query.post({
+ path: 'demo',
+ key: 'list',
+ });
+ set({ loading: false });
+ if (res.code === 200) {
+ set({ list: res.data });
+ } else {
+ message.error(res.msg || 'Request failed');
+ }
+ },
+ updateData: async (data) => {
+ const { getList } = get();
+ const res = await query.post({
+ path: 'demo',
+ key: 'update',
+ data,
+ });
+ if (res.code === 200) {
+ message.success('Success');
+ set({ showEdit: false, formData: [] });
+ getList();
+ } else {
+ message.error(res.msg || 'Request failed');
+ }
+ },
+ deleteData: async (id) => {
+ const { getList } = get();
+ const res = await query.post({
+ path: 'demo',
+ key: 'delete',
+ id,
+ });
+ if (res.code === 200) {
+ getList();
+ message.success('Success');
+ } else {
+ message.error(res.msg || 'Request failed');
+ }
+ },
+ };
+});
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index 6ba9c58..e8f0492 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -5,3 +5,5 @@ export { Modal, modalStore, BlankModal, DialogModal };
import { createDOMElement } from './utils/dom/create-dom-element';
export { createDOMElement };
+
+export * from './utils';
diff --git a/packages/ui/src/utils/index.ts b/packages/ui/src/utils/index.ts
index 2d3ed6b..66907db 100644
--- a/packages/ui/src/utils/index.ts
+++ b/packages/ui/src/utils/index.ts
@@ -1,2 +1,7 @@
-export * from './query-el';
+export * from './css';
+export * from './extra';
+export * from './history';
+export * from './is-null';
+export * from './nanoid';
export * from './store';
+export * from './query-el';