ol-base-components 2.5.1 → 2.6.0

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 CHANGED
@@ -35,7 +35,7 @@ import OlBaseComponents from "ol-base-components"; // 导入组件库
35
35
  Vue.use(OlBaseComponents);
36
36
 
37
37
  new Vue({
38
- render: (h) => h(App),
38
+ render: h => h(App),
39
39
  }).$mount("#app");
40
40
  ```
41
41
 
@@ -52,11 +52,9 @@ Vue.use(OlBaseComponents);
52
52
 
53
53
  //安装,可以在登录
54
54
  import { swaggerInstall } from "ol-base-components";
55
- swaggerInstall("http://192.168.xxx.xxx:20019/swagger/v1/swagger.json").then(
56
- () => {
57
- // 成功获取swagger数据后加载页面, 这里可以写登录接口成功后执行的逻辑
58
- }
59
- );
55
+ swaggerInstall("http://192.168.xxx.xxx:20019/swagger/v1/swagger.json").then(() => {
56
+ // 成功获取swagger数据后加载页面, 这里可以写登录接口成功后执行的逻辑
57
+ });
60
58
 
61
59
  // 卸载
62
60
  import { swaggerUnload } from "ol-base-components";
@@ -164,58 +162,58 @@ npx add aaa -p src/view -u /api/app/business-report/stock-bIPaged-result -e /api
164
162
  </template>
165
163
 
166
164
  <script>
167
- export default {
168
- data() {
169
- return {
170
- formSearchData: {
171
- reset: true,
172
- expendShow: false,
173
- value: {
174
- WarehouseCode: null,
175
- WarehouseName: null,
176
- },
177
- tableSearch: [
178
- {
179
- label: "仓库编码",
180
- value: "WarehouseCode",
181
- inputType: "text",
165
+ export default {
166
+ data() {
167
+ return {
168
+ formSearchData: {
169
+ reset: true,
170
+ expendShow: false,
171
+ value: {
172
+ WarehouseCode: null,
173
+ WarehouseName: null,
182
174
  },
183
- {
184
- label: "仓库名称",
185
- value: "WarehouseName",
186
- inputType: "text",
187
- },
188
- ],
189
- },
190
- };
191
- },
192
- mounted() {
193
- this.getTable();
194
- },
195
- method: {
196
- getTable() {
197
- // this.get({
198
- // url: Basic.getWarehoseList,
199
- // isLoading: true,
200
- // data: Object.assign(this.formSearchData.value, {
201
- // Page: this.paginations.page,
202
- // MaxResultCount: this.paginations.limit,
203
- // }),
204
- // }).then((res) => {
205
- // this.tableData.rows = res.result.items;
206
- // this.paginations.total = res.result.totalCount;
207
- // this.tableData.emptyImg = true;
208
- // });
175
+ tableSearch: [
176
+ {
177
+ label: "仓库编码",
178
+ value: "WarehouseCode",
179
+ inputType: "text",
180
+ },
181
+ {
182
+ label: "仓库名称",
183
+ value: "WarehouseName",
184
+ inputType: "text",
185
+ },
186
+ ],
187
+ },
188
+ };
209
189
  },
210
- handleSearch(from) {
211
- var self = this;
212
- self.formSearchData.value = { ...from };
213
- self.paginations.page = 1;
214
- this.getTable(); // 获取表格数据
190
+ mounted() {
191
+ this.getTable();
215
192
  },
216
- handleReset() {},
217
- },
218
- };
193
+ method: {
194
+ getTable() {
195
+ // this.get({
196
+ // url: Basic.getWarehoseList,
197
+ // isLoading: true,
198
+ // data: Object.assign(this.formSearchData.value, {
199
+ // Page: this.paginations.page,
200
+ // MaxResultCount: this.paginations.limit,
201
+ // }),
202
+ // }).then((res) => {
203
+ // this.tableData.rows = res.result.items;
204
+ // this.paginations.total = res.result.totalCount;
205
+ // this.tableData.emptyImg = true;
206
+ // });
207
+ },
208
+ handleSearch(from) {
209
+ var self = this;
210
+ self.formSearchData.value = { ...from };
211
+ self.paginations.page = 1;
212
+ this.getTable(); // 获取表格数据
213
+ },
214
+ handleReset() {},
215
+ },
216
+ };
219
217
  </script>
220
218
  ```
221
219
 
@@ -241,111 +239,109 @@ export default {
241
239
  @handleindexChange="handleindexChange"
242
240
  >
243
241
  <template slot="classes" slot-scope="scope">
244
- <div style="color: #1682e6; cursor: pointer" @click="config(scope)">
245
- 设置
246
- </div>
242
+ <div style="color: #1682e6; cursor: pointer" @click="config(scope)">设置</div>
247
243
  </template>
248
244
  </ol-table>
249
245
  </div>
250
246
  </template>
251
247
 
252
248
  <script>
253
- export default {
254
- data() {
255
- return {
256
- multipleSelection: [],
257
- tableData: {
258
- loading: false,
259
- emptyImg: true,
260
- options: {
261
- selection: true, //多选框
262
- index: null, //序号
263
- headTool: true, //开启头部工具栏
264
- refreshBtn: true, //开启表格头部刷新按钮
265
- downloadBtn: true, //开启表格头部下载按钮
266
- }, //序号和复选框
267
- rows: [], //表数据
268
- columns: [
269
- {
270
- label: "",
271
- minWidth: "",
272
- type: "selection",
273
- show: true,
274
- },
275
- {
276
- prop: "warehouseCode",
277
- label: "仓库编码",
278
- minWidth: "",
279
- sortable: false,
280
- show: true,
281
- },
282
- {
283
- prop: "warehouseName",
284
- label: "仓库名称",
285
- minWidth: "",
286
- sortable: false,
287
- show: true,
288
- },
289
- {
290
- prop: "enabledDesc",
291
- label: "状态",
292
- minWidth: "",
293
- sortable: false,
294
- show: true,
295
- },
296
- {
297
- prop: "createdUser",
298
- label: "创建人",
299
- minWidth: "",
300
- sortable: false,
301
- show: true,
302
- },
303
- {
304
- prop: "createTime",
305
- label: "创建时间",
306
- minWidth: "",
307
- show: true,
308
- },
309
- {
310
- prop: "classes",
311
- label: "班次",
312
- minWidth: "",
313
- show: true,
314
- renderSlot: true,
315
- },
316
- {
317
- prop: "remark",
318
- label: "备注",
319
- minWidth: "",
320
- show: true,
321
- },
322
- ], //表头
323
- operates: [], //表格里面的操作按钮
324
- tableHeightDiff: 300,
249
+ export default {
250
+ data() {
251
+ return {
252
+ multipleSelection: [],
253
+ tableData: {
254
+ loading: false,
255
+ emptyImg: true,
256
+ options: {
257
+ selection: true, //多选框
258
+ index: null, //序号
259
+ headTool: true, //开启头部工具栏
260
+ refreshBtn: true, //开启表格头部刷新按钮
261
+ downloadBtn: true, //开启表格头部下载按钮
262
+ }, //序号和复选框
263
+ rows: [], //表数据
264
+ columns: [
265
+ {
266
+ label: "",
267
+ minWidth: "",
268
+ type: "selection",
269
+ show: true,
270
+ },
271
+ {
272
+ prop: "warehouseCode",
273
+ label: "仓库编码",
274
+ minWidth: "",
275
+ sortable: false,
276
+ show: true,
277
+ },
278
+ {
279
+ prop: "warehouseName",
280
+ label: "仓库名称",
281
+ minWidth: "",
282
+ sortable: false,
283
+ show: true,
284
+ },
285
+ {
286
+ prop: "enabledDesc",
287
+ label: "状态",
288
+ minWidth: "",
289
+ sortable: false,
290
+ show: true,
291
+ },
292
+ {
293
+ prop: "createdUser",
294
+ label: "创建人",
295
+ minWidth: "",
296
+ sortable: false,
297
+ show: true,
298
+ },
299
+ {
300
+ prop: "createTime",
301
+ label: "创建时间",
302
+ minWidth: "",
303
+ show: true,
304
+ },
305
+ {
306
+ prop: "classes",
307
+ label: "班次",
308
+ minWidth: "",
309
+ show: true,
310
+ renderSlot: true,
311
+ },
312
+ {
313
+ prop: "remark",
314
+ label: "备注",
315
+ minWidth: "",
316
+ show: true,
317
+ },
318
+ ], //表头
319
+ operates: [], //表格里面的操作按钮
320
+ tableHeightDiff: 300,
321
+ },
322
+ paginations: {
323
+ page: 1, //当前位于那页面
324
+ total: 10, //总数
325
+ limit: 30, //一页显示多少条
326
+ pagetionShow: true,
327
+ },
328
+ };
329
+ },
330
+ methods: {
331
+ SelectionChange(row) {
332
+ this.multipleSelection = row;
325
333
  },
326
- paginations: {
327
- page: 1, //当前位于那页面
328
- total: 10, //总数
329
- limit: 30, //一页显示多少条
330
- pagetionShow: true,
334
+ handleSizeChange(val) {
335
+ this.paginations.page = 1;
336
+ this.paginations.limit = val;
337
+ this.getTable();
338
+ },
339
+ handleindexChange(val) {
340
+ this.paginations.page = val;
341
+ this.getTable();
331
342
  },
332
- };
333
- },
334
- methods: {
335
- SelectionChange(row) {
336
- this.multipleSelection = row;
337
- },
338
- handleSizeChange(val) {
339
- this.paginations.page = 1;
340
- this.paginations.limit = val;
341
- this.getTable();
342
- },
343
- handleindexChange(val) {
344
- this.paginations.page = val;
345
- this.getTable();
346
343
  },
347
- },
348
- };
344
+ };
349
345
  </script>
350
346
  ```
351
347
 
@@ -405,13 +401,90 @@ export default {
405
401
  url: PublicAggregate.dictionaries,
406
402
  fn: this.getTable,
407
403
  },
408
- ,
404
+ }
409
405
  };
410
406
  },
411
407
  };
412
408
  </script>
413
409
  ```
414
410
 
411
+ # 表格组件多级表头使用说明
412
+
413
+ ## 功能简介
414
+
415
+ 本表格组件基于 Element-UI,支持:
416
+
417
+ - 多级表头(嵌套 children)
418
+ - 多级表头顺序可通过 `beforeProp` 字段灵活控制
419
+ - 表头字段顺序优先以 `columns` 配置为准,后补充 swagger 字段
420
+ - 目前 `beforeProp` 仅支持多级表头,普通字段暂不支持
421
+
422
+ #### 效果图
423
+
424
+ ![Local demo](./src/assets/duojibiaotou.png "Local demo")
425
+
426
+ ## 1. 多级表头配置方法
427
+
428
+ ### 基本结构
429
+
430
+ ```js
431
+ tableData: {
432
+ columns: [
433
+ // 普通字段
434
+ { prop: "unit", show: false },
435
+ // 多级表头
436
+ {
437
+ label: "一级表头",
438
+ beforeProp: "qty", // 该多级表头会插入到 qty 字段之后
439
+ show: true,
440
+ children: [
441
+ {
442
+ label: "二级表头",
443
+ children: [
444
+ { prop: "creationTime" },
445
+ { prop: "orginalBillNo" }
446
+ ]
447
+ },
448
+ { prop: "tagNumber" },
449
+ { prop: "batch" }
450
+ ]
451
+ },
452
+ // 另一个多级表头
453
+ {
454
+ label: "一级表头-1",
455
+ beforeProp: "containerType", // 插入到 containerType 字段之后
456
+ children: [
457
+ { prop: "regionCode" },
458
+ { prop: "taskNo" }
459
+ ]
460
+ }
461
+ // ... 其它字段
462
+ ],
463
+ rows: [
464
+ // 数据行
465
+ ],
466
+ // 其它配置
467
+ }
468
+ ```
469
+
470
+ ### 说明
471
+
472
+ - **多级表头**通过 `children` 字段递归嵌套实现。
473
+ - 每个多级表头对象可包含:
474
+ - `label`:表头名称
475
+ - `beforeProp`:插入到指定字段(prop)之后
476
+ - `show`:是否显示
477
+ - `children`:子表头数组
478
+ - **beforeProp** 仅支持在多级表头对象上设置,用于指定该多级表头插入到哪个字段(prop)之后。
479
+ - 普通字段(非多级表头)暂不支持 `beforeProp`,只能手动在 `columns` 中调整顺序。
480
+
481
+ ## 2. 字段顺序规则
482
+
483
+ - 表头字段顺序优先以 `columns` 配置为准。
484
+ - 如果有 swagger 字段未在 `columns` 中出现,会自动补充到表头最后。
485
+ - 多级表头的位置可通过 `beforeProp` 字段灵活调整。
486
+ - 普通字段顺序只能通过手动调整 `columns` 数组顺序实现。
487
+
415
488
  ## 贡献
416
489
 
417
490
  欢迎任何形式的贡献!如果您有建议或发现问题,请提交 issue 或 pull request。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ol-base-components",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
4
4
  "private": false,
5
5
  "main": "src/package/index.js",
6
6
  "bin": {
package/src/App.vue CHANGED
@@ -84,12 +84,12 @@
84
84
  show: false,
85
85
  },
86
86
  {
87
- label: "多级表头",
87
+ label: "一级表头",
88
88
  beforeProp: "qty", // 位置
89
89
  show: true,
90
90
  children: [
91
91
  {
92
- label: "999",
92
+ label: "二级表头",
93
93
  children: [
94
94
  {
95
95
  prop: "creationTime",
@@ -100,7 +100,7 @@
100
100
  ],
101
101
  },
102
102
  {
103
- prop: "tagNumber",
103
+ prop: "roadWayCode",
104
104
  },
105
105
  {
106
106
  prop: "batch",
@@ -108,7 +108,7 @@
108
108
  ],
109
109
  },
110
110
  {
111
- label: "2222",
111
+ label: "一级表头-1",
112
112
  beforeProp: "containerType", // 位置
113
113
  children: [
114
114
  {
Binary file
@@ -0,0 +1,7 @@
1
+ import Form from "./src/index.vue";
2
+
3
+ Form.install = function (Vue) {
4
+ Vue.component("ol-form ", Form);
5
+ };
6
+
7
+ export default Form;
@@ -0,0 +1,384 @@
1
+ <template>
2
+ <div>
3
+ <el-form
4
+ ref="formRef"
5
+ :model="form.value"
6
+ :rules="form.rules"
7
+ style="display: flex; flex-wrap: wrap"
8
+ v-bind="{
9
+ labelWidth: '130px',
10
+ disabled: !form.type,
11
+ ...$attrs,
12
+ ...form.attrs,
13
+ }"
14
+ v-on="$listeners"
15
+ >
16
+ <template v-for="(item, index) in form.model">
17
+ <el-form-item
18
+ v-if="!item.hidden"
19
+ :key="index"
20
+ :label="item.label"
21
+ :prop="item.prop"
22
+ :required="item.required || false"
23
+ :style="{ width: width(item) }"
24
+ >
25
+ <el-input
26
+ v-if="item.type == 'input'"
27
+ v-model="form.value[item.prop]"
28
+ :placeholder="
29
+ item.readonly
30
+ ? item.placeholder || item.label
31
+ : `请输入${item.placeholder || item.label}`
32
+ "
33
+ :clearable="item.clearable || true"
34
+ :readonly="item.readonly || false"
35
+ :show-password="item.showPassword || false"
36
+ v-bind="{
37
+ ...item.props,
38
+ disabled: inputDisabled(item),
39
+ }"
40
+ />
41
+ <el-input-number
42
+ v-else-if="item.type == 'number'"
43
+ v-model="form.value[item.prop]"
44
+ :placeholder="`请输入${item.placeholder || item.label}`"
45
+ :clearable="item.clearable || true"
46
+ :readonly="item.readonly || false"
47
+ v-bind="{ min: 0, ...item.props }"
48
+ />
49
+ <el-input
50
+ v-else-if="item.type == 'textarea'"
51
+ v-model="form.value[item.prop]"
52
+ type="textarea"
53
+ :placeholder="`请输入${item.placeholder || item.label}`"
54
+ :autosize="item.autosize"
55
+ :readonly="item.readonly || false"
56
+ :clearable="item.clearable || true"
57
+ :maxlength="item.length || ''"
58
+ />
59
+ <el-switch
60
+ v-else-if="item.type == 'switch'"
61
+ v-model="form.value[item.prop]"
62
+ class="switchStyle"
63
+ active-text="启用"
64
+ inactive-text="禁用"
65
+ v-bind="item.props || {}"
66
+ />
67
+ <el-radio-group v-else-if="item.type == 'radio'" v-model="form.value[item.prop]">
68
+ <el-radio v-for="ctem in item.child" :key="ctem.key" :label="ctem.key">{{
69
+ ctem.value
70
+ }}</el-radio>
71
+ </el-radio-group>
72
+ <!-- v-bind="item.props || { type: 'date' }" -->
73
+ <el-date-picker
74
+ v-else-if="item.type == 'date'"
75
+ v-model="form.value[item.prop]"
76
+ :placeholder="item.placeholder || '请选择日期'"
77
+ style="width: 100%"
78
+ v-bind="{ type: 'date', ...item.props }"
79
+ :clearable="item.clearable || true"
80
+ v-on="{
81
+ ...item.listeners,
82
+ change: event => changeHandle(event, item),
83
+ }"
84
+ />
85
+ <Tree-select
86
+ v-else-if="item.type == 'treeSelect'"
87
+ v-model="form.value[item.prop]"
88
+ v-bind="item.props || {}"
89
+ :options="item.child"
90
+ @getValue="item.change && item.change(form.value[item.prop])"
91
+ />
92
+ <!-- <el-select v-else-if="item.type == 'select'" v-model="form.value[item.prop]"
93
+ :placeholder="`请选择${item.placeholder || item.label}`"
94
+ :clearable="'clearable' in item ? item.clearable : true" :disabled="item.disabled || false"
95
+ v-bind="item.props || {}" v-on="{ ...item.listeners, change: selectChangeHandle(item) }">
96
+ <el-option v-for="(jtem, jindex) in item.child" :key="jindex" :label="jtem.value"
97
+ :value="jtem.key"></el-option>
98
+ </el-select> -->
99
+ <!-- v-on="{ ...item.listeners, change: (event) => selectChangeHandle(event,
100
+ item), }" -->
101
+ <el-select
102
+ v-else-if="item.type == 'select'"
103
+ v-model="form.value[item.prop]"
104
+ :placeholder="`请选择${item.placeholder || item.label}`"
105
+ :clearable="'clearable' in item ? item.clearable : true"
106
+ v-bind="{ disabled: !!item.disabled, ...(item.props || {}) }"
107
+ v-on="{
108
+ ...item.listeners,
109
+ change: event => selectChangeHandle(event, item),
110
+ }"
111
+ @keyup.native="
112
+ $event =>
113
+ item.keyup({
114
+ event: $event,
115
+ item,
116
+ form: form.value,
117
+ })
118
+ "
119
+ >
120
+ <el-option
121
+ v-for="(jtem, jindex) in item.child"
122
+ :key="jindex"
123
+ :label="jtem.value"
124
+ :value="jtem.key"
125
+ />
126
+ </el-select>
127
+ <div v-else-if="item.type == 'inputSpecial'">
128
+ <el-col :span="6">
129
+ <el-form-item :prop="item.layerprop">
130
+ <el-input
131
+ v-model="form.value[item.layerprop]"
132
+ :clearable="item.clearable || true"
133
+ />
134
+ </el-form-item>
135
+ </el-col>
136
+ <el-col class="line" style="text-align: center" :span="3">- </el-col>
137
+ <el-col :span="6">
138
+ <el-form-item :prop="item.rowprop">
139
+ <el-input v-model="form.value[item.rowprop]" :clearable="item.clearable || true" />
140
+ </el-form-item>
141
+ </el-col>
142
+ <el-col class="line" style="text-align: center" :span="3">- </el-col>
143
+ <el-col :span="6">
144
+ <el-form-item :prop="item.columnprop">
145
+ <el-input
146
+ v-model="form.value[item.columnprop]"
147
+ :clearable="item.clearable || true"
148
+ />
149
+ </el-form-item>
150
+ </el-col>
151
+ </div>
152
+ <!-- 自定义输入框插槽 -->
153
+ <template v-else-if="item.type == 'slot'">
154
+ <slot :name="item.name" :item="item" />
155
+ </template>
156
+ </el-form-item>
157
+ </template>
158
+ </el-form>
159
+ <div v-if="showBtn" slot="footer" class="dialog-footer">
160
+ <slot v-if="$slots.btnSlot" name="btnSlot" :form="form" />
161
+ <template v-else>
162
+ <el-button @click="onCancel">取消</el-button>
163
+ <el-button v-if="form.type" type="primary" @click="onConfirm">确定</el-button>
164
+ </template>
165
+ <slot name="btnAfterSlot" />
166
+ </div>
167
+ </div>
168
+ </template>
169
+ <!--
170
+ # BaseForm 基础表单组件
171
+
172
+ ## Props 属性
173
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 |
174
+ |-------------|----------|---------|------|--------------|
175
+ | form | Object | - | 是 | 表单配置对象 |
176
+ | defaultValue| Object | {} | 否 | 表单默认值 |
177
+ | showBtn | Boolean | true | 否 | 是否显示底部按钮 |
178
+
179
+ ## form 对象结构
180
+ {
181
+ type: Number, // 表单类型:0-详情,1-新建,2-编辑
182
+ title: String, // 表单标题(会根据type自动设置)
183
+ value: Object, // 表单数据对象
184
+ rules: Object, // 表单验证规则
185
+ attrs: Object, // el-form的属性配置
186
+ model: Array // 表单项配置数组
187
+ }
188
+
189
+ ## model 项配置
190
+ | 字段 | 类型 | 说明 |
191
+ |-------------|----------------|---------|
192
+ | type | String | 表单项类型:input/number/textarea/switch/radio/date/treeSelect/select/projectCodeSelect/inputSpecial/slot |
193
+ | label | String | 表单项标签 |
194
+ | prop | String | 表单项字段名 |
195
+ | placeholder | String | 占位文本 |
196
+ | required | Boolean | 是否必填 |
197
+ | hidden | Boolean | 是否隐藏 |
198
+ | clearable | Boolean | 是否可清空 |
199
+ | readonly | Boolean | 是否只读 |
200
+ | disabled | Boolean/Function| 是否禁用 |
201
+ | props | Object | 对应表单控件的属性配置 |
202
+ | listeners | Object | 事件监听器配置 |
203
+
204
+ ## Events 事件
205
+ | 事件名 | 说明 | 回调参数 |
206
+ |-------------|---------------|---------|
207
+ | onSubmit | 表单提交事件 | {form: 表单配置, data: 表单数据} |
208
+ | onCancel | 取消按钮点击事件 | - |
209
+ | selectChange| 选择器值变化事件 | {obj: 当前项配置, val: 变化后的值} |
210
+ -->
211
+ <script>
212
+ // interface FormItem {
213
+ // type: Number;
214
+ // title?: String;
215
+ // model: IModelItem[]; //src\utils\interface\dialogInterface.ts
216
+ // rules:Form.rules;
217
+ // attrs: Form; //import { Form } from "element-ui";
218
+ // }
219
+ export default {
220
+ name: "form",
221
+ props: {
222
+ form: Object,
223
+ // 默认值
224
+ defaultValue: {
225
+ type: Object,
226
+ default: () => ({}),
227
+ },
228
+ showBtn: {
229
+ type: Boolean,
230
+ default: true,
231
+ },
232
+ },
233
+ data() {
234
+ return {
235
+ // model: [],
236
+ formInit: {}, // 初始化表单,用于重置表单用
237
+ // formValue: {}, // 表单数据
238
+ };
239
+ },
240
+ computed: {
241
+ width() {
242
+ return function (item) {
243
+ if (this.form.model.length > 18 && item.type != "textarea") {
244
+ return "25%";
245
+ } else if (
246
+ this.form.model.length > 10 &&
247
+ this.form.model.length <= 18 &&
248
+ item.type != "textarea"
249
+ ) {
250
+ return "calc(100% / 3)";
251
+ } else if (
252
+ this.form.model.length > 6 &&
253
+ this.form.model.length <= 10 &&
254
+ item.type != "textarea"
255
+ ) {
256
+ return "50%";
257
+ } else {
258
+ return item.type == "textarea" && item.width ? item.width : "100%";
259
+ }
260
+ };
261
+ },
262
+ },
263
+ watch: {
264
+ // 副作用以便父级直接使用
265
+ "form.type": {
266
+ handler(newValue) {
267
+ // 如果没有type则默认值为1
268
+ if (!Object.keys(this.form).includes("type")) {
269
+ this.$set(this.form, "type", 1);
270
+ }
271
+ let result;
272
+ switch (newValue) {
273
+ case 0:
274
+ result = "详情"; // 当 newValue 为 0 时,标题为 "详情"
275
+ break;
276
+ case 1:
277
+ result = "新建";
278
+ break;
279
+ case 2:
280
+ result = "编辑";
281
+ break;
282
+ default:
283
+ result = "弹框";
284
+ break;
285
+ }
286
+ this.form.title = result;
287
+ },
288
+ immediate: true,
289
+ },
290
+ // "form.model": {
291
+ // handler() {
292
+
293
+ // },
294
+ // immediate: true,
295
+ // deep: true
296
+ // }
297
+ },
298
+ created() {
299
+ // 默认值复制
300
+ if (Object.keys(this.defaultValue)?.length) {
301
+ Object.keys(this.defaultValue).forEach(key => {
302
+ form.value[key] = this.defaultValue[key];
303
+ });
304
+ }
305
+ this.init();
306
+ },
307
+ // beforeDestroy() {},
308
+ methods: {
309
+ init() {},
310
+ // 保留之前的change调用方式,并添扩展新的
311
+ selectChangeHandle(val, item) {
312
+ (item &&
313
+ item.listeners &&
314
+ item.listeners.change &&
315
+ item.listeners.change(item, this.form.value[item.prop])) ||
316
+ item.change
317
+ ? item.change(val)
318
+ : this.selectChange(item, val);
319
+ },
320
+ changeHandle(val, item) {
321
+ if (
322
+ item &&
323
+ item.listeners &&
324
+ item.listeners.change &&
325
+ item.listeners.change(item, this.form.value[item.prop])
326
+ ) {
327
+ this.selectChange(item, val);
328
+ }
329
+ },
330
+ selectChange(obj, val) {
331
+ let temp = {
332
+ obj: obj,
333
+ val: val,
334
+ };
335
+ this.$emit("selectChange", temp);
336
+ },
337
+ inputDisabled(item) {
338
+ if (!item.props) return false;
339
+ if (!Object.keys(item.props).includes("disabled")) return false;
340
+ // disabled是函数还是Boolean值,如果boolean值直接返回,如果是函数执行函数并返回boolean
341
+ return typeof item.props.disabled === "function"
342
+ ? item.props.disabled({ item, form: this.form })
343
+ : item.props.disabled;
344
+ },
345
+ validate() {
346
+ return new Promise((resolve, reject) => {
347
+ this.$refs.formRef.validate(valid => {
348
+ if (valid) {
349
+ resolve({
350
+ valid,
351
+ formData: this.form?.value || {},
352
+ });
353
+ } else {
354
+ reject("表单验证失败");
355
+ }
356
+ });
357
+ });
358
+ },
359
+ onCancel() {
360
+ this.$refs.formRef.resetFields();
361
+ this.$refs.formRef.clearValidate();
362
+ this.$emit("onCancel");
363
+ },
364
+ onConfirm() {
365
+ console.log("BaseForm数据", this.form);
366
+ this.validate()
367
+ .then(() => {
368
+ this.$emit("onSubmit", { form: this.form, data: this.form.value });
369
+ })
370
+ .catch(err => {
371
+ console.log("校验失败", err);
372
+ });
373
+ },
374
+ },
375
+ };
376
+ </script>
377
+
378
+ <style lang="scss" scoped>
379
+ .dialog-footer {
380
+ display: flex;
381
+ justify-content: flex-end;
382
+ }
383
+ </style>
384
+
@@ -1,6 +1,7 @@
1
1
  import OlTable from "./table";
2
2
  import OlSearch from "./formSearch";
3
3
  import Dialog from "./dialog";
4
+ import Form from "./form";
4
5
  import SwaggerClient from "swagger-client";
5
6
 
6
7
  const consoleTooltip = () => {
@@ -212,5 +213,5 @@ const install = async function (Vue) {
212
213
  };
213
214
 
214
215
  export default install;
215
- export { OlTable, OlSearch, Dialog };
216
+ export { OlTable, OlSearch, Dialog, Form };
216
217
  export { swaggerInstall, swaggerUnload };