vue-super-crud 1.7.1 → 1.7.4

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 (273) hide show
  1. package/README.md +42 -10
  2. package/lib/index.css +1 -1
  3. package/lib/super-crud.min.js +2 -2
  4. package/package.json +21 -16
  5. package/src/config/common.js +2 -1
  6. package/src/config/crud.js +3 -3
  7. package/src/index.js +4 -0
  8. package/src/template/formatData.js +75 -87
  9. package/.browserslistrc +0 -3
  10. package/.versionrc.json +0 -36
  11. package/CHANGELOG.md +0 -232
  12. package/babel.config.js +0 -12
  13. package/build/alias.js +0 -10
  14. package/build/build.js +0 -52
  15. package/build/config.js +0 -70
  16. package/deploy.bat +0 -14
  17. package/docs/.vuepress/components/button/base.vue +0 -88
  18. package/docs/.vuepress/components/common/code-format.vue +0 -331
  19. package/docs/.vuepress/components/commonConfig/presetCodeTemplate/base.vue +0 -68
  20. package/docs/.vuepress/components/commonConfig/presetCodeTemplate/customParams.vue +0 -73
  21. package/docs/.vuepress/components/commonConfig/renderType/component.vue +0 -160
  22. package/docs/.vuepress/components/commonConfig/renderType/formatter.vue +0 -49
  23. package/docs/.vuepress/components/commonConfig/renderType/render.vue +0 -91
  24. package/docs/.vuepress/components/commonConfig/renderType/slot.vue +0 -63
  25. package/docs/.vuepress/components/crud/baseUse/baseUse.vue +0 -98
  26. package/docs/.vuepress/components/crud/baseUse/columnAction.vue +0 -72
  27. package/docs/.vuepress/components/crud/baseUse/columnWidth.vue +0 -107
  28. package/docs/.vuepress/components/crud/baseUse/handleRow.vue +0 -65
  29. package/docs/.vuepress/components/crud/baseUse/height.vue +0 -82
  30. package/docs/.vuepress/components/crud/baseUse/index.vue +0 -54
  31. package/docs/.vuepress/components/crud/baseUse/loading.vue +0 -70
  32. package/docs/.vuepress/components/crud/baseUse/pagination.vue +0 -108
  33. package/docs/.vuepress/components/crud/baseUse/selection.vue +0 -114
  34. package/docs/.vuepress/components/crud/baseUse/summaryMethod.vue +0 -118
  35. package/docs/.vuepress/components/crud/baseUse/title.vue +0 -54
  36. package/docs/.vuepress/components/crud/baseUse/toolbar.vue +0 -69
  37. package/docs/.vuepress/components/crud/buttons/common.vue +0 -115
  38. package/docs/.vuepress/components/crud/buttons/fast.vue +0 -82
  39. package/docs/.vuepress/components/crud/contextMenu/base.vue +0 -72
  40. package/docs/.vuepress/components/crud/copy.vue +0 -52
  41. package/docs/.vuepress/components/crud/crudEvents/api.vue +0 -157
  42. package/docs/.vuepress/components/crud/crudEvents/deleteTip.vue +0 -93
  43. package/docs/.vuepress/components/crud/crudEvents/events.vue +0 -188
  44. package/docs/.vuepress/components/crud/dataSort/base.vue +0 -142
  45. package/docs/.vuepress/components/crud/genDynamicColumns/base.vue +0 -53
  46. package/docs/.vuepress/components/crud/genDynamicColumns/dynamicAndFixed.vue +0 -111
  47. package/docs/.vuepress/components/crud/genDynamicColumns/treeDynamic.vue +0 -68
  48. package/docs/.vuepress/components/crud/handleBar/handleRow.vue +0 -65
  49. package/docs/.vuepress/components/crud/handleBar/toolbar.vue +0 -69
  50. package/docs/.vuepress/components/crud/renderType/1.vue +0 -57
  51. package/docs/.vuepress/components/crud/renderType/2.vue +0 -63
  52. package/docs/.vuepress/components/crud/renderType/3.vue +0 -105
  53. package/docs/.vuepress/components/crud/renderType/5.vue +0 -91
  54. package/docs/.vuepress/components/crud/search/1.vue +0 -90
  55. package/docs/.vuepress/components/crud/search/2.vue +0 -78
  56. package/docs/.vuepress/components/crud/search/3.vue +0 -107
  57. package/docs/.vuepress/components/crud/search/base.vue +0 -123
  58. package/docs/.vuepress/components/crud/search/localSearch.vue +0 -124
  59. package/docs/.vuepress/components/crud/search/special.vue +0 -148
  60. package/docs/.vuepress/components/crud/selection/events.vue +0 -47
  61. package/docs/.vuepress/components/crud/selection/pagination.vue +0 -94
  62. package/docs/.vuepress/components/crud/selection/singleSelection.vue +0 -64
  63. package/docs/.vuepress/components/crud/span/base.vue +0 -69
  64. package/docs/.vuepress/components/crud/span/special.vue +0 -75
  65. package/docs/.vuepress/components/crud/summary/base.vue +0 -99
  66. package/docs/.vuepress/components/crud/tableEdit/addDeleteBtn.vue +0 -174
  67. package/docs/.vuepress/components/crud/tableEdit/cellEdit.vue +0 -194
  68. package/docs/.vuepress/components/crud/tableEdit/controlEdit.vue +0 -219
  69. package/docs/.vuepress/components/crud/tableEdit/dialog.vue +0 -172
  70. package/docs/.vuepress/components/crud/tableEdit/free.vue +0 -88
  71. package/docs/.vuepress/components/crud/tableEdit/freeColumn.vue +0 -82
  72. package/docs/.vuepress/components/crud/tableEdit/methods.vue +0 -154
  73. package/docs/.vuepress/components/crud/tableEdit/rowAction.vue +0 -107
  74. package/docs/.vuepress/components/crud/tableEdit/rowBatch.vue +0 -116
  75. package/docs/.vuepress/components/crud/tableEdit/rowClick.vue +0 -98
  76. package/docs/.vuepress/components/crud/validate/base.vue +0 -122
  77. package/docs/.vuepress/components/crud/validate/custom.vue +0 -82
  78. package/docs/.vuepress/components/crud/validate/regulars.vue +0 -88
  79. package/docs/.vuepress/components/crud/validate/relation.vue +0 -91
  80. package/docs/.vuepress/components/crud/validate/tree.vue +0 -82
  81. package/docs/.vuepress/components/dialog/baseUse/base.vue +0 -92
  82. package/docs/.vuepress/components/dialog/baseUse/beforeConfirm.vue +0 -78
  83. package/docs/.vuepress/components/dialog/baseUse/control.vue +0 -79
  84. package/docs/.vuepress/components/dialog/baseUse/drawer.vue +0 -59
  85. package/docs/.vuepress/components/dialog/baseUse/footer.vue +0 -87
  86. package/docs/.vuepress/components/dialog/baseUse/insertSlot.vue +0 -79
  87. package/docs/.vuepress/components/dict/DictLinkage.vue +0 -91
  88. package/docs/.vuepress/components/dict/baseUse.vue +0 -72
  89. package/docs/.vuepress/components/dict/component.vue +0 -82
  90. package/docs/.vuepress/components/dict/localDict.vue +0 -68
  91. package/docs/.vuepress/components/form/baseUse/base.vue +0 -48
  92. package/docs/.vuepress/components/form/baseUse/dataFormat.vue +0 -92
  93. package/docs/.vuepress/components/form/baseUse/deep.vue +0 -57
  94. package/docs/.vuepress/components/form/baseUse/gridLayout.vue +0 -47
  95. package/docs/.vuepress/components/form/baseUse/group.vue +0 -66
  96. package/docs/.vuepress/components/form/baseUse/hidden.vue +0 -40
  97. package/docs/.vuepress/components/form/baseUse/inlineLayout.vue +0 -48
  98. package/docs/.vuepress/components/form/baseUse/label.vue +0 -51
  99. package/docs/.vuepress/components/form/baseUse/tooltip.vue +0 -40
  100. package/docs/.vuepress/components/form/baseUse/validate.vue +0 -52
  101. package/docs/.vuepress/components/form/detail/base.vue +0 -78
  102. package/docs/.vuepress/components/form/detail/border.vue +0 -90
  103. package/docs/.vuepress/components/form/detail/singleDetail.vue +0 -72
  104. package/docs/.vuepress/components/formatData/baseUse.vue +0 -131
  105. package/docs/.vuepress/components/mock/index.js +0 -347
  106. package/docs/.vuepress/components/mockData/custom.vue +0 -69
  107. package/docs/.vuepress/components/mockData/example.vue +0 -290
  108. package/docs/.vuepress/components/positionSlot/base.vue +0 -24
  109. package/docs/.vuepress/components/positionSlot/form.vue +0 -71
  110. package/docs/.vuepress/components/positionSlot/table.vue +0 -85
  111. package/docs/.vuepress/components/tabs/base.vue +0 -57
  112. package/docs/.vuepress/components/temp.js +0 -195
  113. package/docs/.vuepress/config.js +0 -146
  114. package/docs/.vuepress/enhanceApp.js +0 -142
  115. package/docs/.vuepress/public/favicon.ico +0 -0
  116. package/docs/.vuepress/public/super.png +0 -0
  117. package/docs/.vuepress/styles/index.styl +0 -25
  118. package/docs/.vuepress/styles/palette.styl +0 -6
  119. package/docs/README.md +0 -14
  120. package/docs/guide/button/base.md +0 -31
  121. package/docs/guide/commonConfig/jsx.md +0 -166
  122. package/docs/guide/commonConfig/presetCodeTemplate.md +0 -68
  123. package/docs/guide/commonConfig/renderType.md +0 -181
  124. package/docs/guide/crud/baseUse.md +0 -120
  125. package/docs/guide/crud/buttons.md +0 -18
  126. package/docs/guide/crud/config.md +0 -217
  127. package/docs/guide/crud/contextMenu.md +0 -18
  128. package/docs/guide/crud/dataSort.md +0 -66
  129. package/docs/guide/crud/genDynamicColumns.md +0 -145
  130. package/docs/guide/crud/handleBar.md +0 -26
  131. package/docs/guide/crud/renderType.md +0 -4
  132. package/docs/guide/crud/search.md +0 -150
  133. package/docs/guide/crud/selection.md +0 -73
  134. package/docs/guide/crud/span.md +0 -98
  135. package/docs/guide/crud/summary.md +0 -167
  136. package/docs/guide/crud/tableEdit.md +0 -377
  137. package/docs/guide/crud/validate.md +0 -158
  138. package/docs/guide/dialog/baseUse.md +0 -81
  139. package/docs/guide/dict/baseUse.md +0 -174
  140. package/docs/guide/dict/component.md +0 -88
  141. package/docs/guide/dict/config.md +0 -44
  142. package/docs/guide/form/baseUse.md +0 -142
  143. package/docs/guide/form/detail.md +0 -38
  144. package/docs/guide/formatData/baseUse.md +0 -98
  145. package/docs/guide/formatData/config.md +0 -142
  146. package/docs/guide/mockData/base.md +0 -26
  147. package/docs/guide/positionSlot/base.md +0 -41
  148. package/docs/guide/question/base.md +0 -44
  149. package/docs/guide/start/base.md +0 -30
  150. package/docs/guide/tabs/base.md +0 -63
  151. package/examples/App.vue +0 -52
  152. package/examples/Layout/components/AppMain.vue +0 -40
  153. package/examples/Layout/components/Item.vue +0 -29
  154. package/examples/Layout/components/Link.vue +0 -44
  155. package/examples/Layout/components/SidebarItem.vue +0 -93
  156. package/examples/Layout/index.vue +0 -69
  157. package/examples/assets/logo.png +0 -0
  158. package/examples/favicon.ico +0 -0
  159. package/examples/index.html +0 -18
  160. package/examples/main.js +0 -54
  161. package/examples/router/index.js +0 -140
  162. package/examples/store/index.js +0 -0
  163. package/examples/styles/index.scss +0 -63
  164. package/examples/styles/sidebar.scss +0 -226
  165. package/examples/styles/transition.scss +0 -48
  166. package/examples/styles/variables.scss +0 -25
  167. package/examples/views/crud/base.vue +0 -68
  168. package/examples/views/crud/handleRow.vue +0 -84
  169. package/examples/views/crud/search.vue +0 -116
  170. package/examples/views/dashboard/index.vue +0 -244
  171. package/examples/views/dashboard/index1.vue +0 -234
  172. package/examples/views/dashboard/test.vue +0 -9
  173. package/examples/views/formTest/index.vue +0 -168
  174. package/examples/views/nested/menu1/index.vue +0 -7
  175. package/examples/views/nested/menu1/menu1-1/index.vue +0 -7
  176. package/examples/views/nested/menu1/menu1-2/index.vue +0 -7
  177. package/examples/views/nested/menu1/menu1-2/menu1-2-1/index.vue +0 -5
  178. package/examples/views/nested/menu1/menu1-2/menu1-2-2/index.vue +0 -5
  179. package/examples/views/nested/menu1/menu1-3/index.vue +0 -5
  180. package/examples/views/nested/menu2/index.vue +0 -5
  181. package/gulpfile.js +0 -84
  182. package/packages/button/index.vue +0 -189
  183. package/packages/core/components/comp.vue +0 -223
  184. package/packages/core/components/position.vue +0 -135
  185. package/packages/core/components/render.vue +0 -460
  186. package/packages/core/configManager.js +0 -302
  187. package/packages/core/create.js +0 -8
  188. package/packages/core/defaultRender.js +0 -64
  189. package/packages/core/dict/global.js +0 -10
  190. package/packages/core/dict/index.js +0 -432
  191. package/packages/core/dict/mixin.js +0 -94
  192. package/packages/core/event.js +0 -60
  193. package/packages/core/index.js +0 -6
  194. package/packages/core/init.js +0 -122
  195. package/packages/core/mock/genConfig.js +0 -228
  196. package/packages/core/mock/genData.js +0 -422
  197. package/packages/core/mock/index.js +0 -4
  198. package/packages/core/rules.js +0 -111
  199. package/packages/crud/column.vue +0 -205
  200. package/packages/crud/columnAction.vue +0 -207
  201. package/packages/crud/columnCell.vue +0 -146
  202. package/packages/crud/defaultColumn.vue +0 -130
  203. package/packages/crud/drawerColumn.vue +0 -225
  204. package/packages/crud/form.vue +0 -69
  205. package/packages/crud/index.vue +0 -564
  206. package/packages/crud/menuBar.vue +0 -298
  207. package/packages/crud/mixins/cacheHandler.js +0 -36
  208. package/packages/crud/mixins/calcColumnWidth.js +0 -79
  209. package/packages/crud/mixins/calcHeight.js +0 -105
  210. package/packages/crud/mixins/columnHandler.js +0 -128
  211. package/packages/crud/mixins/contextMenu.js +0 -98
  212. package/packages/crud/mixins/dataProcessor.js +0 -202
  213. package/packages/crud/mixins/dialog.js +0 -109
  214. package/packages/crud/mixins/excelHandler.js +0 -150
  215. package/packages/crud/mixins/exposeMethods.js +0 -107
  216. package/packages/crud/mixins/generateDynamicColumns.js +0 -250
  217. package/packages/crud/mixins/props.js +0 -38
  218. package/packages/crud/mixins/searchHandler.js +0 -151
  219. package/packages/crud/mixins/select.js +0 -359
  220. package/packages/crud/mixins/spanMethod.js +0 -288
  221. package/packages/crud/mixins/summary.js +0 -177
  222. package/packages/crud/mixins/tableEdit.js +0 -547
  223. package/packages/crud/mixins/validate.js +0 -219
  224. package/packages/crud/pagination.vue +0 -110
  225. package/packages/crud/search.vue +0 -119
  226. package/packages/crud/searchHeader.vue +0 -231
  227. package/packages/crud/selectBanner.vue +0 -138
  228. package/packages/crud/utils/EditState.js +0 -319
  229. package/packages/crud/utils/excelExport.js +0 -112
  230. package/packages/crud/utils/excelImport.js +0 -112
  231. package/packages/crud/utils/index.js +0 -98
  232. package/packages/dialog/dialog.js +0 -233
  233. package/packages/dialog/dialog.vue +0 -15
  234. package/packages/dialog/index.js +0 -22
  235. package/packages/dict/cascadeFormat.vue +0 -179
  236. package/packages/dict/dateFormat.vue +0 -40
  237. package/packages/dict/form/cascade.vue +0 -61
  238. package/packages/dict/form/checkbox.vue +0 -90
  239. package/packages/dict/form/extendMethod.js +0 -22
  240. package/packages/dict/form/input-base.js +0 -31
  241. package/packages/dict/form/input.js +0 -20
  242. package/packages/dict/form/radio.vue +0 -69
  243. package/packages/dict/form/select.vue +0 -118
  244. package/packages/dict/form/switch.vue +0 -75
  245. package/packages/dict/valueFormat.vue +0 -188
  246. package/packages/directive/dialog/drag.js +0 -86
  247. package/packages/directive/dialog/dragSize.js +0 -42
  248. package/packages/directive/index.js +0 -9
  249. package/packages/directive/insertSlot.js +0 -10
  250. package/packages/form/contextMenu.js +0 -192
  251. package/packages/form/draftDrawer.vue +0 -391
  252. package/packages/form/formAction.vue +0 -97
  253. package/packages/form/formItem.vue +0 -259
  254. package/packages/form/index.vue +0 -451
  255. package/packages/form/props.js +0 -15
  256. package/packages/grid/cell.vue +0 -65
  257. package/packages/grid/index.vue +0 -130
  258. package/packages/group/index.vue +0 -96
  259. package/packages/tabs/index.vue +0 -290
  260. package/packages/tooltip/index.js +0 -9
  261. package/packages/tooltip/tooltip.vue +0 -32
  262. package/packages/tooltip/tooltipComponent.js +0 -38
  263. package/packages/verifyInput/index.vue +0 -131
  264. package/styles/button.scss +0 -3
  265. package/styles/crud.scss +0 -425
  266. package/styles/dialog.scss +0 -95
  267. package/styles/form.scss +0 -532
  268. package/styles/group.scss +0 -78
  269. package/styles/index.scss +0 -94
  270. package/styles/tabs.scss +0 -139
  271. package/styles/verifyInput.scss +0 -56
  272. package/vue-jsx-sync.js +0 -90
  273. package/vue.config.js +0 -54
@@ -1,228 +0,0 @@
1
- export function getComponentConfig(vnode) {
2
- const instance = getRealComponent(vnode);
3
- if (!instance) return null;
4
-
5
- const name = instance.$options.name;
6
- const props = instance.$props || {};
7
-
8
- // 公共配置
9
- const commonConfig = {
10
- ...props,
11
- disabled: !!instance.disabled,
12
- };
13
-
14
- // 特殊配置组件
15
- const specialConfig = {
16
- ElInput: {
17
- type: "input",
18
- subtype: props.type || "text",
19
- },
20
- ElInputNumber: {
21
- type: "number",
22
- },
23
- ElSelect: {
24
- type: "select",
25
- options: getSelectOptions(instance),
26
- },
27
- ElDatePicker: {
28
- type: "date",
29
- pickerType: props.type || "date",
30
- },
31
- ElRadioGroup: {
32
- type: "radio",
33
- options: getRadioOptions(instance),
34
- },
35
- ElRadio: {
36
- type: "radio",
37
- options: [
38
- {
39
- label: instance.label,
40
- value: instance.value ?? instance.label,
41
- },
42
- ],
43
- },
44
- ElRadioButton: {
45
- type: "radio",
46
- options: [
47
- {
48
- label: instance.label,
49
- value: instance.value ?? instance.label,
50
- },
51
- ],
52
- },
53
- ElCheckboxGroup: {
54
- type: "checkbox",
55
- options: getCheckboxOptions(instance),
56
- },
57
- };
58
-
59
- // 简单组件配置
60
- const simpleTypes = {
61
- ElTimePicker: "time",
62
- ElTimeSelect: "time",
63
- ElCheckbox: "checkbox",
64
- ElCascader: "cascader",
65
- ElSlider: "slider",
66
- ElRate: "rate",
67
- ElTransfer: "transfer",
68
- ElSwitch: "switch",
69
- };
70
-
71
- if (specialConfig[name]) {
72
- return {
73
- ...commonConfig,
74
- ...specialConfig[name],
75
- };
76
- }
77
-
78
- if (simpleTypes[name]) {
79
- return {
80
- ...commonConfig,
81
- type: simpleTypes[name],
82
- };
83
- }
84
-
85
- return null;
86
- }
87
-
88
- /**
89
- * 获取选择器的选项
90
- */
91
- function getSelectOptions(instance) {
92
- return findChildComponents(instance, {
93
- name: "ElOption",
94
- multiple: true,
95
- }).map((option) => ({
96
- label: option.label,
97
- value: option.value ?? option.label,
98
- disabled: !!option.disabled,
99
- }));
100
- }
101
-
102
- /**
103
- * 获取单选框组的选项
104
- */
105
- function getRadioOptions(instance) {
106
- return findChildComponents(instance, {
107
- name: ["ElRadio", "ElRadioButton"],
108
- multiple: true,
109
- }).map((radio) => ({
110
- label: radio.label,
111
- value: radio.value ?? radio.label,
112
- disabled: !!radio.disabled,
113
- }));
114
- }
115
-
116
- /**
117
- * 获取复选框组的选项
118
- */
119
- function getCheckboxOptions(instance) {
120
- return findChildComponents(instance, {
121
- name: "ElCheckbox",
122
- multiple: true,
123
- }).map((checkbox) => ({
124
- label: checkbox.label,
125
- value: checkbox.value ?? checkbox.label,
126
- disabled: !!checkbox.disabled,
127
- }));
128
- }
129
-
130
- /**
131
- * 获取真实组件实例
132
- */
133
- function getRealComponent(vnode) {
134
- if (!vnode?.componentInstance) return;
135
-
136
- let instance = vnode.componentInstance;
137
- let name = instance.$options.name;
138
-
139
- // el表单组件
140
- const formComponents = [
141
- "ElInput",
142
- "ElInputNumber",
143
- "ElSelect",
144
- "ElDatePicker",
145
- "ElTimePicker",
146
- "ElTimeSelect",
147
- "ElRadioGroup",
148
- "ElRadio",
149
- "ElCheckboxGroup",
150
- "ElCheckbox",
151
- "ElCascader",
152
- "ElSwitch",
153
- "ElSlider",
154
- "ElRate",
155
- "ElColorPicker",
156
- "ElUpload",
157
- "ElTransfer",
158
- ];
159
-
160
- while (instance && !formComponents.includes(name)) {
161
- const children = instance.$children || [];
162
- const childInstance = children[0];
163
- if (!childInstance) break;
164
- instance = childInstance;
165
- name = instance.$options.name;
166
- }
167
-
168
- return instance;
169
- }
170
-
171
- /**
172
- * 查找特定子组件
173
- * @param {Object} instance - 组件实例
174
- * @param {Object} options - 查找选项
175
- * @param {String} options.name - 组件名称
176
- * @param {Function} options.filter - 自定义过滤函数
177
- * @param {Boolean} options.deep - 是否深度查找,默认true
178
- * @param {Boolean} options.multiple - 是否查找多个,默认false
179
- * @returns {Array|Object|null} - 返回找到的组件实例
180
- */
181
- export function findChildComponents(instance, options = {}) {
182
- const { name, filter, deep = true, multiple = false } = options;
183
-
184
- if (!instance?.$children) {
185
- return multiple ? [] : null;
186
- }
187
-
188
- // 处理名称匹配逻辑
189
- const matchName = (componentName) => {
190
- if (!name) return true;
191
- if (Array.isArray(name)) {
192
- return name.includes(componentName);
193
- }
194
- return componentName === name;
195
- };
196
-
197
- const result = [];
198
-
199
- // 查找逻辑
200
- function find(children) {
201
- for (const child of children) {
202
- // 检查组件是否匹配
203
- const nameMatch = matchName(child.$options.name);
204
- const isMatch = nameMatch && (filter ? filter(child) : true);
205
-
206
- if (isMatch) {
207
- result.push(child);
208
- // 如果不需要多个结果且已找到,则提前返回
209
- if (!multiple) {
210
- return true;
211
- }
212
- }
213
-
214
- // 深度查找
215
- if (deep && child.$children?.length) {
216
- const found = find(child.$children);
217
- if (found && !multiple) {
218
- return true;
219
- }
220
- }
221
- }
222
- return false;
223
- }
224
-
225
- find(instance.$children);
226
-
227
- return multiple ? result : result[0] || null;
228
- }
@@ -1,422 +0,0 @@
1
- import Mock from "mockjs";
2
- const Random = Mock.Random;
3
-
4
- /**
5
- * 预设的数据生成规则
6
- */
7
- const PRESET_RULES = {
8
- // 数字相关
9
- integer: (min = 1, max = 100) => Random.integer(min, max), // 整数
10
- float: (min = 1, max = 100, precision = 2) =>
11
- Random.float(min, max, 0, precision), // 浮点数
12
-
13
- // 文本相关
14
- chinese: (min = 2, max = 4) => Random.cword(min, max), // 中文字符
15
- english: (min = 3, max = 8) => Random.word(min, max), // 英文字符
16
- paragraph: (min = 1, max = 3) => Random.cparagraph(min, max), // 中文段落
17
- sentence: (min = 3, max = 8) => Random.csentence(min, max), // 中文句子
18
-
19
- // 特殊格式
20
- email: () => Random.email(), // 邮箱
21
- phone: () => Mock.mock(/^1[3-9]\d{9}$/), // 手机号
22
- id: () => Mock.mock(/^\d{18}$/), // 18位数字
23
- date: (format = "yyyy-MM-dd") => Random.date(format), // 日期
24
- time: (format = "HH:mm:ss") => Random.time(format), // 时间
25
- datetime: (format = "yyyy-MM-dd HH:mm:ss") => Random.datetime(format), // 日期时间
26
- timestamp: () => Random.datetime("T"), // 时间戳
27
-
28
- // 列表生成
29
- array: (generator, length = 1) => {
30
- const count =
31
- typeof length === "number"
32
- ? length
33
- : Random.integer(length[0], length[1]);
34
- return Array.from({ length: count }, () =>
35
- typeof generator === "function" ? generator() : generator
36
- );
37
- },
38
-
39
- // 图片相关
40
- image: (width = 100, height = 100) => Random.image(`${width}x${height}`),
41
- imageUrl: (seed = 1, width = 100, height = 100) =>
42
- `https://picsum.photos/seed/${seed}/${width}/${height}`,
43
- url: () => Random.url(),
44
-
45
- // 其他
46
- pick: (arr) => Random.pick(arr), // 从数组中随机选择
47
- uuid: () => Random.guid(), // 唯一标识
48
- };
49
-
50
- export function generateCustomMockData(m, scope) {
51
- if (typeof m === "function") {
52
- return m(
53
- {
54
- Random,
55
- Mock,
56
- Preset: PRESET_RULES,
57
- },
58
- scope
59
- );
60
- }
61
- return m;
62
- }
63
-
64
- const typeGenerators = {
65
- input: generateInputValue,
66
- number: generateNumberValue,
67
- select: generateSelectValue,
68
- date: generateDateValue,
69
- time: generateTimeValue,
70
- radio: generateRadioValue,
71
- checkbox: generateCheckboxValue,
72
- cascader: generateCascaderValue,
73
- switch: generateSwitchValue,
74
- slider: generateSliderValue,
75
- rate: generateRateValue,
76
- transfer: generateTransferValue,
77
- };
78
-
79
- /**
80
- * 根据配置生成 mock 数据
81
- */
82
- export function generateMockData(config, options = {}) {
83
- if (!config) return null;
84
-
85
- const { yearRange = 1, pattern } = options;
86
-
87
- if (config.disabled) {
88
- return undefined;
89
- }
90
-
91
- if (pattern) {
92
- return Mock.mock(pattern);
93
- }
94
-
95
- const generator = typeGenerators[config.type];
96
- if (generator) {
97
- return generator(config, { yearRange });
98
- }
99
-
100
- return undefined;
101
- }
102
-
103
- function generateInputValue(config) {
104
- const { subtype, maxLength = 10, minLength = 1 } = config;
105
-
106
- switch (subtype) {
107
- case "email":
108
- return Random.email();
109
- case "url":
110
- return Random.url();
111
- case "number":
112
- return Random.string("number", minLength, maxLength);
113
- case "tel":
114
- case "phone":
115
- return Mock.mock(/^1[3-9]\d{9}$/);
116
- case "textarea":
117
- return Random.cparagraph(1, 3);
118
- default:
119
- return Random.cword(minLength, maxLength);
120
- }
121
- }
122
-
123
- function generateNumberValue(config) {
124
- const { min = 1, max = 100, precision = 0 } = config;
125
- const factor = Math.pow(10, precision);
126
- return Math.round(Random.float(min, max) * factor) / factor;
127
- }
128
-
129
- function generateSelectValue(config) {
130
- const { options = [], multiple, multipleLimit = 3 } = config;
131
-
132
- if (!options.length) return multiple ? [] : undefined;
133
-
134
- if (multiple) {
135
- const availableOptions = options.filter((opt) => !opt.disabled);
136
- const maxCount = multipleLimit || availableOptions.length;
137
- const count = Random.integer(1, maxCount);
138
- const values = Random.pick(
139
- availableOptions.map((opt) => opt.value),
140
- count
141
- );
142
- return Array.isArray(values) ? values : [values];
143
- }
144
-
145
- const availableOptions = options.filter((opt) => !opt.disabled);
146
- if (!availableOptions.length) return undefined;
147
-
148
- const option = Random.pick(availableOptions);
149
- return option.value;
150
- }
151
-
152
- function generateDateValue(config, options = {}) {
153
- const { pickerType, valueFormat } = config;
154
- const { yearRange = 1 } = options;
155
-
156
- // 计算日期范围
157
- const now = new Date();
158
- const minDate = new Date(now);
159
- minDate.setFullYear(now.getFullYear() - yearRange);
160
-
161
- // 如果配置中有指定范围,则使用配置的范围
162
- const startDate = config.min ? new Date(config.min) : minDate;
163
- const endDate = config.max ? new Date(config.max) : now;
164
-
165
- // 辅助函数:生成指定范围内的随机日期
166
- function getRandomDate() {
167
- const timestamp =
168
- startDate.getTime() +
169
- Math.random() * (endDate.getTime() - startDate.getTime());
170
- const date = new Date(timestamp);
171
- if (valueFormat) {
172
- return formatDate(date, valueFormat);
173
- }
174
- return date.toISOString().split("T")[0];
175
- }
176
-
177
- // 辅助函数:格式化日期
178
- function formatDate(date, format) {
179
- const year = date.getFullYear();
180
- const month = String(date.getMonth() + 1).padStart(2, "0");
181
- const day = String(date.getDate()).padStart(2, "0");
182
- const hours = String(date.getHours()).padStart(2, "0");
183
- const minutes = String(date.getMinutes()).padStart(2, "0");
184
- const seconds = String(date.getSeconds()).padStart(2, "0");
185
-
186
- return format
187
- .replace(/yyyy/g, year)
188
- .replace(/MM/g, month)
189
- .replace(/dd/g, day)
190
- .replace(/HH/g, hours)
191
- .replace(/mm/g, minutes)
192
- .replace(/ss/g, seconds);
193
- }
194
-
195
- switch (pickerType) {
196
- case "datetime": {
197
- const date = new Date(
198
- startDate.getTime() +
199
- Math.random() * (endDate.getTime() - startDate.getTime())
200
- );
201
- return valueFormat ? formatDate(date, valueFormat) : date.toISOString();
202
- }
203
-
204
- case "daterange":
205
- case "datetimerange": {
206
- const date1 = getRandomDate();
207
- let date2;
208
- do {
209
- date2 = getRandomDate();
210
- } while (date2 <= date1);
211
- return [date1, date2];
212
- }
213
-
214
- case "month": {
215
- const date = new Date(
216
- startDate.getTime() +
217
- Math.random() * (endDate.getTime() - startDate.getTime())
218
- );
219
- return valueFormat
220
- ? formatDate(date, valueFormat)
221
- : `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
222
- 2,
223
- "0"
224
- )}`;
225
- }
226
-
227
- case "year": {
228
- const startYear = startDate.getFullYear();
229
- const endYear = endDate.getFullYear();
230
- const year =
231
- startYear + Math.floor(Math.random() * (endYear - startYear + 1));
232
- return valueFormat
233
- ? formatDate(new Date(year, 0, 1), valueFormat)
234
- : String(year);
235
- }
236
-
237
- case "dates": {
238
- const count = Random.integer(1, 3);
239
- const dates = new Set();
240
- while (dates.size < count) {
241
- dates.add(getRandomDate());
242
- }
243
- return Array.from(dates).sort();
244
- }
245
-
246
- default:
247
- return getRandomDate();
248
- }
249
- }
250
-
251
- function generateTimeValue(config) {
252
- const {
253
- isRange,
254
- valueFormat = "HH:mm:ss",
255
- format = "HH:mm:ss",
256
- min = "01:00:00",
257
- max = "23:59:59",
258
- step = 1,
259
- } = config;
260
-
261
- // 辅助函数:生成随机时间
262
- function generateTime() {
263
- const [minHour, minMinute, minSecond = "00"] = min.split(":").map(Number);
264
- const [maxHour, maxMinute, maxSecond = "59"] = max.split(":").map(Number);
265
-
266
- const minTotal = minHour * 3600 + minMinute * 60 + minSecond;
267
- const maxTotal = maxHour * 3600 + maxMinute * 60 + maxSecond;
268
-
269
- let totalSeconds = Random.integer(minTotal, maxTotal);
270
- totalSeconds = Math.floor(totalSeconds / step) * step;
271
-
272
- const hours = Math.floor(totalSeconds / 3600);
273
- const minutes = Math.floor((totalSeconds % 3600) / 60);
274
- const seconds = totalSeconds % 60;
275
-
276
- const timeStr = [hours, minutes, seconds]
277
- .map((num) => String(num).padStart(2, "0"))
278
- .join(":");
279
-
280
- return valueFormat.includes("ss") ? timeStr : timeStr.slice(0, 5);
281
- }
282
-
283
- if (isRange) {
284
- const time1 = generateTime();
285
- let time2;
286
- do {
287
- time2 = generateTime();
288
- } while (time2 <= time1);
289
- return [time1, time2];
290
- }
291
-
292
- return generateTime();
293
- }
294
-
295
- function generateRadioValue(config) {
296
- const { options = [] } = config;
297
- if (!options.length) return undefined;
298
-
299
- const availableOptions = options.filter((opt) => !opt.disabled);
300
- if (!availableOptions.length) return undefined;
301
-
302
- const option = Random.pick(availableOptions);
303
- return option.value;
304
- }
305
-
306
- function generateCheckboxValue(config) {
307
- if (config.trueLabel !== undefined) {
308
- return Random.boolean() ? config.trueLabel : config.falseLabel;
309
- }
310
-
311
- const { options = [], min = 1, max = options.length } = config;
312
- if (!options.length) return [];
313
-
314
- const availableOptions = options.filter((opt) => !opt.disabled);
315
- const count = Random.integer(min, Math.min(max, availableOptions.length));
316
-
317
- const values = Random.pick(
318
- availableOptions.map((opt) => opt.value),
319
- count
320
- );
321
- return Array.isArray(values) ? values : [values];
322
- }
323
-
324
- function generateCascaderValue(config) {
325
- const { options = [], props = {} } = config;
326
-
327
- // 获取完整的路径(直到叶子节点)
328
- function getFullPath(items, currentPath = []) {
329
- if (!items?.length) return currentPath;
330
-
331
- const item = Random.pick(items);
332
- currentPath.push(item[props.value || "value"]);
333
-
334
- const children = item[props.children || "children"];
335
- if (!children?.length) return currentPath;
336
-
337
- // 如果不是任意级别选择,必须选到最后一级
338
- if (!props.checkStrictly) {
339
- return getFullPath(children, currentPath);
340
- }
341
-
342
- // 如果是任意级别选择,随机决定是否继续选择子级
343
- return Math.random() < 0.5
344
- ? currentPath
345
- : getFullPath(children, currentPath);
346
- }
347
-
348
- // 获取随机路径
349
- function getRandomPath(items) {
350
- if (!items?.length) return [];
351
- return getFullPath(items);
352
- }
353
-
354
- if (props.multiple) {
355
- // 生成1-3个路径
356
- const count = Random.integer(1, 3);
357
- const paths = new Set(); // 使用Set避免重复路径
358
-
359
- while (paths.size < count) {
360
- const path = getRandomPath(options);
361
- paths.add(JSON.stringify(path)); // 转成字符串以便Set去重
362
- }
363
-
364
- return Array.from(paths).map((path) => JSON.parse(path));
365
- }
366
-
367
- return getRandomPath(options);
368
- }
369
-
370
- function generateSwitchValue(config) {
371
- const { activeValue = true, inactiveValue = false } = config;
372
- return Random.boolean() ? activeValue : inactiveValue;
373
- }
374
-
375
- function generateSliderValue(config) {
376
- const { min = 1, max = 100, step = 1, range = false } = config;
377
-
378
- // 根据step调整值
379
- const adjustValueByStep = (value) => {
380
- if (!step || step === 1) return value;
381
- // 计算最接近的合法值
382
- return Math.round(value / step) * step;
383
- };
384
-
385
- if (range) {
386
- // 生成范围值
387
- const value1 = adjustValueByStep(Random.integer(min, max - step));
388
- const value2 = adjustValueByStep(Random.integer(value1 + step, max));
389
- return [value1, value2];
390
- }
391
-
392
- // 生成单个值
393
- return adjustValueByStep(Random.integer(min, max));
394
- }
395
-
396
- function generateRateValue(config) {
397
- const { max = 5, allowHalf = false } = config;
398
-
399
- if (allowHalf) {
400
- // 生成0.5的倍数
401
- const value = Random.integer(1, max * 2) / 2;
402
- return value;
403
- }
404
- return Random.integer(1, max);
405
- }
406
-
407
- function generateTransferValue(config) {
408
- const { data = [] } = config;
409
-
410
- if (!data.length) return [];
411
-
412
- // 随机选择1-3个可用的值
413
- const availableValues = data
414
- .filter((item) => !item.disabled)
415
- .map((item) => item.key || item.value);
416
-
417
- const count = Random.integer(1, Math.min(3, availableValues.length));
418
- const selectedValues = Random.pick(availableValues, count);
419
-
420
- // 如果是数组则返回数组,否则返回单个值
421
- return Array.isArray(selectedValues) ? selectedValues : [selectedValues];
422
- }
@@ -1,4 +0,0 @@
1
- import { getComponentConfig } from "./genConfig";
2
- import { generateMockData, generateCustomMockData } from "./genData";
3
-
4
- export { getComponentConfig, generateMockData, generateCustomMockData };