@jnrs/vue-core 1.2.16 → 1.2.18

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.
Files changed (3) hide show
  1. package/AGENTIC.md +924 -0
  2. package/README.md +6 -229
  3. package/package.json +3 -2
package/AGENTIC.md ADDED
@@ -0,0 +1,924 @@
1
+ # @jnrs/vue-core API 文档
2
+
3
+ ## ✨ 介绍
4
+
5
+ 巨能前端工程化开发,Vue 专用核心功能包。提供 Pinia store、Vue composables、Vue Router、全局指令、插件和公共 Vue 组件。
6
+
7
+ ## 📦 模块总览
8
+
9
+ | 模块路径 | 说明 |
10
+ | ---------------------------- | ------------------------ |
11
+ | `@jnrs/vue-core` | 主模块,包含基础类型定义 |
12
+ | `@jnrs/vue-core/pinia` | Pinia 状态管理模块 |
13
+ | `@jnrs/vue-core/router` | Vue Router 路由模块 |
14
+ | `@jnrs/vue-core/components` | Vue 组件库 |
15
+ | `@jnrs/vue-core/composables` | Vue 组合式 API |
16
+ | `@jnrs/vue-core/constants` | 常量定义 |
17
+ | `@jnrs/vue-core/lib` | 工具库 |
18
+ | `@jnrs/vue-core/locales` | 国际化配置 |
19
+ | `@jnrs/vue-core/utils` | 工具函数 |
20
+
21
+ ---
22
+
23
+ ## 📋 API 详情
24
+
25
+ ### @jnrs/vue-core 主模块
26
+
27
+ #### 类型 (Types)
28
+
29
+ ##### IMenuItem
30
+
31
+ 菜单项接口定义
32
+
33
+ | 属性名 | 类型 | 必填 | 说明 |
34
+ | --------- | ------------- | ---- | ---------- |
35
+ | meta | `RouteMeta` | ✓ | 路由元信息 |
36
+ | path | `string` | ✓ | 路径 |
37
+ | name | `string` | - | 名称 |
38
+ | component | `string` | - | 组件路径 |
39
+ | redirect | `string` | - | 重定向路径 |
40
+ | children | `IMenuItem[]` | - | 子菜单项 |
41
+
42
+ ##### ElSize
43
+
44
+ Element Plus 尺寸类型
45
+
46
+ ```typescript
47
+ type ElSize = '' | 'large' | 'default' | 'small'
48
+ ```
49
+
50
+ ##### ElButtonType
51
+
52
+ Element Plus 按钮类型
53
+
54
+ ```typescript
55
+ type ElButtonType = 'default' | 'primary' | 'success' | 'info' | 'warning' | 'text' | 'danger'
56
+ ```
57
+
58
+ ##### IAttachment
59
+
60
+ 文件信息类型
61
+
62
+ | 属性名 | 类型 | 必填 | 说明 |
63
+ | -------------- | -------- | ---- | ---------------------------------- |
64
+ | id | `number` | ✓ | 数据 id |
65
+ | documentId | `number` | ✓ | 文件 id |
66
+ | fileName | `string` | ✓ | 文件名 |
67
+ | uniqueFileName | `string` | ✓ | 文件名唯一标识(用于文件获取 API) |
68
+ | fileType | `string` | ✓ | MIME 类型 |
69
+ | fileSize | `number` | ✓ | 文件大小(单位:字节) |
70
+
71
+ ##### IPagination
72
+
73
+ 分页类型
74
+
75
+ | 属性名 | 类型 | 必填 | 说明 |
76
+ | -------- | -------- | ---- | -------- |
77
+ | pageNo | `number` | ✓ | 当前页码 |
78
+ | pageSize | `number` | ✓ | 每页大小 |
79
+
80
+ ##### IPageData<T>
81
+
82
+ 分页列表数据(泛型 T)
83
+
84
+ 继承自 `IPagination`
85
+
86
+ | 属性名 | 类型 | 必填 | 说明 |
87
+ | ------ | -------- | ---- | -------- |
88
+ | list | `T[]` | ✓ | 数据列表 |
89
+ | count | `number` | ✓ | 数据总数 |
90
+
91
+ **使用示例:**
92
+
93
+ ```typescript
94
+ import type { IPageData, IAttachment } from '@jnrs/vue-core'
95
+
96
+ interface UserData {
97
+ id: number
98
+ name: string
99
+ }
100
+
101
+ const userData: IPageData<UserData> = {
102
+ pageNo: 1,
103
+ pageSize: 20,
104
+ list: [{ id: 1, name: '张三' }],
105
+ count: 100
106
+ }
107
+ ```
108
+
109
+ ---
110
+
111
+ ### @jnrs/vue-core/pinia 模块
112
+
113
+ #### Store: useSystemStore
114
+
115
+ 系统仓库,管理主题、菜单折叠、全屏等系统级状态。
116
+
117
+ **返回值:**
118
+
119
+ | 属性/方法 | 类型 | 说明 |
120
+ | ------------------ | -------------------------------- | ------------------------------------------ |
121
+ | theme | `Ref<Theme>` | 主题配置(国际化、主题模式、自定义强调色) |
122
+ | computedThemeMode | `ComputedRef<'light' \| 'dark'>` | 计算后的主题模式(考虑 auto 模式) |
123
+ | menuCollapse | `Ref<boolean>` | 菜单是否折叠 |
124
+ | documentFullscreen | `Ref<boolean>` | 文档是否全屏 |
125
+ | toggleCollapse | `() => void` | 折叠菜单切换 |
126
+ | toggleFullScreen | `() => Promise<void>` | 全屏切换 |
127
+ | setLocale | `(value: unknown) => void` | 设置语言 |
128
+ | setMode | `(value: unknown) => void` | 设置主题模式 |
129
+ | setPrimaryColor | `(value: unknown) => void` | 设置主题色 |
130
+
131
+ **Theme 类型:**
132
+
133
+ ```typescript
134
+ type Theme = {
135
+ locale: ILocale // 语言:'zhCn' | 'en'
136
+ mode: IThemeMode // 主题模式:'light' | 'dark' | 'auto'
137
+ primaryColor: string // 自定义强调色
138
+ }
139
+ ```
140
+
141
+ **使用示例:**
142
+
143
+ ```typescript
144
+ import { useSystemStore } from '@jnrs/vue-core/pinia'
145
+
146
+ const systemStore = useSystemStore()
147
+
148
+ // 切换菜单折叠
149
+ systemStore.toggleCollapse()
150
+
151
+ // 切换全屏
152
+ await systemStore.toggleFullScreen()
153
+
154
+ // 设置主题
155
+ systemStore.setMode('dark')
156
+ systemStore.setLocale('en')
157
+ systemStore.setPrimaryColor('#409EFF')
158
+
159
+ // 访问当前主题
160
+ console.log(systemStore.theme.value.locale)
161
+ console.log(systemStore.computedThemeMode.value)
162
+ ```
163
+
164
+ **特性:**
165
+
166
+ - 自动持久化 `theme` 和 `menuCollapse` 状态
167
+ - 支持自动主题模式(根据系统偏好切换)
168
+ - 动态设置 CSS 变量 `--jnrs-color-primary`
169
+
170
+ ---
171
+
172
+ #### Store: useMenuStore
173
+
174
+ 菜单仓库,管理动态菜单和路由。
175
+
176
+ **返回值:**
177
+
178
+ | 属性/方法 | 类型 | 说明 |
179
+ | -------------------- | -------------------------------------------- | ---------------------- |
180
+ | hasFetchedAsyncMenus | `Ref<boolean>` | 菜单是否已获取 |
181
+ | menus | `Ref<IMenuItem[]>` | 菜单项列表 |
182
+ | asyncSetMenus | `(res: IMenuItem[]) => Promise<IMenuItem[]>` | 设置菜单信息并生成路由 |
183
+ | clearMenu | `() => void` | 清除菜单信息 |
184
+
185
+ **使用示例:**
186
+
187
+ ```typescript
188
+ import { useMenuStore } from '@jnrs/vue-core/pinia'
189
+
190
+ const menuStore = useMenuStore()
191
+
192
+ // 设置菜单(会自动生成路由)
193
+ const menus = await menuStore.asyncSetMenus([
194
+ {
195
+ path: '/dashboard',
196
+ name: 'Dashboard',
197
+ component: '/dashboard/index',
198
+ meta: { title: '仪表盘' }
199
+ }
200
+ ])
201
+
202
+ // 清除菜单(如退出登录时)
203
+ menuStore.clearMenu()
204
+
205
+ // 访问菜单列表
206
+ console.log(menuStore.menus.value)
207
+ ```
208
+
209
+ **特性:**
210
+
211
+ - 自动为菜单项生成 UUID
212
+ - 自动调用 `asyncGenerateRoute` 生成动态路由
213
+ - `hasFetchedAsyncMenus` 不持久化,每次刷新页面需重新获取菜单
214
+
215
+ ---
216
+
217
+ ### @jnrs/vue-core/router 模块
218
+
219
+ #### 类型导出
220
+
221
+ 从 `vue-router` 重新导出的类型:
222
+
223
+ - `RouteMeta` - 路由元信息类型
224
+ - `RouteLocationNormalizedGeneric` - 标准化路由位置类型
225
+ - `RouteLocationNormalizedLoadedGeneric` - 已加载的标准化路由位置类型
226
+
227
+ ##### FileModules
228
+
229
+ 文件模块类型(Vite import.meta.glob 返回的类型)
230
+
231
+ ```typescript
232
+ type FileModules = Record<string, () => Promise<unknown>>
233
+ ```
234
+
235
+ #### 函数导出
236
+
237
+ 从 `vue-router` 重新导出的函数:
238
+
239
+ - `useRouter` - 原生 vue-router 函数
240
+ - `useRoute` - 原生 vue-router 函数
241
+
242
+ ##### createVueRouter
243
+
244
+ 创建 vue-router 实例
245
+
246
+ **参数:**
247
+
248
+ | 参数名 | 类型 | 必填 | 说明 |
249
+ | ---------------- | -------------------------------------------------- | ---- | --------------------------------------------- |
250
+ | options | `RouterOptions` | ✓ | 路由配置项 |
251
+ | fileModules | `FileModules` | ✓ | 文件模块(通过 import.meta.glob 导入) |
252
+ | layoutName | `string` | - | 布局组件名称 |
253
+ | globalComponent | `Promise<unknown>` | - | 全局 Layout 组件(meta.global=true 时需传入) |
254
+ | handleBeforeEach | `(to, from) => Promise<void \| boolean \| string>` | - | 路由前置守卫处理函数 |
255
+
256
+ **返回值:** `Router` - router 实例
257
+
258
+ **使用示例:**
259
+
260
+ ```typescript
261
+ import { createVueRouter } from '@jnrs/vue-core/router'
262
+
263
+ const fileModules = import.meta.glob('/src/views/**/*.vue')
264
+
265
+ const router = createVueRouter({
266
+ options: {
267
+ history: createWebHistory(),
268
+ routes: [{ path: '/', redirect: '/dashboard' }]
269
+ },
270
+ fileModules,
271
+ layoutName: 'Layout',
272
+ globalComponent: import('@/layouts/GlobalLayout.vue'),
273
+ handleBeforeEach: async (to, from) => {
274
+ // 路由守卫逻辑
275
+ const token = localStorage.getItem('token')
276
+ if (!token && to.meta.requiresAuth) {
277
+ return '/login'
278
+ }
279
+ }
280
+ })
281
+ ```
282
+
283
+ ##### asyncGenerateRoute
284
+
285
+ 设置动态路由,生成路由记录
286
+
287
+ **参数:**
288
+
289
+ | 参数名 | 类型 | 必填 | 说明 |
290
+ | ------ | ------------- | ---- | -------------------------- |
291
+ | menus | `IMenuItem[]` | ✓ | 菜单项数组 |
292
+ | parent | `IMenuItem` | - | 父级菜单项(内部递归使用) |
293
+
294
+ **返回值:** `Promise<void>`
295
+
296
+ **说明:**
297
+
298
+ - 根据菜单项自动生成路由记录
299
+ - 支持目录结构(无 component 字段)
300
+ - 支持重定向(redirect 字段)
301
+ - 支持全局路由(meta.global = true)
302
+ - 自动添加 fullPathTitle 到 meta
303
+
304
+ ##### handleRouter
305
+
306
+ 路由跳转或替换
307
+
308
+ **参数:**
309
+
310
+ | 参数名 | 类型 | 必填 | 说明 |
311
+ | ------ | --------------------- | ---- | --------------------- |
312
+ | to | `RouteLocationRaw` | ✓ | 路由跳转参数 |
313
+ | type | `'push' \| 'replace'` | - | 跳转方式,默认 'push' |
314
+
315
+ **返回值:** `Promise<boolean \| void>`
316
+
317
+ **使用示例:**
318
+
319
+ ```typescript
320
+ import { handleRouter } from '@jnrs/vue-core/router'
321
+
322
+ // push 跳转
323
+ await handleRouter({ name: 'dashboard' })
324
+
325
+ // replace 跳转
326
+ await handleRouter({ path: '/user/profile' }, 'replace')
327
+ ```
328
+
329
+ **特性:**
330
+
331
+ - 自动捕获路由跳转错误
332
+ - 失败时跳转到 404 页面
333
+ - 输出警告日志
334
+
335
+ ##### getRoutes
336
+
337
+ 获取已注册路由
338
+
339
+ **返回值:** `IMenuItem[]` - 已注册的路由列表
340
+
341
+ **使用示例:**
342
+
343
+ ```typescript
344
+ import { getRoutes } from '@jnrs/vue-core/router'
345
+
346
+ const routes = getRoutes()
347
+ console.log(routes)
348
+ ```
349
+
350
+ ---
351
+
352
+ ### @jnrs/vue-core/components 模块
353
+
354
+ #### JnTable
355
+
356
+ 表格组件,基于 Element Plus Table 封装,支持序号列、选择列、鼠标框选等功能。
357
+
358
+ **Props:**
359
+
360
+ | 属性名 | 类型 | 默认值 | 说明 |
361
+ | ------------------- | -------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------- |
362
+ | data | `Record<string, any>[]` | — | 表数据 |
363
+ | rowKey | `string` | `'id'` | 行数据的 Key,在使用 reserve-selection 功能与显示树形数据时必填。支持多层访问:user.info.id |
364
+ | showScrollbar | `boolean` | `false` | 总是显示横向滚动条 |
365
+ | height | `string \| number` | `'100%'` | 表格高度 |
366
+ | autoHeight | `boolean` | `false` | 表格高度是否自动计算 |
367
+ | autoHeightOptions | `UseReactivityTableHeighOptions` | `{}` | 表格高度自动计算配置项 |
368
+ | showIndexColumn | `boolean` | `false` | 是否显示序号列 |
369
+ | showSelectionColumn | `boolean` | `false` | 是否显示选择列 |
370
+ | showMouseSelection | `boolean` | `false` | 是否开启鼠标框选 |
371
+ | pagination | `IPagination` | `{ pageNo: 0, pageSize: 0 }` | 当前页码和每页大小(用于序号计算) |
372
+
373
+ **使用示例:**
374
+
375
+ ```vue
376
+ <template>
377
+ <JnTable
378
+ :data="tableData"
379
+ :pagination="{ pageNo: 1, pageSize: 20 }"
380
+ show-index-column
381
+ show-selection-column
382
+ show-mouse-selection
383
+ >
384
+ <el-table-column prop="name" label="姓名" />
385
+ <el-table-column prop="age" label="年龄" />
386
+ </JnTable>
387
+ </template>
388
+ ```
389
+
390
+ ---
391
+
392
+ #### JnSelectTemplate
393
+
394
+ 选择组件通用模板,支持下拉选择、弹窗多选等功能。
395
+
396
+ **Props:**
397
+
398
+ | 属性名 | 类型 | 默认值 | 说明 |
399
+ | --------------------- | -------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------ |
400
+ | listApi | `Function` | — | 列表接口(必填) |
401
+ | tableName | `string` | `''` | 列表名称 |
402
+ | tableWidth | `string` | `'60%'` | 列表宽度 |
403
+ | listParams | `Record<string, unknown>` | `{}` | 列表查询参数 |
404
+ | listParamsHandle | `(params) => params` | `(params) => params` | 列表查询参数前置处理函数 |
405
+ | listParamsHandleAfter | `(params) => params` | `(params) => params` | 列表查询参数后置处理函数 |
406
+ | keyValue | `{ name: string; id: string; [key: string]: string }` | `{ name: 'name', id: 'id' }` | 真实数据匹配的键值对名 |
407
+ | optionSecondaryField | `string` | — | keyValue 的拓展字段,用于 el-option 中显示 |
408
+ | modelValue | `Record<string, unknown> \| Record<string, unknown>[] \| number \| string` | — | 双向绑定值(支持多种类型) |
409
+ | width | `string` | `'100%'` | 宽度 |
410
+ | simpleValue | `boolean` | `true` | 简单数据类型,仅返回 keyValue.id |
411
+ | showAllTips | `boolean` | `false` | option 组件是否显示 [全部] |
412
+ | onlyOption | `boolean` | `false` | 仅显示选择器 |
413
+ | onlyButton | `boolean` | `false` | 仅显示选择按钮 |
414
+ | filterable | `boolean` | `true` | 是否可筛选 |
415
+ | clearable | `boolean` | `true` | 是否可清空 |
416
+ | buttonDialogText | `string` | `'更多'` | 按钮文字 |
417
+ | size | `ElSize` | `'default'` | 按钮大小 |
418
+ | plain | `boolean` | `true` | 按钮 plain |
419
+ | formRef | `FormInstance` | `null` | 父级组件的表单对象 |
420
+ | validateFieldName | `string` | `''` | 父级表单验证的字段名 |
421
+ | limit | `number` | `1` | 可选择的数量 |
422
+ | queryForm | `Record<string, unknown>` | — | 表单查询参数 |
423
+ | initialParams | `Record<string, unknown>` | — | 初始查询参数 |
424
+ | remoteFilterKey | `string` | `'name'` | 下拉框查询参数远程过滤参数的 key 值 |
425
+
426
+ **使用示例:**
427
+
428
+ ```vue
429
+ <template>
430
+ <JnSelectTemplate
431
+ v-model="selectedUser"
432
+ :list-api="getUserList"
433
+ table-name="用户选择"
434
+ :key-value="{ name: 'userName', id: 'userId' }"
435
+ :limit="1"
436
+ />
437
+ </template>
438
+
439
+ <script setup>
440
+ import { ref } from 'vue'
441
+ import { getUserList } from '@/api/user'
442
+
443
+ const selectedUser = ref(null)
444
+ </script>
445
+ ```
446
+
447
+ ---
448
+
449
+ #### JnPdfView
450
+
451
+ PDF 文件预览组件
452
+
453
+ **Props:**
454
+
455
+ | 属性名 | 类型 | 默认值 | 说明 |
456
+ | ------------ | ------------- | ------- | ------------------------------------------------- |
457
+ | fileList | `IFileItem[]` | `[]` | 文件列表 |
458
+ | showFileName | `boolean` | `true` | 是否显示文件名 |
459
+ | isPdf | `boolean` | `false` | 是否是 pdf 文件(pdf 文件直接预览,其他文件下载) |
460
+ | windowWidth | `number` | `800` | 预览窗口宽度 |
461
+ | windowHeight | `number` | `600` | 预览窗口高度 |
462
+
463
+ **使用示例:**
464
+
465
+ ```vue
466
+ <template>
467
+ <JnPdfView :file-list="[{ src: '/path/to/file.pdf', fileName: '文档.pdf' }]" :is-pdf="true" />
468
+ </template>
469
+ ```
470
+
471
+ ---
472
+
473
+ #### JnPagination
474
+
475
+ 分页组件
476
+
477
+ **Props:**
478
+
479
+ | 属性名 | 类型 | 默认值 | 说明 |
480
+ | ---------- | --------------- | ----------------------------- | ------------ |
481
+ | modelValue | `IPagination` | `{ pageNo: 1, pageSize: 20 }` | 分页模型值 |
482
+ | total | `number` | `0` | 总条数 |
483
+ | size | `ComponentSize` | `'small'` | 按钮尺寸 |
484
+ | background | `boolean` | `true` | 是否带背景色 |
485
+ | marginTop | `string` | `'10px'` | 上边距 |
486
+
487
+ **Events:**
488
+
489
+ - `update:modelValue` - 分页变化时触发
490
+
491
+ **使用示例:**
492
+
493
+ ```vue
494
+ <template>
495
+ <JnPagination v-model="pagination" :total="100" @update:modelValue="handlePageChange" />
496
+ </template>
497
+
498
+ <script setup>
499
+ import { ref } from 'vue'
500
+
501
+ const pagination = ref({ pageNo: 1, pageSize: 20 })
502
+
503
+ const handlePageChange = (newPagination) => {
504
+ console.log('页码变化', newPagination)
505
+ }
506
+ </script>
507
+ ```
508
+
509
+ ---
510
+
511
+ #### JnImportAndExport
512
+
513
+ 导入 & 导出组件,依赖 JnFileUpload 文件上传组件
514
+
515
+ **Props:**
516
+
517
+ | 属性名 | 类型 | 默认值 | 说明 |
518
+ | --------------------------- | -------------------------------------------------- | ------------------------------------ | --------------------------------- |
519
+ | importTemplateApi | `() => Promise<Blob>` | — | 下载导入模板文件的 api 函数 |
520
+ | importApi | `(data: FormData) => Promise<IFullResponse>` | — | 数据导入 api 函数 |
521
+ | importFieldName | `string` | `'file'` | 数据导入的字段名 |
522
+ | importParams | `Record<string, unknown>` | — | 导入的参数 |
523
+ | fileUploadConfig | `{ accept: string; limit: number }` | `{ accept: '.xls,.xlsx', limit: 1 }` | 导入的文件上传配置 |
524
+ | importBtnName | `string` | `'导入'` | 导入的按钮名称 |
525
+ | importDisabled | `boolean` | `false` | 是否禁用导入按钮 |
526
+ | exportApi | `(data: Record<string, unknown>) => Promise<Blob>` | — | 数据导出的 api 函数 |
527
+ | exportParams | `Record<string, unknown>` | — | 导出的参数 |
528
+ | exportDynamicParamsConfig | `{ label: string; prop: string }` | — | 导出操作时,MessageBox 的参数配置 |
529
+ | messageBoxInputPattern | `RegExp` | `/^\S+(?:\s+\S+)*$/` | MessageBox 中输入框的校验表达式 |
530
+ | messageBoxInputErrorMessage | `string` | `'请输入参数'` | 校验未通过时的提示文本 |
531
+ | exportBtnName | `string` | `'导出'` | 导出的按钮名称 |
532
+ | exportDisabled | `boolean` | `false` | 是否禁用导出按钮 |
533
+ | size | `ElSize` | `'default'` | 按钮尺寸 |
534
+ | buttonType | `ElButtonType` | `'primary'` | 按钮类型 |
535
+ | plain | `boolean` | `true` | 是否为朴素按钮 |
536
+ | text | `boolean` | `false` | 是否为文字按钮 |
537
+ | icon | `boolean` | `true` | 是否显示图标 |
538
+
539
+ **使用示例:**
540
+
541
+ ```vue
542
+ <template>
543
+ <JnImportAndExport
544
+ :import-template-api="downloadTemplate"
545
+ :import-api="importData"
546
+ :export-api="exportData"
547
+ :export-params="{ type: 'excel' }"
548
+ />
549
+ </template>
550
+
551
+ <script setup>
552
+ import { downloadTemplate, importData, exportData } from '@/api/data'
553
+ </script>
554
+ ```
555
+
556
+ ---
557
+
558
+ #### JnImageView
559
+
560
+ 图片预览组件
561
+
562
+ **Props:**
563
+
564
+ | 属性名 | 类型 | 默认值 | 说明 |
565
+ | -------------- | ------------- | --------- | ---------------- |
566
+ | src | `string` | `''` | 图片源地址 |
567
+ | previewSrcList | `IFileItem[]` | `[]` | 开启图片预览功能 |
568
+ | preview | `boolean` | `false` | 是否开启预览功能 |
569
+ | height | `string` | — | 图片高度 |
570
+ | maxHeight | `string` | `'200px'` | 图片最大高度 |
571
+
572
+ **使用示例:**
573
+
574
+ ```vue
575
+ <template>
576
+ <JnImageView src="/path/to/image.jpg" :preview="true" :preview-src-list="imageList" />
577
+ </template>
578
+ ```
579
+
580
+ ---
581
+
582
+ #### JnFileUpload
583
+
584
+ 通用上传 & 回显组件
585
+
586
+ **Props:**
587
+
588
+ | 属性名 | 类型 | 默认值 | 说明 |
589
+ | ----------------- | --------------------------------------- | --------- | ------------------------------- |
590
+ | modelValue | `MixedUploadFile[]` | — | 绑定的模型值(文件列表) |
591
+ | uploadName | `string` | `'file'` | 上传的文件字段名 |
592
+ | drag | `boolean` | `false` | 是否启用拖拽上传 |
593
+ | disabled | `boolean` | `false` | 是否禁用 |
594
+ | showFileList | `boolean` | `true` | 是否显示已上传文件列表 |
595
+ | accept | `string` | `''` | 接受的文件类型(如 .xls,.xlsx) |
596
+ | fileSizeMb | `number` | `100` | 单个文件大小限制(单位:MB) |
597
+ | limit | `number` | `0` | 最大上传文件数量,0 表示不限制 |
598
+ | size | `'' \| 'small' \| 'default' \| 'large'` | `'small'` | Element Plus 组件的尺寸 |
599
+ | formRef | `FormInstance` | — | 父级组件的表单引用 |
600
+ | validateFieldName | `string` | `''` | 父级表单中用于校验的字段名 |
601
+ | downloadFileFn | `(data: IAttachment) => void` | — | 文件下载的函数 |
602
+ | autoUploadApi | `(data: File) => void` | — | 自动上传文件的 api 函数 |
603
+
604
+ **使用示例:**
605
+
606
+ ```vue
607
+ <template>
608
+ <JnFileUpload
609
+ v-model="fileList"
610
+ :auto-upload-api="uploadFile"
611
+ :download-file-fn="downloadFile"
612
+ accept=".jpg,.png"
613
+ :limit="5"
614
+ />
615
+ </template>
616
+
617
+ <script setup>
618
+ import { ref } from 'vue'
619
+ import { uploadFile, downloadFile } from '@/api/file'
620
+
621
+ const fileList = ref([])
622
+ </script>
623
+ ```
624
+
625
+ ---
626
+
627
+ #### JnDialog
628
+
629
+ 表格编辑对话框组件
630
+
631
+ **Props:**
632
+
633
+ | 属性名 | 类型 | 默认值 | 说明 |
634
+ | ------ | ------------------ | ------- | ------------ |
635
+ | title | `string` | `''` | 对话框的标题 |
636
+ | width | `string \| number` | `'50%'` | 对话框的宽度 |
637
+
638
+ **Slots:**
639
+
640
+ - `default` - 对话框内容
641
+
642
+ **使用示例:**
643
+
644
+ ```vue
645
+ <template>
646
+ <JnDialog v-model="dialogVisible" title="编辑">
647
+ <el-form>
648
+ <!-- 表单内容 -->
649
+ </el-form>
650
+ </JnDialog>
651
+ </template>
652
+
653
+ <script setup>
654
+ import { ref } from 'vue'
655
+
656
+ const dialogVisible = ref(false)
657
+ </script>
658
+ ```
659
+
660
+ ---
661
+
662
+ #### JnDatetime
663
+
664
+ 显示时间格式化组件,第一行是日期,第二行是时间
665
+
666
+ **Props:**
667
+
668
+ | 属性名 | 类型 | 默认值 | 说明 |
669
+ | ------ | -------- | ------ | --------------------------------- |
670
+ | value | `string` | `''` | 时间字符串(支持 ISO 或空格分隔) |
671
+ | color | `string` | `''` | 文字颜色 |
672
+
673
+ **使用示例:**
674
+
675
+ ```vue
676
+ <template>
677
+ <JnDatetime value="2024-01-01 12:00:00" color="#409EFF" />
678
+ </template>
679
+ ```
680
+
681
+ ---
682
+
683
+ #### GlobalSetting
684
+
685
+ 全局设置组件(用于系统设置面板)
686
+
687
+ **说明:** 该组件通常用于系统设置页面,提供语言、主题、主题色等配置的 UI 界面。
688
+
689
+ ---
690
+
691
+ ### @jnrs/vue-core/composables 模块
692
+
693
+ #### useMouseSelection
694
+
695
+ 鼠标框选表格进行多选
696
+
697
+ **参数:**
698
+
699
+ | 参数名 | 类型 | 默认值 | 说明 |
700
+ | -------------- | ------------------------------- | ----------------- | -------------- |
701
+ | containerClass | `string` | `'jn_table'` | 表格或容器类名 |
702
+ | rowClass | `string` | `'el-table__row'` | 表格行类名 |
703
+ | callback | `(rows: HTMLElement[]) => void` | `handleSelection` | 框选后的回调 |
704
+
705
+ **返回值:**
706
+
707
+ | 返回值 | 类型 | 说明 |
708
+ | --------------- | ----------------------------- | -------------------- |
709
+ | handleMouseDown | `(event: MouseEvent) => void` | 鼠标按下事件处理函数 |
710
+
711
+ **使用示例:**
712
+
713
+ ```vue
714
+ <template>
715
+ <el-table class="jn_table" @mousedown="handleMouseDown" @selection-change="handleSelectionChange">
716
+ <!-- 表格列 -->
717
+ </el-table>
718
+ </template>
719
+
720
+ <script setup>
721
+ import { useMouseSelection } from '@jnrs/vue-core/composables'
722
+
723
+ const { handleMouseDown } = useMouseSelection({
724
+ containerClass: 'jn_table',
725
+ callback: (rows) => {
726
+ console.log('框选的行', rows)
727
+ }
728
+ })
729
+
730
+ const handleSelectionChange = (selection) => {
731
+ console.log('选中项', selection)
732
+ }
733
+ </script>
734
+ ```
735
+
736
+ ---
737
+
738
+ #### useReactivityTableHeight
739
+
740
+ 响应式根据视口动态计算表格高度
741
+
742
+ **参数:**
743
+
744
+ | 参数名 | 类型 | 默认值 | 说明 |
745
+ | --------- | -------- | ------------ | -------- |
746
+ | className | `string` | `'el-table'` | 表格类名 |
747
+ | bottomGap | `number` | `77` | 底部间隔 |
748
+
749
+ **返回值:**
750
+
751
+ | 返回值 | 类型 | 说明 |
752
+ | --------- | ------------- | ------------ |
753
+ | maxHeight | `Ref<number>` | 表格最大高度 |
754
+
755
+ **UseReactivityTableHeightOptions 类型:**
756
+
757
+ ```typescript
758
+ interface UseReactivityTableHeightOptions {
759
+ className?: string // 表格类名
760
+ bottomGap?: number // 底部间隔
761
+ }
762
+ ```
763
+
764
+ **使用示例:**
765
+
766
+ ```vue
767
+ <template>
768
+ <el-table :max-height="maxHeight">
769
+ <!-- 表格内容 -->
770
+ </el-table>
771
+ </template>
772
+
773
+ <script setup>
774
+ import { useReactivityTableHeight } from '@jnrs/vue-core/composables'
775
+
776
+ const { maxHeight } = useReactivityTableHeight({
777
+ className: 'my-table',
778
+ bottomGap: 100
779
+ })
780
+ </script>
781
+ ```
782
+
783
+ **特性:**
784
+
785
+ - 自动监听窗口 resize 事件
786
+ - 防抖处理(300ms)
787
+ - 支持 keep-alive 缓存组件
788
+
789
+ ---
790
+
791
+ #### useWebSocket
792
+
793
+ WebSocket 封装(支持心跳机制)
794
+
795
+ **参数:**
796
+
797
+ | 参数名 | 类型 | 默认值 | 说明 |
798
+ | ------------------------- | ------------------------ | ------- | ------------------ |
799
+ | url | `string` | — | WebSocket 地址 |
800
+ | connectionTimeoutDuration | `number` | `60000` | 网络超时时间(ms) |
801
+ | token | `string` | — | 认证信息 |
802
+ | heartbeat | `boolean` | `false` | 是否启用心跳 |
803
+ | heartbeatInterval | `number` | `30000` | 心跳间隔(ms) |
804
+ | heartbeatTimeout | `number` | `10000` | 心跳超时时间(ms) |
805
+ | showLog | `boolean` | `false` | 是否打印控制台信息 |
806
+ | showMessage | `boolean` | `true` | 是否显示消息弹框 |
807
+ | onOpen | `() => void` | — | 连接成功回调 |
808
+ | onMessage | `(data) => void` | — | 收到消息回调 |
809
+ | onClose | `() => void` | — | 连接关闭回调 |
810
+ | onError | `(error: Event) => void` | — | 连接错误回调 |
811
+
812
+ **返回值:**
813
+
814
+ | 返回值 | 类型 | 说明 |
815
+ | -------------- | ------------------------- | -------------- |
816
+ | ws | `Ref<WebSocket \| null>` | WebSocket 实例 |
817
+ | isLoading | `Ref<boolean>` | 是否正在加载中 |
818
+ | isConnected | `Ref<boolean>` | 是否已连接 |
819
+ | wsStateInfo | `Ref<string>` | 连接状态信息 |
820
+ | sendMessage | `(data: unknown) => void` | 发送消息函数 |
821
+ | closeWebSocket | `() => void` | 关闭连接函数 |
822
+
823
+ **使用示例:**
824
+
825
+ ```vue
826
+ <script setup>
827
+ import { useWebSocket } from '@jnrs/vue-core/composables'
828
+
829
+ const { ws, isConnected, sendMessage, closeWebSocket } = useWebSocket({
830
+ url: 'ws://localhost:8080/ws',
831
+ token: 'your-token',
832
+ heartbeat: true,
833
+ heartbeatInterval: 30000,
834
+ onOpen: () => {
835
+ console.log('WebSocket 连接成功')
836
+ },
837
+ onMessage: (data) => {
838
+ console.log('收到消息', data)
839
+ },
840
+ onClose: () => {
841
+ console.log('WebSocket 连接关闭')
842
+ },
843
+ onError: (error) => {
844
+ console.error('WebSocket 错误', error)
845
+ }
846
+ })
847
+
848
+ // 发送消息
849
+ sendMessage({ type: 'chat', content: 'Hello' })
850
+
851
+ // 关闭连接
852
+ closeWebSocket()
853
+ </script>
854
+ ```
855
+
856
+ **特性:**
857
+
858
+ - 自动重连机制
859
+ - 心跳检测(前端发送 `{type: 'ping'}`,后端需返回 `{type: 'pong'}`)
860
+ - 连接超时处理
861
+ - 支持组件激活/停用时自动管理连接
862
+ - 自动清理资源
863
+
864
+ ---
865
+
866
+ ## 🔍 完整使用示例
867
+
868
+ ```typescript
869
+ // 导入类型
870
+ import type { IPageData, IAttachment, IMenuItem } from '@jnrs/vue-core'
871
+
872
+ // 导入 Pinia Store
873
+ import { useSystemStore, useMenuStore } from '@jnrs/vue-core/pinia'
874
+
875
+ // 导入 Router
876
+ import { useRouter, handleRouter, createVueRouter } from '@jnrs/vue-core/router'
877
+
878
+ // 导入 Composables
879
+ import { useMouseSelection, useReactivityTableHeight, useWebSocket } from '@jnrs/vue-core/composables'
880
+
881
+ // 使用 System Store
882
+ const systemStore = useSystemStore()
883
+ systemStore.toggleCollapse()
884
+ systemStore.setMode('dark')
885
+
886
+ // 使用 Menu Store
887
+ const menuStore = useMenuStore()
888
+ await menuStore.asyncSetMenus(menus)
889
+
890
+ // 使用 Router
891
+ const router = useRouter()
892
+ await handleRouter({ name: 'dashboard' })
893
+
894
+ // 创建路由实例
895
+ const fileModules = import.meta.glob('/src/views/**/*.vue')
896
+ const router = createVueRouter({
897
+ options: { history: createWebHistory() },
898
+ fileModules,
899
+ layoutName: 'layout'
900
+ })
901
+
902
+ // 使用 Composables
903
+ const { handleMouseDown } = useMouseSelection()
904
+ const { maxHeight } = useReactivityTableHeight()
905
+ const { sendMessage } = useWebSocket({ url: 'ws://localhost:8080' })
906
+ ```
907
+
908
+ ---
909
+
910
+ ## 📝 注意事项
911
+
912
+ 1. **路由生成**:使用 `asyncGenerateRoute` 时,确保 `fileModules` 正确配置,组件路径必须以 `/` 开头且不能包含 `..`
913
+ 2. **菜单持久化**:`hasFetchedAsyncMenus` 不持久化,每次刷新页面需重新获取菜单
914
+ 3. **主题切换**:`useSystemStore` 会自动应用主题到 HTML 元素,支持 light/dark/auto 模式
915
+ 4. **WebSocket 心跳**:启用心跳时,后端必须响应 `{type: 'pong'}` 消息
916
+ 5. **表格高度**:`useReactivityTableHeight` 会自动监听窗口变化,建议配合 JnTable 的 `autoHeight` 属性使用
917
+ 6. **鼠标框选**:`useMouseSelection` 需要在表格上绑定 `@mousedown` 事件
918
+ 7. **类型安全**:所有导出均提供完整的 TypeScript 类型定义
919
+
920
+ ---
921
+
922
+ ## 📄 License
923
+
924
+ UNLICENSED
package/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # @jnrs/vue-core
2
2
 
3
3
  ## ✨ 介绍
4
+
4
5
  巨能前端工程化开发,Vue 专用核心功能包。
6
+
5
7
  - Pinia store
6
8
  - Vue composables
7
9
  - Vue Router
@@ -10,14 +12,17 @@
10
12
  - 公共 Vue 组件
11
13
 
12
14
  ## 💻 技术栈
15
+
13
16
  TypeScript、Vue3 生态
14
17
 
15
18
  ## 🧩 安装教程
19
+
16
20
  ```shell
17
21
  pnpm add @jnrs/vue-core
18
22
  ```
19
23
 
20
24
  ## 🔍 使用示例
25
+
21
26
  ```typescript
22
27
  import type { IPageData } from '@jnrs/vue-core'
23
28
  import { useRouter, useRoute } from '@jnrs/vue-core/router'
@@ -26,232 +31,4 @@ import { useSystemStore } from '@jnrs/vue-core/pinia'
26
31
 
27
32
  ## 📋 API
28
33
 
29
- #### @jnrs/vue-core 模块
30
- 接口
31
-
32
- - ElSize(Element 尺寸类型)
33
- ```
34
- 类型定义:字面量联合类型
35
- 可选值:'' | 'large' | 'default' | 'small'
36
- ```
37
-
38
- - ElButtonType(Element 按钮类型)
39
- ```
40
- 类型定义:字面量联合类型
41
- 可选值:'default' | 'primary' | 'success' | 'info' | 'warning' | 'text' | 'danger'
42
- ```
43
-
44
- - IMenuItem 菜单项
45
-
46
- | 属性名 | 描述 | 类型 |
47
- |--------|------|------|
48
- | meta | 路由元信息 | `RouteMeta` |
49
- | path | 路径 | `string` |
50
- | name | 名称(可选) | `string` |
51
- | component | 组件路径(可选) | `string` |
52
- | redirect | 重定向路径(可选) | `string` |
53
- | children | 子菜单项(可选) | `IMenuItem[]` |
54
-
55
- - Attachment(文件信息)
56
-
57
- | 属性名 | 描述 | 类型 |
58
- |--------|------|------|
59
- | id | 数据 id | `number` |
60
- | documentId | 文件 id | `number` |
61
- | fileName | 文件名 | `string` |
62
- | uniqueFileName | 文件名唯一标识(用于文件获取 API) | `string` |
63
- | fileType | MIME 类型 | `string` |
64
- | fileSize | 文件大小(单位:字节) | `number` |
65
-
66
- - Pagination(分页)
67
-
68
- | 属性名 | 描述 | 类型 |
69
- |--------|------|------|
70
- | pageNo | 当前页码 | `number` |
71
- | pageSize | 每页大小 | `number` |
72
-
73
- - IPageData<T>(分页列表数据)继承自 IPagination
74
-
75
- | 属性名 | 描述 | 类型 |
76
- |--------|------|------|
77
- | list | 数据列表 | `T[]` |
78
- | count | 数据总数 | `number` |
79
-
80
-
81
- #### @jnrs/vue-core/pinia 模块
82
- 函数
83
- ``` typescript
84
- /**
85
- * useSystemStore 系统仓库
86
- * @returns theme 主题(国际化、主题、自定义强调色)
87
- * @returns menuCollapse 菜单是否折叠
88
- * @returns documentFullscreen 文档是否全屏
89
- * @methods toggleCollapse 折叠菜单切换
90
- * @methods toggleFullScreen 全屏切换
91
- * @methods setTheme 设置主题
92
- */
93
- ```
94
- ``` typescript
95
- /**
96
- * useMenuStore 菜单仓库
97
- * @returns hasFetchedAsyncMenus 菜单是否已获取
98
- * @returns menus 菜单项
99
- * @methods asyncSetMenus 设置菜单信息
100
- * @methods asyncClearMenu 清除菜单信息
101
- */
102
- ```
103
-
104
- #### @jnrs/vue-core/router 模块
105
- 接口
106
- - RouteMeta
107
- - RouteLocationNormalizedGeneric
108
- - RouteLocationNormalizedLoadedGeneric
109
- - FileModules
110
-
111
- 函数
112
- - useRouter 原生 vue-router 函数
113
- - useRoute 原生 vue-router 函数
114
- - handleRouter 路由跳转或替换
115
- - getRoutes 获取已注册路由
116
- - createVueRouter 创建 vue-router 实例
117
- - asyncGenerateRoute 设置动态路由,生成路由记录
118
-
119
- #### @jnrs/vue-core/components 模块
120
- Vue 组件
121
- - JnTable 表格组件
122
-
123
- | 属性名 | 描述 | 类型 | 默认值 |
124
- |--------|------|------|--------|
125
- | data | 表数据 | `Record<string, any>[]` | — |
126
- | rowKey | 行数据的 Key,在使用 reserve-selection 功能与显示树形数据时,该属性是必填的。支持多层访问:user.info.id | `string` | `'id'` |
127
- | showScrollbar | 总是显示横向滚动条 | `boolean` | `false` |
128
- | height | 表格高度,默认为 100% | `string \| number` | `'100%'` |
129
- | autoHeight | 表格高度是否自动计算 | `boolean` | `false` |
130
- | autoHeightOptions | 表格高度自动计算配置项 | `UseReactivityTableHeighOptions` | `{}` |
131
- | showIndexColumn | 是否显示序号列 | `boolean` | `false` |
132
- | showSelectionColumn | 是否显示选择列 | `boolean` | `false` |
133
- | showMouseSelection | 是否开启鼠标框选 | `boolean` | `false` |
134
- | pagination | 当前页码和每页大小(用于序号计算) | `IPagination` | `{ pageNo: 0, pageSize: 0 }` |
135
-
136
- - JnSelectTemplate 选择组件通用模板
137
-
138
- | 属性名 | 描述 | 类型 | 默认值 |
139
- |--------|------|------|--------|
140
- | listApi | 列表接口(必填) | `Function` | — |
141
- | tableName | 列表名称 | `string` | `''` |
142
- | tableWidth | 列表宽度 | `string` | `'60%'` |
143
- | listParams | 列表查询参数 | `Record<string, unknown>` | `{}` |
144
- | listParamsHandle | 列表查询参数前置处理函数 | `(params: Record<string, unknown>) => Record<string, unknown>` | `(params) => params` |
145
- | listParamsHandleAfter | 列表查询参数后置处理函数 | `(params: Record<string, unknown>) => Record<string, unknown>` | `(params) => params` |
146
- | keyValue | 真实数据匹配的键值对名,后续取值赋值都用 keyValue.name 和 keyValue.id | `{ name: string; id: string; [key: string]: string }` | `{ name: 'name', id: 'id' }` |
147
- | optionSecondaryField | keyValue 的拓展字段,用于 el-option 中显示,使用时必须在 keyValue 中定义 | `string` | — |
148
- | modelValue | 双向绑定值(支持多种类型) | `Record<string, unknown> \| Record<string, unknown>[] \| number \| string` | — |
149
- | width | 宽度 | `string` | `'100%'` |
150
- | simpleValue | 简单数据类型,仅返回 keyValue.id | `boolean` | `true` |
151
- | showAllTips | option 组件是否显示 [全部] | `boolean` | `false` |
152
- | onlyOption | 仅显示选择器 | `boolean` | `false` |
153
- | onlyButton | 仅显示选择按钮 | `boolean` | `false` |
154
- | filterable | 是否可筛选 | `boolean` | `true` |
155
- | clearable | 是否可清空 | `boolean` | `true` |
156
- | buttonDialogText | 按钮文字 | `string` | `'更多'` |
157
- | size | 按钮大小 | `ElSize` | `'default'` |
158
- | plain | 按钮 plain | `boolean` | `true` |
159
- | formRef | 父级组件的表单对象 | `FormInstance` | `null` |
160
- | validateFieldName | 父级表单验证的字段名(使用时必须同时传递 formRef) | `string` | `''` |
161
- | limit | 可选择的数量 | `number` | `1` |
162
- | queryForm | 表单查询参数 | `Record<string, unknown>` | — |
163
- | initialParams | 初始查询参数 | `Record<string, unknown>` | — |
164
- | remoteFilterKey | 下拉框查询参数远程过滤参数的 key 值 | `string` | `'name'` |
165
-
166
- - JnPdfView PDF 文件预览组件
167
-
168
- | 属性名 | 描述 | 类型 | 默认值 |
169
- |--------|------|------|--------|
170
- | fileList | 文件列表 | `IFileItem[]` | `[]` |
171
- | showFileName | 是否显示文件名 | `boolean` | `true` |
172
- | isPdf | 是否是 pdf 文件(pdf 文件直接预览,其他文件下载) | `boolean` | `false` |
173
- | windowWidth | 预览窗口宽度 | `number` | `800` |
174
- | windowHeight | 预览窗口高度 | `number` | `600` |
175
-
176
- - JnPagination 分页组件
177
-
178
- | 属性名 | 描述 | 类型 | 默认值 |
179
- |--------|------|------|--------|
180
- | modelValue | 分页模型值 | `IPagination` | `{ pageNo: 1, pageSize: 20 }` |
181
- | total | 总条数 | `number` | `0` |
182
- | size | 按钮尺寸 | `ComponentSize` | `'small'` |
183
- | background | 是否带背景色 | `boolean` | `true` |
184
- | marginTop | 上边距 | `string` | `'10px'` |
185
-
186
- - JnImportAndExport 导入 & 导出,此组件依赖 JnFileUpload 文件上传组件
187
-
188
- | 属性名 | 描述 | 类型 | 默认值 |
189
- |--------|------|------|--------|
190
- | importTemplateApi | 下载导入模板文件的 api 函数 | `() => Promise<Blob>` | — |
191
- | importApi | 数据导入 api 函数 | `(data: FormData) => Promise<IFullResponse>` | — |
192
- | importFieldName | 数据导入的字段名 | `string` | `'file'` |
193
- | importParams | 导入的参数 | `Record<string, unknown>` | — |
194
- | fileUploadConfig | 导入的文件上传配置 | `{ accept: string; limit: number }` | `{ accept: '.xls,.xlsx', limit: 1 }` |
195
- | importBtnName | 导入的按钮名称 | `string` | `'导入'` |
196
- | importDisabled | 是否禁用导入按钮 | `boolean` | `false` |
197
- | exportApi | 数据导出的 api 函数 | `(data: Record<string, unknown>) => Promise<Blob>` | — |
198
- | exportParams | 导出的参数 | `Record<string, unknown>` | — |
199
- | exportDynamicParamsConfig | 导出操作时,MessageBox 的参数配置 | `{ label: string; prop: string }` | — |
200
- | messageBoxInputPattern | MessageBox 中输入框的校验表达式(正则) | `RegExp` | `/^\S+(?:\s+\S+)* $ /` |
201
- | messageBoxInputErrorMessage | 校验未通过时的提示文本 | `string` | `'请输入参数'` |
202
- | exportBtnName | 导出的按钮名称 | `string` | `'导出'` |
203
- | exportDisabled | 是否禁用导出按钮 | `boolean` | `false` |
204
- | size | 按钮尺寸 | `ElSize` | `'default'` |
205
- | buttonType | 按钮类型 | `ElButtonType` | `'primary'` |
206
- | plain | 是否为朴素按钮 | `boolean` | `true` |
207
- | text | 是否为文字按钮 | `boolean` | `false` |
208
- | icon | 是否显示图标 | `boolean` | `true` |
209
-
210
- - JnImageView 图片预览组件
211
-
212
- | 属性名 | 描述 | 类型 | 默认值 |
213
- |--------|------|------|--------|
214
- | src | 图片源地址,同原生属性一致 | `string` | `''` |
215
- | previewSrcList | 开启图片预览功能 | `IFileItem[]` | `[]` |
216
- | preview | 是否开启预览功能 | `boolean` | `false` |
217
- | height | 图片高度 | `string` | — |
218
- | maxHeight | 图片最大高度 | `string` | `'200px'` |
219
-
220
- - JnFileUpload 通用上传 & 回显组件
221
-
222
- | 属性名 | 描述 | 类型 | 默认值 |
223
- |--------|------|------|--------|
224
- | modelValue | 绑定的模型值(文件列表) | `MixedUploadFile[]` | — |
225
- | uploadName | 上传的文件字段名 | `string` | `'file'` |
226
- | drag | 是否启用拖拽上传 | `boolean` | `false` |
227
- | disabled | 是否禁用 | `boolean` | `false` |
228
- | showFileList | 是否显示已上传文件列表 | `boolean` | `true` |
229
- | accept | 接受的文件类型(如 .xls,.xlsx) | `string` | `''` |
230
- | fileSizeMb | 单个文件大小限制(单位:MB) | `number` | `100` |
231
- | limit | 最大上传文件数量,0 表示不限制 | `number` | `0` |
232
- | size | Element Plus 组件的尺寸 | `'' \| 'small' \| 'default' \| 'large'` | `'small'` |
233
- | formRef | 父级组件的表单引用 | `FormInstance` | — |
234
- | validateFieldName | 父级表单中用于校验的字段名 | `string` | `''` |
235
- | downloadFileFn | 文件下载的函数 | `(data: IAttachment) => void` | — |
236
- | autoUploadApi | 自动上传文件的 api 函数 | `(data: File) => void` | — |
237
-
238
- - JnDialog 表格编辑组件
239
-
240
- | 属性名 | 描述 | 类型 | 默认值 |
241
- |--------|------|------|--------|
242
- | title | 对话框的标题 | `string` | `''` |
243
- | width | 对话框的宽度 | `string \| number` | `'50%'` |
244
-
245
- - JnDatetime 显示时间格式化,第一行是日期,第二行是时间
246
-
247
- | 属性名 | 描述 | 类型 | 默认值 |
248
- |--------|------|------|--------|
249
- | value | 时间字符串(支持 ISO 或空格分隔) | `string` | `''` |
250
- | color | 文字颜色 | `string` | `''` |
251
-
252
-
253
- #### @jnrs/vue-core/composables 模块
254
- Vue 组合式 API
255
- - useMouseSelection 鼠标框选表格进行多选
256
- - useReactivityTableHeight 响应式根据视口动态计算表格高度
257
- - useWebSocket WebSocket 封装(支持心跳机制)
34
+ 详细文档请查看 `AGENTIC.md`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jnrs/vue-core",
3
- "version": "1.2.16",
3
+ "version": "1.2.18",
4
4
  "description": "巨能前端工程化开发,Vue 专用核心功能包。",
5
5
  "keywords": [
6
6
  "jnrs",
@@ -21,6 +21,7 @@
21
21
  "files": [
22
22
  "dist",
23
23
  "README.md",
24
+ "AGENTIC.md",
24
25
  "LICENSE"
25
26
  ],
26
27
  "exports": {
@@ -58,7 +59,7 @@
58
59
  "vue": "^3.5.22",
59
60
  "vue-i18n": "^11.2.8",
60
61
  "vue-router": "^4.5.1",
61
- "@jnrs/shared": "1.1.23"
62
+ "@jnrs/shared": "1.1.25"
62
63
  },
63
64
  "devDependencies": {
64
65
  "@vitejs/plugin-vue": "^6.0.1",