jtxa-ui 1.0.8 → 1.0.9
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 +683 -5
- package/dist/{index-Ch7iPgVS.js → index-Csez7dY_.js} +7578 -7370
- package/dist/{jt-form-mttable-pc-CmTuvxWF.js → jt-form-mttable-pc-1ao9Ic-W.js} +2 -2
- package/dist/jtxa-ui.css +1 -1
- package/dist/jtxa-ui.es.js +1 -1
- package/dist/jtxa-ui.umd.js +12 -12
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,15 +1,693 @@
|
|
|
1
1
|
# jtxa-ui
|
|
2
2
|
|
|
3
|
+
> 基于 Vue 3 + VxeTable + Element Plus + ECharts 的企业级组件库(v1.0.8,MIT License)。
|
|
4
|
+
|
|
5
|
+
`jtxa-ui` 把项目中高频使用的「动态表单、表格(含树表/分组表/大数据增量表)、文件分片上传、ECharts 图表、高级查询构造器、管理树表页面」封装为一套开箱即用的 Vue 3 组件,统一了 VxeTable 与 Element Plus 的注册与样式,帮助业务系统快速搭建数据管理类界面。
|
|
6
|
+
|
|
7
|
+
- 技术栈:Vue `^3.5` · Vite `^7`(library mode)· VxeTable `~4.17.38` / vxe-pc-ui `4.11.34` · Element Plus `^2.13` · ECharts `^6`
|
|
8
|
+
- 仓库:`https://gitlab.cdjti.com/pub/jtxa-ui.git`
|
|
9
|
+
- 作者:leevan
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 目录
|
|
14
|
+
|
|
15
|
+
- [安装](#安装)
|
|
16
|
+
- [快速上手](#快速上手)
|
|
17
|
+
- [组件总览](#组件总览)
|
|
18
|
+
- [组件详细文档](#组件详细文档)
|
|
19
|
+
- [Form 动态表单](#1-form-动态表单-jt-form)
|
|
20
|
+
- [JtUpload 分片上传](#2-jtupload-分片上传-jt-upload)
|
|
21
|
+
- [Echart 图表](#3-echart-图表-jt-chart)
|
|
22
|
+
- [SearchType 高级查询](#4-searchtype-高级查询-search-type)
|
|
23
|
+
- [ManageTreeTable 管理树表](#5-managetreetable-管理树表-manage-tree-table)
|
|
24
|
+
- [TableBase 基础表格](#6-tablebase-基础表格-table-base)
|
|
25
|
+
- [TableGroup 分组树表](#7-tablegroup-分组树表-table-group)
|
|
26
|
+
- [TableBigData 大数据表](#8-tablebigdata-大数据增量表-table-big-data)
|
|
27
|
+
- [TreeTable 虚拟树表](#9-treetable-虚拟树表-tree-table)
|
|
28
|
+
- [共享表格属性 publicProps](#共享表格属性-publicprops)
|
|
29
|
+
- [工具函数](#工具函数)
|
|
30
|
+
- [已知问题与注意事项](#已知问题与注意事项)
|
|
31
|
+
- [相关文档](#相关文档)
|
|
32
|
+
- [开发](#开发)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 安装
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
# 使用你项目的包管理器安装本库
|
|
40
|
+
npm install jtxa-ui
|
|
41
|
+
# 或
|
|
42
|
+
pnpm add jtxa-ui
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`jtxa-ui` 将 `vue`、`element-plus`、`echarts` 在构建时 **external(外部化)**,因此消费方需自行提供这些运行时依赖(peer):
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
# 必须安装的对等依赖
|
|
49
|
+
npm install vue@^3.5 element-plus@^2.13 echarts@^6.0
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
> 说明:`echarts` 当前列在 `dependencies` 中(安装本库时会自动带入),但构建时被 external 化,请确保项目内 `echarts` 版本为 `^6` 且与库兼容;使用图表组件前需保证 `echarts` 可被模块解析到。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 快速上手
|
|
57
|
+
|
|
58
|
+
### 全局注册(推荐)
|
|
59
|
+
|
|
60
|
+
```js
|
|
61
|
+
// main.js
|
|
62
|
+
import { createApp } from 'vue'
|
|
63
|
+
import App from './App.vue'
|
|
64
|
+
|
|
65
|
+
import ElementPlus from 'element-plus'
|
|
66
|
+
import 'element-plus/dist/index.css'
|
|
67
|
+
|
|
68
|
+
import jtui from 'jtxa-ui'
|
|
69
|
+
import 'jtxa-ui/dist/jtxa-ui.css'
|
|
70
|
+
|
|
71
|
+
const app = createApp(App)
|
|
72
|
+
app.use(ElementPlus) // 先注册 Element Plus
|
|
73
|
+
app.use(jtui) // 再注册 jtxa-ui(内部会注册 VxeTable 与一批 Element Plus 组件、指令)
|
|
74
|
+
app.mount('#app')
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
注册后,下列标签即可在模板中直接使用:`<jt-form>`、`<jt-upload>`、`<jt-chart>`、`<search-type>`、`<table-base>`、`<table-group>`、`<table-big-data>`、`<tree-table>`。
|
|
78
|
+
|
|
79
|
+
### 按需引入
|
|
80
|
+
|
|
81
|
+
每个子包都自带 `.install` 方法,可单独 `app.use(...)`:
|
|
82
|
+
|
|
83
|
+
```js
|
|
84
|
+
import { Form, TableBase, TreeTable } from 'jtxa-ui'
|
|
85
|
+
app.use(Form)
|
|
86
|
+
app.use(TableBase)
|
|
87
|
+
app.use(TreeTable)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
> ⚠️ **`manage-tree-table` 默认不通过 `app.use(jtui)` 全局注册**,使用它时需要局部引入:
|
|
91
|
+
>
|
|
92
|
+
> ```vue
|
|
93
|
+
> <script setup>
|
|
94
|
+
> import { ManageTreeTable } from 'jtxa-ui' // 具名导入(推荐)
|
|
95
|
+
> </script>
|
|
96
|
+
> <template>
|
|
97
|
+
> <manage-tree-table :axios="axios" :config="config" :mode="1" />
|
|
98
|
+
> </template>
|
|
99
|
+
> ```
|
|
100
|
+
>
|
|
101
|
+
> 也可 `app.use(ManageTreeTable)` 做全局注册(`packages/manage-tree-table/index.js` 已挂 `.install`)。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 组件总览
|
|
106
|
+
|
|
107
|
+
| 组件(导出名) | 模板标签 | 底层依赖 | 用途 |
|
|
108
|
+
| --- | --- | --- | --- |
|
|
109
|
+
| `Form` | `<jt-form>` | Element Plus + wangEditor | 基于 `formConfig` 动态生成表单,支持多种控件、inline/descriptions 布局、级联懒加载、辅助输入抽屉 |
|
|
110
|
+
| `JtUpload` | `<jt-upload>` | simple-uploader.js | 分片 / 断点续传文件上传,成功后回调合并接口 |
|
|
111
|
+
| `Echart` | `<jt-chart>` | ECharts | 图表封装,自动刻度、双 Y 轴、X 轴时间间隔、样式持久化 |
|
|
112
|
+
| `SearchType` | `<search-type>` | Element Plus + jt-form | 动态查询条件构造器,支持分组(并且/或者)、级联、复选、树选择 |
|
|
113
|
+
| `ManageTreeTable` | `<manage-tree-table>` | Element Plus + 各面板 | 管理树表页面组件,按 `mode`/`pageMode` 派发不同版式(看板/树表等) |
|
|
114
|
+
| `TableBase` | `<table-base>` | VxeTable | 基础表格:工具栏、表尾统计、虚拟滚动、单选/多选、分组表头、展开行、操作列 |
|
|
115
|
+
| `TableGroup` | `<table-group>` | VxeTable | 分组树表,按 `groupField` 把行归并到父行 |
|
|
116
|
+
| `TableBigData` | `<table-big-data>` | VxeTable | 大数据增量加载表,触底加载 + 表尾统计 |
|
|
117
|
+
| `TreeTable` | `<tree-table>` | VxeTable | 懒加载虚拟树表,单元格自动渲染 radio/复选/富文本,树节点懒加载 |
|
|
118
|
+
|
|
119
|
+
> 其余 `packages/` 下 60+ 个 `.vue` 为内部子组件 / 渲染器 / 看板 / 构建部署件,**不对外暴露**,请勿直接引用。
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 组件详细文档
|
|
124
|
+
|
|
125
|
+
### 1. Form 动态表单(`jt-form`)
|
|
126
|
+
|
|
127
|
+
基于 `formConfig` 数组动态渲染表单,自动处理校验、级联懒加载与辅助输入。
|
|
128
|
+
|
|
129
|
+
**来源**:`packages/form/index.vue`
|
|
130
|
+
|
|
131
|
+
**Props**
|
|
132
|
+
|
|
133
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
134
|
+
| --- | --- | --- | --- |
|
|
135
|
+
| `id` | String / Number | — | **必填**,表单唯一标识 |
|
|
136
|
+
| `model` | Object | — | **必填**,表单数据对象 |
|
|
137
|
+
| `formConfig` | Array | — | **必填**,字段配置数组(见下) |
|
|
138
|
+
| `labelWidth` | String | `'80px'` | 标签宽度 |
|
|
139
|
+
| `inline` | Boolean | `false` | 是否行内布局 |
|
|
140
|
+
| `size` | String | `'default'` | 尺寸 |
|
|
141
|
+
| `labelPosition` | String | `'right'` | 标签位置 |
|
|
142
|
+
| `rules` | Object | `{}` | 校验规则 |
|
|
143
|
+
| `col` | Number | `1` | 每行字段列数 |
|
|
144
|
+
| `border` | Boolean | `false` | 是否显示边框(descriptions 布局) |
|
|
145
|
+
| `collapseTags` | Boolean | `false` | 多选标签折叠 |
|
|
146
|
+
| `axios` | Function | — | 级联懒加载等远程请求方法 |
|
|
147
|
+
| `title` | String | `''` | 表单标题 |
|
|
148
|
+
| `lazyLoadParams` | Object | `null` | 级联懒加载参数 |
|
|
149
|
+
| `autoInputConfig` | Object | `null` | 辅助输入抽屉配置 |
|
|
150
|
+
|
|
151
|
+
**`formConfig` 字段 `type` 支持**:`empty` / `upload` / `custom` / `text` / `input` / `textarea` / `iNumber` / `select` / `select_r` / `cascader` / `date` / `time` / `switch` / `checkbox` / `radio` / `autocomplete` / `htmlarea`(富文本)。
|
|
152
|
+
|
|
153
|
+
**Events**:`switchChange` · `focus` · `blur` · `casChange` · `cusBtn`
|
|
154
|
+
|
|
155
|
+
**Slots**:
|
|
156
|
+
|
|
157
|
+
- `upload`:当字段 `type: 'upload'` 时,使用 `item.slotName`(默认 `upload`)具名插槽渲染上传区;
|
|
158
|
+
- `custom`:当字段 `type: 'custom'` 时,使用 `item.slotName` 具名插槽渲染自定义内容。
|
|
159
|
+
|
|
160
|
+
**暴露方法(模板 `ref` 可访问)**:`validateAll()`(返回 `el-form.validate()` Promise)· `resetAll()` · `openAutoInput()` · `casChange` · `itemClick` · `switchChange` · `focus` · `blur`
|
|
161
|
+
|
|
162
|
+
**真实示例**(取自 `examples/pages/form-page.vue`):
|
|
163
|
+
|
|
164
|
+
```vue
|
|
165
|
+
<jt-form
|
|
166
|
+
id="onDutyPoepleSignIn"
|
|
167
|
+
ref="onDutyPoepleSignIn"
|
|
168
|
+
title="测试表单"
|
|
169
|
+
:model="model"
|
|
170
|
+
:formConfig="formConfig"
|
|
171
|
+
label-width="100px"
|
|
172
|
+
labelPosition="right"
|
|
173
|
+
:rules="rules"
|
|
174
|
+
size="small"
|
|
175
|
+
border
|
|
176
|
+
collapseTags
|
|
177
|
+
:axios="axios"
|
|
178
|
+
:lazyLoadParams="lazyLoadParams"
|
|
179
|
+
@switchChange="switchChange"
|
|
180
|
+
:autoInputConfig="autoInputConfig"
|
|
181
|
+
></jt-form>
|
|
182
|
+
|
|
183
|
+
<script setup>
|
|
184
|
+
// 校验与重置
|
|
185
|
+
const onDutyPoepleSignIn = ref()
|
|
186
|
+
await onDutyPoepleSignIn.value.validateAll()
|
|
187
|
+
onDutyPoepleSignIn.value.resetAll()
|
|
188
|
+
</script>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### 2. JtUpload 分片上传(`jt-upload`)
|
|
194
|
+
|
|
195
|
+
基于 `simple-uploader.js` 的分片 / 断点续传上传组件,分片上传成功后再请求合并接口。
|
|
196
|
+
|
|
197
|
+
**来源**:`packages/upload/JtUpload.vue`
|
|
198
|
+
|
|
199
|
+
**Props**
|
|
200
|
+
|
|
201
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
202
|
+
| --- | --- | --- | --- |
|
|
203
|
+
| `target` | String | — | **必填**,分片 / 校验地址 |
|
|
204
|
+
| `mergePath` | String | — | **必填**,合并接口地址 |
|
|
205
|
+
| `simultaneousUploads` | Number | `3` | 并发上传数 |
|
|
206
|
+
| `text` | String | `'点击上传'` | 按钮文案 |
|
|
207
|
+
| `accept` | String | `'*/*'` | 接受的文件类型 |
|
|
208
|
+
| `singleFile` | Boolean | `false` | 是否单文件 |
|
|
209
|
+
| `allowDuplicateUploads` | Boolean | `true` | 是否允许重复文件 |
|
|
210
|
+
| `autoStart` | Boolean | `true` | 选择后自动开始 |
|
|
211
|
+
| `singleMode` | Boolean | `false` | 单文件模式 |
|
|
212
|
+
| `axios` | Function | — | 自定义请求方法 |
|
|
213
|
+
|
|
214
|
+
**Events**:`success`(response) · `error`(rootFile, file, message, chunk) · `added`(file) · `addeds`(files, fileList) · `removed`(file)
|
|
215
|
+
|
|
216
|
+
**暴露方法**:`getFiles()`(返回 `fileList`)· `goOnUpload()`(续传)· `clearList()`
|
|
217
|
+
|
|
218
|
+
**真实示例**(取自 `examples/pages/form-page.vue`):
|
|
219
|
+
|
|
220
|
+
```vue
|
|
221
|
+
<jt-upload
|
|
222
|
+
:autostart="true"
|
|
223
|
+
target="/jtrequest/upf/telemetry_duty/chunk"
|
|
224
|
+
mergePath="/jtrequest/upf/telemetry_duty/mergeFile"
|
|
225
|
+
:axios="axios"
|
|
226
|
+
:simultaneousUploads="4"
|
|
227
|
+
@success="success"
|
|
228
|
+
></jt-upload>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
在 `jt-form` 中以 `#upload` 插槽内嵌(取自 `examples/pages/tree-table-page.vue`):
|
|
232
|
+
|
|
233
|
+
```vue
|
|
234
|
+
<jt-form id="test123" :model="model" :formConfig="formConfig">
|
|
235
|
+
<template v-slot:upload>
|
|
236
|
+
<div style="width: 400px">
|
|
237
|
+
<jt-upload :target="'currentPage.props.chunk'" :mergePath="'currentPage.props.mergeFile'" />
|
|
238
|
+
</div>
|
|
239
|
+
</template>
|
|
240
|
+
</jt-form>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
### 3. Echart 图表(`jt-chart`)
|
|
246
|
+
|
|
247
|
+
ECharts 封装:自动计算 Y 轴最大/最小值与刻度精度、按时间范围计算 X 轴间隔、网格线 / 刻度可视化配置弹窗,`localStorage` 持久化样式。
|
|
248
|
+
|
|
249
|
+
**来源**:`packages/echarts/index.vue`
|
|
250
|
+
|
|
251
|
+
**Props**
|
|
252
|
+
|
|
253
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
254
|
+
| --- | --- | --- | --- |
|
|
255
|
+
| `id` | String | — | **必填**,图表容器 id(同页多图需唯一) |
|
|
256
|
+
| `timeRange` | Array | — | 时间范围,用于计算 X 轴间隔 |
|
|
257
|
+
| `data` | Array | — | **必填**,series 数组,每项含 `type/name/data`,支持 `yAxisIndex` 双 Y 轴 |
|
|
258
|
+
| `yMaxAndMinkeepDecimal` | Number | `0` | Y 轴最大/最小值保留小数位 |
|
|
259
|
+
| `maxAndMinLevel` | Number | `0.05` | 最大/最小容差比例 |
|
|
260
|
+
| `customIntrerVal` | Number | — | 自定义 X 轴间隔 |
|
|
261
|
+
| `yLeft` | String | `''` | 左 Y 轴名称 |
|
|
262
|
+
| `yRight` | String | `''` | 右 Y 轴名称 |
|
|
263
|
+
| `isSetting` | Boolean | `true` | 是否显示样式设置弹窗 |
|
|
264
|
+
|
|
265
|
+
**Events**:无显式声明。
|
|
266
|
+
|
|
267
|
+
**暴露方法**:`getVM()`(返回图表实例)
|
|
268
|
+
|
|
269
|
+
**真实示例**(取自 `examples/pages/jt-echart.vue`,多图表 v-for):
|
|
270
|
+
|
|
271
|
+
```vue
|
|
272
|
+
<jt-chart
|
|
273
|
+
v-for="(item, index) in testData"
|
|
274
|
+
:key="index"
|
|
275
|
+
:ref="(el) => setRef(el)"
|
|
276
|
+
:id="('single_chart' + index)"
|
|
277
|
+
:timeRange="item.timeRange"
|
|
278
|
+
:data="item.echartData"
|
|
279
|
+
></jt-chart>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
### 4. SearchType 高级查询(`search-type`)
|
|
285
|
+
|
|
286
|
+
动态查询条件构造器,支持分组(并且 / 或者)、多查询类型、级联、复选、树选择;内嵌 `jt-form` 与 `TreeSelect`。
|
|
287
|
+
|
|
288
|
+
**来源**:`packages/Search-Type/index.vue`
|
|
289
|
+
|
|
290
|
+
**Props**
|
|
291
|
+
|
|
292
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
293
|
+
| --- | --- | --- | --- |
|
|
294
|
+
| `options_type` | Array | — | 查询类型配置 |
|
|
295
|
+
| `listuri` | String | — | 选项列表接口 |
|
|
296
|
+
| `selected` | String | — | 当前选中的查询路径 |
|
|
297
|
+
| `axios` | Function | — | 请求方法 |
|
|
298
|
+
|
|
299
|
+
**Events**:`count` · `initedData`
|
|
300
|
+
|
|
301
|
+
**暴露方法**:`getData()`(返回查询条件数组)
|
|
302
|
+
|
|
303
|
+
**真实示例**(取自 `examples/pages/search.vue`):
|
|
304
|
+
|
|
305
|
+
```vue
|
|
306
|
+
<search-type
|
|
307
|
+
v-if="selpath !== '' && options.length"
|
|
308
|
+
ref="searchTypeRef"
|
|
309
|
+
:selected="selpath"
|
|
310
|
+
:options_type="options"
|
|
311
|
+
:axios="axios"
|
|
312
|
+
:listuri="listuri"
|
|
313
|
+
@initedData="initedData"
|
|
314
|
+
@count="count"
|
|
315
|
+
></search-type>
|
|
316
|
+
|
|
317
|
+
<script setup>
|
|
318
|
+
// 取构造好的查询条件
|
|
319
|
+
const conditions = searchTypeRef.value.getData()
|
|
320
|
+
</script>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
### 5. ManageTreeTable 管理树表(`manage-tree-table`)
|
|
326
|
+
|
|
327
|
+
顶层「管理树表」页面组件:渲染筛选栏,按 `mode` / `pageMode` 派发到不同 `mtt-panel-*` 版式(看板 / 树表等),处理根查询与单选切换版式。
|
|
328
|
+
|
|
329
|
+
**来源**:`packages/manage-tree-table/index.vue`
|
|
330
|
+
|
|
331
|
+
> ⚠️ 该组件**不**随 `app.use(jtui)` 全局注册,需局部引入(见[快速上手](#按需引入))。
|
|
332
|
+
|
|
333
|
+
**Props**
|
|
334
|
+
|
|
335
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
336
|
+
| --- | --- | --- | --- |
|
|
337
|
+
| `compPath` | String | — | 组件路径前缀 |
|
|
338
|
+
| `axios` | Function | — | 请求方法 |
|
|
339
|
+
| `subTable` | Boolean | `false` | 是否子表 |
|
|
340
|
+
| `rootQueryParams` | Object | `{}` | 根查询参数 |
|
|
341
|
+
| `needRoot` | Boolean | `true` | 是否需要根数据 |
|
|
342
|
+
| `config` | Object / String | `{}` | 查询配置(对象或 url) |
|
|
343
|
+
| `buttonWidth` | Number / String | — | 操作按钮区宽度 |
|
|
344
|
+
| `mode` | Number / String | — | 版式模式(如 0/1/12 等) |
|
|
345
|
+
| `btnNumLeft` | Number / String | `1` | 左侧按钮数量 |
|
|
346
|
+
| `btnNumRight` | Number / String | `1` | 右侧按钮数量 |
|
|
347
|
+
| `accordion` | Boolean | `true` | 手风琴展开 |
|
|
348
|
+
| `headerHeight` | Number / String | `80` | 头部高度 |
|
|
349
|
+
| `isLastLoad` | Boolean | `true` | 是否末次加载 |
|
|
350
|
+
| `slotConfig` | Array | `[]` | 自定义插槽组件配置(传入业务子组件) |
|
|
351
|
+
|
|
352
|
+
**Events**:`getBaseParams`
|
|
353
|
+
|
|
354
|
+
**Slots**:透传父级所有插槽;向面板透传 `#cusComp`。
|
|
355
|
+
|
|
356
|
+
**暴露方法**:`search()` · `initPage()`
|
|
357
|
+
|
|
358
|
+
**真实示例**(取自 `examples/pages/manage-tree-table-page.vue`,局部引入写法):
|
|
359
|
+
|
|
360
|
+
```vue
|
|
361
|
+
<script setup>
|
|
362
|
+
import axios from 'axios'
|
|
363
|
+
import { ref, nextTick } from 'vue'
|
|
364
|
+
import mockData from './mock.js'
|
|
365
|
+
import { ManageTreeTable } from 'jtxa-ui'
|
|
366
|
+
</script>
|
|
367
|
+
|
|
368
|
+
<template>
|
|
369
|
+
<manage-tree-table
|
|
370
|
+
v-if="load"
|
|
371
|
+
:axios="newAxios"
|
|
372
|
+
:config="queryConfig"
|
|
373
|
+
:mode="1"
|
|
374
|
+
:buttonWidth="btnWidth"
|
|
375
|
+
:accordion="true"
|
|
376
|
+
btnNumLeft="1"
|
|
377
|
+
btnNumRight="0"
|
|
378
|
+
compPath="/test/workNoticeTreeTable/"
|
|
379
|
+
/>
|
|
380
|
+
</template>
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
带业务插槽组件(`slotConfig`):
|
|
384
|
+
|
|
385
|
+
```vue
|
|
386
|
+
<manage-tree-table
|
|
387
|
+
:axios="axios"
|
|
388
|
+
:config="config"
|
|
389
|
+
:mode="queryStyle"
|
|
390
|
+
:slotConfig="compList"
|
|
391
|
+
@getBaseParams="getBaseParams"
|
|
392
|
+
:comp-path="path"
|
|
393
|
+
>
|
|
394
|
+
<template v-for="item in compList" #[item.name]="slotData">
|
|
395
|
+
<component :is="item.component" v-if="slotData.slotData == item.buildFun" v-bind="slotData || {}" />
|
|
396
|
+
</template>
|
|
397
|
+
</manage-tree-table>
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
### 6. TableBase 基础表格(`table-base`)
|
|
403
|
+
|
|
404
|
+
VxeTable 基础封装:工具栏、表尾统计、虚拟滚动、单选 / 多选 / 序号、分组表头、展开行、操作列、单元格 / 编辑渲染。
|
|
405
|
+
|
|
406
|
+
**来源**:`packages/tables/table-base.vue`,通用属性见 [publicProps](#共享表格属性-publicprops)。
|
|
407
|
+
|
|
408
|
+
**额外 Props**:`footConfig`(Object, `{filed:[]}`) · `isFooter`(Boolean) · `spanMethod`(Function) · `isSortable`(Boolean) · `openVirtual`(Boolean)
|
|
409
|
+
|
|
410
|
+
**Events**:`customEvents`(载荷类型见 [publicProps](#共享表格属性-publicprops))
|
|
411
|
+
|
|
412
|
+
**Slots**:`#expandContent`(scoped 插槽,展开行内容)
|
|
413
|
+
|
|
414
|
+
**暴露方法**:见 [usePublicAPI 方法集](#usePublicAPI-暴露方法)(含 `exportData` / `loadData` / `reloadTreeExpand` / `removeRow` / `setCheckboxRow` / `jtTable()` 等)+ `setStyle` / `sortMethod`
|
|
415
|
+
|
|
416
|
+
**真实示例**(取自 `examples/pages/table-ptbg.vue`):
|
|
417
|
+
|
|
418
|
+
```vue
|
|
419
|
+
<table-base
|
|
420
|
+
id="tableBase"
|
|
421
|
+
ref="tableBase"
|
|
422
|
+
:data="data"
|
|
423
|
+
@customEvents="customEvents"
|
|
424
|
+
:cellRenderMethods="{ cellRenderMethods }"
|
|
425
|
+
:handlerConfig="handlerConfig"
|
|
426
|
+
isTool
|
|
427
|
+
isFooter
|
|
428
|
+
:footConfig="footConfig"
|
|
429
|
+
:expandConfig="expandConfig"
|
|
430
|
+
:spanMethod="spanMethod"
|
|
431
|
+
:rowStyle="rowStyle"
|
|
432
|
+
:cellStyle="cellStyle"
|
|
433
|
+
:loading="loading"
|
|
434
|
+
:isSeq="true"
|
|
435
|
+
:stripe="true"
|
|
436
|
+
isSortable
|
|
437
|
+
:axios="axios"
|
|
438
|
+
:tableStyle="{ headerBg: 'linear-gradient(#F9FAFB,#F9FAFB)', stripeBg: '#F9FAFB', currentBg: 'rgba(24,144,255,.6)' }"
|
|
439
|
+
>
|
|
440
|
+
<template #expandContent="slotProps">{{ slotProps }}</template>
|
|
441
|
+
</table-base>
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
### 7. TableGroup 分组树表(`table-group`)
|
|
447
|
+
|
|
448
|
+
在 [publicProps](#共享表格属性-publicprops) 基础上增加 `groupField`,使用 `XEUtils.groupBy` 把行归并到父行下形成分组树表。
|
|
449
|
+
|
|
450
|
+
**来源**:`packages/tables/table-group.vue`
|
|
451
|
+
|
|
452
|
+
**额外 Props**:`groupField`(String, **必填**) — 用于分组的字段名。
|
|
453
|
+
|
|
454
|
+
**Events**:`customEvents` · **Slots**:`#expandContent` · **暴露方法**:usePublicAPI + `setStyle`
|
|
455
|
+
|
|
456
|
+
**真实示例**(取自 `examples/pages/gourp-table.vue`):
|
|
457
|
+
|
|
458
|
+
```vue
|
|
459
|
+
<table-group
|
|
460
|
+
v-if="data[0]?.DataArray?.length"
|
|
461
|
+
id="tableGroup"
|
|
462
|
+
ref="tableGroup"
|
|
463
|
+
:data="data"
|
|
464
|
+
@customEvents="customEvents"
|
|
465
|
+
:cellRenderMethods="{ cellRenderMethods }"
|
|
466
|
+
:handlerConfig="handlerConfig"
|
|
467
|
+
isTool
|
|
468
|
+
isFooter
|
|
469
|
+
:footConfig="footConfig"
|
|
470
|
+
groupField="name"
|
|
471
|
+
></table-group>
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
### 8. TableBigData 大数据增量表(`table-big-data`)
|
|
477
|
+
|
|
478
|
+
大数据增量加载表,使用 `v-vxe-table-infinite-scroll` 指令触底加载,支持表尾统计。
|
|
479
|
+
|
|
480
|
+
**来源**:`packages/tables/table-big-data.vue`
|
|
481
|
+
|
|
482
|
+
**额外 Props**:`footConfig`(Object) · `isFooter`(Boolean) · `spanMethod`(Function) · `load`(Function, 触底加载回调) · `page`(Object, 默认 `null`)
|
|
483
|
+
|
|
484
|
+
**Events**:`customEvents` · **Slots**:`#expandContent` · **暴露方法**:usePublicAPI + `setStyle`
|
|
485
|
+
|
|
486
|
+
**真实示例**(取自 `examples/pages/big-data.vue`):
|
|
487
|
+
|
|
488
|
+
```vue
|
|
489
|
+
<table-big-data
|
|
490
|
+
id="tableBase"
|
|
491
|
+
ref="tableBase"
|
|
492
|
+
:data="data"
|
|
493
|
+
@customEvents="customEvents"
|
|
494
|
+
:cellRenderMethods="{ cellRenderMethods }"
|
|
495
|
+
:handlerConfig="handlerConfig"
|
|
496
|
+
isTool
|
|
497
|
+
:footConfig="footConfig"
|
|
498
|
+
:expandConfig="expandConfig"
|
|
499
|
+
:rowStyle="rowStyle"
|
|
500
|
+
:cellStyle="cellStyle"
|
|
501
|
+
:load="load"
|
|
502
|
+
:loading="loading"
|
|
503
|
+
:page="page"
|
|
504
|
+
>
|
|
505
|
+
<template #expandContent="slotProps">{{ slotProps }}</template>
|
|
506
|
+
</table-big-data>
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
### 9. TreeTable 虚拟树表(`tree-table`)
|
|
512
|
+
|
|
513
|
+
懒加载虚拟树表:自动把 `{selected, enum, props}` 单元格渲染为 radio 按钮组,支持 `tag` / `icon` / `a` 富文本单元格,树节点懒加载。
|
|
514
|
+
|
|
515
|
+
**来源**:`packages/tables/tree-table.vue`
|
|
516
|
+
|
|
517
|
+
**额外 Props**(在 publicProps 之上):
|
|
518
|
+
|
|
519
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
520
|
+
| --- | --- | --- | --- |
|
|
521
|
+
| `isLine` | Boolean | `false` | 连接线 |
|
|
522
|
+
| `isAccordion` | Boolean | `false` | 手风琴 |
|
|
523
|
+
| `isLazy` | Boolean | `true` | 懒加载子节点 |
|
|
524
|
+
| `isExpandAllNode` | Boolean | `false` | 默认展开全部 |
|
|
525
|
+
| `mode` | String | `'treeTable'` | 模式(`tree` 等) |
|
|
526
|
+
| `baseUrl` | String | — | **必填**,树节点加载 base url |
|
|
527
|
+
| `axios` | Function | — | 请求方法 |
|
|
528
|
+
| `lazyLoadParams` | Object | `null` | 懒加载参数 |
|
|
529
|
+
|
|
530
|
+
**Events**:`customEvents` · **Slots**:`#expandContent` · **暴露方法**:usePublicAPI + `setTreeTempData()` + 重写的 `cellClickEvent` + `setStyle`
|
|
531
|
+
|
|
532
|
+
**真实示例 — 树模式**(取自 `examples/pages/jt-tree-page.vue`):
|
|
533
|
+
|
|
534
|
+
```vue
|
|
535
|
+
<tree-table
|
|
536
|
+
id="tableBase"
|
|
537
|
+
ref="tableBase"
|
|
538
|
+
:data="data"
|
|
539
|
+
@customEvents="customEvents"
|
|
540
|
+
:cellRenderMethods="{ cellRenderMethods }"
|
|
541
|
+
:handlerConfig="handlerConfig"
|
|
542
|
+
mode="tree"
|
|
543
|
+
isTool
|
|
544
|
+
isAccordion
|
|
545
|
+
:isLazy="true"
|
|
546
|
+
checkbox
|
|
547
|
+
:expandConfig="expandConfig"
|
|
548
|
+
:rowStyle="rowStyle"
|
|
549
|
+
:cellStyle="cellStyle"
|
|
550
|
+
:isSeq="false"
|
|
551
|
+
baseUrl="/api/treetest/"
|
|
552
|
+
:lazyLoadParams="lazyLoadParams"
|
|
553
|
+
:axios="axios"
|
|
554
|
+
:checkboxMethod="checkboxMethod"
|
|
555
|
+
>
|
|
556
|
+
<template #expandContent="slotProps">{{ slotProps }}</template>
|
|
557
|
+
</tree-table>
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
**真实示例 — 单选模式**(取自 `examples/pages/tree-table-page.vue`):
|
|
561
|
+
|
|
562
|
+
```vue
|
|
563
|
+
<tree-table
|
|
564
|
+
id="tableBase"
|
|
565
|
+
ref="tableBase"
|
|
566
|
+
:data="data"
|
|
567
|
+
radio
|
|
568
|
+
@customEvents="customEvents"
|
|
569
|
+
:cellRenderMethods="{ cellRenderMethods }"
|
|
570
|
+
:handlerConfig="handlerConfig"
|
|
571
|
+
isTool
|
|
572
|
+
:isAccordion="true"
|
|
573
|
+
:isLazy="true"
|
|
574
|
+
:expandConfig="expandConfig"
|
|
575
|
+
baseUrl="/api/test/"
|
|
576
|
+
:lazyLoadParams="lazyLoadParams"
|
|
577
|
+
:axios="axios"
|
|
578
|
+
></tree-table>
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
## 共享表格属性 publicProps
|
|
584
|
+
|
|
585
|
+
`TableBase` / `TableGroup` / `TableBigData` / `TreeTable` 均继承自 `packages/tables/publicProps.js`:
|
|
586
|
+
|
|
587
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
588
|
+
| --- | --- | --- | --- |
|
|
589
|
+
| `id` | String | — | **必填**,表格唯一标识 |
|
|
590
|
+
| `styleStatus` | String | `'1'` | 样式状态 |
|
|
591
|
+
| `size` | String | `'mini'` | 尺寸 |
|
|
592
|
+
| `border` | String | `'full'` | 边框 |
|
|
593
|
+
| `stripe` | Boolean | `true` | 斑马纹 |
|
|
594
|
+
| `loading` | Boolean | `false` | 加载态 |
|
|
595
|
+
| `data` | Object | — | **必填**,表格数据 |
|
|
596
|
+
| `maxHeight` | String / Number | `0` | 最大高度 |
|
|
597
|
+
| `radio` | Boolean | `false` | 开启单选 |
|
|
598
|
+
| `checkbox` | Boolean | `false` | 开启多选 |
|
|
599
|
+
| `cellRenderMethods` | Object | — | 单元格渲染方法 |
|
|
600
|
+
| `handlerConfig` | Object | — | 操作列配置 |
|
|
601
|
+
| `isTool` | Boolean | `false` | 显示工具栏 |
|
|
602
|
+
| `expandConfig` | Object | — | 展开行配置(含 `loadMethod` 懒加载) |
|
|
603
|
+
| `rowStyle` | Function | — | 行样式 |
|
|
604
|
+
| `cellStyle` | Function | — | 单元格样式 |
|
|
605
|
+
| `isSeq` | Boolean | `true` | 显示序号列 |
|
|
606
|
+
| `isWrap` | Boolean | `false` | 自动换行 |
|
|
607
|
+
| `isTextWrap` | Boolean | `false` | 文本换行 |
|
|
608
|
+
| `showBtn` | Function | — | 操作按钮显隐判断 |
|
|
609
|
+
| `checkboxMethod` | Function | — | 多选可选判断 |
|
|
610
|
+
| `axios` | Function | — | 请求方法 |
|
|
611
|
+
| `tableStyle` | Object | — | 表头/斑马/当前行样式 |
|
|
612
|
+
| `autoSize` | Boolean | `false` | 自动列宽 |
|
|
613
|
+
|
|
614
|
+
**`customEvents` 事件载荷类型**:`radio` / `checkbox` / `treeCheckbox` / `handler` / `cellClick` / `treeCellClick` / `treeTxtClick` / `keydown-enter`
|
|
615
|
+
|
|
616
|
+
### usePublicAPI 暴露方法
|
|
617
|
+
|
|
618
|
+
四个表格组件统一通过 `packages/tables/hooks/usePublicAPI.js` 暴露以下方法(模板 `ref` 调用):
|
|
619
|
+
|
|
620
|
+
`radioSelectChangeEvent` · `selectChangeEvent` · `getEditData` · `handlerColClick` · `cellClickEvent` · `keyEnter` · `exportTableData` · `exportData` · `importTableData` · `loadData` · `setCheckboxRow` · `clearCheckboxRow` · `toggleCheckboxRow` · `reloadTreeExpand` · `removeRow` · `treeTxtClick` · `jtTable` · `reloadParentNode` · `setRadioRow` · `reloadParentRow`
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## 工具函数
|
|
625
|
+
|
|
626
|
+
随默认导出(`import jtui from 'jtxa-ui'`)一并暴露的工具方法:
|
|
627
|
+
|
|
628
|
+
- **`downloadFile(url, name, axios)`** — 文件下载(基于 file-saver)。也可从 `packages/utils/CusMethods.js` 引入。
|
|
629
|
+
```js
|
|
630
|
+
import { downloadFile } from 'jtxa-ui'
|
|
631
|
+
downloadFile('/api/file/123', 'report.xlsx', axios)
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
`packages/utils/utils.js` 内常用工具(按需从源码引入,未随包默认导出):
|
|
635
|
+
|
|
636
|
+
- `deepCopy` · `uuid` · `getStorage` / `setStorage` · `parseJson` · `getUrl` · `stringToBoolean` · `getJson` · `extname` · `getLoading` · `debounce` · `keepSignificantFigures` · `isInput` · `fomatFloat` · `isRepeatObj` / `isRepeatArr` · `getEffeNum` · `getMaxMin` / `convertMaxMin` · `getDate` / `formatDate`
|
|
637
|
+
|
|
638
|
+
`packages/utils/chartMethods.js`:
|
|
639
|
+
|
|
640
|
+
- `getInterval(min, max, total)` → `{ interval, xAxisLabel }`(图表轴间隔计算)
|
|
641
|
+
|
|
642
|
+
`packages/utils/jtMessage.js`:
|
|
643
|
+
|
|
644
|
+
- 全局事件总线 `on` / `emit` / `off`(基于 `window.JTMessage` 单例),用于跨组件通信(如 `rootChange`、`step_submit`)。
|
|
645
|
+
|
|
646
|
+
---
|
|
647
|
+
|
|
648
|
+
## 已知问题与注意事项
|
|
649
|
+
|
|
650
|
+
1. **`package.json` 入口字段**:早期 `main` / `module` 指向不存在的 `jtxa-ui-lib.*`,现已修正为 `dist/jtxa-ui.umd.js` / `dist/jtxa-ui.es.js`,与 `exports` 及实际构建产物一致。
|
|
651
|
+
2. **`echarts` 未在 `peerDependencies` 中**:构建时被 external 化,请确保消费方已安装 `echarts@^6`。
|
|
652
|
+
3. **`manage-tree-table` 需局部引入**:它不参与 `app.use(jtui)` 的全局注册,使用前请按[快速上手](#按需引入)局部 `import`。
|
|
653
|
+
4. **`App.vue` 导航含死项**:`examples/App.vue` 中 `menu` 有一项 `more-charts` 在 `cpms` 中不存在(点击会报错),仅影响演示站,不影响库本身。
|
|
654
|
+
5. **示例文件名歧义**:`examples/pages/tree-table-redio.vue` 文件名像 `tree-table`,实际演示的是 `manage-tree-table`(`mode=1`);`examples/pages/jt-table-ptbg.vue` 标签仍是 `<table-base>`(非 `jt-table-base`)。
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
## 相关文档
|
|
659
|
+
|
|
660
|
+
更详细的按组件文档见 [`docs/`](./docs):
|
|
661
|
+
|
|
662
|
+
- [docs/README.md](./docs/README.md) — 总览 / 快速上手
|
|
663
|
+
- [docs/form.md](./docs/form.md) — `jt-form`
|
|
664
|
+
- [docs/upload.md](./docs/upload.md) — `jt-upload`
|
|
665
|
+
- [docs/echart.md](./docs/echart.md) — `jt-chart`
|
|
666
|
+
- [docs/search-type.md](./docs/search-type.md) — `search-type`
|
|
667
|
+
- [docs/manage-tree-table.md](./docs/manage-tree-table.md) — `manage-tree-table`
|
|
668
|
+
- [docs/tables.md](./docs/tables.md) — `table-base` / `table-group` / `table-big-data` / `tree-table`
|
|
669
|
+
- [docs/quick-reference.md](./docs/quick-reference.md) — 快速参考
|
|
670
|
+
- [docs/debug-guide.md](./docs/debug-guide.md) — 用 examples 调试开发
|
|
671
|
+
- [docs/local-publish-guide.md](./docs/local-publish-guide.md) — 本地发布与测试
|
|
672
|
+
|
|
673
|
+
> 以上文档中的包名已统一为 `jtxa-ui`(历史名 `jtui-vite` 已废弃)。
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
## 开发
|
|
678
|
+
|
|
3
679
|
```sh
|
|
4
680
|
pnpm install
|
|
5
681
|
|
|
6
|
-
pnpm dev
|
|
682
|
+
pnpm dev # 启动 examples 演示站(vite,端口 6222)
|
|
7
683
|
|
|
8
|
-
pnpm build
|
|
684
|
+
pnpm build # 构建库(vite build -> dist/)
|
|
9
685
|
|
|
10
|
-
npm run build
|
|
686
|
+
npm run build # 同上(npm 方式)
|
|
11
687
|
|
|
12
|
-
npm link
|
|
688
|
+
npm link # 本地软链,便于其他项目联调
|
|
13
689
|
|
|
14
|
-
npm run build -- --watch
|
|
690
|
+
npm run build -- --watch # 监听构建
|
|
15
691
|
```
|
|
692
|
+
|
|
693
|
+
构建产物:`dist/jtxa-ui.es.js`(ESM)、`dist/jtxa-ui.umd.js`(UMD,全局变量 `jtui`)、`dist/jtxa-ui.css`(样式)。演示站入口为 `examples/main.js`(直接引用 `packages/index` 源码联调)。
|