flame-plus 0.1.7 → 0.1.10

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 (153) hide show
  1. package/package.json +4 -4
  2. package/packages/components/base/flmButton/flmButton.vue +29 -0
  3. package/packages/components/base/flmCascader/flmCascader.vue +39 -0
  4. package/packages/components/base/flmCheckbox/flmCheckbox.vue +34 -0
  5. package/packages/components/base/flmCheckbox/flmCheckboxGroup.vue +71 -0
  6. package/packages/components/base/flmColorPicker/flmColorPicker.vue +34 -0
  7. package/packages/components/base/flmDatePicker/flmDatePicker.vue +47 -0
  8. package/packages/components/base/flmDialog/flmDialog.vue +39 -0
  9. package/packages/components/base/flmInput/flmInput.vue +38 -0
  10. package/packages/components/base/flmInputNumber/flmInputNumber.vue +36 -0
  11. package/packages/components/base/flmPagination/flmPagination.vue +37 -0
  12. package/packages/components/base/flmRadio/flmRadio.vue +64 -0
  13. package/packages/components/base/flmRate/flmRate.vue +34 -0
  14. package/packages/components/base/flmRead/flmRead.vue +18 -0
  15. package/packages/components/base/flmSelect/flmSelect.vue +74 -0
  16. package/packages/components/base/flmSlider/flmSlider.vue +35 -0
  17. package/packages/components/base/flmSwitch/flmSwitch.vue +29 -0
  18. package/packages/components/base/flmTimePicker/flmTimePicker.vue +37 -0
  19. package/packages/components/base/flmTimeSelect/flmTimeSelect.vue +36 -0
  20. package/packages/components/base/flmTransfer/flmTransfer.vue +42 -0
  21. package/packages/components/complex/flmForm/flmForm.vue +223 -0
  22. package/packages/components/complex/flmSearch/flmSearch.vue +148 -0
  23. package/packages/components/complex/flmTable/flmTable.vue +90 -0
  24. package/packages/components/complex/flmToolbar/flmToolbar.vue +55 -0
  25. package/{dist/components/index.js → packages/components/index.ts} +26 -25
  26. package/packages/components/page/flmReportPage/flmReportPage.vue +690 -0
  27. package/packages/index.ts +8 -0
  28. package/packages/model/flmComponentConfig/base/flmButton.ts +50 -0
  29. package/packages/model/flmComponentConfig/base/flmCascader.ts +77 -0
  30. package/packages/model/flmComponentConfig/base/flmCheckbox.ts +51 -0
  31. package/packages/model/flmComponentConfig/base/flmColorPicker.ts +30 -0
  32. package/packages/model/flmComponentConfig/base/flmDatePicker.ts +73 -0
  33. package/packages/model/flmComponentConfig/base/flmDialog.ts +49 -0
  34. package/packages/model/flmComponentConfig/base/flmInput.ts +57 -0
  35. package/packages/model/flmComponentConfig/base/flmInputNumber.ts +37 -0
  36. package/packages/model/flmComponentConfig/base/flmPagination.ts +38 -0
  37. package/packages/model/flmComponentConfig/base/flmRadio.ts +42 -0
  38. package/packages/model/flmComponentConfig/base/flmRate.ts +49 -0
  39. package/packages/model/flmComponentConfig/base/flmRead.ts +6 -0
  40. package/packages/model/flmComponentConfig/base/flmSelect.ts +104 -0
  41. package/packages/model/flmComponentConfig/base/flmSlider.ts +51 -0
  42. package/packages/model/flmComponentConfig/base/flmSwitch.ts +37 -0
  43. package/packages/model/flmComponentConfig/base/flmTimePicker.ts +61 -0
  44. package/packages/model/flmComponentConfig/base/flmTimeSelect.ts +44 -0
  45. package/packages/model/flmComponentConfig/index.ts +30 -0
  46. package/packages/model/flmComponentConfig/public.ts +293 -0
  47. package/packages/utils/filterConfig.ts +39 -0
  48. package/packages/utils/index.ts +2 -0
  49. package/{dist/utils/isValidKey.js → packages/utils/isValidKey.ts} +6 -4
  50. package/tsconfig.json +4 -5
  51. package/dist/components/base/flmButton/index.d.ts +0 -3
  52. package/dist/components/base/flmButton/index.js +0 -8
  53. package/dist/components/base/flmCascader/index.d.ts +0 -3
  54. package/dist/components/base/flmCascader/index.js +0 -8
  55. package/dist/components/base/flmCheckbox/index.d.ts +0 -3
  56. package/dist/components/base/flmCheckbox/index.js +0 -8
  57. package/dist/components/base/flmColorPicker/index.d.ts +0 -3
  58. package/dist/components/base/flmColorPicker/index.js +0 -8
  59. package/dist/components/base/flmDatePicker/index.d.ts +0 -3
  60. package/dist/components/base/flmDatePicker/index.js +0 -8
  61. package/dist/components/base/flmDialog/index.d.ts +0 -3
  62. package/dist/components/base/flmDialog/index.js +0 -8
  63. package/dist/components/base/flmInput/index.d.ts +0 -3
  64. package/dist/components/base/flmInput/index.js +0 -8
  65. package/dist/components/base/flmInputNumber/index.d.ts +0 -3
  66. package/dist/components/base/flmInputNumber/index.js +0 -8
  67. package/dist/components/base/flmPagination/index.d.ts +0 -3
  68. package/dist/components/base/flmPagination/index.js +0 -8
  69. package/dist/components/base/flmRadio/index.d.ts +0 -3
  70. package/dist/components/base/flmRadio/index.js +0 -8
  71. package/dist/components/base/flmRate/index.d.ts +0 -3
  72. package/dist/components/base/flmRate/index.js +0 -8
  73. package/dist/components/base/flmRead/index.d.ts +0 -3
  74. package/dist/components/base/flmRead/index.js +0 -8
  75. package/dist/components/base/flmSelect/index.d.ts +0 -3
  76. package/dist/components/base/flmSelect/index.js +0 -8
  77. package/dist/components/base/flmSlider/index.d.ts +0 -3
  78. package/dist/components/base/flmSlider/index.js +0 -8
  79. package/dist/components/base/flmSwitch/index.d.ts +0 -3
  80. package/dist/components/base/flmSwitch/index.js +0 -8
  81. package/dist/components/base/flmTimePicker/index.d.ts +0 -3
  82. package/dist/components/base/flmTimePicker/index.js +0 -8
  83. package/dist/components/base/flmTimeSelect/index.d.ts +0 -3
  84. package/dist/components/base/flmTimeSelect/index.js +0 -8
  85. package/dist/components/base/flmTransfer/index.d.ts +0 -3
  86. package/dist/components/base/flmTransfer/index.js +0 -8
  87. package/dist/components/complex/flmForm/index.d.ts +0 -3
  88. package/dist/components/complex/flmForm/index.js +0 -8
  89. package/dist/components/complex/flmSearch/index.d.ts +0 -3
  90. package/dist/components/complex/flmSearch/index.js +0 -8
  91. package/dist/components/complex/flmTable/index.d.ts +0 -3
  92. package/dist/components/complex/flmTable/index.js +0 -8
  93. package/dist/components/complex/flmToolbar/index.d.ts +0 -3
  94. package/dist/components/complex/flmToolbar/index.js +0 -8
  95. package/dist/components/index.d.ts +0 -25
  96. package/dist/components/page/flmReportPage/index.d.ts +0 -3
  97. package/dist/components/page/flmReportPage/index.js +0 -8
  98. package/dist/index.d.ts +0 -33
  99. package/dist/index.js +0 -90
  100. package/dist/model/flmComponentConfig/base/flmButton.d.ts +0 -32
  101. package/dist/model/flmComponentConfig/base/flmButton.js +0 -30
  102. package/dist/model/flmComponentConfig/base/flmCascader.d.ts +0 -55
  103. package/dist/model/flmComponentConfig/base/flmCascader.js +0 -29
  104. package/dist/model/flmComponentConfig/base/flmCheckbox.d.ts +0 -32
  105. package/dist/model/flmComponentConfig/base/flmCheckbox.js +0 -15
  106. package/dist/model/flmComponentConfig/base/flmColorPicker.d.ts +0 -22
  107. package/dist/model/flmComponentConfig/base/flmColorPicker.js +0 -15
  108. package/dist/model/flmComponentConfig/base/flmDatePicker.d.ts +0 -54
  109. package/dist/model/flmComponentConfig/base/flmDatePicker.js +0 -32
  110. package/dist/model/flmComponentConfig/base/flmDialog.d.ts +0 -31
  111. package/dist/model/flmComponentConfig/base/flmDialog.js +0 -18
  112. package/dist/model/flmComponentConfig/base/flmInput.d.ts +0 -43
  113. package/dist/model/flmComponentConfig/base/flmInput.js +0 -16
  114. package/dist/model/flmComponentConfig/base/flmInputNumber.d.ts +0 -25
  115. package/dist/model/flmComponentConfig/base/flmInputNumber.js +0 -12
  116. package/dist/model/flmComponentConfig/base/flmPagination.d.ts +0 -27
  117. package/dist/model/flmComponentConfig/base/flmPagination.js +0 -12
  118. package/dist/model/flmComponentConfig/base/flmRadio.d.ts +0 -25
  119. package/dist/model/flmComponentConfig/base/flmRadio.js +0 -15
  120. package/dist/model/flmComponentConfig/base/flmRate.d.ts +0 -27
  121. package/dist/model/flmComponentConfig/base/flmRate.js +0 -22
  122. package/dist/model/flmComponentConfig/base/flmRead.d.ts +0 -7
  123. package/dist/model/flmComponentConfig/base/flmRead.js +0 -2
  124. package/dist/model/flmComponentConfig/base/flmSelect.d.ts +0 -66
  125. package/dist/model/flmComponentConfig/base/flmSelect.js +0 -42
  126. package/dist/model/flmComponentConfig/base/flmSlider.d.ts +0 -32
  127. package/dist/model/flmComponentConfig/base/flmSlider.js +0 -19
  128. package/dist/model/flmComponentConfig/base/flmSwitch.d.ts +0 -24
  129. package/dist/model/flmComponentConfig/base/flmSwitch.js +0 -15
  130. package/dist/model/flmComponentConfig/base/flmTimePicker.d.ts +0 -41
  131. package/dist/model/flmComponentConfig/base/flmTimePicker.js +0 -24
  132. package/dist/model/flmComponentConfig/base/flmTimeSelect.d.ts +0 -27
  133. package/dist/model/flmComponentConfig/base/flmTimeSelect.js +0 -17
  134. package/dist/model/flmComponentConfig/base/flmTransfer.d.ts +0 -36
  135. package/dist/model/flmComponentConfig/base/flmTransfer.js +0 -21
  136. package/dist/model/flmComponentConfig/complex/flmForm.d.ts +0 -77
  137. package/dist/model/flmComponentConfig/complex/flmForm.js +0 -42
  138. package/dist/model/flmComponentConfig/complex/flmTable.d.ts +0 -83
  139. package/dist/model/flmComponentConfig/complex/flmTable.js +0 -29
  140. package/dist/model/flmComponentConfig/complex/flmToolbar.d.ts +0 -10
  141. package/dist/model/flmComponentConfig/complex/flmToolbar.js +0 -2
  142. package/dist/model/flmComponentConfig/index.d.ts +0 -28
  143. package/dist/model/flmComponentConfig/index.js +0 -28
  144. package/dist/model/flmComponentConfig/page/flmReportPage.d.ts +0 -15
  145. package/dist/model/flmComponentConfig/page/flmReportPage.js +0 -2
  146. package/dist/model/flmComponentConfig/public.d.ts +0 -291
  147. package/dist/model/flmComponentConfig/public.js +0 -295
  148. package/dist/utils/filterConfig.d.ts +0 -10
  149. package/dist/utils/filterConfig.js +0 -40
  150. package/dist/utils/index.d.ts +0 -3
  151. package/dist/utils/index.js +0 -3
  152. package/dist/utils/isValidKey.d.ts +0 -9
  153. package/global.d.ts +0 -54
@@ -0,0 +1,690 @@
1
+ <template>
2
+ <div class="report-page" ref="reportPageRef">
3
+ <template v-if="isLoaded">
4
+ <flmSearch
5
+ class="page-search"
6
+ :config="reportPageConfig.search"
7
+ @searchSubmit="searchSubmit"
8
+ >
9
+ <template v-for="searchSlot in searchSlots" #[searchSlot]="{ prop, formModel }">
10
+ <slot :name="`search-${searchSlot}`" :prop="prop" :formModel="formModel"></slot>
11
+ </template>
12
+ </flmSearch>
13
+ <flmToolbar class="page-toolbar" :config="reportPageConfig.toolbar" @toolbarClick="toolbarClick" />
14
+ <flmTable
15
+ class="page-table"
16
+ :config="reportPageConfig.table"
17
+ @selectionChange="tableEvent.selectionChange"
18
+ >
19
+ <template v-for="tableSlot in getTableSlots" #[tableSlot]="{ index, row, column }">
20
+ <slot :name="`table-${tableSlot}`" :index="index" :row="row" :column="column"></slot>
21
+ </template>
22
+ <template v-if="reportPageConfig.tableAction.buttons.length" #tableAction="scope">
23
+ <flmToolbar :config="reportPageConfig.tableAction" @toolbarClick="tableActionClick($event, scope)" />
24
+ </template>
25
+ </flmTable>
26
+ <flmPagination
27
+ class="page-pagination"
28
+ :config="reportPageConfig.pagination"
29
+ @size-change="paginationEvent.sizeChange"
30
+ @current-change="paginationEvent.currentChange"
31
+ />
32
+ </template>
33
+ <flmDialog :config="reportPageConfig.readDialog" @close="pageDefaultEvent.closeReadDialog">
34
+ <flmForm :config="reportPageConfig.readForm" @cancel="pageDefaultEvent.closeReadDialog">
35
+ <template v-for="readFormSlot in readFormSlots" #[readFormSlot]="{ prop, formModel }">
36
+ <slot :name="`read-${readFormSlot}`" :prop="prop" :formModel="formModel"></slot>
37
+ </template>
38
+ </flmForm>
39
+ </flmDialog>
40
+ <flmDialog :config="reportPageConfig.addDialog" @close="pageDefaultEvent.closeAddDialog">
41
+ <flmForm
42
+ :config="reportPageConfig.addForm"
43
+ @submit="pageDefaultEvent.pageAdd"
44
+ @cancel="pageDefaultEvent.closeAddDialog"
45
+ >
46
+ <template v-for="addFormSlot in addFormSlots" #[addFormSlot]="{ prop, formModel }">
47
+ <slot :name="`add-${addFormSlot}`" :prop="prop" :formModel="formModel"></slot>
48
+ </template>
49
+ </flmForm>
50
+ </flmDialog>
51
+ <flmDialog :config="reportPageConfig.editDialog" @close="pageDefaultEvent.closeEditDialog">
52
+ <flmForm
53
+ :config="reportPageConfig.editForm"
54
+ @submit="pageDefaultEvent.pageEdit"
55
+ @cancel="pageDefaultEvent.closeEditDialog"
56
+ >
57
+ <template v-for="editFormSlot in editFormSlots" #[editFormSlot]="{ prop, formModel }">
58
+ <slot :name="`edit-${editFormSlot}`" :prop="prop" :formModel="formModel"></slot>
59
+ </template>
60
+ </flmForm>
61
+ </flmDialog>
62
+ </div>
63
+ </template>
64
+
65
+ <script lang="ts" setup>
66
+ import { defineEmits, defineProps, ref, Ref, reactive, computed, onMounted } from 'vue'
67
+ import { ElMessage, ElMessageBox } from 'element-plus'
68
+ import {
69
+ flmForm,
70
+ flmSearch,
71
+ flmToolbar,
72
+ flmTable,
73
+ flmPagination,
74
+ flmDialog
75
+ } from '@/components'
76
+ import {
77
+ ControlTypes,
78
+ FormItemConfig,
79
+ FormConfig,
80
+ TableColumnConfig,
81
+ ReportPageSetting,
82
+ } from '@/model/flmComponentConfig'
83
+ import { isValidKey } from '@/utils'
84
+
85
+ const emit = defineEmits(['customEvent'])
86
+ const reportPageRef = ref()
87
+
88
+ let isLoaded: Ref<boolean> = ref(false)
89
+ let reportPageConfig: Ref<ReportPageSetting> = ref({
90
+ search: {},
91
+ toolbar: {
92
+ publicConfig: {},
93
+ maxButton: 3,
94
+ buttons: []
95
+ },
96
+ table: {},
97
+ tableAction: {
98
+ publicConfig: {},
99
+ maxButton: 3,
100
+ buttons: []
101
+ },
102
+ pagination: {},
103
+ readDialog: {
104
+ 'model-value': false
105
+ },
106
+ readForm: {},
107
+ addDialog: {
108
+ 'model-value': false
109
+ },
110
+ addForm: {},
111
+ editDialog: {
112
+ 'model-value': false
113
+ },
114
+ editForm: {}
115
+ })
116
+ let tableSelection: Array<any> = reactive([])
117
+
118
+ onMounted(() => {
119
+ queryPageSetting()
120
+ })
121
+
122
+ // 表格高度
123
+ const tableHeight = () => {
124
+ const homeHeight = '100vh',
125
+ headerHight = '50px', // 页眉高度
126
+ mainSpacing = '30px', // 主体内容边距
127
+ pageSearch = '50px', // 搜索栏高度
128
+ pagefooter = '50px', // 分页高度
129
+ pageSpacing = '40px' // 页面边距
130
+ return `calc(${homeHeight} - ${headerHight} - ${mainSpacing} - ${pageSearch} - ${pagefooter} - ${pageSpacing})`
131
+ }
132
+
133
+ // 查询页面配置
134
+ const queryPageSetting = () => {
135
+ setTimeout(() => {
136
+ const reportPageSetting: ReportPageSetting = {
137
+ search: {
138
+ 'label-suffix': ':',
139
+ // 自定义属性
140
+ 'items': [
141
+ {
142
+ 'prop': 'roleType',
143
+ 'label': '角色类型',
144
+ 'isSlot': true
145
+ },
146
+ {
147
+ 'prop': 'userName',
148
+ 'label': '用户姓名',
149
+ 'controlType': ControlTypes['flm-input'],
150
+ 'controlConfig': {},
151
+ 'rules': [
152
+ { 'min': 2, 'max': 10, 'message': '用户名字符在 2 ~ 10 以内', 'trigger': 'blur' },
153
+ ]
154
+ },
155
+ {
156
+ 'prop': 'email',
157
+ 'label': '注册邮箱',
158
+ 'controlType': ControlTypes['flm-input'],
159
+ 'controlConfig': {},
160
+ 'rules': [{
161
+ 'trigger': 'blur',
162
+ 'validator': (rule: any, value: any, callback: any) => {
163
+ const emailRegExp: RegExp = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
164
+ if (!value || emailRegExp.test(value)) {
165
+ callback()
166
+ } else {
167
+ callback(new Error('请填写正确的邮箱'))
168
+ }
169
+ }
170
+ }]
171
+ },
172
+ {
173
+ 'prop': 'userType',
174
+ 'label': '用户类型',
175
+ 'controlType': ControlTypes['flm-select'],
176
+ 'controlConfig': {
177
+ 'options': [
178
+ { 'value': 0, 'label': '普通用户' },
179
+ { 'value': 1, 'label': '企业用户' },
180
+ ]
181
+ }
182
+ },
183
+ {
184
+ 'prop': 'isAdmin',
185
+ 'label': '超级权限',
186
+ 'controlType': ControlTypes['flm-switch'],
187
+ 'controlConfig': {
188
+ 'active-text': "开启",
189
+ 'inactive-text': "关闭"
190
+ }
191
+ },
192
+ {
193
+ 'prop': 'searchSlotTwo',
194
+ 'label': '搜索插槽2',
195
+ 'isSlot': true
196
+ },
197
+ ],
198
+ 'buttons': [
199
+ {
200
+ 'text': '重置',
201
+ 'event': 'cancel'
202
+ },
203
+ {
204
+ 'type': 'primary',
205
+ 'plain': true,
206
+ 'text': '搜索',
207
+ 'event': 'submit'
208
+ }
209
+ ]
210
+ },
211
+ toolbar: {
212
+ publicConfig: { 'type': 'primary', 'plain': true },
213
+ maxButton: 3,
214
+ buttons: [
215
+ { 'text':'新增', event: 'openAddDialog' },
216
+ { 'text': '导入', event: 'pageImport' },
217
+ { 'text': '导出', event: 'pageExport' },
218
+ { 'text': '批量删除', event: 'pageBatchDelete' },
219
+ { 'text': '批量审核', event: 'batchAudit' },
220
+ { 'text': '批量编辑', event: 'batchEdit' },
221
+ ]
222
+ },
223
+ table: {
224
+ 'border': true,
225
+ 'height': "250",
226
+ 'max-height': "250",
227
+ 'columns': [
228
+ { prop: 'selection', label: '勾选', type: 'selection', fixed: 'left' },
229
+ { prop: 'index', label: '序号', type: 'index', width: 60 },
230
+ { prop: 'userName', label: '用户名' },
231
+ { prop: 'userType', label: '角色类型', isSlot: true },
232
+ { prop: 'phone', label: '联系方式' },
233
+ { prop: 'email', label: '注册邮箱' },
234
+ {
235
+ prop: 'address',
236
+ label: '地址',
237
+ align: 'center',
238
+ columns: [
239
+ { prop: 'province', label: '省' },
240
+ { prop: 'city', label: '市' },
241
+ { prop: 'area', label: '区' },
242
+ { prop: 'house', label: '详细', 'show-overflow-tooltip': true },
243
+ ]
244
+ },
245
+ ]
246
+ },
247
+ tableAction: {
248
+ publicConfig: { 'type': 'text' },
249
+ maxButton: 3,
250
+ buttons: [
251
+ { 'text': '详情', event: 'openReadDialog' },
252
+ { 'text': '编辑', event: 'openEditDialog' },
253
+ { 'text': '删除', event: 'pageDelete' },
254
+ { 'text': '审核', event: 'delete' },
255
+ { 'text': '忽略', event: 'delete' },
256
+ ]
257
+ },
258
+ pagination: {
259
+ 'page-size': 100,
260
+ 'current-page': 1,
261
+ 'page-sizes': [20, 50, 100, 200],
262
+ 'total': 400,
263
+ 'layout': 'sizes, prev, pager, next, jumper, ->, total',
264
+ },
265
+ readDialog: {
266
+ 'model-value': false,
267
+ title: '用户详情'
268
+ },
269
+ readForm: {
270
+ 'rules': {
271
+ 'userName': [
272
+ { 'min': 2, 'max': 10, 'message': '用户名字符在 2 ~ 10 以内', 'trigger': 'blur' },
273
+ ],
274
+ 'email': [{
275
+ 'trigger': 'blur',
276
+ 'validator': (rule: any, value: any, callback: any) => {
277
+ const emailRegExp: RegExp = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
278
+ if (!emailRegExp.test(value)) return callback(new Error('请填写正确的邮箱'))
279
+ callback()
280
+ }
281
+ }],
282
+ },
283
+ 'label-suffix': ':',
284
+ // 自定义属性
285
+ 'items': [
286
+ {
287
+ 'prop': 'userName',
288
+ 'label': '用户名称',
289
+ 'controlType': ControlTypes['flm-read'],
290
+ 'controlConfig': {}
291
+ },
292
+ {
293
+ 'prop': 'email',
294
+ 'label': '注册邮箱',
295
+ 'controlType': ControlTypes['flm-read'],
296
+ 'controlConfig': {}
297
+ },
298
+ {
299
+ 'prop': 'userType',
300
+ 'label': '用户类型',
301
+ 'isSlot': true,
302
+ },
303
+ ],
304
+ 'buttons': [
305
+ {
306
+ 'type': 'primary',
307
+ 'text': '确定',
308
+ 'event': 'cancel'
309
+ }
310
+ ]
311
+ },
312
+ addDialog: {
313
+ 'model-value': false,
314
+ title: '新增用户',
315
+ },
316
+ addForm: {
317
+ 'label-suffix': ':',
318
+ // 自定义属性
319
+ 'items': [
320
+ {
321
+ 'prop': 'userName',
322
+ 'label': '用户名称',
323
+ 'required': true,
324
+ 'controlType': ControlTypes['flm-input'],
325
+ 'controlConfig': {},
326
+ 'rules': [
327
+ { 'required': true, 'message': '用户名不能为空' },
328
+ { 'min': 2, 'max': 10, 'message': '用户名字符在 2 ~ 10 以内', 'trigger': 'blur' },
329
+ ]
330
+ },
331
+ {
332
+ 'prop': 'email',
333
+ 'label': '注册邮箱',
334
+ 'required': true,
335
+ 'controlType': ControlTypes['flm-input'],
336
+ 'controlConfig': {},
337
+ 'rules': [
338
+ { 'required': true, 'message': '注册邮箱不能为空' },
339
+ {
340
+ 'trigger': 'blur',
341
+ 'validator': (rule: any, value: any, callback: any) => {
342
+ const emailRegExp: RegExp = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
343
+ if (!emailRegExp.test(value)) return callback(new Error('请填写正确的邮箱'))
344
+ callback()
345
+ }
346
+ }
347
+ ]
348
+ },
349
+ {
350
+ 'prop': 'userType',
351
+ 'label': '用户类型',
352
+ 'required': true,
353
+ 'controlType': ControlTypes['flm-select'],
354
+ 'controlConfig': {
355
+ 'options': [
356
+ { 'value': 0, 'label': '普通用户' },
357
+ { 'value': 1, 'label': '企业用户' },
358
+ ]
359
+ },
360
+ 'rules': [
361
+ { 'required': true, 'message': '用户类型不能为空' },
362
+ ]
363
+ },
364
+ {
365
+ 'prop': 'isAdmin',
366
+ 'label': '超级权限',
367
+ 'required': true,
368
+ 'controlType': ControlTypes['flm-switch'],
369
+ 'controlConfig': {
370
+ 'active-text': "开启",
371
+ 'inactive-text': "关闭"
372
+ },
373
+ 'rules': [
374
+ { 'required': true, 'message': '超级权限不能为空' },
375
+ ]
376
+ },
377
+ {
378
+ 'prop': 'addTips',
379
+ 'isSlot': true,
380
+ },
381
+ ],
382
+ 'buttons': [
383
+ {
384
+ 'text': '取消',
385
+ 'event': 'cancel'
386
+ },
387
+ {
388
+ 'type': 'primary',
389
+ 'text': '确定',
390
+ 'event': 'submit'
391
+ }
392
+ ]
393
+ },
394
+ editDialog: {
395
+ 'model-value': false,
396
+ title: '编辑用户'
397
+ },
398
+ editForm: {
399
+ 'model': {},
400
+ 'rules': {
401
+ 'userName': [
402
+ { 'min': 2, 'max': 10, 'message': '用户名字符在 2 ~ 10 以内', 'trigger': 'blur' },
403
+ ],
404
+ 'email': [{
405
+ 'trigger': 'blur',
406
+ 'validator': (rule: any, value: any, callback: any) => {
407
+ const emailRegExp: RegExp = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
408
+ if (!emailRegExp.test(value)) return callback(new Error('请填写正确的邮箱'))
409
+ callback()
410
+ }
411
+ }],
412
+ },
413
+ 'label-suffix': ':',
414
+ // 自定义属性
415
+ 'items': [
416
+ {
417
+ 'prop': 'userName',
418
+ 'label': '用户名称',
419
+ 'controlType': ControlTypes['flm-input'],
420
+ 'controlConfig': {}
421
+ },
422
+ {
423
+ 'prop': 'email',
424
+ 'label': '注册邮箱',
425
+ 'controlType': ControlTypes['flm-input'],
426
+ 'controlConfig': {}
427
+ },
428
+ {
429
+ 'prop': 'userType',
430
+ 'label': '用户类型',
431
+ 'controlType': ControlTypes['flm-select'],
432
+ 'controlConfig': {
433
+ 'options': [
434
+ { 'value': 0, 'label': '普通用户' },
435
+ { 'value': 1, 'label': '企业用户' },
436
+ ]
437
+ }
438
+ },
439
+ ],
440
+ 'buttons': [
441
+ {
442
+ 'text': '取消',
443
+ 'event': 'cancel'
444
+ },
445
+ {
446
+ 'type': 'primary',
447
+ 'text': '确定',
448
+ 'event': 'submit'
449
+ }
450
+ ]
451
+ },
452
+ }
453
+ reportPageSetting.table['height'] = tableHeight()
454
+ reportPageSetting.table['max-height'] = tableHeight()
455
+ reportPageSetting.tableAction.buttons.length && reportPageSetting.table.columns?.push({
456
+ prop: 'tableAction',
457
+ label: '操作',
458
+ isSlot: true,
459
+ fixed: 'right',
460
+ 'min-width': '100px'
461
+ })
462
+ reportPageConfig.value = reportPageSetting
463
+ queryPageData()
464
+ }, 500)
465
+ }
466
+
467
+ // 查询页面数据
468
+ const queryPageData = () => {
469
+ const {
470
+ ['current-page']: index = 1,
471
+ ['page-size']: size = 20,
472
+ }: ReportPageSetting['pagination'] = reportPageConfig.value.pagination
473
+ console.log('数据查询,参数:', { index, size })
474
+ // 模拟数据查询
475
+ setTimeout(() => {
476
+ const data = new Array(20)
477
+ .fill(null)
478
+ .map((item, index) => ({
479
+ id: index,
480
+ userName: '张三',
481
+ phone: '18086509520',
482
+ email: 'test@flame.com',
483
+ userType: 1,
484
+ address: '地址',
485
+ province: '湖北省',
486
+ city: '武汉市',
487
+ area: '洪山区',
488
+ house: '关山大道 355号 K11购物艺术中心 铭丰大厦 T1写字楼 3508'
489
+ }))
490
+ reportPageConfig.value.table.data = data
491
+ isLoaded.value = true
492
+ }, 500)
493
+ }
494
+
495
+ // 搜索栏提交
496
+ const searchSubmit = (event: object) => {
497
+ console.log(`搜索:`, event)
498
+ }
499
+
500
+ // 工具栏点击
501
+ const toolbarClick = (event: string) => {
502
+ console.log(`工具栏调用:${event}`)
503
+ isValidKey(event, pageDefaultEvent)
504
+ ? pageDefaultEvent[event]()
505
+ : emit('customEvent', { event })
506
+ }
507
+
508
+ // 表格操作栏点击
509
+ const tableActionClick = (event: string, scope: any) => {
510
+ console.log(`表格操作:${event}, 数据:`, scope)
511
+ isValidKey(event, pageDefaultEvent)
512
+ ? pageDefaultEvent[event](scope)
513
+ : emit('customEvent', { event, scope })
514
+ }
515
+
516
+ // 表格操作
517
+ const tableEvent: Record<string, (event?: any) => void> = {
518
+ // 表格勾选项变化
519
+ selectionChange: ({ row }: any) => {
520
+ console.log('表格选项变化,已勾选:', row)
521
+ tableSelection = row
522
+ }
523
+ }
524
+
525
+ // 分页器操作
526
+ const paginationEvent: Record<string, (event?: any) => void> = {
527
+ // 每页数量变化
528
+ sizeChange:(pageSize: number) => {
529
+ console.log(`每页 ${pageSize} 条`)
530
+ reportPageConfig.value.pagination['current-page'] = 1
531
+ reportPageConfig.value.pagination['page-size'] = pageSize
532
+ queryPageData()
533
+ },
534
+ // 当前页变化
535
+ currentChange:(current: number) => {
536
+ console.log(`当前为第 ${current} 页`)
537
+ reportPageConfig.value.pagination['current-page'] = current
538
+ queryPageData()
539
+ },
540
+ }
541
+
542
+ // 页面默认操作
543
+ const pageDefaultEvent: Record<string, (event?: any) => void> = {
544
+ // 打开详情弹窗
545
+ openReadDialog:(scope: any) => {
546
+ console.log('查看详情,数据:', scope.row)
547
+ reportPageConfig.value.readForm['model'] = scope.row
548
+ reportPageConfig.value.readDialog['model-value'] = true
549
+ },
550
+ // 关闭详情弹窗
551
+ closeReadDialog:() => {
552
+ reportPageConfig.value.readDialog['model-value'] = false
553
+ },
554
+ // 查看详情
555
+ pageRead:() => {
556
+ reportPageConfig.value.readDialog['model-value'] = true
557
+ },
558
+ // 打开新增弹窗
559
+ openAddDialog:() => {
560
+ reportPageConfig.value.addDialog['model-value'] = true
561
+ },
562
+ // 关闭新增弹窗
563
+ closeAddDialog:() => {
564
+ reportPageConfig.value.addDialog['model-value'] = false
565
+ },
566
+ // 页面新增
567
+ pageAdd:(formModel: FormConfig['model']) => {
568
+ console.log('页面新增,数据:', formModel)
569
+ pageDefaultEvent.closeAddDialog()
570
+ },
571
+ // 页面删除
572
+ pageDelete:(scope: any) => {
573
+ ElMessageBox.confirm(
574
+ '确认要删除本条数据吗?此操作不可逆',
575
+ '提示',
576
+ {
577
+ confirmButtonText: '确定',
578
+ cancelButtonText: '取消',
579
+ type: 'warning',
580
+ }
581
+ )
582
+ .then(() => {
583
+ // 此处需要请求删除接口,并完成回显
584
+ console.log('单条删除,数据:', scope.row)
585
+ ElMessage.success('删除成功')
586
+ })
587
+ .catch(() => {
588
+ ElMessage.info('取消删除')
589
+ })
590
+ },
591
+ // 打开编辑弹窗
592
+ openEditDialog:(scope: any) => {
593
+ console.log('单条编辑,数据:', scope.row)
594
+ reportPageConfig.value.editForm['model'] = scope.row
595
+ reportPageConfig.value.editDialog['model-value'] = true
596
+ },
597
+ // 关闭详情弹窗
598
+ closeEditDialog:() => {
599
+ reportPageConfig.value.editDialog['model-value'] = false
600
+ },
601
+ // 页面编辑
602
+ pageEdit:(formModel: FormConfig['model']) => {
603
+ console.log('页面编辑,数据:', formModel)
604
+ pageDefaultEvent.closeEditDialog()
605
+ },
606
+ // 页面导入
607
+ pageImport:() => console.log('页面导入'),
608
+ // 页面导出
609
+ pageExport:() => console.log('页面导出'),
610
+ // 页面批量删除
611
+ pageBatchDelete:() => {
612
+ console.log('页面批量删除')
613
+ if (tableSelection.length) {
614
+ ElMessageBox.confirm(
615
+ '确认要删除勾选数据吗?此操作不可逆',
616
+ '提示',
617
+ {
618
+ confirmButtonText: '确定',
619
+ cancelButtonText: '取消',
620
+ type: 'warning',
621
+ }
622
+ )
623
+ .then(() => {
624
+ // 此处需要请求删除接口,并完成回显
625
+ console.log('批量删除,数据:', tableSelection)
626
+ ElMessage.success('删除成功')
627
+ })
628
+ .catch(() => {
629
+ ElMessage.info('取消删除')
630
+ })
631
+ } else {
632
+ ElMessage.warning('未勾选删除项!')
633
+ }
634
+ },
635
+ }
636
+
637
+ // 表格插槽
638
+ const getTableSlots = computed((): Array<string> => {
639
+ const columns: Array<TableColumnConfig> = reportPageConfig.value.table.columns || []
640
+ const slotColumns: Array<string> = []
641
+ const slotFilter = (columns: Array<TableColumnConfig>) => {
642
+ columns.forEach(({ prop, isSlot, columns }: TableColumnConfig) => {
643
+ (isSlot && prop && prop !== 'tableAction') && slotColumns.push(prop)
644
+ columns?.length && slotFilter(columns)
645
+ })
646
+ }
647
+ slotFilter(columns)
648
+ return slotColumns
649
+ })
650
+
651
+ const getFormSlots = (items: FormConfig['items'] = []): Array<string> => {
652
+ let slots: Array<string> = []
653
+ items.forEach((item: FormItemConfig) => {
654
+ if (isValidKey('isSlot', item)) {
655
+ const { prop } = item
656
+ prop && typeof(prop) === 'string' && slots.push(prop)
657
+ }
658
+ })
659
+ return slots
660
+ }
661
+ const searchSlots = computed((): Array<string> => getFormSlots(reportPageConfig.value.search.items))
662
+ const readFormSlots = computed((): Array<string> => getFormSlots(reportPageConfig.value.readForm.items))
663
+ const addFormSlots = computed((): Array<string> => getFormSlots(reportPageConfig.value.addForm.items))
664
+ const editFormSlots = computed((): Array<string> => getFormSlots(reportPageConfig.value.editForm.items))
665
+ </script>
666
+
667
+ <style lang="scss" scoped>
668
+ .report-page {
669
+ display: grid;
670
+ grid-template-columns: repeat(24, 1fr);
671
+ grid-template-rows: 50px 1fr 50px;
672
+ padding: 20px;
673
+ border-radius: 2px;
674
+ background: #FFF;
675
+ .page-search {
676
+ grid-column: span 18;
677
+ }
678
+ .page-toolbar {
679
+ grid-column: span 6;
680
+ justify-self: end;
681
+ }
682
+ .page-table, .page-pagination {
683
+ grid-column: span 24;
684
+ }
685
+ .page-pagination {
686
+ align-self: end;
687
+ justify-self: end;
688
+ }
689
+ }
690
+ </style>
@@ -0,0 +1,8 @@
1
+ // 组件
2
+ export * as flmPlus from './components'
3
+
4
+ // 类型
5
+ export * as flmComponentConfig from './model/flmComponentConfig'
6
+
7
+ // 方法
8
+ export * as flmUtils from './utils'