@xmszm/core 0.0.1 → 0.0.3
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 +187 -0
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +1431 -1170
- package/dist/plugin/vite/initRouteMeta.cjs +1 -0
- package/dist/plugin/vite/initRouteMeta.mjs +13 -0
- package/dist/style.css +1 -1
- package/docs/.vitepress/config.mjs +91 -0
- package/docs/components/config-options.md +125 -0
- package/docs/components/dataform.md +176 -23
- package/docs/components/datatable.md +58 -39
- package/docs/components/dialog.md +158 -19
- package/docs/components/options.md +44 -15
- package/docs/components/query.md +68 -14
- package/docs/components/utils.md +124 -16
- package/docs/guide/changelog.md +81 -0
- package/docs/guide/config.md +415 -0
- package/docs/guide/demo.md +2 -2
- package/docs/guide/local-development.md +109 -0
- package/docs/guide/quickstart.md +40 -11
- package/docs/index.md +3 -3
- package/docs/usage.md +30 -6
- package/examples/README.md +46 -0
- package/examples/index.html +14 -0
- package/examples/package.json +25 -0
- package/examples/pnpm-lock.yaml +1569 -0
- package/examples/pnpm-workspace.yaml +3 -0
- package/examples/src/AdminSystem.vue +870 -0
- package/examples/src/App.vue +330 -0
- package/examples/src/Introduction.vue +307 -0
- package/examples/src/main.js +22 -0
- package/examples/src/utils/permission.js +16 -0
- package/examples/src/utils/request.js +10 -0
- package/examples/vite.config.js +41 -0
- package/package.json +13 -4
- package/src/dialog/commonDialog.tsx +285 -0
- package/src/dialog/useCommonDialog.ts +41 -0
- package/src/dialog/utils/{dialog.js → dialog.ts} +2 -0
- package/src/directives/auto-register.ts +57 -0
- package/src/directives/permission.ts +67 -0
- package/src/enum/sort.tsx +45 -0
- package/src/form/DataForm.vue +34 -52
- package/src/index.ts +58 -0
- package/src/list/{useList.jsx → useList.tsx} +49 -14
- package/src/options/{Options.jsx → Options.tsx} +86 -72
- package/src/options/defaultOptions.tsx +656 -0
- package/src/plugin/index.ts +20 -0
- package/src/query/CommonQuery.vue +65 -90
- package/src/table/DataTable.vue +82 -95
- package/src/table/opr/{DataColumnCollet.jsx → DataColumnCollet.tsx} +18 -8
- package/src/table/opr/useDataColumn.tsx +226 -0
- package/src/table/opr/{useDataColumnButton.jsx → useDataColumnButton.tsx} +13 -6
- package/src/table/opr/{useDataColumnPop.jsx → useDataColumnPop.tsx} +13 -5
- package/src/table/opr/useQRCode.ts +40 -0
- package/src/utils/{array.js → array.ts} +4 -6
- package/src/utils/config.ts +192 -0
- package/src/utils/dialog.ts +110 -0
- package/src/utils/{object.js → object.ts} +1 -0
- package/src/utils/upload.ts +53 -0
- package/types/auto-imports.d.ts +78 -0
- package/types/components.d.ts +402 -0
- package/types/index.d.ts +145 -7
- package/types/plugin/vite/initRouteMeta.d.ts +23 -0
- package/types/src.d.ts +55 -0
- package/types/vue-shim.d.ts +9 -0
- package/examples/demo.vue +0 -224
- package/src/dialog/commonDialog.jsx +0 -230
- package/src/enum/sort.jsx +0 -31
- package/src/index.js +0 -46
- package/src/options/defaultOptions.jsx +0 -580
- package/src/table/opr/useDataColumn.jsx +0 -196
- package/src/utils/upload.js +0 -46
- /package/src/enum/{options.js → options.ts} +0 -0
- /package/src/plugin/vite/{initRouteMeta.js → initRouteMeta.ts} +0 -0
- /package/src/store/utils/{index.js → index.ts} +0 -0
- /package/src/table/utils/{ellipsis.js → ellipsis.ts} +0 -0
- /package/src/utils/{auth.js → auth.ts} +0 -0
- /package/src/utils/{time.js → time.ts} +0 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 初始化配置
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 初始化配置
|
|
6
|
+
|
|
7
|
+
`@xmszm/core` 提供了统一的初始化配置系统,用于管理外部依赖、业务配置和自定义选项注册。
|
|
8
|
+
|
|
9
|
+
## 配置概览
|
|
10
|
+
|
|
11
|
+
| 配置项 | 说明 | 相关文档 |
|
|
12
|
+
|--------|------|----------|
|
|
13
|
+
| `setupConfig` | 全局配置(baseURL、权限、上传等) | 见下方说明 |
|
|
14
|
+
| `setupOptions` | 注册自定义 Options 控件类型 | 见 [Options 注册](#options-注册) |
|
|
15
|
+
| `registerDialogInstance` | 注册 Dialog 实例(可选) | 见 [Dialog 配置](#dialog-配置) |
|
|
16
|
+
|
|
17
|
+
## setupConfig - 全局配置
|
|
18
|
+
|
|
19
|
+
`setupConfig` 用于配置全局设置,包括 API 地址、权限检查、上传方法等。
|
|
20
|
+
|
|
21
|
+
在应用启动时,使用 `setupConfig` 进行统一配置:
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
import { setupConfig } from '@xmszm/core'
|
|
25
|
+
import axios from 'axios'
|
|
26
|
+
|
|
27
|
+
// 初始化配置
|
|
28
|
+
setupConfig({
|
|
29
|
+
// API 基础地址(用于文件 URL 拼接)
|
|
30
|
+
baseURL: 'https://api.example.com',
|
|
31
|
+
|
|
32
|
+
// 权限检查函数
|
|
33
|
+
hasPermission: (permission) => {
|
|
34
|
+
// 你的权限检查逻辑
|
|
35
|
+
const permissions = getPermissions() // 从 store、context 等获取权限列表
|
|
36
|
+
return permissions.includes(permission)
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
// 上传方法
|
|
40
|
+
uploadMethod: (config) => {
|
|
41
|
+
// 你的上传实现
|
|
42
|
+
return axios.request(config)
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 配置项说明
|
|
48
|
+
|
|
49
|
+
### baseURL
|
|
50
|
+
|
|
51
|
+
API 基础地址,用于 `getFileUrl` 函数拼接文件 URL。
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
import { setupConfig, getFileUrl } from '@xmszm/core'
|
|
55
|
+
|
|
56
|
+
setupConfig({
|
|
57
|
+
baseURL: 'https://api.example.com'
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// 使用
|
|
61
|
+
const url = getFileUrl('/images/avatar.jpg')
|
|
62
|
+
// => 'https://api.example.com/images/avatar.jpg'
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### hasPermission
|
|
66
|
+
|
|
67
|
+
权限检查函数,用于表格操作列的权限过滤。
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
import { setupConfig } from '@xmszm/core'
|
|
71
|
+
|
|
72
|
+
setupConfig({
|
|
73
|
+
hasPermission: (permission) => {
|
|
74
|
+
// 从 Vuex/Pinia store 获取权限
|
|
75
|
+
const store = useStore()
|
|
76
|
+
return store.state.permissions.includes(permission)
|
|
77
|
+
|
|
78
|
+
// 或从 localStorage 获取
|
|
79
|
+
// const permissions = JSON.parse(localStorage.getItem('permissions') || '[]')
|
|
80
|
+
// return permissions.includes(permission)
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
// 在 createActionColumnJsx 中使用
|
|
85
|
+
const opr = createActionColumnJsx([
|
|
86
|
+
{
|
|
87
|
+
label: '编辑',
|
|
88
|
+
permission: 'user:edit', // 会调用 hasPermission('user:edit')
|
|
89
|
+
onClick: (row) => edit(row)
|
|
90
|
+
}
|
|
91
|
+
])
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### uploadMethod
|
|
95
|
+
|
|
96
|
+
上传方法实现,用于 `customUpload` 函数。
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
import { setupConfig, customUpload } from '@xmszm/core'
|
|
100
|
+
import axios from 'axios'
|
|
101
|
+
|
|
102
|
+
setupConfig({
|
|
103
|
+
uploadMethod: (config) => {
|
|
104
|
+
return axios.request({
|
|
105
|
+
...config,
|
|
106
|
+
headers: {
|
|
107
|
+
'Authorization': `Bearer ${getToken()}`,
|
|
108
|
+
...config.headers
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
// 使用
|
|
115
|
+
await customUpload({
|
|
116
|
+
url: '/upload',
|
|
117
|
+
method: 'POST',
|
|
118
|
+
data: formData
|
|
119
|
+
})
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## 兼容旧版 API
|
|
123
|
+
|
|
124
|
+
为了向后兼容,仍然支持旧的 API:
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
import { registryUpload } from '@xmszm/core'
|
|
128
|
+
|
|
129
|
+
// 旧版方式(仍然可用,但不推荐)
|
|
130
|
+
registryUpload((config) => axios.request(config))
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 获取配置
|
|
134
|
+
|
|
135
|
+
如果需要获取当前配置:
|
|
136
|
+
|
|
137
|
+
```javascript
|
|
138
|
+
import { getConfig, getBaseURL, getHasPermission, getUploadMethod } from '@xmszm/core'
|
|
139
|
+
|
|
140
|
+
// 获取所有配置
|
|
141
|
+
const config = getConfig()
|
|
142
|
+
|
|
143
|
+
// 获取单个配置
|
|
144
|
+
const baseURL = getBaseURL()
|
|
145
|
+
const hasPermission = getHasPermission()
|
|
146
|
+
const uploadMethod = getUploadMethod()
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## 完整示例
|
|
150
|
+
|
|
151
|
+
```javascript
|
|
152
|
+
// main.js
|
|
153
|
+
import { createApp } from 'vue'
|
|
154
|
+
import { setupConfig } from '@xmszm/core'
|
|
155
|
+
import App from './App.vue'
|
|
156
|
+
import axios from 'axios'
|
|
157
|
+
import { useStore } from './store'
|
|
158
|
+
|
|
159
|
+
const app = createApp(App)
|
|
160
|
+
|
|
161
|
+
// 配置库
|
|
162
|
+
setupConfig({
|
|
163
|
+
baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000',
|
|
164
|
+
|
|
165
|
+
hasPermission: (permission) => {
|
|
166
|
+
const store = useStore()
|
|
167
|
+
return store.state.user.permissions?.includes(permission) ?? false
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
uploadMethod: (config) => {
|
|
171
|
+
return axios.request({
|
|
172
|
+
...config,
|
|
173
|
+
headers: {
|
|
174
|
+
'Authorization': `Bearer ${localStorage.getItem('token')}`,
|
|
175
|
+
...config.headers
|
|
176
|
+
}
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
app.mount('#app')
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Options 注册(setupOptions) {#options-注册}
|
|
185
|
+
|
|
186
|
+
`setupOptions` 允许你注册自定义的控件类型,扩展 `Options` 组件的功能。
|
|
187
|
+
|
|
188
|
+
### 基础用法
|
|
189
|
+
|
|
190
|
+
```javascript
|
|
191
|
+
import { setupOptions } from '@xmszm/core'
|
|
192
|
+
import { NCascader } from 'naive-ui'
|
|
193
|
+
|
|
194
|
+
// 注册一个级联选择器控件
|
|
195
|
+
setupOptions('cascader', (item, { _value, _isRead, labelField, valueField }) => {
|
|
196
|
+
const { key, label, props, options = [] } = item
|
|
197
|
+
|
|
198
|
+
return _isRead ? (
|
|
199
|
+
<div>{_value[key]}</div>
|
|
200
|
+
) : (
|
|
201
|
+
<NCascader
|
|
202
|
+
v-model:value={_value[key]}
|
|
203
|
+
options={options}
|
|
204
|
+
placeholder={`请选择${label}`}
|
|
205
|
+
{...props}
|
|
206
|
+
/>
|
|
207
|
+
)
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 注册参数说明
|
|
212
|
+
|
|
213
|
+
| 参数 | 类型 | 说明 |
|
|
214
|
+
|------|------|------|
|
|
215
|
+
| `key` | `string` | 控件类型标识,如 `'cascader'`、`'customInput'` 等。注意:不能与内置类型重复(如 `input`、`select` 等) |
|
|
216
|
+
| `fn` | `Function` | 渲染函数,接收两个参数:<br/>1. `item`: 配置项对象(包含 `key`、`label`、`props`、`options` 等)<br/>2. `context`: 上下文对象 `{ _value, _isRead, labelField, valueField, _formRef }`<br/><br/>函数应返回一个 VNode 或 JSX 元素 |
|
|
217
|
+
|
|
218
|
+
### 使用自定义控件
|
|
219
|
+
|
|
220
|
+
注册后,在 `options` 配置中使用 `way` 字段指定你注册的类型:
|
|
221
|
+
|
|
222
|
+
```javascript
|
|
223
|
+
const options = [
|
|
224
|
+
{ key: 'region', label: '地区', way: 'cascader', options: regionOptions },
|
|
225
|
+
{ key: 'custom', label: '自定义', way: 'customInput' },
|
|
226
|
+
]
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### 完整示例
|
|
230
|
+
|
|
231
|
+
```javascript
|
|
232
|
+
// main.js
|
|
233
|
+
import { createApp } from 'vue'
|
|
234
|
+
import { setupOptions, setupConfig } from '@xmszm/core'
|
|
235
|
+
import { NCascader, NColorPicker } from 'naive-ui'
|
|
236
|
+
import App from './App.vue'
|
|
237
|
+
|
|
238
|
+
// 注册级联选择器控件
|
|
239
|
+
setupOptions('cascader', (item, { _value, _isRead }) => {
|
|
240
|
+
const { key, label, props, options = [] } = item
|
|
241
|
+
return _isRead ? (
|
|
242
|
+
<div>{_value[key]}</div>
|
|
243
|
+
) : (
|
|
244
|
+
<NCascader
|
|
245
|
+
v-model:value={_value[key]}
|
|
246
|
+
options={options}
|
|
247
|
+
placeholder={`请选择${label}`}
|
|
248
|
+
{...props}
|
|
249
|
+
/>
|
|
250
|
+
)
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
// 注册颜色选择器控件
|
|
254
|
+
setupOptions('colorPicker', (item, { _value, _isRead }) => {
|
|
255
|
+
const { key, props } = item
|
|
256
|
+
return _isRead ? (
|
|
257
|
+
<div style={{
|
|
258
|
+
width: '20px',
|
|
259
|
+
height: '20px',
|
|
260
|
+
backgroundColor: _value[key],
|
|
261
|
+
border: '1px solid #ccc'
|
|
262
|
+
}} />
|
|
263
|
+
) : (
|
|
264
|
+
<NColorPicker
|
|
265
|
+
v-model:value={_value[key]}
|
|
266
|
+
{...props}
|
|
267
|
+
/>
|
|
268
|
+
)
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
// 其他全局配置
|
|
272
|
+
setupConfig({
|
|
273
|
+
baseURL: 'https://api.example.com',
|
|
274
|
+
// ... 其他配置
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
const app = createApp(App)
|
|
278
|
+
app.mount('#app')
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### 使用自定义控件
|
|
282
|
+
|
|
283
|
+
注册后,在 `DataForm`、`CommonQuery`、`Options` 等组件的 `options` 配置中使用:
|
|
284
|
+
|
|
285
|
+
```javascript
|
|
286
|
+
const formOptions = [
|
|
287
|
+
{ key: 'region', label: '地区', way: 'cascader', options: regionData },
|
|
288
|
+
{ key: 'theme', label: '主题色', way: 'colorPicker' },
|
|
289
|
+
]
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### getAllOptions / getOptions
|
|
293
|
+
|
|
294
|
+
获取已注册的 Options 控件。
|
|
295
|
+
|
|
296
|
+
```javascript
|
|
297
|
+
import { getAllOptions, getOptions } from '@xmszm/core'
|
|
298
|
+
|
|
299
|
+
// 获取所有已注册的 Options
|
|
300
|
+
const allOptions = getAllOptions()
|
|
301
|
+
// => { input: fn, select: fn, cascader: fn, ... }
|
|
302
|
+
|
|
303
|
+
// 获取指定的 Options
|
|
304
|
+
const specificOptions = getOptions(['input', 'select'])
|
|
305
|
+
// => { input: fn, select: fn }
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
::: tip
|
|
309
|
+
这些方法主要用于调试或高级用法,一般不需要直接调用。
|
|
310
|
+
:::
|
|
311
|
+
|
|
312
|
+
## Dialog 配置 {#dialog-配置}
|
|
313
|
+
|
|
314
|
+
### registerDialogInstance
|
|
315
|
+
|
|
316
|
+
可选配置,用于注册外部 Dialog 实例。如果不注册,库会自动尝试获取。
|
|
317
|
+
|
|
318
|
+
```javascript
|
|
319
|
+
import { registerDialogInstance, useDialog } from '@xmszm/core'
|
|
320
|
+
import { useDialog as useNaiveDialog } from 'naive-ui'
|
|
321
|
+
|
|
322
|
+
// 在组件中注册
|
|
323
|
+
const dialog = useNaiveDialog()
|
|
324
|
+
registerDialogInstance(dialog)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Dialog 主题配置
|
|
328
|
+
|
|
329
|
+
```javascript
|
|
330
|
+
import { setupConfig } from '@xmszm/core'
|
|
331
|
+
|
|
332
|
+
setupConfig({
|
|
333
|
+
dialog: {
|
|
334
|
+
// 是否继承外部定义的主题色(默认 true)
|
|
335
|
+
inheritTheme: true,
|
|
336
|
+
// 主题色覆盖(当 inheritTheme 为 false 时使用)
|
|
337
|
+
themeOverrides: {
|
|
338
|
+
// 自定义主题色配置
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
})
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## 插件和指令
|
|
345
|
+
|
|
346
|
+
### CorePlugin / install
|
|
347
|
+
|
|
348
|
+
库插件,用于注册指令等全局功能。
|
|
349
|
+
|
|
350
|
+
```javascript
|
|
351
|
+
import { createApp } from 'vue'
|
|
352
|
+
import { CorePlugin } from '@xmszm/core'
|
|
353
|
+
import App from './App.vue'
|
|
354
|
+
|
|
355
|
+
const app = createApp(App)
|
|
356
|
+
|
|
357
|
+
// 使用插件(会自动注册所有指令)
|
|
358
|
+
app.use(CorePlugin)
|
|
359
|
+
|
|
360
|
+
app.mount('#app')
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
或者使用 `install` 函数:
|
|
364
|
+
|
|
365
|
+
```javascript
|
|
366
|
+
import { install } from '@xmszm/core'
|
|
367
|
+
|
|
368
|
+
app.use({ install })
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### registerDirectives
|
|
372
|
+
|
|
373
|
+
手动注册所有指令到应用实例。
|
|
374
|
+
|
|
375
|
+
```javascript
|
|
376
|
+
import { registerDirectives } from '@xmszm/core'
|
|
377
|
+
|
|
378
|
+
registerDirectives(app)
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### autoRegisterDirectives
|
|
382
|
+
|
|
383
|
+
尝试自动注册指令(通过 `getCurrentInstance` 获取应用实例)。
|
|
384
|
+
|
|
385
|
+
```javascript
|
|
386
|
+
import { autoRegisterDirectives } from '@xmszm/core'
|
|
387
|
+
|
|
388
|
+
// 在组件中调用
|
|
389
|
+
autoRegisterDirectives()
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### getGlobalApp
|
|
393
|
+
|
|
394
|
+
获取全局应用实例(如果已通过 `registerDirectives` 注册)。
|
|
395
|
+
|
|
396
|
+
```javascript
|
|
397
|
+
import { getGlobalApp } from '@xmszm/core'
|
|
398
|
+
|
|
399
|
+
const app = getGlobalApp()
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
::: tip
|
|
403
|
+
通常不需要手动调用这些函数,使用 `CorePlugin` 或 `install` 即可自动注册所有指令。
|
|
404
|
+
:::
|
|
405
|
+
|
|
406
|
+
## 注意事项
|
|
407
|
+
|
|
408
|
+
1. **配置时机**:建议在应用启动时(如 `main.js`)进行配置
|
|
409
|
+
2. **权限检查**:如果未配置 `hasPermission`,默认返回 `true`(会显示警告)
|
|
410
|
+
3. **BASE_URL**:如果未配置 `baseURL`,`getFileUrl` 会返回原始 URL(会显示警告)
|
|
411
|
+
4. **上传方法**:如果未配置 `uploadMethod`,调用 `customUpload` 会抛出错误
|
|
412
|
+
5. **Options 注册**:`setupOptions` 应在使用相关组件之前注册,建议在 `main.js` 中统一注册
|
|
413
|
+
6. **Dialog 实例**:`registerDialogInstance` 是可选的,库会自动尝试获取,仅在特殊场景下需要手动注册
|
|
414
|
+
7. **插件使用**:推荐使用 `CorePlugin` 或 `install` 自动注册指令,无需手动调用 `registerDirectives`
|
|
415
|
+
|
package/docs/guide/demo.md
CHANGED
|
@@ -14,7 +14,7 @@ npm install
|
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
2) 在你的宿主工程中引入该组件文件(或复制内容),确保存在以下 alias:
|
|
17
|
-
```
|
|
17
|
+
```javascript
|
|
18
18
|
// vite / webpack 示例
|
|
19
19
|
resolve: {
|
|
20
20
|
alias: {
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
CommonQuery,
|
|
56
56
|
createActionColumnJsx,
|
|
57
57
|
DataTable,
|
|
58
|
-
} from 'core'
|
|
58
|
+
} from '@xmszm/core'
|
|
59
59
|
|
|
60
60
|
// 列表数据与查询管理
|
|
61
61
|
const { pageState, listQuery } = useNaivePage(() => {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# 本地开发配置
|
|
2
|
+
|
|
3
|
+
## npm/pnpm link 时的路径解析问题
|
|
4
|
+
|
|
5
|
+
当使用 `npm link` 或 `pnpm link` 进行本地开发时,Vite 可能无法正确解析链接包的路径。这是因为:
|
|
6
|
+
|
|
7
|
+
1. **符号链接解析问题**:npm/pnpm link 创建的是符号链接,Vite 的模块解析在处理符号链接时可能失败
|
|
8
|
+
2. **package.json exports**:链接包的 `exports` 字段路径解析可能不生效
|
|
9
|
+
3. **CSS 文件路径**:样式文件的路径解析尤其容易出问题
|
|
10
|
+
|
|
11
|
+
## 最小化配置方案
|
|
12
|
+
|
|
13
|
+
在测试项目的 `vite.config.js` 中添加以下配置即可:
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
import { defineConfig } from 'vite'
|
|
17
|
+
import vue from '@vitejs/plugin-vue'
|
|
18
|
+
import vueJsx from '@vitejs/plugin-vue-jsx'
|
|
19
|
+
import path from 'path'
|
|
20
|
+
|
|
21
|
+
export default defineConfig({
|
|
22
|
+
plugins: [vue(), vueJsx()],
|
|
23
|
+
resolve: {
|
|
24
|
+
alias: {
|
|
25
|
+
'@': path.resolve(__dirname, 'src'),
|
|
26
|
+
// 解决 npm/pnpm link 时的路径解析问题
|
|
27
|
+
'@xmszm/core': path.resolve(__dirname, '..'), // 指向库项目根目录
|
|
28
|
+
'@xmszm/core/dist/style.css': path.resolve(__dirname, '../dist/style.css'),
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
server: {
|
|
32
|
+
port: 3000,
|
|
33
|
+
open: true
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 为什么需要这个配置?
|
|
39
|
+
|
|
40
|
+
### 问题 1: 模块无法解析
|
|
41
|
+
|
|
42
|
+
**错误信息**:
|
|
43
|
+
```
|
|
44
|
+
Failed to resolve import "@xmszm/core" from "src/App.vue"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**原因**:
|
|
48
|
+
- npm/pnpm link 创建的符号链接路径可能无法被 Vite 正确识别
|
|
49
|
+
- 链接路径如 `link:C:/Users/admin/AppData/Local/pnpm/global/5/node_modules/@xmszm/core` 可能解析失败
|
|
50
|
+
|
|
51
|
+
**解决方案**:
|
|
52
|
+
```javascript
|
|
53
|
+
'@xmszm/core': path.resolve(__dirname, '..')
|
|
54
|
+
```
|
|
55
|
+
直接指向源项目根目录,绕过符号链接解析问题。
|
|
56
|
+
|
|
57
|
+
### 问题 2: 样式文件无法解析
|
|
58
|
+
|
|
59
|
+
**错误信息**:
|
|
60
|
+
```
|
|
61
|
+
Failed to resolve import "@xmszm/core/dist/style.css"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**原因**:
|
|
65
|
+
- CSS 文件的路径解析在链接包中更容易失败
|
|
66
|
+
- `exports` 字段对 CSS 文件的处理可能不一致
|
|
67
|
+
|
|
68
|
+
**解决方案**:
|
|
69
|
+
```javascript
|
|
70
|
+
'@xmszm/core/dist/style.css': path.resolve(__dirname, '../dist/style.css')
|
|
71
|
+
```
|
|
72
|
+
直接指向源项目的样式文件。
|
|
73
|
+
|
|
74
|
+
## 生产环境使用
|
|
75
|
+
|
|
76
|
+
在生产环境中(通过 npm 安装),**不需要**这些配置,因为:
|
|
77
|
+
|
|
78
|
+
1. 正常安装的包路径解析没有问题
|
|
79
|
+
2. `package.json` 的 `exports` 字段会正确工作
|
|
80
|
+
3. Vite 可以正确解析 `node_modules` 中的包
|
|
81
|
+
|
|
82
|
+
## 完整示例
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// vite.config.js
|
|
86
|
+
import { defineConfig } from 'vite'
|
|
87
|
+
import vue from '@vitejs/plugin-vue'
|
|
88
|
+
import vueJsx from '@vitejs/plugin-vue-jsx'
|
|
89
|
+
import path from 'path'
|
|
90
|
+
|
|
91
|
+
export default defineConfig({
|
|
92
|
+
plugins: [vue(), vueJsx()],
|
|
93
|
+
resolve: {
|
|
94
|
+
alias: {
|
|
95
|
+
'@': path.resolve(__dirname, 'src'),
|
|
96
|
+
// 仅在使用 npm/pnpm link 时需要
|
|
97
|
+
'@xmszm/core': path.resolve(__dirname, '..'),
|
|
98
|
+
'@xmszm/core/dist/style.css': path.resolve(__dirname, '../dist/style.css'),
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
})
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 注意事项
|
|
105
|
+
|
|
106
|
+
1. **仅本地开发需要**:这个配置只在本地开发(使用 link)时需要
|
|
107
|
+
2. **相对路径**:`path.resolve(__dirname, '..')` 假设测试项目在库项目的 `test-app` 目录下
|
|
108
|
+
3. **路径调整**:如果目录结构不同,需要相应调整路径
|
|
109
|
+
|
package/docs/guide/quickstart.md
CHANGED
|
@@ -5,27 +5,47 @@ title: 快速开始
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install core
|
|
8
|
+
npm install @xmszm/core
|
|
9
|
+
# 或
|
|
10
|
+
pnpm add @xmszm/core
|
|
11
|
+
# 或
|
|
12
|
+
yarn add @xmszm/core
|
|
9
13
|
```
|
|
10
14
|
|
|
11
15
|
同时请在项目中安装(或确保已存在)以下 peer 依赖(版本可按你项目统一):
|
|
12
16
|
|
|
13
|
-
- vue 3.
|
|
14
|
-
- naive-ui
|
|
15
|
-
- vue-router
|
|
16
|
-
- dayjs
|
|
17
|
-
- lodash-es
|
|
18
|
-
-
|
|
17
|
+
- `vue` >= 3.3.0
|
|
18
|
+
- `naive-ui` >= 2.38.0
|
|
19
|
+
- `vue-router` >= 4.2.0
|
|
20
|
+
- `dayjs` >= 1.11.0
|
|
21
|
+
- `lodash-es` >= 4.17.21
|
|
22
|
+
- `@vicons/ionicons5` >= 0.13.0
|
|
19
23
|
|
|
20
24
|
> 若项目使用 `@` 路径别名,请确认在构建/运行配置中存在相同的 alias。
|
|
21
25
|
|
|
22
26
|
## 引入与基本使用
|
|
23
27
|
|
|
28
|
+
### 全局引入样式(推荐)
|
|
29
|
+
|
|
30
|
+
在项目的入口文件(如 `main.js` 或 `main.ts`)中全局引入样式:
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
// main.js 或 main.ts
|
|
34
|
+
import { createApp } from 'vue'
|
|
35
|
+
import App from './App.vue'
|
|
36
|
+
import '@xmszm/core/dist/style.css' // 全局引入样式
|
|
37
|
+
|
|
38
|
+
const app = createApp(App)
|
|
39
|
+
app.mount('#app')
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 组件中使用
|
|
43
|
+
|
|
24
44
|
```vue
|
|
25
45
|
<script setup>
|
|
26
46
|
import { ref } from 'vue'
|
|
27
|
-
import { DataForm, DataTable, commonDialogMethod } from 'core'
|
|
28
|
-
|
|
47
|
+
import { DataForm, DataTable, commonDialogMethod } from '@xmszm/core'
|
|
48
|
+
// 如果已在全局引入样式,这里无需重复引入
|
|
29
49
|
|
|
30
50
|
const formValue = ref({})
|
|
31
51
|
const formOptions = [
|
|
@@ -62,16 +82,25 @@ function openDialog() {
|
|
|
62
82
|
|
|
63
83
|
## 目录结构建议
|
|
64
84
|
|
|
65
|
-
```
|
|
85
|
+
```text
|
|
66
86
|
docs/ # VitePress 文档
|
|
67
87
|
examples/demo.vue # 可运行的最小示例
|
|
68
88
|
src/ # 组件与工具源码
|
|
69
89
|
types/ # 类型定义
|
|
70
90
|
```
|
|
71
91
|
|
|
92
|
+
## 初始化配置(可选)
|
|
93
|
+
|
|
94
|
+
如果需要配置全局设置或注册自定义控件类型,详见 [初始化配置](/guide/config):
|
|
95
|
+
|
|
96
|
+
- **全局配置**:使用 `setupConfig` 配置 API 地址、权限检查、上传方法等
|
|
97
|
+
- **自定义控件**:使用 `setupOptions` 注册自定义 `Options` 控件类型
|
|
98
|
+
- **Dialog 配置**:使用 `registerDialogInstance` 注册 Dialog 实例(可选)
|
|
99
|
+
|
|
72
100
|
## 常见问题
|
|
73
101
|
|
|
74
102
|
- 找不到 `@/utils/...`:请在宿主项目配置 `@` 别名或提供对应实现。
|
|
75
|
-
- 样式缺失:如需库内 less 默认样式,确保引入
|
|
103
|
+
- 样式缺失:如需库内 less 默认样式,确保引入 `@xmszm/core/dist/style.css`。**推荐在全局入口文件(如 `main.js`)中引入,这样整个项目都可以使用默认样式,无需在每个组件中重复引入。**
|
|
76
104
|
- TS 类型:库内已内置 `types/index.d.ts`,可直接获得基础提示。
|
|
105
|
+
- 自定义控件:可以通过 `setupOptions` 注册自定义控件类型,详见 [初始化配置](/guide/config)。
|
|
77
106
|
|
package/docs/index.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
layout: home
|
|
3
|
-
title:
|
|
3
|
+
title: '@xmszm/core'
|
|
4
4
|
hero:
|
|
5
|
-
name:
|
|
5
|
+
name: '@xmszm/core'
|
|
6
6
|
text: Vue 3 + Naive UI 的表单、表格、弹窗与工具集合
|
|
7
7
|
tagline: 开箱即用的配置式表单与表格方案,内置弹窗、上传、权限、路由工具。
|
|
8
8
|
actions:
|
|
@@ -16,7 +16,7 @@ features:
|
|
|
16
16
|
- title: 配置化表单
|
|
17
17
|
details: 通过 Options 定义字段,自动生成 rules,轻松构建复杂表单。
|
|
18
18
|
- title: 表格增强
|
|
19
|
-
details:
|
|
19
|
+
details: 内置操作列创建器、筛选、虚拟滚动与省略 tooltip。
|
|
20
20
|
- title: 弹窗集成
|
|
21
21
|
details: commonDialogMethod 将表单与弹窗能力合并,减少样板代码。
|
|
22
22
|
- title: 实用工具
|
package/docs/usage.md
CHANGED
|
@@ -2,18 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
## 安装
|
|
4
4
|
```bash
|
|
5
|
-
npm install core
|
|
5
|
+
npm install @xmszm/core
|
|
6
|
+
# 或
|
|
7
|
+
pnpm add @xmszm/core
|
|
8
|
+
# 或
|
|
9
|
+
yarn add @xmszm/core
|
|
6
10
|
```
|
|
7
11
|
|
|
8
|
-
需要同时安装的 peer
|
|
12
|
+
需要同时安装的 peer 依赖(版本可按项目统一):
|
|
13
|
+
- `vue` >= 3.3.0
|
|
14
|
+
- `naive-ui` >= 2.38.0
|
|
15
|
+
- `vue-router` >= 4.2.0
|
|
16
|
+
- `dayjs` >= 1.11.0
|
|
17
|
+
- `lodash-es` >= 4.17.21
|
|
18
|
+
- `@vicons/ionicons5` >= 0.13.0
|
|
19
|
+
|
|
9
20
|
如项目使用 `@` 别名,请确保存在对应的打包/运行时配置。
|
|
10
21
|
|
|
11
22
|
## 快速开始
|
|
23
|
+
|
|
24
|
+
### 全局引入样式(推荐)
|
|
25
|
+
|
|
26
|
+
在项目的入口文件中全局引入样式:
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
// main.js 或 main.ts
|
|
30
|
+
import '@xmszm/core/dist/style.css'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 组件中使用
|
|
34
|
+
|
|
12
35
|
```vue
|
|
13
36
|
<script setup>
|
|
14
37
|
import { ref } from 'vue'
|
|
15
|
-
import { DataForm, DataTable, commonDialogMethod } from 'core'
|
|
16
|
-
|
|
38
|
+
import { DataForm, DataTable, commonDialogMethod } from '@xmszm/core'
|
|
39
|
+
// 如果已在全局引入样式,这里无需重复引入
|
|
17
40
|
|
|
18
41
|
const formValue = ref({})
|
|
19
42
|
const formOptions = [
|
|
@@ -50,12 +73,13 @@ function openDialog() {
|
|
|
50
73
|
|
|
51
74
|
## 主要导出清单
|
|
52
75
|
- 组件:`DataForm`、`Options`、`CommonQuery`、`DataTable`、`OprButton`、`Pop`
|
|
53
|
-
- 方法:`commonDialogMethod`、`createActionColumnJsx`、`initRules
|
|
76
|
+
- 方法:`commonDialogMethod`、`createActionColumnJsx`、`initRules`(用于自动生成表单校验规则)
|
|
54
77
|
- 工具:`toArray`、`ArrayToObject`、`ObjectToArray`、`customUpload`、`registryUpload`、`getFileUrl`
|
|
55
|
-
- 常量:`
|
|
78
|
+
- 常量:`globalLabelField`(默认 `'name'`)、`globalValueField`(默认 `'id'`)
|
|
56
79
|
- 路由辅助:`initRouteMeta`、`useApiConfig`、`useAuthPermission`、`cellectChildenPermission`
|
|
57
80
|
|
|
58
81
|
## 常见提示
|
|
59
82
|
- 若打包时报 `@/utils/...` 未找到,请在宿主项目配置 `@` 路径或提供对应实现。
|
|
83
|
+
- **样式引入**:推荐在全局入口文件(`main.js` 或 `main.ts`)中引入 `@xmszm/core/dist/style.css`,这样整个项目都可以使用默认样式,无需在每个组件中重复引入。
|
|
60
84
|
- Vue TS 项目可直接使用内置 `types/index.d.ts` 获取基础类型提示。
|
|
61
85
|
|