vue-super-crud 1.7.1 → 1.7.2

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 (269) 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/.browserslistrc +0 -3
  6. package/.versionrc.json +0 -36
  7. package/CHANGELOG.md +0 -232
  8. package/babel.config.js +0 -12
  9. package/build/alias.js +0 -10
  10. package/build/build.js +0 -52
  11. package/build/config.js +0 -70
  12. package/deploy.bat +0 -14
  13. package/docs/.vuepress/components/button/base.vue +0 -88
  14. package/docs/.vuepress/components/common/code-format.vue +0 -331
  15. package/docs/.vuepress/components/commonConfig/presetCodeTemplate/base.vue +0 -68
  16. package/docs/.vuepress/components/commonConfig/presetCodeTemplate/customParams.vue +0 -73
  17. package/docs/.vuepress/components/commonConfig/renderType/component.vue +0 -160
  18. package/docs/.vuepress/components/commonConfig/renderType/formatter.vue +0 -49
  19. package/docs/.vuepress/components/commonConfig/renderType/render.vue +0 -91
  20. package/docs/.vuepress/components/commonConfig/renderType/slot.vue +0 -63
  21. package/docs/.vuepress/components/crud/baseUse/baseUse.vue +0 -98
  22. package/docs/.vuepress/components/crud/baseUse/columnAction.vue +0 -72
  23. package/docs/.vuepress/components/crud/baseUse/columnWidth.vue +0 -107
  24. package/docs/.vuepress/components/crud/baseUse/handleRow.vue +0 -65
  25. package/docs/.vuepress/components/crud/baseUse/height.vue +0 -82
  26. package/docs/.vuepress/components/crud/baseUse/index.vue +0 -54
  27. package/docs/.vuepress/components/crud/baseUse/loading.vue +0 -70
  28. package/docs/.vuepress/components/crud/baseUse/pagination.vue +0 -108
  29. package/docs/.vuepress/components/crud/baseUse/selection.vue +0 -114
  30. package/docs/.vuepress/components/crud/baseUse/summaryMethod.vue +0 -118
  31. package/docs/.vuepress/components/crud/baseUse/title.vue +0 -54
  32. package/docs/.vuepress/components/crud/baseUse/toolbar.vue +0 -69
  33. package/docs/.vuepress/components/crud/buttons/common.vue +0 -115
  34. package/docs/.vuepress/components/crud/buttons/fast.vue +0 -82
  35. package/docs/.vuepress/components/crud/contextMenu/base.vue +0 -72
  36. package/docs/.vuepress/components/crud/copy.vue +0 -52
  37. package/docs/.vuepress/components/crud/crudEvents/api.vue +0 -157
  38. package/docs/.vuepress/components/crud/crudEvents/deleteTip.vue +0 -93
  39. package/docs/.vuepress/components/crud/crudEvents/events.vue +0 -188
  40. package/docs/.vuepress/components/crud/dataSort/base.vue +0 -142
  41. package/docs/.vuepress/components/crud/genDynamicColumns/base.vue +0 -53
  42. package/docs/.vuepress/components/crud/genDynamicColumns/dynamicAndFixed.vue +0 -111
  43. package/docs/.vuepress/components/crud/genDynamicColumns/treeDynamic.vue +0 -68
  44. package/docs/.vuepress/components/crud/handleBar/handleRow.vue +0 -65
  45. package/docs/.vuepress/components/crud/handleBar/toolbar.vue +0 -69
  46. package/docs/.vuepress/components/crud/renderType/1.vue +0 -57
  47. package/docs/.vuepress/components/crud/renderType/2.vue +0 -63
  48. package/docs/.vuepress/components/crud/renderType/3.vue +0 -105
  49. package/docs/.vuepress/components/crud/renderType/5.vue +0 -91
  50. package/docs/.vuepress/components/crud/search/1.vue +0 -90
  51. package/docs/.vuepress/components/crud/search/2.vue +0 -78
  52. package/docs/.vuepress/components/crud/search/3.vue +0 -107
  53. package/docs/.vuepress/components/crud/search/base.vue +0 -123
  54. package/docs/.vuepress/components/crud/search/localSearch.vue +0 -124
  55. package/docs/.vuepress/components/crud/search/special.vue +0 -148
  56. package/docs/.vuepress/components/crud/selection/events.vue +0 -47
  57. package/docs/.vuepress/components/crud/selection/pagination.vue +0 -94
  58. package/docs/.vuepress/components/crud/selection/singleSelection.vue +0 -64
  59. package/docs/.vuepress/components/crud/span/base.vue +0 -69
  60. package/docs/.vuepress/components/crud/span/special.vue +0 -75
  61. package/docs/.vuepress/components/crud/summary/base.vue +0 -99
  62. package/docs/.vuepress/components/crud/tableEdit/addDeleteBtn.vue +0 -174
  63. package/docs/.vuepress/components/crud/tableEdit/cellEdit.vue +0 -194
  64. package/docs/.vuepress/components/crud/tableEdit/controlEdit.vue +0 -219
  65. package/docs/.vuepress/components/crud/tableEdit/dialog.vue +0 -172
  66. package/docs/.vuepress/components/crud/tableEdit/free.vue +0 -88
  67. package/docs/.vuepress/components/crud/tableEdit/freeColumn.vue +0 -82
  68. package/docs/.vuepress/components/crud/tableEdit/methods.vue +0 -154
  69. package/docs/.vuepress/components/crud/tableEdit/rowAction.vue +0 -107
  70. package/docs/.vuepress/components/crud/tableEdit/rowBatch.vue +0 -116
  71. package/docs/.vuepress/components/crud/tableEdit/rowClick.vue +0 -98
  72. package/docs/.vuepress/components/crud/validate/base.vue +0 -122
  73. package/docs/.vuepress/components/crud/validate/custom.vue +0 -82
  74. package/docs/.vuepress/components/crud/validate/regulars.vue +0 -88
  75. package/docs/.vuepress/components/crud/validate/relation.vue +0 -91
  76. package/docs/.vuepress/components/crud/validate/tree.vue +0 -82
  77. package/docs/.vuepress/components/dialog/baseUse/base.vue +0 -92
  78. package/docs/.vuepress/components/dialog/baseUse/beforeConfirm.vue +0 -78
  79. package/docs/.vuepress/components/dialog/baseUse/control.vue +0 -79
  80. package/docs/.vuepress/components/dialog/baseUse/drawer.vue +0 -59
  81. package/docs/.vuepress/components/dialog/baseUse/footer.vue +0 -87
  82. package/docs/.vuepress/components/dialog/baseUse/insertSlot.vue +0 -79
  83. package/docs/.vuepress/components/dict/DictLinkage.vue +0 -91
  84. package/docs/.vuepress/components/dict/baseUse.vue +0 -72
  85. package/docs/.vuepress/components/dict/component.vue +0 -82
  86. package/docs/.vuepress/components/dict/localDict.vue +0 -68
  87. package/docs/.vuepress/components/form/baseUse/base.vue +0 -48
  88. package/docs/.vuepress/components/form/baseUse/dataFormat.vue +0 -92
  89. package/docs/.vuepress/components/form/baseUse/deep.vue +0 -57
  90. package/docs/.vuepress/components/form/baseUse/gridLayout.vue +0 -47
  91. package/docs/.vuepress/components/form/baseUse/group.vue +0 -66
  92. package/docs/.vuepress/components/form/baseUse/hidden.vue +0 -40
  93. package/docs/.vuepress/components/form/baseUse/inlineLayout.vue +0 -48
  94. package/docs/.vuepress/components/form/baseUse/label.vue +0 -51
  95. package/docs/.vuepress/components/form/baseUse/tooltip.vue +0 -40
  96. package/docs/.vuepress/components/form/baseUse/validate.vue +0 -52
  97. package/docs/.vuepress/components/form/detail/base.vue +0 -78
  98. package/docs/.vuepress/components/form/detail/border.vue +0 -90
  99. package/docs/.vuepress/components/form/detail/singleDetail.vue +0 -72
  100. package/docs/.vuepress/components/formatData/baseUse.vue +0 -131
  101. package/docs/.vuepress/components/mock/index.js +0 -347
  102. package/docs/.vuepress/components/mockData/custom.vue +0 -69
  103. package/docs/.vuepress/components/mockData/example.vue +0 -290
  104. package/docs/.vuepress/components/positionSlot/base.vue +0 -24
  105. package/docs/.vuepress/components/positionSlot/form.vue +0 -71
  106. package/docs/.vuepress/components/positionSlot/table.vue +0 -85
  107. package/docs/.vuepress/components/tabs/base.vue +0 -57
  108. package/docs/.vuepress/components/temp.js +0 -195
  109. package/docs/.vuepress/config.js +0 -146
  110. package/docs/.vuepress/enhanceApp.js +0 -142
  111. package/docs/.vuepress/public/favicon.ico +0 -0
  112. package/docs/.vuepress/public/super.png +0 -0
  113. package/docs/.vuepress/styles/index.styl +0 -25
  114. package/docs/.vuepress/styles/palette.styl +0 -6
  115. package/docs/README.md +0 -14
  116. package/docs/guide/button/base.md +0 -31
  117. package/docs/guide/commonConfig/jsx.md +0 -166
  118. package/docs/guide/commonConfig/presetCodeTemplate.md +0 -68
  119. package/docs/guide/commonConfig/renderType.md +0 -181
  120. package/docs/guide/crud/baseUse.md +0 -120
  121. package/docs/guide/crud/buttons.md +0 -18
  122. package/docs/guide/crud/config.md +0 -217
  123. package/docs/guide/crud/contextMenu.md +0 -18
  124. package/docs/guide/crud/dataSort.md +0 -66
  125. package/docs/guide/crud/genDynamicColumns.md +0 -145
  126. package/docs/guide/crud/handleBar.md +0 -26
  127. package/docs/guide/crud/renderType.md +0 -4
  128. package/docs/guide/crud/search.md +0 -150
  129. package/docs/guide/crud/selection.md +0 -73
  130. package/docs/guide/crud/span.md +0 -98
  131. package/docs/guide/crud/summary.md +0 -167
  132. package/docs/guide/crud/tableEdit.md +0 -377
  133. package/docs/guide/crud/validate.md +0 -158
  134. package/docs/guide/dialog/baseUse.md +0 -81
  135. package/docs/guide/dict/baseUse.md +0 -174
  136. package/docs/guide/dict/component.md +0 -88
  137. package/docs/guide/dict/config.md +0 -44
  138. package/docs/guide/form/baseUse.md +0 -142
  139. package/docs/guide/form/detail.md +0 -38
  140. package/docs/guide/formatData/baseUse.md +0 -98
  141. package/docs/guide/formatData/config.md +0 -142
  142. package/docs/guide/mockData/base.md +0 -26
  143. package/docs/guide/positionSlot/base.md +0 -41
  144. package/docs/guide/question/base.md +0 -44
  145. package/docs/guide/start/base.md +0 -30
  146. package/docs/guide/tabs/base.md +0 -63
  147. package/examples/App.vue +0 -52
  148. package/examples/Layout/components/AppMain.vue +0 -40
  149. package/examples/Layout/components/Item.vue +0 -29
  150. package/examples/Layout/components/Link.vue +0 -44
  151. package/examples/Layout/components/SidebarItem.vue +0 -93
  152. package/examples/Layout/index.vue +0 -69
  153. package/examples/assets/logo.png +0 -0
  154. package/examples/favicon.ico +0 -0
  155. package/examples/index.html +0 -18
  156. package/examples/main.js +0 -54
  157. package/examples/router/index.js +0 -140
  158. package/examples/store/index.js +0 -0
  159. package/examples/styles/index.scss +0 -63
  160. package/examples/styles/sidebar.scss +0 -226
  161. package/examples/styles/transition.scss +0 -48
  162. package/examples/styles/variables.scss +0 -25
  163. package/examples/views/crud/base.vue +0 -68
  164. package/examples/views/crud/handleRow.vue +0 -84
  165. package/examples/views/crud/search.vue +0 -116
  166. package/examples/views/dashboard/index.vue +0 -244
  167. package/examples/views/dashboard/index1.vue +0 -234
  168. package/examples/views/dashboard/test.vue +0 -9
  169. package/examples/views/formTest/index.vue +0 -168
  170. package/examples/views/nested/menu1/index.vue +0 -7
  171. package/examples/views/nested/menu1/menu1-1/index.vue +0 -7
  172. package/examples/views/nested/menu1/menu1-2/index.vue +0 -7
  173. package/examples/views/nested/menu1/menu1-2/menu1-2-1/index.vue +0 -5
  174. package/examples/views/nested/menu1/menu1-2/menu1-2-2/index.vue +0 -5
  175. package/examples/views/nested/menu1/menu1-3/index.vue +0 -5
  176. package/examples/views/nested/menu2/index.vue +0 -5
  177. package/gulpfile.js +0 -84
  178. package/packages/button/index.vue +0 -189
  179. package/packages/core/components/comp.vue +0 -223
  180. package/packages/core/components/position.vue +0 -135
  181. package/packages/core/components/render.vue +0 -460
  182. package/packages/core/configManager.js +0 -302
  183. package/packages/core/create.js +0 -8
  184. package/packages/core/defaultRender.js +0 -64
  185. package/packages/core/dict/global.js +0 -10
  186. package/packages/core/dict/index.js +0 -432
  187. package/packages/core/dict/mixin.js +0 -94
  188. package/packages/core/event.js +0 -60
  189. package/packages/core/index.js +0 -6
  190. package/packages/core/init.js +0 -122
  191. package/packages/core/mock/genConfig.js +0 -228
  192. package/packages/core/mock/genData.js +0 -422
  193. package/packages/core/mock/index.js +0 -4
  194. package/packages/core/rules.js +0 -111
  195. package/packages/crud/column.vue +0 -205
  196. package/packages/crud/columnAction.vue +0 -207
  197. package/packages/crud/columnCell.vue +0 -146
  198. package/packages/crud/defaultColumn.vue +0 -130
  199. package/packages/crud/drawerColumn.vue +0 -225
  200. package/packages/crud/form.vue +0 -69
  201. package/packages/crud/index.vue +0 -564
  202. package/packages/crud/menuBar.vue +0 -298
  203. package/packages/crud/mixins/cacheHandler.js +0 -36
  204. package/packages/crud/mixins/calcColumnWidth.js +0 -79
  205. package/packages/crud/mixins/calcHeight.js +0 -105
  206. package/packages/crud/mixins/columnHandler.js +0 -128
  207. package/packages/crud/mixins/contextMenu.js +0 -98
  208. package/packages/crud/mixins/dataProcessor.js +0 -202
  209. package/packages/crud/mixins/dialog.js +0 -109
  210. package/packages/crud/mixins/excelHandler.js +0 -150
  211. package/packages/crud/mixins/exposeMethods.js +0 -107
  212. package/packages/crud/mixins/generateDynamicColumns.js +0 -250
  213. package/packages/crud/mixins/props.js +0 -38
  214. package/packages/crud/mixins/searchHandler.js +0 -151
  215. package/packages/crud/mixins/select.js +0 -359
  216. package/packages/crud/mixins/spanMethod.js +0 -288
  217. package/packages/crud/mixins/summary.js +0 -177
  218. package/packages/crud/mixins/tableEdit.js +0 -547
  219. package/packages/crud/mixins/validate.js +0 -219
  220. package/packages/crud/pagination.vue +0 -110
  221. package/packages/crud/search.vue +0 -119
  222. package/packages/crud/searchHeader.vue +0 -231
  223. package/packages/crud/selectBanner.vue +0 -138
  224. package/packages/crud/utils/EditState.js +0 -319
  225. package/packages/crud/utils/excelExport.js +0 -112
  226. package/packages/crud/utils/excelImport.js +0 -112
  227. package/packages/crud/utils/index.js +0 -98
  228. package/packages/dialog/dialog.js +0 -233
  229. package/packages/dialog/dialog.vue +0 -15
  230. package/packages/dialog/index.js +0 -22
  231. package/packages/dict/cascadeFormat.vue +0 -179
  232. package/packages/dict/dateFormat.vue +0 -40
  233. package/packages/dict/form/cascade.vue +0 -61
  234. package/packages/dict/form/checkbox.vue +0 -90
  235. package/packages/dict/form/extendMethod.js +0 -22
  236. package/packages/dict/form/input-base.js +0 -31
  237. package/packages/dict/form/input.js +0 -20
  238. package/packages/dict/form/radio.vue +0 -69
  239. package/packages/dict/form/select.vue +0 -118
  240. package/packages/dict/form/switch.vue +0 -75
  241. package/packages/dict/valueFormat.vue +0 -188
  242. package/packages/directive/dialog/drag.js +0 -86
  243. package/packages/directive/dialog/dragSize.js +0 -42
  244. package/packages/directive/index.js +0 -9
  245. package/packages/directive/insertSlot.js +0 -10
  246. package/packages/form/contextMenu.js +0 -192
  247. package/packages/form/draftDrawer.vue +0 -391
  248. package/packages/form/formAction.vue +0 -97
  249. package/packages/form/formItem.vue +0 -259
  250. package/packages/form/index.vue +0 -451
  251. package/packages/form/props.js +0 -15
  252. package/packages/grid/cell.vue +0 -65
  253. package/packages/grid/index.vue +0 -130
  254. package/packages/group/index.vue +0 -96
  255. package/packages/tabs/index.vue +0 -290
  256. package/packages/tooltip/index.js +0 -9
  257. package/packages/tooltip/tooltip.vue +0 -32
  258. package/packages/tooltip/tooltipComponent.js +0 -38
  259. package/packages/verifyInput/index.vue +0 -131
  260. package/styles/button.scss +0 -3
  261. package/styles/crud.scss +0 -425
  262. package/styles/dialog.scss +0 -95
  263. package/styles/form.scss +0 -532
  264. package/styles/group.scss +0 -78
  265. package/styles/index.scss +0 -94
  266. package/styles/tabs.scss +0 -139
  267. package/styles/verifyInput.scss +0 -56
  268. package/vue-jsx-sync.js +0 -90
  269. 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 };