ylwl-cpscoms 1.1.0 → 1.2.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.
Files changed (38) hide show
  1. package/package.json +2 -3
  2. package/src/DtTable/DtTable/347/273/204/344/273/266/344/275/277/347/224/250/346/226/207/346/241/243.md +0 -819
  3. package/src/DtTable/index.vue +0 -779
  4. package/src/SlAlert/SlAlert.stories.js +0 -108
  5. package/src/SlAlert/index.vue +0 -55
  6. package/src/SlAlert/remark.md +0 -16
  7. package/src/SlDescriptions/SlDescriptions.stories.js +0 -119
  8. package/src/SlDescriptions/index.vue +0 -60
  9. package/src/SlDescriptions/renderOptions.vue +0 -27
  10. package/src/SlDialog/README-PLUS.md +0 -74
  11. package/src/SlDialog/README.md +0 -114
  12. package/src/SlDialog/dialogPlus.js +0 -160
  13. package/src/SlDialog/index.js +0 -170
  14. package/src/SlDrawer/SlDrawer.stories.js +0 -154
  15. package/src/SlDrawer/index.js +0 -62
  16. package/src/SlForm/SlForm.stories.js +0 -120
  17. package/src/SlForm/index.vue +0 -506
  18. package/src/SlForm/mixinRender.js +0 -228
  19. package/src/SlForm/otherItem/titleItem.vue +0 -31
  20. package/src/SlForm/remark.md +0 -607
  21. package/src/SlGuide/SlGuide.stories.js +0 -100
  22. package/src/SlGuide/index.vue +0 -166
  23. package/src/SlGuide/remark.md +0 -90
  24. package/src/SlMessageBox/index.js +0 -35
  25. package/src/SlPage/README.md +0 -515
  26. package/src/SlPage/SlPage.stories.js +0 -125
  27. package/src/SlPage/index.vue +0 -303
  28. package/src/SlPage/remark.md +0 -283
  29. package/src/SlTable/SlTable.stories.js +0 -118
  30. package/src/SlTable/components/colSetting.vue +0 -86
  31. package/src/SlTable/index.vue +0 -541
  32. package/src/SlTitle/SlTitle.stories.js +0 -98
  33. package/src/SlTitle/index.vue +0 -49
  34. package/src/global.css +0 -5
  35. package/src/index.js +0 -49
  36. package/src/store/index.js +0 -20
  37. package/src/utils/index.js +0 -47
  38. package/src/utils/tableConfig.js +0 -33
@@ -1,515 +0,0 @@
1
- # SlPage 组件使用说明
2
-
3
- 本文基于当前实现文件 `src/components/global/SlPage/index.vue`、`src/components/global/SlTable/index.vue`、`src/components/global/SlForm/index.vue` 整理,适用于本项目现有的 Vue 2 + Element UI 体系。
4
-
5
- ## 1. 组件定位
6
-
7
- `SlPage` 是一个页面级组合组件,用来把以下能力封装到一起:
8
-
9
- - 查询表单
10
- - 表格列表
11
- - 分页
12
- - 左右工具按钮插槽
13
- - 列显隐和列顺序设置
14
- - 查询参数与表格请求的衔接
15
-
16
- 从职责上看,它本质上是 `SlForm + SlTable + 列设置` 的统一壳组件,适合大部分“筛选 + 列表”的后台页面。
17
-
18
- ## 2. 内部结构
19
-
20
- `SlPage` 的模板结构可以概括为:
21
-
22
- 1. 顶部 `slForm`
23
- 2. 查询/重置/展开折叠按钮
24
- 3. 表格头部左右插槽
25
- 4. `slTable`
26
- 5. 列设置抽屉
27
-
28
- 组件内部关键行为:
29
-
30
- - `form` 作为查询表单模型,通过 `v-model` 绑定给 `SlForm`
31
- - `form` 作为 `params` 继续传给 `SlTable`
32
- - 点击“搜索”时先校验表单,再把页码切到第 1 页并发起请求
33
- - 点击“重置”时重置表单并重新请求
34
- - 列配置会按 `tableApi.toString()` 生成唯一 key,保存在 `localStorage.colConfig`
35
-
36
- ## 3. 最小用法
37
-
38
- ```vue
39
- <template>
40
- <SlPage
41
- ref="slPage"
42
- :table-api="getListApi"
43
- :auto-request="true"
44
- :table-columns="columns"
45
- :filter-form="filterForm"
46
- :show-form-item="5"
47
- :init-seach-params="initSeachParams"
48
- :default-seach-params="defaultSeachParams"
49
- :project-from="'ares'"
50
- :other-config="otherConfig"
51
- @callback="handleCallback"
52
- @sortChangeByApi="handleSortChange"
53
- >
54
- <template slot="tableLeftButtons" slot-scope="{ tablefilterFormData }">
55
- <el-button size="small" type="primary" @click="handleCreate">新增</el-button>
56
- <el-button size="small" @click="handleExport(tablefilterFormData)">导出</el-button>
57
- </template>
58
-
59
- <template slot="operate" slot-scope="{ row }">
60
- <el-button type="text" size="mini" @click="handleDetail(row)">详情</el-button>
61
- </template>
62
- </SlPage>
63
- </template>
64
-
65
- <script>
66
- import SlPage from '@/components/global/SlPage'
67
- import { getListApi } from '@/api/xxx'
68
-
69
- export default {
70
- components: { SlPage },
71
- data() {
72
- return {
73
- getListApi,
74
- initSeachParams: {
75
- timer: []
76
- },
77
- defaultSeachParams: {
78
- status: 1
79
- },
80
- otherConfig: {
81
- rowKey: 'id',
82
- requestBodyCof: {
83
- currentPage: 'pageNo',
84
- pageSize: 'pageSize'
85
- },
86
- responderCof: {
87
- statusCode: 'code',
88
- list: ['data', 'list'],
89
- total: ['data', 'total']
90
- }
91
- },
92
- filterForm: [
93
- {
94
- label: '玩家账号',
95
- type: 'input',
96
- model: 'account'
97
- },
98
- {
99
- label: '时间',
100
- type: 'datePicker',
101
- model: 'timer',
102
- privateProps: {
103
- type: 'daterange',
104
- valueFormat: 'yyyy-MM-dd HH:mm:ss'
105
- },
106
- callback: (val) => ({
107
- beginTime: val[0],
108
- endTime: val[1],
109
- timer: val
110
- })
111
- }
112
- ],
113
- columns: [
114
- { prop: 'account', label: '玩家账号', minWidth: '140' },
115
- { prop: 'amount', label: '金额', minWidth: '120', sortable: true },
116
- { prop: 'operate', label: '操作', fixed: 'right', template: 'operate' }
117
- ]
118
- }
119
- },
120
- methods: {
121
- handleCreate() {},
122
- handleDetail(row) {},
123
- handleExport(params) {},
124
- handleCallback(payload) {},
125
- handleSortChange(payload) {}
126
- }
127
- }
128
- </script>
129
- ```
130
-
131
- ## 4. Props 说明
132
-
133
- | 参数 | 类型 | 默认值 | 说明 |
134
- | -------------------- | ---------- | ------------ | ------------------------------------------------------------ |
135
- | `tableApi` | `Function` | `() => ({})` | 表格请求方法,`SlTable` 会把分页参数和处理后的查询参数一起传入 |
136
- | `autoRequest` | `Boolean` | `false` | 组件挂载后是否自动请求一次 |
137
- | `tableColumns` | `Array` | `[]` | 表格列配置 |
138
- | `filterForm` | `Array` | `[]` | 查询表单配置,实际由 `SlForm` 渲染 |
139
- | `showFormItem` | `Number` | `3` | 默认展示的筛选项数量阈值,超出后可展开/折叠 |
140
- | `projectFrom` | `String` | `'oldCpsb'` | 请求参数格式化策略,当前主要区分 `'ares'` 和其它值 |
141
- | `initSeachParams` | `Object` | `{}` | 初始化时写入表单模型的查询参数 |
142
- | `defaultSeachParams` | `Object` | `{}` | 请求时额外合并的默认参数,不直接显示在表单中 |
143
- | `isShowColSetting` | `Boolean` | `true` | 是否显示“列设置”按钮 |
144
- | `notShowPadding` | `Boolean` | `false` | 是否去掉外层 `main` 的 `padding: 20px` |
145
- | `otherConfig` | `Object` | 见源码 | 透传给 `SlTable` 的附加配置,如主键、响应结构、请求字段名等 |
146
-
147
- 补充说明:
148
-
149
- - `initSeachParams`、`defaultSeachParams` 在源码里拼写就是 `Seach`,使用时需要按当前命名传参。
150
- - `SlPage` 会把未声明的属性和事件通过 `v-bind="$attrs"`、`v-on="$listeners"` 继续透传给 `SlTable`。
151
- - 因此像 `show-summary`、`summary-method`、`row-class-name` 等 `el-table` / `SlTable` 相关能力,都可以直接挂在 `SlPage` 上使用。
152
-
153
- ## 5. `otherConfig` 说明
154
-
155
- 最常用的几个配置如下:
156
-
157
- ```js
158
- otherConfig: {
159
- rowKey: 'id',
160
- requestBodyCof: {
161
- currentPage: 'pageNo',
162
- pageSize: 'pageSize'
163
- },
164
- responderCof: {
165
- statusCode: 'code',
166
- list: ['data', 'list'],
167
- total: ['data', 'total']
168
- },
169
- donShowOverflowTooltip: true
170
- }
171
- ```
172
-
173
- 字段含义:
174
-
175
- - `rowKey`:表格行主键,默认是 `id`
176
- - `requestBodyCof.currentPage`:请求页码字段名映射
177
- - `requestBodyCof.pageSize`:请求每页条数字段名映射
178
- - `responderCof.statusCode`:响应码字段路径
179
- - `responderCof.list`:列表字段路径
180
- - `responderCof.total`:总数字段路径
181
- - `donShowOverflowTooltip`:是否关闭默认溢出提示
182
-
183
- ## 6. `filterForm` 配置要点
184
-
185
- `SlPage` 不直接解析筛选项,而是把 `filterForm` 全量交给 `SlForm`。项目中常见字段包括:
186
-
187
- | 字段 | 说明 |
188
- | ----------------------------------------- | ---------------------------------------------------------- |
189
- | `label` | 表单项名称 |
190
- | `type` | 控件类型,如 `input`、`select`、`datePicker`、`rangeInput` |
191
- | `model` | 绑定到 `form` 的字段名 |
192
- | `rules` | Element 表单校验规则 |
193
- | `props` / `privateProps` / `privateAttrs` | 透传给具体控件的属性 |
194
- | `options` | 静态下拉选项 |
195
- | `asycnOptions` | 异步获取下拉选项的方法 |
196
- | `callback` | 用于把一个控件值拆分成多个请求字段 |
197
- | `linkSet` | 联动设置后续筛选项,例如平台联动游戏、游戏联动区服 |
198
- | `show` | 控制项是否显示 |
199
-
200
- 典型配置:
201
-
202
- ```js
203
- {
204
- label: '申请时间',
205
- type: 'datePicker',
206
- model: 'timer',
207
- privateProps: {
208
- type: 'daterange',
209
- valueFormat: 'yyyy-MM-dd HH:mm:ss'
210
- },
211
- callback: (val) => ({
212
- beginTime: val[0],
213
- endTime: val[1],
214
- timer: val
215
- }),
216
- rules: [{ required: true, message: '请选择时间', trigger: 'change' }]
217
- }
218
- ```
219
-
220
- ## 7. `tableColumns` 配置要点
221
-
222
- `tableColumns` 最终由 `SlTable` 渲染。项目里常用字段包括:
223
-
224
- | 字段 | 说明 |
225
- | -------------------- | -------------------------------------- |
226
- | `prop` | 列字段名 |
227
- | `label` | 列标题 |
228
- | `width` / `minWidth` | 列宽 |
229
- | `fixed` | 固定列 |
230
- | `sortable` | 是否支持排序 |
231
- | `isShow` | 是否显示该列,列设置也依赖该字段 |
232
- | `isAlwaysShow` | 控制列是否允许出现在列设置和实际渲染中 |
233
- | `type` | 特殊列类型,如 `selection`、`index` |
234
- | `template` | 使用插槽渲染单元格 |
235
- | `render` | 返回 HTML 字符串,通过 `v-html` 渲染 |
236
- | `tip` | 行内提示配置 |
237
- | `headerTip` | 表头提示配置 |
238
- | `list` | `operate` 操作列按钮集合 |
239
- | `isSwitchNumber` | 接口字段需要转数字时使用 |
240
-
241
- 操作列示例:
242
-
243
- ```js
244
- {
245
- prop: 'operate',
246
- label: '操作',
247
- fixed: 'right',
248
- list: [
249
- {
250
- label: '编辑',
251
- click: (row) => {
252
- console.log(row)
253
- }
254
- }
255
- ]
256
- }
257
- ```
258
-
259
- 插槽列示例:
260
-
261
- ```js
262
- { prop: 'operate', label: '操作', template: 'operate' }
263
- ```
264
-
265
- ```vue
266
- <template slot="operate" slot-scope="{ row }">
267
- <el-button type="text" size="mini" @click="handleDetail(row)">详情</el-button>
268
- </template>
269
- ```
270
-
271
- ## 8. 插槽
272
-
273
- ### 8.1 页面级插槽
274
-
275
- | 插槽名 | 作用域参数 | 说明 |
276
- | ------------------- | ------------------------- | ------------------ |
277
- | `tableLeftButtons` | `{ tablefilterFormData }` | 表格头部左侧按钮区 |
278
- | `tableRightButtons` | `{ tablefilterFormData }` | 表格头部右侧按钮区 |
279
-
280
- 其中 `tablefilterFormData` 来自 `SlTable.processedParams`,是已经按项目规则处理后的请求参数,适合直接拿去做导出。
281
-
282
- ### 8.2 表格列插槽
283
-
284
- `SlPage` 会把你在外层定义的具名插槽继续转发给 `SlTable`。常见用法是给列模板提供自定义单元格内容。
285
-
286
- 当前转发时只透出:
287
-
288
- ```js
289
- { row }
290
- ```
291
-
292
- 也就是说,外部插槽默认拿不到 `column`、`$index` 等更多上下文。
293
-
294
- ## 9. 事件
295
-
296
- `SlPage` 自身没有额外 `emit` 很多事件,但它会透传 `SlTable` 的事件,因此常用事件仍然可以直接绑定在 `SlPage` 上:
297
-
298
- | 事件名 | 说明 |
299
- | -------------------- | -------------------------------------------------- |
300
- | `callback` | 请求成功后回调,参数内含接口响应和本次完整请求参数 |
301
- | `sortChangeByApi` | 表格排序变化时触发 |
302
- | 其它 `el-table` 事件 | 例如行点击、选择变化等,视 `SlTable` 转发情况使用 |
303
-
304
- `callback` 参数结构示例:
305
-
306
- ```js
307
- {
308
- apiInfo: res,
309
- allRequestParams: {
310
- currentPage: 1,
311
- pageSize: 10,
312
- ...processedParams
313
- }
314
- }
315
- ```
316
-
317
- ## 10. 通过 `ref` 可用的能力
318
-
319
- 业务页面通常会给组件加 `ref="SlPage"`,这样可以直接访问一些内部能力。
320
-
321
- 常见读取方式:
322
-
323
- ```js
324
- this.$refs.SlPage.form
325
- this.$refs.SlPage.selectedList
326
- this.$refs.SlPage.selectedListIds
327
- ```
328
-
329
- 常见调用方式:
330
-
331
- ```js
332
- this.$refs.SlPage.searchTableData()
333
- this.$refs.SlPage.resetTableData()
334
- this.$refs.SlPage.getTableData()
335
- ```
336
-
337
- 如果需要更底层能力,也可以继续访问:
338
-
339
- ```js
340
- this.$refs.SlPage.$refs.slForm
341
- this.$refs.SlPage.$refs.slTable
342
- ```
343
-
344
- ## 11. 请求参数处理规则
345
-
346
- 请求最终由 `SlTable.processedParams` 统一加工,规则如下。
347
-
348
- ### 11.1 通用规则
349
-
350
- - 最终请求参数 = `form + defaultSeachParams`
351
- - 如果筛选项是日期范围,并配置了 `callback`,会把范围拆成多个字段
352
-
353
- ### 11.2 `projectFrom === 'ares'`
354
-
355
- - 多选下拉保留为数组
356
- - `datePicker` 的 `daterange` 会执行 `callback` 并删除原始 `model`
357
- - 普通 `datePicker` 和 `rangeInput` 会删除原始 `model`
358
-
359
- ### 11.3 其它项目来源
360
-
361
- - 多选下拉会转成英文逗号拼接字符串
362
- - `datePicker` 的 `daterange` 会执行 `callback` 并删除原始 `model`
363
- - 普通 `datePicker` 会删除原始 `model`
364
-
365
- ## 12. 列设置与持久化
366
-
367
- 开启 `isShowColSetting` 后,右上角会出现“列设置”按钮。
368
-
369
- 当前实现行为:
370
-
371
- 1. 点击后打开抽屉
372
- 2. 允许拖拽排序和显隐控制
373
- 3. 排序结果保存到 `localStorage.colConfig`
374
- 4. 隐藏列结果也保存到 `localStorage.colConfig`
375
-
376
- 存储结构依赖 `src/store/modules/tableConfig.js`,格式大致如下:
377
-
378
- ```js
379
- {
380
- [uniqueId]: {
381
- sort: ['colA', 'colB'],
382
- hide: ['colC']
383
- }
384
- }
385
- ```
386
-
387
- 其中 `uniqueId` 来自:
388
-
389
- ```js
390
- generateUniqueId(this.tableApi.toString())
391
- ```
392
-
393
- ## 13. 真实项目里的典型场景
394
-
395
- 当前项目里,`SlPage` 已经被广泛用在:
396
-
397
- - 数据查询页
398
- - 订单列表页
399
- - 玩家福利页
400
- - 弹窗内列表页
401
- - 需要导出功能的报表页
402
-
403
- 比较典型的接入模式是:
404
-
405
- 1. 在页面 `data()` 中生成 `columns` 和 `filterForm`
406
- 2. 通过 `initSeachParams` 设置默认筛选条件
407
- 3. 通过 `otherConfig` 对接接口字段命名和响应结构
408
- 4. 通过 `tableRightButtons` 提供导出、新增等操作
409
- 5. 通过 `ref` 获取当前查询条件或已选数据
410
-
411
- ## 14. 使用建议
412
-
413
- - 优先把筛选配置和列配置抽到单独的 `configItem.js`,便于复用和维护
414
- - 日期范围类字段尽量统一使用 `callback` 输出后端需要的开始/结束字段
415
- - 如果页面存在导出功能,优先使用 `tablefilterFormData`,因为它已经是处理后的最终请求参数
416
- - 如果列配置需要持久化,尽量保证 `tableApi` 的函数定义稳定,避免列设置 key 变化
417
- - 如果业务依赖勾选结果,可以直接读取 `selectedList` 和 `selectedListIds`
418
-
419
- ## 15. 当前实现可优化点
420
-
421
- 下面这些是基于当前源码实现观察到的优化方向
422
-
423
- ### 15.1 组件内部直接改动了传入的 props
424
-
425
- `SlPage` 里有多处直接修改 `filterForm`、`tableColumns` 内部对象的行为,例如:
426
-
427
- - 给筛选项补 `show`
428
- - 给列补 `isShow`
429
- - 直接对 `tableColumns` 做排序
430
-
431
- 这会带来两个问题:
432
-
433
- - 子组件反向影响父组件数据源
434
- - 同一份配置如果被多个页面/实例复用,状态可能互相污染
435
-
436
- 更稳妥的方向是改为“克隆后再处理”。
437
-
438
- **总结:暂时不动,由于传入的对象,且目前该组件大量使用,故而暂不修改**
439
-
440
-
441
- ### 15.2 重置逻辑对复杂字段不够友好
442
-
443
- 当前重置流程会在 `resetFields()` 之后,再把 `form` 里的每个字段都强制置成空字符串。
444
-
445
- 对于这些场景会比较别扭:
446
-
447
- - 多选下拉原本应该是 `[]`
448
- - 日期范围原本应该是 `[]`
449
- - 某些数值型字段原本可能希望回到 `null` 或默认值
450
-
451
- 也就是说,重置后的数据类型未必和控件期望一致。
452
-
453
- /**总结:这块应该是要优化的,某些接口需要传null,有些需要传”“,有些没有值需要不传,难受**/
454
-
455
- ### 15.3 列配置唯一标识依赖 `tableApi.toString()`
456
-
457
- 当前列配置持久化 key 依赖函数源码字符串,这种方式有一定脆弱性:
458
-
459
- - 同一接口如果函数包装方式变了,历史列配置可能失效
460
- - 构建压缩、热更新、代理封装后,函数字符串不一定稳定
461
-
462
- 更稳妥的方向是允许业务显式传一个稳定的 `tableKey`。
463
-
464
- **总结:其实可以传一个永不唯一的key,但是不能是变量**
465
-
466
- ### 15.4 排序逻辑对新增列不够稳
467
-
468
- 列排序使用:
469
-
470
- ```js
471
- this.currentColConfig.sort.indexOf(a.prop) - this.currentColConfig.sort.indexOf(b.prop)
472
- ```
473
-
474
- 如果新列没有出现在历史排序数组里,`indexOf` 会返回 `-1`,这类列可能被排到最前面,表现不一定符合预期。
475
-
476
- **总结:后续维护**
477
-
478
- ### 15.5 插槽转发上下文偏少
479
-
480
- 当前 `SlPage -> SlTable` 的插槽转发只给了 `row`:
481
-
482
- ```js
483
- v-bind="{ row: scope.row }"
484
- ```
485
-
486
- 如果业务想在插槽里拿到:
487
-
488
- - `**column**`
489
- - `$index`
490
- - `processedParams`
491
-
492
- 现在还不够方便,只能继续改组件。
493
-
494
- **总结:后续需要进行无代价修改**
495
-
496
-
497
- ### 15.6 参数处理规则在不同项目来源下不完全对称
498
-
499
- `processedParams` 对 `ares` 和非 `ares` 的处理存在差异,尤其是 `rangeInput` 的原始字段删除规则并不完全一致。后续如果页面越来越多,建议把参数序列化规则集中抽象,否则容易出现“同样的筛选项在不同页面请求参数不一样”的情况。
500
-
501
- **总结:由于系统接口不统一性,只能这么区分对待每个系统接口的特性**
502
-
503
- ## 16. 小结
504
-
505
- 如果你的页面是标准的“筛选 + 列表 + 分页 + 导出/操作按钮”结构,优先使用 `SlPage` 会比较省事。
506
-
507
- 它当前已经具备:
508
-
509
- - 表单和表格的一体化封装
510
- - 参数处理能力
511
- - 列配置持久化
512
- - 页面级工具栏插槽
513
- - 通过 `ref` 直接控制查询
514
-
515
- 但同时也建议在后续迭代里重点关注“不要直接改 props”“重置行为统一”“列配置 key 稳定化”这几类问题。
@@ -1,125 +0,0 @@
1
- import SlPage from './index.vue'
2
-
3
- export default {
4
- title: 'Components/SlPage',
5
- component: SlPage,
6
- parameters: {
7
- docs: {
8
- description: {
9
- component: '列表页面模板组件,组合了搜索表单(SlForm)+ 表格(SlTable)的完整 CRUD 页面模板。提供搜索、重置、展开/折叠、列设置等功能。'
10
- }
11
- }
12
- }
13
- }
14
-
15
- const codeBlock = (code) => `
16
- <div style="margin-top:24px;border-top:1px solid #eee;padding-top:16px">
17
- <p style="font-size:14px;font-weight:600;color:#666;margin-bottom:8px;">使用代码:</p>
18
- <pre style="background:#f5f5f5;padding:16px;border-radius:4px;overflow-x:auto;font-size:13px;line-height:1.6;white-space:pre-wrap;word-break:break-all"><code>${escapeHtml(code.trim())}</code></pre>
19
- </div>`
20
-
21
- function escapeHtml(str) {
22
- return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
23
- }
24
-
25
- // mock 数据
26
- const mockData = [
27
- { id: 1, name: '张三', age: 28, dept: '研发部', status: 1, createTime: '2024-01-15' },
28
- { id: 2, name: '李四', age: 32, dept: '产品部', status: 0, createTime: '2024-02-20' },
29
- { id: 3, name: '王五', age: 25, dept: '设计部', status: 1, createTime: '2024-03-10' },
30
- { id: 4, name: '赵六', age: 30, dept: '研发部', status: 1, createTime: '2024-04-05' },
31
- { id: 5, name: '孙七', age: 27, dept: '运营部', status: 0, createTime: '2024-05-18' },
32
- { id: 6, name: '周八', age: 35, dept: '产品部', status: 1, createTime: '2024-06-22' },
33
- { id: 7, name: '吴九', age: 29, dept: '设计部', status: 0, createTime: '2024-07-30' }
34
- ]
35
-
36
- function mockApi(params) {
37
- const { currentPage, pageSize, userName, status } = params
38
- let list = [...mockData]
39
- if (userName) list = list.filter(item => item.name.includes(userName))
40
- if (status !== '' && status !== undefined) list = list.filter(item => item.status === status)
41
- const start = (currentPage - 1) * pageSize
42
- return Promise.resolve({
43
- code: 1,
44
- data: { list: list.slice(start, start + pageSize), total: list.length }
45
- })
46
- }
47
-
48
- // ---- 基础用法 ----
49
- function statusRender(_ref) {
50
- var row = _ref.row
51
- var map = {
52
- 1: '<span style="color:#67c23a;background:#f0f9eb;padding:2px 8px;border-radius:3px;font-size:12px">启用</span>',
53
- 0: '<span style="color:#f56c6c;background:#fef0f0;padding:2px 8px;border-radius:3px;font-size:12px">禁用</span>'
54
- }
55
- return map[row.status] || '-'
56
- }
57
-
58
- var tableColumns = [
59
- { type: 'selection' },
60
- { prop: 'id', label: 'ID', width: '80' },
61
- { prop: 'name', label: '姓名' },
62
- { prop: 'age', label: '年龄', sortable: true },
63
- { prop: 'dept', label: '部门' },
64
- { prop: 'status', label: '状态', render: statusRender },
65
- { prop: 'createTime', label: '创建时间', width: '140' },
66
- { prop: 'operate', label: '操作', width: '150', list: function() { return [
67
- { label: '编辑', click: () => {} },
68
- { label: '删除', type: 'danger', click: () => {} }
69
- ]}}
70
- ]
71
-
72
- const filterForm = [
73
- { label: '用户名', type: 'input', model: 'userName', privateAttrs: { placeholder: '请输入用户名' } },
74
- { label: '状态', type: 'select', model: 'status', options: [
75
- { label: '启用', value: 1 }, { label: '禁用', value: 0 }
76
- ], props: { placeholder: '请选择状态' } },
77
- { label: '创建时间', type: 'datePicker', model: 'createTime', privateProps: { type: 'daterange', valueFormat: 'yyyy-MM-dd' } }
78
- ]
79
-
80
- const defaultCode = `<!-- 使用方式 -->
81
- <sl-page ref="page" :table-api="fetchList"
82
- :table-columns="columns"
83
- :filter-form="searchFields"
84
- :show-form-item="3"
85
- :auto-request="true">
86
- <template slot="tableLeftButtons" slot-scope="scope">
87
- <el-button type="primary" size="small">新增</el-button>
88
- </template>
89
- </sl-page>
90
-
91
- <!-- columns 中自定义列渲染 -->
92
- {
93
- prop: 'status',
94
- label: '状态',
95
- render: function(_ref) {
96
- var row = _ref.row
97
- return '<span>...</span>'
98
- }
99
- }`
100
-
101
- export const Default = () => ({
102
- components: { SlPage },
103
- data() {
104
- return {
105
- tableApi: mockApi,
106
- tableColumns: tableColumns,
107
- filterForm: filterForm
108
- }
109
- },
110
- template: `
111
- <div>
112
- <sl-page ref="page" :table-api="tableApi" :table-columns="tableColumns" :filter-form="filterForm" :show-form-item="3" :auto-request="true">
113
- <template slot="tableLeftButtons" slot-scope="scope">
114
- <el-button type="primary" size="small">新增</el-button>
115
- <el-button type="danger" size="small" plain>批量删除</el-button>
116
- </template>
117
- <template slot="tableRightButtons" slot-scope="scope">
118
- <el-button size="small" icon="el-icon-download">导出</el-button>
119
- </template>
120
- </sl-page>
121
- ${codeBlock(defaultCode)}
122
- </div>`
123
- })
124
-
125
- Default.storyName = '完整列表页'