ez-react-antd 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +608 -119
- package/dist/AdminLayout/AdminLayout.d.ts +34 -3
- package/dist/AdminLayout/AdminLayout.d.ts.map +1 -1
- package/dist/ConfigProvider/index.d.ts +114 -7
- package/dist/ConfigProvider/index.d.ts.map +1 -1
- package/dist/Drawer/Drawer.d.ts +24 -3
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/DrawerRemoteTableSelect/DrawerRemoteTableSelect.d.ts +100 -0
- package/dist/DrawerRemoteTableSelect/DrawerRemoteTableSelect.d.ts.map +1 -0
- package/dist/DrawerRemoteTableSelect/index.d.ts +3 -0
- package/dist/DrawerRemoteTableSelect/index.d.ts.map +1 -0
- package/dist/ErrorNotification/ErrorNotification.d.ts +43 -2
- package/dist/ErrorNotification/ErrorNotification.d.ts.map +1 -1
- package/dist/ErrorPage/ErrorPage.d.ts +14 -0
- package/dist/ErrorPage/ErrorPage.d.ts.map +1 -1
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/useResponsive.d.ts.map +1 -1
- package/dist/ImageUpload/ImageUpload.d.ts +86 -14
- package/dist/ImageUpload/ImageUpload.d.ts.map +1 -1
- package/dist/Link/Link.d.ts +12 -0
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Loading/Loading.d.ts +14 -1
- package/dist/Loading/Loading.d.ts.map +1 -1
- package/dist/ModalAvatar/ModalAvatar.d.ts +33 -0
- package/dist/ModalAvatar/ModalAvatar.d.ts.map +1 -0
- package/dist/ModalAvatar/index.d.ts +3 -0
- package/dist/ModalAvatar/index.d.ts.map +1 -0
- package/dist/NoFoundPage/NoFoundPage.d.ts +14 -0
- package/dist/NoFoundPage/NoFoundPage.d.ts.map +1 -1
- package/dist/NotAuthorizedPage/NotAuthorizedPage.d.ts +14 -0
- package/dist/NotAuthorizedPage/NotAuthorizedPage.d.ts.map +1 -1
- package/dist/Redirect/Redirect.d.ts +28 -2
- package/dist/Redirect/Redirect.d.ts.map +1 -1
- package/dist/RemoteCascader/RemoteCascader.d.ts +48 -13
- package/dist/RemoteCascader/RemoteCascader.d.ts.map +1 -1
- package/dist/RemoteSelect/RemoteSelect.d.ts +73 -19
- package/dist/RemoteSelect/RemoteSelect.d.ts.map +1 -1
- package/dist/RemoteTable/RemoteTable.d.ts +36 -16
- package/dist/RemoteTable/RemoteTable.d.ts.map +1 -1
- package/dist/RemoteTableSelect/RemoteTableSelect.d.ts +39 -2
- package/dist/RemoteTableSelect/RemoteTableSelect.d.ts.map +1 -1
- package/dist/RemoteTree/RemoteTree.d.ts +143 -52
- package/dist/RemoteTree/RemoteTree.d.ts.map +1 -1
- package/dist/ez-react-antd.es.js +4545 -4214
- package/dist/index.css +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/ez-react-antd.umd.js +0 -73
package/README.md
CHANGED
|
@@ -1,68 +1,65 @@
|
|
|
1
|
-
# Ez-Antd
|
|
1
|
+
# Ez-React-Antd
|
|
2
2
|
|
|
3
|
-
基于 Ant Design 的 React
|
|
3
|
+
基于 Ant Design 5.x 的 React 业务组件库,提供开箱即用的企业级组件。
|
|
4
4
|
|
|
5
|
-
## 特性
|
|
5
|
+
## ✨ 特性
|
|
6
6
|
|
|
7
|
-
- 🎨
|
|
8
|
-
- 📦
|
|
9
|
-
- 🔥
|
|
10
|
-
- 🎯
|
|
11
|
-
- 🌈
|
|
7
|
+
- 🎨 **基于 Ant Design 5.x** - 继承 Ant Design 的优秀设计
|
|
8
|
+
- 📦 **开箱即用** - 22+ 业务组件,覆盖常见场景
|
|
9
|
+
- 🔥 **TypeScript** - 完整的类型定义和 JSDoc 注释
|
|
10
|
+
- 🎯 **零依赖打包** - Peer Dependencies 模式,避免重复打包
|
|
11
|
+
- 🌈 **自动样式注入** - 无需手动引入 CSS
|
|
12
|
+
- 📱 **响应式设计** - 自动适配移动端和桌面端
|
|
13
|
+
- 🔗 **Redux 集成** - 与 Redux 无缝集成
|
|
12
14
|
|
|
13
|
-
## 安装
|
|
15
|
+
## 📦 安装
|
|
14
16
|
|
|
15
|
-
###
|
|
17
|
+
### 基础安装
|
|
16
18
|
|
|
17
19
|
```bash
|
|
18
|
-
npm install ez-antd
|
|
20
|
+
npm install ez-react-antd
|
|
19
21
|
```
|
|
20
22
|
|
|
21
|
-
###
|
|
22
|
-
|
|
23
|
-
Ez-antd 需要以下依赖,请确保您的项目中已安装:
|
|
23
|
+
### 必需的 Peer Dependencies
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
npm install react react-dom antd react-redux react-router
|
|
26
|
+
npm install react react-dom antd react-redux react-router redux
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
###
|
|
30
|
-
|
|
31
|
-
根据您使用的组件,可能需要安装额外的依赖:
|
|
29
|
+
### 可选依赖(按需安装)
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
**IconSelect 组件**
|
|
34
32
|
```bash
|
|
35
|
-
npm install @fortawesome/fontawesome-svg-core
|
|
36
|
-
@fortawesome/free-regular-svg-icons \
|
|
37
|
-
@fortawesome/free-solid-svg-icons \
|
|
38
|
-
@fortawesome/react-fontawesome \
|
|
39
|
-
react-select \
|
|
40
|
-
react-window
|
|
33
|
+
npm install @fortawesome/fontawesome-svg-core @fortawesome/free-regular-svg-icons @fortawesome/free-solid-svg-icons @fortawesome/react-fontawesome react-select react-window
|
|
41
34
|
```
|
|
42
35
|
|
|
43
|
-
|
|
36
|
+
**ImageUpload 组件**
|
|
44
37
|
```bash
|
|
45
38
|
npm install antd-img-crop
|
|
46
39
|
```
|
|
47
40
|
|
|
48
|
-
## 快速开始
|
|
41
|
+
## 🚀 快速开始
|
|
49
42
|
|
|
50
43
|
### 1. 配置全局 Provider
|
|
51
44
|
|
|
52
|
-
|
|
45
|
+
在应用入口配置 `ConfigProvider`:
|
|
53
46
|
|
|
54
47
|
```tsx
|
|
55
|
-
import { ConfigProvider } from 'ez-antd';
|
|
56
|
-
import
|
|
48
|
+
import { ConfigProvider } from 'ez-react-antd';
|
|
49
|
+
import request from './utils/request'; // 你的请求工具
|
|
57
50
|
|
|
58
51
|
function App() {
|
|
59
52
|
return (
|
|
60
|
-
<ConfigProvider
|
|
61
|
-
request
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
53
|
+
<ConfigProvider value={{
|
|
54
|
+
request: {
|
|
55
|
+
getRequest: (url, params) => request.get(url, { params }),
|
|
56
|
+
postRequest: (url, data) => request.post(url, data),
|
|
57
|
+
putRequest: (url, data) => request.put(url, data),
|
|
58
|
+
deleteRequest: (url, params) => request.delete(url, { params }),
|
|
59
|
+
},
|
|
60
|
+
responseIsSuccess: (res) => res.status === 200 && res.data.code === 0,
|
|
61
|
+
upload: (url, formData) => request.post(url, formData),
|
|
62
|
+
}}>
|
|
66
63
|
<YourApp />
|
|
67
64
|
</ConfigProvider>
|
|
68
65
|
);
|
|
@@ -72,93 +69,570 @@ function App() {
|
|
|
72
69
|
### 2. 使用组件
|
|
73
70
|
|
|
74
71
|
```tsx
|
|
75
|
-
import { RemoteTable, AdminLayout } from 'ez-antd';
|
|
72
|
+
import { RemoteTable, RemoteSelect, AdminLayout } from 'ez-react-antd';
|
|
73
|
+
|
|
74
|
+
// 远程表格
|
|
75
|
+
<RemoteTable
|
|
76
|
+
modelName="user"
|
|
77
|
+
columns={columns}
|
|
78
|
+
queryParam={{ status: 'active' }}
|
|
79
|
+
/>
|
|
80
|
+
|
|
81
|
+
// 远程下拉选择
|
|
82
|
+
<RemoteSelect
|
|
83
|
+
api="/api/users"
|
|
84
|
+
labelKey="name"
|
|
85
|
+
valueKey="id"
|
|
86
|
+
onChange={(value) => console.log(value)}
|
|
87
|
+
/>
|
|
88
|
+
|
|
89
|
+
// 后台布局
|
|
90
|
+
<AdminLayout
|
|
91
|
+
appName="管理系统"
|
|
92
|
+
menus={menuConfig}
|
|
93
|
+
userInfo={currentUser}
|
|
94
|
+
onLogout={handleLogout}
|
|
95
|
+
>
|
|
96
|
+
<YourContent />
|
|
97
|
+
</AdminLayout>
|
|
98
|
+
```
|
|
76
99
|
|
|
77
|
-
|
|
78
|
-
function UserList() {
|
|
79
|
-
return (
|
|
80
|
-
<RemoteTable
|
|
81
|
-
url="/api/users"
|
|
82
|
-
columns={[
|
|
83
|
-
{ title: '姓名', dataIndex: 'name' },
|
|
84
|
-
{ title: '邮箱', dataIndex: 'email' }
|
|
85
|
-
]}
|
|
86
|
-
/>
|
|
87
|
-
);
|
|
88
|
-
}
|
|
100
|
+
## 📚 组件文档
|
|
89
101
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
### 核心组件
|
|
103
|
+
|
|
104
|
+
#### ConfigProvider
|
|
105
|
+
|
|
106
|
+
全局配置提供者,为所有组件提供统一的请求和响应处理。
|
|
107
|
+
|
|
108
|
+
**Props:**
|
|
109
|
+
- `request` - 请求方法对象(getRequest, postRequest, putRequest, deleteRequest)
|
|
110
|
+
- `responseIsSuccess` - 判断响应是否成功的函数
|
|
111
|
+
- `upload` - 文件上传方法
|
|
112
|
+
|
|
113
|
+
**示例:**
|
|
114
|
+
```tsx
|
|
115
|
+
<ConfigProvider value={{
|
|
116
|
+
request: requestInstance,
|
|
117
|
+
responseIsSuccess: (res) => res.status === 200,
|
|
118
|
+
upload: (url, formData) => axios.post(url, formData)
|
|
119
|
+
}}>
|
|
120
|
+
<App />
|
|
121
|
+
</ConfigProvider>
|
|
105
122
|
```
|
|
106
123
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
-
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
"react-dom": "^18.0.0",
|
|
135
|
-
"antd": "^5.29.3",
|
|
136
|
-
"react-redux": "^9.2.0",
|
|
137
|
-
"react-router": "^7.11.0"
|
|
138
|
-
}
|
|
124
|
+
#### AdminLayout
|
|
125
|
+
|
|
126
|
+
后台管理系统布局组件,支持响应式、主题切换。
|
|
127
|
+
|
|
128
|
+
**Props:**
|
|
129
|
+
- `menus` - 菜单配置数组
|
|
130
|
+
- `appName` - 系统名称(默认: 'System')
|
|
131
|
+
- `appIcon` - 系统图标 URL
|
|
132
|
+
- `userInfo` - 用户信息对象
|
|
133
|
+
- `onLogout` - 退出登录回调
|
|
134
|
+
- `onModifyPassword` - 修改密码回调
|
|
135
|
+
- `fileDownloadUrl` - 文件下载地址
|
|
136
|
+
|
|
137
|
+
**示例:**
|
|
138
|
+
```tsx
|
|
139
|
+
<AdminLayout
|
|
140
|
+
appName="ERP系统"
|
|
141
|
+
appIcon="/logo.png"
|
|
142
|
+
menus={[
|
|
143
|
+
{ name: '首页', path: '/', icon: 'HomeOutlined' },
|
|
144
|
+
{ name: '用户管理', path: '/users', icon: 'UserOutlined' }
|
|
145
|
+
]}
|
|
146
|
+
userInfo={{ name: '张三', avatar: '/avatar.jpg' }}
|
|
147
|
+
onLogout={() => logout()}
|
|
148
|
+
>
|
|
149
|
+
<Routes />
|
|
150
|
+
</AdminLayout>
|
|
139
151
|
```
|
|
140
152
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
### 数据展示组件
|
|
156
|
+
|
|
157
|
+
#### RemoteTable
|
|
158
|
+
|
|
159
|
+
从远程 API 加载分页数据的表格组件,支持响应式布局。
|
|
160
|
+
|
|
161
|
+
**Props:**
|
|
162
|
+
- `modelName` - Redux 模块名称(必需)
|
|
163
|
+
- `columns` - 表格列配置(必需)
|
|
164
|
+
- `queryParam` - 查询参数对象
|
|
165
|
+
- `primaryKey` - 行主键字段名(默认: 'id')
|
|
166
|
+
- `queryMethod` - 查询方法名(默认: 'getPageInfo')
|
|
167
|
+
- `paramName` - 查询参数在 store 中的字段名(默认: 'queryParam')
|
|
168
|
+
- `dataStore` - 分页数据在 store 中的字段名(默认: 'pageData')
|
|
169
|
+
- `title` - 表格标题
|
|
170
|
+
- `rowSelection` - 行选择配置
|
|
171
|
+
- `expandable` - 展开配置
|
|
172
|
+
- `showHeader` - 是否显示表头(默认: true)
|
|
173
|
+
- `scrollSub` - 横向滚动条宽度补偿(默认: 0)
|
|
174
|
+
- `notShowLoading` - 不显示 loading(默认: false)
|
|
175
|
+
|
|
176
|
+
**示例:**
|
|
177
|
+
```tsx
|
|
178
|
+
<RemoteTable
|
|
179
|
+
modelName="user"
|
|
180
|
+
columns={[
|
|
181
|
+
{ title: '姓名', dataIndex: 'name' },
|
|
182
|
+
{ title: '邮箱', dataIndex: 'email' },
|
|
183
|
+
{ title: '操作', render: (_, record) => <Button>编辑</Button> }
|
|
184
|
+
]}
|
|
185
|
+
queryParam={{ status: 'active' }}
|
|
186
|
+
rowSelection={{
|
|
187
|
+
type: 'checkbox',
|
|
188
|
+
onChange: (keys, rows) => console.log(keys, rows)
|
|
189
|
+
}}
|
|
190
|
+
/>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### RemoteTree
|
|
194
|
+
|
|
195
|
+
远程数据树形控件,支持动态加载子节点。
|
|
196
|
+
|
|
197
|
+
**Props:**
|
|
198
|
+
- `api` - 数据请求接口 URL
|
|
199
|
+
- `queryParam` - 查询参数
|
|
200
|
+
- `labelKey` - 显示字段名(默认: 'name')
|
|
201
|
+
- `valueKey` - 值字段名(默认: 'id')
|
|
202
|
+
- `onSelect` - 选中节点回调
|
|
203
|
+
- `checkable` - 是否显示复选框
|
|
204
|
+
- `onCheck` - 复选框选中回调
|
|
205
|
+
|
|
206
|
+
**示例:**
|
|
207
|
+
```tsx
|
|
208
|
+
<RemoteTree
|
|
209
|
+
api="/api/departments"
|
|
210
|
+
labelKey="name"
|
|
211
|
+
valueKey="id"
|
|
212
|
+
checkable
|
|
213
|
+
onCheck={(checkedKeys) => console.log(checkedKeys)}
|
|
214
|
+
/>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
#### IconSelect
|
|
218
|
+
|
|
219
|
+
图标选择器,支持 Ant Design Icons 和 FontAwesome 图标。
|
|
220
|
+
|
|
221
|
+
**Props:**
|
|
222
|
+
- `value` - 当前选中的图标值
|
|
223
|
+
- `onChange` - 选中变化回调
|
|
224
|
+
|
|
225
|
+
**示例:**
|
|
226
|
+
```tsx
|
|
227
|
+
<IconSelect
|
|
228
|
+
value={iconValue}
|
|
229
|
+
onChange={(value) => setIconValue(value)}
|
|
230
|
+
/>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
### 表单组件
|
|
236
|
+
|
|
237
|
+
#### RemoteSelect
|
|
238
|
+
|
|
239
|
+
从远程 API 加载选项的下拉选择框。
|
|
240
|
+
|
|
241
|
+
**Props:**
|
|
242
|
+
- `api` - 数据请求接口 URL(必需)
|
|
243
|
+
- `labelKey` - 显示字段名(默认: 'name')
|
|
244
|
+
- `valueKey` - 值字段名(默认: 'id')
|
|
245
|
+
- `queryParam` - 查询参数对象
|
|
246
|
+
- `needQueryParam` - 是否需要参数才请求(默认: false)
|
|
247
|
+
- `placeholder` - 占位提示(默认: '请选择')
|
|
248
|
+
- `allowClear` - 允许清除(默认: true)
|
|
249
|
+
- `showSearch` - 显示搜索(默认: true)
|
|
250
|
+
- `selectedFirst` - 默认选中第一个(默认: false)
|
|
251
|
+
- `metaDataInValue` - 返回原始数据(默认: false)
|
|
252
|
+
- `mode` - 选择模式('multiple' | 'tags')
|
|
253
|
+
- `disabled` - 是否禁用
|
|
254
|
+
- `onChange` - 选中变化回调
|
|
255
|
+
- `onLoadingChange` - 加载状态变化回调
|
|
256
|
+
|
|
257
|
+
**示例:**
|
|
258
|
+
```tsx
|
|
259
|
+
<RemoteSelect
|
|
260
|
+
api="/api/users"
|
|
261
|
+
labelKey="name"
|
|
262
|
+
valueKey="id"
|
|
263
|
+
queryParam={{ department: 'IT' }}
|
|
264
|
+
onChange={(value) => console.log(value)}
|
|
265
|
+
showSearch
|
|
266
|
+
allowClear
|
|
267
|
+
/>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
#### RemoteCascader
|
|
271
|
+
|
|
272
|
+
远程级联选择器,支持动态加载子节点。
|
|
273
|
+
|
|
274
|
+
**Props:**
|
|
275
|
+
- `api` - 数据请求接口 URL(必需)
|
|
276
|
+
- `labelKey` - 显示字段名(默认: 'name')
|
|
277
|
+
- `valueKey` - 值字段名(默认: 'id')
|
|
278
|
+
- `queryParam` - 查询参数
|
|
279
|
+
- `defaultParam` - 默认参数(会合并到每次请求)
|
|
280
|
+
- `initValue` - 初始值
|
|
281
|
+
- `value` - 当前值
|
|
282
|
+
- `placeholder` - 占位提示
|
|
283
|
+
- `allowClear` - 允许清除
|
|
284
|
+
- `onChange` - 选中变化回调
|
|
285
|
+
- `onLoadSonData` - 加载子节点参数构造函数
|
|
286
|
+
|
|
287
|
+
**示例:**
|
|
288
|
+
```tsx
|
|
289
|
+
<RemoteCascader
|
|
290
|
+
api="/api/regions"
|
|
291
|
+
labelKey="name"
|
|
292
|
+
valueKey="code"
|
|
293
|
+
initValue={['110000', '110100']}
|
|
294
|
+
onChange={(values) => console.log(values)}
|
|
295
|
+
onLoadSonData={(option) => ({ parentId: option.value })}
|
|
296
|
+
/>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
#### SearchBar
|
|
300
|
+
|
|
301
|
+
搜索栏组件,与 Redux 集成,支持展开/收起。
|
|
302
|
+
|
|
303
|
+
**Props:**
|
|
304
|
+
- `modelName` - Redux 模块名称(必需)
|
|
305
|
+
- `moreItem` - 更多搜索条件(展开后显示)
|
|
306
|
+
- `disabled` - 禁用所有按钮
|
|
307
|
+
- `paramName` - 查询参数字段名(默认: 'queryParam')
|
|
308
|
+
- `dataStore` - 数据存储字段名(默认: 'pageData')
|
|
309
|
+
- `queryMethod` - 查询方法名(默认: 'getPageInfo')
|
|
310
|
+
- `onValuesChange` - 表单值变化回调
|
|
311
|
+
- `onSearch` - 搜索前数据处理函数
|
|
312
|
+
- `showAddMenu` - 显示新增按钮
|
|
313
|
+
- `showDeleteMenu` - 显示删除按钮
|
|
314
|
+
- `addMenuName` - 新增按钮文本(默认: '新增')
|
|
315
|
+
- `deleteMenuName` - 删除按钮文本(默认: '删除')
|
|
316
|
+
- `onClickAdd` - 新增按钮回调
|
|
317
|
+
- `onClickDelete` - 删除按钮回调
|
|
318
|
+
|
|
319
|
+
**示例:**
|
|
320
|
+
```tsx
|
|
321
|
+
<SearchBar modelName="user" showAddMenu onClickAdd={handleAdd}>
|
|
322
|
+
<SearchBar.Item label="用户名" name="username">
|
|
323
|
+
<Input placeholder="请输入用户名" />
|
|
324
|
+
</SearchBar.Item>
|
|
325
|
+
<SearchBar.Item label="状态" name="status">
|
|
326
|
+
<Select options={statusOptions} />
|
|
327
|
+
</SearchBar.Item>
|
|
328
|
+
</SearchBar>
|
|
152
329
|
```
|
|
153
330
|
|
|
154
|
-
|
|
331
|
+
#### ImageUpload
|
|
332
|
+
|
|
333
|
+
图片上传组件,支持裁剪和 base64。
|
|
334
|
+
|
|
335
|
+
**Props:**
|
|
336
|
+
- `limit` - 张数限制(默认: 1)
|
|
337
|
+
- `aspect` - 裁切宽高比(默认: 1)
|
|
338
|
+
- `showGrid` - 显示裁切网格(默认: true)
|
|
339
|
+
- `quality` - 图片质量 0-1(默认: 1)
|
|
340
|
+
- `rotationSlider` - 启用旋转
|
|
341
|
+
- `cropShape` - 裁切形状('rect' | 'round',默认: 'rect')
|
|
342
|
+
- `value` - 图片地址
|
|
343
|
+
- `onChange` - 变化回调
|
|
344
|
+
- `enabledUpload` - 启用上传到服务器(默认: true)
|
|
345
|
+
- `disabled` - 是否禁用
|
|
346
|
+
- `needCrop` - 是否需要裁剪(默认: true)
|
|
347
|
+
- `uploadUrl` - 上传接口地址
|
|
348
|
+
|
|
349
|
+
**示例:**
|
|
350
|
+
```tsx
|
|
351
|
+
<ImageUpload
|
|
352
|
+
value={imageUrl}
|
|
353
|
+
onChange={(url) => setImageUrl(url)}
|
|
354
|
+
uploadUrl="/api/upload"
|
|
355
|
+
cropShape="round"
|
|
356
|
+
aspect={1}
|
|
357
|
+
/>
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
#### RemoteTableSelect
|
|
361
|
+
|
|
362
|
+
表格选择器,在模态框中显示表格进行选择。
|
|
363
|
+
|
|
364
|
+
**Props:**
|
|
365
|
+
- 继承 `RemoteTable` 的所有属性
|
|
366
|
+
- `placeholder` - 占位提示
|
|
367
|
+
- `limit` - 最大可选数量(默认: 无限制)
|
|
368
|
+
- `labelKey` - 显示字段名(默认: 'name')
|
|
369
|
+
- `labelRender` - 自定义标签渲染函数
|
|
370
|
+
- `showSort` - 显示排序按钮(默认: false)
|
|
371
|
+
- `disabled` - 是否禁用
|
|
372
|
+
- `value` - 当前值
|
|
373
|
+
- `onChange` - 变化回调
|
|
374
|
+
|
|
375
|
+
**示例:**
|
|
376
|
+
```tsx
|
|
377
|
+
<RemoteTableSelect
|
|
378
|
+
modelName="product"
|
|
379
|
+
columns={columns}
|
|
380
|
+
labelKey="name"
|
|
381
|
+
limit={5}
|
|
382
|
+
showSort
|
|
383
|
+
onChange={(selected) => console.log(selected)}
|
|
384
|
+
/>
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
#### DrawerRemoteTableSelect
|
|
388
|
+
|
|
389
|
+
抽屉式表格选择器。
|
|
390
|
+
|
|
391
|
+
**Props:**
|
|
392
|
+
- 继承 `RemoteTable` 的所有属性
|
|
393
|
+
- `limit` - 最大可选数量
|
|
394
|
+
- `open` - 是否打开抽屉
|
|
395
|
+
- `onClose` - 关闭回调
|
|
396
|
+
- `width` - 抽屉宽度
|
|
397
|
+
- `title` - 抽屉标题
|
|
398
|
+
- `onSearch` - 搜索回调
|
|
399
|
+
- `returnSourceData` - 返回原始数据(默认: false)
|
|
400
|
+
- `value` - 当前值
|
|
401
|
+
- `onChange` - 变化回调
|
|
402
|
+
|
|
403
|
+
**示例:**
|
|
404
|
+
```tsx
|
|
405
|
+
<DrawerRemoteTableSelect
|
|
406
|
+
modelName="user"
|
|
407
|
+
columns={columns}
|
|
408
|
+
open={visible}
|
|
409
|
+
onClose={() => setVisible(false)}
|
|
410
|
+
title="选择用户"
|
|
411
|
+
limit={10}
|
|
412
|
+
onChange={(selected) => console.log(selected)}
|
|
413
|
+
/>
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
#### RemoteModalSelect
|
|
417
|
+
|
|
418
|
+
模态框表格选择器。
|
|
419
|
+
|
|
420
|
+
**Props:**
|
|
421
|
+
- `primaryKey` - 主键字段(默认: 'id')
|
|
422
|
+
- `limit` - 最大可选数量
|
|
423
|
+
- `disabled` - 是否禁用
|
|
424
|
+
- `onSubmit` - 提交回调
|
|
425
|
+
- `value` - 当前值
|
|
426
|
+
- `tableProp` - 表格属性配置
|
|
427
|
+
|
|
428
|
+
**示例:**
|
|
429
|
+
```tsx
|
|
430
|
+
<RemoteModalSelect
|
|
431
|
+
tableProp={{
|
|
432
|
+
modelName: 'product',
|
|
433
|
+
columns: columns
|
|
434
|
+
}}
|
|
435
|
+
limit={5}
|
|
436
|
+
onSubmit={(selected) => console.log(selected)}
|
|
437
|
+
/>
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
### UI 组件
|
|
443
|
+
|
|
444
|
+
#### Link
|
|
445
|
+
|
|
446
|
+
链接组件,基于 react-router 的 Link 封装。
|
|
447
|
+
|
|
448
|
+
**Props:**
|
|
449
|
+
- `to` - 跳转路径(必需)
|
|
450
|
+
- `children` - 子元素
|
|
451
|
+
|
|
452
|
+
**示例:**
|
|
453
|
+
```tsx
|
|
454
|
+
<Link to="/dashboard">前往控制台</Link>
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
#### Loading
|
|
458
|
+
|
|
459
|
+
加载组件,在内容上方显示加载动画。
|
|
460
|
+
|
|
461
|
+
**Props:**
|
|
462
|
+
- `loading` - 是否显示加载状态(默认: false)
|
|
463
|
+
- `children` - 子组件内容
|
|
464
|
+
|
|
465
|
+
**示例:**
|
|
466
|
+
```tsx
|
|
467
|
+
<Loading loading={isLoading}>
|
|
468
|
+
<YourContent />
|
|
469
|
+
</Loading>
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
#### ModalAvatar
|
|
473
|
+
|
|
474
|
+
模态框头像组件,点击预览大图。
|
|
475
|
+
|
|
476
|
+
**Props:**
|
|
477
|
+
- `src` - 图片地址(必需)
|
|
478
|
+
|
|
479
|
+
**示例:**
|
|
480
|
+
```tsx
|
|
481
|
+
<ModalAvatar src="/avatar.jpg" />
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
#### Drawer
|
|
485
|
+
|
|
486
|
+
抽屉组件,自定义关闭按钮样式。
|
|
487
|
+
|
|
488
|
+
**Props:**
|
|
489
|
+
- 继承 Ant Design Drawer 的所有属性
|
|
490
|
+
- `closeTxt` - 关闭按钮文本(默认: '关闭')
|
|
491
|
+
- `title` - 抽屉标题
|
|
492
|
+
- `onClose` - 关闭回调
|
|
493
|
+
|
|
494
|
+
**示例:**
|
|
495
|
+
```tsx
|
|
496
|
+
<Drawer
|
|
497
|
+
open={visible}
|
|
498
|
+
title="详情"
|
|
499
|
+
onClose={handleClose}
|
|
500
|
+
closeTxt="取消"
|
|
501
|
+
>
|
|
502
|
+
<YourContent />
|
|
503
|
+
</Drawer>
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
#### Grid
|
|
507
|
+
|
|
508
|
+
响应式网格组件,监听窗口大小变化。
|
|
509
|
+
|
|
510
|
+
**Props:**
|
|
511
|
+
- `onChange` - 窗口大小变化回调
|
|
512
|
+
- `responsive` - 响应式类型('xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl')
|
|
513
|
+
- `style` - 自定义样式
|
|
514
|
+
- `debounceDelay` - 防抖延迟(默认: 150ms)
|
|
515
|
+
|
|
516
|
+
**示例:**
|
|
517
|
+
```tsx
|
|
518
|
+
<Grid
|
|
519
|
+
onChange={(type, width) => console.log(type, width)}
|
|
520
|
+
responsive={['lg', 'xl', 'xxl']}
|
|
521
|
+
>
|
|
522
|
+
<DesktopContent />
|
|
523
|
+
</Grid>
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
### 页面组件
|
|
529
|
+
|
|
530
|
+
#### ErrorPage
|
|
531
|
+
|
|
532
|
+
500 错误页面。
|
|
533
|
+
|
|
534
|
+
**Props:**
|
|
535
|
+
- `status` - 状态码(默认: 500)
|
|
536
|
+
- `title` - 标题
|
|
537
|
+
- `subTitle` - 副标题
|
|
538
|
+
- `onBackHome` - 返回首页回调
|
|
539
|
+
|
|
540
|
+
**示例:**
|
|
541
|
+
```tsx
|
|
542
|
+
<ErrorPage
|
|
543
|
+
status={500}
|
|
544
|
+
title="服务器错误"
|
|
545
|
+
subTitle="抱歉,服务器出错了"
|
|
546
|
+
onBackHome={() => navigate('/')}
|
|
547
|
+
/>
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
#### NoFoundPage
|
|
551
|
+
|
|
552
|
+
404 页面。
|
|
553
|
+
|
|
554
|
+
**Props:**
|
|
555
|
+
- `status` - 状态码(默认: 404)
|
|
556
|
+
- `title` - 标题
|
|
557
|
+
- `subTitle` - 副标题
|
|
558
|
+
- `onBackHome` - 返回首页回调
|
|
559
|
+
|
|
560
|
+
**示例:**
|
|
561
|
+
```tsx
|
|
562
|
+
<NoFoundPage onBackHome={() => navigate('/')} />
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
#### NotAuthorizedPage
|
|
566
|
+
|
|
567
|
+
403 权限页面。
|
|
568
|
+
|
|
569
|
+
**Props:**
|
|
570
|
+
- `status` - 状态码(默认: 403)
|
|
571
|
+
- `title` - 标题
|
|
572
|
+
- `subTitle` - 副标题
|
|
573
|
+
- `onBackHome` - 返回首页回调
|
|
574
|
+
|
|
575
|
+
**示例:**
|
|
576
|
+
```tsx
|
|
577
|
+
<NotAuthorizedPage onBackHome={() => navigate('/')} />
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
#### Redirect
|
|
581
|
+
|
|
582
|
+
路由重定向组件。
|
|
583
|
+
|
|
584
|
+
**Props:**
|
|
585
|
+
- `from` - 源路径(可选,不提供则无条件重定向)
|
|
586
|
+
- `to` - 目标路径(必需)
|
|
587
|
+
- `state` - 传递的状态
|
|
588
|
+
|
|
589
|
+
**示例:**
|
|
590
|
+
```tsx
|
|
591
|
+
<Redirect from="/old-path" to="/new-path" />
|
|
592
|
+
<Redirect to="/home" /> {/* 无条件重定向 */}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
### 通知组件
|
|
598
|
+
|
|
599
|
+
#### ErrorNotification
|
|
600
|
+
|
|
601
|
+
错误通知组件,用于在 notification 中显示格式化的错误信息。
|
|
602
|
+
|
|
603
|
+
**Props:**
|
|
604
|
+
- `data` - 错误数据对象(包含 msg 和 code)
|
|
605
|
+
- `message` - 错误消息
|
|
606
|
+
- `title` - 标题(默认: '错误信息:')
|
|
607
|
+
- `titleStyle` - 标题样式
|
|
608
|
+
- `contentStyle` - 内容样式
|
|
609
|
+
- `containerStyle` - 容器样式
|
|
610
|
+
|
|
611
|
+
**示例:**
|
|
612
|
+
```tsx
|
|
613
|
+
import React from 'react';
|
|
614
|
+
import { notification } from 'antd';
|
|
615
|
+
import { ErrorNotification } from 'ez-react-antd';
|
|
616
|
+
|
|
617
|
+
const description = React.createElement(ErrorNotification, {
|
|
618
|
+
data: { code: 500, msg: '服务器错误' }
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
notification.error({
|
|
622
|
+
message: '错误代码:500',
|
|
623
|
+
description: description,
|
|
624
|
+
duration: 10
|
|
625
|
+
});
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
## 🔧 开发
|
|
155
629
|
|
|
156
630
|
```bash
|
|
157
631
|
# 安装依赖
|
|
158
632
|
npm install
|
|
159
633
|
|
|
160
|
-
#
|
|
161
|
-
npm run
|
|
634
|
+
# 开发模式(监听文件变化)
|
|
635
|
+
npm run watch
|
|
162
636
|
|
|
163
637
|
# 构建
|
|
164
638
|
npm run build
|
|
@@ -170,18 +644,33 @@ npm run type-check
|
|
|
170
644
|
npm run lint
|
|
171
645
|
```
|
|
172
646
|
|
|
173
|
-
##
|
|
647
|
+
## 📝 TypeScript
|
|
174
648
|
|
|
175
|
-
|
|
649
|
+
所有组件都提供完整的 TypeScript 类型定义和 JSDoc 注释,IDE 会自动提示属性和方法说明。
|
|
176
650
|
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
651
|
+
```tsx
|
|
652
|
+
import { RemoteSelect, RemoteSelectProp } from 'ez-react-antd';
|
|
653
|
+
|
|
654
|
+
// 完整的类型提示
|
|
655
|
+
const props: RemoteSelectProp = {
|
|
656
|
+
api: '/api/users',
|
|
657
|
+
labelKey: 'name',
|
|
658
|
+
valueKey: 'id',
|
|
659
|
+
onChange: (value) => console.log(value)
|
|
660
|
+
};
|
|
183
661
|
```
|
|
184
662
|
|
|
185
|
-
##
|
|
663
|
+
## 🌐 浏览器支持
|
|
664
|
+
|
|
665
|
+
- Chrome >= 90
|
|
666
|
+
- Firefox >= 88
|
|
667
|
+
- Safari >= 14
|
|
668
|
+
- Edge >= 90
|
|
669
|
+
|
|
670
|
+
## 📄 License
|
|
186
671
|
|
|
187
672
|
MIT
|
|
673
|
+
|
|
674
|
+
## 🤝 贡献
|
|
675
|
+
|
|
676
|
+
欢迎提交 Issue 和 Pull Request!
|